Update the SpeakEasy component.

Test: unit tests
PiperOrigin-RevId: 184352489
Change-Id: If3f2414dd9769dc54035c7fcf5afe925af3006db
diff --git a/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java b/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java
index 69da2f4..0bd1c0f 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java
@@ -34,9 +34,6 @@
 import com.android.dialer.preferredsim.PreferredSimFallbackContract;
 import com.android.dialer.simulator.SimulatorComponent;
 import com.android.incallui.rtt.impl.RttChatActivity;
-import com.android.incallui.speakeasy.SpeakEasy;
-import com.android.incallui.speakeasy.SpeakEasyActivity;
-import com.android.incallui.speakeasy.SpeakEasyComponent;
 
 /** Implements the top level simulator menu. */
 final class SimulatorMainMenu {
@@ -79,12 +76,6 @@
                 SimulatorComponent.get(activity.getApplicationContext())
                     .getSimulator()
                     .disableSimulatorMode());
-    SpeakEasy speakEasy = SpeakEasyComponent.get(activity.getApplicationContext()).speakEasy();
-    if (speakEasy.isEnabled()) {
-      simulatorSubMenu.addItem(
-          "SpeakEasy call mock", () -> simulateSpeakEasyCallMock(activity.getApplicationContext()));
-    }
-
     return simulatorSubMenu;
   }
 
@@ -92,10 +83,6 @@
     context.startActivity(new Intent(context, RttChatActivity.class));
   }
 
-  private static void simulateSpeakEasyCallMock(@NonNull Context context) {
-    context.startActivity(new Intent(context, SpeakEasyActivity.class));
-  }
-
   private static void populateDatabase(@NonNull Context context) {
     DialerExecutorComponent.get(context)
         .dialerExecutorFactory()
diff --git a/java/com/android/incallui/InCallServiceImpl.java b/java/com/android/incallui/InCallServiceImpl.java
index 1cb6c47..c4d6d06 100644
--- a/java/com/android/incallui/InCallServiceImpl.java
+++ b/java/com/android/incallui/InCallServiceImpl.java
@@ -29,6 +29,8 @@
 import com.android.incallui.call.CallList;
 import com.android.incallui.call.ExternalCallList;
 import com.android.incallui.call.TelecomAdapter;
+import com.android.incallui.speakeasy.SpeakEasyCallManager;
+import com.android.incallui.speakeasy.SpeakEasyComponent;
 
 /**
  * Used to receive updates about calls from the Telecom component. This service is bound to Telecom
@@ -41,6 +43,11 @@
   private ReturnToCallController returnToCallController;
   private NewReturnToCallController newReturnToCallController;
   private CallList.Listener feedbackListener;
+  // We only expect there to be one speakEasyCallManager to be instantiated at a time.
+  // We did not use a singleton SpeakEasyCallManager to avoid holding on to state beyond the
+  // lifecycle of this service, because the singleton is associated with the state of the
+  // Application, not this service.
+  private SpeakEasyCallManager speakEasyCallManager;
 
   @Override
   public void onCallAudioStateChanged(CallAudioState audioState) {
@@ -66,6 +73,8 @@
   @Override
   public void onCallRemoved(Call call) {
     Trace.beginSection("InCallServiceImpl.onCallRemoved");
+    speakEasyCallManager.onCallRemoved(CallList.getInstance().getDialerCallFromTelecomCall(call));
+
     InCallPresenter.getInstance().onCallRemoved(call);
     Trace.endSection();
   }
@@ -78,6 +87,12 @@
   }
 
   @Override
+  public void onCreate() {
+    super.onCreate();
+    this.speakEasyCallManager = SpeakEasyComponent.get(this).speakEasyCallManager();
+  }
+
+  @Override
   public IBinder onBind(Intent intent) {
     Trace.beginSection("InCallServiceImpl.onBind");
     final Context context = getApplicationContext();
diff --git a/java/com/android/incallui/speakeasy/SpeakEasy.java b/java/com/android/incallui/speakeasy/SpeakEasy.java
deleted file mode 100644
index 5621eed..0000000
--- a/java/com/android/incallui/speakeasy/SpeakEasy.java
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.incallui.speakeasy;
-
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-
-/** This interface provides a wrapper between callers and the Whisper client. */
-public interface SpeakEasy {
-
-  /** Signals to the user interface that the feature is available for use. */
-  boolean isEnabled();
-
-  /**
-   * Create a new instance of SpeakEasy fragment.
-   *
-   * @param callId call id of the call.
-   * @param nameOrNumber name or number of the caller to be displayed
-   * @param sessionStartTimeMillis start time of the session in terms of {@link
-   *     android.os.SystemClock#elapsedRealtime}.
-   * @return new SpeakEasy fragment. Null if the SpeakEasy feature is not available for use
-   */
-  @Nullable
-  Fragment getSpeakEasyFragment(String callId, String nameOrNumber, long sessionStartTimeMillis);
-}
diff --git a/java/com/android/incallui/speakeasy/SpeakEasyActivity.java b/java/com/android/incallui/speakeasy/SpeakEasyActivity.java
deleted file mode 100644
index 4663526..0000000
--- a/java/com/android/incallui/speakeasy/SpeakEasyActivity.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*
- * Copyright (C) 2018 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.incallui.speakeasy;
-
-import android.os.Bundle;
-import android.os.SystemClock;
-import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
-import android.support.v4.app.FragmentActivity;
-import android.view.View;
-
-/** Activity to for SpeakEasy component. */
-public class SpeakEasyActivity extends FragmentActivity {
-
-  private SpeakEasy speakEasy;
-
-  @Override
-  protected void onCreate(@Nullable Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
-    speakEasy = SpeakEasyComponent.get(this).speakEasy();
-    setContentView(R.layout.activity_speakeasy);
-    Fragment speakEasyFragment =
-        speakEasy.getSpeakEasyFragment("", "John Snow", SystemClock.elapsedRealtime());
-    if (speakEasyFragment != null) {
-      getSupportFragmentManager()
-          .beginTransaction()
-          .add(R.id.fragment_speakeasy, speakEasyFragment)
-          .commit();
-    }
-    getWindow().setStatusBarColor(getColor(R.color.speakeasy_status_bar_color));
-    getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR);
-  }
-}
diff --git a/java/com/android/incallui/speakeasy/SpeakEasyCallManager.java b/java/com/android/incallui/speakeasy/SpeakEasyCallManager.java
new file mode 100644
index 0000000..4fe894a
--- /dev/null
+++ b/java/com/android/incallui/speakeasy/SpeakEasyCallManager.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License
+ */
+
+package com.android.incallui.speakeasy;
+
+import android.app.Fragment;
+import android.support.annotation.NonNull;
+import com.android.incallui.call.DialerCall;
+import com.google.common.base.Optional;
+
+/** Provides operations necessary to SpeakEasy. */
+public interface SpeakEasyCallManager {
+
+  /**
+   * Returns the Fragment used to display data.
+   *
+   * <p>An absent optional indicates the feature is unavailable.
+   */
+  Optional<Fragment> getSpeakEasyFragment(@NonNull DialerCall call);
+
+  /**
+   * Indicates a call has been removed.
+   *
+   * @param call The call which has been removed.
+   */
+  void onCallRemoved(@NonNull DialerCall call);
+}
diff --git a/java/com/android/incallui/speakeasy/SpeakEasyStub.java b/java/com/android/incallui/speakeasy/SpeakEasyCallManagerStub.java
similarity index 60%
rename from java/com/android/incallui/speakeasy/SpeakEasyStub.java
rename to java/com/android/incallui/speakeasy/SpeakEasyCallManagerStub.java
index 8b6b562..e84766c 100644
--- a/java/com/android/incallui/speakeasy/SpeakEasyStub.java
+++ b/java/com/android/incallui/speakeasy/SpeakEasyCallManagerStub.java
@@ -16,24 +16,26 @@
 
 package com.android.incallui.speakeasy;
 
