Merge "Send -1.0 when brightness is off" into sc-dev
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java
index 9210d6f..2dcdd07 100644
--- a/core/java/android/app/Notification.java
+++ b/core/java/android/app/Notification.java
@@ -5070,7 +5070,7 @@
             if (profileBadge != null) {
                 contentView.setImageViewBitmap(R.id.profile_badge, profileBadge);
                 contentView.setViewVisibility(R.id.profile_badge, View.VISIBLE);
-                if (isColorized(p)) {
+                if (isBackgroundColorized(p)) {
                     contentView.setDrawableTint(R.id.profile_badge, false,
                             getPrimaryTextColor(p), PorterDuff.Mode.SRC_ATOP);
                 }
@@ -5257,7 +5257,7 @@
 
         private void updateBackgroundColor(RemoteViews contentView,
                 StandardTemplateParams p) {
-            if (isColorized(p)) {
+            if (isBackgroundColorized(p)) {
                 contentView.setInt(R.id.status_bar_latest_event_content, "setBackgroundColor",
                         getBackgroundColor(p));
             } else {
@@ -5541,8 +5541,14 @@
             return true;
         }
 
-        private boolean isColorized(StandardTemplateParams p) {
-            return p.allowColorization && mN.isColorized();
+        /**
+         * Determines if the notification should be colorized *for the purposes of applying colors*.
+         * If this is the minimized view of a colorized notification, or if the app did not provide
+         * a color to colorize with, this will return false so that internal coloring logic can
+         * still render the notification normally.
+         */
+        private boolean isBackgroundColorized(StandardTemplateParams p) {
+            return p.allowColorization && mN.color != COLOR_DEFAULT && mN.isColorized();
         }
 
         private boolean isCallActionColorCustomizable() {
@@ -5550,7 +5556,8 @@
             //  that is only used for disallowing colorization of headers for the minimized state,
             //  and neither of those conditions applies when showing actions.
             //  Not requiring StandardTemplateParams as an argument simplifies the creation process.
-            return mN.isColorized() && mContext.getResources().getBoolean(
+            return mN.color != COLOR_DEFAULT && mN.isColorized()
+                    && mContext.getResources().getBoolean(
                     R.bool.config_callNotificationActionColorsRequireColorized);
         }
 
@@ -5594,7 +5601,8 @@
 
         private void bindSnoozeAction(RemoteViews big, StandardTemplateParams p) {
             boolean hideSnoozeButton = mN.isForegroundService() || mN.fullScreenIntent != null
-                    || isColorized(p) || p.mViewType == StandardTemplateParams.VIEW_TYPE_HEADS_UP;
+                    || isBackgroundColorized(p)
+                    || p.mViewType == StandardTemplateParams.VIEW_TYPE_HEADS_UP;
             big.setBoolean(R.id.snooze_button, "setEnabled", !hideSnoozeButton);
             if (hideSnoozeButton) {
                 // Only hide; NotificationContentView will show it when it adds the click listener
@@ -6110,7 +6118,7 @@
                     background = outResultColor[0].getDefaultColor();
                     textColor = ContrastColorUtil.resolvePrimaryColor(mContext,
                             background, mInNightMode);
-                } else if (mTintActionButtons && !mInNightMode && !isColorized(p)) {
+                } else if (mTintActionButtons && !mInNightMode && !isBackgroundColorized(p)) {
                     textColor = getAccentColor(p);
                 } else {
                     textColor = getPrimaryTextColor(p);
@@ -6276,14 +6284,15 @@
          * Gets the standard action button color
          */
         private @ColorInt int getStandardActionColor(Notification.StandardTemplateParams p) {
-            return mTintActionButtons || isColorized(p) ? getAccentColor(p) : getNeutralColor(p);
+            return mTintActionButtons || isBackgroundColorized(p)
+                    ? getAccentColor(p) : getNeutralColor(p);
         }
 
         /**
          * Gets a neutral color that can be used for icons or similar that should not stand out.
          */
         private @ColorInt int getHeaderIconColor(StandardTemplateParams p) {
-            return isColorized(p) ? getSecondaryTextColor(p) : getNeutralColor(p);
+            return isBackgroundColorized(p) ? getSecondaryTextColor(p) : getNeutralColor(p);
         }
 
         /**
@@ -6300,7 +6309,7 @@
          * {@link #getSmallIconColor(StandardTemplateParams)}.
          */
         private @ColorInt int getAccentColor(StandardTemplateParams p) {
-            if (isColorized(p)) {
+            if (isBackgroundColorized(p)) {
                 return getPrimaryTextColor(p);
             }
             int color = obtainThemeColor(R.attr.colorAccent, COLOR_INVALID);
@@ -6315,7 +6324,7 @@
          * color when colorized, or when not using theme color tints.
          */
         private @ColorInt int getProtectionColor(StandardTemplateParams p) {
-            if (!isColorized(p)) {
+            if (!isBackgroundColorized(p)) {
                 int color = obtainThemeColor(R.attr.colorBackgroundFloating, COLOR_INVALID);
                 if (color != COLOR_INVALID) {
                     return color;
@@ -6329,7 +6338,7 @@
          * Gets the theme's error color, or the primary text color for colorized notifications.
          */
         private @ColorInt int getErrorColor(StandardTemplateParams p) {
-            if (!isColorized(p)) {
+            if (!isBackgroundColorized(p)) {
                 int color = obtainThemeColor(R.attr.colorError, COLOR_INVALID);
                 if (color != COLOR_INVALID) {
                     return color;
@@ -6350,7 +6359,7 @@
          * Gets the contrast-adjusted version of the color provided by the app.
          */
         private @ColorInt int getContrastColor(StandardTemplateParams p) {
-            if (isColorized(p)) {
+            if (isBackgroundColorized(p)) {
                 return getPrimaryTextColor(p);
             }
             int rawColor = getRawColor(p);
@@ -6493,7 +6502,6 @@
                                 + " notification: " + mN.mShortcutId
                                 + " vs bubble: " + mN.mBubbleMetadata.getShortcutId());
             }
-            validateColorizedHasColor();
 
             // first, add any extras from the calling code
             if (mUserExtras != null) {
@@ -6547,21 +6555,6 @@
             return mN;
         }
 
-        // This code is executed on behalf of other apps' notifications, sometimes even by 3p apps,
-        // a use case that is not supported by the Compat Framework library.
-        @SuppressWarnings("AndroidFrameworkCompatChange")
-        private void validateColorizedHasColor() {
-            if (mN.color == COLOR_DEFAULT && mN.extras.getBoolean(EXTRA_COLORIZED)) {
-                if (mContext.getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.S) {
-                    throw new IllegalArgumentException(
-                            "Colorized notifications must set a color (other than COLOR_DEFAULT).");
-                } else {
-                    Log.w(TAG, "Colorized notifications must set a color (other than "
-                            + "COLOR_DEFAULT).  This is required for apps targeting S.");
-                }
-            }
-        }
-
         /**
          * Returns the color for the given Theme.DeviceDefault.DayNight attribute, or
          * defValue if that could not be completed
@@ -6694,7 +6687,7 @@
          * which must be resolved by the caller before being used.
          */
         private @ColorInt int getUnresolvedBackgroundColor(StandardTemplateParams p) {
-            return isColorized(p) ? getRawColor(p) : COLOR_DEFAULT;
+            return isBackgroundColorized(p) ? getRawColor(p) : COLOR_DEFAULT;
         }
 
         /**
@@ -6880,12 +6873,14 @@
     }
 
     /**
-     * @return true if this notification is colorized.
+     * @return true if this notification is colorized *for the purposes of ranking*.  If the
+     * {@link #color} is {@link #COLOR_DEFAULT} this will be true, even though the actual
+     * appearance of the notification may not be "colorized".
      *
      * @hide
      */
     public boolean isColorized() {
-        return color != COLOR_DEFAULT && extras.getBoolean(EXTRA_COLORIZED)
+        return extras.getBoolean(EXTRA_COLORIZED)
                 && (hasColorizedPermission() || isForegroundService());
     }
 
diff --git a/core/java/com/android/internal/jank/FrameTracker.java b/core/java/com/android/internal/jank/FrameTracker.java
index 4d3f774..4d5b90a 100644
--- a/core/java/com/android/internal/jank/FrameTracker.java
+++ b/core/java/com/android/internal/jank/FrameTracker.java
@@ -167,6 +167,7 @@
                         if (mBeginVsyncId != INVALID_ID) {
                             mSurfaceControlWrapper.addJankStatsListener(
                                     FrameTracker.this, mSurfaceControl);
+                            postTraceStartMarker();
                         }
                     }
                 }
@@ -208,15 +209,9 @@
     public synchronized void begin() {
         mBeginVsyncId = mChoreographer.getVsyncId() + 1;
         mSession.setTimeStamp(System.nanoTime());
-        mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> {
-            synchronized (FrameTracker.this) {
-                if (mCancelled || mEndVsyncId != INVALID_ID) {
-                    return;
-                }
-                mTracingStarted = true;
-                Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId);
-            }
-        }, null);
+        if (mSurfaceControl != null) {
+            postTraceStartMarker();
+        }
         mRendererWrapper.addObserver(mObserver);
         if (DEBUG) {
             Log.d(TAG, "begin: " + mSession.getName() + ", begin=" + mBeginVsyncId);
@@ -229,6 +224,18 @@
         }
     }
 
+    private void postTraceStartMarker() {
+        mChoreographer.mChoreographer.postCallback(Choreographer.CALLBACK_INPUT, () -> {
+            synchronized (FrameTracker.this) {
+                if (mCancelled || mEndVsyncId != INVALID_ID) {
+                    return;
+                }
+                mTracingStarted = true;
+                Trace.beginAsyncSection(mSession.getName(), (int) mBeginVsyncId);
+            }
+        }, null);
+    }
+
     /**
      * End the trace session of the CUJ.
      */
diff --git a/libs/WindowManager/Shell/res/values/config.xml b/libs/WindowManager/Shell/res/values/config.xml
index edf000b..bbbbe69 100644
--- a/libs/WindowManager/Shell/res/values/config.xml
+++ b/libs/WindowManager/Shell/res/values/config.xml
@@ -52,6 +52,12 @@
      when the PIP menu is shown in center. -->
     <string translatable="false" name="pip_menu_bounds">"596 280 1324 690"</string>
 
+    <!-- Animation duration when exit starting window: fade out icon -->
+    <integer name="starting_window_app_reveal_icon_fade_out_duration">133</integer>
+
     <!-- Animation duration when exit starting window: reveal app -->
-    <integer name="starting_window_app_reveal_anim_duration">333</integer>
+    <integer name="starting_window_app_reveal_anim_delay">83</integer>
+
+    <!-- Animation duration when exit starting window: reveal app -->
+    <integer name="starting_window_app_reveal_anim_duration">266</integer>
 </resources>
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
index 3fe57c6..c303a33 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashScreenExitAnimation.java
@@ -20,6 +20,7 @@
 
 import android.animation.Animator;
 import android.animation.ValueAnimator;
+import android.content.Context;
 import android.graphics.BlendMode;
 import android.graphics.Canvas;
 import android.graphics.Color;
@@ -29,6 +30,7 @@
 import android.graphics.RadialGradient;
 import android.graphics.Rect;
 import android.graphics.Shader;
+import android.util.MathUtils;
 import android.util.Slog;
 import android.view.Choreographer;
 import android.view.SurfaceControl;
@@ -38,10 +40,10 @@
 import android.view.WindowManager;
 import android.view.animation.Interpolator;
 import android.view.animation.PathInterpolator;
-import android.view.animation.Transformation;
-import android.view.animation.TranslateYAnimation;
 import android.window.SplashScreenView;
 
+import com.android.wm.shell.R;
+import com.android.wm.shell.animation.Interpolators;
 import com.android.wm.shell.common.TransactionPool;
 
 /**
@@ -53,52 +55,64 @@
     private static final boolean DEBUG_EXIT_ANIMATION_BLEND = false;
     private static final String TAG = StartingSurfaceDrawer.TAG;
 
-    private static final Interpolator APP_EXIT_INTERPOLATOR = new PathInterpolator(0f, 0f, 0f, 1f);
+    private static final Interpolator ICON_INTERPOLATOR = new PathInterpolator(0.15f, 0f, 1f, 1f);
+    private static final Interpolator MASK_RADIUS_INTERPOLATOR =
+            new PathInterpolator(0f, 0f, 0.4f, 1f);
+    private static final Interpolator SHIFT_UP_INTERPOLATOR = new PathInterpolator(0f, 0f, 0f, 1f);
 
-    private final Matrix mTmpTransform = new Matrix();
     private final SurfaceControl mFirstWindowSurface;
     private final Rect mFirstWindowFrame = new Rect();
     private final SplashScreenView mSplashScreenView;
     private final int mMainWindowShiftLength;
-    private final int mAppDuration;
+    private final int mIconFadeOutDuration;
+    private final int mAppRevealDelay;
+    private final int mAppRevealDuration;
+    private final int mAnimationDuration;
+    private final float mIconStartAlpha;
     private final TransactionPool mTransactionPool;
 
     private ValueAnimator mMainAnimator;
     private ShiftUpAnimation mShiftUpAnimation;
+    private RadialVanishAnimation mRadialVanishAnimation;
     private Runnable mFinishCallback;
 
-    SplashScreenExitAnimation(SplashScreenView view, SurfaceControl leash, Rect frame,
-            int appDuration, int mainWindowShiftLength, TransactionPool pool,
-            Runnable handleFinish) {
+    SplashScreenExitAnimation(Context context, SplashScreenView view, SurfaceControl leash,
+            Rect frame, int mainWindowShiftLength, TransactionPool pool, Runnable handleFinish) {
         mSplashScreenView = view;
         mFirstWindowSurface = leash;
         if (frame != null) {
             mFirstWindowFrame.set(frame);
         }
-        mAppDuration = appDuration;
+
+        View iconView = view.getIconView();
+        if (iconView == null) {
+            mIconFadeOutDuration = 0;
+            mIconStartAlpha = 0;
+            mAppRevealDelay = 0;
+        } else {
+            iconView.setLayerType(View.LAYER_TYPE_HARDWARE, null);
+            mIconFadeOutDuration = context.getResources().getInteger(
+                    R.integer.starting_window_app_reveal_icon_fade_out_duration);
+            mAppRevealDelay = context.getResources().getInteger(
+                    R.integer.starting_window_app_reveal_anim_delay);
+            mIconStartAlpha = iconView.getAlpha();
+        }
+        mAppRevealDuration = context.getResources().getInteger(
+                R.integer.starting_window_app_reveal_anim_duration);
+        mAnimationDuration = Math.max(mIconFadeOutDuration, mAppRevealDelay + mAppRevealDuration);
         mMainWindowShiftLength = mainWindowShiftLength;
         mFinishCallback = handleFinish;
         mTransactionPool = pool;
     }
 
     void startAnimations() {
-        prepareRevealAnimation();
-        if (mMainAnimator != null) {
-            mMainAnimator.start();
-        }
-        if (mShiftUpAnimation != null) {
-            mShiftUpAnimation.start();
-        }
+        mMainAnimator = createAnimator();
+        mMainAnimator.start();
     }
 
-    // reveal splash screen, shift up main window
-    private void prepareRevealAnimation() {
-        // splash screen
-        mMainAnimator = ValueAnimator.ofFloat(0f, 1f);
-        mMainAnimator.setDuration(mAppDuration);
-        mMainAnimator.setInterpolator(APP_EXIT_INTERPOLATOR);
-        mMainAnimator.addListener(this);
-
+    // fade out icon, reveal app, shift up main window
+    private ValueAnimator createAnimator() {
+        // reveal app
         final float transparentRatio = 0.8f;
         final int globalHeight = mSplashScreenView.getHeight();
         final int verticalCircleCenter = 0;
@@ -106,14 +120,13 @@
         final int halfWidth = mSplashScreenView.getWidth() / 2;
         final int endRadius = (int) (0.5 + (1f / transparentRatio * (int)
                 Math.sqrt(finalVerticalLength * finalVerticalLength + halfWidth * halfWidth)));
-        final RadialVanishAnimation radialVanishAnimation = new RadialVanishAnimation(
-                mSplashScreenView, mMainAnimator);
-        radialVanishAnimation.setCircleCenter(halfWidth, verticalCircleCenter);
-        radialVanishAnimation.setRadius(0/* initRadius */, endRadius);
-        final int[] colors = {Color.TRANSPARENT, Color.TRANSPARENT, Color.WHITE};
+        final int[] colors = {Color.WHITE, Color.WHITE, Color.TRANSPARENT};
         final float[] stops = {0f, transparentRatio, 1f};
-        radialVanishAnimation.setRadialPaintParam(colors, stops);
-        radialVanishAnimation.setReady();
+
+        mRadialVanishAnimation = new RadialVanishAnimation(mSplashScreenView);
+        mRadialVanishAnimation.setCircleCenter(halfWidth, verticalCircleCenter);
+        mRadialVanishAnimation.setRadius(0 /* initRadius */, endRadius);
+        mRadialVanishAnimation.setRadialPaintParam(colors, stops);
 
         if (mFirstWindowSurface != null && mFirstWindowSurface.isValid()) {
             // shift up main window
@@ -128,38 +141,47 @@
             mSplashScreenView.addView(occludeHoleView, params);
 
             mShiftUpAnimation = new ShiftUpAnimation(0, -mMainWindowShiftLength, occludeHoleView);
-            mShiftUpAnimation.setDuration(mAppDuration);
-            mShiftUpAnimation.setInterpolator(APP_EXIT_INTERPOLATOR);
-
-            occludeHoleView.setAnimation(mShiftUpAnimation);
         }
+
+        ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);
+        animator.setDuration(mAnimationDuration);
+        animator.setInterpolator(Interpolators.LINEAR);
+        animator.addListener(this);
+        animator.addUpdateListener(a -> onAnimationProgress((float) a.getAnimatedValue()));
+        return animator;
     }
 
     private static class RadialVanishAnimation extends View {
         private final SplashScreenView mView;
         private int mInitRadius;
         private int mFinishRadius;
-        private boolean mReady;
 
         private final Point mCircleCenter = new Point();
         private final Matrix mVanishMatrix = new Matrix();
         private final Paint mVanishPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
 
-        RadialVanishAnimation(SplashScreenView target, ValueAnimator animator) {
+        RadialVanishAnimation(SplashScreenView target) {
             super(target.getContext());
             mView = target;
-            animator.addUpdateListener((animation) -> {
-                if (mVanishPaint.getShader() == null) {
-                    return;
-                }
-                final float value = (float) animation.getAnimatedValue();
-                final float scale = (mFinishRadius - mInitRadius) * value + mInitRadius;
-                mVanishMatrix.setScale(scale, scale);
-                mVanishMatrix.postTranslate(mCircleCenter.x, mCircleCenter.y);
-                mVanishPaint.getShader().setLocalMatrix(mVanishMatrix);
-                postInvalidate();
-            });
             mView.addView(this);
+            mVanishPaint.setAlpha(0);
+        }
+
+        void onAnimationProgress(float linearProgress) {
+            if (mVanishPaint.getShader() == null) {
+                return;
+            }
+
+            final float radiusProgress = MASK_RADIUS_INTERPOLATOR.getInterpolation(linearProgress);
+            final float alphaProgress = Interpolators.ALPHA_OUT.getInterpolation(linearProgress);
+            final float scale = mInitRadius + (mFinishRadius - mInitRadius) * radiusProgress;
+
+            mVanishMatrix.setScale(scale, scale);
+            mVanishMatrix.postTranslate(mCircleCenter.x, mCircleCenter.y);
+            mVanishPaint.getShader().setLocalMatrix(mVanishMatrix);
+            mVanishPaint.setAlpha(Math.round(0xFF * alphaProgress));
+
+            postInvalidate();
         }
 
         void setRadius(int initRadius, int finishRadius) {
@@ -184,38 +206,44 @@
                     new RadialGradient(0, 0, 1, colors, stops, Shader.TileMode.CLAMP);
             mVanishPaint.setShader(rShader);
             if (!DEBUG_EXIT_ANIMATION_BLEND) {
-                mVanishPaint.setBlendMode(BlendMode.MODULATE);
+                // We blend the reveal gradient with the splash screen using DST_OUT so that the
+                // splash screen is fully visible when radius = 0 (or gradient opacity is 0) and
+                // fully invisible when radius = finishRadius AND gradient opacity is 1.
+                mVanishPaint.setBlendMode(BlendMode.DST_OUT);
             }
         }
 
-        void setReady() {
-            mReady = true;
-        }
-
         @Override
         protected void onDraw(Canvas canvas) {
             super.onDraw(canvas);
-            if (mReady) {
-                canvas.drawRect(0, 0, mView.getWidth(), mView.getHeight(), mVanishPaint);
-            }
+            canvas.drawRect(0, 0, mView.getWidth(), mView.getHeight(), mVanishPaint);
         }
     }
 
-    private final class ShiftUpAnimation extends TranslateYAnimation {
-        final SyncRtSurfaceTransactionApplier mApplier;
-        ShiftUpAnimation(float fromYDelta, float toYDelta, View targetView) {
-            super(fromYDelta, toYDelta);
-            mApplier = new SyncRtSurfaceTransactionApplier(targetView);
+    private final class ShiftUpAnimation {
+        private final float mFromYDelta;
+        private final float mToYDelta;
+        private final View mOccludeHoleView;
+        private final SyncRtSurfaceTransactionApplier mApplier;
+        private final Matrix mTmpTransform = new Matrix();
+
+        ShiftUpAnimation(float fromYDelta, float toYDelta, View occludeHoleView) {
+            mFromYDelta = fromYDelta;
+            mToYDelta = toYDelta;
+            mOccludeHoleView = occludeHoleView;
+            mApplier = new SyncRtSurfaceTransactionApplier(occludeHoleView);
         }
 
-        @Override
-        protected void applyTransformation(float interpolatedTime, Transformation t) {
-            super.applyTransformation(interpolatedTime, t);
-
+        void onAnimationProgress(float linearProgress) {
             if (mFirstWindowSurface == null || !mFirstWindowSurface.isValid()) {
                 return;
             }
-            mTmpTransform.set(t.getMatrix());
+
+            final float progress = SHIFT_UP_INTERPOLATOR.getInterpolation(linearProgress);
+            final float dy = mFromYDelta + (mToYDelta - mFromYDelta) * progress;
+
+            mOccludeHoleView.setTranslationY(dy);
+            mTmpTransform.setTranslate(0 /* dx */, dy);
 
             // set the vsyncId to ensure the transaction doesn't get applied too early.
             final SurfaceControl.Transaction tx = mTransactionPool.acquire();
@@ -290,4 +318,32 @@
     public void onAnimationRepeat(Animator animation) {
         // ignore
     }
+
+    private void onAnimationProgress(float linearProgress) {
+        View iconView = mSplashScreenView.getIconView();
+        if (iconView != null) {
+            final float iconProgress = ICON_INTERPOLATOR.getInterpolation(
+                    getProgress(linearProgress, 0 /* delay */, mIconFadeOutDuration));
+            iconView.setAlpha(mIconStartAlpha * (1 - iconProgress));
+        }
+
+        final float revealLinearProgress = getProgress(linearProgress, mAppRevealDelay,
+                mAppRevealDuration);
+
+        if (mRadialVanishAnimation != null) {
+            mRadialVanishAnimation.onAnimationProgress(revealLinearProgress);
+        }
+
+        if (mShiftUpAnimation != null) {
+            mShiftUpAnimation.onAnimationProgress(revealLinearProgress);
+        }
+    }
+
+    private float getProgress(float linearProgress, long delay, long duration) {
+        return MathUtils.constrain(
+                (linearProgress * (mAnimationDuration) - delay) / duration,
+                0.0f,
+                1.0f
+        );
+    }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
index e656f43..fd6f0ad9 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/SplashscreenContentDrawer.java
@@ -74,16 +74,14 @@
     private int mDefaultIconSize;
     private int mBrandingImageWidth;
     private int mBrandingImageHeight;
-    private final int mAppRevealDuration;
     private int mMainWindowShiftLength;
     private final TransactionPool mTransactionPool;
     private final SplashScreenWindowAttrs mTmpAttrs = new SplashScreenWindowAttrs();
     private final Handler mSplashscreenWorkerHandler;
 
-    SplashscreenContentDrawer(Context context, int appRevealAnimDuration, TransactionPool pool) {
+    SplashscreenContentDrawer(Context context, TransactionPool pool) {
         mContext = context;
         mIconProvider = new IconProvider(context);
-        mAppRevealDuration = appRevealAnimDuration;
         mTransactionPool = pool;
 
         // Initialize Splashscreen worker thread
@@ -671,9 +669,8 @@
      */
     void applyExitAnimation(SplashScreenView view, SurfaceControl leash,
             Rect frame, Runnable finishCallback) {
-        final SplashScreenExitAnimation animation = new SplashScreenExitAnimation(view, leash,
-                frame, mAppRevealDuration, mMainWindowShiftLength, mTransactionPool,
-                finishCallback);
+        final SplashScreenExitAnimation animation = new SplashScreenExitAnimation(mContext, view,
+                leash, frame, mMainWindowShiftLength, mTransactionPool, finishCallback);
         animation.startAnimations();
     }
 }
diff --git a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
index b7a0339..8fa2236 100644
--- a/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
+++ b/libs/WindowManager/Shell/src/com/android/wm/shell/startingsurface/StartingSurfaceDrawer.java
@@ -116,10 +116,7 @@
         mContext = context;
         mDisplayManager = mContext.getSystemService(DisplayManager.class);
         mSplashScreenExecutor = splashScreenExecutor;
-        final int appRevealAnimDuration = context.getResources().getInteger(
-                com.android.wm.shell.R.integer.starting_window_app_reveal_anim_duration);
-        mSplashscreenContentDrawer = new SplashscreenContentDrawer(mContext, appRevealAnimDuration,
-                pool);
+        mSplashscreenContentDrawer = new SplashscreenContentDrawer(mContext, pool);
         mSplashScreenExecutor.execute(() -> mChoreographer = Choreographer.getInstance());
     }
 
diff --git a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
index 7a550ae..205485d 100644
--- a/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
+++ b/packages/SettingsLib/FooterPreference/res/layout-v31/preference_footer.xml
@@ -24,6 +24,7 @@
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:background="?android:attr/selectableItemBackground"
     android:orientation="vertical"
+    android:importantForAccessibility = "no"
     android:clipToPadding="false">
 
     <LinearLayout
diff --git a/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml b/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
index 5496a01..7567c17 100644
--- a/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
+++ b/packages/SettingsLib/FooterPreference/res/layout/preference_footer.xml
@@ -23,6 +23,7 @@
     android:paddingStart="?android:attr/listPreferredItemPaddingStart"
     android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
     android:background="?android:attr/selectableItemBackground"
+    android:importantForAccessibility = "no"
     android:clipToPadding="false">
 
     <LinearLayout
diff --git a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
index 69ce275..32def03 100644
--- a/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
+++ b/packages/SystemUI/plugin/bcsmartspace/src/com/android/systemui/plugins/BcSmartspaceDataPlugin.java
@@ -20,7 +20,7 @@
 import android.app.smartspace.SmartspaceAction;
 import android.app.smartspace.SmartspaceTarget;
 import android.content.Intent;
-import android.graphics.drawable.Icon;
+import android.graphics.drawable.Drawable;
 import android.os.Parcelable;
 import android.view.View;
 import android.view.ViewGroup;
@@ -93,9 +93,14 @@
         void setFalsingManager(com.android.systemui.plugins.FalsingManager falsingManager);
 
         /**
-         * Set or clear any Do Not Disturb information.
+         * Set or clear Do Not Disturb information.
          */
-        void setDnd(@Nullable Icon dndIcon, @Nullable String description);
+        void setDnd(@Nullable Drawable image, @Nullable String description);
+
+        /**
+         * Set or clear next alarm information
+         */
+        void setNextAlarm(@Nullable Drawable image, @Nullable String description);
     }
 
     /** Interface for launching Intents, which can differ on the lockscreen */
diff --git a/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml b/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml
index 604ab72..3a7a8ae 100644
--- a/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml
+++ b/packages/SystemUI/res-keyguard/drawable/num_pad_key_background.xml
@@ -16,23 +16,14 @@
 * limitations under the License.
 */
 -->
-<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
+<ripple
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:color="?android:attr/colorControlHighlight">
   <item android:id="@+id/background">
     <shape>
       <solid android:color="?android:attr/colorControlNormal" />
       <corners android:radius="10dp" />
     </shape>
   </item>
-  <item android:id="@+id/ripple">
-    <ripple
-        android:color="?android:attr/colorControlHighlight">
-      <item android:id="@android:id/mask">
-        <shape android:shape="rectangle">
-          <solid android:color="?android:attr/colorControlNormal" />
-          <corners android:radius="10dp" />
-        </shape>
-    </item>
-    </ripple>
-  </item>
-</layer-list>
+</ripple>
 
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
index 3d42da2..97d3a5a 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardInputViewController.java
@@ -28,7 +28,6 @@
 import com.android.systemui.R;
 import com.android.systemui.classifier.FalsingCollector;
 import com.android.systemui.dagger.qualifiers.Main;
-import com.android.systemui.statusbar.FeatureFlags;
 import com.android.systemui.util.ViewController;
 import com.android.systemui.util.concurrency.DelayableExecutor;
 
@@ -167,7 +166,6 @@
         private final TelephonyManager mTelephonyManager;
         private final EmergencyButtonController.Factory mEmergencyButtonControllerFactory;
         private final FalsingCollector mFalsingCollector;
-        private final boolean mIsNewLayoutEnabled;
 
         @Inject
         public Factory(KeyguardUpdateMonitor keyguardUpdateMonitor,
@@ -177,8 +175,7 @@
                 InputMethodManager inputMethodManager, @Main DelayableExecutor mainExecutor,
                 @Main Resources resources, LiftToActivateListener liftToActivateListener,
                 TelephonyManager telephonyManager, FalsingCollector falsingCollector,
-                EmergencyButtonController.Factory emergencyButtonControllerFactory,
-                FeatureFlags featureFlags) {
+                EmergencyButtonController.Factory emergencyButtonControllerFactory) {
             mKeyguardUpdateMonitor = keyguardUpdateMonitor;
             mLockPatternUtils = lockPatternUtils;
             mLatencyTracker = latencyTracker;
@@ -190,7 +187,6 @@
             mTelephonyManager = telephonyManager;
             mEmergencyButtonControllerFactory = emergencyButtonControllerFactory;
             mFalsingCollector = falsingCollector;
-            mIsNewLayoutEnabled = featureFlags.isKeyguardLayoutEnabled();
         }
 
         /** Create a new {@link KeyguardInputViewController}. */
@@ -216,20 +212,19 @@
                 return new KeyguardPinViewController((KeyguardPINView) keyguardInputView,
                         mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                         keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
-                        mLiftToActivateListener, emergencyButtonController, mFalsingCollector,
-                        mIsNewLayoutEnabled);
+                        mLiftToActivateListener, emergencyButtonController, mFalsingCollector);
             } else if (keyguardInputView instanceof KeyguardSimPinView) {
                 return new KeyguardSimPinViewController((KeyguardSimPinView) keyguardInputView,
                         mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                         keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                         mLiftToActivateListener, mTelephonyManager, mFalsingCollector,
-                        emergencyButtonController, mIsNewLayoutEnabled);
+                        emergencyButtonController);
             } else if (keyguardInputView instanceof KeyguardSimPukView) {
                 return new KeyguardSimPukViewController((KeyguardSimPukView) keyguardInputView,
                         mKeyguardUpdateMonitor, securityMode, mLockPatternUtils,
                         keyguardSecurityCallback, mMessageAreaControllerFactory, mLatencyTracker,
                         mLiftToActivateListener, mTelephonyManager, mFalsingCollector,
-                        emergencyButtonController, mIsNewLayoutEnabled);
+                        emergencyButtonController);
             }
 
             throw new RuntimeException("Unable to find controller for " + keyguardInputView);
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
index 09fb8ef..0b8868f 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinBasedInputView.java
@@ -169,20 +169,6 @@
     }
 
     /**
-     * By default, the new layout will be enabled. When false, revert to the old style.
-     */
-    public void setIsNewLayoutEnabled(boolean isEnabled) {
-        if (!isEnabled) {
-            for (int i = 0; i < mButtons.length; i++) {
-                mButtons[i].disableNewLayout();
-            }
-            mDeleteButton.disableNewLayout();
-            mOkButton.disableNewLayout();
-            reloadColors();
-        }
-    }
-
-    /**
      * Reload colors from resources.
      **/
     public void reloadColors() {
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
index a456d42..262bed3 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardPinViewController.java
@@ -35,12 +35,11 @@
             KeyguardMessageAreaController.Factory messageAreaControllerFactory,
             LatencyTracker latencyTracker, LiftToActivateListener liftToActivateListener,
             EmergencyButtonController emergencyButtonController,
-            FalsingCollector falsingCollector, boolean isNewLayoutEnabled) {
+            FalsingCollector falsingCollector) {
         super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                 messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                 emergencyButtonController, falsingCollector);
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
-        view.setIsNewLayoutEnabled(isNewLayoutEnabled);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java
index fddbb3c..e04bfdc 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPinViewController.java
@@ -79,14 +79,13 @@
             KeyguardMessageAreaController.Factory messageAreaControllerFactory,
             LatencyTracker latencyTracker, LiftToActivateListener liftToActivateListener,
             TelephonyManager telephonyManager, FalsingCollector falsingCollector,
-            EmergencyButtonController emergencyButtonController, boolean isNewLayoutEnabled) {
+            EmergencyButtonController emergencyButtonController) {
         super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                 messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                 emergencyButtonController, falsingCollector);
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mTelephonyManager = telephonyManager;
         mSimImageView = mView.findViewById(R.id.keyguard_sim);
-        view.setIsNewLayoutEnabled(isNewLayoutEnabled);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java
index 50bd0c7..0730922 100644
--- a/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java
+++ b/packages/SystemUI/src/com/android/keyguard/KeyguardSimPukViewController.java
@@ -85,14 +85,13 @@
             KeyguardMessageAreaController.Factory messageAreaControllerFactory,
             LatencyTracker latencyTracker, LiftToActivateListener liftToActivateListener,
             TelephonyManager telephonyManager, FalsingCollector falsingCollector,
-            EmergencyButtonController emergencyButtonController, boolean isNewLayoutEnabled) {
+            EmergencyButtonController emergencyButtonController) {
         super(view, keyguardUpdateMonitor, securityMode, lockPatternUtils, keyguardSecurityCallback,
                 messageAreaControllerFactory, latencyTracker, liftToActivateListener,
                 emergencyButtonController, falsingCollector);
         mKeyguardUpdateMonitor = keyguardUpdateMonitor;
         mTelephonyManager = telephonyManager;
         mSimImageView = mView.findViewById(R.id.keyguard_sim);
-        view.setIsNewLayoutEnabled(isNewLayoutEnabled);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
index abdd770..e6298a4 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadAnimator.java
@@ -21,7 +21,6 @@
 import android.content.res.ColorStateList;
 import android.content.res.TypedArray;
 import android.graphics.drawable.GradientDrawable;
-import android.graphics.drawable.LayerDrawable;
 import android.graphics.drawable.RippleDrawable;
 import android.view.ContextThemeWrapper;
 
@@ -40,17 +39,14 @@
     private ValueAnimator mContractAnimator;
     private GradientDrawable mBackground;
     private RippleDrawable mRipple;
-    private GradientDrawable mRippleMask;
     private int mNormalColor;
     private int mHighlightColor;
     private int mStyle;
 
-    NumPadAnimator(Context context, LayerDrawable drawable, @StyleRes int style) {
-        LayerDrawable ld = (LayerDrawable) drawable.mutate();
-        mBackground = (GradientDrawable) ld.findDrawableByLayerId(R.id.background);
-        mRipple = (RippleDrawable) ld.findDrawableByLayerId(R.id.ripple);
-        mRippleMask = (GradientDrawable) mRipple.findDrawableByLayerId(android.R.id.mask);
+    NumPadAnimator(Context context, final RippleDrawable drawable, @StyleRes int style) {
         mStyle = style;
+        mRipple = (RippleDrawable) drawable.mutate();
+        mBackground = (GradientDrawable) mRipple.findDrawableByLayerId(R.id.background);
 
         reloadColors(context);
 
@@ -62,7 +58,7 @@
         mExpandAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                 public void onAnimationUpdate(ValueAnimator anim) {
                     mBackground.setCornerRadius((float) anim.getAnimatedValue());
-                    mRippleMask.setCornerRadius((float) anim.getAnimatedValue());
+                    mRipple.invalidateSelf();
                 }
         });
 
@@ -73,7 +69,7 @@
         mContractAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                 public void onAnimationUpdate(ValueAnimator anim) {
                     mBackground.setCornerRadius((float) anim.getAnimatedValue());
-                    mRippleMask.setCornerRadius((float) anim.getAnimatedValue());
+                    mRipple.invalidateSelf();
                 }
         });
         mAnimator.playSequentially(mExpandAnimator, mContractAnimator);
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
index b76499a..096597a 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadButton.java
@@ -16,37 +16,22 @@
 package com.android.keyguard;
 
 import android.content.Context;
-import android.content.res.ColorStateList;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
-import android.graphics.drawable.VectorDrawable;
+import android.graphics.drawable.RippleDrawable;
 import android.util.AttributeSet;
-import android.view.ContextThemeWrapper;
 import android.view.MotionEvent;
 
-import androidx.annotation.Nullable;
-
-import com.android.settingslib.Utils;
-import com.android.systemui.R;
-
 /**
  * Similar to the {@link NumPadKey}, but displays an image.
  */
 public class NumPadButton extends AlphaOptimizedImageButton {
 
-    @Nullable
     private NumPadAnimator mAnimator;
 
     public NumPadButton(Context context, AttributeSet attrs) {
         super(context, attrs);
 
-        Drawable background = getBackground();
-        if (background instanceof LayerDrawable) {
-            mAnimator = new NumPadAnimator(context, (LayerDrawable) background,
-                    attrs.getStyleAttribute());
-        } else {
-            mAnimator = null;
-        }
+        mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(),
+                attrs.getStyleAttribute());
     }
 
     @Override
@@ -56,7 +41,7 @@
         // Set width/height to the same value to ensure a smooth circle for the bg, but shrink
         // the height to match the old pin bouncer
         int width = getMeasuredWidth();
-        int height = mAnimator == null ? (int) (width * .75f) : width;
+        int height = width;
 
         setMeasuredDimension(getMeasuredWidth(), height);
     }
@@ -65,13 +50,13 @@
     protected void onLayout(boolean changed, int l, int t, int r, int b) {
         super.onLayout(changed, l, t, r, b);
 
-        if (mAnimator != null) mAnimator.onLayout(b - t);
+        mAnimator.onLayout(b - t);
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
-            if (mAnimator != null) mAnimator.start();
+            mAnimator.start();
         }
         return super.onTouchEvent(event);
     }
@@ -80,25 +65,6 @@
      * Reload colors from resources.
      **/
     public void reloadColors() {
-        if (mAnimator != null) {
-            mAnimator.reloadColors(getContext());
-        } else {
-            // Needed for old style pin
-            int textColor = Utils.getColorAttr(getContext(), android.R.attr.textColorPrimary)
-                    .getDefaultColor();
-            ((VectorDrawable) getDrawable()).setTintList(ColorStateList.valueOf(textColor));
-        }
-    }
-
-    /**
-     * By default, the new layout will be enabled. Invoking will revert to the old style
-     */
-    public void disableNewLayout() {
-        if (mAnimator != null) {
-            mAnimator = null;
-            ContextThemeWrapper ctw = new ContextThemeWrapper(getContext(), R.style.NumPadKey);
-            setBackground(getContext().getResources().getDrawable(
-                    R.drawable.ripple_drawable_pin, ctw.getTheme()));
-        }
+        mAnimator.reloadColors(getContext());
     }
 }
diff --git a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
index 89c1a7f..35ace0d 100644
--- a/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
+++ b/packages/SystemUI/src/com/android/keyguard/NumPadKey.java
@@ -18,12 +18,10 @@
 
 import android.content.Context;
 import android.content.res.TypedArray;
-import android.graphics.drawable.Drawable;
-import android.graphics.drawable.LayerDrawable;
+import android.graphics.drawable.RippleDrawable;
 import android.os.PowerManager;
 import android.os.SystemClock;
 import android.util.AttributeSet;
-import android.view.ContextThemeWrapper;
 import android.view.HapticFeedbackConstants;
 import android.view.LayoutInflater;
 import android.view.MotionEvent;
@@ -32,8 +30,6 @@
 import android.view.accessibility.AccessibilityManager;
 import android.widget.TextView;
 
-import androidx.annotation.Nullable;
-
 import com.android.internal.widget.LockPatternUtils;
 import com.android.settingslib.Utils;
 import com.android.systemui.R;
@@ -51,7 +47,6 @@
     private int mTextViewResId;
     private PasswordTextView mTextView;
 
-    @Nullable
     private NumPadAnimator mAnimator;
 
     private View.OnClickListener mListener = new View.OnClickListener() {
@@ -131,26 +126,8 @@
 
         setContentDescription(mDigitText.getText().toString());
 
-        Drawable background = getBackground();
-        if (background instanceof LayerDrawable) {
-            mAnimator = new NumPadAnimator(context, (LayerDrawable) background,
-                    R.style.NumPadKey);
-        } else {
-            mAnimator = null;
-        }
-    }
-
-    /**
-     * By default, the new layout will be enabled. Invoking will revert to the old style
-     */
-    public void disableNewLayout() {
-        findViewById(R.id.klondike_text).setVisibility(View.VISIBLE);
-        if (mAnimator != null) {
-            mAnimator = null;
-            ContextThemeWrapper ctw = new ContextThemeWrapper(getContext(), R.style.NumPadKey);
-            setBackground(getContext().getResources().getDrawable(
-                    R.drawable.ripple_drawable_pin, ctw.getTheme()));
-        }
+        mAnimator = new NumPadAnimator(context, (RippleDrawable) getBackground(),
+                R.style.NumPadKey);
     }
 
     /**
@@ -164,14 +141,14 @@
         mDigitText.setTextColor(textColor);
         mKlondikeText.setTextColor(klondikeColor);
 
-        if (mAnimator != null) mAnimator.reloadColors(getContext());
+        mAnimator.reloadColors(getContext());
     }
 
     @Override
     public boolean onTouchEvent(MotionEvent event) {
         if (event.getActionMasked() == MotionEvent.ACTION_DOWN) {
             doHapticKeyClick();
-            if (mAnimator != null) mAnimator.start();
+            mAnimator.start();
         }
 
         return super.onTouchEvent(event);
@@ -185,7 +162,7 @@
         // Set width/height to the same value to ensure a smooth circle for the bg, but shrink
         // the height to match the old pin bouncer
         int width = getMeasuredWidth();
-        int height = mAnimator == null ? (int) (width * .75f) : width;
+        int height = width;
 
         setMeasuredDimension(getMeasuredWidth(), height);
     }
@@ -206,7 +183,7 @@
         left = centerX - mKlondikeText.getMeasuredWidth() / 2;
         mKlondikeText.layout(left, top, left + mKlondikeText.getMeasuredWidth(), bottom);
 
-        if (mAnimator != null) mAnimator.onLayout(b - t);
+        mAnimator.onLayout(b - t);
     }
 
     @Override
diff --git a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
index 577c0d8..b7f2cd0 100644
--- a/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
+++ b/packages/SystemUI/src/com/android/systemui/qs/tiles/InternetTile.java
@@ -319,10 +319,18 @@
                 Log.d(TAG, "setIsAirplaneMode: "
                         + "icon = " + (icon == null ? "" : icon.toString()));
             }
+            if (mCellularInfo.mAirplaneModeEnabled == icon.visible) {
+                return;
+            }
             mCellularInfo.mAirplaneModeEnabled = icon.visible;
             mWifiInfo.mAirplaneModeEnabled = icon.visible;
             if (!mSignalCallback.mEthernetInfo.mConnected) {
-                refreshState(mCellularInfo);
+                if (mWifiInfo.mEnabled && (mWifiInfo.mWifiSignalIconId > 0)
+                        && (mWifiInfo.mSsid != null)) {
+                    refreshState(mWifiInfo);
+                } else {
+                    refreshState(mCellularInfo);
+                }
             }
         }
 
@@ -456,6 +464,9 @@
         state.dualLabelContentDescription = r.getString(
                 R.string.accessibility_quick_settings_open_settings, getTileLabel());
         state.expandedAccessibilityClassName = Switch.class.getName();
+        if (DEBUG) {
+            Log.d(TAG, "handleUpdateWifiState: " + "SignalState = " + state.toString());
+        }
     }
 
     private void handleUpdateCellularState(SignalState state, Object arg) {
@@ -496,6 +507,9 @@
         } else {
             state.stateDescription = state.secondaryLabel;
         }
+        if (DEBUG) {
+            Log.d(TAG, "handleUpdateCellularState: " + "SignalState = " + state.toString());
+        }
     }
 
     private void handleUpdateEthernetState(SignalState state, Object arg) {
@@ -508,6 +522,9 @@
         state.state = Tile.STATE_ACTIVE;
         state.icon = ResourceIcon.get(cb.mEthernetSignalIconId);
         state.secondaryLabel = cb.mEthernetContentDescription;
+        if (DEBUG) {
+            Log.d(TAG, "handleUpdateEthernetState: " + "SignalState = " + state.toString());
+        }
     }
 
     private CharSequence appendMobileDataType(CharSequence current, CharSequence dataType) {
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
index c8c0755..13a8661 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/NotificationEntryManager.java
@@ -140,7 +140,7 @@
 
     private final KeyguardEnvironment mKeyguardEnvironment;
     private final NotificationGroupManagerLegacy mGroupManager;
-    private final NotificationRankingManager mRankingManager;
+    private final Lazy<NotificationRankingManager> mRankingManager;
     private final FeatureFlags mFeatureFlags;
     private final ForegroundServiceDismissalFeatureController mFgsFeatureController;
 
@@ -200,7 +200,7 @@
     public NotificationEntryManager(
             NotificationEntryManagerLogger logger,
             NotificationGroupManagerLegacy groupManager,
-            NotificationRankingManager rankingManager,
+            Lazy<NotificationRankingManager> rankingManager,
             KeyguardEnvironment keyguardEnvironment,
             FeatureFlags featureFlags,
             Lazy<NotificationRowBinder> notificationRowBinderLazy,
@@ -419,7 +419,7 @@
 
         mActiveNotifications.put(entry.getKey(), entry);
         mGroupManager.onEntryAdded(entry);
-        updateRankingAndSort(mRankingManager.getRankingMap(), "addEntryInternalInternal");
+        updateRankingAndSort(mRankingManager.get().getRankingMap(), "addEntryInternalInternal");
     }
 
     /**
@@ -886,13 +886,13 @@
 
     /** Resorts / filters the current notification set with the current RankingMap */
     public void reapplyFilterAndSort(String reason) {
-        updateRankingAndSort(mRankingManager.getRankingMap(), reason);
+        updateRankingAndSort(mRankingManager.get().getRankingMap(), reason);
     }
 
     /** Calls to NotificationRankingManager and updates mSortedAndFiltered */
     private void updateRankingAndSort(@NonNull RankingMap rankingMap, String reason) {
         mSortedAndFiltered.clear();
-        mSortedAndFiltered.addAll(mRankingManager.updateRanking(
+        mSortedAndFiltered.addAll(mRankingManager.get().updateRanking(
                 rankingMap, mActiveNotifications.values(), reason));
     }
 
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
index e2a37f6..89bb652 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/dagger/NotificationsModule.java
@@ -80,8 +80,6 @@
 import java.util.Optional;
 import java.util.concurrent.Executor;
 
-import javax.inject.Provider;
-
 import dagger.Binds;
 import dagger.Lazy;
 import dagger.Module;
@@ -102,7 +100,7 @@
     static NotificationEntryManager provideNotificationEntryManager(
             NotificationEntryManagerLogger logger,
             NotificationGroupManagerLegacy groupManager,
-            NotificationRankingManager rankingManager,
+            Lazy<NotificationRankingManager> rankingManager,
             NotificationEntryManager.KeyguardEnvironment keyguardEnvironment,
             FeatureFlags featureFlags,
             Lazy<NotificationRowBinder> notificationRowBinderLazy,
diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
index 20b37e2..c0d713b 100644
--- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
+++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationPanelViewController.java
@@ -2574,16 +2574,19 @@
             // Small parallax as we pull down and clip QS
             startHeight = -mQsExpansionHeight * 0.2f;
         }
-        if (mKeyguardBypassController.getBypassEnabled() && isOnKeyguard()
-                && mNotificationStackScrollLayoutController.isPulseExpanding()) {
-            if (!mPulseExpansionHandler.isExpanding()
-                    && !mPulseExpansionHandler.getLeavingLockscreen()) {
-                // If we aborted the expansion we need to make sure the header doesn't reappear
-                // again after the header has animated away
-                appearAmount = 0;
+        if (mKeyguardBypassController.getBypassEnabled() && isOnKeyguard()) {
+            if (mNotificationStackScrollLayoutController.isPulseExpanding()) {
+                if (!mPulseExpansionHandler.isExpanding()
+                        && !mPulseExpansionHandler.getLeavingLockscreen()) {
+                    // If we aborted the expansion we need to make sure the header doesn't reappear
+                    // again after the header has animated away
+                    appearAmount = 0;
+                } else {
+                    appearAmount = mNotificationStackScrollLayoutController
+                            .calculateAppearFractionBypass();
+                }
             } else {
-                appearAmount = mNotificationStackScrollLayoutController
-                        .calculateAppearFractionBypass();
+                appearAmount = 0.0f;
             }
             startHeight = -mQs.getQsMinExpansionHeight();
         }
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/Execution.kt b/packages/SystemUI/src/com/android/systemui/util/concurrency/Execution.kt
new file mode 100644
index 0000000..647faeb
--- /dev/null
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/Execution.kt
@@ -0,0 +1,58 @@
+/*
+ * Copyright (C) 2021 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.util.concurrency
+
+import android.os.Looper
+import javax.inject.Inject
+
+/**
+ * Methods to check or assert that we're on the main thread
+ */
+interface Execution {
+    fun assertIsMainThread()
+    fun isMainThread(): Boolean
+}
+
+class ExecutionImpl @Inject constructor() : Execution {
+    private val mainLooper = Looper.getMainLooper()
+
+    override fun assertIsMainThread() {
+        if (!mainLooper.isCurrentThread) {
+            throw IllegalStateException("should be called from the main thread." +
+                    " Main thread name=" + mainLooper.thread.name +
+                    " Thread.currentThread()=" + Thread.currentThread().name)
+        }
+    }
+
+    override fun isMainThread(): Boolean {
+        return mainLooper.isCurrentThread
+    }
+}
+
+class FakeExecution : Execution {
+    var simulateMainThread = true
+
+    override fun assertIsMainThread() {
+        if (!simulateMainThread) {
+            throw IllegalStateException("should be called from the main thread")
+        }
+    }
+
+    override fun isMainThread(): Boolean {
+        return simulateMainThread
+    }
+}
diff --git a/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java b/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java
index 5946af3..1c50496 100644
--- a/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java
+++ b/packages/SystemUI/src/com/android/systemui/util/concurrency/GlobalConcurrencyModule.java
@@ -24,6 +24,8 @@
 
 import java.util.concurrent.Executor;
 
+import javax.inject.Singleton;
+
 import dagger.Binds;
 import dagger.Module;
 import dagger.Provides;
@@ -40,7 +42,7 @@
     @Binds
     public abstract ThreadFactory bindExecutorFactory(ThreadFactoryImpl impl);
 
-     /** Main Looper */
+    /** Main Looper */
     @Provides
     @Main
     public static  Looper provideMainLooper() {
@@ -67,4 +69,8 @@
         return context.getMainExecutor();
     }
 
+    /** */
+    @Binds
+    @Singleton
+    public abstract Execution provideExecution(ExecutionImpl execution);
 }
diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
index 495489f..8c5f74d 100644
--- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
+++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerTest.java
@@ -32,7 +32,7 @@
 import android.content.Context;
 import android.content.pm.UserInfo;
 import android.content.res.Resources;
-import android.graphics.drawable.Icon;
+import android.graphics.drawable.Drawable;
 import android.os.Handler;
 import android.os.UserHandle;
 import android.test.suitebuilder.annotation.SmallTest;
@@ -394,6 +394,8 @@
 
         public void setFalsingManager(FalsingManager falsingManager) { }
 
-        public void setDnd(@Nullable Icon dndIcon, @Nullable String description) { }
+        public void setDnd(@Nullable Drawable dndIcon, @Nullable String description) { }
+
+        public void setNextAlarm(@Nullable Drawable dndIcon, @Nullable String description) { }
     }
 }
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
index 5fc01cc..6459c0c 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/NotificationEntryManagerTest.java
@@ -190,7 +190,7 @@
         mEntryManager = new NotificationEntryManager(
                 mLogger,
                 mGroupManager,
-                new NotificationRankingManager(
+                () -> new NotificationRankingManager(
                         () -> mNotificationMediaManager,
                         mGroupManager,
                         mHeadsUpManager,
diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
index 950b95f..7b0c067 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/notification/row/NotificationEntryManagerInflationTest.java
@@ -181,7 +181,7 @@
         mEntryManager = new NotificationEntryManager(
                 mock(NotificationEntryManagerLogger.class),
                 mGroupMembershipManager,
-                new NotificationRankingManager(
+                () -> new NotificationRankingManager(
                         () -> mock(NotificationMediaManager.class),
                         mGroupMembershipManager,
                         mHeadsUpManager,
diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS
index f27e7ff..95dc667 100644
--- a/services/core/java/com/android/server/OWNERS
+++ b/services/core/java/com/android/server/OWNERS
@@ -31,8 +31,9 @@
 per-file IpSecService.java = file:/services/core/java/com/android/server/net/OWNERS
 per-file MmsServiceBroker.java = file:/telephony/OWNERS
 per-file NetIdManager.java = file:/services/core/java/com/android/server/net/OWNERS
-per-file PackageWatchdog.java = file:/services/core/java/com/android/server/rollback/OWNERS
+per-file PackageWatchdog.java, RescueParty.java = file:/services/core/java/com/android/server/rollback/OWNERS
 per-file PinnerService.java = file:/apct-tests/perftests/OWNERS
+per-file RescueParty.java = fdunlap@google.com, shuc@google.com
 per-file TelephonyRegistry.java = file:/telephony/OWNERS
 per-file UiModeManagerService.java = file:/packages/SystemUI/OWNERS
 per-file VcnManagementService.java = file:/services/core/java/com/android/server/vcn/OWNERS
diff --git a/services/core/java/com/android/server/connectivity/FullScore.java b/services/core/java/com/android/server/connectivity/FullScore.java
index 14cec09..fbfa7a1 100644
--- a/services/core/java/com/android/server/connectivity/FullScore.java
+++ b/services/core/java/com/android/server/connectivity/FullScore.java
@@ -108,9 +108,10 @@
     // and all bits managed by FullScore unset. As bits are handled from 0 up in NetworkScore and
     // from 63 down in FullScore, cut at the 32nd bit for simplicity, but change this if some day
     // there are more than 32 bits handled on either side.
-    // YIELD_TO_BAD_WIFI is temporarily handled by ConnectivityService.
-    private static final long EXTERNAL_POLICIES_MASK =
-            0x00000000FFFFFFFFL & ~(1L << POLICY_YIELD_TO_BAD_WIFI);
+    // YIELD_TO_BAD_WIFI is temporarily handled by ConnectivityService, but the factory is still
+    // allowed to set it, so that it's possible to transition from handling it in CS to handling
+    // it in the factory.
+    private static final long EXTERNAL_POLICIES_MASK = 0x00000000FFFFFFFFL;
 
     @VisibleForTesting
     static @NonNull String policyNameOf(final int policy) {
diff --git a/services/core/java/com/android/server/display/DisplayManagerService.java b/services/core/java/com/android/server/display/DisplayManagerService.java
index 0a4b137..f75f3e1 100644
--- a/services/core/java/com/android/server/display/DisplayManagerService.java
+++ b/services/core/java/com/android/server/display/DisplayManagerService.java
@@ -1282,6 +1282,7 @@
         // this point.
         sendDisplayEventLocked(displayId, DisplayManagerGlobal.EVENT_DISPLAY_CHANGED);
         scheduleTraversalLocked(false);
+        mPersistentDataStore.saveIfNeeded();
     }
 
     private void handleLogicalDisplayFrameRateOverridesChangedLocked(
@@ -2884,6 +2885,7 @@
                     if (dpc != null) {
                         dpc.putScreenBrightnessSetting(brightness);
                     }
+                    mPersistentDataStore.saveIfNeeded();
                 }
             } finally {
                 Binder.restoreCallingIdentity(token);
diff --git a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
index 0946113..1ab402d 100644
--- a/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
+++ b/services/core/java/com/android/server/wm/ActivityMetricsLogger.java
@@ -80,6 +80,7 @@
 import android.content.pm.dex.PackageOptimizationInfo;
 import android.metrics.LogMaker;
 import android.os.Binder;
+import android.os.Handler;
 import android.os.Looper;
 import android.os.SystemClock;
 import android.os.Trace;
@@ -92,9 +93,9 @@
 
 import com.android.internal.annotations.VisibleForTesting;
 import com.android.internal.logging.MetricsLogger;
-import com.android.internal.os.BackgroundThread;
 import com.android.internal.util.FrameworkStatsLog;
 import com.android.internal.util.function.pooled.PooledLambda;
+import com.android.server.FgThread;
 import com.android.server.LocalServices;
 import com.android.server.apphibernation.AppHibernationManagerInternal;
 import com.android.server.apphibernation.AppHibernationService;
@@ -150,6 +151,7 @@
     private long mLastLogTimeSecs;
     private final ActivityTaskSupervisor mSupervisor;
     private final MetricsLogger mMetricsLogger = new MetricsLogger();
+    private final Handler mLoggerHandler = FgThread.getHandler();
 
     /** All active transitions. */
     private final ArrayList<TransitionInfo> mTransitionInfoList = new ArrayList<>();
@@ -897,11 +899,11 @@
         // This will avoid any races with other operations that modify the ActivityRecord.
         final TransitionInfoSnapshot infoSnapshot = new TransitionInfoSnapshot(info);
         if (info.isInterestingToLoggerAndObserver()) {
-            BackgroundThread.getHandler().post(() -> logAppTransition(
+            mLoggerHandler.post(() -> logAppTransition(
                     info.mCurrentTransitionDeviceUptime, info.mCurrentTransitionDelayMs,
                     infoSnapshot, isHibernating));
         }
-        BackgroundThread.getHandler().post(() -> logAppDisplayed(infoSnapshot));
+        mLoggerHandler.post(() -> logAppDisplayed(infoSnapshot));
         if (info.mPendingFullyDrawn != null) {
             info.mPendingFullyDrawn.run();
         }
@@ -909,7 +911,7 @@
         info.mLastLaunchedActivity.info.launchToken = null;
     }
 
-    // This gets called on a background thread without holding the activity manager lock.
+    // This gets called on another thread without holding the activity manager lock.
     private void logAppTransition(int currentTransitionDeviceUptime, int currentTransitionDelayMs,
             TransitionInfoSnapshot info, boolean isHibernating) {
         final LogMaker builder = new LogMaker(APP_TRANSITION);
@@ -1036,7 +1038,7 @@
                 : TimeUnit.NANOSECONDS.toMillis(currentTimestampNs - info.mTransitionStartTimeNs);
         final TransitionInfoSnapshot infoSnapshot =
                 new TransitionInfoSnapshot(info, r, (int) startupTimeMs);
-        BackgroundThread.getHandler().post(() -> logAppFullyDrawn(infoSnapshot));
+        mLoggerHandler.post(() -> logAppFullyDrawn(infoSnapshot));
         mLastTransitionInfo.remove(r);
 
         if (!info.isInterestingToLoggerAndObserver()) {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
index 1f880f6..4f4f06d 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppHomeButtonTest.kt
@@ -16,12 +16,14 @@
 
 package com.android.server.wm.flicker.close
 
+import android.platform.test.annotations.Postsubmit
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
 import com.android.server.wm.flicker.FlickerTestParameter
 import com.android.server.wm.flicker.FlickerTestParameterFactory
 import com.android.server.wm.flicker.dsl.FlickerBuilder
 import org.junit.FixMethodOrder
+import org.junit.Test
 import org.junit.runner.RunWith
 import org.junit.runners.MethodSorters
 import org.junit.runners.Parameterized
@@ -44,6 +46,30 @@
             }
         }
 
+    @Postsubmit
+    @Test
+    override fun statusBarLayerIsAlwaysVisible() {
+        super.statusBarLayerIsAlwaysVisible()
+    }
+
+    @Postsubmit
+    @Test
+    override fun statusBarLayerRotatesScales() {
+        super.statusBarLayerRotatesScales()
+    }
+
+    @Postsubmit
+    @Test
+    override fun launcherLayerReplacesApp() {
+        super.launcherLayerReplacesApp()
+    }
+
+    @Postsubmit
+    @Test
+    override fun noUncoveredRegions() {
+        super.noUncoveredRegions()
+    }
+
     companion object {
         @Parameterized.Parameters(name = "{0}")
         @JvmStatic
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
index 96c7c0a..e088062 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/close/CloseAppTransition.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.close
 
 import android.app.Instrumentation
+import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.view.Surface
 import androidx.test.filters.FlakyTest
@@ -82,7 +83,7 @@
         testSpec.navBarLayerIsAlwaysVisible(rotatesScreen = testSpec.isRotated)
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     open fun statusBarLayerIsAlwaysVisible() {
         testSpec.statusBarLayerIsAlwaysVisible(rotatesScreen = testSpec.isRotated)
@@ -94,7 +95,7 @@
         testSpec.navBarLayerRotatesAndScales(testSpec.config.startRotation, Surface.ROTATION_0)
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     open fun statusBarLayerRotatesScales() {
         testSpec.statusBarLayerRotatesScales(testSpec.config.startRotation, Surface.ROTATION_0)
@@ -122,13 +123,13 @@
         testSpec.noUncoveredRegions(testSpec.config.startRotation, Surface.ROTATION_0)
     }
 
-    @Presubmit
+    @FlakyTest(bugId = 185400889)
     @Test
     open fun launcherReplacesAppWindowAsTopWindow() {
         testSpec.launcherReplacesAppWindowAsTopWindow(testApp)
     }
 
-    @Presubmit
+    @Postsubmit
     @Test
     open fun launcherWindowBecomesVisible() {
         testSpec.launcherWindowBecomesVisible()
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
index 3bd19ea..0bae8f6 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToAppTest.kt
@@ -51,7 +51,6 @@
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
-@FlakyTest(bugId = 185400889)
 class CloseImeAutoOpenWindowToAppTest(private val testSpec: FlickerTestParameter) {
     private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
     private val testApp = ImeAppAutoFocusHelper(instrumentation, testSpec.config.startRotation)
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
index 3cb58b9..819d4dd 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeAutoOpenWindowToHomeTest.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.ime
 
 import android.app.Instrumentation
+import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.view.Surface
 import android.view.WindowManagerPolicyConstants
@@ -104,7 +105,7 @@
     @Test
     fun imeAppWindowBecomesInvisible() = testSpec.imeAppWindowBecomesInvisible(testApp)
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun noUncoveredRegions() = testSpec.noUncoveredRegions(testSpec.config.startRotation,
         Surface.ROTATION_0)
@@ -113,7 +114,7 @@
     @Test
     fun imeLayerBecomesInvisible() = testSpec.imeLayerBecomesInvisible()
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun imeAppLayerBecomesInvisible() = testSpec.imeAppLayerBecomesInvisible(testApp)
 
@@ -123,7 +124,7 @@
         testSpec.navBarLayerRotatesAndScales(testSpec.config.startRotation, Surface.ROTATION_0)
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun statusBarLayerRotatesScales() {
         testSpec.statusBarLayerRotatesScales(testSpec.config.startRotation, Surface.ROTATION_0)
@@ -137,7 +138,7 @@
     @Test
     fun statusBarLayerIsAlwaysVisible() = testSpec.statusBarLayerIsAlwaysVisible()
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun visibleLayersShownMoreThanOneConsecutiveEntry() {
         testSpec.assertLayers {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
index 22d3418..5f841b8 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/CloseImeWindowToHomeTest.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.ime
 
 import android.app.Instrumentation
+import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.view.Surface
 import android.view.WindowManagerPolicyConstants
@@ -98,7 +99,7 @@
         }
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun imeWindowBecomesInvisible() = testSpec.imeWindowBecomesInvisible()
 
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
index bb9cd6f..85163b3 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/OpenImeWindowTest.kt
@@ -17,10 +17,10 @@
 package com.android.server.wm.flicker.ime
 
 import android.app.Instrumentation
+import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.view.Surface
 import android.view.WindowManagerPolicyConstants
-import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import androidx.test.platform.app.InstrumentationRegistry
 import com.android.server.wm.flicker.FlickerBuilderProvider
@@ -138,7 +138,7 @@
         }
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
         testSpec.assertWm {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
index 55bbe3a..a0b0b75 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/ReOpenImeWindowTest.kt
@@ -17,6 +17,7 @@
 package com.android.server.wm.flicker.ime
 
 import android.app.Instrumentation
+import android.platform.test.annotations.Postsubmit
 import android.platform.test.annotations.Presubmit
 import android.view.Surface
 import android.view.WindowManagerPolicyConstants
@@ -97,7 +98,7 @@
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun visibleWindowsShownMoreThanOneConsecutiveEntry() {
         testSpec.assertWm {
@@ -147,13 +148,13 @@
         testSpec.navBarLayerRotatesAndScales(Surface.ROTATION_0, testSpec.config.endRotation)
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun statusBarLayerRotatesScales() {
         testSpec.statusBarLayerRotatesScales(Surface.ROTATION_0, testSpec.config.endRotation)
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     fun visibleLayersShownMoreThanOneConsecutiveEntry() {
         testSpec.assertLayers {
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt
index d0e9556..754d9e9 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/ime/SwitchImeWindowsFromGestureNavTest.kt
@@ -17,7 +17,7 @@
 package com.android.server.wm.flicker.ime
 
 import android.app.Instrumentation
-import android.platform.test.annotations.Presubmit
+import android.platform.test.annotations.Postsubmit
 import android.view.WindowManagerPolicyConstants
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
@@ -52,7 +52,6 @@
 @RunWith(Parameterized::class)
 @Parameterized.UseParametersRunnerFactory(FlickerParametersRunnerFactory::class)
 @FixMethodOrder(MethodSorters.NAME_ASCENDING)
-@FlakyTest
 class SwitchImeWindowsFromGestureNavTest(private val testSpec: FlickerTestParameter) {
     private val instrumentation: Instrumentation = InstrumentationRegistry.getInstrumentation()
     private val testApp = SimpleAppHelper(instrumentation)
@@ -97,31 +96,31 @@
         }
     }
 
-    @Presubmit
+    @FlakyTest
     @Test
     fun imeAppWindowIsAlwaysVisible() = testSpec.imeAppWindowIsAlwaysVisible(imeTestApp)
 
-    @Presubmit
+    @FlakyTest
     @Test
     fun imeLayerBecomesVisible() = testSpec.imeLayerBecomesVisible()
 
-    @Presubmit
+    @FlakyTest
     @Test
     fun imeLayerBecomesInvisible() = testSpec.imeLayerBecomesInvisible()
 
-    @Presubmit
+    @Postsubmit
     @Test
     fun navBarWindowIsAlwaysVisible() = testSpec.navBarWindowIsAlwaysVisible()
 
-    @Presubmit
+    @FlakyTest
     @Test
     fun navBarLayerIsAlwaysVisible() = testSpec.navBarLayerIsAlwaysVisible()
 
-    @Presubmit
+    @Postsubmit
     @Test
     fun statusBarWindowIsAlwaysVisible() = testSpec.statusBarWindowIsAlwaysVisible()
 
-    @Presubmit
+    @FlakyTest
     @Test
     fun statusBarLayerIsAlwaysVisible() = testSpec.statusBarLayerIsAlwaysVisible()
 
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
index ad7ee30..e0179c1 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/launch/OpenAppFromOverviewTest.kt
@@ -16,7 +16,7 @@
 
 package com.android.server.wm.flicker.launch
 
-import android.platform.test.annotations.Postsubmit
+import android.platform.test.annotations.Presubmit
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -63,12 +63,12 @@
             }
         }
 
-    @Postsubmit
+    @Presubmit
     @Test
     override fun appWindowReplacesLauncherAsTopWindow() =
         super.appWindowReplacesLauncherAsTopWindow()
 
-    @Postsubmit
+    @Presubmit
     @Test
     override fun launcherWindowBecomesInvisible() {
         testSpec.launcherWindowBecomesInvisible()
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
index 5a8162e..9a9d6ff 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/ChangeAppRotationTest.kt
@@ -16,6 +16,8 @@
 
 package com.android.server.wm.flicker.rotation
 
+import android.platform.test.annotations.Postsubmit
+import android.platform.test.annotations.Presubmit
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -57,7 +59,7 @@
         super.focusDoesNotChange()
     }
 
-    @FlakyTest
+    @Postsubmit
     @Test
     override fun noUncoveredRegions() {
         super.noUncoveredRegions()
@@ -75,6 +77,36 @@
         }
     }
 
+    @Postsubmit
+    @Test
+    override fun appLayerRotates_EndingPos() {
+        super.appLayerRotates_EndingPos()
+    }
+
+    @Postsubmit
+    @Test
+    override fun appLayerRotates_StartingPos() {
+        super.appLayerRotates_StartingPos()
+    }
+
+    @Presubmit
+    @Test
+    override fun navBarWindowIsAlwaysVisible() {
+        super.navBarWindowIsAlwaysVisible()
+    }
+
+    @Postsubmit
+    @Test
+    override fun statusBarLayerIsAlwaysVisible() {
+        super.statusBarLayerIsAlwaysVisible()
+    }
+
+    @Postsubmit
+    @Test
+    override fun statusBarWindowIsAlwaysVisible() {
+        super.statusBarWindowIsAlwaysVisible()
+    }
+
     companion object {
         private const val SCREENSHOT_LAYER = "RotationLayer"
 
diff --git a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
index a353c59..4770c3d 100644
--- a/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
+++ b/tests/FlickerTests/src/com/android/server/wm/flicker/rotation/SeamlessAppRotationTest.kt
@@ -16,6 +16,7 @@
 
 package com.android.server.wm.flicker.rotation
 
+import android.platform.test.annotations.Postsubmit
 import androidx.test.filters.FlakyTest
 import androidx.test.filters.RequiresDevice
 import com.android.server.wm.flicker.FlickerParametersRunnerFactory
@@ -92,6 +93,18 @@
         }
     }
 
+    @Postsubmit
+    @Test
+    override fun navBarWindowIsAlwaysVisible() {
+        super.navBarWindowIsAlwaysVisible()
+    }
+
+    @Postsubmit
+    @Test
+    override fun visibleLayersShownMoreThanOneConsecutiveEntry() {
+        super.visibleLayersShownMoreThanOneConsecutiveEntry()
+    }
+
     companion object {
         private val testFactory = FlickerTestParameterFactory.getInstance()