From 0dbd5376eadcecb1923722fd78203e77f4810199 Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Sat, 26 Oct 2019 00:24:22 +0800 Subject: [PATCH] Window Manager Flag Migration (5/n) Completely remove the system UI visibility from the SystemUI side. Bug: 118118435 Test: atest InsetsSourceProviderTest InsetsStateControllerTest InsetsPolicyTest WindowStateTests CommandQueueTest RegisterStatusBarResultTest InsetsFlagsTest LightBarControllerTest RegisterStatusBarResultTest Test: build on specific target Change-Id: Ibc866c5fbb35582dad8fd1a90376ce47dc501377 --- .../internal/statusbar/IStatusBar.aidl | 19 -- .../internal/statusbar/IStatusBarService.aidl | 1 - .../statusbar/RegisterStatusBarResult.java | 65 +++---- .../RegisterStatusBarResultTest.java | 23 +-- .../systemui/statusbar/CommandQueue.java | 41 ----- .../statusbar/phone/LightBarController.java | 2 +- .../systemui/statusbar/phone/StatusBar.java | 17 +- .../statusbar/StatusBarManagerInternal.java | 5 +- .../statusbar/StatusBarManagerService.java | 169 ++++++++---------- .../com/android/server/wm/DisplayPolicy.java | 79 ++++---- .../com/android/server/wm/WindowState.java | 4 +- .../android/server/wm/InsetsPolicyTest.java | 5 +- 12 files changed, 169 insertions(+), 261 deletions(-) diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 317469e58245a..73f549a31bac0 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -38,25 +38,6 @@ oneway interface IStatusBar void showWirelessChargingAnimation(int batteryLevel); - /** - * Notifies System UI side of a visibility flag change on the specified display. - * - * @param displayId the id of the display to notify - * @param vis the visibility flags except SYSTEM_UI_FLAG_LIGHT_STATUS_BAR which will be reported - * separately in fullscreenStackVis and dockedStackVis - * @param fullscreenStackVis the flags which only apply in the region of the fullscreen stack, - * which is currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - * @param dockedStackVis the flags that only apply in the region of the docked stack, which is - * currently only SYSTEM_UI_FLAG_LIGHT_STATUS_BAR - * @param mask which flags to change - * @param fullscreenBounds the current bounds of the fullscreen stack, in screen coordinates - * @param dockedBounds the current bounds of the docked stack, in screen coordinates - * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME. - */ - void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis, - int mask, in Rect fullscreenBounds, in Rect dockedBounds, - boolean navbarColorManagedByIme); - void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive); void setImeWindowStatus(int displayId, in IBinder token, int vis, int backDisposition, boolean showImeSwitcher, boolean isMultiClientImeEnabled); diff --git a/core/java/com/android/internal/statusbar/IStatusBarService.aidl b/core/java/com/android/internal/statusbar/IStatusBarService.aidl index 499a4d2fb9497..4b24980192847 100644 --- a/core/java/com/android/internal/statusbar/IStatusBarService.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBarService.aidl @@ -76,7 +76,6 @@ interface IStatusBarService void onNotificationSmartReplySent(in String key, in int replyIndex, in CharSequence reply, in int notificationLocation, boolean modifiedBeforeSending); void onNotificationSettingsViewed(String key); - void setSystemUiVisibility(int displayId, int vis, int mask, String cause); void onNotificationBubbleChanged(String key, boolean isBubble); void grantInlineReplyUriPermission(String key, in Uri uri); diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java index 4c3f04b108923..9095f05543da3 100644 --- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java +++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java @@ -16,53 +16,50 @@ package com.android.internal.statusbar; -import android.graphics.Rect; +import android.annotation.NonNull; import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.util.ArrayMap; +import com.android.internal.view.AppearanceRegion; + /** * An immutable data object to return a set of values from StatusBarManagerService to its clients. */ public final class RegisterStatusBarResult implements Parcelable { public final ArrayMap mIcons; - public final int mDisabledFlags1; // switch[0] - public final int mSystemUiVisibility; // switch[1] - public final int mImeWindowVis; // switch[3] - public final int mImeBackDisposition; // switch[4] - public final boolean mShowImeSwitcher; // switch[5] - public final int mDisabledFlags2; // switch[6] - public final int mFullscreenStackSysUiVisibility; // switch[7] - public final int mDockedStackSysUiVisibility; // switch[8] + public final int mDisabledFlags1; // switch[0] + public final int mAppearance; // switch[1] + public final AppearanceRegion[] mAppearanceRegions; // switch[2] + public final int mImeWindowVis; // switch[3] + public final int mImeBackDisposition; // switch[4] + public final boolean mShowImeSwitcher; // switch[5] + public final int mDisabledFlags2; // switch[6] public final IBinder mImeToken; - public final Rect mFullscreenStackBounds; - public final Rect mDockedStackBounds; public final boolean mNavbarColorManagedByIme; public final boolean mAppFullscreen; public final boolean mAppImmersive; + public final int[] mTransientBarTypes; public RegisterStatusBarResult(ArrayMap icons, int disabledFlags1, - int systemUiVisibility, int imeWindowVis, int imeBackDisposition, - boolean showImeSwitcher, int disabledFlags2, int fullscreenStackSysUiVisibility, - int dockedStackSysUiVisibility, IBinder imeToken, Rect fullscreenStackBounds, - Rect dockedStackBounds, boolean navbarColorManagedByIme, boolean appFullscreen, - boolean appImmersive) { + int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis, + int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken, + boolean navbarColorManagedByIme, boolean appFullscreen, boolean appImmersive, + @NonNull int[] transientBarTypes) { mIcons = new ArrayMap<>(icons); mDisabledFlags1 = disabledFlags1; - mSystemUiVisibility = systemUiVisibility; + mAppearance = appearance; + mAppearanceRegions = appearanceRegions; mImeWindowVis = imeWindowVis; mImeBackDisposition = imeBackDisposition; mShowImeSwitcher = showImeSwitcher; mDisabledFlags2 = disabledFlags2; - mFullscreenStackSysUiVisibility = fullscreenStackSysUiVisibility; - mDockedStackSysUiVisibility = dockedStackSysUiVisibility; mImeToken = imeToken; - mFullscreenStackBounds = fullscreenStackBounds; - mDockedStackBounds = dockedStackBounds; mNavbarColorManagedByIme = navbarColorManagedByIme; mAppFullscreen = appFullscreen; mAppImmersive = appImmersive; + mTransientBarTypes = transientBarTypes; } @Override @@ -74,19 +71,17 @@ public final class RegisterStatusBarResult implements Parcelable { public void writeToParcel(Parcel dest, int flags) { dest.writeTypedArrayMap(mIcons, flags); dest.writeInt(mDisabledFlags1); - dest.writeInt(mSystemUiVisibility); + dest.writeInt(mAppearance); + dest.writeParcelableArray(mAppearanceRegions, 0); dest.writeInt(mImeWindowVis); dest.writeInt(mImeBackDisposition); dest.writeBoolean(mShowImeSwitcher); dest.writeInt(mDisabledFlags2); - dest.writeInt(mFullscreenStackSysUiVisibility); - dest.writeInt(mDockedStackSysUiVisibility); dest.writeStrongBinder(mImeToken); - dest.writeTypedObject(mFullscreenStackBounds, flags); - dest.writeTypedObject(mDockedStackBounds, flags); dest.writeBoolean(mNavbarColorManagedByIme); dest.writeBoolean(mAppFullscreen); dest.writeBoolean(mAppImmersive); + dest.writeIntArray(mTransientBarTypes); } /** @@ -99,24 +94,22 @@ public final class RegisterStatusBarResult implements Parcelable { final ArrayMap icons = source.createTypedArrayMap(StatusBarIcon.CREATOR); final int disabledFlags1 = source.readInt(); - final int systemUiVisibility = source.readInt(); + final int appearance = source.readInt(); + final AppearanceRegion[] appearanceRegions = + source.readParcelableArray(null, AppearanceRegion.class); final int imeWindowVis = source.readInt(); final int imeBackDisposition = source.readInt(); final boolean showImeSwitcher = source.readBoolean(); final int disabledFlags2 = source.readInt(); - final int fullscreenStackSysUiVisibility = source.readInt(); - final int dockedStackSysUiVisibility = source.readInt(); final IBinder imeToken = source.readStrongBinder(); - final Rect fullscreenStackBounds = source.readTypedObject(Rect.CREATOR); - final Rect dockedStackBounds = source.readTypedObject(Rect.CREATOR); final boolean navbarColorManagedByIme = source.readBoolean(); final boolean appFullscreen = source.readBoolean(); final boolean appImmersive = source.readBoolean(); - return new RegisterStatusBarResult(icons, disabledFlags1, systemUiVisibility, - imeWindowVis, imeBackDisposition, showImeSwitcher, disabledFlags2, - fullscreenStackSysUiVisibility, dockedStackSysUiVisibility, imeToken, - fullscreenStackBounds, dockedStackBounds, navbarColorManagedByIme, - appFullscreen, appImmersive); + final int[] transientBarTypes = source.createIntArray(); + return new RegisterStatusBarResult(icons, disabledFlags1, appearance, + appearanceRegions, imeWindowVis, imeBackDisposition, showImeSwitcher, + disabledFlags2, imeToken, navbarColorManagedByIme, appFullscreen, + appImmersive, transientBarTypes); } @Override diff --git a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java index 0be5009f85f0c..9f68ef31c1668 100644 --- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java +++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java @@ -18,7 +18,6 @@ package com.android.internal.statusbar; import static com.google.common.truth.Truth.assertThat; -import android.graphics.Rect; import android.os.Binder; import android.os.Parcel; import android.os.UserHandle; @@ -27,6 +26,8 @@ import android.util.ArrayMap; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; +import com.android.internal.view.AppearanceRegion; + import org.junit.Test; import org.junit.runner.RunWith; @@ -47,19 +48,17 @@ public class RegisterStatusBarResultTest { final RegisterStatusBarResult original = new RegisterStatusBarResult(iconMap, 0x2 /* disabledFlags1 */, - 0x4 /* systemUiVisibility */, + 0x4 /* appearance */, + new AppearanceRegion[0] /* appearanceRegions */, 0x8 /* imeWindowVis */, 0x10 /* imeBackDisposition */, false /* showImeSwitcher */, 0x20 /* disabledFlags2 */, - 0x40 /* fullscreenStackSysUiVisibility */, - 0x80 /* dockedStackSysUiVisibility */, new Binder() /* imeToken */, - new Rect(0x100, 0x200, 0x400, 0x800) /* fullscreenStackBounds */, - new Rect(0x1000, 0x2000, 0x4000, 0x8000) /* dockedStackBounds */, true /* navbarColorManagedByIme */, true /* appFullscreen */, - true /* appImmersive */); + true /* appImmersive */, + new int[0] /* transientBarTypes */); final RegisterStatusBarResult copy = clone(original); @@ -69,21 +68,17 @@ public class RegisterStatusBarResultTest { .isEqualTo(original.mIcons.get(dumyIconKey).user); assertThat(copy.mDisabledFlags1).isEqualTo(original.mDisabledFlags1); - assertThat(copy.mSystemUiVisibility).isEqualTo(original.mSystemUiVisibility); + assertThat(copy.mAppearance).isEqualTo(original.mAppearance); + assertThat(copy.mAppearanceRegions).isEqualTo(original.mAppearanceRegions); assertThat(copy.mImeWindowVis).isEqualTo(original.mImeWindowVis); assertThat(copy.mImeBackDisposition).isEqualTo(original.mImeBackDisposition); assertThat(copy.mShowImeSwitcher).isEqualTo(original.mShowImeSwitcher); assertThat(copy.mDisabledFlags2).isEqualTo(original.mDisabledFlags2); - assertThat(copy.mFullscreenStackSysUiVisibility) - .isEqualTo(original.mFullscreenStackSysUiVisibility); - assertThat(copy.mDockedStackSysUiVisibility) - .isEqualTo(original.mDockedStackSysUiVisibility); assertThat(copy.mImeToken).isSameAs(original.mImeToken); - assertThat(copy.mFullscreenStackBounds).isEqualTo(original.mFullscreenStackBounds); - assertThat(copy.mDockedStackBounds).isEqualTo(original.mDockedStackBounds); assertThat(copy.mNavbarColorManagedByIme).isEqualTo(original.mNavbarColorManagedByIme); assertThat(copy.mAppFullscreen).isEqualTo(original.mAppFullscreen); assertThat(copy.mAppImmersive).isEqualTo(original.mAppImmersive); + assertThat(copy.mTransientBarTypes).isEqualTo(original.mTransientBarTypes); } private RegisterStatusBarResult clone(RegisterStatusBarResult original) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index eb6ea13a66907..b57c35bae00c3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -22,8 +22,6 @@ import static android.inputmethodservice.InputMethodService.BACK_DISPOSITION_DEF import static android.inputmethodservice.InputMethodService.IME_INVISIBLE; import static android.view.Display.DEFAULT_DISPLAY; import static android.view.Display.INVALID_DISPLAY; -import static android.view.InsetsState.TYPE_NAVIGATION_BAR; -import static android.view.InsetsState.TYPE_TOP_BAR; import static com.android.systemui.statusbar.phone.StatusBar.ONLY_CORE_APPS; @@ -34,7 +32,6 @@ import android.app.StatusBarManager.WindowType; import android.app.StatusBarManager.WindowVisibleState; import android.content.ComponentName; import android.content.Context; -import android.graphics.Rect; import android.hardware.biometrics.IBiometricServiceReceiverInternal; import android.hardware.display.DisplayManager; import android.inputmethodservice.InputMethodService.BackDispositionMode; @@ -45,9 +42,7 @@ import android.os.Looper; import android.os.Message; import android.util.Pair; import android.util.SparseArray; -import android.view.InsetsFlags; import android.view.InsetsState.InternalInsetType; -import android.view.View; import android.view.WindowInsetsController.Appearance; import androidx.annotation.VisibleForTesting; @@ -470,42 +465,6 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< } } - // TODO(b/118118435): Remove this function after migration - @Override - public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenStackBounds, Rect dockedStackBounds, - boolean navbarColorManagedByIme) { - synchronized (mLock) { - final boolean hasDockedStack = !dockedStackBounds.isEmpty(); - final boolean transientStatus = (vis & View.STATUS_BAR_TRANSIENT) != 0; - final boolean transientNavigation = (vis & View.NAVIGATION_BAR_TRANSIENT) != 0; - if (transientStatus && transientNavigation) { - showTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR}); - } else if (transientStatus) { - showTransient(displayId, new int[]{TYPE_TOP_BAR}); - abortTransient(displayId, new int[]{TYPE_NAVIGATION_BAR}); - } else if (transientNavigation) { - showTransient(displayId, new int[]{TYPE_NAVIGATION_BAR}); - abortTransient(displayId, new int[]{TYPE_TOP_BAR}); - } else { - abortTransient(displayId, new int[]{TYPE_TOP_BAR, TYPE_NAVIGATION_BAR}); - } - SomeArgs args = SomeArgs.obtain(); - args.argi1 = displayId; - args.argi2 = InsetsFlags.getAppearance(vis); - args.argi3 = navbarColorManagedByIme ? 1 : 0; - final int fullscreenAppearance = InsetsFlags.getAppearance(fullscreenStackVis); - final int dockedAppearance = InsetsFlags.getAppearance(dockedStackVis); - args.arg1 = hasDockedStack - ? new AppearanceRegion[]{ - new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds), - new AppearanceRegion(dockedAppearance, dockedStackBounds)} - : new AppearanceRegion[]{ - new AppearanceRegion(fullscreenAppearance, fullscreenStackBounds)}; - mHandler.obtainMessage(MSG_SYSTEM_BAR_APPEARANCE_CHANGED, args).sendToTarget(); - } - } - @Override public void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive) { synchronized (mLock) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java index 2e776e39b54c4..1532c4f977e05 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java @@ -247,7 +247,7 @@ public class LightBarController implements BatteryController.BatteryStateChangeC @Override public void dump(FileDescriptor fd, PrintWriter pw, String[] args) { pw.println("LightBarController: "); - pw.print(" mAppearance=0x"); pw.println(ViewDebug.flagsToString( + pw.print(" mAppearance="); pw.println(ViewDebug.flagsToString( InsetsFlags.class, "appearance", mAppearance)); final int numStacks = mAppearanceRegions.length; for (int i = 0; i < numStacks; i++) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java index 2125d126752a5..0079089368baa 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -24,7 +24,6 @@ import static android.app.StatusBarManager.WindowType; import static android.app.StatusBarManager.WindowVisibleState; import static android.app.StatusBarManager.windowStateToString; import static android.app.WindowConfiguration.WINDOWING_MODE_FULLSCREEN_OR_SPLIT_SCREEN_SECONDARY; -import static android.view.InsetsFlags.getAppearance; import static android.view.InsetsState.TYPE_TOP_BAR; import static android.view.InsetsState.containsType; import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; @@ -857,19 +856,11 @@ public class StatusBar extends SystemUI implements DemoMode, // Set up the initial notification state. This needs to happen before CommandQueue.disable() setUpPresenter(); - if ((result.mSystemUiVisibility & View.STATUS_BAR_TRANSIENT) != 0) { + if (containsType(result.mTransientBarTypes, TYPE_TOP_BAR)) { showTransientUnchecked(); } - final int fullscreenAppearance = getAppearance(result.mFullscreenStackSysUiVisibility); - final int dockedAppearance = getAppearance(result.mDockedStackSysUiVisibility); - final AppearanceRegion[] appearanceRegions = result.mDockedStackBounds.isEmpty() - ? new AppearanceRegion[]{ - new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds)} - : new AppearanceRegion[]{ - new AppearanceRegion(fullscreenAppearance, result.mFullscreenStackBounds), - new AppearanceRegion(dockedAppearance, result.mDockedStackBounds)}; - onSystemBarAppearanceChanged(mDisplayId, getAppearance(result.mSystemUiVisibility), - appearanceRegions, result.mNavbarColorManagedByIme); + onSystemBarAppearanceChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions, + result.mNavbarColorManagedByIme); mAppFullscreen = result.mAppFullscreen; mAppImmersive = result.mAppImmersive; @@ -889,7 +880,7 @@ public class StatusBar extends SystemUI implements DemoMode, "init: icons=%d disabled=0x%08x lights=0x%08x imeButton=0x%08x", numIcons, result.mDisabledFlags1, - result.mSystemUiVisibility, + result.mAppearance, result.mImeWindowVis)); } diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index ec64ee6d52de2..b6934c9ce6049 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -16,7 +16,6 @@ package com.android.server.statusbar; -import android.graphics.Rect; import android.os.Bundle; import android.view.InsetsState.InternalInsetType; import android.view.WindowInsetsController.Appearance; @@ -79,9 +78,7 @@ public interface StatusBarManagerInternal { void startAssist(Bundle args); void onCameraLaunchGestureDetected(int source); void topAppWindowChanged(int displayId, boolean isFullscreen, boolean isImmersive); - void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, int dockedStackVis, - int mask, Rect fullscreenBounds, Rect dockedBounds, boolean isNavbarColorManagedByIme, - String cause); + void setDisableFlags(int displayId, int flags, String cause); void toggleSplitScreen(); void appTransitionFinished(int displayId); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 489c34359645e..661ca1950b316 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -25,7 +25,6 @@ import android.app.Notification; import android.app.StatusBarManager; import android.content.ComponentName; import android.content.Context; -import android.graphics.Rect; import android.hardware.biometrics.IBiometricServiceReceiverInternal; import android.hardware.display.DisplayManager; import android.hardware.display.DisplayManager.DisplayListener; @@ -43,10 +42,11 @@ import android.os.UserHandle; import android.service.notification.NotificationStats; import android.text.TextUtils; import android.util.ArrayMap; -import android.util.Log; +import android.util.ArraySet; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.view.InsetsState.InternalInsetType; import android.view.WindowInsetsController.Appearance; import com.android.internal.R; @@ -263,12 +263,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds, - boolean isNavbarColorManagedByIme, String cause) { - StatusBarManagerService.this.setSystemUiVisibility(displayId, vis, fullscreenStackVis, - dockedStackVis, mask, fullscreenBounds, dockedBounds, isNavbarColorManagedByIme, - cause); + public void setDisableFlags(int displayId, int flags, String cause) { + StatusBarManagerService.this.setDisableFlags(displayId, flags, cause); } @Override @@ -473,7 +469,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void onSystemBarAppearanceChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) { - // TODO (b/118118435): save the information to UiState + final UiState state = getUiState(displayId); + if (!state.appearanceEquals(appearance, appearanceRegions, navbarColorManagedByIme)) { + state.setAppearance(appearance, appearanceRegions, navbarColorManagedByIme); + } if (mBar != null) { try { mBar.onSystemBarAppearanceChanged(displayId, appearance, appearanceRegions, @@ -483,7 +482,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void showTransient(int displayId, int[] types) { + public void showTransient(int displayId, @InternalInsetType int[] types) { + getUiState(displayId).showTransient(types); if (mBar != null) { try { mBar.showTransient(displayId, types); @@ -492,7 +492,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } @Override - public void abortTransient(int displayId, int[] types) { + public void abortTransient(int displayId, @InternalInsetType int[] types) { + getUiState(displayId).clearTransient(types); if (mBar != null) { try { mBar.abortTransient(displayId, types); @@ -896,54 +897,20 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } } - @Override - public void setSystemUiVisibility(int displayId, int vis, int mask, String cause) { - final UiState state = getUiState(displayId); - setSystemUiVisibility(displayId, vis, 0, 0, mask, - state.mFullscreenStackBounds, state.mDockedStackBounds, - state.mNavbarColorManagedByIme, cause); - } - - private void setSystemUiVisibility(int displayId, int vis, int fullscreenStackVis, - int dockedStackVis, int mask, Rect fullscreenBounds, Rect dockedBounds, - boolean isNavbarColorManagedByIme, String cause) { + private void setDisableFlags(int displayId, int flags, String cause) { // also allows calls from window manager which is in this process. enforceStatusBarService(); - if (SPEW) Slog.d(TAG, "setSystemUiVisibility(0x" + Integer.toHexString(vis) + ")"); + final int unknownFlags = flags & ~StatusBarManager.DISABLE_MASK; + if (unknownFlags != 0) { + Slog.e(TAG, "Unknown disable flags: 0x" + Integer.toHexString(unknownFlags), + new RuntimeException()); + } + + if (SPEW) Slog.d(TAG, "setDisableFlags(0x" + Integer.toHexString(flags) + ")"); synchronized (mLock) { - updateUiVisibilityLocked(displayId, vis, fullscreenStackVis, dockedStackVis, mask, - fullscreenBounds, dockedBounds, isNavbarColorManagedByIme); - disableLocked( - displayId, - mCurrentUserId, - vis & StatusBarManager.DISABLE_MASK, - mSysUiVisToken, - cause, 1); - } - } - - private void updateUiVisibilityLocked(final int displayId, final int vis, - final int fullscreenStackVis, final int dockedStackVis, final int mask, - final Rect fullscreenBounds, final Rect dockedBounds, - final boolean isNavbarColorManagedByIme) { - final UiState state = getUiState(displayId); - if (!state.systemUiStateEquals(vis, fullscreenStackVis, dockedStackVis, - fullscreenBounds, dockedBounds, isNavbarColorManagedByIme)) { - state.setSystemUiState(vis, fullscreenStackVis, dockedStackVis, fullscreenBounds, - dockedBounds, isNavbarColorManagedByIme); - mHandler.post(() -> { - if (mBar != null) { - try { - mBar.setSystemUiVisibility(displayId, vis, fullscreenStackVis, - dockedStackVis, mask, fullscreenBounds, dockedBounds, - isNavbarColorManagedByIme); - } catch (RemoteException ex) { - Log.w(TAG, "Can not get StatusBar!"); - } - } - }); + disableLocked(displayId, mCurrentUserId, flags, mSysUiVisToken, cause, 1); } } @@ -965,11 +932,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D } private class UiState { - private int mSystemUiVisibility = 0; - private int mFullscreenStackSysUiVisibility = 0; - private int mDockedStackSysUiVisibility = 0; - private final Rect mFullscreenStackBounds = new Rect(); - private final Rect mDockedStackBounds = new Rect(); + private @Appearance int mAppearance = 0; + private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0]; + private ArraySet mTransientBarTypes = new ArraySet<>(); + private boolean mNavbarColorManagedByIme = false; private boolean mFullscreen = false; private boolean mImmersive = false; private int mDisabled1 = 0; @@ -978,7 +944,47 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private int mImeBackDisposition = 0; private boolean mShowImeSwitcher = false; private IBinder mImeToken = null; - private boolean mNavbarColorManagedByIme = false; + + private void setAppearance(@Appearance int appearance, + AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) { + mAppearance = appearance; + mAppearanceRegions = appearanceRegions; + mNavbarColorManagedByIme = navbarColorManagedByIme; + } + + private boolean appearanceEquals(@Appearance int appearance, + AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme) { + if (mAppearance != appearance || mAppearanceRegions.length != appearanceRegions.length + || mNavbarColorManagedByIme != navbarColorManagedByIme) { + return false; + } + for (int i = appearanceRegions.length - 1; i >= 0; i--) { + if (!mAppearanceRegions[i].equals(appearanceRegions[i])) { + return false; + } + } + return true; + } + + private void showTransient(@InternalInsetType int[] types) { + for (int type : types) { + mTransientBarTypes.add(type); + } + } + + private void clearTransient(@InternalInsetType int[] types) { + for (int type : types) { + mTransientBarTypes.remove(type); + } + } + + private void setFullscreen(boolean isFullscreen) { + mFullscreen = isFullscreen; + } + + private void setImmersive(boolean isImmersive) { + mImmersive = isImmersive; + } private int getDisabled1() { return mDisabled1; @@ -993,40 +999,10 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D mDisabled2 = disabled2; } - private void setFullscreen(boolean isFullscreen) { - mFullscreen = isFullscreen; - } - - private void setImmersive(boolean immersive) { - mImmersive = immersive; - } - private boolean disableEquals(int disabled1, int disabled2) { return mDisabled1 == disabled1 && mDisabled2 == disabled2; } - private void setSystemUiState(final int vis, final int fullscreenStackVis, - final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds, - final boolean navbarColorManagedByIme) { - mSystemUiVisibility = vis; - mFullscreenStackSysUiVisibility = fullscreenStackVis; - mDockedStackSysUiVisibility = dockedStackVis; - mFullscreenStackBounds.set(fullscreenBounds); - mDockedStackBounds.set(dockedBounds); - mNavbarColorManagedByIme = navbarColorManagedByIme; - } - - private boolean systemUiStateEquals(final int vis, final int fullscreenStackVis, - final int dockedStackVis, final Rect fullscreenBounds, final Rect dockedBounds, - final boolean navbarColorManagedByIme) { - return mSystemUiVisibility == vis - && mFullscreenStackSysUiVisibility == fullscreenStackVis - && mDockedStackSysUiVisibility == dockedStackVis - && mFullscreenStackBounds.equals(fullscreenBounds) - && mDockedStackBounds.equals(dockedBounds) - && mNavbarColorManagedByIme == navbarColorManagedByIme; - } - private void setImeWindowState(final int vis, final int backDisposition, final boolean showImeSwitcher, final IBinder token) { mImeWindowVis = vis; @@ -1084,13 +1060,16 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D // TODO(b/118592525): Currently, status bar only works on the default display. // Make it aware of multi-display if needed. final UiState state = mDisplayUiState.get(DEFAULT_DISPLAY); + final int[] transientBarTypes = new int[state.mTransientBarTypes.size()]; + for (int i = 0; i < transientBarTypes.length; i++) { + transientBarTypes[i] = state.mTransientBarTypes.valueAt(i); + } return new RegisterStatusBarResult(icons, gatherDisableActionsLocked(mCurrentUserId, 1), - state.mSystemUiVisibility, state.mImeWindowVis, + state.mAppearance, state.mAppearanceRegions, state.mImeWindowVis, state.mImeBackDisposition, state.mShowImeSwitcher, - gatherDisableActionsLocked(mCurrentUserId, 2), - state.mFullscreenStackSysUiVisibility, state.mDockedStackSysUiVisibility, - state.mImeToken, state.mFullscreenStackBounds, state.mDockedStackBounds, - state.mNavbarColorManagedByIme, state.mFullscreen, state.mImmersive); + gatherDisableActionsLocked(mCurrentUserId, 2), state.mImeToken, + state.mNavbarColorManagedByIme, state.mFullscreen, state.mImmersive, + transientBarTypes); } } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index 6e238b33d8dd6..fcfd9ded9ad71 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -144,13 +144,16 @@ import android.view.InputChannel; import android.view.InputDevice; import android.view.InputEvent; import android.view.InputEventReceiver; +import android.view.InsetsFlags; import android.view.InsetsState; +import android.view.InsetsState.InternalInsetType; import android.view.MotionEvent; import android.view.PointerIcon; import android.view.Surface; import android.view.View; import android.view.ViewRootImpl; import android.view.WindowInsets; +import android.view.WindowInsetsController.Appearance; import android.view.WindowManager; import android.view.WindowManager.LayoutParams; import android.view.WindowManagerGlobal; @@ -332,8 +335,6 @@ public class DisplayPolicy { private int mResettingSystemUiFlags = 0; // Bits that we are currently always keeping cleared. private int mForceClearedSystemUiFlags = 0; - private int mLastFullscreenStackSysUiFlags; - private int mLastDockedStackSysUiFlags; private int mLastAppearance; private int mLastFullscreenAppearance; private int mLastDockedAppearance; @@ -3172,11 +3173,6 @@ public class DisplayPolicy { &= ~PolicyControl.adjustClearableFlags(win, View.SYSTEM_UI_CLEARABLE_FLAGS); } - final int appearance = win.mAttrs.insetsFlags.appearance; - final int fullscreenVisibility = updateLightStatusBarLw(0 /* vis */, - mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState); - final int dockedVisibility = updateLightStatusBarLw(0 /* vis */, - mTopDockedOpaqueWindowState, mTopDockedOpaqueOrDimmingWindowState); final int fullscreenAppearance = updateLightStatusBarAppearanceLw(0 /* vis */, mTopFullscreenOpaqueWindowState, mTopFullscreenOpaqueOrDimmingWindowState); final int dockedAppearance = updateLightStatusBarAppearanceLw(0 /* vis */, @@ -3190,9 +3186,9 @@ public class DisplayPolicy { final Pair result = updateSystemBarsLw(win, mLastSystemUiFlags, tmpVisibility); final int visibility = result.first; + final int appearance = win.mAttrs.insetsFlags.appearance + | InsetsFlags.getAppearance(visibility); final int diff = visibility ^ mLastSystemUiFlags; - final int fullscreenDiff = fullscreenVisibility ^ mLastFullscreenStackSysUiFlags; - final int dockedDiff = dockedVisibility ^ mLastDockedStackSysUiFlags; final InsetsPolicy insetsPolicy = getInsetsPolicy(); final boolean isFullscreen = (visibility & (View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_HIDE_NAVIGATION)) != 0 @@ -3205,7 +3201,7 @@ public class DisplayPolicy { | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY)) != 0 || behavior == BEHAVIOR_SHOW_BARS_BY_SWIPE || behavior == BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE; - if (diff == 0 && fullscreenDiff == 0 && dockedDiff == 0 + if (diff == 0 && mLastAppearance == appearance && mLastFullscreenAppearance == fullscreenAppearance && mLastDockedAppearance == dockedAppearance @@ -3216,9 +3212,12 @@ public class DisplayPolicy { && mLastDockedStackBounds.equals(mDockedStackBounds)) { return 0; } + + // Obtains which types should show transient and which types should abort transient. + // If there is no transient state change, this pair will contain two empty arrays. + final Pair transientState = getTransientState(visibility, mLastSystemUiFlags); + mLastSystemUiFlags = visibility; - mLastFullscreenStackSysUiFlags = fullscreenVisibility; - mLastDockedStackSysUiFlags = dockedVisibility; mLastAppearance = appearance; mLastFullscreenAppearance = fullscreenAppearance; mLastDockedAppearance = dockedAppearance; @@ -3240,14 +3239,16 @@ public class DisplayPolicy { StatusBarManagerInternal statusBar = getStatusBarManagerInternal(); if (statusBar != null) { final int displayId = getDisplayId(); - // TODO(b/118118435): disabled flags only - statusBar.setSystemUiVisibility(displayId, visibility, fullscreenVisibility, - dockedVisibility, 0xffffffff, fullscreenStackBounds, - dockedStackBounds, isNavbarColorManagedByIme, win.toString()); - if (ViewRootImpl.sNewInsetsMode == NEW_INSETS_MODE_FULL) { - statusBar.onSystemBarAppearanceChanged(displayId, appearance, - appearanceRegions, isNavbarColorManagedByIme); + statusBar.setDisableFlags(displayId, visibility & StatusBarManager.DISABLE_MASK, + win.toString()); + if (transientState.first.length > 0) { + statusBar.showTransient(displayId, transientState.first); } + if (transientState.second.length > 0) { + statusBar.abortTransient(displayId, transientState.second); + } + statusBar.onSystemBarAppearanceChanged(displayId, appearance, + appearanceRegions, isNavbarColorManagedByIme); statusBar.topAppWindowChanged(displayId, isFullscreen, isImmersive); // TODO(b/118118435): Remove this after removing system UI visibilities. @@ -3258,23 +3259,28 @@ public class DisplayPolicy { return diff; } - private int updateLightStatusBarLw(int vis, WindowState opaque, WindowState opaqueOrDimming) { - final boolean onKeyguard = isStatusBarKeyguard() && !isKeyguardOccluded(); - final WindowState statusColorWin = onKeyguard ? mStatusBar : opaqueOrDimming; - if (statusColorWin != null && (statusColorWin == opaque || onKeyguard)) { - // If the top fullscreen-or-dimming window is also the top fullscreen, respect - // its light flag. - vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - vis |= PolicyControl.getSystemUiVisibility(statusColorWin, null) - & View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - } else if (statusColorWin != null && statusColorWin.isDimming()) { - // Otherwise if it's dimming, clear the light flag. - vis &= ~View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR; - } - return vis; + private static Pair getTransientState(int vis, int oldVis) { + final IntArray typesToShow = new IntArray(0); + final IntArray typesToAbort = new IntArray(0); + updateTransientState(vis, oldVis, View.STATUS_BAR_TRANSIENT, TYPE_TOP_BAR, typesToShow, + typesToAbort); + updateTransientState(vis, oldVis, View.NAVIGATION_BAR_TRANSIENT, + InsetsState.TYPE_NAVIGATION_BAR, typesToShow, typesToAbort); + return Pair.create(typesToShow.toArray(), typesToAbort.toArray()); } - private int updateLightStatusBarAppearanceLw(int appearance, WindowState opaque, + private static void updateTransientState(int vis, int oldVis, int transientFlag, + @InternalInsetType int type, IntArray typesToShow, IntArray typesToAbort) { + final boolean wasTransient = (oldVis & transientFlag) != 0; + final boolean isTransient = (vis & transientFlag) != 0; + if (!wasTransient && isTransient) { + typesToShow.add(type); + } else if (wasTransient && !isTransient) { + typesToAbort.add(type); + } + } + + private int updateLightStatusBarAppearanceLw(@Appearance int appearance, WindowState opaque, WindowState opaqueOrDimming) { final boolean onKeyguard = isStatusBarKeyguard() && !isKeyguardOccluded(); final WindowState statusColorWin = onKeyguard ? mStatusBar : opaqueOrDimming; @@ -3282,7 +3288,10 @@ public class DisplayPolicy { // If the top fullscreen-or-dimming window is also the top fullscreen, respect // its light flag. appearance &= ~APPEARANCE_LIGHT_TOP_BAR; - appearance |= statusColorWin.mAttrs.insetsFlags.appearance & APPEARANCE_LIGHT_TOP_BAR; + final int legacyAppearance = InsetsFlags.getAppearance( + PolicyControl.getSystemUiVisibility(statusColorWin, null)); + appearance |= (statusColorWin.mAttrs.insetsFlags.appearance | legacyAppearance) + & APPEARANCE_LIGHT_TOP_BAR; } else if (statusColorWin != null && statusColorWin.isDimming()) { // Otherwise if it's dimming, clear the light flag. appearance &= ~APPEARANCE_LIGHT_TOP_BAR; diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index 17e67ebf617fa..e5327fb84eedc 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -638,7 +638,7 @@ class WindowState extends WindowContainer implements WindowManagerP private boolean mIsDimming = false; private @Nullable InsetsSourceProvider mControllableInsetProvider; - private InsetsState mClientInsetsState = new InsetsState(); + private InsetsState mClientInsetsState; private static final float DEFAULT_DIM_AMOUNT_DEAD_WINDOW = 0.5f; private KeyInterceptionInfo mKeyInterceptionInfo; @@ -767,6 +767,8 @@ class WindowState extends WindowContainer implements WindowManagerP mSeq = seq; mPowerManagerWrapper = powerManagerWrapper; mForceSeamlesslyRotate = token.mRoundedCornerOverlay; + mClientInsetsState = + getDisplayContent().getInsetsStateController().getInsetsForDispatch(this); if (DEBUG) { Slog.v(TAG, "Window " + this + " client=" + c.asBinder() + " token=" + token + " (" + mAttrs.token + ")" + " params=" + a); diff --git a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java index 8c2ae5a7659a2..55947ae9626f3 100644 --- a/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java +++ b/services/tests/wmtests/src/com/android/server/wm/InsetsPolicyTest.java @@ -178,11 +178,14 @@ public class InsetsPolicyTest extends WindowTestsBase { @Test public void testShowTransientBars_topCanBeTransient_appGetsTopFakeControl() { + // Adding app window before setting source visibility is to prevent the visibility from + // being cleared by InsetsSourceProvider.updateVisibility. + final WindowState app = addWindow(TYPE_APPLICATION, "app"); + addWindow(TYPE_STATUS_BAR, "topBar") .getControllableInsetProvider().getSource().setVisible(false); addWindow(TYPE_NAVIGATION_BAR, "navBar") .getControllableInsetProvider().getSource().setVisible(true); - final WindowState app = addWindow(TYPE_APPLICATION, "app"); final InsetsPolicy policy = mDisplayContent.getInsetsPolicy(); policy.updateBarControlTarget(app);