+import android.app.Fragment;
 import android.support.annotation.Nullable;
-import android.support.v4.app.Fragment;
+import com.android.incallui.call.DialerCall;
+import com.google.common.base.Optional;
 import javax.inject.Inject;
 
-/** Default implementation of SpeakEasy. */
-public class SpeakEasyStub implements SpeakEasy {
+/** Default implementation of SpeakEasyCallManager. */
+public class SpeakEasyCallManagerStub implements SpeakEasyCallManager {
 
   @Inject
-  public SpeakEasyStub() {}
+  public SpeakEasyCallManagerStub() {}
 
+  /** Returns an absent optional. */
   @Override
-  public boolean isEnabled() {
-    return false;
+  @Nullable
+  public Optional<Fragment> getSpeakEasyFragment(DialerCall call) {
+    return Optional.absent();
   }
 
+  /** Always inert in the stub. */
   @Override
-  public @Nullable Fragment getSpeakEasyFragment(
-      String callId, String nameOrNumber, long sessionStartTimeMillis) {
-    return null;
-  }
+  public void onCallRemoved(DialerCall call) {}
 }
diff --git a/java/com/android/incallui/speakeasy/SpeakEasyComponent.java b/java/com/android/incallui/speakeasy/SpeakEasyComponent.java
index 13f5e97..2403354 100644
--- a/java/com/android/incallui/speakeasy/SpeakEasyComponent.java
+++ b/java/com/android/incallui/speakeasy/SpeakEasyComponent.java
@@ -20,11 +20,11 @@
 import com.android.dialer.inject.HasRootComponent;
 import dagger.Subcomponent;
 
-/** Dagger component to get SpeakEasy. */
+/** Dagger component to get SpeakEasyCallManager. */
 @Subcomponent
 public abstract class SpeakEasyComponent {
 
-  public abstract SpeakEasy speakEasy();
+  public abstract SpeakEasyCallManager speakEasyCallManager();
 
   public static SpeakEasyComponent get(Context context) {
     return ((SpeakEasyComponent.HasComponent)
diff --git a/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java b/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java
index 9a6f476..713ce2b 100644
--- a/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java
+++ b/java/com/android/incallui/speakeasy/StubSpeakEasyModule.java
@@ -19,10 +19,10 @@
 import dagger.Binds;
 import dagger.Module;
 
-/** Module which binds {@link SpeakEasyStub}. */
+/** Module which binds {@link SpeakEasyCallManagerStub}. */
 @Module
 public abstract class StubSpeakEasyModule {
 
   @Binds
-  abstract SpeakEasy bindsSpeakEasy(SpeakEasyStub stub);
+  abstract SpeakEasyCallManager bindsSpeakEasy(SpeakEasyCallManagerStub stub);
 }