diff --git a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java index fd3fcdd1d58a0..12786f278a164 100644 --- a/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java +++ b/packages/SystemUI/src/com/android/systemui/dagger/SystemUIModule.java @@ -66,7 +66,6 @@ import com.android.systemui.statusbar.notification.row.dagger.NotificationShelfC import com.android.systemui.statusbar.phone.ShadeController; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.dagger.StatusBarComponent; -import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent; import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.statusbar.policy.HeadsUpManager; import com.android.systemui.statusbar.policy.ZenModeController; @@ -125,7 +124,6 @@ import dagger.Provides; }, subcomponents = { StatusBarComponent.class, - StatusBarFragmentComponent.class, NotificationRowComponent.class, DozeComponent.class, ExpandableNotificationRowComponent.class, diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java index 927b4c8cc919c..0664900e25389 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/HeadsUpAppearanceController.java @@ -24,6 +24,7 @@ import com.android.internal.annotations.VisibleForTesting; import com.android.internal.widget.ViewClippingUtil; import com.android.systemui.Dependency; import com.android.systemui.R; +import com.android.systemui.dagger.qualifiers.RootView; import com.android.systemui.plugins.DarkIconDispatcher; import com.android.systemui.plugins.statusbar.StatusBarStateController; import com.android.systemui.statusbar.CommandQueue; @@ -35,15 +36,19 @@ import com.android.systemui.statusbar.notification.NotificationWakeUpCoordinator import com.android.systemui.statusbar.notification.collection.NotificationEntry; import com.android.systemui.statusbar.notification.row.ExpandableNotificationRow; import com.android.systemui.statusbar.notification.stack.NotificationStackScrollLayoutController; +import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentScope; import com.android.systemui.statusbar.policy.KeyguardStateController; import com.android.systemui.statusbar.policy.OnHeadsUpChangedListener; import java.util.function.BiConsumer; import java.util.function.Consumer; +import javax.inject.Inject; + /** * Controls the appearance of heads up notifications in the icon area and the header itself. */ +@StatusBarFragmentScope public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, DarkIconDispatcher.DarkReceiver, NotificationWakeUpCoordinator.WakeUpListener { public static final int CONTENT_FADE_DURATION = 110; @@ -83,7 +88,7 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, Point mPoint; private KeyguardStateController mKeyguardStateController; - + @Inject public HeadsUpAppearanceController( NotificationIconAreaController notificationIconAreaController, HeadsUpManagerPhone headsUpManager, @@ -92,11 +97,15 @@ public class HeadsUpAppearanceController implements OnHeadsUpChangedListener, KeyguardBypassController keyguardBypassController, KeyguardStateController keyguardStateController, NotificationWakeUpCoordinator wakeUpCoordinator, CommandQueue commandQueue, - NotificationPanelViewController notificationPanelViewController, View statusBarView) { + NotificationPanelViewController notificationPanelViewController, + @RootView PhoneStatusBarView statusBarView) { this(notificationIconAreaController, headsUpManager, statusBarStateController, keyguardBypassController, wakeUpCoordinator, keyguardStateController, commandQueue, notificationStackScrollLayoutController, notificationPanelViewController, + // TODO(b/205609837): We should have the StatusBarFragmentComponent provide these + // four views, and then we can delete this constructor and just use the one below + // (which also removes the undesirable @VisibleForTesting). statusBarView.findViewById(R.id.heads_up_status_bar_view), statusBarView.findViewById(R.id.clock), statusBarView.findViewById(R.id.operator_name_frame), 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 0f55f289ff279..c4ef2221602b3 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/StatusBar.java @@ -1167,16 +1167,16 @@ public class StatusBar extends SystemUI implements HeadsUpAppearanceController oldController = mHeadsUpAppearanceController; if (mHeadsUpAppearanceController != null) { // This view is being recreated, let's destroy the old one + // TODO(b/205609837): Automatically destroy the old controller so that this + // class doesn't need to hold a reference to the old one. mHeadsUpAppearanceController.destroy(); } // TODO (b/136993073) Separate notification shade and status bar // TODO(b/205609837): Migrate this to StatusBarFragmentComponent. - mHeadsUpAppearanceController = new HeadsUpAppearanceController( - mNotificationIconAreaController, mHeadsUpManager, - mStackScrollerController, - mStatusBarStateController, mKeyguardBypassController, - mKeyguardStateController, mWakeUpCoordinator, mCommandQueue, - mNotificationPanelViewController, mStatusBarView); + mHeadsUpAppearanceController = + statusBarFragmentComponent.getHeadsUpAppearanceController(); + // TODO(b/205609837): Delete this readFrom method so that this class doesn't + // need to hold a reference to the old controller. mHeadsUpAppearanceController.readFrom(oldController); mLightsOutNotifController.setLightsOutNotifView( @@ -1904,10 +1904,6 @@ public class StatusBar extends SystemUI implements mScrimController.setKeyguardOccluded(occluded); } - public boolean headsUpShouldBeVisible() { - return mHeadsUpAppearanceController.shouldBeVisible(); - } - /** A launch animation was cancelled. */ //TODO: These can / should probably be moved to NotificationPresenter or ShadeController public void onLaunchAnimationCancelled(boolean isLaunchForActivity) { diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java index 76176df136b50..32f3ba4a6f5b0 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/dagger/StatusBarViewModule.java @@ -68,7 +68,7 @@ import dagger.Lazy; import dagger.Module; import dagger.Provides; -@Module +@Module(subcomponents = StatusBarFragmentComponent.class) public abstract class StatusBarViewModule { public static final String SPLIT_SHADE_HEADER = "split_shade_header"; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java index b32acce51e849..d4d890773927a 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragment.java @@ -329,8 +329,8 @@ public class CollapsedStatusBarFragment extends Fragment implements CommandQueue } protected int adjustDisableFlags(int state) { - boolean headsUpVisible = mStatusBarOptionalLazy.get() - .map(StatusBar::headsUpShouldBeVisible).orElse(false); + boolean headsUpVisible = + mStatusBarFragmentComponent.getHeadsUpAppearanceController().shouldBeVisible(); if (headsUpVisible) { state |= DISABLE_CLOCK; } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java index 47c1875407409..6e31192af39c1 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/fragment/dagger/StatusBarFragmentComponent.java @@ -18,6 +18,7 @@ package com.android.systemui.statusbar.phone.fragment.dagger; import com.android.systemui.battery.BatteryMeterViewController; import com.android.systemui.dagger.qualifiers.RootView; +import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.PhoneStatusBarView; import com.android.systemui.statusbar.phone.fragment.CollapsedStatusBarFragment; @@ -66,4 +67,8 @@ public interface StatusBarFragmentComponent { @StatusBarFragmentScope @RootView PhoneStatusBarView getPhoneStatusBarView(); + + /** */ + @StatusBarFragmentScope + HeadsUpAppearanceController getHeadsUpAppearanceController(); } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java index 8b5989ff61a37..26e03870fd2c5 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/fragment/CollapsedStatusBarFragmentTest.java @@ -48,6 +48,7 @@ import com.android.systemui.statusbar.DisableFlagsLogger; import com.android.systemui.statusbar.OperatorNameViewController; import com.android.systemui.statusbar.connectivity.NetworkController; import com.android.systemui.statusbar.events.SystemStatusAnimationScheduler; +import com.android.systemui.statusbar.phone.HeadsUpAppearanceController; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.NotificationPanelViewController; import com.android.systemui.statusbar.phone.StatusBar; @@ -65,7 +66,9 @@ import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.Mockito; +import org.mockito.MockitoAnnotations; import java.util.Optional; @@ -90,8 +93,12 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { private OperatorNameViewController.Factory mOperatorNameViewControllerFactory; private OperatorNameViewController mOperatorNameViewController; + @Mock private StatusBarFragmentComponent.Factory mStatusBarFragmentComponentFactory; + @Mock private StatusBarFragmentComponent mStatusBarFragmentComponent; + @Mock + private HeadsUpAppearanceController mHeadsUpAppearanceController; public CollapsedStatusBarFragmentTest() { super(CollapsedStatusBarFragment.class); @@ -253,6 +260,32 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { Mockito.verify(mNotificationAreaInner, atLeast(1)).setVisibility(eq(View.VISIBLE)); } + @Test + public void disable_headsUpShouldBeVisibleTrue_clockDisabled() { + mFragments.dispatchResume(); + processAllMessages(); + CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment; + + when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(true); + + fragment.disable(DEFAULT_DISPLAY, 0, 0, false); + + assertEquals(View.GONE, mFragment.getView().findViewById(R.id.clock).getVisibility()); + } + + @Test + public void disable_headsUpShouldBeVisibleFalse_clockNotDisabled() { + mFragments.dispatchResume(); + processAllMessages(); + CollapsedStatusBarFragment fragment = (CollapsedStatusBarFragment) mFragment; + + when(mHeadsUpAppearanceController.shouldBeVisible()).thenReturn(false); + + fragment.disable(DEFAULT_DISPLAY, 0, 0, false); + + assertEquals(View.VISIBLE, mFragment.getView().findViewById(R.id.clock).getVisibility()); + } + @Test public void setUp_fragmentCreatesDaggerComponent() { mFragments.dispatchResume(); @@ -264,11 +297,8 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { @Override protected Fragment instantiate(Context context, String className, Bundle arguments) { - mStatusBarFragmentComponentFactory = - mock(StatusBarFragmentComponent.Factory.class); - mStatusBarFragmentComponent = mock(StatusBarFragmentComponent.class); - when(mStatusBarFragmentComponentFactory.create(any())) - .thenReturn(mStatusBarFragmentComponent); + MockitoAnnotations.initMocks(this); + setUpDaggerComponent(); mOngoingCallController = mock(OngoingCallController.class); mAnimationScheduler = mock(SystemStatusAnimationScheduler.class); mLocationPublisher = mock(StatusBarLocationPublisher.class); @@ -306,6 +336,13 @@ public class CollapsedStatusBarFragmentTest extends SysuiBaseFragmentTest { mOperatorNameViewControllerFactory); } + private void setUpDaggerComponent() { + when(mStatusBarFragmentComponentFactory.create(any())) + .thenReturn(mStatusBarFragmentComponent); + when(mStatusBarFragmentComponent.getHeadsUpAppearanceController()) + .thenReturn(mHeadsUpAppearanceController); + } + private void setUpNotificationIconAreaController() { mMockNotificationAreaController = mock(NotificationIconAreaController.class);