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

Commit 1ab3fe5a authored by Dmitry Dementyev's avatar Dmitry Dementyev
Browse files

Use updated lockscreen validation API in Settings.

Test: manual
Test: m RunSettingsRoboTests -j ROBOTEST_FILTER=com.android.settings.password
Bug: 269256333
Change-Id: I660dea98eace96ed241b0a90f12ddeb742381dc0
parent cebb5582
Loading
Loading
Loading
Loading
+17 −17
Original line number Diff line number Diff line
@@ -22,7 +22,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.Activity;
import android.app.KeyguardManager;
import android.app.StartLockscreenValidationRequest;
import android.app.RemoteLockscreenValidationSession;
import android.app.admin.DevicePolicyManager;
import android.content.ComponentName;
import android.content.Intent;
@@ -145,7 +145,7 @@ public final class ChooseLockSettingsHelper {
        private boolean mAllowAnyUserId;
        private boolean mForceVerifyPath;
        private boolean mRemoteLockscreenValidation;
        @Nullable private StartLockscreenValidationRequest mStartLockscreenValidationRequest;
        @Nullable private RemoteLockscreenValidationSession mRemoteLockscreenValidationSession;
        @Nullable private ComponentName mRemoteLockscreenValidationServiceComponent;
        boolean mRequestGatekeeperPasswordHandle;

@@ -272,7 +272,7 @@ public final class ChooseLockSettingsHelper {

        /**
         * @param isRemoteLockscreenValidation if true, remote device validation flow will be
         *                                 started. {@link #setStartLockscreenValidationRequest} and
         *                                 started. {@link #setRemoteLockscreenValidationSession},
         *                                 {@link #setRemoteLockscreenValidationServiceComponent}
         *                                 must also be used to set the required data.
         */
@@ -283,14 +283,14 @@ public final class ChooseLockSettingsHelper {
        }

        /**
         * @param startLockScreenValidationRequest contains information necessary to perform remote
         * @param remoteLockscreenValidationSession contains information necessary to perform remote
         *                                         lockscreen validation such as the remote device's
         *                                         lockscreen type, public key to be used for
         *                                         encryption, and remaining attempts.
         */
        @NonNull public Builder setStartLockscreenValidationRequest(
                StartLockscreenValidationRequest startLockScreenValidationRequest) {
            mStartLockscreenValidationRequest = startLockScreenValidationRequest;
        @NonNull public Builder setRemoteLockscreenValidationSession(
                RemoteLockscreenValidationSession remoteLockscreenValidationSession) {
            mRemoteLockscreenValidationSession = remoteLockscreenValidationSession;
            return this;
        }

@@ -369,7 +369,7 @@ public final class ChooseLockSettingsHelper {
                mBuilder.mDescription, mBuilder.mReturnCredentials, mBuilder.mExternal,
                mBuilder.mForceVerifyPath, mBuilder.mUserId, mBuilder.mAlternateButton,
                mBuilder.mCheckBoxLabel, mBuilder.mRemoteLockscreenValidation,
                mBuilder.mStartLockscreenValidationRequest,
                mBuilder.mRemoteLockscreenValidationSession,
                mBuilder.mRemoteLockscreenValidationServiceComponent, mBuilder.mAllowAnyUserId,
                mBuilder.mForegroundOnly, mBuilder.mRequestGatekeeperPasswordHandle);
    }
@@ -379,18 +379,18 @@ public final class ChooseLockSettingsHelper {
            boolean returnCredentials, boolean external, boolean forceVerifyPath,
            int userId, @Nullable CharSequence alternateButton,
            @Nullable CharSequence checkboxLabel, boolean remoteLockscreenValidation,
            @Nullable StartLockscreenValidationRequest startLockScreenValidationRequest,
            @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession,
            @Nullable ComponentName remoteLockscreenValidationServiceComponent,
            boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle) {
        Optional<Class<?>> activityClass = determineAppropriateActivityClass(
                returnCredentials, forceVerifyPath, userId, startLockScreenValidationRequest);
                returnCredentials, forceVerifyPath, userId, remoteLockscreenValidationSession);
        if (activityClass.isEmpty()) {
            return false;
        }

        return launchConfirmationActivity(request, title, header, description, activityClass.get(),
                returnCredentials, external, forceVerifyPath, userId, alternateButton,
                checkboxLabel, remoteLockscreenValidation, startLockScreenValidationRequest,
                checkboxLabel, remoteLockscreenValidation, remoteLockscreenValidationSession,
                remoteLockscreenValidationServiceComponent, allowAnyUser, foregroundOnly,
                requestGatekeeperPasswordHandle);
    }
@@ -400,7 +400,7 @@ public final class ChooseLockSettingsHelper {
            boolean external, boolean forceVerifyPath, int userId,
            @Nullable CharSequence alternateButton, @Nullable CharSequence checkbox,
            boolean remoteLockscreenValidation,
            @Nullable StartLockscreenValidationRequest startLockScreenValidationRequest,
            @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession,
            @Nullable ComponentName remoteLockscreenValidationServiceComponent,
            boolean allowAnyUser, boolean foregroundOnly, boolean requestGatekeeperPasswordHandle) {
        final Intent intent = new Intent();
@@ -419,8 +419,8 @@ public final class ChooseLockSettingsHelper {
        intent.putExtra(Intent.EXTRA_USER_ID, userId);
        intent.putExtra(KeyguardManager.EXTRA_ALTERNATE_BUTTON_LABEL, alternateButton);
        intent.putExtra(KeyguardManager.EXTRA_CHECKBOX_LABEL, checkbox);
        intent.putExtra(KeyguardManager.EXTRA_START_LOCKSCREEN_VALIDATION_REQUEST,
                startLockScreenValidationRequest);
        intent.putExtra(KeyguardManager.EXTRA_REMOTE_LOCKSCREEN_VALIDATION_SESSION,
                remoteLockscreenValidationSession);
        intent.putExtra(Intent.EXTRA_COMPONENT_NAME, remoteLockscreenValidationServiceComponent);
        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_FOREGROUND_ONLY, foregroundOnly);
        intent.putExtra(ChooseLockSettingsHelper.EXTRA_KEY_ALLOW_ANY_USER, allowAnyUser);
@@ -477,10 +477,10 @@ public final class ChooseLockSettingsHelper {

    private Optional<Class<?>> determineAppropriateActivityClass(boolean returnCredentials,
            boolean forceVerifyPath, int userId,
            @Nullable StartLockscreenValidationRequest startLockscreenValidationRequest) {
            @Nullable RemoteLockscreenValidationSession remoteLockscreenValidationSession) {
        int lockType;
        if (startLockscreenValidationRequest != null) {
            lockType = startLockscreenValidationRequest.getLockscreenUiType();
        if (remoteLockscreenValidationSession != null) {
            lockType = remoteLockscreenValidationSession.getLockType();
        } else {
            final int effectiveUserId = UserManager
                    .get(mActivity).getCredentialOwnerProfile(userId);
+5 −5
Original line number Diff line number Diff line
@@ -28,7 +28,7 @@ import static com.android.settings.Utils.SETTINGS_PACKAGE_NAME;

import android.app.Activity;
import android.app.KeyguardManager;
import android.app.StartLockscreenValidationRequest;
import android.app.RemoteLockscreenValidationSession;
import android.app.admin.DevicePolicyManager;
import android.app.trust.TrustManager;
import android.content.ComponentName;
@@ -235,10 +235,10 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
                    .setUserId(LockPatternUtils.USER_FRP)
                    .show();
        } else if (remoteValidation) {
            StartLockscreenValidationRequest startLockScreenValidationRequest =
            RemoteLockscreenValidationSession remoteLockscreenValidationSession =
                    intent.getParcelableExtra(
                            KeyguardManager.EXTRA_START_LOCKSCREEN_VALIDATION_REQUEST,
                            StartLockscreenValidationRequest.class);
                            KeyguardManager.EXTRA_REMOTE_LOCKSCREEN_VALIDATION_SESSION,
                            RemoteLockscreenValidationSession.class);
            ComponentName remoteLockscreenValidationServiceComponent =
                    intent.getParcelableExtra(Intent.EXTRA_COMPONENT_NAME, ComponentName.class);

@@ -247,7 +247,7 @@ public class ConfirmDeviceCredentialActivity extends FragmentActivity {
                    new ChooseLockSettingsHelper.Builder(this);
            launchedCDC = builder
                    .setRemoteLockscreenValidation(true)
                    .setStartLockscreenValidationRequest(startLockScreenValidationRequest)
                    .setRemoteLockscreenValidationSession(remoteLockscreenValidationSession)
                    .setRemoteLockscreenValidationServiceComponent(
                            remoteLockscreenValidationServiceComponent)
                    .setHeader(mTitle) // Show the title in the header location
+9 −9
Original line number Diff line number Diff line
@@ -25,7 +25,7 @@ import android.annotation.Nullable;
import android.app.Dialog;
import android.app.KeyguardManager;
import android.app.RemoteLockscreenValidationResult;
import android.app.StartLockscreenValidationRequest;
import android.app.RemoteLockscreenValidationSession;
import android.app.admin.DevicePolicyManager;
import android.app.admin.ManagedSubscriptionsPolicy;
import android.content.ComponentName;
@@ -107,7 +107,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
    protected boolean mRemoteValidation;
    protected CharSequence mAlternateButtonText;
    protected BiometricManager mBiometricManager;
    @Nullable protected StartLockscreenValidationRequest mStartLockscreenValidationRequest;
    @Nullable protected RemoteLockscreenValidationSession mRemoteLockscreenValidationSession;
    /** Credential saved so the credential can be set for device if remote validation passes */
    @Nullable protected LockscreenCredential mDeviceCredentialGuess;
    @Nullable protected RemoteLockscreenValidationClient mRemoteLockscreenValidationClient;
@@ -141,12 +141,12 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
            }
        }
        if (mRemoteValidation) {
            mStartLockscreenValidationRequest = intent.getParcelableExtra(
                    KeyguardManager.EXTRA_START_LOCKSCREEN_VALIDATION_REQUEST,
                    StartLockscreenValidationRequest.class);
            if (mStartLockscreenValidationRequest == null
                    || mStartLockscreenValidationRequest.getRemainingAttempts() == 0) {
                Log.e(TAG, "StartLockscreenValidationRequest is null or "
            mRemoteLockscreenValidationSession = intent.getParcelableExtra(
                    KeyguardManager.EXTRA_REMOTE_LOCKSCREEN_VALIDATION_SESSION,
                    RemoteLockscreenValidationSession.class);
            if (mRemoteLockscreenValidationSession == null
                    || mRemoteLockscreenValidationSession.getRemainingAttempts() == 0) {
                Log.e(TAG, "RemoteLockscreenValidationSession is null or "
                        + "no more attempts for remote lockscreen validation.");
                getActivity().finish();
            }
@@ -437,7 +437,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr

    private byte[] encryptDeviceCredentialGuess(byte[] guess) {
        try {
            byte[] encodedPublicKey = mStartLockscreenValidationRequest.getSourcePublicKey();
            byte[] encodedPublicKey = mRemoteLockscreenValidationSession.getSourcePublicKey();
            PublicKey publicKey = SecureBox.decodePublicKey(encodedPublicKey);
            return SecureBox.encrypt(
                    publicKey,
+4 −1
Original line number Diff line number Diff line
@@ -166,7 +166,7 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
            mErrorTextView = (TextView) view.findViewById(R.id.errorText);

            if (mRemoteValidation) {
                mIsAlpha = mStartLockscreenValidationRequest.getLockscreenUiType()
                mIsAlpha = mRemoteLockscreenValidationSession.getLockType()
                        == KeyguardManager.PASSWORD;
                // ProgressBar visibility is set to GONE until interacted with.
                // Set progress bar to INVISIBLE, so the EditText does not get bumped down later.
@@ -633,6 +633,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
                    break;
                case RemoteLockscreenValidationResult.RESULT_NO_REMAINING_ATTEMPTS:
                    getActivity().finish();
                    break;
                case RemoteLockscreenValidationResult.RESULT_SESSION_EXPIRED:
                    getActivity().finish();
            }
            mGlifLayout.setProgressBarShown(false);
        }
+3 −0
Original line number Diff line number Diff line
@@ -646,6 +646,9 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
                    break;
                case RemoteLockscreenValidationResult.RESULT_NO_REMAINING_ATTEMPTS:
                    getActivity().finish();
                    break;
                case RemoteLockscreenValidationResult.RESULT_SESSION_EXPIRED:
                    getActivity().finish();
            }
            mGlifLayout.setProgressBarShown(false);
        }
Loading