Reduce jank in security lock selection by finishing on return

Earlier the finish of the chooser was happening before the pattern/pin chooser
was started, resulting in two transitions.

This change defers the finish to after returning from the other activity. There
is still sometimes a very small glitch on the way back, but much smaller than
the current problem.

Bug: 7342594

Change-Id: I5f4f4393b841ce31dc7236074381283155ebddbd
This commit is contained in:
Amith Yamasani
2012-10-24 10:27:05 -07:00
parent e508a26e03
commit c666c65fab

View File

@@ -59,6 +59,7 @@ public class ChooseLockGeneric extends PreferenceActivity {
private static final String PASSWORD_CONFIRMED = "password_confirmed"; private static final String PASSWORD_CONFIRMED = "password_confirmed";
private static final String CONFIRM_CREDENTIALS = "confirm_credentials"; private static final String CONFIRM_CREDENTIALS = "confirm_credentials";
private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation"; private static final String WAITING_FOR_CONFIRMATION = "waiting_for_confirmation";
private static final String FINISH_PENDING = "finish_pending";
public static final String MINIMUM_QUALITY_KEY = "minimum_quality"; public static final String MINIMUM_QUALITY_KEY = "minimum_quality";
private static final boolean ALWAY_SHOW_TUTORIAL = true; private static final boolean ALWAY_SHOW_TUTORIAL = true;
@@ -68,6 +69,7 @@ public class ChooseLockGeneric extends PreferenceActivity {
private KeyStore mKeyStore; private KeyStore mKeyStore;
private boolean mPasswordConfirmed = false; private boolean mPasswordConfirmed = false;
private boolean mWaitingForConfirmation = false; private boolean mWaitingForConfirmation = false;
private boolean mFinishPending = false;
@Override @Override
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
@@ -85,6 +87,7 @@ public class ChooseLockGeneric extends PreferenceActivity {
if (savedInstanceState != null) { if (savedInstanceState != null) {
mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED); mPasswordConfirmed = savedInstanceState.getBoolean(PASSWORD_CONFIRMED);
mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION); mWaitingForConfirmation = savedInstanceState.getBoolean(WAITING_FOR_CONFIRMATION);
mFinishPending = savedInstanceState.getBoolean(FINISH_PENDING);
} }
if (mPasswordConfirmed) { if (mPasswordConfirmed) {
@@ -101,7 +104,14 @@ public class ChooseLockGeneric extends PreferenceActivity {
} }
} }
@Override
public void onResume() {
super.onResume();
if (mFinishPending) {
mFinishPending = false;
finish();
}
}
@Override @Override
public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen, public boolean onPreferenceTreeClick(PreferenceScreen preferenceScreen,
@@ -170,6 +180,7 @@ public class ChooseLockGeneric extends PreferenceActivity {
// Saved so we don't force user to re-enter their password if configuration changes // Saved so we don't force user to re-enter their password if configuration changes
outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed); outState.putBoolean(PASSWORD_CONFIRMED, mPasswordConfirmed);
outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation); outState.putBoolean(WAITING_FOR_CONFIRMATION, mWaitingForConfirmation);
outState.putBoolean(FINISH_PENDING, mFinishPending);
} }
private void updatePreferencesOrFinish() { private void updatePreferencesOrFinish() {
@@ -352,10 +363,11 @@ public class ChooseLockGeneric extends PreferenceActivity {
intent.putExtra(CONFIRM_CREDENTIALS, false); intent.putExtra(CONFIRM_CREDENTIALS, false);
intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
isFallback); isFallback);
if(isFallback) { if (isFallback) {
startActivityForResult(intent, FALLBACK_REQUEST); startActivityForResult(intent, FALLBACK_REQUEST);
return; return;
} else { } else {
mFinishPending = true;
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intent); startActivity(intent);
} }
@@ -369,22 +381,26 @@ public class ChooseLockGeneric extends PreferenceActivity {
intent.putExtra(CONFIRM_CREDENTIALS, false); intent.putExtra(CONFIRM_CREDENTIALS, false);
intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK, intent.putExtra(LockPatternUtils.LOCKSCREEN_BIOMETRIC_WEAK_FALLBACK,
isFallback); isFallback);
if(isFallback) { if (isFallback) {
startActivityForResult(intent, FALLBACK_REQUEST); startActivityForResult(intent, FALLBACK_REQUEST);
return; return;
} else { } else {
mFinishPending = true;
intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT); intent.addFlags(Intent.FLAG_ACTIVITY_FORWARD_RESULT);
startActivity(intent); startActivity(intent);
} }
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) { } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_BIOMETRIC_WEAK) {
Intent intent = getBiometricSensorIntent(); Intent intent = getBiometricSensorIntent();
mFinishPending = true;
startActivity(intent); startActivity(intent);
} else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) { } else if (quality == DevicePolicyManager.PASSWORD_QUALITY_UNSPECIFIED) {
mChooseLockSettingsHelper.utils().clearLock(false); mChooseLockSettingsHelper.utils().clearLock(false);
mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled); mChooseLockSettingsHelper.utils().setLockScreenDisabled(disabled);
getActivity().setResult(Activity.RESULT_OK); getActivity().setResult(Activity.RESULT_OK);
finish();
} else {
finish();
} }
finish();
} }
@Override @Override