Fix problem where rotating the device doesn't launch TrustAgent pref

This fixes a bug where the TrustAgent intent was being lost when
the device configurtion changes. It used to depend on a view that
gets recreated.  Instead, we persist the actual launch intent
which works across activity restarts.

Fixes bug 17040470

Change-Id: Ia1c93867254cfdc27683a767cf41fe74dbb97db0
This commit is contained in:
Jim Miller
2014-09-05 18:48:18 -07:00
parent fd3a3d7929
commit 250b9bee68

View File

@@ -63,6 +63,7 @@ import static android.provider.Settings.System.SCREEN_OFF_TIMEOUT;
*/
public class SecuritySettings extends SettingsPreferenceFragment
implements OnPreferenceChangeListener, DialogInterface.OnClickListener, Indexable {
private static final String TRUST_AGENT_CLICK_INTENT = "trust_agent_click_intent";
static final String TAG = "SecuritySettings";
private static final Intent TRUST_AGENT_INTENT =
new Intent(TrustAgentService.SERVICE_INTERFACE);
@@ -127,7 +128,7 @@ public class SecuritySettings extends SettingsPreferenceFragment
private boolean mIsPrimary;
private Preference mClickedTrustAgentPreference;
private Intent mTrustAgentClickIntent;
@Override
public void onCreate(Bundle savedInstanceState) {
@@ -138,6 +139,11 @@ public class SecuritySettings extends SettingsPreferenceFragment
mDPM = (DevicePolicyManager)getSystemService(Context.DEVICE_POLICY_SERVICE);
mChooseLockSettingsHelper = new ChooseLockSettingsHelper(getActivity());
if (savedInstanceState != null
&& savedInstanceState.containsKey(TRUST_AGENT_CLICK_INTENT)) {
mTrustAgentClickIntent = savedInstanceState.getParcelable(TRUST_AGENT_CLICK_INTENT);
}
}
private static int getResIdForLockUnlockScreen(Context context,
@@ -504,6 +510,14 @@ public class SecuritySettings extends SettingsPreferenceFragment
mLockAfter.setEnabled(revisedEntries.size() > 0);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mTrustAgentClickIntent != null) {
outState.putParcelable(TRUST_AGENT_CLICK_INTENT, mTrustAgentClickIntent);
}
}
@Override
public void onResume() {
super.onResume();
@@ -554,12 +568,12 @@ public class SecuritySettings extends SettingsPreferenceFragment
} else if (KEY_TRUST_AGENT.equals(key)) {
ChooseLockSettingsHelper helper =
new ChooseLockSettingsHelper(this.getActivity(), this);
mClickedTrustAgentPreference = preference;
mTrustAgentClickIntent = preference.getIntent();
if (!helper.launchConfirmationActivity(CHANGE_TRUST_AGENT_SETTINGS, null, null) &&
preference.getIntent() != null) {
mTrustAgentClickIntent != null) {
// If this returns false, it means no password confirmation is required.
startActivity(preference.getIntent());
mClickedTrustAgentPreference = null;
startActivity(mTrustAgentClickIntent);
mTrustAgentClickIntent = null;
}
} else {
// If we didn't handle it, let preferences handle it.
@@ -587,13 +601,11 @@ public class SecuritySettings extends SettingsPreferenceFragment
// because mBiometricWeakLiveliness could be null
return;
} else if (requestCode == CHANGE_TRUST_AGENT_SETTINGS && resultCode == Activity.RESULT_OK) {
if (mClickedTrustAgentPreference != null) {
Intent intent = mClickedTrustAgentPreference.getIntent();
if (intent != null) {
startActivity(intent);
}
mClickedTrustAgentPreference = null;
if (mTrustAgentClickIntent != null) {
startActivity(mTrustAgentClickIntent);
mTrustAgentClickIntent = null;
}
return;
}
createPreferenceHierarchy();
}