From ecd2b0c563cb5543d8a66daf1bf753c5363d6aa3 Mon Sep 17 00:00:00 2001 From: Tiger Huang Date: Thu, 8 Jul 2021 15:07:42 +0800 Subject: [PATCH] Send more system bar attributes to System UI for logging This CL sends the requested visibilities and the package name of the focused app to System UI for logging. Bug: 190543382 Test: atest RegisterStatusBarResultTest CommandQueueTest LightsOutNotifControllerTest Change-Id: I6b3ceed1efc3075bf0c93620fe753ef2a6f79809 --- .../internal/statusbar/IStatusBar.aidl | 8 +++-- .../statusbar/RegisterStatusBarResult.java | 19 +++++++----- .../RegisterStatusBarResultTest.java | 7 +++-- .../systemui/navigationbar/NavigationBar.java | 3 +- .../navigationbar/TaskbarDelegate.java | 3 +- .../systemui/statusbar/CommandQueue.java | 10 +++--- .../StatusBarStateControllerImpl.java | 31 ++++++++++++++++++- .../SysuiStatusBarStateController.java | 8 +++-- .../phone/LightsOutNotifController.java | 3 +- .../systemui/statusbar/phone/StatusBar.java | 9 ++++-- .../systemui/statusbar/CommandQueueTest.java | 12 ++++--- .../phone/LightsOutNotifControllerTest.java | 15 ++++++--- .../statusbar/StatusBarManagerInternal.java | 3 +- .../statusbar/StatusBarManagerService.java | 23 ++++++++------ .../com/android/server/wm/DisplayPolicy.java | 11 +++++-- .../com/android/server/wm/WindowState.java | 9 ++++++ 16 files changed, 126 insertions(+), 48 deletions(-) diff --git a/core/java/com/android/internal/statusbar/IStatusBar.aidl b/core/java/com/android/internal/statusbar/IStatusBar.aidl index 10f14b42ae427..4f940dbb1d7a1 100644 --- a/core/java/com/android/internal/statusbar/IStatusBar.aidl +++ b/core/java/com/android/internal/statusbar/IStatusBar.aidl @@ -25,6 +25,7 @@ import android.hardware.fingerprint.IUdfpsHbmListener; import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.service.notification.StatusBarNotification; +import android.view.InsetsState; import com.android.internal.statusbar.StatusBarIcon; import com.android.internal.view.AppearanceRegion; @@ -182,7 +183,7 @@ oneway interface IStatusBar /** * Notifies System UI side of system bar attribute change on the specified display. * - * @param displayId the ID of the display to notify + * @param displayId the ID of the display to notify. * @param appearance the appearance of the focused window. The light top bar appearance is not * controlled here, but primaryAppearance and secondaryAppearance. * @param appearanceRegions a set of appearances which will be only applied in their own bounds. @@ -191,11 +192,12 @@ oneway interface IStatusBar * stacks. * @param navbarColorManagedByIme {@code true} if navigation bar color is managed by IME. * @param behavior the behavior of the focused window. - * @param isFullscreen whether any of status or navigation bar is requested invisible. + * @param requestedState the collection of the requested visibilities of system insets. + * @param packageName the package name of the focused app. */ void onSystemBarAttributesChanged(int displayId, int appearance, in AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - int behavior, boolean isFullscreen); + int behavior, in InsetsState requestedVisibilities, String packageName); /** * Notifies System UI to show transient bars. The transient bars are system bars, e.g., status diff --git a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java index 8fb2f9cd8bf9d..2fd1691e5e02b 100644 --- a/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java +++ b/core/java/com/android/internal/statusbar/RegisterStatusBarResult.java @@ -21,6 +21,7 @@ import android.os.IBinder; import android.os.Parcel; import android.os.Parcelable; import android.util.ArrayMap; +import android.view.InsetsState; import com.android.internal.view.AppearanceRegion; @@ -39,14 +40,15 @@ public final class RegisterStatusBarResult implements Parcelable { public final IBinder mImeToken; public final boolean mNavbarColorManagedByIme; public final int mBehavior; - public final boolean mAppFullscreen; + public final InsetsState mRequestedState; + public final String mPackageName; public final int[] mTransientBarTypes; public RegisterStatusBarResult(ArrayMap icons, int disabledFlags1, int appearance, AppearanceRegion[] appearanceRegions, int imeWindowVis, int imeBackDisposition, boolean showImeSwitcher, int disabledFlags2, IBinder imeToken, - boolean navbarColorManagedByIme, int behavior, boolean appFullscreen, - @NonNull int[] transientBarTypes) { + boolean navbarColorManagedByIme, int behavior, InsetsState requestedState, + String packageName, @NonNull int[] transientBarTypes) { mIcons = new ArrayMap<>(icons); mDisabledFlags1 = disabledFlags1; mAppearance = appearance; @@ -58,7 +60,8 @@ public final class RegisterStatusBarResult implements Parcelable { mImeToken = imeToken; mNavbarColorManagedByIme = navbarColorManagedByIme; mBehavior = behavior; - mAppFullscreen = appFullscreen; + mRequestedState = requestedState; + mPackageName = packageName; mTransientBarTypes = transientBarTypes; } @@ -80,7 +83,8 @@ public final class RegisterStatusBarResult implements Parcelable { dest.writeStrongBinder(mImeToken); dest.writeBoolean(mNavbarColorManagedByIme); dest.writeInt(mBehavior); - dest.writeBoolean(mAppFullscreen); + dest.writeTypedObject(mRequestedState, 0); + dest.writeString(mPackageName); dest.writeIntArray(mTransientBarTypes); } @@ -104,12 +108,13 @@ public final class RegisterStatusBarResult implements Parcelable { final IBinder imeToken = source.readStrongBinder(); final boolean navbarColorManagedByIme = source.readBoolean(); final int behavior = source.readInt(); - final boolean appFullscreen = source.readBoolean(); + final InsetsState requestedState = source.readTypedObject(InsetsState.CREATOR); + final String packageName = source.readString(); final int[] transientBarTypes = source.createIntArray(); return new RegisterStatusBarResult(icons, disabledFlags1, appearance, appearanceRegions, imeWindowVis, imeBackDisposition, showImeSwitcher, disabledFlags2, imeToken, navbarColorManagedByIme, behavior, - appFullscreen, transientBarTypes); + requestedState, packageName, 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 272f2287dd6e2..7d4412c7087df 100644 --- a/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java +++ b/core/tests/coretests/src/com/android/internal/statusbar/RegisterStatusBarResultTest.java @@ -24,6 +24,7 @@ import android.os.Binder; import android.os.Parcel; import android.os.UserHandle; import android.util.ArrayMap; +import android.view.InsetsState; import androidx.test.ext.junit.runners.AndroidJUnit4; import androidx.test.filters.SmallTest; @@ -59,7 +60,8 @@ public class RegisterStatusBarResultTest { new Binder() /* imeToken */, true /* navbarColorManagedByIme */, BEHAVIOR_SHOW_TRANSIENT_BARS_BY_SWIPE, - true /* appFullscreen */, + new InsetsState() /* requestedState */, + "test" /* packageName */, new int[0] /* transientBarTypes */); final RegisterStatusBarResult copy = clone(original); @@ -79,7 +81,8 @@ public class RegisterStatusBarResultTest { assertThat(copy.mImeToken).isSameInstanceAs(original.mImeToken); assertThat(copy.mNavbarColorManagedByIme).isEqualTo(original.mNavbarColorManagedByIme); assertThat(copy.mBehavior).isEqualTo(original.mBehavior); - assertThat(copy.mAppFullscreen).isEqualTo(original.mAppFullscreen); + assertThat(copy.mRequestedState).isEqualTo(original.mRequestedState); + assertThat(copy.mPackageName).isEqualTo(original.mPackageName); assertThat(copy.mTransientBarTypes).isEqualTo(original.mTransientBarTypes); } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index 42ad115c51fdb..90afec6a24c1b 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -92,6 +92,7 @@ import android.view.Display; import android.view.Gravity; import android.view.HapticFeedbackConstants; import android.view.IWindowManager; +import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; import android.view.LayoutInflater; @@ -954,7 +955,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { if (displayId != mDisplayId) { return; } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java index 40afed30f4e22..1d44146902213 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/TaskbarDelegate.java @@ -26,6 +26,7 @@ import static com.android.systemui.shared.system.QuickStepContract.SYSUI_STATE_I import android.inputmethodservice.InputMethodService; import android.os.IBinder; +import android.view.InsetsState; import com.android.internal.view.AppearanceRegion; import com.android.systemui.model.SysUiState; @@ -108,7 +109,7 @@ public class TaskbarDelegate implements CommandQueue.Callbacks { @Override public void onSystemBarAttributesChanged(int displayId, int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, int behavior, - boolean isFullscreen) { + InsetsState requestedState, String packageName) { mOverviewProxyService.onSystemBarAttributesChanged(displayId, behavior); } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java index 8e52b0da54ef1..c7f8dcf87eff9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/CommandQueue.java @@ -50,6 +50,7 @@ import android.os.ParcelFileDescriptor; import android.util.Log; import android.util.Pair; import android.util.SparseArray; +import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -337,7 +338,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< */ default void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { } + @Behavior int behavior, InsetsState requestedState, String packageName) { } /** * @see IStatusBar#showTransient(int, int[]). @@ -996,7 +997,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { synchronized (mLock) { SomeArgs args = SomeArgs.obtain(); args.argi1 = displayId; @@ -1004,7 +1005,8 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< args.argi3 = navbarColorManagedByIme ? 1 : 0; args.arg1 = appearanceRegions; args.argi4 = behavior; - args.argi5 = isFullscreen ? 1 : 0; + args.arg2 = requestedState; + args.arg3 = packageName; mHandler.obtainMessage(MSG_SYSTEM_BAR_CHANGED, args).sendToTarget(); } } @@ -1387,7 +1389,7 @@ public class CommandQueue extends IStatusBar.Stub implements CallbackController< for (int i = 0; i < mCallbacks.size(); i++) { mCallbacks.get(i).onSystemBarAttributesChanged(args.argi1, args.argi2, (AppearanceRegion[]) args.arg1, args.argi3 == 1, args.argi4, - args.argi5 == 1); + (InsetsState) args.arg2, (String) args.arg3); } args.recycle(); break; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java index 0725bf961e137..d4f5bd241c6b2 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/StatusBarStateControllerImpl.java @@ -16,6 +16,10 @@ package com.android.systemui.statusbar; +import static android.view.InsetsState.ITYPE_NAVIGATION_BAR; +import static android.view.InsetsState.ITYPE_STATUS_BAR; +import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; + import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_TRANSITION_FROM_AOD; import static com.android.internal.jank.InteractionJankMonitor.CUJ_LOCKSCREEN_TRANSITION_TO_AOD; @@ -23,10 +27,16 @@ import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.animation.ObjectAnimator; import android.animation.ValueAnimator; +import android.os.SystemProperties; import android.text.format.DateFormat; import android.util.FloatProperty; import android.util.Log; +import android.view.InsetsFlags; +import android.view.InsetsState; import android.view.View; +import android.view.ViewDebug; +import android.view.WindowInsetsController.Appearance; +import android.view.WindowInsetsController.Behavior; import android.view.animation.Interpolator; import androidx.annotation.NonNull; @@ -56,6 +66,9 @@ import javax.inject.Inject; public class StatusBarStateControllerImpl implements SysuiStatusBarStateController, CallbackController, Dumpable { private static final String TAG = "SbStateController"; + private static final boolean DEBUG_IMMERSIVE_APPS = + SystemProperties.getBoolean("persist.debug.immersive_apps", false); + // Must be a power of 2 private static final int HISTORY_SIZE = 32; @@ -420,7 +433,10 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll } @Override - public void setFullscreenState(boolean isFullscreen) { + public void setSystemBarAttributes(@Appearance int appearance, @Behavior int behavior, + InsetsState requestedState, String packageName) { + boolean isFullscreen = !requestedState.getSourceOrDefaultVisibility(ITYPE_STATUS_BAR) + || !requestedState.getSourceOrDefaultVisibility(ITYPE_NAVIGATION_BAR); if (mIsFullscreen != isFullscreen) { mIsFullscreen = isFullscreen; synchronized (mListeners) { @@ -429,6 +445,19 @@ public class StatusBarStateControllerImpl implements SysuiStatusBarStateControll } } } + + // TODO (b/190543382): Finish the logging logic. + // This section can be removed if we don't need to print it on logcat. + if (DEBUG_IMMERSIVE_APPS) { + boolean dim = (appearance & APPEARANCE_LOW_PROFILE_BARS) != 0; + String behaviorName = ViewDebug.flagsToString(InsetsFlags.class, "behavior", behavior); + String requestedVisibilityString = requestedState.toSourceVisibilityString(); + if (requestedVisibilityString.isEmpty()) { + requestedVisibilityString = "none"; + } + Log.d(TAG, packageName + " dim=" + dim + " behavior=" + behaviorName + + " requested visibilities: " + requestedVisibilityString); + } } @Override diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java index 25200501a9165..0bbae2aa2955e 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/SysuiStatusBarStateController.java @@ -19,7 +19,10 @@ package com.android.systemui.statusbar; import static java.lang.annotation.RetentionPolicy.SOURCE; import android.annotation.IntDef; +import android.view.InsetsState; import android.view.View; +import android.view.WindowInsetsController.Appearance; +import android.view.WindowInsetsController.Behavior; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.phone.StatusBar; @@ -155,9 +158,10 @@ public interface SysuiStatusBarStateController extends StatusBarStateController boolean isKeyguardRequested(); /** - * Set the fullscreen state + * Set the system bar attributes */ - void setFullscreenState(boolean isFullscreen); + void setSystemBarAttributes(@Appearance int appearance, @Behavior int behavior, + InsetsState requestedState, String packageName); /** * Set pulsing diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java index 7d134057ee760..c213707a8953f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/LightsOutNotifController.java @@ -21,6 +21,7 @@ import static android.view.WindowInsetsController.APPEARANCE_LOW_PROFILE_BARS; import android.animation.Animator; import android.animation.AnimatorListenerAdapter; import android.annotation.Nullable; +import android.view.InsetsState; import android.view.View; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -149,7 +150,7 @@ public class LightsOutNotifController { @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { if (displayId != mDisplayId) { return; } 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 89711fa6b11e6..d2a1750425689 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -104,6 +104,7 @@ import android.util.Slog; import android.view.Display; import android.view.IRemoteAnimationRunner; import android.view.IWindowManager; +import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.KeyEvent; import android.view.MotionEvent; @@ -984,7 +985,8 @@ public class StatusBar extends SystemUI implements DemoMode, showTransientUnchecked(); } onSystemBarAttributesChanged(mDisplayId, result.mAppearance, result.mAppearanceRegions, - result.mNavbarColorManagedByIme, result.mBehavior, result.mAppFullscreen); + result.mNavbarColorManagedByIme, result.mBehavior, result.mRequestedState, + result.mPackageName); // StatusBarManagerService has a back up of IME token and it's restored here. setImeWindowStatus(mDisplayId, result.mImeToken, result.mImeWindowVis, @@ -2477,7 +2479,7 @@ public class StatusBar extends SystemUI implements DemoMode, @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { if (displayId != mDisplayId) { return; } @@ -2490,7 +2492,8 @@ public class StatusBar extends SystemUI implements DemoMode, mStatusBarMode, navbarColorManagedByIme); updateBubblesVisibility(); - mStatusBarStateController.setFullscreenState(isFullscreen); + mStatusBarStateController.setSystemBarAttributes( + appearance, behavior, requestedState, packageName); } @Override diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java index 21c6292c151fc..d5a2919880ef3 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/CommandQueueTest.java @@ -33,6 +33,7 @@ import android.hardware.biometrics.IBiometricSysuiReceiver; import android.hardware.biometrics.PromptInfo; import android.hardware.fingerprint.IUdfpsHbmListener; import android.os.Bundle; +import android.view.InsetsState; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -124,24 +125,25 @@ public class CommandQueueTest extends SysuiTestCase { public void testOnSystemBarAttributesChanged() { doTestOnSystemBarAttributesChanged(DEFAULT_DISPLAY, 1, new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false, - BEHAVIOR_DEFAULT, false); + BEHAVIOR_DEFAULT, new InsetsState(), "test"); } @Test public void testOnSystemBarAttributesChangedForSecondaryDisplay() { doTestOnSystemBarAttributesChanged(SECONDARY_DISPLAY, 1, new AppearanceRegion[]{new AppearanceRegion(2, new Rect())}, false, - BEHAVIOR_DEFAULT, false); + BEHAVIOR_DEFAULT, new InsetsState(), "test"); } private void doTestOnSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { mCommandQueue.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, - navbarColorManagedByIme, behavior, isFullscreen); + navbarColorManagedByIme, behavior, requestedState, packageName); waitForIdleSync(); verify(mCallbacks).onSystemBarAttributesChanged(eq(displayId), eq(appearance), - eq(appearanceRegions), eq(navbarColorManagedByIme), eq(behavior), eq(isFullscreen)); + eq(appearanceRegions), eq(navbarColorManagedByIme), eq(behavior), + eq(requestedState), eq(packageName)); } @Test diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java index cdfab1eec609b..c3adee95df208 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/LightsOutNotifControllerTest.java @@ -102,7 +102,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { null /* appearanceRegions */, false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, - false /* isFullscreen */); + null /* requestedState */, + null /* packageName */); assertTrue(mLightsOutNotifController.areLightsOut()); } @@ -114,7 +115,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { null /* appearanceRegions */, false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, - false /* isFullscreen */); + null /* requestedState */, + null /* packageName */); assertFalse(mLightsOutNotifController.areLightsOut()); } @@ -144,7 +146,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { null /* appearanceRegions */, false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, - false /* isFullscreen */); + null /* requestedState */, + null /* packageName */); // THEN we should show dot assertTrue(mLightsOutNotifController.shouldShowDot()); @@ -163,7 +166,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { null /* appearanceRegions */, false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, - false /* isFullscreen */); + null /* requestedState */, + null /* packageName */); // THEN we shouldn't show the dot assertFalse(mLightsOutNotifController.shouldShowDot()); @@ -182,7 +186,8 @@ public class LightsOutNotifControllerTest extends SysuiTestCase { null /* appearanceRegions */, false /* navbarColorManagedByIme */, BEHAVIOR_DEFAULT, - false /* isFullscreen */); + null /* requestedState */, + null /* packageName */); // THEN we shouldn't show the dot assertFalse(mLightsOutNotifController.shouldShowDot()); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java index a436e6b3787bd..d95e826339a1e 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerInternal.java @@ -22,6 +22,7 @@ import android.hardware.fingerprint.IUdfpsHbmListener; import android.os.Bundle; import android.os.IBinder; import android.os.ParcelFileDescriptor; +import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -132,7 +133,7 @@ public interface StatusBarManagerInternal { /** @see com.android.internal.statusbar.IStatusBar#onSystemBarAttributesChanged */ void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen); + @Behavior int behavior, InsetsState requestedState, String packageName); /** @see com.android.internal.statusbar.IStatusBar#showTransient */ void showTransient(int displayId, @InternalInsetsType int[] types); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index 6255d77dc7cd6..dbc942f4a577f 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -59,6 +59,7 @@ import android.util.ArraySet; import android.util.Pair; import android.util.Slog; import android.util.SparseArray; +import android.view.InsetsState; import android.view.InsetsState.InternalInsetsType; import android.view.WindowInsetsController.Appearance; import android.view.WindowInsetsController.Behavior; @@ -526,13 +527,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D @Override public void onSystemBarAttributesChanged(int displayId, @Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { getUiState(displayId).setBarAttributes(appearance, appearanceRegions, - navbarColorManagedByIme, behavior, isFullscreen); + navbarColorManagedByIme, behavior, requestedState, packageName); if (mBar != null) { try { mBar.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, - navbarColorManagedByIme, behavior, isFullscreen); + navbarColorManagedByIme, behavior, requestedState, packageName); } catch (RemoteException ex) { } } } @@ -1111,13 +1112,14 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D return state; } - private class UiState { + private static class UiState { private @Appearance int mAppearance = 0; private AppearanceRegion[] mAppearanceRegions = new AppearanceRegion[0]; - private ArraySet mTransientBarTypes = new ArraySet<>(); + private final ArraySet mTransientBarTypes = new ArraySet<>(); private boolean mNavbarColorManagedByIme = false; private @Behavior int mBehavior; - private boolean mFullscreen = false; + private InsetsState mRequestedState = new InsetsState(); + private String mPackageName = "none"; private int mDisabled1 = 0; private int mDisabled2 = 0; private int mImeWindowVis = 0; @@ -1127,12 +1129,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D private void setBarAttributes(@Appearance int appearance, AppearanceRegion[] appearanceRegions, boolean navbarColorManagedByIme, - @Behavior int behavior, boolean isFullscreen) { + @Behavior int behavior, InsetsState requestedState, String packageName) { mAppearance = appearance; mAppearanceRegions = appearanceRegions; mNavbarColorManagedByIme = navbarColorManagedByIme; mBehavior = behavior; - mFullscreen = isFullscreen; + mRequestedState = requestedState; + mPackageName = packageName; } private void showTransient(@InternalInsetsType int[] types) { @@ -1229,8 +1232,8 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D state.mAppearance, state.mAppearanceRegions, state.mImeWindowVis, state.mImeBackDisposition, state.mShowImeSwitcher, gatherDisableActionsLocked(mCurrentUserId, 2), state.mImeToken, - state.mNavbarColorManagedByIme, state.mBehavior, state.mFullscreen, - transientBarTypes); + state.mNavbarColorManagedByIme, state.mBehavior, state.mRequestedState, + state.mPackageName, transientBarTypes); } } diff --git a/services/core/java/com/android/server/wm/DisplayPolicy.java b/services/core/java/com/android/server/wm/DisplayPolicy.java index e5ea69866d10d..d5a4345cb0734 100644 --- a/services/core/java/com/android/server/wm/DisplayPolicy.java +++ b/services/core/java/com/android/server/wm/DisplayPolicy.java @@ -175,6 +175,7 @@ import com.android.server.wallpaper.WallpaperManagerInternal; import com.android.server.wm.InputMonitor.EventReceiverInputConsumer; import java.io.PrintWriter; +import java.util.Objects; import java.util.function.Consumer; /** @@ -322,17 +323,19 @@ public class DisplayPolicy { // needs to be opaque. private WindowState mNavBarBackgroundWindow; + private String mFocusedApp; private int mLastDisableFlags; private int mLastAppearance; private int mLastFullscreenAppearance; private int mLastDockedAppearance; private int mLastBehavior; + private final InsetsState mRequestedState = new InsetsState(); private final Rect mNonDockedRootTaskBounds = new Rect(); private final Rect mDockedRootTaskBounds = new Rect(); private final Rect mLastNonDockedRootTaskBounds = new Rect(); private final Rect mLastDockedRootTaskBounds = new Rect(); - // What we last reported to system UI about whether the focused window is fullscreen/immersive. + // What we last reported to input dispatcher about whether the focused window is fullscreen. private boolean mLastFocusIsFullscreen = false; // If nonzero, a panic gesture was performed at that time in uptime millis and is still pending. @@ -2683,6 +2686,8 @@ public class DisplayPolicy { && mLastFullscreenAppearance == fullscreenAppearance && mLastDockedAppearance == dockedAppearance && mLastBehavior == behavior + && mRequestedState.equals(win.getRequestedState()) + && Objects.equals(mFocusedApp, win.mAttrs.packageName) && mLastFocusIsFullscreen == isFullscreen && mLastNonDockedRootTaskBounds.equals(mNonDockedRootTaskBounds) && mLastDockedRootTaskBounds.equals(mDockedRootTaskBounds)) { @@ -2698,6 +2703,8 @@ public class DisplayPolicy { mLastFullscreenAppearance = fullscreenAppearance; mLastDockedAppearance = dockedAppearance; mLastBehavior = behavior; + mRequestedState.set(win.getRequestedState(), true /* copySources */); + mFocusedApp = win.mAttrs.packageName; mLastFocusIsFullscreen = isFullscreen; mLastNonDockedRootTaskBounds.set(mNonDockedRootTaskBounds); mLastDockedRootTaskBounds.set(mDockedRootTaskBounds); @@ -2716,7 +2723,7 @@ public class DisplayPolicy { final int displayId = getDisplayId(); statusBar.setDisableFlags(displayId, disableFlags, cause); statusBar.onSystemBarAttributesChanged(displayId, appearance, appearanceRegions, - isNavbarColorManagedByIme, behavior, isFullscreen); + isNavbarColorManagedByIme, behavior, mRequestedState, mFocusedApp); } }); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index ee8426eb9d25c..25bdb24d53696 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -874,6 +874,15 @@ class WindowState extends WindowContainer implements WindowManagerP return mRequestedInsetsState.getSourceOrDefaultVisibility(type); } + /** + * Returns all the requested visibilities. + * + * @return an {@link InsetsState} as the requested visibilities. + */ + InsetsState getRequestedState() { + return mRequestedInsetsState; + } + /** * @see #getRequestedVisibility(int) */