Merge changes If884d5a1,I2a28d025

* changes:
  Relax number matching when coalescing rows in new call log.
  Move onUiShowing() call from onResume/onPause to onStart/onStop.
diff --git a/java/com/android/dialer/calllog/database/Coalescer.java b/java/com/android/dialer/calllog/database/Coalescer.java
index 9b78814..3c2585e 100644
--- a/java/com/android/dialer/calllog/database/Coalescer.java
+++ b/java/com/android/dialer/calllog/database/Coalescer.java
@@ -181,7 +181,7 @@
     if (!meetsAssistedDialingCriteria(row1, row2)) {
       return false;
     }
-    return dialerPhoneNumberUtil.isExactMatch(number1, number2);
+    return dialerPhoneNumberUtil.isMatch(number1, number2);
   }
 
   /**
diff --git a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
index 8969737..d37f7fa 100644
--- a/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
+++ b/java/com/android/dialer/phonenumberproto/DialerPhoneNumberUtil.java
@@ -70,6 +70,14 @@
     }
     dialerPhoneNumber.setRawInput(rawInput.build());
 
+    // If the number is a service number, just store the raw input and don't bother trying to parse
+    // it. PhoneNumberUtil#parse ignores these characters which can lead to confusing behavior, such
+    // as the numbers "#123" and "123" being considered the same. The "#" can appear in the middle
+    // of a service number and the "*" can appear at the beginning (see a bug).
+    if (numberToParse != null && (numberToParse.contains("#") || numberToParse.startsWith("*"))) {
+      return dialerPhoneNumber.build();
+    }
+
     try {
       dialerPhoneNumber.setDialerInternalPhoneNumber(
           Converter.pojoToProto(phoneNumberUtil.parse(numberToParse, defaultRegion)));
@@ -95,21 +103,27 @@
   }
 
   /**
-   * Returns true if the two numbers were parseable by libphonenumber and are an {@link
-   * MatchType#EXACT_MATCH} or if they have the same raw input.
+   * Returns true if the two numbers were parseable by libphonenumber and are a {@link
+   * MatchType#SHORT_NSN_MATCH} or {@link MatchType#NSN_MATCH} or {@link MatchType#EXACT_MATCH} or
+   * if they have the same raw input.
+   *
+   * @see PhoneNumberUtil#isNumberMatch(PhoneNumber, PhoneNumber)
    */
   @WorkerThread
-  public boolean isExactMatch(
+  public boolean isMatch(
       @NonNull DialerPhoneNumber firstNumberIn, @NonNull DialerPhoneNumber secondNumberIn) {
     Assert.isWorkerThread();
     if (!Assert.isNotNull(firstNumberIn).hasDialerInternalPhoneNumber()
         || !Assert.isNotNull(secondNumberIn).hasDialerInternalPhoneNumber()) {
       return firstNumberIn.getRawInput().equals(secondNumberIn.getRawInput());
     }
-    return isNumberMatch(
+    MatchType matchType =
+        isNumberMatch(
             firstNumberIn.getDialerInternalPhoneNumber(),
-            secondNumberIn.getDialerInternalPhoneNumber())
-        == MatchType.EXACT_MATCH;
+            secondNumberIn.getDialerInternalPhoneNumber());
+    return matchType == MatchType.SHORT_NSN_MATCH
+        || matchType == MatchType.NSN_MATCH
+        || matchType == MatchType.EXACT_MATCH;
   }
 
   /**
diff --git a/java/com/android/incallui/InCallActivity.java b/java/com/android/incallui/InCallActivity.java
index 0a56666..9905606 100644
--- a/java/com/android/incallui/InCallActivity.java
+++ b/java/com/android/incallui/InCallActivity.java
@@ -406,6 +406,10 @@
             == InCallOrientationEventListener.ACTIVITY_PREFERENCE_ALLOW_ROTATION);
     InCallPresenter.getInstance().onActivityStarted();
 
+    if (!isRecreating) {
+      InCallPresenter.getInstance().onUiShowing(true);
+    }
+
     if (ActivityCompat.isInMultiWindowMode(this)
         && !getResources().getBoolean(R.bool.incall_dialpad_allowed)) {
       // Hide the dialpad because there may not be enough room
@@ -422,7 +426,7 @@
 
     if (!InCallPresenter.getInstance().isReadyForTearDown()) {
       updateTaskDescription();
-      InCallPresenter.getInstance().onUiShowing(true);
+      InCallPresenter.getInstance().updateNotification();
     }
 
     // If there is a pending request to show or hide the dialpad, handle that now.
@@ -479,12 +483,7 @@
       dialpadFragment.onDialerKeyUp(null);
     }
 
-    if (!isRecreating) {
-      InCallPresenter.getInstance().onUiShowing(false);
-    }
-    if (isFinishing()) {
-      InCallPresenter.getInstance().unsetActivity(this);
-    }
+    InCallPresenter.getInstance().updateNotification();
 
     InCallPresenter.getInstance().getPseudoScreenState().removeListener(this);
     Trace.endSection();
@@ -513,11 +512,16 @@
     InCallPresenter.getInstance().updateIsChangingConfigurations();
     InCallPresenter.getInstance().onActivityStopped();
     if (!isRecreating) {
+      InCallPresenter.getInstance().onUiShowing(false);
       if (errorDialog != null) {
         errorDialog.dismiss();
       }
     }
 
+    if (isFinishing()) {
+      InCallPresenter.getInstance().unsetActivity(this);
+    }
+
     Trace.endSection();
   }
 
diff --git a/java/com/android/incallui/InCallPresenter.java b/java/com/android/incallui/InCallPresenter.java
index f0d3adc..558ca33 100644
--- a/java/com/android/incallui/InCallPresenter.java
+++ b/java/com/android/incallui/InCallPresenter.java
@@ -1044,14 +1044,16 @@
         "updateIsChangingConfigurations = " + isChangingConfigurations);
   }
 
-  /** Called when the activity goes in/out of the foreground. */
-  public void onUiShowing(boolean showing) {
+  void updateNotification() {
     // We need to update the notification bar when we leave the UI because that
     // could trigger it to show again.
     if (statusBarNotifier != null) {
       statusBarNotifier.updateNotification();
     }
+  }
 
+  /** Called when the activity goes in/out of the foreground. */
+  public void onUiShowing(boolean showing) {
     if (proximitySensor != null) {
       proximitySensor.onInCallShowing(showing);
     }
diff --git a/java/com/android/newbubble/NewBubble.java b/java/com/android/newbubble/NewBubble.java
index 65f7a0a..09634b5 100644
--- a/java/com/android/newbubble/NewBubble.java
+++ b/java/com/android/newbubble/NewBubble.java
@@ -926,13 +926,7 @@
       root.setOnConfigurationChangedListener(
           (configuration) -> {
             if (expanded) {
-              // Collapse immediately without animation
-              if (collapseAnimatorSet != null) {
-                collapseAnimatorSet.removeAllListeners();
-                collapseAnimatorSet.cancel();
-              }
-              setDrawerVisibility(View.GONE);
-              expanded = false;
+              startCollapse(CollapseEnd.NOTHING, false /* shouldRecoverYPosition */);
             }
             // The values in the current MoveHandler may be stale, so replace it. Then ensure the
             // Window is in bounds