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

Commit 19402168 authored by Stas Zakrevskyi's avatar Stas Zakrevskyi
Browse files

Integrate MinMode with Keyguard

Hide the keyguard UI when the MinMode is in foreground. Also, updated the states in DozeParametert to avoid the keyguard UI appears when the MinMode is enabled.

Flag: com.android.systemui.enable_minmode
Bug: 411746510
Tests: manual testing with a MinMode activity and updated the appropriate unit tests; verified that normal AOD workflow still works.
Change-Id: I05a1d8b056a621926023fbc9c805c406d07bd8e4
parent 86e037e9
Loading
Loading
Loading
Loading
+38 −1
Original line number Diff line number Diff line
@@ -33,12 +33,14 @@ import android.content.res.Resources;
import android.hardware.display.AmbientDisplayConfiguration;
import android.os.Handler;
import android.os.PowerManager;
import android.platform.test.annotations.EnableFlags;
import android.provider.Settings;

import androidx.test.filters.SmallTest;
import androidx.test.runner.AndroidJUnit4;

import com.android.keyguard.KeyguardUpdateMonitor;
import com.android.systemui.Flags;
import com.android.systemui.SysuiTestCase;
import com.android.systemui.doze.AlwaysOnDisplayPolicy;
import com.android.systemui.doze.DozeScreenState;
@@ -46,6 +48,7 @@ import com.android.systemui.dump.DumpManager;
import com.android.systemui.keyguard.domain.interactor.DozeInteractor;
import com.android.systemui.keyguard.domain.interactor.KeyguardTransitionInteractor;
import com.android.systemui.keyguard.shared.model.KeyguardState;
import com.android.systemui.minmode.MinModeManager;
import com.android.systemui.plugins.statusbar.StatusBarStateController;
import com.android.systemui.settings.UserTracker;
import com.android.systemui.statusbar.policy.BatteryController;
@@ -91,6 +94,7 @@ public class DozeParametersTest extends SysuiTestCase {
    @Mock private ConfigurationController mConfigurationController;
    @Mock private UserTracker mUserTracker;
    @Mock private DozeInteractor mDozeInteractor;
    @Mock private MinModeManager mMinModeManager;
    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
    private KeyguardTransitionInteractor mKeyguardTransitionInteractor;
    @Captor private ArgumentCaptor<BatteryStateChangeCallback> mBatteryStateChangeCallback;
@@ -119,6 +123,7 @@ public class DozeParametersTest extends SysuiTestCase {
        when(mSysUIUnfoldComponent.getFoldAodAnimationController())
                .thenReturn(mFoldAodAnimationController);
        when(mUserTracker.getUserId()).thenReturn(ActivityManager.getCurrentUser());
        when(mMinModeManager.isMinModeEnabled()).thenReturn(false);

        SecureSettings secureSettings = new FakeSettings();
        mDozeParameters = new DozeParameters(
@@ -140,7 +145,8 @@ public class DozeParametersTest extends SysuiTestCase {
            mUserTracker,
            mDozeInteractor,
            mKeyguardTransitionInteractor,
            secureSettings
            secureSettings,
            Optional.of(mMinModeManager)
        );

        verify(mBatteryController).addCallback(mBatteryStateChangeCallback.capture());
@@ -328,6 +334,37 @@ public class DozeParametersTest extends SysuiTestCase {
        assertTrue(mDozeParameters.shouldControlScreenOff());
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MINMODE)
    public void testIsMinModeEnabled_proxiesToManager() {
        when(mMinModeManager.isMinModeEnabled()).thenReturn(true);
        assertThat(mDozeParameters.isMinModeActive()).isTrue();

        when(mMinModeManager.isMinModeEnabled()).thenReturn(false);
        assertThat(mDozeParameters.isMinModeActive()).isFalse();
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MINMODE)
    public void testGetAlwaysOn_falseWhenMinModeEnabled() {
        when(mAmbientDisplayConfiguration.alwaysOnEnabled(anyInt())).thenReturn(true);
        mDozeParameters.onTuningChanged(Settings.Secure.DOZE_ALWAYS_ON, "1");
        when(mBatteryController.isAodPowerSave()).thenReturn(false);

        when(mMinModeManager.isMinModeEnabled()).thenReturn(true);

        assertThat(mDozeParameters.getAlwaysOn()).isFalse();
    }

    @Test
    @EnableFlags(Flags.FLAG_ENABLE_MINMODE)
    public void testShouldAnimateDozingChange_falseWhenMinModeEnabled() {
        when(mScreenOffAnimationController.shouldAnimateDozingChange()).thenReturn(true);
        when(mMinModeManager.isMinModeEnabled()).thenReturn(true);

        assertThat(mDozeParameters.shouldAnimateDozingChange()).isFalse();
    }

    private void setDisplayNeedsBlankingForTest(boolean needsBlanking) {
        when(mResources.getBoolean(
                com.android.internal.R.bool.config_displayBlanksAfterDoze)).thenReturn(
+1 −0
Original line number Diff line number Diff line
@@ -655,6 +655,7 @@ constructor(
            DozeMachine.State.DOZE_AOD_PAUSED -> DozeStateModel.DOZE_AOD_PAUSED
            DozeMachine.State.DOZE_AOD_PAUSING -> DozeStateModel.DOZE_AOD_PAUSING
            DozeMachine.State.DOZE_AOD_DOCKED -> DozeStateModel.DOZE_AOD_DOCKED
            DozeMachine.State.DOZE_AOD_MINMODE -> DozeStateModel.DOZE_AOD_MINMODE
            else -> throw IllegalArgumentException("Invalid DozeMachine.State: state")
        }
    }
+10 −2
Original line number Diff line number Diff line
@@ -38,6 +38,7 @@ import com.android.systemui.keyguard.shared.model.KeyguardState.PRIMARY_BOUNCER
import com.android.systemui.keyguard.shared.model.TransitionState.RUNNING
import com.android.systemui.keyguard.shared.model.TransitionState.STARTED
import com.android.systemui.keyguard.ui.StateToValue
import com.android.systemui.minmode.MinModeManager
import com.android.systemui.scene.shared.model.Overlays
import com.android.systemui.scene.shared.model.Scenes
import com.android.systemui.shade.domain.interactor.ShadeInteractor
@@ -69,6 +70,8 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.merge
import kotlinx.coroutines.flow.onStart
import kotlinx.coroutines.flow.stateIn
import kotlinx.coroutines.flow.flowOf
import java.util.Optional

@SysUISingleton
class KeyguardRootViewModel
@@ -140,6 +143,7 @@ constructor(
    private val aodBurnInViewModel: AodBurnInViewModel,
    shadeInteractor: ShadeInteractor,
    dumpManager: DumpManager,
    private val minModeManager: Optional<MinModeManager>,
) : FlowDumperImpl(dumpManager) {
    val burnInLayerVisibility: Flow<Int> =
        keyguardTransitionInteractor.startedKeyguardTransitionStep
@@ -197,11 +201,15 @@ constructor(
            .distinctUntilChanged()

    /**
     * Keyguard should not show if fully transitioned into a hidden keyguard state or if
     * transitioning between hidden states.
     * Keyguard should not show in any of the following conditions:
     * 1. If fully transitioned into a hidden keyguard state
     * 2. If transitioning between hidden states
     * 3. If minmode activity is in foreground.
     */
    private val hideKeyguard: Flow<Boolean> =
        anyOf(
            if (minModeManager.isPresent) minModeManager.get().isMinModeInForegroundFlow
            else flowOf(false),
            notificationShadeWindowModel.isKeyguardOccluded,
            communalInteractor.isIdleOnCommunal,
            keyguardTransitionInteractor
+17 −3
Original line number Diff line number Diff line
@@ -30,6 +30,8 @@ import android.os.UserHandle;
import android.provider.Settings;
import android.util.Log;
import android.util.MathUtils;
import com.android.systemui.minmode.MinModeManager;
import com.android.systemui.minmode.MinModeManagerUtilsKt;

import androidx.annotation.NonNull;
import androidx.annotation.VisibleForTesting;
@@ -92,6 +94,7 @@ public class DozeParameters implements
    private final UnlockedScreenOffAnimationController mUnlockedScreenOffAnimationController;
    private final UserTracker mUserTracker;
    private final SecureSettings mSecureSettings;
    private final Optional<MinModeManager> mMinModeManager;

    private boolean mDozeAlwaysOn;
    private boolean mControlScreenOffAnimation;
@@ -138,7 +141,8 @@ public class DozeParameters implements
            UserTracker userTracker,
            DozeInteractor dozeInteractor,
            KeyguardTransitionInteractor transitionInteractor,
            SecureSettings secureSettings) {
            SecureSettings secureSettings,
            Optional<MinModeManager> minModeManager) {
        mResources = resources;
        mAmbientDisplayConfiguration = ambientDisplayConfiguration;
        mAlwaysOnPolicy = alwaysOnDisplayPolicy;
@@ -154,6 +158,7 @@ public class DozeParameters implements
        mDozeInteractor = dozeInteractor;
        mTransitionInteractor = transitionInteractor;
        mSecureSettings = secureSettings;
        mMinModeManager = minModeManager;

        keyguardUpdateMonitor.registerCallback(mKeyguardVisibilityCallback);
        tunerService.addTunable(
@@ -270,12 +275,20 @@ public class DozeParameters implements
        return mAlwaysOnPolicy.wallpaperFadeOutDuration;
    }

    /**
     * Checks if minmode is enabled.
     */
    public boolean isMinModeActive() {
        return mMinModeManager.isPresent()
                && MinModeManagerUtilsKt.isMinModeAvailable(mMinModeManager.get());
    }

    /**
     * Checks if always on is available and enabled for the current user.
     * @return {@code true} if enabled and available.
     */
    public boolean getAlwaysOn() {
        return mDozeAlwaysOn && !mBatteryController.isAodPowerSave();
        return mDozeAlwaysOn && !mBatteryController.isAodPowerSave() && !isMinModeActive();
    }

    /**
@@ -350,7 +363,7 @@ public class DozeParameters implements
    }

    public boolean shouldAnimateDozingChange() {
        return mScreenOffAnimationController.shouldAnimateDozingChange();
        return mScreenOffAnimationController.shouldAnimateDozingChange() && !isMinModeActive();
    }

    /**
@@ -462,6 +475,7 @@ public class DozeParameters implements
        pw.print("getSelectivelyRegisterSensorsUsingProx(): ");
        pw.println(getSelectivelyRegisterSensorsUsingProx());
        pw.print("isQuickPickupEnabled(): "); pw.println(isQuickPickupEnabled());
        pw.print("isMinModeActive(): "); pw.println(isMinModeActive());
    }

    private void dispatchAlwaysOnEvent() {
+3 −0
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import com.android.systemui.keyguard.domain.interactor.pulseExpansionInteractor
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture
import com.android.systemui.kosmos.applicationCoroutineScope
import com.android.systemui.kosmos.minModeManager
import com.android.systemui.shade.domain.interactor.shadeInteractor
import com.android.systemui.shade.ui.viewmodel.notificationShadeWindowModel
import com.android.systemui.statusbar.notification.icon.ui.viewmodel.notificationIconContainerAlwaysOnDisplayViewModel
@@ -31,6 +32,7 @@ import com.android.systemui.statusbar.notification.promoted.domain.interactor.ao
import com.android.systemui.statusbar.notification.stack.domain.interactor.notificationsKeyguardInteractor
import com.android.systemui.statusbar.phone.dozeParameters
import com.android.systemui.statusbar.phone.screenOffAnimationController
import java.util.Optional

val Kosmos.keyguardRootViewModel by Fixture {
    KeyguardRootViewModel(
@@ -95,5 +97,6 @@ val Kosmos.keyguardRootViewModel by Fixture {
        dumpManager = dumpManager,
        glanceableHubToAodTransitionViewModel = glanceableHubToAodTransitionViewModel,
        aodToGlanceableHubTransitionViewModel = aodToGlanceableHubTransitionViewModel,
        minModeManager = Optional.of(minModeManager),
    )
}
Loading