From 217caf6028b51df92a8ecb6281c002826083e3db Mon Sep 17 00:00:00 2001 From: Robin Lee Date: Thu, 14 Apr 2022 19:06:05 +0200 Subject: [PATCH] Make CentralSurfaces optional CentralSurfaces will instacrash on TV devices if it doesn't haave all of its dependencies available. Since it is included by SystemUIBinder via CentralSurfacesModule, we need to remove SystemUIBinder from TV. When we do that, we find that BouncerSwipeTouchHandler has a hard dependency on phone.CentralSurfaces meaning that CentralSurfaces was not actually optional any more. So we need to convert the dependency there to Optional<>. In future the fact that TV does not have a CentralSurfaces should guarantee compile errors if this happens again and keep CentralSurfaces actually Optional as the javadocs say. We also need to remove a lot of phone-specific assumptions under the dreams/touch area, as the following classes remain present even after this change: - com.android.systemui.statusbar.phone.UnlockedScreenOffAnimationController - com.android.systemui.statusbar.phone.NotificationShadeWindowControllerImpl - com.android.systemui.statusbar.phone.ConfigurationControllerImpl - com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager - com.android.systemui.statusbar.phone.DozeParameters But that's a much larger task for another day. Bug: 228414760 Change-Id: Id0a5e35e113bb1d0268c7f687cbd54799a1d9b77 (cherry picked from commit 0c673b11488c1b96a0cbb374b8c569b2761bb228) Merged-In: Id0a5e35e113bb1d0268c7f687cbd54799a1d9b77 --- .../touch/BouncerSwipeTouchHandler.java | 27 +++++++++++++------ .../android/systemui/tv/TvSysUIComponent.java | 16 ++++++++--- .../touch/BouncerSwipeTouchHandlerTest.java | 4 ++- 3 files changed, 35 insertions(+), 12 deletions(-) diff --git a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java index 517fce1b16a69..56eb9d2ecdd57 100644 --- a/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java +++ b/packages/SystemUI/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandler.java @@ -42,6 +42,7 @@ import com.android.systemui.statusbar.phone.KeyguardBouncer; import com.android.systemui.statusbar.phone.StatusBarKeyguardViewManager; import com.android.wm.shell.animation.FlingAnimationUtils; +import java.util.Optional; import javax.inject.Inject; import javax.inject.Named; @@ -77,7 +78,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { private StatusBarKeyguardViewManager mStatusBarKeyguardViewManager; private float mCurrentExpansion; - private final CentralSurfaces mCentralSurfaces; + private final Optional mCentralSurfaces; private VelocityTracker mVelocityTracker; @@ -107,7 +108,9 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { // If the user scrolling favors a vertical direction, begin capturing // scrolls. mCapture = Math.abs(distanceY) > Math.abs(distanceX); - mBouncerInitiallyShowing = mCentralSurfaces.isBouncerShowing(); + mBouncerInitiallyShowing = mCentralSurfaces + .map(CentralSurfaces::isBouncerShowing) + .orElse(false); if (mCapture) { // Since the user is dragging the bouncer up, set scrimmed to false. @@ -129,13 +132,17 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { return true; } + if (!mCentralSurfaces.isPresent()) { + return true; + } + // For consistency, we adopt the expansion definition found in the // PanelViewController. In this case, expansion refers to the view above the // bouncer. As that view's expansion shrinks, the bouncer appears. The bouncer // is fully hidden at full expansion (1) and fully visible when fully collapsed // (0). final float screenTravelPercentage = Math.abs(e1.getY() - e2.getY()) - / mCentralSurfaces.getDisplayHeight(); + / mCentralSurfaces.get().getDisplayHeight(); setPanelExpansion(mBouncerInitiallyShowing ? screenTravelPercentage : 1 - screenTravelPercentage); return true; @@ -144,8 +151,8 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { private void setPanelExpansion(float expansion) { mCurrentExpansion = expansion; - mCentralSurfaces.setBouncerShowingOverDream( - mCurrentExpansion != KeyguardBouncer.EXPANSION_HIDDEN); + mCentralSurfaces.ifPresent(centralSurfaces -> centralSurfaces.setBouncerShowingOverDream( + mCurrentExpansion != KeyguardBouncer.EXPANSION_HIDDEN)); mStatusBarKeyguardViewManager.onPanelExpansionChanged(mCurrentExpansion, false, true); } @@ -173,7 +180,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { public BouncerSwipeTouchHandler( DisplayMetrics displayMetrics, StatusBarKeyguardViewManager statusBarKeyguardViewManager, - CentralSurfaces centralSurfaces, + Optional centralSurfaces, NotificationShadeWindowController notificationShadeWindowController, ValueAnimatorCreator valueAnimatorCreator, VelocityTrackerFactory velocityTrackerFactory, @@ -197,7 +204,7 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { @Override public void getTouchInitiationRegion(Region region) { - if (mCentralSurfaces.isBouncerShowing()) { + if (mCentralSurfaces.map(CentralSurfaces::isBouncerShowing).orElse(false)) { region.op(new Rect(0, 0, mDisplayMetrics.widthPixels, Math.round( mDisplayMetrics.heightPixels * mBouncerZoneScreenPercentage)), @@ -308,8 +315,12 @@ public class BouncerSwipeTouchHandler implements DreamTouchHandler { } protected void flingToExpansion(float velocity, float expansion) { + if (!mCentralSurfaces.isPresent()) { + return; + } + // The animation utils deal in pixel units, rather than expansion height. - final float viewHeight = mCentralSurfaces.getDisplayHeight(); + final float viewHeight = mCentralSurfaces.get().getDisplayHeight(); final float currentHeight = viewHeight * mCurrentExpansion; final float targetHeight = viewHeight * expansion; diff --git a/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java b/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java index 6fdce1ae4ec28..640adcc9dd946 100644 --- a/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java +++ b/packages/SystemUI/src/com/android/systemui/tv/TvSysUIComponent.java @@ -22,6 +22,12 @@ import com.android.systemui.dagger.SysUIComponent; import com.android.systemui.dagger.SysUISingleton; import com.android.systemui.dagger.SystemUIBinder; import com.android.systemui.dagger.SystemUIModule; +import com.android.systemui.statusbar.dagger.CentralSurfacesDependenciesModule; +import com.android.systemui.statusbar.notification.dagger.NotificationsModule; +import com.android.systemui.statusbar.notification.row.NotificationRowModule; + +import com.android.systemui.keyguard.dagger.KeyguardModule; +import com.android.systemui.recents.RecentsModule; import dagger.Subcomponent; @@ -30,13 +36,17 @@ import dagger.Subcomponent; */ @SysUISingleton @Subcomponent(modules = { + CentralSurfacesDependenciesModule.class, DefaultComponentBinder.class, DependencyProvider.class, - SystemUIBinder.class, + KeyguardModule.class, + NotificationRowModule.class, + NotificationsModule.class, + RecentsModule.class, SystemUIModule.class, + TvSystemUIBinder.class, TVSystemUICoreStartableModule.class, - TvSystemUIModule.class, - TvSystemUIBinder.class}) + TvSystemUIModule.class}) public interface TvSysUIComponent extends SysUIComponent { /** diff --git a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java index 535023fa08c54..ccbe6f7671007 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/dreams/touch/BouncerSwipeTouchHandlerTest.java @@ -57,6 +57,8 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; +import java.util.Optional; + @SmallTest @RunWith(AndroidTestingRunner.class) public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { @@ -110,7 +112,7 @@ public class BouncerSwipeTouchHandlerTest extends SysuiTestCase { mTouchHandler = new BouncerSwipeTouchHandler( mDisplayMetrics, mStatusBarKeyguardViewManager, - mCentralSurfaces, + Optional.of(mCentralSurfaces), mNotificationShadeWindowController, mValueAnimatorCreator, mVelocityTrackerFactory,