Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8cd9a828 authored by Steve Elliott's avatar Steve Elliott Committed by Android (Google) Code Review
Browse files

Merge "Move AOD NIC binding to external locations" into main

parents fcbb49b6 0b29df97
Loading
Loading
Loading
Loading
+57 −5
Original line number Diff line number Diff line
@@ -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,9 +565,29 @@ public class KeyguardClockSwitchController extends ViewController<KeyguardClockS
            NotificationIconContainer nic = (NotificationIconContainer)
                    mView.findViewById(
                            com.android.systemui.res.R.id.left_aligned_notification_icon_container);
            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);
            }
        }
    }

    private void setClock(ClockController clock) {
        if (clock != null && mLogBuffer != null) {
+37 −4
Original line number Diff line number Diff line
@@ -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,8 +86,24 @@ constructor(
            return
        }

        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) {
        if (!featureFlags.isEnabled(Flags.MIGRATE_KEYGUARD_STATUS_VIEW)) {
@@ -102,5 +134,6 @@ constructor(

    override fun removeViews(constraintLayout: ConstraintLayout) {
        constraintLayout.removeView(nicId)
        nicBindingDisposable?.dispose()
    }
}
+4 −45
Original line number Diff line number Diff line
@@ -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
+1 −1
Original line number Diff line number Diff line
@@ -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)
+15 −1
Original line number Diff line number Diff line
@@ -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
        );