Handling statusbar color when back navigation (2/2)

Introduce SystemBarCustomizer so BackAnimationController could customize
the status bar color according the background color when back animation
is in progress.

Bug: 259491355
Test: manual
Change-Id: I967ec4555a94b270d91f498639140cb7d81dd266
diff --git a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
index 9d6d68e..3979444 100644
--- a/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
+++ b/quickstep/src/com/android/quickstep/LauncherBackAnimationController.java
@@ -17,6 +17,7 @@
 package com.android.quickstep;
 
 import static android.view.RemoteAnimationTarget.MODE_CLOSING;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
 
 import static com.android.launcher3.AbstractFloatingView.TYPE_REBIND_SAFE;
 import static com.android.launcher3.BaseActivity.INVISIBLE_ALL;
@@ -39,6 +40,7 @@
 import android.view.IRemoteAnimationRunner;
 import android.view.RemoteAnimationTarget;
 import android.view.SurfaceControl;
+import android.view.View;
 import android.view.ViewRootImpl;
 import android.view.animation.AnimationUtils;
 import android.view.animation.Interpolator;
@@ -47,6 +49,7 @@
 import android.window.BackProgressAnimator;
 import android.window.IOnBackInvokedCallback;
 
+import com.android.internal.view.AppearanceRegion;
 import com.android.launcher3.AbstractFloatingView;
 import com.android.launcher3.QuickstepTransitionManager;
 import com.android.launcher3.R;
@@ -77,6 +80,8 @@
     private static final float MIN_WINDOW_SCALE = 0.85f;
     private static final float MAX_SCRIM_ALPHA_DARK = 0.8f;
     private static final float MAX_SCRIM_ALPHA_LIGHT = 0.2f;
+    private static final float UPDATE_SYSUI_FLAGS_THRESHOLD = 0.20f;
+
     private final QuickstepTransitionManager mQuickstepTransitionManager;
     private final Matrix mTransformMatrix = new Matrix();
     /** The window position at the beginning of the back animation. */
@@ -106,6 +111,7 @@
     private SurfaceControl mScrimLayer;
     private ValueAnimator mScrimAlphaAnimator;
     private float mScrimAlpha;
+    private boolean mOverridingStatusBarFlags;
 
     public LauncherBackAnimationController(
             QuickstepLauncher launcher,
@@ -204,6 +210,8 @@
         cancelAnimator.addListener(new AnimatorListenerAdapter() {
             @Override
             public void onAnimationEnd(Animator animation) {
+                // Refresh the status bar appearance to the original one.
+                customizeStatusBarAppearance(false);
                 finishAnimation();
             }
         });
@@ -295,6 +303,8 @@
         float cornerRadius = Utilities.mapRange(
                 progress, mWindowScaleStartCornerRadius, mWindowScaleEndCornerRadius);
         applyTransform(mCurrentRect, cornerRadius);
+
+        customizeStatusBarAppearance(progress > UPDATE_SYSUI_FLAGS_THRESHOLD);
     }
 
     private void updateCancelProgress(float progress) {
@@ -376,6 +386,9 @@
         mInitialTouchPos.set(0, 0);
         mAnimatorSetInProgress = false;
         mSpringAnimationInProgress = false;
+        // We don't call customizeStatusBarAppearance here to prevent the status bar update with
+        // the legacy appearance. It should be refreshed after the transition done.
+        mOverridingStatusBarFlags = false;
         if (mAnimationFinishedCallback != null) {
             try {
                 mAnimationFinishedCallback.onAnimationFinished();
@@ -439,4 +452,20 @@
             finishAnimation();
         }
     }
+
+    private void customizeStatusBarAppearance(boolean overridingStatusBarFlags) {
+        if (mOverridingStatusBarFlags == overridingStatusBarFlags) {
+            return;
+        }
+
+        mOverridingStatusBarFlags = overridingStatusBarFlags;
+        final boolean isBackgroundDark =
+                (mLauncher.getWindow().getDecorView().getSystemUiVisibility()
+                        & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR) == 0;
+        final AppearanceRegion region = mOverridingStatusBarFlags
+                ? new AppearanceRegion(!isBackgroundDark ? APPEARANCE_LIGHT_STATUS_BARS : 0,
+                        mBackTarget.windowConfiguration.getBounds())
+                : null;
+        SystemUiProxy.INSTANCE.get(mLauncher).customizeStatusBarAppearance(region);
+    }
 }
diff --git a/quickstep/src/com/android/quickstep/SystemUiProxy.java b/quickstep/src/com/android/quickstep/SystemUiProxy.java
index d8f49ff..7cc3e11 100644
--- a/quickstep/src/com/android/quickstep/SystemUiProxy.java
+++ b/quickstep/src/com/android/quickstep/SystemUiProxy.java
@@ -56,6 +56,7 @@
 
 import com.android.internal.logging.InstanceId;
 import com.android.internal.util.ScreenshotRequest;
+import com.android.internal.view.AppearanceRegion;
 import com.android.launcher3.util.MainThreadInitializedObject;
 import com.android.launcher3.util.SplitConfigurationOptions;
 import com.android.systemui.shared.recents.ISystemUiProxy;
@@ -1009,6 +1010,20 @@
         }
     }
 
+    /**
+     * Called when the status bar color needs to be customized when back navigation.
+     */
+    public void customizeStatusBarAppearance(AppearanceRegion appearance) {
+        if (mBackAnimation == null) {
+            return;
+        }
+        try {
+            mBackAnimation.customizeStatusBarAppearance(appearance);
+        } catch (RemoteException e) {
+            Log.e(TAG, "Failed call useLauncherSysBarFlags", e);
+        }
+    }
+
     public ArrayList<GroupedRecentTaskInfo> getRecentTasks(int numTasks, int userId) {
         if (mRecentTasks != null) {
             try {
@@ -1097,8 +1112,6 @@
             Log.e(TAG, "Failed call setUnfoldAnimationListener", e);
         }
     }
-
-
     /**
      * Starts the recents activity. The caller should manage the thread on which this is called.
      */