Fix crash on hanging up simulator video call.

The problem is that InCallActivityCommon#onStop will try to commit any fragment which will crash.

This change also fix a bug that simulatorRemoteVideo is not stopped after hanging up.

Bug: 67045513
Test: manual
PiperOrigin-RevId: 170380589
Change-Id: I25e0f43141eaa573189f4d9c0109fd2689c10374
diff --git a/java/com/android/dialer/logging/video_tech.proto b/java/com/android/dialer/logging/video_tech.proto
new file mode 100644
index 0000000..b5cd351
--- /dev/null
+++ b/java/com/android/dialer/logging/video_tech.proto
@@ -0,0 +1,19 @@
+syntax = "proto2";
+
+package com.android.dialer.logging;
+option java_package = "com.android.dialer.logging";
+option java_multiple_files = true;
+option optimize_for = LITE_RUNTIME;
+
+
+
+
+message VideoTech {
+  enum Type {
+    NONE = 0;
+
+    IMS_VIDEO_TECH = 1;
+    LIGHTBRINGER_VIDEO_TECH = 2;
+    RCS_VIDEO_SHARE = 3;
+  }
+}
\ No newline at end of file
diff --git a/java/com/android/dialer/simulator/impl/SimulatorVideoProvider.java b/java/com/android/dialer/simulator/impl/SimulatorVideoProvider.java
index a596728..0ed81da 100644
--- a/java/com/android/dialer/simulator/impl/SimulatorVideoProvider.java
+++ b/java/com/android/dialer/simulator/impl/SimulatorVideoProvider.java
@@ -52,6 +52,10 @@
       simulatorPreviewCamera.stopCamera();
       simulatorPreviewCamera = null;
     }
+    if (previewCameraId == null && simulatorRemoteVideo != null) {
+      simulatorRemoteVideo.stopVideo();
+      simulatorRemoteVideo = null;
+    }
   }
 
   @Override
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 178a404..b82b6c9 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -200,9 +200,9 @@
   protected void onStop() {
     Trace.beginSection("InCallActivity.onStop");
     LogUtil.i("InCallActivity.onStop", "");
+    isVisible = false;
     super.onStop();
     common.onStop();
-    isVisible = false;
     Trace.endSection();
   }
 
diff --git a/java/com/android/incallui/call/DialerCall.java b/java/com/android/incallui/call/DialerCall.java
index 4f31dad..82a29ee 100644
--- a/java/com/android/incallui/call/DialerCall.java
+++ b/java/com/android/incallui/call/DialerCall.java
@@ -153,9 +153,10 @@
   // Times when a second call is received but AnswerAndRelease button is not shown
   // since it's not supported.
   private int secondCallWithoutAnswerAndReleasedButtonTimes = 0;
-  private VideoTech videoTech;
+  private VideoTech videoTech = new EmptyVideoTech();
 
