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 {
|
implements OnPreferenceChangeListener {
|
||||||
|
|
||||||
private static final String KEY_SWITCH = "alarms_and_reminders_switch";
|
private static final String KEY_SWITCH = "alarms_and_reminders_switch";
|
||||||
|
private static final String UNCOMMITTED_STATE_KEY = "uncommitted_state";
|
||||||
|
|
||||||
private AppStateAlarmsAndRemindersBridge mAppBridge;
|
private AppStateAlarmsAndRemindersBridge mAppBridge;
|
||||||
private AppOpsManager mAppOpsManager;
|
private AppOpsManager mAppOpsManager;
|
||||||
private RestrictedSwitchPreference mSwitchPref;
|
private RestrictedSwitchPreference mSwitchPref;
|
||||||
private AppStateAlarmsAndRemindersBridge.AlarmsAndRemindersState mPermissionState;
|
private AppStateAlarmsAndRemindersBridge.AlarmsAndRemindersState mPermissionState;
|
||||||
private ActivityManager mActivityManager;
|
private ActivityManager mActivityManager;
|
||||||
|
private volatile Boolean mUncommittedState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns the string that states whether the app has access to
|
* 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);
|
mAppOpsManager = context.getSystemService(AppOpsManager.class);
|
||||||
mActivityManager = context.getSystemService(ActivityManager.class);
|
mActivityManager = context.getSystemService(ActivityManager.class);
|
||||||
|
|
||||||
|
if (savedInstanceState != null) {
|
||||||
|
mUncommittedState = (Boolean) savedInstanceState.get(UNCOMMITTED_STATE_KEY);
|
||||||
|
}
|
||||||
addPreferencesFromResource(R.xml.alarms_and_reminders);
|
addPreferencesFromResource(R.xml.alarms_and_reminders);
|
||||||
mSwitchPref = findPreference(KEY_SWITCH);
|
mSwitchPref = findPreference(KEY_SWITCH);
|
||||||
mSwitchPref.setOnPreferenceChangeListener(this);
|
mSwitchPref.setOnPreferenceChangeListener(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onSaveInstanceState(Bundle outState) {
|
||||||
|
super.onSaveInstanceState(outState);
|
||||||
|
if (mUncommittedState != null) {
|
||||||
|
outState.putObject(UNCOMMITTED_STATE_KEY, mUncommittedState);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
public boolean onPreferenceChange(Preference preference, Object newValue) {
|
||||||
final boolean checked = (Boolean) newValue;
|
final boolean checked = (Boolean) newValue;
|
||||||
if (preference == mSwitchPref) {
|
if (preference == mSwitchPref) {
|
||||||
if (mPermissionState != null && checked != mPermissionState.isAllowed()) {
|
mUncommittedState = checked;
|
||||||
if (Settings.AlarmsAndRemindersAppActivity.class.getName().equals(
|
|
||||||
getIntent().getComponent().getClassName())) {
|
|
||||||
setResult(checked ? RESULT_OK : RESULT_CANCELED);
|
|
||||||
}
|
|
||||||
setCanScheduleAlarms(checked);
|
|
||||||
logPermissionChange(checked, mPackageName);
|
|
||||||
refreshUi();
|
refreshUi();
|
||||||
}
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -119,6 +125,24 @@ public class AlarmsAndRemindersDetails extends AppInfoWithHeader
|
|||||||
newState ? 1 : 0);
|
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
|
@Override
|
||||||
protected boolean refreshUi() {
|
protected boolean refreshUi() {
|
||||||
if (mPackageInfo == null || mPackageInfo.applicationInfo == null) {
|
if (mPackageInfo == null || mPackageInfo.applicationInfo == null) {
|
||||||
@@ -127,7 +151,8 @@ public class AlarmsAndRemindersDetails extends AppInfoWithHeader
|
|||||||
mPermissionState = mAppBridge.createPermissionState(mPackageName,
|
mPermissionState = mAppBridge.createPermissionState(mPackageName,
|
||||||
mPackageInfo.applicationInfo.uid);
|
mPackageInfo.applicationInfo.uid);
|
||||||
mSwitchPref.setEnabled(mPermissionState.shouldBeVisible());
|
mSwitchPref.setEnabled(mPermissionState.shouldBeVisible());
|
||||||
mSwitchPref.setChecked(mPermissionState.isAllowed());
|
mSwitchPref.setChecked(
|
||||||
|
mUncommittedState != null ? mUncommittedState : mPermissionState.isAllowed());
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user