diff --git a/src/com/android/settings/applications/appinfo/AlarmsAndRemindersDetails.java b/src/com/android/settings/applications/appinfo/AlarmsAndRemindersDetails.java index 7ef9e89bbb5..25d73320ac7 100644 --- a/src/com/android/settings/applications/appinfo/AlarmsAndRemindersDetails.java +++ b/src/com/android/settings/applications/appinfo/AlarmsAndRemindersDetails.java @@ -43,12 +43,14 @@ public class AlarmsAndRemindersDetails extends AppInfoWithHeader implements OnPreferenceChangeListener { private static final String KEY_SWITCH = "alarms_and_reminders_switch"; + private static final String UNCOMMITTED_STATE_KEY = "uncommitted_state"; private AppStateAlarmsAndRemindersBridge mAppBridge; private AppOpsManager mAppOpsManager; private RestrictedSwitchPreference mSwitchPref; private AppStateAlarmsAndRemindersBridge.AlarmsAndRemindersState mPermissionState; private ActivityManager mActivityManager; + private volatile Boolean mUncommittedState; /** * Returns the string that states whether the app has access to @@ -77,24 +79,28 @@ public class AlarmsAndRemindersDetails extends AppInfoWithHeader mAppOpsManager = context.getSystemService(AppOpsManager.class); mActivityManager = context.getSystemService(ActivityManager.class); + if (savedInstanceState != null) { + mUncommittedState = (Boolean) savedInstanceState.get(UNCOMMITTED_STATE_KEY); + } addPreferencesFromResource(R.xml.alarms_and_reminders); mSwitchPref = findPreference(KEY_SWITCH); mSwitchPref.setOnPreferenceChangeListener(this); } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (mUncommittedState != null) { + outState.putObject(UNCOMMITTED_STATE_KEY, mUncommittedState); + } + } + @Override public boolean onPreferenceChange(Preference preference, Object newValue) { final boolean checked = (Boolean) newValue; if (preference == mSwitchPref) { - if (mPermissionState != null && checked != mPermissionState.isAllowed()) { - if (Settings.AlarmsAndRemindersAppActivity.class.getName().equals( - getIntent().getComponent().getClassName())) { - setResult(checked ? RESULT_OK : RESULT_CANCELED); - } - setCanScheduleAlarms(checked); - logPermissionChange(checked, mPackageName); - refreshUi(); - } + mUncommittedState = checked; + refreshUi(); return true; } return false; @@ -119,6 +125,24 @@ public class AlarmsAndRemindersDetails extends AppInfoWithHeader newState ? 1 : 0); } + @Override + public void onPause() { + super.onPause(); + if (getActivity().isChangingConfigurations()) { + return; + } + if (mPermissionState != null && mUncommittedState != null + && mUncommittedState != mPermissionState.isAllowed()) { + if (Settings.AlarmsAndRemindersAppActivity.class.getName().equals( + getIntent().getComponent().getClassName())) { + setResult(mUncommittedState ? RESULT_OK : RESULT_CANCELED); + } + setCanScheduleAlarms(mUncommittedState); + logPermissionChange(mUncommittedState, mPackageName); + mUncommittedState = null; + } + } + @Override protected boolean refreshUi() { if (mPackageInfo == null || mPackageInfo.applicationInfo == null) { @@ -127,7 +151,8 @@ public class AlarmsAndRemindersDetails extends AppInfoWithHeader mPermissionState = mAppBridge.createPermissionState(mPackageName, mPackageInfo.applicationInfo.uid); mSwitchPref.setEnabled(mPermissionState.shouldBeVisible()); - mSwitchPref.setChecked(mPermissionState.isAllowed()); + mSwitchPref.setChecked( + mUncommittedState != null ? mUncommittedState : mPermissionState.isAllowed()); return true; }