diff options
| author | 2021-06-28 09:27:29 -0700 | |
|---|---|---|
| committer | 2021-06-28 10:58:27 -0700 | |
| commit | bf8b03d3b9090ad90c34fc0d34de48ebc2977dfc (patch) | |
| tree | c9ad07bdb110cff6ac32f943dc82540745f90973 | |
| parent | 598f0602e2a2835b5da703567137f822459ec246 (diff) | |
Pause region sampling while blurring the shade
Interactions between the shade client composition and region sampling
may cause missed frames.
Bug: 191969790
Test: manual
Test: atest NavigationBarTest
Test: atest NavigationBarControllerTest
Change-Id: I975fc0d008cfdbe76f85c08c42d981491613af47
8 files changed, 59 insertions, 0 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java index d85c9a718871..c97a30e6e13e 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/DependencyProvider.java @@ -77,6 +77,7 @@ import com.android.systemui.shared.system.TaskStackChangeListeners; import com.android.systemui.shared.system.WindowManagerWrapper; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.phone.AutoHideController; import com.android.systemui.statusbar.phone.ConfigurationControllerImpl; import com.android.systemui.statusbar.phone.ShadeController; @@ -227,6 +228,7 @@ public class DependencyProvider { Lazy<StatusBar> statusBarLazy, ShadeController shadeController, NotificationRemoteInputManager notificationRemoteInputManager, + NotificationShadeDepthController notificationShadeDepthController, SystemActions systemActions, @Main Handler mainHandler, UiEventLogger uiEventLogger, @@ -253,6 +255,7 @@ public class DependencyProvider { statusBarLazy, shadeController, notificationRemoteInputManager, + notificationShadeDepthController, systemActions, mainHandler, uiEventLogger, diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java index c6d7e7c46abb..e16f7e5a63ee 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBar.java @@ -136,6 +136,7 @@ import com.android.systemui.statusbar.AutoHideUiElement; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.NotificationRemoteInputManager; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.notification.stack.StackStateAnimator; import com.android.systemui.statusbar.phone.AutoHideController; @@ -201,6 +202,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, private final NavigationBarOverlayController mNavbarOverlayController; private final UiEventLogger mUiEventLogger; private final UserTracker mUserTracker; + private final NotificationShadeDepthController mNotificationShadeDepthController; private Bundle mSavedState; private NavigationBarView mNavigationBarView; @@ -439,6 +441,25 @@ public class NavigationBar implements View.OnAttachStateChangeListener, } }; + private final NotificationShadeDepthController.DepthListener mDepthListener = + new NotificationShadeDepthController.DepthListener() { + boolean mHasBlurs; + + @Override + public void onWallpaperZoomOutChanged(float zoomOut) { + } + + @Override + public void onBlurRadiusChanged(int radius) { + boolean hasBlurs = radius != 0; + if (hasBlurs == mHasBlurs) { + return; + } + mHasBlurs = hasBlurs; + mNavigationBarView.setWindowHasBlurs(hasBlurs); + } + }; + public NavigationBar(Context context, WindowManager windowManager, Lazy<AssistManager> assistManagerLazy, @@ -458,6 +479,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, Optional<Recents> recentsOptional, Lazy<StatusBar> statusBarLazy, ShadeController shadeController, NotificationRemoteInputManager notificationRemoteInputManager, + NotificationShadeDepthController notificationShadeDepthController, SystemActions systemActions, @Main Handler mainHandler, NavigationBarOverlayController navbarOverlayController, @@ -488,6 +510,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mNavbarOverlayController = navbarOverlayController; mUiEventLogger = uiEventLogger; mUserTracker = userTracker; + mNotificationShadeDepthController = notificationShadeDepthController; mNavBarMode = mNavigationModeController.addListener(this); mAccessibilityButtonModeObserver.addListener(this); @@ -572,6 +595,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mIsCurrentUserSetup = mDeviceProvisionedController.isCurrentUserSetup(); mDeviceProvisionedController.addCallback(mUserSetupListener); + mNotificationShadeDepthController.addListener(mDepthListener); setAccessibilityFloatingMenuModeIfNeeded(); @@ -588,6 +612,7 @@ public class NavigationBar implements View.OnAttachStateChangeListener, mAccessibilityManagerWrapper.removeCallback(mAccessibilityListener); mContentResolver.unregisterContentObserver(mAssistContentObserver); mDeviceProvisionedController.removeCallback(mUserSetupListener); + mNotificationShadeDepthController.removeListener(mDepthListener); DeviceConfig.removeOnPropertiesChangedListener(mOnPropertiesChangedListener); } diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java index 53592101c3ea..b9e9240b354a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarController.java @@ -61,6 +61,7 @@ import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.CommandQueue.Callbacks; import com.android.systemui.statusbar.NotificationRemoteInputManager; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.phone.BarTransitions.TransitionMode; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; @@ -115,6 +116,7 @@ public class NavigationBarController implements Callbacks, private final DisplayManager mDisplayManager; private final NavigationBarOverlayController mNavBarOverlayController; private final TaskbarDelegate mTaskbarDelegate; + private final NotificationShadeDepthController mNotificationShadeDepthController; private int mNavMode; private boolean mIsTablet; private final UserTracker mUserTracker; @@ -149,6 +151,7 @@ public class NavigationBarController implements Callbacks, Lazy<StatusBar> statusBarLazy, ShadeController shadeController, NotificationRemoteInputManager notificationRemoteInputManager, + NotificationShadeDepthController notificationShadeDepthController, SystemActions systemActions, @Main Handler mainHandler, UiEventLogger uiEventLogger, @@ -175,6 +178,7 @@ public class NavigationBarController implements Callbacks, mStatusBarLazy = statusBarLazy; mShadeController = shadeController; mNotificationRemoteInputManager = notificationRemoteInputManager; + mNotificationShadeDepthController = notificationShadeDepthController; mSystemActions = systemActions; mUiEventLogger = uiEventLogger; mHandler = mainHandler; @@ -362,6 +366,7 @@ public class NavigationBarController implements Callbacks, mStatusBarLazy, mShadeController, mNotificationRemoteInputManager, + mNotificationShadeDepthController, mSystemActions, mHandler, mNavBarOverlayController, diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java index 7af4853dd3f2..4816f1cf8d6a 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/NavigationBarView.java @@ -413,6 +413,13 @@ public class NavigationBarView extends FrameLayout implements return super.onTouchEvent(event); } + /** + * If we're blurring the shade window. + */ + public void setWindowHasBlurs(boolean hasBlurs) { + mRegionSamplingHelper.setWindowHasBlurs(hasBlurs); + } + void onTransientStateChanged(boolean isTransient) { mEdgeBackGestureHandler.onNavBarTransientStateChanged(isTransient); diff --git a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/RegionSamplingHelper.java b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/RegionSamplingHelper.java index 70117eb6d2f0..560d89af8e92 100644 --- a/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/RegionSamplingHelper.java +++ b/packages/SystemUI/src/com/android/systemui/navigationbar/gestural/RegionSamplingHelper.java @@ -65,6 +65,7 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, private final float mLuminanceChangeThreshold; private boolean mFirstSamplingAfterStart; private boolean mWindowVisible; + private boolean mWindowHasBlurs; private SurfaceControl mRegisteredStopLayer = null; private ViewTreeObserver.OnDrawListener mUpdateOnDraw = new ViewTreeObserver.OnDrawListener() { @Override @@ -153,6 +154,7 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, boolean isSamplingEnabled = mSamplingEnabled && !mSamplingRequestBounds.isEmpty() && mWindowVisible + && !mWindowHasBlurs && (mSampledView.isAttachedToWindow() || mFirstSamplingAfterStart); if (isSamplingEnabled) { ViewRootImpl viewRootImpl = mSampledView.getViewRootImpl(); @@ -225,6 +227,14 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, updateSamplingListener(); } + /** + * If we're blurring the shade window. + */ + public void setWindowHasBlurs(boolean hasBlurs) { + mWindowHasBlurs = hasBlurs; + updateSamplingListener(); + } + public void dump(PrintWriter pw) { pw.println("RegionSamplingHelper:"); pw.println(" sampleView isAttached: " + mSampledView.isAttachedToWindow()); @@ -238,6 +248,7 @@ public class RegionSamplingHelper implements View.OnAttachStateChangeListener, pw.println(" mLastMedianLuma: " + mLastMedianLuma); pw.println(" mCurrentMedianLuma: " + mCurrentMedianLuma); pw.println(" mWindowVisible: " + mWindowVisible); + pw.println(" mWindowHasBlurs: " + mWindowHasBlurs); pw.println(" mWaitingOnDraw: " + mWaitingOnDraw); pw.println(" mRegisteredStopLayer: " + mRegisteredStopLayer); pw.println(" mIsDestroyed: " + mIsDestroyed); diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt index f03a9a8f3589..595cf8065878 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/NotificationShadeDepthController.kt @@ -216,6 +216,7 @@ class NotificationShadeDepthController @Inject constructor( } listeners.forEach { it.onWallpaperZoomOutChanged(zoomOut) + it.onBlurRadiusChanged(blur) } notificationShadeWindowController.setBackgroundBlurRadius(blur) } @@ -525,5 +526,8 @@ class NotificationShadeDepthController @Inject constructor( * Current wallpaper zoom out, where 0 is the closest, and 1 the farthest */ fun onWallpaperZoomOutChanged(zoomOut: Float) + + @JvmDefault + fun onBlurRadiusChanged(blurRadius: Int) {} } } diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java index 4980f7406cee..d2527c679a13 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarControllerTest.java @@ -55,6 +55,7 @@ import com.android.systemui.recents.Recents; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; @@ -105,6 +106,7 @@ public class NavigationBarControllerTest extends SysuiTestCase { () -> mock(StatusBar.class), mock(ShadeController.class), mock(NotificationRemoteInputManager.class), + mock(NotificationShadeDepthController.class), mock(SystemActions.class), Dependency.get(Dependency.MAIN_HANDLER), mock(UiEventLogger.class), diff --git a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java index b1afeecf39f1..a570675b442e 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/navigationbar/NavigationBarTest.java @@ -79,6 +79,7 @@ import com.android.systemui.recents.Recents; import com.android.systemui.settings.UserTracker; import com.android.systemui.statusbar.CommandQueue; import com.android.systemui.statusbar.NotificationRemoteInputManager; +import com.android.systemui.statusbar.NotificationShadeDepthController; import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.policy.AccessibilityManagerWrapper; @@ -274,6 +275,7 @@ public class NavigationBarTest extends SysuiTestCase { () -> mock(StatusBar.class), mock(ShadeController.class), mock(NotificationRemoteInputManager.class), + mock(NotificationShadeDepthController.class), mock(SystemActions.class), mHandler, mock(NavigationBarOverlayController.class), |