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
This commit is contained in:
Joshua McCloskey
2023-10-24 21:37:10 +00:00
parent f29e758da9
commit 302aa72446
6 changed files with 87 additions and 14 deletions

View File

@@ -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);

View File

@@ -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 {

View File

@@ -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;

View File

@@ -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<ChooseLockPassword> 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) {

View File

@@ -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<ChooseLockPassword> 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) {

View File

@@ -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<ChooseLockPattern> 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()));