Merge "Don't handle the system UI visibility at server side"
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 0015bc6..5537edb 100644
--- a/core/java/android/app/ActivityManager.java
+++ b/core/java/android/app/ActivityManager.java
@@ -78,6 +78,7 @@
 import android.util.Singleton;
 import android.util.Size;
 import android.view.Surface;
+import android.view.WindowInsetsController.Appearance;
 
 import com.android.internal.app.LocalePicker;
 import com.android.internal.app.procstats.ProcessStats;
@@ -2116,7 +2117,7 @@
         // the task having a secure window or having previews disabled
         private final boolean mIsRealSnapshot;
         private final int mWindowingMode;
-        private final int mSystemUiVisibility;
+        private final @Appearance int mAppearance;
         private final boolean mIsTranslucent;
         // Must be one of the named color spaces, otherwise, always use SRGB color space.
         private final ColorSpace mColorSpace;
@@ -2125,7 +2126,7 @@
                 @NonNull ComponentName topActivityComponent, HardwareBuffer snapshot,
                 @NonNull ColorSpace colorSpace, int orientation, int rotation, Point taskSize,
                 Rect contentInsets, boolean isLowResolution, boolean isRealSnapshot,
-                int windowingMode, int systemUiVisibility, boolean isTranslucent) {
+                int windowingMode, @Appearance int appearance, boolean isTranslucent) {
             mId = id;
             mTopActivityComponent = topActivityComponent;
             mSnapshot = snapshot;
@@ -2138,7 +2139,7 @@
             mIsLowResolution = isLowResolution;
             mIsRealSnapshot = isRealSnapshot;
             mWindowingMode = windowingMode;
-            mSystemUiVisibility = systemUiVisibility;
+            mAppearance = appearance;
             mIsTranslucent = isTranslucent;
         }
 
@@ -2157,7 +2158,7 @@
             mIsLowResolution = source.readBoolean();
             mIsRealSnapshot = source.readBoolean();
             mWindowingMode = source.readInt();
-            mSystemUiVisibility = source.readInt();
+            mAppearance = source.readInt();
             mIsTranslucent = source.readBoolean();
         }
 
@@ -2265,11 +2266,11 @@
         }
 
         /**
-         * @return The system ui visibility flags for the top most visible fullscreen window at the
+         * @return The {@link Appearance} flags for the top most visible fullscreen window at the
          *         time that the snapshot was taken.
          */
-        public int getSystemUiVisibility() {
-            return mSystemUiVisibility;
+        public @Appearance int getAppearance() {
+            return mAppearance;
         }
 
         @Override
@@ -2291,7 +2292,7 @@
             dest.writeBoolean(mIsLowResolution);
             dest.writeBoolean(mIsRealSnapshot);
             dest.writeInt(mWindowingMode);
-            dest.writeInt(mSystemUiVisibility);
+            dest.writeInt(mAppearance);
             dest.writeBoolean(mIsTranslucent);
         }
 
@@ -2311,7 +2312,7 @@
                     + " mIsLowResolution=" + mIsLowResolution
                     + " mIsRealSnapshot=" + mIsRealSnapshot
                     + " mWindowingMode=" + mWindowingMode
-                    + " mSystemUiVisibility=" + mSystemUiVisibility
+                    + " mAppearance=" + mAppearance
                     + " mIsTranslucent=" + mIsTranslucent;
         }
 
@@ -2336,7 +2337,7 @@
             private Rect mContentInsets;
             private boolean mIsRealSnapshot;
             private int mWindowingMode;
-            private int mSystemUiVisibility;
+            private @Appearance int mAppearance;
             private boolean mIsTranslucent;
             private int mPixelFormat;
 
@@ -2393,8 +2394,8 @@
                 return this;
             }
 
-            public Builder setSystemUiVisibility(int systemUiVisibility) {
-                mSystemUiVisibility = systemUiVisibility;
+            public Builder setAppearance(@Appearance int appearance) {
+                mAppearance = appearance;
                 return this;
             }
 
@@ -2428,7 +2429,7 @@
                         false /* isLowResolution */,
                         mIsRealSnapshot,
                         mWindowingMode,
-                        mSystemUiVisibility,
+                        mAppearance,
                         mIsTranslucent);
 
             }
