Don't send PLUGIN_CHANGED broadcast unless something changed

If a plugin changes the layout (e.g., CameraCutout changing status bar
height), the preference screen will call persistBoolean, which would
always cause PLUGIN_CHANGED to be broadcasted. This causes bad infinite
loops.

Test: install CameraCutout plugin and navigate to Settings > Sysui tuner
> Plugins and watch it loop a lot

Change-Id: Id340bbfb0864508f1895bbd1e6cb2849a839bad8
This commit is contained in:
Evan Laird
2017-11-09 15:53:01 -05:00
parent fde6ea8d29
commit 8ab04d4c84

View File

@@ -169,16 +169,23 @@ public class PluginFragment extends PreferenceFragment {
protected boolean persistBoolean(boolean value) {
final int desiredState = value ? PackageManager.COMPONENT_ENABLED_STATE_ENABLED
: PackageManager.COMPONENT_ENABLED_STATE_DISABLED;
boolean shouldSendBroadcast = false;
for (int i = 0; i < mInfo.services.length; i++) {
ComponentName componentName = new ComponentName(mInfo.packageName,
mInfo.services[i].name);
mPm.setComponentEnabledSetting(componentName, desiredState,
PackageManager.DONT_KILL_APP);
if (mPm.getComponentEnabledSetting(componentName) != desiredState) {
mPm.setComponentEnabledSetting(componentName, desiredState,
PackageManager.DONT_KILL_APP);
shouldSendBroadcast = true;
}
}
if (shouldSendBroadcast) {
final String pkg = mInfo.packageName;
final Intent intent = new Intent(PluginManager.PLUGIN_CHANGED,
pkg != null ? Uri.fromParts("package", pkg, null) : null);
getContext().sendBroadcast(intent);
}
final String pkg = mInfo.packageName;
final Intent intent = new Intent(PluginManager.PLUGIN_CHANGED,
pkg != null ? Uri.fromParts("package", pkg, null) : null);
getContext().sendBroadcast(intent);
return true;
}