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:
Suprabh Shukla
2021-05-06 21:39:07 -07:00
parent 7d3c283e27
commit ce53343669

View File

@@ -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;
}