diff --git a/core/proto/android/server/windowmanagerservice.proto b/core/proto/android/server/windowmanagerservice.proto
index 32a40d9..0453d3f3 100644
--- a/core/proto/android/server/windowmanagerservice.proto
+++ b/core/proto/android/server/windowmanagerservice.proto
@@ -381,7 +381,7 @@
     optional int32 requested_width = 18;
     optional int32 requested_height = 19;
     optional int32 view_visibility = 20 [(.android.typedef) = "android.view.View.Visibility"];
-    optional int32 system_ui_visibility = 21;
+    optional int32 system_ui_visibility = 21 [deprecated=true];
     optional bool has_surface = 22;
     optional bool is_ready_for_display = 23;
     optional .android.graphics.RectProto display_frame = 24 [deprecated=true];
diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java
index 3de0b4b..d8fa90a 100644
--- a/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java
+++ b/packages/SystemUI/shared/src/com/android/systemui/shared/recents/model/ThumbnailData.java
@@ -29,6 +29,7 @@
 import android.graphics.Rect;
 import android.hardware.HardwareBuffer;
 import android.util.Log;
+import android.view.WindowInsetsController.Appearance;
 
 /**
  * Data for a single thumbnail.
@@ -43,7 +44,7 @@
     public boolean isRealSnapshot;
     public boolean isTranslucent;
     public int windowingMode;
-    public int systemUiVisibility;
+    public @Appearance int appearance;
     public float scale;
     public long snapshotId;
 
@@ -57,7 +58,6 @@
         isRealSnapshot = true;
         isTranslucent = false;
         windowingMode = WINDOWING_MODE_UNDEFINED;
-        systemUiVisibility = 0;
         snapshotId = 0;
     }
 
@@ -93,7 +93,7 @@
         isRealSnapshot = snapshot.isRealSnapshot();
         isTranslucent = snapshot.isTranslucent();
         windowingMode = snapshot.getWindowingMode();
-        systemUiVisibility = snapshot.getSystemUiVisibility();
+        appearance = snapshot.getAppearance();
         snapshotId = snapshot.getId();
     }
 }
diff --git a/proto/src/task_snapshot.proto b/proto/src/task_snapshot.proto
index 2006fb3..4b0e4c2 100644
--- a/proto/src/task_snapshot.proto
+++ b/proto/src/task_snapshot.proto
@@ -29,7 +29,7 @@
      int32 inset_bottom = 5;
      bool is_real_snapshot = 6;
      int32 windowing_mode = 7;
-     int32 system_ui_visibility = 8;
+     int32 system_ui_visibility = 8 [deprecated=true];
      bool is_translucent = 9;
      string top_activity_component = 10;
      // deprecated because original width and height are stored now instead of the scale.
@@ -40,4 +40,5 @@
      int32 task_width = 14;
      // The task height when the snapshot was taken
      int32 task_height = 15;
+     int32 appearance = 16;
  }
diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java
index 11a436e..e4f9256 100644
--- a/services/core/java/com/android/server/wm/DisplayPolicy.java
+++ b/services/core/java/com/android/server/wm/DisplayPolicy.java
@@ -118,7 +118,6 @@
 import android.app.ActivityThread;
 import android.app.LoadedApk;
 import android.app.ResourcesManager;
-import android.app.StatusBarManager;
 import android.content.Context;
 import android.content.Intent;
 import android.content.pm.PackageManager;
@@ -2746,7 +2745,7 @@
         final int dockedAppearance = updateLightStatusBarLw(0 /* appearance */,
                 mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState,
                 mDockedStackBounds);
