diff options
5 files changed, 114 insertions, 56 deletions
diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java index 3c8301fe1b26..8efe165e0117 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitchController.java @@ -38,10 +38,10 @@ import androidx.annotation.NonNull; import androidx.annotation.VisibleForTesting; import com.android.systemui.Dumpable; -import com.android.systemui.res.R; +import com.android.systemui.common.ui.ConfigurationState; import com.android.systemui.dagger.qualifiers.Main; import com.android.systemui.dump.DumpManager; -import com.android.systemui.flags.FeatureFlags; +import com.android.systemui.flags.FeatureFlagsClassic; import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractor; @@ -50,14 +50,21 @@ import com.android.systemui.log.core.LogLevel; import com.android.systemui.log.dagger.KeyguardClockLog; import com.android.systemui.plugins.ClockController; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.res.R; import com.android.systemui.shared.clocks.ClockRegistry; import com.android.systemui.shared.regionsampling.RegionSampler; import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController; import com.android.systemui.statusbar.notification.AnimatableProperty; import com.android.systemui.statusbar.notification.PropertyAnimator; +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore; +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder; +import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel; import com.android.systemui.statusbar.notification.stack.AnimationProperties; +import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.NotificationIconContainer; +import com.android.systemui.statusbar.phone.ScreenOffAnimationController; +import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.ViewController; import com.android.systemui.util.concurrency.DelayableExecutor; import com.android.systemui.util.settings.SecureSettings; @@ -68,6 +75,8 @@ import java.util.function.Consumer; import javax.inject.Inject; +import kotlinx.coroutines.DisposableHandle; + /** * Injectable controller for {@link KeyguardClockSwitch}. */ @@ -84,6 +93,12 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private final DumpManager mDumpManager; private final ClockEventController mClockEventController; private final LogBuffer mLogBuffer; + private final NotificationIconContainerAlwaysOnDisplayViewModel mAodIconsViewModel; + private final ConfigurationState mConfigurationState; + private final ConfigurationController mConfigurationController; + private final DozeParameters mDozeParameters; + private final ScreenOffAnimationController mScreenOffAnimationController; + private final AlwaysOnDisplayNotificationIconViewStore mAodIconViewStore; private FrameLayout mSmallClockFrame; // top aligned clock private FrameLayout mLargeClockFrame; // centered clock @@ -107,10 +122,13 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS private boolean mShownOnSecondaryDisplay = false; private boolean mOnlyClock = false; private boolean mIsActiveDreamLockscreenHosted = false; - private FeatureFlags mFeatureFlags; + private final FeatureFlagsClassic mFeatureFlags; private KeyguardInteractor mKeyguardInteractor; private final DelayableExecutor mUiExecutor; private boolean mCanShowDoubleLineClock = true; + private DisposableHandle mAodIconsBindJob; + @Nullable private NotificationIconContainer mAodIconContainer; + @VisibleForTesting final Consumer<Boolean> mIsActiveDreamLockscreenHostedCallback = (Boolean isLockscreenHosted) -> { @@ -151,26 +169,38 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS KeyguardSliceViewController keyguardSliceViewController, NotificationIconAreaController notificationIconAreaController, LockscreenSmartspaceController smartspaceController, + ConfigurationController configurationController, + ScreenOffAnimationController screenOffAnimationController, KeyguardUnlockAnimationController keyguardUnlockAnimationController, SecureSettings secureSettings, @Main DelayableExecutor uiExecutor, DumpManager dumpManager, ClockEventController clockEventController, @KeyguardClockLog LogBuffer logBuffer, + NotificationIconContainerAlwaysOnDisplayViewModel aodIconsViewModel, + ConfigurationState configurationState, + DozeParameters dozeParameters, + AlwaysOnDisplayNotificationIconViewStore aodIconViewStore, KeyguardInteractor keyguardInteractor, - FeatureFlags featureFlags) { + FeatureFlagsClassic featureFlags) { super(keyguardClockSwitch); mStatusBarStateController = statusBarStateController; mClockRegistry = clockRegistry; mKeyguardSliceViewController = keyguardSliceViewController; mNotificationIconAreaController = notificationIconAreaController; mSmartspaceController = smartspaceController; + mConfigurationController = configurationController; + mScreenOffAnimationController = screenOffAnimationController; mSecureSettings = secureSettings; mUiExecutor = uiExecutor; mKeyguardUnlockAnimationController = keyguardUnlockAnimationController; mDumpManager = dumpManager; mClockEventController = clockEventController; mLogBuffer = logBuffer; + mAodIconsViewModel = aodIconsViewModel; + mConfigurationState = configurationState; + mDozeParameters = dozeParameters; + mAodIconViewStore = aodIconViewStore; mView.setLogBuffer(mLogBuffer); mFeatureFlags = featureFlags; mKeyguardInteractor = keyguardInteractor; @@ -316,6 +346,8 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS int getNotificationIconAreaHeight() { if (mFeatureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) { return 0; + } else if (mFeatureFlags.isEnabled(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR)) { + return mAodIconContainer != null ? mAodIconContainer.getHeight() : 0; } else { return mNotificationIconAreaController.getHeight(); } @@ -533,7 +565,27 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS NotificationIconContainer nic = (NotificationIconContainer) mView.findViewById( com.android.systemui.res.R.id.left_aligned_notification_icon_container); - mNotificationIconAreaController.setupAodIcons(nic); + if (mFeatureFlags.isEnabled(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR)) { + if (mAodIconsBindJob != null) { + mAodIconsBindJob.dispose(); + } + if (nic != null) { + nic.setOnLockScreen(true); + mAodIconsBindJob = NotificationIconContainerViewBinder.bind( + nic, + mAodIconsViewModel, + mConfigurationState, + mConfigurationController, + mDozeParameters, + mFeatureFlags, + mScreenOffAnimationController, + mAodIconViewStore + ); + mAodIconContainer = nic; + } + } else { + mNotificationIconAreaController.setupAodIcons(nic); + } } } diff --git a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt index 669db34b97aa..8a9ea25ce99d 100644 --- a/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt +++ b/packages/SystemUI/src/com/android/systemui/keyguard/ui/view/layout/sections/AodNotificationIconsSection.kt @@ -26,23 +26,39 @@ import androidx.constraintlayout.widget.ConstraintSet.END import androidx.constraintlayout.widget.ConstraintSet.PARENT_ID import androidx.constraintlayout.widget.ConstraintSet.START import androidx.constraintlayout.widget.ConstraintSet.TOP -import com.android.systemui.res.R -import com.android.systemui.flags.FeatureFlags +import com.android.systemui.common.ui.ConfigurationState +import com.android.systemui.flags.FeatureFlagsClassic import com.android.systemui.flags.Flags import com.android.systemui.keyguard.shared.model.KeyguardSection +import com.android.systemui.res.R import com.android.systemui.shade.NotificationPanelView +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.NotificationIconContainerViewBinder +import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel +import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.NotificationIconAreaController import com.android.systemui.statusbar.phone.NotificationIconContainer +import com.android.systemui.statusbar.phone.ScreenOffAnimationController +import com.android.systemui.statusbar.policy.ConfigurationController import javax.inject.Inject +import kotlinx.coroutines.DisposableHandle class AodNotificationIconsSection @Inject constructor( private val context: Context, - private val featureFlags: FeatureFlags, + private val configurationState: ConfigurationState, + private val configurationController: ConfigurationController, + private val dozeParameters: DozeParameters, + private val featureFlags: FeatureFlagsClassic, + private val nicAodViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, + private val nicAodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, private val notificationPanelView: NotificationPanelView, private val notificationIconAreaController: NotificationIconAreaController, + private val screenOffAnimationController: ScreenOffAnimationController, ) : KeyguardSection() { + + private var nicBindingDisposable: DisposableHandle? = null private val nicId = R.id.aod_notification_icon_container private lateinit var nic: NotificationIconContainer @@ -70,7 +86,23 @@ constructor( return } - notificationIconAreaController.setupAodIcons(nic) + if (featureFlags.isEnabled(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR)) { + nic.setOnLockScreen(true) + nicBindingDisposable?.dispose() + nicBindingDisposable = + NotificationIconContainerViewBinder.bind( + nic, + nicAodViewModel, + configurationState, + configurationController, + dozeParameters, + featureFlags, + screenOffAnimationController, + nicAodIconViewStore, + ) + } else { + notificationIconAreaController.setupAodIcons(nic) + } } override fun applyConstraints(constraintSet: ConstraintSet) { @@ -102,5 +134,6 @@ constructor( override fun removeViews(constraintLayout: ConstraintLayout) { constraintLayout.removeView(nicId) + nicBindingDisposable?.dispose() } } diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconAreaControllerViewBinderWrapperImpl.kt b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconAreaControllerViewBinderWrapperImpl.kt index 07e19e619509..41b42e32c48d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconAreaControllerViewBinderWrapperImpl.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/icon/ui/viewbinder/NotificationIconAreaControllerViewBinderWrapperImpl.kt @@ -18,21 +18,14 @@ package com.android.systemui.statusbar.notification.icon.ui.viewbinder import android.content.Context import android.graphics.Rect import android.view.View -import com.android.systemui.common.ui.ConfigurationState import com.android.systemui.dagger.SysUISingleton -import com.android.systemui.flags.FeatureFlagsClassic import com.android.systemui.statusbar.NotificationShelfController import com.android.systemui.statusbar.StatusBarIconView import com.android.systemui.statusbar.notification.collection.ListEntry -import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel import com.android.systemui.statusbar.notification.shelf.ui.viewbinder.NotificationShelfViewBinderWrapperControllerImpl -import com.android.systemui.statusbar.phone.DozeParameters import com.android.systemui.statusbar.phone.NotificationIconAreaController import com.android.systemui.statusbar.phone.NotificationIconContainer -import com.android.systemui.statusbar.phone.ScreenOffAnimationController -import com.android.systemui.statusbar.policy.ConfigurationController import javax.inject.Inject -import kotlinx.coroutines.DisposableHandle /** * Controller class for [NotificationIconContainer]. This implementation serves as a temporary @@ -42,43 +35,11 @@ import kotlinx.coroutines.DisposableHandle * can be used directly. */ @SysUISingleton -class NotificationIconAreaControllerViewBinderWrapperImpl -@Inject -constructor( - private val configuration: ConfigurationState, - private val configurationController: ConfigurationController, - private val dozeParameters: DozeParameters, - private val featureFlags: FeatureFlagsClassic, - private val screenOffAnimationController: ScreenOffAnimationController, - private val aodIconViewStore: AlwaysOnDisplayNotificationIconViewStore, - private val aodIconsViewModel: NotificationIconContainerAlwaysOnDisplayViewModel, -) : NotificationIconAreaController { - - private var aodIcons: NotificationIconContainer? = null - private var aodBindJob: DisposableHandle? = null +class NotificationIconAreaControllerViewBinderWrapperImpl @Inject constructor() : + NotificationIconAreaController { /** Called by the Keyguard*ViewController whose view contains the aod icons. */ - override fun setupAodIcons(aodIcons: NotificationIconContainer) { - val changed = this.aodIcons != null && aodIcons !== this.aodIcons - if (changed) { - this.aodIcons!!.setAnimationsEnabled(false) - this.aodIcons!!.removeAllViews() - aodBindJob?.dispose() - } - this.aodIcons = aodIcons - this.aodIcons!!.setOnLockScreen(true) - aodBindJob = - NotificationIconContainerViewBinder.bind( - aodIcons, - aodIconsViewModel, - configuration, - configurationController, - dozeParameters, - featureFlags, - screenOffAnimationController, - aodIconViewStore, - ) - } + override fun setupAodIcons(aodIcons: NotificationIconContainer?) = unsupported override fun setupShelf(notificationShelfController: NotificationShelfController) = NotificationShelfViewBinderWrapperControllerImpl.unsupported @@ -104,9 +65,7 @@ constructor( override fun onThemeChanged() = unsupported - override fun getHeight(): Int { - return if (aodIcons == null) 0 else aodIcons!!.height - } + override fun getHeight(): Int = unsupported companion object { val unsupported: Nothing diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.kt index 0079f7ceb539..2823b2819281 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationIconAreaController.kt @@ -28,7 +28,7 @@ import com.android.systemui.statusbar.notification.collection.ListEntry */ interface NotificationIconAreaController { /** Called by the Keyguard*ViewController whose view contains the aod icons. */ - fun setupAodIcons(aodIcons: NotificationIconContainer) + fun setupAodIcons(aodIcons: NotificationIconContainer?) fun setupShelf(notificationShelfController: NotificationShelfController) fun setShelfIcons(icons: NotificationIconContainer) fun onDensityOrFontScaleChanged(context: Context) diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java index 5273e0e58e02..153f3f7a1049 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchControllerBaseTest.java @@ -35,10 +35,11 @@ import android.widget.FrameLayout; import android.widget.LinearLayout; import android.widget.RelativeLayout; -import com.android.systemui.res.R; import com.android.systemui.SysuiTestCase; +import com.android.systemui.common.ui.ConfigurationState; import com.android.systemui.dump.DumpManager; import com.android.systemui.flags.FakeFeatureFlags; +import com.android.systemui.flags.Flags; import com.android.systemui.keyguard.KeyguardUnlockAnimationController; import com.android.systemui.keyguard.domain.interactor.KeyguardInteractorFactory; import com.android.systemui.log.LogBuffer; @@ -50,12 +51,18 @@ import com.android.systemui.plugins.ClockFaceController; import com.android.systemui.plugins.ClockFaceEvents; import com.android.systemui.plugins.ClockTickRate; import com.android.systemui.plugins.statusbar.StatusBarStateController; +import com.android.systemui.res.R; import com.android.systemui.shared.clocks.AnimatableClockView; import com.android.systemui.shared.clocks.ClockRegistry; import com.android.systemui.statusbar.StatusBarState; import com.android.systemui.statusbar.lockscreen.LockscreenSmartspaceController; +import com.android.systemui.statusbar.notification.icon.ui.viewbinder.AlwaysOnDisplayNotificationIconViewStore; +import com.android.systemui.statusbar.notification.icon.ui.viewmodel.NotificationIconContainerAlwaysOnDisplayViewModel; +import com.android.systemui.statusbar.phone.DozeParameters; import com.android.systemui.statusbar.phone.NotificationIconAreaController; import com.android.systemui.statusbar.phone.NotificationIconContainer; +import com.android.systemui.statusbar.phone.ScreenOffAnimationController; +import com.android.systemui.statusbar.policy.ConfigurationController; import com.android.systemui.util.concurrency.FakeExecutor; import com.android.systemui.util.settings.SecureSettings; import com.android.systemui.util.time.FakeSystemClock; @@ -166,6 +173,7 @@ public class KeyguardClockSwitchControllerBaseTest extends SysuiTestCase { when(mSmartspaceController.buildAndConnectView(any())).thenReturn(mFakeSmartspaceView); mExecutor = new FakeExecutor(new FakeSystemClock()); mFakeFeatureFlags = new FakeFeatureFlags(); + mFakeFeatureFlags.setDefault(Flags.NOTIFICATION_ICON_CONTAINER_REFACTOR); mFakeFeatureFlags.set(FACE_AUTH_REFACTOR, false); mFakeFeatureFlags.set(LOCKSCREEN_WALLPAPER_DREAM_ENABLED, false); mFakeFeatureFlags.set(MIGRATE_KEYGUARD_STATUS_VIEW, false); @@ -176,12 +184,18 @@ public class KeyguardClockSwitchControllerBaseTest extends SysuiTestCase { mKeyguardSliceViewController, mNotificationIconAreaController, mSmartspaceController, + mock(ConfigurationController.class), + mock(ScreenOffAnimationController.class), mKeyguardUnlockAnimationController, mSecureSettings, mExecutor, mDumpManager, mClockEventController, mLogBuffer, + mock(NotificationIconContainerAlwaysOnDisplayViewModel.class), + mock(ConfigurationState.class), + mock(DozeParameters.class), + mock(AlwaysOnDisplayNotificationIconViewStore.class), KeyguardInteractorFactory.create(mFakeFeatureFlags).getKeyguardInteractor(), mFakeFeatureFlags ); |