diff --git a/packages/SystemUI/res/values/dimens.xml b/packages/SystemUI/res/values/dimens.xml
index 10fd8b579b162ad868d0dff0f9a75b7988fcbd24..30392d2c9d859eee2c30d41d52270aed229e7397 100644
--- a/packages/SystemUI/res/values/dimens.xml
+++ b/packages/SystemUI/res/values/dimens.xml
@@ -34,6 +34,9 @@
     <dimen name="navigation_handle_bottom">10dp</dimen>
     <dimen name="navigation_handle_sample_horizontal_margin">10dp</dimen>
     <dimen name="navigation_home_handle_width">108dp</dimen>
+    <!-- Used while animating the navbar during a long press. -->
+    <dimen name="navigation_home_handle_additional_width_for_animation">20dp</dimen>
+    <dimen name="navigation_home_handle_additional_height_for_animation">4dp</dimen>
 
     <!-- Size of the nav bar edge panels, should be greater to the
          edge sensitivity + the drag threshold -->
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
index dc34ef75482522a7c4cab7e156e20a71e46c3c40..26e785d9a7044d696bfa0a9787af78bbc66a9304 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/ISystemUiProxy.aidl
@@ -144,5 +144,15 @@ interface ISystemUiProxy {
      */
     oneway void onStatusBarTrackpadEvent(in MotionEvent event) = 52;
 
-    // Next id = 54
+    /**
+     * Animate the nav bar being long-pressed.
+     *
+     * @param isTouchDown {@code true} if the button is starting to be pressed ({@code false} if
+     *                                released or canceled)
+     * @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
+     *                   should be the same as the amount of time to trigger a long-press)
+     */
+    oneway void animateNavBarLongPress(boolean isTouchDown, long durationMs) = 54;
+
+    // Next id = 55
 }
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java b/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java
deleted file mode 100644
index aeb0415c8c4c21f4c34d7fd91b4837c7382586fc..0000000000000000000000000000000000000000
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/system/SystemGestureExclusionListenerCompat.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * Copyright (C) 2019 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.systemui.shared.system;
-
-import android.graphics.Region;
-import android.os.RemoteException;
-import android.util.Log;
-import android.view.ISystemGestureExclusionListener;
-import android.view.WindowManagerGlobal;
-
-/**
- * Utility class to listen for exclusion rect changes.
- */
-public abstract class SystemGestureExclusionListenerCompat {
-
-    private static final String TAG = "SGEListenerCompat";
-
-    private final int mDisplayId;
-
-    private ISystemGestureExclusionListener mGestureExclusionListener =
-            new ISystemGestureExclusionListener.Stub() {
-                @Override
-                public void onSystemGestureExclusionChanged(int displayId,
-                        Region systemGestureExclusion, Region unrestrictedOrNull) {
-                    if (displayId == mDisplayId) {
-                        Region unrestricted = (unrestrictedOrNull == null)
-                                ? systemGestureExclusion : unrestrictedOrNull;
-                        onExclusionChanged(systemGestureExclusion, unrestricted);
-                    }
-                }
-            };
-    private boolean mRegistered;
-
-    public SystemGestureExclusionListenerCompat(int displayId) {
-        mDisplayId = displayId;
-    }
-
-    /**
-     * Called when the exclusion region has changed.
-     *
-     * TODO: remove, once all subclasses have migrated to
-     *       {@link #onExclusionChanged(Region, Region)}.
-     */
-    public abstract void onExclusionChanged(Region systemGestureExclusion);
-
-    /**
-     * Called when the exclusion region has changed.
-     *
-     * @param systemGestureExclusion the system gesture exclusion to be applied
-     * @param systemGestureExclusionUnrestricted what would be the system gesture exclusion, if
-     *           there were no restrictions being applied. For logging purposes only.
-     *
-     */
-    public void onExclusionChanged(Region systemGestureExclusion,
-            Region systemGestureExclusionUnrestricted) {
-        // TODO: make abstract, once all subclasses have migrated away from
-        //       onExclusionChanged(Region)
-        onExclusionChanged(systemGestureExclusion);
-    }
-
-    /**
-     * Registers the listener for getting exclusion rect changes.
-     */
-    public void register() {
-        if (!mRegistered) {
-            try {
-                WindowManagerGlobal.getWindowManagerService()
-                        .registerSystemGestureExclusionListener(
-                                mGestureExclusionListener, mDisplayId);
-                mRegistered = true;
-            } catch (RemoteException e) {
-                Log.e(TAG, "Failed to register window manager callbacks", e);
-            }
-        }
-    }
-
-    /**
-     * Unregisters the receiver if previously registered
-     */
-    public void unregister() {
-        if (mRegistered) {
-            try {
-                WindowManagerGlobal.getWindowManagerService()
-                        .unregisterSystemGestureExclusionListener(
-                                mGestureExclusionListener, mDisplayId);
-                mRegistered = false;
-            } catch (RemoteException e) {
-                Log.e(TAG, "Failed to unregister window manager callbacks", e);
-            }
-        }
-    }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
index ad1c77d055348a3b067fa6e03d0dd6d150545e2c..a985236cb38e0ff6ed219e90b2f210330e3386e4 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java
@@ -112,7 +112,6 @@ import com.android.internal.statusbar.LetterboxDetails;
 import com.android.internal.util.LatencyTracker;
 import com.android.internal.view.AppearanceRegion;
 import com.android.systemui.Gefingerpoken;
-import com.android.systemui.res.R;
 import com.android.systemui.assist.AssistManager;
 import com.android.systemui.dagger.qualifiers.Background;
 import com.android.systemui.dagger.qualifiers.DisplayId;
@@ -130,6 +129,7 @@ import com.android.systemui.navigationbar.gestural.QuickswitchOrientedNavHandle;
 import com.android.systemui.plugins.statusbar.StatusBarStateController;
 import com.android.systemui.recents.OverviewProxyService;
 import com.android.systemui.recents.Recents;
+import com.android.systemui.res.R;
 import com.android.systemui.settings.DisplayTracker;
 import com.android.systemui.settings.UserContextProvider;
 import com.android.systemui.settings.UserTracker;
@@ -398,6 +398,11 @@ public class NavigationBar extends ViewController<NavigationBarView> implements
             mAssistManagerLazy.get().setAssistantOverridesRequested(invocationTypes);
         }
 
