Commit changes only when activity is closed
The consequences of revoking the permission are irreversible so delay committing until the user navigates out of the activity. Test: Manual Bug: 186280600 Change-Id: Ib53496fd4e39fe15dca4aadc5bcc773d5433131c
This commit is contained in:
@@ -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);
|
||||
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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user