From 302aa7244680de9eed47f20d02a37b0ce587ba26 Mon Sep 17 00:00:00 2001 From: Joshua McCloskey Date: Tue, 24 Oct 2023 21:37:10 +0000 Subject: [PATCH] Settings ChooseLockscreen* dismiss in background. Whenever launching ChooseLockGeneric/ChooseLockPassword/ChooseLockPassword the activity will finish itself when it goes into the background. This is to ensure that a user only has an opporunity to complete this process once the activity is shown. (It cannot be resumed after a power button press, or sending the activity to the background) Test: Verified in Settings that the ChooseLockGeneric, ChooseLockPassword and the ChooseLockPattern activities now exit if they are sent to the background. Test: Same as above but in SUW Test: m -j40 RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.password.ChooseLockPatternTest Test: m -j40 RunSettingsRoboTests ROBOTEST_FILTER=com.android.settings.password.ChooseLockPasswordTest Fixes: 287473148 Change-Id: Icc9142ff4672ab3669b2f425ff351b03ce7a223a --- .../settings/password/ChooseLockGeneric.java | 8 ++++++ .../settings/password/ChooseLockPassword.java | 7 +++++ .../settings/password/ChooseLockPattern.java | 8 ++++++ .../password/ChooseLockGenericTest.java | 24 +++++++++++++--- .../password/ChooseLockPasswordTest.java | 28 +++++++++++++++---- .../password/ChooseLockPatternTest.java | 26 +++++++++++++---- 6 files changed, 87 insertions(+), 14 deletions(-) diff --git a/src/com/android/settings/password/ChooseLockGeneric.java b/src/com/android/settings/password/ChooseLockGeneric.java index 0bf1255b3b9..714f3ee8b89 100644 --- a/src/com/android/settings/password/ChooseLockGeneric.java +++ b/src/com/android/settings/password/ChooseLockGeneric.java @@ -200,6 +200,14 @@ public class ChooseLockGeneric extends SettingsActivity { return SettingsEnums.CHOOSE_LOCK_GENERIC; } + @Override + public void onPause() { + super.onPause(); + if (!getActivity().isChangingConfigurations() && !mWaitingForConfirmation) { + finish(); + } + } + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); diff --git a/src/com/android/settings/password/ChooseLockPassword.java b/src/com/android/settings/password/ChooseLockPassword.java index 800adb063cb..e74a2ff3a1a 100644 --- a/src/com/android/settings/password/ChooseLockPassword.java +++ b/src/com/android/settings/password/ChooseLockPassword.java @@ -219,6 +219,13 @@ public class ChooseLockPassword extends SettingsActivity { findViewById(R.id.content_parent).setFitsSystemWindows(false); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); } + @Override + public void onPause() { + super.onPause(); + if (!isChangingConfigurations()) { + finish(); + } + } public static class ChooseLockPasswordFragment extends InstrumentedFragment implements OnEditorActionListener, TextWatcher, SaveAndFinishWorker.Listener { diff --git a/src/com/android/settings/password/ChooseLockPattern.java b/src/com/android/settings/password/ChooseLockPattern.java index 20d1e7d8cd1..f0c432e9465 100644 --- a/src/com/android/settings/password/ChooseLockPattern.java +++ b/src/com/android/settings/password/ChooseLockPattern.java @@ -98,6 +98,14 @@ public class ChooseLockPattern extends SettingsActivity { return modIntent; } + @Override + public void onPause() { + super.onPause(); + if (!isChangingConfigurations()) { + finish(); + } + } + public static class IntentBuilder { private final Intent mIntent; diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java index e625827d4a6..a099a393349 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockGenericTest.java @@ -54,7 +54,9 @@ import android.os.Bundle; import android.provider.Settings.Global; import androidx.annotation.Nullable; +import androidx.lifecycle.Lifecycle; import androidx.preference.Preference; +import androidx.test.core.app.ActivityScenario; import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockscreenCredential; @@ -613,15 +615,29 @@ public class ChooseLockGenericTest { mFragment.getString(R.string.face_unlock_set_unlock_password)); } + @Test + public void activity_dismisses_InBackground() { + ActivityScenario scenario = + ActivityScenario.launchActivityForResult(getChooseLockGenericIntent(null)); + scenario.moveToState(Lifecycle.State.RESUMED); + scenario.moveToState(Lifecycle.State.CREATED); + assertThat(scenario.getResult()).isNotNull(); + } + private void initActivity(@Nullable Intent intent) { + final Intent theIntent = getChooseLockGenericIntent(intent); + // TODO(b/275023433) This presents the activity from being made 'visible` is workaround + mActivity = Robolectric.buildActivity(ChooseLockGeneric.InternalActivity.class, theIntent) + .create().start().postCreate(null).resume().get(); + mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow(); + } + + private Intent getChooseLockGenericIntent(@Nullable Intent intent) { if (intent == null) { intent = new Intent(); } intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, false); - // TODO(b/275023433) This presents the activity from being made 'visible` is workaround - mActivity = Robolectric.buildActivity(ChooseLockGeneric.InternalActivity.class, intent) - .create().start().postCreate(null).resume().get(); - mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow(); + return intent; } private static String capitalize(final String input) { diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java index dea936d1602..ed8179b235d 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPasswordTest.java @@ -47,6 +47,9 @@ import android.view.View; import android.widget.CheckBox; import android.widget.TextView; +import androidx.lifecycle.Lifecycle; +import androidx.test.core.app.ActivityScenario; + import com.android.internal.widget.LockscreenCredential; import com.android.settings.R; import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment; @@ -515,16 +518,31 @@ public class ChooseLockPasswordTest { assertThat(pinAutoConfirmOption.isChecked()).isFalse(); } + @Test + public void activity_dismisses_InBackground() { + ActivityScenario scenario = + ActivityScenario.launchActivityForResult(getLockPasswordIntent()); + scenario.moveToState(Lifecycle.State.RESUMED); + scenario.moveToState(Lifecycle.State.CREATED); + assertThat(scenario.getResult()).isNotNull(); + } + private ChooseLockPassword setupActivityWithPinTypeAndDefaultPolicy() { PasswordPolicy policy = new PasswordPolicy(); policy.quality = PASSWORD_QUALITY_UNSPECIFIED; return buildChooseLockPasswordActivity( - new IntentBuilder(application) - .setUserId(UserHandle.myUserId()) - .setPasswordType(PASSWORD_QUALITY_NUMERIC) - .setPasswordRequirement(PASSWORD_COMPLEXITY_NONE, policy.getMinMetrics()) - .build()); + getLockPasswordIntent()); + } + + private Intent getLockPasswordIntent() { + PasswordPolicy policy = new PasswordPolicy(); + policy.quality = PASSWORD_QUALITY_UNSPECIFIED; + return new IntentBuilder(application) + .setUserId(UserHandle.myUserId()) + .setPasswordType(PASSWORD_QUALITY_NUMERIC) + .setPasswordRequirement(PASSWORD_COMPLEXITY_NONE, policy.getMinMetrics()) + .build(); } private ChooseLockPassword buildChooseLockPasswordActivity(Intent intent) { diff --git a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java index 7715c62b55b..da12ee43c8a 100644 --- a/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java +++ b/tests/robotests/src/com/android/settings/password/ChooseLockPatternTest.java @@ -30,6 +30,9 @@ import android.os.Bundle; import android.os.UserHandle; import android.view.View; +import androidx.lifecycle.Lifecycle; +import androidx.test.core.app.ActivityScenario; + import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockscreenCredential; import com.android.settings.R; @@ -137,16 +140,29 @@ public class ChooseLockPatternTest { R.string.lockpassword_draw_your_pattern_again_header)); } + @Test + public void activity_dismisses_InBackground() { + ActivityScenario scenario = + ActivityScenario.launchActivityForResult(getLockPatternIntent(false)); + scenario.moveToState(Lifecycle.State.RESUMED); + scenario.moveToState(Lifecycle.State.CREATED); + assertThat(scenario.getResult()).isNotNull(); + } + private ChooseLockPattern createActivity(boolean addFingerprintExtra) { return Robolectric.buildActivity( - ChooseLockPattern.class, - new IntentBuilder(application) - .setUserId(UserHandle.myUserId()) - .setForFingerprint(addFingerprintExtra) - .build()) + ChooseLockPattern.class, + getLockPatternIntent(addFingerprintExtra)) .setup().get(); } + private Intent getLockPatternIntent(boolean addFingerprintExtra) { + return new IntentBuilder(application) + .setUserId(UserHandle.myUserId()) + .setForFingerprint(addFingerprintExtra) + .build(); + } + private LockscreenCredential createPattern(String patternString) { return LockscreenCredential.createPattern(LockPatternUtils.byteArrayToPattern( patternString.getBytes()));