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

Commit ea250995 authored by Brian Lee's avatar Brian Lee
Browse files

Fix NPE encountered after setting LSKF for remote lockscreen validation

`getContext()` in `onChosenLockSaveFinished` will return `null` if the `ConfirmDeviceCredentialBaseFragment` was recreated (such as due to device rotation). This was due to the older `ConfirmDeviceCredentialBaseFragment` getting detached and the `SaveAndFinishWorker.Listener` still referring to the now detached fragment.

We have to update the listener to the newly created fragment.

This change was tested by going through the remote lockscreen validation flow and ensuring that the LSKF is properly set and finishes cleanly after having rotated/(un)folded my device after inputting the LSKF.

Test: m RunSettingsRoboTests -j
ROBOTEST_FILTER=com.android.settings.password
Test: Manual
Bug: 393644953
Flag: EXEMPT bugfix

Change-Id: I1e382a53adb9930949b669ac296483f52e30ee02
parent f3d40ab5
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -87,6 +87,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr

    protected static final String FRAGMENT_TAG_REMOTE_LOCKSCREEN_VALIDATION =
            "remote_lockscreen_validation";
    protected static final String FRAGMENT_TAG_SAVE_AND_FINISH = "save_and_finish_worker";

    protected boolean mReturnCredentials = false;
    protected boolean mReturnGatekeeperPassword = false;
@@ -113,6 +114,7 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
    /** Credential saved so the credential can be set for device if remote validation passes */
    @Nullable protected RemoteLockscreenValidationClient mRemoteLockscreenValidationClient;
    protected RemoteLockscreenValidationFragment mRemoteLockscreenValidationFragment;
    @Nullable protected SaveAndFinishWorker mSaveAndFinishWorker;

    private boolean isInternalActivity() {
        return (getActivity() instanceof ConfirmLockPassword.InternalActivity)
@@ -176,6 +178,9 @@ public abstract class ConfirmDeviceCredentialBaseFragment extends InstrumentedFr
                getFragmentManager().beginTransaction().add(mRemoteLockscreenValidationFragment,
                        FRAGMENT_TAG_REMOTE_LOCKSCREEN_VALIDATION).commit();
            }

            mSaveAndFinishWorker = (SaveAndFinishWorker) getFragmentManager()
                    .findFragmentByTag(FRAGMENT_TAG_SAVE_AND_FINISH);
        }

        // Only take this argument into account if it belongs to the current profile.
+18 −8
Original line number Diff line number Diff line
@@ -426,6 +426,9 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
            if (mRemoteLockscreenValidationFragment != null) {
                mRemoteLockscreenValidationFragment.setListener(null, /* handler= */ null);
            }
            if (mSaveAndFinishWorker != null) {
                mSaveAndFinishWorker.setListener(null);
            }
        }

        @Override
@@ -447,9 +450,13 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
                        mLockPatternUtils.getCurrentFailedPasswordAttempts(mEffectiveUserId));
            }
            mCredentialCheckResultTracker.setListener(this);

            if (mRemoteLockscreenValidationFragment != null) {
                mRemoteLockscreenValidationFragment.setListener(this, mHandler);
            }
            if (mSaveAndFinishWorker != null) {
                mSaveAndFinishWorker.setListener(this);
            }
        }

        @Override
@@ -642,14 +649,17 @@ public class ConfirmLockPassword extends ConfirmDeviceCredentialBaseActivity {
                    if (mCheckBox.isChecked() && mRemoteLockscreenValidationFragment
                            .getLockscreenCredential() != null) {
                        Log.i(TAG, "Setting device screen lock to the other device's screen lock.");
                        SaveAndFinishWorker saveAndFinishWorker = new SaveAndFinishWorker();
                        getFragmentManager().beginTransaction().add(saveAndFinishWorker, null)
                        if (mSaveAndFinishWorker == null) {
                            mSaveAndFinishWorker = new SaveAndFinishWorker();
                            getFragmentManager().beginTransaction().add(mSaveAndFinishWorker,
                                            FRAGMENT_TAG_SAVE_AND_FINISH)
                                    .commit();
                            getFragmentManager().executePendingTransactions();
                        saveAndFinishWorker
                            mSaveAndFinishWorker
                                    .setListener(this)
                                    .setRequestGatekeeperPasswordHandle(true);
                        saveAndFinishWorker.start(
                        }
                        mSaveAndFinishWorker.start(
                                mLockPatternUtils,
                                mRemoteLockscreenValidationFragment.getLockscreenCredential(),
                                /* currentCredential= */ null,
+18 −8
Original line number Diff line number Diff line
@@ -263,6 +263,9 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
            if (mRemoteLockscreenValidationFragment != null) {
                mRemoteLockscreenValidationFragment.setListener(null, /* handler= */ null);
            }
            if (mSaveAndFinishWorker != null) {
                mSaveAndFinishWorker.setListener(null);
            }
        }

        @Override
@@ -285,12 +288,16 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
                updateStage(Stage.NeedToUnlock);
            }
            mCredentialCheckResultTracker.setListener(this);

            if (mRemoteLockscreenValidationFragment != null) {
                mRemoteLockscreenValidationFragment.setListener(this, mHandler);
                if (mRemoteLockscreenValidationFragment.isRemoteValidationInProgress()) {
                    mLockPatternView.setEnabled(false);
                }
            }
            if (mSaveAndFinishWorker != null) {
                mSaveAndFinishWorker.setListener(this);
            }
        }

        @Override
@@ -641,14 +648,17 @@ public class ConfirmLockPattern extends ConfirmDeviceCredentialBaseActivity {
                    if (mCheckBox.isChecked() && mRemoteLockscreenValidationFragment
                            .getLockscreenCredential() != null) {
                        Log.i(TAG, "Setting device screen lock to the other device's screen lock.");
                        SaveAndFinishWorker saveAndFinishWorker = new SaveAndFinishWorker();
                        getFragmentManager().beginTransaction().add(saveAndFinishWorker, null)
                        if (mSaveAndFinishWorker == null) {
                            mSaveAndFinishWorker = new SaveAndFinishWorker();
                            getFragmentManager().beginTransaction().add(mSaveAndFinishWorker,
                                            FRAGMENT_TAG_SAVE_AND_FINISH)
                                    .commit();
                            getFragmentManager().executePendingTransactions();
                        saveAndFinishWorker
                            mSaveAndFinishWorker
                                    .setListener(this)
                                    .setRequestGatekeeperPasswordHandle(true);
                        saveAndFinishWorker.start(
                        }
                        mSaveAndFinishWorker.start(
                                mLockPatternUtils,
                                mRemoteLockscreenValidationFragment.getLockscreenCredential(),
                                /* currentCredential= */ null,
+3 −2
Original line number Diff line number Diff line
@@ -24,6 +24,7 @@ import android.util.Log;
import android.util.Pair;
import android.widget.Toast;

import androidx.annotation.Nullable;
import androidx.annotation.VisibleForTesting;
import androidx.fragment.app.Fragment;

@@ -40,7 +41,7 @@ import com.android.settings.safetycenter.LockScreenSafetySource;
public class SaveAndFinishWorker extends Fragment {
    private static final String TAG = "SaveAndFinishWorker";

    private Listener mListener;
    @Nullable private Listener mListener;
    private boolean mFinished;
    private Intent mResultData;

@@ -62,7 +63,7 @@ public class SaveAndFinishWorker extends Fragment {
        setRetainInstance(true);
    }

    public SaveAndFinishWorker setListener(Listener listener) {
    public SaveAndFinishWorker setListener(@Nullable Listener listener) {
        if (mListener == listener) {
            return this;
        }