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

Commit f06eba79 authored by Jeff Pu's avatar Jeff Pu
Browse files

Support lockscreen indication of being locked by watch disconnect

Bug: 392692231
Test: Manual
Flag: com.android.systemui.show_locked_by_your_watch_keyguard_indicator
Change-Id: I5886d5998a15ba611a3e4f38f443dcb1df922386
parent d3af2e14
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -1713,7 +1713,8 @@ public class LockPatternUtils {
                        STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
                        STRONG_AUTH_REQUIRED_AFTER_USER_LOCKDOWN,
                        STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT,
                        STRONG_AUTH_REQUIRED_AFTER_NON_STRONG_BIOMETRICS_TIMEOUT,
                        SOME_AUTH_REQUIRED_AFTER_TRUSTAGENT_EXPIRED,
                        SOME_AUTH_REQUIRED_AFTER_TRUSTAGENT_EXPIRED,
                        SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST})
                        SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST,
                        SOME_AUTH_REQUIRED_AFTER_WATCH_DISCONNECTED})
        @Retention(RetentionPolicy.SOURCE)
        @Retention(RetentionPolicy.SOURCE)
        public @interface StrongAuthFlags {}
        public @interface StrongAuthFlags {}


@@ -1782,6 +1783,12 @@ public class LockPatternUtils {
         */
         */
        public static final int SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST = 0x200;
        public static final int SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST = 0x200;


        /**
         * Some authentication is required because the associated watch was disconnected from the
         * device
         */
        public static final int SOME_AUTH_REQUIRED_AFTER_WATCH_DISCONNECTED = 0x400;

        /**
        /**
         * Strong auth flags that do not prevent biometric methods from being accepted as auth.
         * Strong auth flags that do not prevent biometric methods from being accepted as auth.
         * If any other flags are set, biometric authentication is disabled.
         * If any other flags are set, biometric authentication is disabled.
@@ -1789,7 +1796,8 @@ public class LockPatternUtils {
        private static final int ALLOWING_BIOMETRIC = STRONG_AUTH_NOT_REQUIRED
        private static final int ALLOWING_BIOMETRIC = STRONG_AUTH_NOT_REQUIRED
                | SOME_AUTH_REQUIRED_AFTER_USER_REQUEST
                | SOME_AUTH_REQUIRED_AFTER_USER_REQUEST
                | SOME_AUTH_REQUIRED_AFTER_TRUSTAGENT_EXPIRED
                | SOME_AUTH_REQUIRED_AFTER_TRUSTAGENT_EXPIRED
                | SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST;
                | SOME_AUTH_REQUIRED_AFTER_ADAPTIVE_AUTH_REQUEST
                | SOME_AUTH_REQUIRED_AFTER_WATCH_DISCONNECTED;


        private final SparseIntArray mStrongAuthRequiredForUser = new SparseIntArray();
        private final SparseIntArray mStrongAuthRequiredForUser = new SparseIntArray();
        private final H mHandler;
        private final H mHandler;
+8 −0
Original line number Original line Diff line number Diff line
@@ -69,6 +69,7 @@ import com.android.systemui.bouncer.domain.interactor.AlternateBouncerInteractor
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
import com.android.systemui.bouncer.domain.interactor.BouncerMessageInteractor;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.broadcast.BroadcastDispatcher;
import com.android.systemui.deviceentry.domain.interactor.BiometricMessageInteractor;
import com.android.systemui.deviceentry.domain.interactor.BiometricMessageInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryBiometricSettingsInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFaceAuthInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor;
import com.android.systemui.deviceentry.domain.interactor.DeviceEntryFingerprintAuthInteractor;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager;
@@ -170,6 +171,9 @@ public class KeyguardIndicationControllerBaseTest extends SysuiTestCase {
    protected AlarmManager mAlarmManager;
    protected AlarmManager mAlarmManager;
    @Mock
    @Mock
    protected UserTracker mUserTracker;
    protected UserTracker mUserTracker;
    @Mock
    protected DeviceEntryBiometricSettingsInteractor mDeviceEntryBiometricSettingsInteractor;

    @Captor
    @Captor
    protected ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener;
    protected ArgumentCaptor<DockManager.AlignmentStateListener> mAlignmentListener;
    @Captor
    @Captor
@@ -257,6 +261,9 @@ public class KeyguardIndicationControllerBaseTest extends SysuiTestCase {


        mIndicationHelper = new IndicationHelper(mKeyguardUpdateMonitor);
        mIndicationHelper = new IndicationHelper(mKeyguardUpdateMonitor);


        when(mDeviceEntryBiometricSettingsInteractor.getAuthenticationFlags())
                .thenReturn(mock(StateFlow.class));

        mWakeLock = new WakeLockFake();
        mWakeLock = new WakeLockFake();
        mWakeLockBuilder = new WakeLockFake.Builder(mContext);
        mWakeLockBuilder = new WakeLockFake.Builder(mContext);
        mWakeLockBuilder.setWakeLock(mWakeLock);
        mWakeLockBuilder.setWakeLock(mWakeLock);
@@ -296,6 +303,7 @@ public class KeyguardIndicationControllerBaseTest extends SysuiTestCase {
                mock(BouncerMessageInteractor.class),
                mock(BouncerMessageInteractor.class),
                mFlags,
                mFlags,
                mIndicationHelper,
                mIndicationHelper,
                mDeviceEntryBiometricSettingsInteractor,
                KeyguardInteractorFactory.create(mFlags).getKeyguardInteractor(),
                KeyguardInteractorFactory.create(mFlags).getKeyguardInteractor(),
                mBiometricMessageInteractor,
                mBiometricMessageInteractor,
                mDeviceEntryFingerprintAuthInteractor,
                mDeviceEntryFingerprintAuthInteractor,
+32 −0
Original line number Original line Diff line number Diff line
@@ -27,7 +27,9 @@ import static android.view.View.VISIBLE;
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_AVAILABLE;
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_AVAILABLE;
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED;
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FACE_NOT_RECOGNIZED;
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED;
import static com.android.keyguard.KeyguardUpdateMonitor.BIOMETRIC_HELP_FINGERPRINT_NOT_RECOGNIZED;
import static com.android.systemui.Flags.showLockedByYourWatchKeyguardIndicator;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ADAPTIVE_AUTH;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ADAPTIVE_AUTH;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_WATCH_DISCONNECTED;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ALIGNMENT;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_ALIGNMENT;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BATTERY;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BATTERY;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BIOMETRIC_MESSAGE;
import static com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController.INDICATION_TYPE_BIOMETRIC_MESSAGE;
@@ -67,17 +69,21 @@ import android.hardware.biometrics.BiometricFingerprintConstants;
import android.hardware.biometrics.BiometricSourceType;
import android.hardware.biometrics.BiometricSourceType;
import android.os.BatteryManager;
import android.os.BatteryManager;
import android.os.RemoteException;
import android.os.RemoteException;
import android.platform.test.annotations.EnableFlags;
import android.testing.TestableLooper;
import android.testing.TestableLooper;


import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.ext.junit.runners.AndroidJUnit4;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.FlakyTest;
import androidx.test.filters.SmallTest;
import androidx.test.filters.SmallTest;


import com.android.internal.widget.LockPatternUtils;
import com.android.keyguard.TrustGrantFlags;
import com.android.keyguard.TrustGrantFlags;
import com.android.settingslib.fuelgauge.BatteryStatus;
import com.android.settingslib.fuelgauge.BatteryStatus;
import com.android.systemui.dock.DockManager;
import com.android.systemui.dock.DockManager;
import com.android.systemui.keyguard.KeyguardIndication;
import com.android.systemui.keyguard.KeyguardIndication;
import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController;
import com.android.systemui.keyguard.KeyguardIndicationRotateTextViewController;
import com.android.systemui.Flags;
import com.android.systemui.keyguard.shared.model.AuthenticationFlags;
import com.android.systemui.res.R;
import com.android.systemui.res.R;


import org.junit.Test;
import org.junit.Test;
@@ -1597,6 +1603,32 @@ public class KeyguardIndicationControllerTest extends KeyguardIndicationControll
        verifyNoMessage(INDICATION_TYPE_ADAPTIVE_AUTH);
        verifyNoMessage(INDICATION_TYPE_ADAPTIVE_AUTH);
    }
    }


    @Test
    @EnableFlags(Flags.FLAG_SHOW_LOCKED_BY_YOUR_WATCH_KEYGUARD_INDICATOR)
    public void updateWatchDisconnectedMessage_whenNotLockedWatchDisconnect_doesNotShowMsg() {
        createController();
        mController.setVisible(true);

        // Verify that the locked by your watch disconnect message does not show
        verifyNoMessage(INDICATION_TYPE_WATCH_DISCONNECTED);
    }

    @Test
    @EnableFlags(Flags.FLAG_SHOW_LOCKED_BY_YOUR_WATCH_KEYGUARD_INDICATOR)
    public void updateWatchDisconnectedMessage_whenLockedWatchDisconnect_noSkipBouncer_showsMsg() {
        assertTrue(showLockedByYourWatchKeyguardIndicator());
        when(mKeyguardUpdateMonitor.getUserCanSkipBouncer(getCurrentUser())).thenReturn(false);
        createController();
        mController.mDeviceEntryBiometricSettingsInteractorCallback.accept(
                new AuthenticationFlags(mCurrentUserId,
                LockPatternUtils.StrongAuthTracker.SOME_AUTH_REQUIRED_AFTER_WATCH_DISCONNECTED));
        mController.setVisible(true);

        // Verify that the locked by your watch disconnect message shows
        String message = mContext.getString(R.string.keyguard_indication_after_watch_disconnected);
        verifyIndicationMessage(INDICATION_TYPE_WATCH_DISCONNECTED, message);
    }

    private void screenIsTurningOn() {
    private void screenIsTurningOn() {
        when(mScreenLifecycle.getScreenState()).thenReturn(SCREEN_TURNING_ON);
        when(mScreenLifecycle.getScreenState()).thenReturn(SCREEN_TURNING_ON);
    }
    }
+3 −0
Original line number Original line Diff line number Diff line
@@ -1741,6 +1741,9 @@
    <!-- Indication on the keyguard that appears after the device is locked by adaptive auth. [CHAR LIMIT=60] -->
    <!-- Indication on the keyguard that appears after the device is locked by adaptive auth. [CHAR LIMIT=60] -->
    <string name="keyguard_indication_after_adaptive_auth_lock">Device locked\nFailed authentication</string>
    <string name="keyguard_indication_after_adaptive_auth_lock">Device locked\nFailed authentication</string>


    <!-- Indication on the keyguard that appears after the device is locked by adaptive auth. [CHAR LIMIT=60] -->
    <string name="keyguard_indication_after_watch_disconnected">Locked out by your watch</string>

    <!-- Accessibility string for current zen mode and selected exit condition. A template that simply concatenates existing mode string and the current condition description. [CHAR LIMIT=20] -->
    <!-- Accessibility string for current zen mode and selected exit condition. A template that simply concatenates existing mode string and the current condition description. [CHAR LIMIT=20] -->
    <string name="zen_mode_and_condition"><xliff:g id="zen_mode" example="Priority interruptions only">%1$s</xliff:g>. <xliff:g id="exit_condition" example="For one hour">%2$s</xliff:g></string>
    <string name="zen_mode_and_condition"><xliff:g id="zen_mode" example="Priority interruptions only">%1$s</xliff:g>. <xliff:g id="exit_condition" example="For one hour">%2$s</xliff:g></string>


+5 −1
Original line number Original line Diff line number Diff line
@@ -402,6 +402,7 @@ public class KeyguardIndicationRotateTextViewController extends
    public static final int INDICATION_TYPE_BIOMETRIC_MESSAGE_FOLLOW_UP = 12;
    public static final int INDICATION_TYPE_BIOMETRIC_MESSAGE_FOLLOW_UP = 12;
    public static final int INDICATION_IS_DISMISSIBLE = 13;
    public static final int INDICATION_IS_DISMISSIBLE = 13;
    public static final int INDICATION_TYPE_ADAPTIVE_AUTH = 14;
    public static final int INDICATION_TYPE_ADAPTIVE_AUTH = 14;
    public static final int INDICATION_TYPE_WATCH_DISCONNECTED = 15;


    @IntDef({
    @IntDef({
            INDICATION_TYPE_NONE,
            INDICATION_TYPE_NONE,
@@ -418,7 +419,8 @@ public class KeyguardIndicationRotateTextViewController extends
            INDICATION_TYPE_BIOMETRIC_MESSAGE,
            INDICATION_TYPE_BIOMETRIC_MESSAGE,
            INDICATION_TYPE_BIOMETRIC_MESSAGE_FOLLOW_UP,
            INDICATION_TYPE_BIOMETRIC_MESSAGE_FOLLOW_UP,
            INDICATION_IS_DISMISSIBLE,
            INDICATION_IS_DISMISSIBLE,
            INDICATION_TYPE_ADAPTIVE_AUTH
            INDICATION_TYPE_ADAPTIVE_AUTH,
            INDICATION_TYPE_WATCH_DISCONNECTED
    })
    })
    @Retention(RetentionPolicy.SOURCE)
    @Retention(RetentionPolicy.SOURCE)
    public @interface IndicationType{}
    public @interface IndicationType{}
@@ -456,6 +458,8 @@ public class KeyguardIndicationRotateTextViewController extends
                return "biometric_message_followup";
                return "biometric_message_followup";
            case INDICATION_TYPE_ADAPTIVE_AUTH:
            case INDICATION_TYPE_ADAPTIVE_AUTH:
                return "adaptive_auth";
                return "adaptive_auth";
            case INDICATION_TYPE_WATCH_DISCONNECTED:
                return "watch_disconnected";
            default:
            default:
                return "unknown[" + type + "]";
                return "unknown[" + type + "]";
        }
        }
Loading