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; return SettingsEnums.CHOOSE_LOCK_GENERIC;
} }
@Override
public void onPause() {
super.onPause();
if (!getActivity().isChangingConfigurations() && !mWaitingForConfirmation) {
finish();
}
}
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);

View File

@@ -219,6 +219,13 @@ public class ChooseLockPassword extends SettingsActivity {
findViewById(R.id.content_parent).setFitsSystemWindows(false); findViewById(R.id.content_parent).setFitsSystemWindows(false);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE); getWindow().addFlags(WindowManager.LayoutParams.FLAG_SECURE);
} }
@Override
public void onPause() {
super.onPause();
if (!isChangingConfigurations()) {
finish();
}
}
public static class ChooseLockPasswordFragment extends InstrumentedFragment public static class ChooseLockPasswordFragment extends InstrumentedFragment
implements OnEditorActionListener, TextWatcher, SaveAndFinishWorker.Listener { implements OnEditorActionListener, TextWatcher, SaveAndFinishWorker.Listener {

View File

@@ -98,6 +98,14 @@ public class ChooseLockPattern extends SettingsActivity {
return modIntent; return modIntent;
} }
@Override
public void onPause() {
super.onPause();
if (!isChangingConfigurations()) {
finish();
}
}
public static class IntentBuilder { public static class IntentBuilder {
private final Intent mIntent; private final Intent mIntent;

View File

@@ -54,7 +54,9 @@ import android.os.Bundle;
import android.provider.Settings.Global; import android.provider.Settings.Global;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.lifecycle.Lifecycle;
import androidx.preference.Preference; import androidx.preference.Preference;
import androidx.test.core.app.ActivityScenario;
import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockPatternUtils;
import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.LockscreenCredential;
@@ -613,15 +615,29 @@ public class ChooseLockGenericTest {
mFragment.getString(R.string.face_unlock_set_unlock_password)); 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) { 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) { if (intent == null) {
intent = new Intent(); intent = new Intent();
} }
intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, false); intent.putExtra(ChooseLockGeneric.CONFIRM_CREDENTIALS, false);
// TODO(b/275023433) This presents the activity from being made 'visible` is workaround return intent;
mActivity = Robolectric.buildActivity(ChooseLockGeneric.InternalActivity.class, intent)
.create().start().postCreate(null).resume().get();
mActivity.getSupportFragmentManager().beginTransaction().add(mFragment, null).commitNow();
} }
private static String capitalize(final String input) { private static String capitalize(final String input) {

View File

@@ -47,6 +47,9 @@ import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
import android.widget.TextView; import android.widget.TextView;
import androidx.lifecycle.Lifecycle;
import androidx.test.core.app.ActivityScenario;
import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.LockscreenCredential;
import com.android.settings.R; import com.android.settings.R;
import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment; import com.android.settings.password.ChooseLockPassword.ChooseLockPasswordFragment;
@@ -515,16 +518,31 @@ public class ChooseLockPasswordTest {
assertThat(pinAutoConfirmOption.isChecked()).isFalse(); 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() { private ChooseLockPassword setupActivityWithPinTypeAndDefaultPolicy() {
PasswordPolicy policy = new PasswordPolicy(); PasswordPolicy policy = new PasswordPolicy();
policy.quality = PASSWORD_QUALITY_UNSPECIFIED; policy.quality = PASSWORD_QUALITY_UNSPECIFIED;
return buildChooseLockPasswordActivity( return buildChooseLockPasswordActivity(
new IntentBuilder(application) getLockPasswordIntent());
.setUserId(UserHandle.myUserId()) }
.setPasswordType(PASSWORD_QUALITY_NUMERIC)
.setPasswordRequirement(PASSWORD_COMPLEXITY_NONE, policy.getMinMetrics()) private Intent getLockPasswordIntent() {
.build()); 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) { private ChooseLockPassword buildChooseLockPasswordActivity(Intent intent) {

View File

@@ -30,6 +30,9 @@ import android.os.Bundle;
import android.os.UserHandle; import android.os.UserHandle;
import android.view.View; 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.LockPatternUtils;
import com.android.internal.widget.LockscreenCredential; import com.android.internal.widget.LockscreenCredential;
import com.android.settings.R; import com.android.settings.R;
@@ -137,16 +140,29 @@ public class ChooseLockPatternTest {
R.string.lockpassword_draw_your_pattern_again_header)); 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) { private ChooseLockPattern createActivity(boolean addFingerprintExtra) {
return Robolectric.buildActivity( return Robolectric.buildActivity(
ChooseLockPattern.class, ChooseLockPattern.class,
new IntentBuilder(application) getLockPatternIntent(addFingerprintExtra))
.setUserId(UserHandle.myUserId())
.setForFingerprint(addFingerprintExtra)
.build())
.setup().get(); .setup().get();
} }
private Intent getLockPatternIntent(boolean addFingerprintExtra) {
return new IntentBuilder(application)
.setUserId(UserHandle.myUserId())
.setForFingerprint(addFingerprintExtra)
.build();
}
private LockscreenCredential createPattern(String patternString) { private LockscreenCredential createPattern(String patternString) {
return LockscreenCredential.createPattern(LockPatternUtils.byteArrayToPattern( return LockscreenCredential.createPattern(LockPatternUtils.byteArrayToPattern(
patternString.getBytes())); patternString.getBytes()));