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