Add VoLTE conference call to simulator and fix a minor issue for GSM conference.

Bug: 67785540
Test: On a walleye.
PiperOrigin-RevId: 174062497
Change-Id: I757b423f1c9ffe286fab15d3d8b5be8fe7c549dc
diff --git a/java/com/android/dialer/simulator/Simulator.java b/java/com/android/dialer/simulator/Simulator.java
index bfa202c..2094b42 100644
--- a/java/com/android/dialer/simulator/Simulator.java
+++ b/java/com/android/dialer/simulator/Simulator.java
@@ -35,10 +35,12 @@
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({
     CONFERENCE_TYPE_GSM,
+    CONFERENCE_TYPE_VOLTE,
   })
   @interface ConferenceType {}
 
   static final int CONFERENCE_TYPE_GSM = 1;
+  static final int CONFERENCE_TYPE_VOLTE = 2;
 
   /** Information about a connection event. */
   public static class Event {
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConference.java b/java/com/android/dialer/simulator/impl/SimulatorConference.java
index 7468b56..1a12d2a 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConference.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConference.java
@@ -58,6 +58,17 @@
     return simulatorConference;
   }
 
+  static SimulatorConference newVoLteConference(PhoneAccountHandle handle) {
+    SimulatorConference simulatorConference =
+        new SimulatorConference(handle, Simulator.CONFERENCE_TYPE_VOLTE);
+    simulatorConference.setConnectionCapabilities(
+        Connection.CAPABILITY_MUTE
+            | Connection.CAPABILITY_SUPPORT_HOLD
+            | Connection.CAPABILITY_HOLD
+            | Connection.CAPABILITY_MANAGE_CONFERENCE);
+    return simulatorConference;
+  }
+
   public void addListener(@NonNull Listener listener) {
     listeners.add(Assert.isNotNull(listener));
   }
@@ -120,6 +131,11 @@
   public void onSeparate(Connection connection) {
     LogUtil.i("SimulatorConference.onSeparate", "connection: " + connection);
     onEvent(new Event(Event.SEPARATE, SimulatorSimCallManager.getConnectionTag(connection), null));
+    // if there is only 1 connection in a gsm conference, destroy the conference.
+    if (conferenceType == Simulator.CONFERENCE_TYPE_GSM && getConnections().size() == 1) {
+      removeConnection(getConnections().get(0));
+      destroy();
+    }
   }
 
   @Override
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConferenceCreator.java b/java/com/android/dialer/simulator/impl/SimulatorConferenceCreator.java
index 838b58d..d024993 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConferenceCreator.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConferenceCreator.java
@@ -64,6 +64,13 @@
     String callerId = String.format(Locale.US, "+1-650-234%04d", callCount);
     Bundle extras = new Bundle();
     extras.putInt(EXTRA_CALL_COUNT, callCount - 1);
+    switch (conferenceType) {
+      case Simulator.CONFERENCE_TYPE_VOLTE:
+        extras.putBoolean("ISVOLTE", true);
+        break;
+      default:
+        break;
+    }
     connectionTags.add(
         SimulatorSimCallManager.addNewIncomingCall(context, callerId, false /* isVideo */, extras));
   }
@@ -78,16 +85,11 @@
     LogUtil.i("SimulatorConferenceCreator.onNewOutgoingConnection", "connection created");
     connection.addListener(this);
 
-    // Telecom will force the connection to switch to DIALING when we return it. Wait until after
-    // we're returned it before changing call state.
-    ThreadUtil.postOnUiThread(() -> connection.setActive());
-
     // Once the connection is active, go ahead and conference it and add the next call.
     ThreadUtil.postDelayedOnUiThread(
         () -> {
           SimulatorConference conference = findCurrentConference();
           if (conference == null) {
-            Assert.checkArgument(conferenceType == Simulator.CONFERENCE_TYPE_GSM);
             conference =
                 SimulatorConference.newGsmConference(
                     SimulatorSimCallManager.getSystemPhoneAccountHandle(context));
@@ -95,6 +97,7 @@
             SimulatorConnectionService.getInstance().addConference(conference);
           }
           updateConferenceableConnections();
+          connection.setActive();
           conference.addConnection(connection);
           addNextCall(getCallCount(connection));
         },
diff --git a/java/com/android/dialer/simulator/impl/SimulatorConnection.java b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
index e4a34b5..168f5db 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorConnection.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorConnection.java
@@ -42,8 +42,10 @@
             | CAPABILITY_SUPPORT_HOLD
             | CAPABILITY_HOLD
             | CAPABILITY_CAN_UPGRADE_TO_VIDEO
-            | CAPABILITY_DISCONNECT_FROM_CONFERENCE
-            | CAPABILITY_SEPARATE_FROM_CONFERENCE);
+            | CAPABILITY_DISCONNECT_FROM_CONFERENCE);
+    if (request.getExtras() != null && !request.getExtras().getBoolean("ISVOLTE")) {
+      setConnectionCapabilities(getConnectionCapabilities() | CAPABILITY_SEPARATE_FROM_CONFERENCE);
+    }
     setVideoProvider(new SimulatorVideoProvider(context, this));
   }
 
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
index f2a1d09..d2eba6b 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorVoiceCall.java
@@ -42,7 +42,11 @@
         .addItem("Emergency call", () -> new SimulatorVoiceCall(context).addNewEmergencyCall())
         .addItem(
             "GSM conference",
-            () -> new SimulatorConferenceCreator(context, Simulator.CONFERENCE_TYPE_GSM).start(5));
+            () -> new SimulatorConferenceCreator(context, Simulator.CONFERENCE_TYPE_GSM).start(5))
+        .addItem(
+            "VoLTE conference",
+            () ->
+                new SimulatorConferenceCreator(context, Simulator.CONFERENCE_TYPE_VOLTE).start(5));
   }
 
   private SimulatorVoiceCall(@NonNull Context context) {