Don't handle the system UI visibility at server side

The system UI visibility has been deprecated. Except disable flags, it
should be converted to the new APIs before being sent to WMS. This CL
renames mSystemUiVisibilitiy to mDisableFLags in WindowState.

Bug: 149813814
Test: atest TaskSnapshotControllerTest TaskSnapshotPersisterLoaderTest
Change-Id: I6730ba664359656ee814c7bc959844d6ed4aaeb9
diff --git a/core/java/android/app/ActivityManager.java b/core/java/android/app/ActivityManager.java
index 1e6e784..78fad85 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 fbcbe00..837afdd 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