Bubble changes for background calling.

Bug: 74022483
Test: manual
PiperOrigin-RevId: 194822680
Change-Id: I4df144b21a0fc32e39eb970fadc24ef7eb6e7199
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index 8193c6e..3020bf1 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -414,7 +414,7 @@
    * Return whether we should start call in bubble mode and not show InCallActivity. The call mode
    * should be set in CallConfiguration in EXTRA_OUTGOING_CALL_EXTRAS when starting a call intent.
    */
-  private boolean shouldStartInBubbleMode() {
+  public boolean shouldStartInBubbleMode() {
     if (!ReturnToCallController.isEnabled(context)) {
       return false;
     }
diff --git a/java/com/android/incallui/ReturnToCallController.java b/java/com/android/incallui/ReturnToCallController.java
index 4a7b3fb..96bdda1 100644
--- a/java/com/android/incallui/ReturnToCallController.java
+++ b/java/com/android/incallui/ReturnToCallController.java
@@ -37,6 +37,7 @@
 import com.android.dialer.telecom.TelecomUtil;
 import com.android.incallui.ContactInfoCache.ContactCacheEntry;
 import com.android.incallui.ContactInfoCache.ContactInfoCacheCallback;
+import com.android.incallui.InCallPresenter.InCallState;
 import com.android.incallui.InCallPresenter.InCallUiListener;
 import com.android.incallui.audiomode.AudioModeProvider;
 import com.android.incallui.audiomode.AudioModeProvider.AudioModeListener;
@@ -77,6 +78,8 @@
 
   private final ContactInfoCache contactInfoCache;
 
+  private InCallState inCallState;
+
   public static boolean isEnabled(Context context) {
     return ConfigProviderBindings.get(context).getBoolean("enable_return_to_call_bubble_v2", false);
   }
@@ -186,7 +189,19 @@
       return;
     }
 
-    if ((bubble == null || !(bubble.isVisible() || bubble.isDismissed()))
+    boolean shouldStartInBubbleMode = InCallPresenter.getInstance().shouldStartInBubbleMode();
+    InCallState newInCallState =
+        InCallPresenter.getInstance().getPotentialStateFromCallList(callList);
+    boolean isNewBackgroundCall =
+        newInCallState != inCallState
+            && newInCallState == InCallState.OUTGOING
+            && shouldStartInBubbleMode;
+    if (bubble != null && isNewBackgroundCall) {
+      // If new outgoing call is in bubble mode, update bubble info.
+      // We don't update if new call is not in bubble mode even if the existing call is.
+      bubble.setBubbleInfo(generateBubbleInfoForBackgroundCalling());
+    }
+    if ((bubble == null || !(bubble.isVisible() || bubble.isDismissed()) || isNewBackgroundCall)
         && getCall() != null
         && !InCallPresenter.getInstance().isShowingInCallUi()) {
       LogUtil.i("ReturnToCallController.onCallListChange", "going to show bubble");
@@ -195,6 +210,7 @@
       // The call to display might be different for the existing bubble
       startContactInfoSearch();
     }
+    inCallState = newInCallState;
   }
 
   @Override
@@ -274,7 +290,20 @@
         .setPrimaryColor(context.getResources().getColor(R.color.dialer_theme_color, null))
         .setPrimaryIcon(Icon.createWithResource(context, R.drawable.on_going_call))
         .setStartingYPosition(
-            context.getResources().getDimensionPixelOffset(R.dimen.return_to_call_initial_offset_y))
+            InCallPresenter.getInstance().shouldStartInBubbleMode()
+                ? context.getResources().getDisplayMetrics().heightPixels / 2
+                : context
+                    .getResources()
+                    .getDimensionPixelOffset(R.dimen.return_to_call_initial_offset_y))
+        .setActions(generateActions())
+        .build();
+  }
+
+  private BubbleInfo generateBubbleInfoForBackgroundCalling() {
+    return BubbleInfo.builder()
+        .setPrimaryColor(context.getResources().getColor(R.color.dialer_theme_color, null))
+        .setPrimaryIcon(Icon.createWithResource(context, R.drawable.on_going_call))
+        .setStartingYPosition(context.getResources().getDisplayMetrics().heightPixels / 2)
         .setActions(generateActions())
         .build();
   }