-        final int disableFlags = win.getSystemUiVisibility() & StatusBarManager.DISABLE_MASK;
+        final int disableFlags = win.getDisableFlags();
         final int opaqueAppearance = updateSystemBarsLw(win, disableFlags);
         final WindowState navColorWin = chooseNavigationColorWindowLw(
                 mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState,
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotController.java b/services/core/java/com/android/server/wm/TaskSnapshotController.java
index 3327300..616a789 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotController.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotController.java
@@ -41,6 +41,7 @@
 import android.view.SurfaceControl;
 import android.view.ThreadedRenderer;
 import android.view.WindowInsets.Type;
+import android.view.WindowInsetsController.Appearance;
 import android.view.WindowManager.LayoutParams;
 
 import com.android.internal.annotations.VisibleForTesting;
@@ -333,7 +334,7 @@
         builder.setOrientation(activity.getTask().getConfiguration().orientation);
         builder.setRotation(activity.getTask().getDisplayContent().getRotation());
         builder.setWindowingMode(task.getWindowingMode());
-        builder.setSystemUiVisibility(getSystemUiVisibility(task));
+        builder.setAppearance(getAppearance(task));
         return true;
     }
 
@@ -507,7 +508,7 @@
                 hwBitmap.getColorSpace(), mainWindow.getConfiguration().orientation,
                 mainWindow.getWindowConfiguration().getRotation(), new Point(taskWidth, taskHeight),
                 contentInsets, false /* isLowResolution */, false /* isRealSnapshot */,
-                task.getWindowingMode(), getSystemUiVisibility(task), false);
+                task.getWindowingMode(), getAppearance(task), false);
     }
 
     /**
@@ -584,16 +585,16 @@
     }
 
     /**
-     * @return The SystemUI visibility flags for the top fullscreen opaque window in the given
+     * @return The {@link Appearance} flags for the top fullscreen opaque window in the given
      *         {@param task}.
      */