-  private boolean isImsReachable;
+  private com.android.dialer.logging.VideoTech.Type selectedAvailableVideoTechType =
+      com.android.dialer.logging.VideoTech.Type.NONE;
 
   public static String getNumberFromHandle(Uri handle) {
     return handle == null ? "" : handle.getSchemeSpecificPart();
@@ -451,10 +452,15 @@
   private void update() {
     Trace.beginSection("DialerCall.update");
     int oldState = getState();
-    // Clear any cache here that could potentially change on update.
-    videoTech = null;
     // We want to potentially register a video call callback here.
     updateFromTelecomCall();
+    // Only store the first video tech type found to be available during the life of the call.
+    if (selectedAvailableVideoTechType == com.android.dialer.logging.VideoTech.Type.NONE) {
+      // Update the video tech.
+      videoTech = mVideoTechManager.findBestAvailableVideoTech();
+      videoTech.becomePrimary();
+      selectedAvailableVideoTechType = videoTech.getVideoTechType();
+    }
     if (oldState != getState() && getState() == DialerCall.State.DISCONNECTED) {
       for (DialerCallListener listener : mListeners) {
         listener.onDialerCallDisconnect();
@@ -1156,9 +1162,6 @@
   }
 
   public VideoTech getVideoTech() {
-    if (videoTech == null) {
-      videoTech = mVideoTechManager.getVideoTech();
-    }
     return videoTech;
   }
 
@@ -1333,12 +1336,8 @@
     mVideoTechManager.dispatchRemovedFromCallList();
   }
 
-  public boolean isImsReachable() {
-    return isImsReachable;
-  }
-
-  private void setImsReachable(boolean imsReachable) {
-    isImsReachable = imsReachable;
+  public com.android.dialer.logging.VideoTech.Type getSelectedAvailableVideoTechType() {
+    return selectedAvailableVideoTechType;
   }
 
   /**
@@ -1535,7 +1534,6 @@
     private final Context context;
     private final EmptyVideoTech emptyVideoTech = new EmptyVideoTech();
     private final List<VideoTech> videoTechs;
-    private VideoTech savedTech;
 
     VideoTechManager(DialerCall call) {
       this.context = call.mContext;
@@ -1547,10 +1545,7 @@
       // Insert order here determines the priority of that video tech option
       videoTechs = new ArrayList<>();
 
-      ImsVideoTech imsVideoTech =
-          new ImsVideoTech(Logger.get(call.mContext), call, call.mTelecomCall);
-      call.setImsReachable(imsVideoTech.isAvailable(context));
-      videoTechs.add(imsVideoTech);
+      videoTechs.add(new ImsVideoTech(Logger.get(call.mContext), call, call.mTelecomCall));
 
       VideoTech rcsVideoTech =
           EnrichedCallComponent.get(call.mContext)
@@ -1571,17 +1566,10 @@
               phoneNumber));
     }
 
-    VideoTech getVideoTech() {
-      if (savedTech != null) {
-        return savedTech;
-      }
-
+    VideoTech findBestAvailableVideoTech() {
       for (VideoTech tech : videoTechs) {
         if (tech.isAvailable(context)) {
-          // Remember the first VideoTech that becomes available and always use it
-          savedTech = tech;
-          savedTech.becomePrimary();
-          return savedTech;
+          return tech;
         }
       }
 
diff --git a/java/com/android/incallui/videotech/VideoTech.java b/java/com/android/incallui/videotech/VideoTech.java
index 410c357..71087cb 100644
--- a/java/com/android/incallui/videotech/VideoTech.java
+++ b/java/com/android/incallui/videotech/VideoTech.java
@@ -85,6 +85,8 @@
    */
   void becomePrimary();
 
+  com.android.dialer.logging.VideoTech.Type getVideoTechType();
+
   /** Listener for video call events. */
   interface VideoTechListener {
 
diff --git a/java/com/android/incallui/videotech/empty/EmptyVideoTech.java b/java/com/android/incallui/videotech/empty/EmptyVideoTech.java
index f156a14..2e34a6a 100644
--- a/java/com/android/incallui/videotech/empty/EmptyVideoTech.java
+++ b/java/com/android/incallui/videotech/empty/EmptyVideoTech.java
@@ -107,4 +107,9 @@
 
   @Override
   public void becomePrimary() {}
+
+  @Override
+  public com.android.dialer.logging.VideoTech.Type getVideoTechType() {
+    return com.android.dialer.logging.VideoTech.Type.NONE;
+  }
 }
diff --git a/java/com/android/incallui/videotech/ims/ImsVideoTech.java b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
index 0ef07d6..0310a90 100644
--- a/java/com/android/incallui/videotech/ims/ImsVideoTech.java
+++ b/java/com/android/incallui/videotech/ims/ImsVideoTech.java
@@ -327,6 +327,11 @@
         DialerImpression.Type.UPGRADE_TO_VIDEO_CALL_BUTTON_SHOWN_FOR_IMS);
   }
 
+  @Override
+  public com.android.dialer.logging.VideoTech.Type getVideoTechType() {
+    return com.android.dialer.logging.VideoTech.Type.IMS_VIDEO_TECH;
+  }
+
   private boolean canPause() {
     return call.getDetails().can(Details.CAPABILITY_CAN_PAUSE_VIDEO);
   }
diff --git a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
index 1ddf371..9adc53b 100644
--- a/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
+++ b/java/com/android/incallui/videotech/lightbringer/LightbringerTech.java
@@ -195,4 +195,9 @@
   public void onLightbringerStateChanged() {
     listener.onVideoTechStateChanged();
   }
+
+  @Override
+  public com.android.dialer.logging.VideoTech.Type getVideoTechType() {
+    return com.android.dialer.logging.VideoTech.Type.LIGHTBRINGER_VIDEO_TECH;
+  }
 }