Add enriched calling simulation.

Test: on a local device.
PiperOrigin-RevId: 183414102
Change-Id: I56efda40994e9f0b84f462e42301adbf625273e5
diff --git a/java/com/android/dialer/simulator/Simulator.java b/java/com/android/dialer/simulator/Simulator.java
index 3931ae4..3c2526b 100644
--- a/java/com/android/dialer/simulator/Simulator.java
+++ b/java/com/android/dialer/simulator/Simulator.java
@@ -63,11 +63,24 @@
   @StringDef({
     IS_VOLTE,
     PRESENTATION_CHOICE,
+    IS_ENRICHED_CALL,
   })
   @interface BundleKey {}
 
   public final String IS_VOLTE = "ISVOLTE";
   public final String PRESENTATION_CHOICE = "PRESENTATIONCHOICE";
+  public final String IS_ENRICHED_CALL = "ISENRICHEDCALL";
+
+  /** Phone numbers for outgoing and incoming enriched call scenario. */
+  public static final String ENRICHED_CALL_OUTGOING_NUMBER = "+55-31-2128-6800";
+
+  public static final String ENRICHED_CALL_INCOMING_NUMBER = "+44 (0) 20 7031 3000";
+
+  boolean isSimulatorMode();
+
+  void enableSimulatorMode();
+
+  void disableSimulatorMode();
 
   /** Information about a connection event. */
   public static class Event {
diff --git a/java/com/android/dialer/simulator/SimulatorEnrichedCall.java b/java/com/android/dialer/simulator/SimulatorEnrichedCall.java
index f6c8a6c..ae9447b 100644
--- a/java/com/android/dialer/simulator/SimulatorEnrichedCall.java
+++ b/java/com/android/dialer/simulator/SimulatorEnrichedCall.java
@@ -16,13 +16,14 @@
 
 package com.android.dialer.simulator;
 
-import com.android.dialer.enrichedcall.EnrichedCallManager.StateChangedListener;
+import com.android.dialer.enrichedcall.EnrichedCallManager;
+import com.google.common.util.concurrent.ListenableFuture;
 
 /** Setup enriched calling environment for {@link Simulator}. */
-public interface SimulatorEnrichedCall extends StateChangedListener {
+public interface SimulatorEnrichedCall extends EnrichedCallManager.StateChangedListener {
   /** Setup a session for an incoming enriched call. */
-  long setupIncomingEnrichedCall(String number);
+  ListenableFuture<Void> setupIncomingEnrichedCall(String number);
 
   /** Setup a session for outgoing enriched call. */
-  long setupOutgoingEnrichedCall(String number);
+  ListenableFuture<Void> setupOutgoingEnrichedCall(String number);
 }
diff --git a/java/com/android/dialer/simulator/impl/SimulatorImpl.java b/java/com/android/dialer/simulator/impl/SimulatorImpl.java
index be86763..24f3410 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorImpl.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorImpl.java
@@ -25,7 +25,9 @@
 
 /** The entry point for the simulator feature. */
 final class SimulatorImpl implements Simulator {
-  
+
+  private boolean simulatorMode = false;
+
   @Inject
   public SimulatorImpl() {}
 
@@ -38,4 +40,19 @@
   public ActionProvider getActionProvider(AppCompatActivity activity) {
     return SimulatorMainMenu.getActionProvider(activity);
   }
+
+  @Override
+  public boolean isSimulatorMode() {
+    return simulatorMode;
+  }
+
+  @Override
+  public void enableSimulatorMode() {
+    simulatorMode = true;
+  }
+
+  @Override
+  public void disableSimulatorMode() {
+    simulatorMode = false;
+  }
 }
diff --git a/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java b/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java
index 174aab5..69da2f4 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorMainMenu.java
@@ -32,6 +32,7 @@
 import com.android.dialer.enrichedcall.simulator.EnrichedCallSimulatorActivity;
 import com.android.dialer.persistentlog.PersistentLogger;
 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;
@@ -65,7 +66,19 @@
             "Enriched call simulator",
             () ->
                 activity.startActivity(
-                    EnrichedCallSimulatorActivity.newIntent(activity.getApplicationContext())));
+                    EnrichedCallSimulatorActivity.newIntent(activity.getApplicationContext())))
+        .addItem(
+            "Enable simulator mode",
+            () ->
+                SimulatorComponent.get(activity.getApplicationContext())
+                    .getSimulator()
+                    .enableSimulatorMode())
+        .addItem(
+            "Disable simulator mode",
+            () ->
+                SimulatorComponent.get(activity.getApplicationContext())
+                    .getSimulator()
+                    .disableSimulatorMode());
     SpeakEasy speakEasy = SpeakEasyComponent.get(activity.getApplicationContext()).speakEasy();
     if (speakEasy.isEnabled()) {
       simulatorSubMenu.addItem(
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
index ff00dd8..67a2db8 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
@@ -26,15 +26,21 @@
 import android.view.ActionProvider;
 import com.android.dialer.common.Assert;
 import com.android.dialer.common.LogUtil;
+import com.android.dialer.common.concurrent.DialerExecutorComponent;
 import com.android.dialer.common.concurrent.ThreadUtil;
+import com.android.dialer.enrichedcall.EnrichedCallComponent;
+import com.android.dialer.enrichedcall.EnrichedCallManager;
 import com.android.dialer.simulator.Simulator;
 import com.android.dialer.simulator.Simulator.Event;
+import com.android.dialer.simulator.SimulatorComponent;
+import com.android.dialer.simulator.SimulatorEnrichedCall;
 
 /** Entry point in the simulator to create voice calls. */
 final class SimulatorVoiceCall
     implements SimulatorConnectionService.Listener, SimulatorConnection.Listener {
   @NonNull private final Context context;
   @Nullable private String connectionTag;
+  private final SimulatorEnrichedCall simulatorEnrichedCall;
 
   static ActionProvider getActionProvider(@NonNull AppCompatActivity activity) {
     return new SimulatorSubMenu(activity.getApplicationContext())
@@ -55,6 +61,12 @@
                 new SimulatorVoiceCall(activity.getApplicationContext())
                     .addNewOutgoingCall(activity))
         .addItem(
+            "Incoming enriched call",
+            () -> new SimulatorVoiceCall(activity.getApplicationContext()).incomingEnrichedCall())
+        .addItem(
+            "Outgoing enriched call",
+            () -> new SimulatorVoiceCall(activity.getApplicationContext()).outgoingEnrichedCall())
+        .addItem(
             "Spam incoming call",
             () -> new SimulatorVoiceCall(activity.getApplicationContext()).addSpamIncomingCall())
         .addItem(
@@ -77,23 +89,47 @@
 
   private SimulatorVoiceCall(@NonNull Context context) {
     this.context = Assert.isNotNull(context);
+    simulatorEnrichedCall = SimulatorComponent.get(context).getSimulatorEnrichedCall();
     SimulatorConnectionService.addListener(this);
     SimulatorConnectionService.addListener(
         new SimulatorConferenceCreator(context, Simulator.CONFERENCE_TYPE_GSM));
   }
 
+  private void incomingEnrichedCall() {
+    simulatorEnrichedCall
+        .setupIncomingEnrichedCall(Simulator.ENRICHED_CALL_INCOMING_NUMBER)
+        .addListener(
+            () -> {
+              Bundle extras = new Bundle();
+              extras.putBoolean(Simulator.IS_ENRICHED_CALL, true);
+              connectionTag =
+                  SimulatorSimCallManager.addNewIncomingCall(
+                      context, Simulator.ENRICHED_CALL_INCOMING_NUMBER, false, extras);
+            },
+            DialerExecutorComponent.get(context).uiExecutor());
+  }
+
+  private void outgoingEnrichedCall() {
+    getEnrichedCallManager().registerStateChangedListener(simulatorEnrichedCall);
+    simulatorEnrichedCall
+        .setupOutgoingEnrichedCall(Simulator.ENRICHED_CALL_OUTGOING_NUMBER)
+        .addListener(
+            () -> {
+              Bundle extras = new Bundle();
+              extras.putBoolean(Simulator.IS_ENRICHED_CALL, true);
+              connectionTag =
+                  SimulatorSimCallManager.addNewOutgoingCall(
+                      context, Simulator.ENRICHED_CALL_OUTGOING_NUMBER, false, extras);
+            },
+            DialerExecutorComponent.get(context).uiExecutor());
+  }
+
   private void addNewIncomingCall() {
     String callerId = "+44 (0) 20 7031 3000" /* Google London office */;
     connectionTag =
         SimulatorSimCallManager.addNewIncomingCall(context, callerId, false /* isVideo */);
   }
 
-  private void addNewOutgoingCall() {
-    String callerId = "+55-31-2128-6800"; // Brazil office.
-    connectionTag =
-        SimulatorSimCallManager.addNewOutgoingCall(context, callerId, false /* isVideo */);
-  }
-
   private void addNewIncomingCall(AppCompatActivity activity) {
     SimulatorDialogFragment.newInstance(
             (callerId, callerIdPresentation) -> {
@@ -106,6 +142,12 @@
         .show(activity.getSupportFragmentManager(), "SimulatorDialog");
   }
 
+  private void addNewOutgoingCall() {
+    String callerId = "+55-31-2128-6800"; // Brazil office.
+    connectionTag =
+        SimulatorSimCallManager.addNewOutgoingCall(context, callerId, false /* isVideo */);
+  }
+
   private void addNewOutgoingCall(AppCompatActivity activity) {
     SimulatorDialogFragment.newInstance(
             (callerId, callerIdPresentation) -> {
@@ -184,6 +226,9 @@
         break;
       case Event.DISCONNECT:
         connection.setDisconnected(new DisconnectCause(DisconnectCause.LOCAL));
+        if (connection.getExtras().getBoolean(Simulator.IS_ENRICHED_CALL)) {
+          getEnrichedCallManager().unregisterStateChangedListener(simulatorEnrichedCall);
+        }
         break;
       case Event.SESSION_MODIFY_REQUEST:
         ThreadUtil.postDelayedOnUiThread(() -> connection.handleSessionModifyRequest(event), 2000);
@@ -194,7 +239,8 @@
     }
   }
 
-  private interface DialogCallback {
-    void callback(String callerId, int callerIdPresentation);
+  @NonNull
+  private EnrichedCallManager getEnrichedCallManager() {
+    return EnrichedCallComponent.get(context).getEnrichedCallManager();
   }
 }
diff --git a/java/com/android/dialer/simulator/stub/SimulatorEnrichedCallStub.java b/java/com/android/dialer/simulator/stub/SimulatorEnrichedCallStub.java
index 056722f..5b07271 100644
--- a/java/com/android/dialer/simulator/stub/SimulatorEnrichedCallStub.java
+++ b/java/com/android/dialer/simulator/stub/SimulatorEnrichedCallStub.java
@@ -17,6 +17,8 @@
 package com.android.dialer.simulator.stub;
 
 import com.android.dialer.simulator.SimulatorEnrichedCall;
+import com.google.common.util.concurrent.Futures;
+import com.google.common.util.concurrent.ListenableFuture;
 import javax.inject.Inject;
 
 /** Stub implementation of {@link SimulatorEnrichedCall}. */
@@ -26,13 +28,13 @@
   public SimulatorEnrichedCallStub() {}
 
   @Override
-  public long setupIncomingEnrichedCall(String number) {
-    return -1;
+  public ListenableFuture<Void> setupIncomingEnrichedCall(String number) {
+    return Futures.immediateFuture(null);
   }
 
   @Override
-  public long setupOutgoingEnrichedCall(String number) {
-    return -1;
+  public ListenableFuture<Void> setupOutgoingEnrichedCall(String number) {
+    return Futures.immediateFuture(null);
   }
 
   @Override