-    private int getSystemUiVisibility(Task task) {
+    private @Appearance int getAppearance(Task task) {
         final ActivityRecord topFullscreenActivity = task.getTopFullscreenActivity();
         final WindowState topFullscreenOpaqueWindow = topFullscreenActivity != null
                 ? topFullscreenActivity.getTopFullscreenOpaqueWindow()
                 : null;
         if (topFullscreenOpaqueWindow != null) {
-            return topFullscreenOpaqueWindow.getSystemUiVisibility();
+            return topFullscreenOpaqueWindow.mAttrs.insetsFlags.appearance;
         }
         return 0;
     }
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotLoader.java b/services/core/java/com/android/server/wm/TaskSnapshotLoader.java
index 89ddc29..9717e7e 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotLoader.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotLoader.java
@@ -197,7 +197,7 @@
                     hwBitmap.getColorSpace(), proto.orientation, proto.rotation, taskSize,
                     new Rect(proto.insetLeft, proto.insetTop, proto.insetRight, proto.insetBottom),
                     loadLowResolutionBitmap, proto.isRealSnapshot, proto.windowingMode,
-                    proto.systemUiVisibility, proto.isTranslucent);
+                    proto.appearance, proto.isTranslucent);
         } catch (IOException e) {
             Slog.w(TAG, "Unable to load task snapshot data for taskId=" + taskId);
             return null;
diff --git a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
index 324f0c2..f77b6d2 100644
--- a/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
+++ b/services/core/java/com/android/server/wm/TaskSnapshotPersister.java
@@ -382,7 +382,7 @@
             proto.insetBottom = mSnapshot.getContentInsets().bottom;
             proto.isRealSnapshot = mSnapshot.isRealSnapshot();
             proto.windowingMode = mSnapshot.getWindowingMode();
-            proto.systemUiVisibility = mSnapshot.getSystemUiVisibility();
+            proto.appearance = mSnapshot.getAppearance();
             proto.isTranslucent = mSnapshot.isTranslucent();
             proto.topActivityComponent = mSnapshot.getTopActivityComponent().flattenToString();
             proto.id = mSnapshot.getId();
diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java
index 2e95fca..f768435 100644
--- a/services/core/java/com/android/server/wm/WindowManagerService.java
+++ b/services/core/java/com/android/server/wm/WindowManagerService.java
@@ -2212,15 +2212,12 @@
             if (attrs != null) {
                 displayPolicy.adjustWindowParamsLw(win, attrs, pid, uid);
                 win.mToken.adjustWindowParams(win, attrs);
-                int systemUiVisibility = attrs.systemUiVisibility
-                        | attrs.subtreeSystemUiVisibility;
-                if ((systemUiVisibility & DISABLE_MASK) != 0) {
-                    // if they don't have the permission, mask out the status bar bits
-                    if (!hasStatusBarPermission(pid, uid)) {
-                        systemUiVisibility &= ~DISABLE_MASK;
-                    }
+                int disableFlags =
+                        (attrs.systemUiVisibility | attrs.subtreeSystemUiVisibility) & DISABLE_MASK;
+                if (disableFlags != 0 && !hasStatusBarPermission(pid, uid)) {
+                    disableFlags = 0;
                 }
-                win.mSystemUiVisibility = systemUiVisibility;
+                win.mDisableFlags = disableFlags;
                 if (win.mAttrs.type != attrs.type) {
                     throw new IllegalArgumentException(
                             "Window type can not be changed after the window is added.");
diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java
index d972a51..b5509f6 100644
--- a/services/core/java/com/android/server/wm/WindowState.java
+++ b/services/core/java/com/android/server/wm/WindowState.java
@@ -176,7 +176,6 @@
 import static com.android.server.wm.WindowStateProto.STACK_ID;
 import static com.android.server.wm.WindowStateProto.SURFACE_INSETS;
 import static com.android.server.wm.WindowStateProto.SURFACE_POSITION;
-import static com.android.server.wm.WindowStateProto.SYSTEM_UI_VISIBILITY;
 import static com.android.server.wm.WindowStateProto.VIEW_VISIBILITY;
 import static com.android.server.wm.WindowStateProto.WINDOW_CONTAINER;
 import static com.android.server.wm.WindowStateProto.WINDOW_FRAMES;
@@ -231,6 +230,7 @@
 import android.view.SurfaceControl;
 import android.view.SurfaceSession;
 import android.view.View;
+import android.view.ViewDebug;
 import android.view.ViewTreeObserver;
 import android.view.WindowInfo;
 import android.view.WindowInsets.Type.InsetsType;
@@ -307,7 +307,14 @@
     final boolean mIsWallpaper;
     private final boolean mIsFloatingLayer;
     int mViewVisibility;
-    int mSystemUiVisibility;
+
+    /**
+     * Flags to disable system UI functions. This can only be set by the one which has the
+     * status bar permission.
+     *
+     * @see View.SystemUiVisibility
+     */
+    int mDisableFlags;
 
     /**
      * The visibility flag of the window based on policy like {@link WindowManagerPolicy}.
@@ -1284,9 +1291,9 @@
         return mAttrs;
     }
 
-    /** Retrieves the current system UI visibility flags associated with this window. */
-    int getSystemUiVisibility() {
-        return mSystemUiVisibility;
+    /** Retrieves the flags used to disable system UI functions. */
+    int getDisableFlags() {
+        return mDisableFlags;
     }
 
     /** Gets the layer at which this window's surface will be Z-ordered. */
@@ -3889,7 +3896,6 @@
         proto.write(REQUESTED_WIDTH, mRequestedWidth);
         proto.write(REQUESTED_HEIGHT, mRequestedHeight);
         proto.write(VIEW_VISIBILITY, mViewVisibility);
-        proto.write(SYSTEM_UI_VISIBILITY, mSystemUiVisibility);
         proto.write(HAS_SURFACE, mHasSurface);
         proto.write(IS_READY_FOR_DISPLAY, isReadyForDisplay());
         proto.write(REMOVE_ON_EXIT, mRemoveOnExit);
@@ -3965,8 +3971,10 @@
             pw.println(prefix + "mViewVisibility=0x" + Integer.toHexString(mViewVisibility)
                     + " mHaveFrame=" + mHaveFrame
                     + " mObscured=" + mObscured);
-            pw.println(prefix
-                    + " mSystemUiVisibility=0x" + Integer.toHexString(mSystemUiVisibility));
+            if (mDisableFlags != 0) {
+                pw.println(prefix + "mDisableFlags=" + ViewDebug.flagsToString(
+                        View.class, "mSystemUiVisibility", mDisableFlags));
+            }
         }
         if (!isVisibleByPolicy() || !mLegacyPolicyVisibilityAfterAnim || !mAppOpVisibility
                 || isParentWindowHidden() || mPermanentlyHidden || mForceHideNonSystemOverlayWindow
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
index 0b99e32..0bb2867 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotControllerTest.java
@@ -16,6 +16,7 @@
 
 package com.android.server.wm;
 
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
 import static android.view.WindowManager.LayoutParams.FIRST_APPLICATION_WINDOW;
 import static android.view.WindowManager.LayoutParams.FLAG_SECURE;
 
@@ -41,7 +42,6 @@
 import android.hardware.HardwareBuffer;
 import android.platform.test.annotations.Presubmit;
 import android.util.ArraySet;
-import android.view.View;
 
 import androidx.test.filters.SmallTest;
 
@@ -135,7 +135,7 @@
         final long id = 1234L;
         final ComponentName activityComponent = new ComponentName("package", ".Class");
         final int windowingMode = WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
-        final int systemUiVisibility = View.SYSTEM_UI_FLAG_FULLSCREEN;
+        final int appearance = APPEARANCE_LIGHT_STATUS_BARS;
         final int pixelFormat = PixelFormat.RGBA_8888;
         final int orientation = Configuration.ORIENTATION_PORTRAIT;
         final float scaleFraction = 0.25f;
@@ -147,7 +147,7 @@
                     new ActivityManager.TaskSnapshot.Builder();
             builder.setId(id);
             builder.setTopActivityComponent(activityComponent);
-            builder.setSystemUiVisibility(systemUiVisibility);
+            builder.setAppearance(appearance);
             builder.setWindowingMode(windowingMode);
             builder.setColorSpace(sRGB);
             builder.setOrientation(orientation);
@@ -164,7 +164,7 @@
             ActivityManager.TaskSnapshot snapshot = builder.build();
             assertEquals(id, snapshot.getId());
             assertEquals(activityComponent, snapshot.getTopActivityComponent());
-            assertEquals(systemUiVisibility, snapshot.getSystemUiVisibility());
+            assertEquals(appearance, snapshot.getAppearance());
             assertEquals(windowingMode, snapshot.getWindowingMode());
             assertEquals(sRGB, snapshot.getColorSpace());
             // Snapshots created with the Builder class are always high-res. The only way to get a
diff --git a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
index bfee894..8b90824 100644
--- a/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/TaskSnapshotPersisterLoaderTest.java
@@ -18,6 +18,8 @@
 
 import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN;
 import static android.app.WindowConfiguration.WINDOWING_MODE_PINNED;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_NAVIGATION_BARS;
+import static android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS;
 
 import static com.android.dx.mockito.inline.extended.ExtendedMockito.mockitoSession;
 
@@ -36,7 +38,6 @@
 import android.platform.test.annotations.Presubmit;
 import android.util.ArraySet;
 import android.view.Surface;
-import android.view.View;
 
 import androidx.test.filters.MediumTest;
 
@@ -362,17 +363,16 @@
     }
 
     @Test
-    public void testSystemUiVisibilityPersistAndLoadSnapshot() {
-        final int lightBarFlags = View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR
-                | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR;
+    public void testAppearancePersistAndLoadSnapshot() {
+        final int lightBarFlags = APPEARANCE_LIGHT_STATUS_BARS | APPEARANCE_LIGHT_NAVIGATION_BARS;
         TaskSnapshot a = new TaskSnapshotBuilder()
                 .setSystemUiVisibility(0)
                 .build();
         TaskSnapshot b = new TaskSnapshotBuilder()
                 .setSystemUiVisibility(lightBarFlags)
                 .build();
-        assertEquals(0, a.getSystemUiVisibility());
-        assertEquals(lightBarFlags, b.getSystemUiVisibility());
+        assertEquals(0, a.getAppearance());
+        assertEquals(lightBarFlags, b.getAppearance());
         mPersister.persistSnapshot(1, mTestUserId, a);
         mPersister.persistSnapshot(2, mTestUserId, b);
         mPersister.waitForQueueEmpty();
@@ -382,8 +382,8 @@
                 false /* isLowResolution */);
         assertNotNull(snapshotA);
         assertNotNull(snapshotB);
-        assertEquals(0, snapshotA.getSystemUiVisibility());
-        assertEquals(lightBarFlags, snapshotB.getSystemUiVisibility());
+        assertEquals(0, snapshotA.getAppearance());
+        assertEquals(lightBarFlags, snapshotB.getAppearance());
     }
 
     @Test