diff options
7 files changed, 45 insertions, 5 deletions
diff --git a/packages/SystemUI/res/values/config.xml b/packages/SystemUI/res/values/config.xml index b31dc50be5d1..c61b1d2c094c 100644 --- a/packages/SystemUI/res/values/config.xml +++ b/packages/SystemUI/res/values/config.xml @@ -461,5 +461,7 @@ <bool name="config_pipEnableDismissDragToEdge">true</bool> <!-- SystemUI Plugins that can be loaded on user builds. --> - <string-array name="config_pluginWhitelist" translatable="false" /> + <string-array name="config_pluginWhitelist" translatable="false"> + <item>com.android.systemui</item> + </string-array> </resources> diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java index 8cc6091f52f5..8e7fadb5c7cb 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java @@ -158,6 +158,10 @@ public class PluginInstanceManager<T extends Plugin> { // If a plugin is detected in the stack of a crash then this will be called for that // plugin, if the plugin causing a crash cannot be identified, they are all disabled // assuming one of them must be bad. + if (mWhitelistedPlugins.contains(info.mPackage)) { + // Don't disable whitelisted plugins as they are a part of the OS. + return; + } Log.w(TAG, "Disabling plugin " + info.mPackage + "/" + info.mClass); mManager.getPluginEnabler().setEnabled(new ComponentName(info.mPackage, info.mClass), false); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java index 208f4fedfe27..3f907a8aa348 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java @@ -27,6 +27,8 @@ public interface PluginManager { // must be one of the channels created in NotificationChannels.java String NOTIFICATION_CHANNEL_ID = "ALR"; + String[] getWhitelistedPlugins(); + <T extends Plugin> T getOneShotPlugin(Class<T> cls); <T extends Plugin> T getOneShotPlugin(String action, Class<?> cls); diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java index 82e8b3e48cfc..dc2a9bd5105b 100644 --- a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java @@ -210,6 +210,10 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage Uri uri = intent.getData(); ComponentName component = ComponentName.unflattenFromString( uri.toString().substring(10)); + if (mWhitelistedPlugins.contains(component.getPackageName())) { + // Don't disable whitelisted plugins as they are a part of the OS. + return; + } getPluginEnabler().setEnabled(component, false); mContext.getSystemService(NotificationManager.class).cancel(component.getClassName(), SystemMessage.NOTE_PLUGIN); diff --git a/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java index 0826054f3740..ecb830c48ccc 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java @@ -29,6 +29,8 @@ import android.util.ArrayMap; import android.util.ArraySet; import android.view.View; +import com.android.internal.util.ArrayUtils; +import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.PluginEnablerImpl; import com.android.systemui.shared.plugins.PluginEnabler; @@ -77,6 +79,7 @@ public class PluginFragment extends PreferenceFragment { } private void loadPrefs() { + PluginManager manager = Dependency.get(PluginManager.class); PreferenceScreen screen = getPreferenceManager().createPreferenceScreen(getContext()); screen.setOrderingAsAdded(false); Context prefContext = getPreferenceManager().getContext(); @@ -103,6 +106,10 @@ public class PluginFragment extends PreferenceFragment { PackageManager.MATCH_DISABLED_COMPONENTS | PackageManager.GET_SERVICES); apps.forEach(app -> { if (!plugins.containsKey(app.packageName)) return; + if (ArrayUtils.contains(manager.getWhitelistedPlugins(), app.packageName)) { + // Don't manage whitelisted plugins, they are part of the OS. + return; + } SwitchPreference pref = new PluginPreference(prefContext, app, mPluginEnabler); pref.setSummary("Plugins: " + toString(plugins.get(app.packageName))); screen.addPreference(pref); diff --git a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java index 5bf60400089b..5cc3b3c7823b 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java @@ -22,6 +22,7 @@ import static org.mockito.Matchers.anyInt; import static org.mockito.Matchers.eq; import static org.mockito.Mockito.doThrow; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; @@ -122,7 +123,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase { waitForIdleSync(mPluginInstanceManager.mPluginHandler); waitForIdleSync(mPluginInstanceManager.mMainHandler); - verify(mMockListener, Mockito.never()).onPluginConnected(any(), any()); + verify(mMockListener, never()).onPluginConnected(any(), any()); } @Test @@ -162,7 +163,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase { waitForIdleSync(mPluginInstanceManager.mMainHandler); // Plugin shouldn't be connected because it is the wrong version. - verify(mMockListener, Mockito.never()).onPluginConnected(any(), any()); + verify(mMockListener, never()).onPluginConnected(any(), any()); verify(nm).notifyAsUser(eq(TestPlugin.class.getName()), eq(SystemMessage.NOTE_PLUGIN), any(), eq(UserHandle.ALL)); } @@ -200,7 +201,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase { waitForIdleSync(mPluginInstanceManager.mMainHandler);; // Non-debuggable build should receive no plugins. - verify(mMockListener, Mockito.never()).onPluginConnected(any(), any()); + verify(mMockListener, never()).onPluginConnected(any(), any()); } @Test @@ -229,7 +230,7 @@ public class PluginInstanceManagerTest extends SysuiTestCase { // Start with an unrelated class. boolean result = mPluginInstanceManager.checkAndDisable(Activity.class.getName()); assertFalse(result); - verify(mMockPm, Mockito.never()).setComponentEnabledSetting( + verify(mMockPm, never()).setComponentEnabledSetting( ArgumentCaptor.forClass(ComponentName.class).capture(), ArgumentCaptor.forClass(int.class).capture(), ArgumentCaptor.forClass(int.class).capture()); @@ -255,6 +256,21 @@ public class PluginInstanceManagerTest extends SysuiTestCase { ArgumentCaptor.forClass(int.class).capture()); } + @Test + public void testDisableWhitelisted() throws Exception { + mPluginInstanceManager = new PluginInstanceManager(mContextWrapper, mMockPm, "myAction", + mMockListener, true, mHandlerThread.getLooper(), mMockVersionInfo, + mMockManager, false, new String[] {WHITELISTED_PACKAGE}); + createPlugin(); // Get into valid created state. + + mPluginInstanceManager.disableAll(); + + verify(mMockPm, never()).setComponentEnabledSetting( + ArgumentCaptor.forClass(ComponentName.class).capture(), + ArgumentCaptor.forClass(int.class).capture(), + ArgumentCaptor.forClass(int.class).capture()); + } + private void setupFakePmQuery() throws Exception { List<ResolveInfo> list = new ArrayList<>(); ResolveInfo info = new ResolveInfo(); diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java index 5f54bceb6b9b..6d1e6ce9ea33 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/FakePluginManager.java @@ -62,6 +62,11 @@ public class FakePluginManager implements PluginManager { } @Override + public String[] getWhitelistedPlugins() { + return new String[0]; + } + + @Override public <T extends Plugin> T getOneShotPlugin(Class<T> cls) { return null; } |