+        @Override
+        public void animateNavBarLongPress(boolean isTouchDown, long durationMs) {
+            mView.getHomeHandle().animateLongPress(isTouchDown, durationMs);
+        }
+
         @Override
         public void onHomeRotationEnabled(boolean enabled) {
             mView.getRotationButtonController().setHomeRotationEnabled(enabled);
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
index 10084bd4ccada45dd1f36fdccf95323072a861ac..5fe830e6e4427c0ebb63604581799f51ad33c020 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonDispatcher.java
@@ -247,6 +247,14 @@ public class ButtonDispatcher {
         }
     }
 
+    public void animateLongPress(boolean isTouchDown, long durationMs) {
+        for (int i = 0; i < mViews.size(); i++) {
+            if (mViews.get(i) instanceof ButtonInterface) {
+                ((ButtonInterface) mViews.get(i)).animateLongPress(isTouchDown, durationMs);
+            }
+        }
+    }
+
     public void setLongClickable(boolean isLongClickable) {
         mLongClickable = isLongClickable;
         final int N = mViews.size();
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
index 8d291ddf5f19733510bd707f7ed7b08cd5c98016..356b2f7c7cb873c183944421c71d38567886b3a8 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/buttons/ButtonInterface.java
@@ -30,4 +30,14 @@ public interface ButtonInterface {
     void setDarkIntensity(float intensity);
 
     void setDelayTouchFeedback(boolean shouldDelay);
+
+    /**
+     * Animate the button being long-pressed.
+     *
+     * @param isTouchDown {@code true} if the button is starting to be pressed ({@code false} if
+     *                                released or canceled)
+     * @param durationMs how long the animation should take (for the {@code isTouchDown} case, this
+     *                   should be the same as the amount of time to trigger a long-press)
+     */
+    default void animateLongPress(boolean isTouchDown, long durationMs) {}
 }
diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
index 5a22c385cb5192eb5a50001c596e57397f5e508f..5bfc7dc5f7ae27f73123f5a42c10ee2f4f763177 100644
--- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
+++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/NavigationHandle.java
@@ -17,6 +17,7 @@
 package com.android.systemui.navigationbar.gestural;
 
 import android.animation.ArgbEvaluator;
+import android.animation.ObjectAnimator;
 import android.annotation.ColorInt;
 import android.content.Context;
 import android.content.res.Resources;
@@ -24,12 +25,15 @@ import android.graphics.Canvas;
 import android.graphics.Paint;
 import android.graphics.drawable.Drawable;
 import android.util.AttributeSet;
+import android.util.FloatProperty;
 import android.view.ContextThemeWrapper;
 import android.view.View;
+import android.view.animation.Interpolator;
 
+import com.android.app.animation.Interpolators;
 import com.android.settingslib.Utils;
-import com.android.systemui.res.R;
 import com.android.systemui.navigationbar.buttons.ButtonInterface;
+import com.android.systemui.res.R;
 
 public class NavigationHandle extends View implements ButtonInterface {
 
@@ -38,8 +42,26 @@ public class NavigationHandle extends View implements ButtonInterface {
     private @ColorInt final int mDarkColor;
     protected final float mRadius;
     protected final float mBottom;
+    private final float mAdditionalWidthForAnimation;
+    private final float mAdditionalHeightForAnimation;
     private boolean mRequiresInvalidate;
 
+    private ObjectAnimator mPulseAnimator = null;
+    private float mPulseAnimationProgress;
+
+    private static final FloatProperty<NavigationHandle> PULSE_ANIMATION_PROGRESS =
+            new FloatProperty<>("pulseAnimationProgress") {
+                @Override
+                public Float get(NavigationHandle controller) {
+                    return controller.getPulseAnimationProgress();
+                }
+
+                @Override
+                public void setValue(NavigationHandle controller, float progress) {
+                    controller.setPulseAnimationProgress(progress);
+                }
+            };
+
     public NavigationHandle(Context context) {
         this(context, null);
     }
@@ -49,6 +71,10 @@ public class NavigationHandle extends View implements ButtonInterface {
         final Resources res = context.getResources();
         mRadius = res.getDimension(R.dimen.navigation_handle_radius);
         mBottom = res.getDimension(R.dimen.navigation_handle_bottom);
+        mAdditionalWidthForAnimation =
+                res.getDimension(R.dimen.navigation_home_handle_additional_width_for_animation);
+        mAdditionalHeightForAnimation =
+                res.getDimension(R.dimen.navigation_home_handle_additional_height_for_animation);
 
         final int dualToneDarkTheme = Utils.getThemeAttr(context, R.attr.darkIconTheme);
         final int dualToneLightTheme = Utils.getThemeAttr(context, R.attr.lightIconTheme);
@@ -75,23 +101,24 @@ public class NavigationHandle extends View implements ButtonInterface {
 
         // Draw that bar
         int navHeight = getHeight();
-        float height = mRadius * 2;
-        int width = getWidth();
-        float y = (navHeight - mBottom - height);
-        canvas.drawRoundRect(0, y, width, y + height, mRadius, mRadius, mPaint);
+        float additionalHeight = mAdditionalHeightForAnimation * mPulseAnimationProgress;
+        float height = mRadius * 2 + additionalHeight;
+        float additionalWidth = mAdditionalWidthForAnimation * mPulseAnimationProgress;
+        float width = getWidth() + additionalWidth;
+        float x = -(additionalWidth / 2);
+        float y = navHeight - mBottom - height - (additionalHeight / 2);
+        float adjustedRadius = height / 2;
+        canvas.drawRoundRect(x, y, width, y + height, adjustedRadius, adjustedRadius, mPaint);
     }
 
     @Override
-    public void setImageDrawable(Drawable drawable) {
-    }
+    public void setImageDrawable(Drawable drawable) {}
 
     @Override
-    public void abortCurrentGesture() {
-    }
+    public void abortCurrentGesture() {}
 
     @Override
-    public void setVertical(boolean vertical) {
-    }
+    public void setVertical(boolean vertical) {}
 
     @Override
     public void setDarkIntensity(float intensity) {
@@ -108,6 +135,43 @@ public class NavigationHandle extends View implements ButtonInterface {
     }
 
     @Override
-    public void setDelayTouchFeedback(boolean shouldDelay) {
+    public void setDelayTouchFeedback(boolean shouldDelay) {}
+
+    @Override
+    public void animateLongPress(boolean isTouchDown, long durationMs) {
+        if (mPulseAnimator != null) {
+            mPulseAnimator.cancel();
+        }
+
+        Interpolator interpolator;
+        if (isTouchDown) {
+            // For now we animate the navbar expanding and contracting so that the navbar is the
+            // original size by the end of {@code duration}. This is because a screenshot is taken
+            // at that point and we don't want to capture the larger navbar.
+            // TODO(b/306400785): Determine a way to exclude navbar from the screenshot.
+
+            // Fraction of the touch down animation to expand; remaining is used to contract again.
+            float expandFraction = 0.9f;
+            interpolator = t -> t <= expandFraction
+                        ? Interpolators.clampToProgress(Interpolators.LEGACY, t, 0, expandFraction)
+                        : 1 - Interpolators.clampToProgress(
+                                Interpolators.LINEAR, t, expandFraction, 1);
+        } else {
+            interpolator = Interpolators.LEGACY_DECELERATE;
+        }
+
+        mPulseAnimator =
+                ObjectAnimator.ofFloat(this, PULSE_ANIMATION_PROGRESS, isTouchDown ? 1 : 0);
+        mPulseAnimator.setDuration(durationMs).setInterpolator(interpolator);
+        mPulseAnimator.start();
+    }
+
+    private void setPulseAnimationProgress(float pulseAnimationProgress) {
+        mPulseAnimationProgress = pulseAnimationProgress;
+        invalidate();
+    }
+
+    private float getPulseAnimationProgress() {
+        return mPulseAnimationProgress;
     }
 }
diff --git a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
index 4465504d12f571ecc331b69fe3aa8ac639808ae5..1334660ea4d5cbfe3f0c0b7a727c76f4803a99b6 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/OverviewProxyService.java
@@ -244,6 +244,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
                     mShadeViewControllerLazy.get().handleExternalTouch(event));
         }
 
+        @Override
+        public void animateNavBarLongPress(boolean isTouchDown, long durationMs) {
+            verifyCallerAndClearCallingIdentityPostMain("animateNavBarLongPress", () ->
+                    notifyAnimateNavBarLongPress(isTouchDown, durationMs));
+        }
+
         @Override
         public void onBackPressed() {
             verifyCallerAndClearCallingIdentityPostMain("onBackPressed", () -> {
@@ -914,6 +920,12 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
         }
     }
 
+    private void notifyAnimateNavBarLongPress(boolean isTouchDown, long durationMs) {
+        for (int i = mConnectionCallbacks.size() - 1; i >= 0; --i) {
+            mConnectionCallbacks.get(i).animateNavBarLongPress(isTouchDown, durationMs);
+        }
+    }
+
     public void notifyAssistantVisibilityChanged(float visibility) {
         try {
             if (mOverviewProxy != null) {
@@ -1058,6 +1070,7 @@ public class OverviewProxyService implements CallbackController<OverviewProxyLis
         default void onAssistantGestureCompletion(float velocity) {}
         default void startAssistant(Bundle bundle) {}
         default void setAssistantOverridesRequested(int[] invocationTypes) {}
+        default void animateNavBarLongPress(boolean isTouchDown, long durationMs) {}
     }
 
     /**
diff --git a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java
index 0b38c4a1b12626c9b7d7e71e73013042f01b2a16..837a13073eeab93ba7ab24e3df1e53cfc963ae2a 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/accessibility/WindowMagnificationAnimationControllerTest.java
@@ -16,6 +16,8 @@
 
 package com.android.systemui.accessibility;
 
+import static androidx.test.platform.app.InstrumentationRegistry.getInstrumentation;
+
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
@@ -29,7 +31,6 @@ import static org.mockito.Mockito.verify;
 
 import android.animation.ValueAnimator;
 import android.annotation.Nullable;
-import android.app.Instrumentation;
 import android.content.Context;
 import android.graphics.Rect;
 import android.os.Handler;
@@ -42,7 +43,6 @@ import android.view.WindowManagerGlobal;
 import android.view.accessibility.IRemoteMagnificationAnimationCallback;
 import android.view.animation.AccelerateInterpolator;
 
-import androidx.test.InstrumentationRegistry;
 import androidx.test.filters.FlakyTest;
 import androidx.test.filters.LargeTest;
 
@@ -103,7 +103,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
     private SpyWindowMagnificationController mController;
     private WindowMagnificationController mSpyController;
     private WindowMagnificationAnimationController mWindowMagnificationAnimationController;
-    private Instrumentation mInstrumentation;
+
     private long mWaitAnimationDuration;
     private long mWaitPartialAnimationDuration;
 
@@ -113,7 +113,6 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
     @Before
     public void setUp() throws Exception {
         MockitoAnnotations.initMocks(this);
-        mInstrumentation = InstrumentationRegistry.getInstrumentation();
         final WindowManager wm = mContext.getSystemService(WindowManager.class);
         mWindowManager = spy(new TestableWindowManager(wm));
         mContext.addMockSystemService(Context.WINDOW_SERVICE, mWindowManager);
@@ -135,7 +134,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
 
     @After
     public void tearDown() throws Exception {
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mController.deleteWindowMagnification();
         });
     }
@@ -199,7 +198,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = DEFAULT_CENTER_Y + 100;
 
         resetMockObjects();
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(targetScale,
                     targetCenterX, targetCenterY, mAnimationCallback2);
             mCurrentScale.set(mController.getScale());
@@ -252,7 +251,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = mirrorView.getHeight() / 2.0f;
 
         Mockito.reset(mSpyController);
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(targetScale,
                     targetCenterX, targetCenterY, mAnimationCallback);
             mCurrentScale.set(mController.getScale());
@@ -288,7 +287,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = DEFAULT_CENTER_Y + 100;
 
         Mockito.reset(mSpyController);
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(targetScale,
                     targetCenterX, targetCenterY, mAnimationCallback);
             mCurrentScale.set(mController.getScale());
@@ -376,7 +375,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = DEFAULT_CENTER_Y + 100;
 
         Mockito.reset(mSpyController);
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(targetScale,
                     targetCenterX, targetCenterY, mAnimationCallback2);
             mCurrentScale.set(mController.getScale());
@@ -388,7 +387,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         verify(mAnimationCallback2, never()).onResult(anyBoolean());
         verify(mAnimationCallback).onResult(false);
 
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             // ValueAnimator.reverse() could not work correctly with the AnimatorTestRule since it
             // is using SystemClock in reverse() (b/305731398). Therefore, we call end() on the
             // animator directly to verify the result of animation is correct instead of querying
@@ -456,7 +455,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = DEFAULT_CENTER_Y + 100;
 
         Mockito.reset(mSpyController);
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(targetScale,
                     targetCenterX, targetCenterY, mAnimationCallback2);
             mCurrentScale.set(mController.getScale());
@@ -484,7 +483,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final Rect windowBounds = new Rect(mWindowManager.getCurrentWindowMetrics().getBounds());
 
         Mockito.reset(mSpyController);
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(DEFAULT_SCALE,
                     windowBounds.exactCenterX(), windowBounds.exactCenterY(),
                     offsetRatio, offsetRatio, mAnimationCallback);
@@ -512,7 +511,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = DEFAULT_CENTER_Y + 100;
         enableWindowMagnificationWithoutAnimation();
 
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.moveWindowMagnifierToPosition(
                     targetCenterX, targetCenterY, mAnimationCallback);
             advanceTimeBy(mWaitAnimationDuration);
@@ -528,7 +527,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
             throws RemoteException {
         enableWindowMagnificationWithoutAnimation();
 
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.moveWindowMagnifierToPosition(
                     DEFAULT_CENTER_X + 10, DEFAULT_CENTER_Y + 10, mAnimationCallback);
             mWindowMagnificationAnimationController.moveWindowMagnifierToPosition(
@@ -556,7 +555,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         enableWindowMagnificationAndWaitAnimating(mWaitPartialAnimationDuration,
                 mAnimationCallback);
 
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.moveWindowMagnifierToPosition(
                     targetCenterX, targetCenterY, mAnimationCallback2);
             advanceTimeBy(mWaitAnimationDuration);
@@ -576,7 +575,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         enableWindowMagnificationAndWaitAnimating(mWaitPartialAnimationDuration,
                 mAnimationCallback);
 
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.moveWindowMagnifierToPosition(
                     Float.NaN, Float.NaN, mAnimationCallback2);
             advanceTimeBy(mWaitAnimationDuration);
@@ -648,7 +647,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
                 mAnimationCallback);
 
         Mockito.reset(mSpyController);
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.deleteWindowMagnification(
                     mAnimationCallback2);
             mCurrentScale.set(mController.getScale());
@@ -736,7 +735,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float offsetY =
                 (float) Math.ceil(offsetX * WindowMagnificationController.HORIZONTAL_LOCK_BASE)
                         + 1.0f;
-        mInstrumentation.runOnMainSync(()-> mController.moveWindowMagnifier(offsetX, offsetY));
+        getInstrumentation().runOnMainSync(()-> mController.moveWindowMagnifier(offsetX, offsetY));
 
         verify(mSpyController).moveWindowMagnifier(offsetX, offsetY);
         verifyFinalSpec(DEFAULT_SCALE, DEFAULT_CENTER_X, DEFAULT_CENTER_Y + offsetY);
@@ -751,7 +750,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float offsetY =
                 (float) Math.floor(offsetX * WindowMagnificationController.HORIZONTAL_LOCK_BASE)
                         - 1.0f;
-        mInstrumentation.runOnMainSync(() ->
+        getInstrumentation().runOnMainSync(() ->
                 mController.moveWindowMagnifier(offsetX, offsetY));
 
         verify(mSpyController).moveWindowMagnifier(offsetX, offsetY);
@@ -767,7 +766,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
                 (float) Math.ceil(offsetX * WindowMagnificationController.HORIZONTAL_LOCK_BASE);
         // while diagonal scrolling enabled,
         //  should move with both offsetX and offsetY without regrading offsetY/offsetX
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mController.setDiagonalScrolling(true);
             mController.moveWindowMagnifier(offsetX, offsetY);
         });
@@ -782,7 +781,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
         final float targetCenterY = DEFAULT_CENTER_Y + 100;
         enableWindowMagnificationWithoutAnimation();
 
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mController.moveWindowMagnifierToPosition(targetCenterX, targetCenterY,
                     mAnimationCallback);
             advanceTimeBy(mWaitAnimationDuration);
@@ -809,7 +808,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
 
     private void enableWindowMagnificationWithoutAnimation(
             float targetScale, float targetCenterX, float targetCenterY) {
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(
                     targetScale, targetCenterX, targetCenterY, null);
         });
@@ -827,7 +826,7 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
             float targetCenterX,
             float targetCenterY,
             @Nullable IRemoteMagnificationAnimationCallback callback) {
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.enableWindowMagnification(
                     targetScale, targetCenterX, targetCenterY, callback);
             advanceTimeBy(duration);
@@ -835,14 +834,14 @@ public class WindowMagnificationAnimationControllerTest extends SysuiTestCase {
     }
 
     private void deleteWindowMagnificationWithoutAnimation() {
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.deleteWindowMagnification(null);
         });
     }
 
     private void deleteWindowMagnificationAndWaitAnimating(long duration,
             @Nullable IRemoteMagnificationAnimationCallback callback) {
-        mInstrumentation.runOnMainSync(() -> {
+        getInstrumentation().runOnMainSync(() -> {
             mWindowMagnificationAnimationController.deleteWindowMagnification(callback);
             advanceTimeBy(duration);
         });
diff --git a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
index 668cd871415cc333a4e3cae71fdc9cff065f9cf9..68082df493e9ced779a4bcab1df01f680130a7d5 100644
--- a/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
+++ b/services/core/java/com/android/server/wm/BackgroundActivityStartController.java
@@ -75,6 +75,7 @@ public class BackgroundActivityStartController {
 
     private static final long ASM_GRACEPERIOD_TIMEOUT_MS = TIMEOUT_MS;
     private static final int ASM_GRACEPERIOD_MAX_REPEATS = 5;
+    private static final int NO_PROCESS_UID = -1;
     public static final ActivityOptions ACTIVITY_OPTIONS_SYSTEM_DEFINED =
             ActivityOptions.makeBasic()
                     .setPendingIntentBackgroundActivityStartMode(
@@ -649,7 +650,7 @@ public class BackgroundActivityStartController {
         if (PendingIntentRecord.isPendingIntentBalAllowedByPermission(checkedOptions)
                 && ActivityManager.checkComponentPermission(
                 android.Manifest.permission.START_ACTIVITIES_FROM_BACKGROUND,
-                state.mRealCallingUid, -1, true) == PackageManager.PERMISSION_GRANTED) {
+                state.mRealCallingUid, NO_PROCESS_UID, true) == PackageManager.PERMISSION_GRANTED) {
             return new BalVerdict(BAL_ALLOW_PENDING_INTENT,
                     /*background*/ false,
                     "realCallingUid has BAL permission.");
@@ -834,7 +835,7 @@ public class BackgroundActivityStartController {
                 /* caller_activity_class_name */
                 sourceRecord != null ? sourceRecord.info.name : null,
                 /* target_task_top_activity_uid */
-                targetTopActivity != null ? targetTopActivity.getUid() : -1,
+                targetTopActivity != null ? targetTopActivity.getUid() : NO_PROCESS_UID,
                 /* target_task_top_activity_class_name */
                 targetTopActivity != null ? targetTopActivity.info.name : null,
                 /* target_task_is_different */
@@ -988,13 +989,13 @@ public class BackgroundActivityStartController {
                 /* caller_activity_class_name */
                 callerActivityClassName,
                 /* target_task_top_activity_uid */
-                topActivity == null ? -1 : topActivity.getUid(),
+                topActivity == null ? NO_PROCESS_UID : topActivity.getUid(),
                 /* target_task_top_activity_class_name */
                 topActivity == null ? null : topActivity.info.name,
                 /* target_task_is_different */
                 false,
                 /* target_activity_uid */
-                -1,
+                NO_PROCESS_UID,
                 /* target_activity_class_name */
                 null,
                 /* target_intent_action */
diff --git a/telephony/java/com/android/internal/telephony/RILConstants.java b/telephony/java/com/android/internal/telephony/RILConstants.java
index a20f26c1807b2f32c1b5d5769782ed097ed7ff59..f56347fef450d3343d7833b29e8ebd2c5a93d0ee 100644
--- a/telephony/java/com/android/internal/telephony/RILConstants.java
+++ b/telephony/java/com/android/internal/telephony/RILConstants.java
@@ -618,4 +618,5 @@ public interface RILConstants {
     int RIL_UNSOL_TRIGGER_IMS_DEREGISTRATION = 1107;
     int RIL_UNSOL_CONNECTION_SETUP_FAILURE = 1108;
     int RIL_UNSOL_NOTIFY_ANBR = 1109;
+    int RIL_UNSOL_IMEI_MAPPING_CHANGED = 1110;
 }
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/dark_landscape_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/dark_landscape_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index 6bd8595bc097be7e107d6adc8ed22d98df6f8100..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/dark_landscape_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/dark_portrait_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/dark_portrait_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index d5d6fb6c6ea4ce4e1e4f08eb74a70140cfa8502b..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/dark_portrait_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/light_landscape_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/light_landscape_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index fe8dc6906108d639acb939d5a1cb4752d4eede9b..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/light_landscape_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/light_portrait_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/light_portrait_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index ccd8a33ab4fd111a40fdf3e0fb2905b2206c03c6..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/phone/light_portrait_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/dark_landscape_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/dark_landscape_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index de84c4aa9dae262ce464ead230426bd13c65fad4..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/dark_landscape_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/dark_portrait_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/dark_portrait_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index af9d7cf74acec8949ac8ec7e6ae612891dae169b..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/dark_portrait_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/light_landscape_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/light_landscape_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index 33daab9c401d6a88cc1f660e5e7a900f19845647..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/light_landscape_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ
diff --git a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/light_portrait_credential_view_pin_or_password_emergency_call_button.png b/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/light_portrait_credential_view_pin_or_password_emergency_call_button.png
deleted file mode 100644
index 14a799c417576408869ac42f02715e758b62e8a5..0000000000000000000000000000000000000000
Binary files a/vendor/unbundled_google/packages/SystemUIGoogle/tests/screenshotBiometrics/assets/tablet/light_portrait_credential_view_pin_or_password_emergency_call_button.png and /dev/null differ