From 023cb195be427ebd02e06d1d7e27f4cfff121399 Mon Sep 17 00:00:00 2001 From: Tony Wickham Date: Thu, 13 Sep 2018 15:23:04 -0700 Subject: [PATCH] Move plugin support to shared lib In addition to changing imports, this required some changes to use java 7, since that's what the shared lib needs to be for launcher. See bug for more details on this project. Test: "atest com.android.systemui.shared.plugins" build succeeds and all tests pass Bug: 115877296 Change-Id: Ib79ede0a61664df0ba1a194632a345d2229777fc --- packages/SystemUI/shared/Android.bp | 4 ++ .../shared/plugins/PluginInitializer.java | 34 +++++++++++++ .../plugins/PluginInstanceManager.java | 19 +++---- .../shared}/plugins/PluginManager.java | 23 +++++---- .../shared}/plugins/PluginManagerImpl.java | 51 +++++++++++-------- .../systemui/shared}/plugins/PluginPrefs.java | 2 +- .../systemui/shared}/plugins/VersionInfo.java | 47 ++++++++++------- .../android/keyguard/KeyguardClockSwitch.java | 2 +- .../src/com/android/systemui/Dependency.java | 7 +-- .../systemui/PluginInflateContainer.java | 2 +- .../android/systemui/SystemUIApplication.java | 2 +- .../com/android/systemui/SystemUIService.java | 4 +- .../android/systemui/doze/DozeService.java | 2 +- .../plugins/PluginDependencyProvider.java | 1 + .../plugins/PluginInitializerImpl.java | 47 +++++++++++++++++ .../com/android/systemui/qs/QSTileHost.java | 2 +- .../row/ExpandableNotificationRow.java | 2 +- .../phone/NavigationBarInflaterView.java | 2 +- .../statusbar/phone/NavigationBarView.java | 4 +- .../NotificationListenerWithPlugins.java | 2 +- .../policy/ExtensionControllerImpl.java | 4 +- .../systemui/tuner/PluginFragment.java | 7 ++- .../android/systemui/tuner/TunerFragment.java | 2 +- .../keyguard/KeyguardClockSwitchTest.java | 2 +- .../plugins/PluginInstanceManagerTest.java | 8 +-- .../plugins/PluginManagerTest.java | 34 ++++++++++--- .../{ => shared}/plugins/VersionInfoTest.java | 5 +- .../policy/ExtensionControllerImplTest.java | 2 +- .../utils/leaks/FakePluginManager.java | 3 +- .../systemui/utils/leaks/LeakCheckedTest.java | 2 +- 30 files changed, 229 insertions(+), 99 deletions(-) create mode 100644 packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInitializer.java rename packages/SystemUI/{src/com/android/systemui => shared/src/com/android/systemui/shared}/plugins/PluginInstanceManager.java (96%) rename packages/SystemUI/{src/com/android/systemui => shared/src/com/android/systemui/shared}/plugins/PluginManager.java (72%) rename packages/SystemUI/{src/com/android/systemui => shared/src/com/android/systemui/shared}/plugins/PluginManagerImpl.java (90%) rename packages/SystemUI/{src/com/android/systemui => shared/src/com/android/systemui/shared}/plugins/PluginPrefs.java (97%) rename packages/SystemUI/{src/com/android/systemui => shared/src/com/android/systemui/shared}/plugins/VersionInfo.java (75%) create mode 100644 packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java rename packages/SystemUI/tests/src/com/android/systemui/{ => shared}/plugins/PluginInstanceManagerTest.java (97%) rename packages/SystemUI/tests/src/com/android/systemui/{ => shared}/plugins/PluginManagerTest.java (87%) rename packages/SystemUI/tests/src/com/android/systemui/{ => shared}/plugins/VersionInfoTest.java (95%) diff --git a/packages/SystemUI/shared/Android.bp b/packages/SystemUI/shared/Android.bp index 710b5f724add4..defc49b5fac16 100644 --- a/packages/SystemUI/shared/Android.bp +++ b/packages/SystemUI/shared/Android.bp @@ -20,6 +20,10 @@ android_library { "src/**/I*.aidl", ], + static_libs: [ + "SystemUIPluginLib" + ], + // Enforce that the library is build agains java 7 so that there are // no compatibility issues with launcher java_version: "1.7", diff --git a/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInitializer.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInitializer.java new file mode 100644 index 0000000000000..9857894153639 --- /dev/null +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInitializer.java @@ -0,0 +1,34 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.shared.plugins; + +import android.content.Context; +import android.os.Looper; + +/** + * Provides necessary components for initializing {@link PluginManagerImpl}. + */ +public interface PluginInitializer { + + Looper getBgLooper(); + + /** + * This Runnable is run on the bg looper during initialization of {@link PluginManagerImpl}. + * It can be null. + */ + Runnable getBgInitCallback(); + + String[] getWhitelistedPlugins(Context context); +} diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java similarity index 96% rename from packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java index 7bc7e5f0095e3..e80c079f60dee 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginInstanceManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginInstanceManager.java @@ -12,7 +12,7 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import android.app.Notification; import android.app.Notification.Action; @@ -39,12 +39,14 @@ import android.view.LayoutInflater; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; -import com.android.systemui.plugins.VersionInfo.InvalidVersionException; +import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginFragment; +import com.android.systemui.plugins.PluginListener; +import com.android.systemui.shared.plugins.VersionInfo.InvalidVersionException; import java.util.ArrayList; import java.util.Arrays; import java.util.List; -import com.android.systemui.R; public class PluginInstanceManager { @@ -71,8 +73,7 @@ public class PluginInstanceManager { PluginInstanceManager(Context context, String action, PluginListener listener, boolean allowMultiple, Looper looper, VersionInfo version, PluginManagerImpl manager) { this(context, context.getPackageManager(), action, listener, allowMultiple, looper, version, - manager, Build.IS_DEBUGGABLE, - context.getResources().getStringArray(R.array.config_pluginWhitelist)); + manager, Build.IS_DEBUGGABLE, manager.getWhitelistedPlugins()); } @VisibleForTesting @@ -114,7 +115,7 @@ public class PluginInstanceManager { public void destroy() { if (DEBUG) Log.d(TAG, "stopListening"); - ArrayList plugins = new ArrayList<>(mPluginHandler.mPlugins); + ArrayList plugins = new ArrayList(mPluginHandler.mPlugins); for (PluginInfo plugin : plugins) { mMainHandler.obtainMessage(MainHandler.PLUGIN_DISCONNECTED, plugin.mPlugin).sendToTarget(); @@ -132,7 +133,7 @@ public class PluginInstanceManager { public boolean checkAndDisable(String className) { boolean disableAny = false; - ArrayList plugins = new ArrayList<>(mPluginHandler.mPlugins); + ArrayList plugins = new ArrayList(mPluginHandler.mPlugins); for (PluginInfo info : plugins) { if (className.startsWith(info.mPackage)) { disable(info); @@ -143,7 +144,7 @@ public class PluginInstanceManager { } public boolean disableAll() { - ArrayList plugins = new ArrayList<>(mPluginHandler.mPlugins); + ArrayList plugins = new ArrayList(mPluginHandler.mPlugins); for (int i = 0; i < plugins.size(); i++) { disable(plugins.get(i)); } @@ -165,7 +166,7 @@ public class PluginInstanceManager { } public boolean dependsOn(Plugin p, Class cls) { - ArrayList plugins = new ArrayList<>(mPluginHandler.mPlugins); + ArrayList plugins = new ArrayList(mPluginHandler.mPlugins); for (PluginInfo info : plugins) { if (info.mPlugin.getClass().getName().equals(p.getClass().getName())) { return info.mVersion != null && info.mVersion.hasClass(cls); diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManager.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java similarity index 72% rename from packages/SystemUI/src/com/android/systemui/plugins/PluginManager.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java index 298eaf18dce54..208f4fedfe272 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManager.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManager.java @@ -12,10 +12,12 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import android.text.TextUtils; +import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.annotations.ProvidesInterface; public interface PluginManager { @@ -40,14 +42,17 @@ public interface PluginManager { boolean dependsOn(Plugin p, Class cls); - static

String getAction(Class

cls) { - ProvidesInterface info = cls.getDeclaredAnnotation(ProvidesInterface.class); - if (info == null) { - throw new RuntimeException(cls + " doesn't provide an interface"); + class Helper { + public static

String getAction(Class

cls) { + ProvidesInterface info = cls.getDeclaredAnnotation(ProvidesInterface.class); + if (info == null) { + throw new RuntimeException(cls + " doesn't provide an interface"); + } + if (TextUtils.isEmpty(info.action())) { + throw new RuntimeException(cls + " doesn't provide an action"); + } + return info.action(); } - if (TextUtils.isEmpty(info.action())) { - throw new RuntimeException(cls + " doesn't provide an action"); - } - return info.action(); } + } diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java similarity index 90% rename from packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java index 1cbf1fe0f2c47..7f1d161123f2b 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginManagerImpl.java @@ -12,7 +12,7 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import android.app.Notification; import android.app.Notification.Action; @@ -41,10 +41,11 @@ import android.widget.Toast; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; -import com.android.systemui.Dependency; -import com.android.systemui.R; -import com.android.systemui.plugins.PluginInstanceManager.PluginContextWrapper; -import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; + +import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginListener; +import com.android.systemui.shared.plugins.PluginInstanceManager.PluginContextWrapper; +import com.android.systemui.shared.plugins.PluginInstanceManager.PluginInfo; import com.android.systemui.plugins.annotations.ProvidesInterface; import dalvik.system.PathClassLoader; @@ -79,31 +80,33 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage private Looper mLooper; private boolean mWtfsSet; - public PluginManagerImpl(Context context) { + public PluginManagerImpl(Context context, PluginInitializer initializer) { this(context, new PluginInstanceManagerFactory(), Build.IS_DEBUGGABLE, - context.getResources().getStringArray(R.array.config_pluginWhitelist), - Thread.getUncaughtExceptionPreHandler()); + Thread.getUncaughtExceptionPreHandler(), initializer); } @VisibleForTesting PluginManagerImpl(Context context, PluginInstanceManagerFactory factory, boolean debuggable, - String[] whitelistedPlugins, UncaughtExceptionHandler defaultHandler) { + UncaughtExceptionHandler defaultHandler, PluginInitializer initializer) { mContext = context; mFactory = factory; - mLooper = Dependency.get(Dependency.BG_LOOPER); + mLooper = initializer.getBgLooper(); isDebuggable = debuggable; - mWhitelistedPlugins.addAll(Arrays.asList(whitelistedPlugins)); + mWhitelistedPlugins.addAll(Arrays.asList(initializer.getWhitelistedPlugins(mContext))); mPluginPrefs = new PluginPrefs(mContext); PluginExceptionHandler uncaughtExceptionHandler = new PluginExceptionHandler( defaultHandler); Thread.setUncaughtExceptionPreHandler(uncaughtExceptionHandler); - new Handler(mLooper).post(() -> { - // Plugin dependencies that don't have another good home can go here, but - // dependencies that have better places to init can happen elsewhere. - Dependency.get(PluginDependencyProvider.class) - .allowPluginDependency(ActivityStarter.class); - }); + + Runnable bgRunnable = initializer.getBgInitCallback(); + if (bgRunnable != null) { + new Handler(mLooper).post(bgRunnable); + } + } + + public String[] getWhitelistedPlugins() { + return mWhitelistedPlugins.toArray(new String[0]); } public T getOneShotPlugin(Class cls) { @@ -121,7 +124,9 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage if (Looper.myLooper() != Looper.getMainLooper()) { throw new RuntimeException("Must be called from UI thread"); } - PluginInstanceManager p = mFactory.createPluginInstanceManager(mContext, action, null, + // Passing null causes compiler to complain about incompatible (generic) types. + PluginListener dummy = null; + PluginInstanceManager p = mFactory.createPluginInstanceManager(mContext, action, dummy, false, mLooper, cls, this); mPluginPrefs.addAction(action); PluginInfo info = p.getPlugin(); @@ -140,7 +145,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage public void addPluginListener(PluginListener listener, Class cls, boolean allowMultiple) { - addPluginListener(PluginManager.getAction(cls), listener, cls, allowMultiple); + addPluginListener(PluginManager.Helper.getAction(cls), listener, cls, allowMultiple); } public void addPluginListener(String action, PluginListener listener, @@ -293,8 +298,12 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage public void handleWtfs() { if (!mWtfsSet) { mWtfsSet = true; - Log.setWtfHandler((tag, what, system) -> { - throw new CrashWhilePluginActiveException(what); + Log.setWtfHandler(new Log.TerribleFailureHandler() { + @Override + public void onTerribleFailure(String tag, Log.TerribleFailure what, + boolean system) { + throw new CrashWhilePluginActiveException(what); + } }); } } diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginPrefs.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginPrefs.java similarity index 97% rename from packages/SystemUI/src/com/android/systemui/plugins/PluginPrefs.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginPrefs.java index 3671b3c1689f1..c0c5d7051cea2 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginPrefs.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/PluginPrefs.java @@ -12,7 +12,7 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import android.content.Context; import android.content.SharedPreferences; diff --git a/packages/SystemUI/src/com/android/systemui/plugins/VersionInfo.java b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/VersionInfo.java similarity index 75% rename from packages/SystemUI/src/com/android/systemui/plugins/VersionInfo.java rename to packages/SystemUI/shared/src/com/android/systemui/shared/plugins/VersionInfo.java index facfd982408af..bb845cd879238 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/VersionInfo.java +++ b/packages/SystemUI/shared/src/com/android/systemui/shared/plugins/VersionInfo.java @@ -12,7 +12,9 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; + +import android.util.ArrayMap; import com.android.systemui.plugins.annotations.Dependencies; import com.android.systemui.plugins.annotations.DependsOn; @@ -20,7 +22,7 @@ import com.android.systemui.plugins.annotations.ProvidesInterface; import com.android.systemui.plugins.annotations.Requirements; import com.android.systemui.plugins.annotations.Requires; -import android.util.ArrayMap; +import java.util.function.BiConsumer; public class VersionInfo { @@ -73,25 +75,32 @@ public class VersionInfo { } public void checkVersion(VersionInfo plugin) throws InvalidVersionException { - ArrayMap, Version> versions = new ArrayMap<>(mVersions); - plugin.mVersions.forEach((aClass, version) -> { - Version v = versions.remove(aClass); - if (v == null) { - v = createVersion(aClass); - } - if (v == null) { - throw new InvalidVersionException(aClass.getSimpleName() - + " does not provide an interface", false); - } - if (v.mVersion != version.mVersion) { - throw new InvalidVersionException(aClass, v.mVersion < version.mVersion, v.mVersion, - version.mVersion); + final ArrayMap, Version> versions = new ArrayMap<>(mVersions); + plugin.mVersions.forEach(new BiConsumer, Version>() { + @Override + public void accept(Class aClass, Version version) { + Version v = versions.remove(aClass); + if (v == null) { + v = VersionInfo.this.createVersion(aClass); + } + if (v == null) { + throw new InvalidVersionException(aClass.getSimpleName() + + " does not provide an interface", false); + } + if (v.mVersion != version.mVersion) { + throw new InvalidVersionException(aClass, v.mVersion < version.mVersion, + v.mVersion, + version.mVersion); + } } }); - versions.forEach((aClass, version) -> { - if (version.mRequired) { - throw new InvalidVersionException("Missing required dependency " - + aClass.getSimpleName(), false); + versions.forEach(new BiConsumer, Version>() { + @Override + public void accept(Class aClass, Version version) { + if (version.mRequired) { + throw new InvalidVersionException("Missing required dependency " + + aClass.getSimpleName(), false); + } } }); } diff --git a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java index 5bbbc52f4cbc7..28eff46db1d03 100644 --- a/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java +++ b/packages/SystemUI/src/com/android/keyguard/KeyguardClockSwitch.java @@ -14,7 +14,7 @@ import androidx.annotation.VisibleForTesting; import com.android.systemui.Dependency; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; /** * Switch to show plugin clock when plugin is connected, otherwise it will show default clock. diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java index b2cf305d0533e..fe1fe1aba908f 100644 --- a/packages/SystemUI/src/com/android/systemui/Dependency.java +++ b/packages/SystemUI/src/com/android/systemui/Dependency.java @@ -39,9 +39,10 @@ import com.android.systemui.fragments.FragmentService; import com.android.systemui.keyguard.ScreenLifecycle; import com.android.systemui.keyguard.WakefulnessLifecycle; import com.android.systemui.plugins.ActivityStarter; +import com.android.systemui.plugins.PluginInitializerImpl; import com.android.systemui.plugins.PluginDependencyProvider; -import com.android.systemui.plugins.PluginManager; -import com.android.systemui.plugins.PluginManagerImpl; +import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManagerImpl; import com.android.systemui.plugins.VolumeDialogController; import com.android.systemui.power.EnhancedEstimates; import com.android.systemui.power.EnhancedEstimatesImpl; @@ -236,7 +237,7 @@ public class Dependency extends SystemUI { new DeviceProvisionedControllerImpl(mContext)); mProviders.put(PluginManager.class, () -> - new PluginManagerImpl(mContext)); + new PluginManagerImpl(mContext, new PluginInitializerImpl())); mProviders.put(AssistManager.class, () -> new AssistManager(getDependency(DeviceProvisionedController.class), mContext)); diff --git a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java index ddd48330e6791..f6ad62616a962 100644 --- a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java +++ b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java @@ -21,7 +21,7 @@ import android.util.Log; import android.view.View; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.plugins.ViewProvider; /** diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java index b96a6049421b6..78053b28c4c3f 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java @@ -34,7 +34,7 @@ import android.util.TimingsTraceLog; import com.android.systemui.plugins.OverlayPlugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.phone.StatusBar; import com.android.systemui.statusbar.phone.StatusBarWindowController; import com.android.systemui.util.NotificationChannels; diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIService.java b/packages/SystemUI/src/com/android/systemui/SystemUIService.java index bb82a54c12f1f..8e29841e887d9 100644 --- a/packages/SystemUI/src/com/android/systemui/SystemUIService.java +++ b/packages/SystemUI/src/com/android/systemui/SystemUIService.java @@ -28,8 +28,8 @@ import java.io.FileDescriptor; import java.io.PrintWriter; import com.android.internal.os.BinderInternal; -import com.android.systemui.plugins.PluginManager; -import com.android.systemui.plugins.PluginManagerImpl; +import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManagerImpl; public class SystemUIService extends Service { diff --git a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java index 73393047cc455..c61e10aa77ab3 100644 --- a/packages/SystemUI/src/com/android/systemui/doze/DozeService.java +++ b/packages/SystemUI/src/com/android/systemui/doze/DozeService.java @@ -26,7 +26,7 @@ import com.android.systemui.Dependency; import com.android.systemui.plugins.DozeServicePlugin; import com.android.systemui.plugins.DozeServicePlugin.RequestDoze; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import java.io.FileDescriptor; import java.io.PrintWriter; diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginDependencyProvider.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginDependencyProvider.java index c58d889270e27..03daa95567ee5 100644 --- a/packages/SystemUI/src/com/android/systemui/plugins/PluginDependencyProvider.java +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginDependencyProvider.java @@ -18,6 +18,7 @@ import android.util.ArrayMap; import com.android.systemui.Dependency; import com.android.systemui.plugins.PluginDependency.DependencyProvider; +import com.android.systemui.shared.plugins.PluginManager; public class PluginDependencyProvider extends DependencyProvider { diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java new file mode 100644 index 0000000000000..108c2d05d76c3 --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginInitializerImpl.java @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2018 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file + * except in compliance with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software distributed under the + * License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the specific language governing + * permissions and limitations under the License. + */ + +package com.android.systemui.plugins; + +import android.content.Context; +import android.os.Looper; + +import com.android.systemui.Dependency; +import com.android.systemui.shared.plugins.PluginInitializer; +import com.android.systemui.R; + +public class PluginInitializerImpl implements PluginInitializer { + @Override + public Looper getBgLooper() { + return Dependency.get(Dependency.BG_LOOPER); + } + + @Override + public Runnable getBgInitCallback() { + return new Runnable() { + @Override + public void run() { + // Plugin dependencies that don't have another good home can go here, but + // dependencies that have better places to init can happen elsewhere. + Dependency.get(PluginDependencyProvider.class) + .allowPluginDependency(ActivityStarter.class); + } + }; + } + + @Override + public String[] getWhitelistedPlugins(Context context) { + return context.getResources().getStringArray(R.array.config_pluginWhitelist); + } +} diff --git a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java index 86e69e34fb9ed..cefeeb5269682 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java +++ b/packages/SystemUI/src/com/android/systemui/qs/QSTileHost.java @@ -31,7 +31,7 @@ import android.util.Log; import com.android.systemui.Dependency; import com.android.systemui.R; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.plugins.qs.QSFactory; import com.android.systemui.plugins.qs.QSTileView; import com.android.systemui.plugins.qs.QSTile; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java index 9b1d334c614d0..bce613a338593 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/ExpandableNotificationRow.java @@ -72,7 +72,7 @@ import com.android.systemui.Interpolators; import com.android.systemui.R; import com.android.systemui.classifier.FalsingManager; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin; import com.android.systemui.plugins.statusbar.NotificationMenuRowPlugin.MenuItem; import com.android.systemui.statusbar.notification.NotificationData; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java index e6f2c33c33d22..52134d9d713c9 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarInflaterView.java @@ -37,7 +37,7 @@ import com.android.systemui.Dependency; import com.android.systemui.OverviewProxyService; import com.android.systemui.R; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.plugins.statusbar.phone.NavBarButtonProvider; import com.android.systemui.statusbar.phone.ReverseLinearLayout.ReverseRelativeLayout; import com.android.systemui.statusbar.policy.KeyButtonView; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java index e5c910069f824..b9e312a72087d 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NavigationBarView.java @@ -40,7 +40,6 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.os.SystemProperties; -import androidx.annotation.ColorInt; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; @@ -64,12 +63,11 @@ import com.android.systemui.R; import com.android.systemui.RecentsComponent; import com.android.systemui.SysUiServiceProvider; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.plugins.statusbar.phone.NavGesture; import com.android.systemui.plugins.statusbar.phone.NavGesture.GestureHelper; import com.android.systemui.recents.Recents; import com.android.systemui.recents.RecentsOnboarding; -import com.android.systemui.shared.recents.IOverviewProxy; import com.android.systemui.shared.system.ActivityManagerWrapper; import com.android.systemui.shared.system.NavigationBarCompat; import com.android.systemui.shared.system.WindowManagerWrapper; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java index 9ff907b175643..9e561d13f347c 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/NotificationListenerWithPlugins.java @@ -24,7 +24,7 @@ import com.android.systemui.Dependency; import com.android.systemui.plugins.NotificationListenerController; import com.android.systemui.plugins.NotificationListenerController.NotificationProvider; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import java.util.ArrayList; diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java index 6d75cfcb38f30..a6146a625193f 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java +++ b/packages/SystemUI/src/com/android/systemui/statusbar/policy/ExtensionControllerImpl.java @@ -22,7 +22,7 @@ import android.util.ArrayMap; import com.android.systemui.Dependency; import com.android.systemui.plugins.Plugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.tuner.TunerService; import com.android.systemui.tuner.TunerService.Tunable; @@ -71,7 +71,7 @@ public class ExtensionControllerImpl implements ExtensionController { @Override public

ExtensionController.ExtensionBuilder withPlugin(Class

cls) { - return withPlugin(cls, PluginManager.getAction(cls)); + return withPlugin(cls, PluginManager.Helper.getAction(cls)); } @Override diff --git a/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java index c2948060d6bf5..71414a2667242 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/PluginFragment.java @@ -34,11 +34,10 @@ import android.util.ArraySet; import android.view.View; import com.android.systemui.R; -import com.android.systemui.plugins.PluginInstanceManager; -import com.android.systemui.plugins.PluginManager; -import com.android.systemui.plugins.PluginPrefs; +import com.android.systemui.shared.plugins.PluginInstanceManager; +import com.android.systemui.shared.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginPrefs; -import java.util.ArrayList; import java.util.List; import java.util.Set; diff --git a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java index 088630fa3f565..5aa303530ae57 100644 --- a/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java +++ b/packages/SystemUI/src/com/android/systemui/tuner/TunerFragment.java @@ -32,7 +32,7 @@ import com.android.internal.hardware.AmbientDisplayConfiguration; import com.android.internal.logging.MetricsLogger; import com.android.internal.logging.nano.MetricsProto.MetricsEvent; import com.android.systemui.R; -import com.android.systemui.plugins.PluginPrefs; +import com.android.systemui.shared.plugins.PluginPrefs; public class TunerFragment extends PreferenceFragment { diff --git a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java index e6e485740a7b4..62ca3f34bd482 100644 --- a/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java +++ b/packages/SystemUI/tests/src/com/android/keyguard/KeyguardClockSwitchTest.java @@ -40,7 +40,7 @@ import android.widget.TextClock; import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.ClockPlugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import org.junit.Before; import org.junit.Test; diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java similarity index 97% rename from packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java rename to packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java index 19974f8fc7106..6d1ff8c06acf6 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginInstanceManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginInstanceManagerTest.java @@ -12,7 +12,7 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import static junit.framework.Assert.assertFalse; import static junit.framework.Assert.assertNotNull; @@ -27,8 +27,10 @@ import static org.mockito.Mockito.when; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; -import com.android.systemui.plugins.VersionInfo.InvalidVersionException; +import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginListener; +import com.android.systemui.shared.plugins.PluginInstanceManager.PluginInfo; +import com.android.systemui.shared.plugins.VersionInfo.InvalidVersionException; import com.android.systemui.plugins.annotations.Requires; import org.junit.After; diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java similarity index 87% rename from packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java rename to packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java index 438f9e49699ba..3c7020569db42 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/PluginManagerTest.java @@ -11,7 +11,7 @@ * KIND, either express or implied. See the License for the specific language governing * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; @@ -27,6 +27,7 @@ import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.net.Uri; +import android.support.test.runner.AndroidJUnit4; import android.test.suitebuilder.annotation.SmallTest; import android.testing.AndroidTestingRunner; import android.testing.TestableLooper; @@ -35,9 +36,12 @@ import android.testing.TestableLooper.RunWithLooper; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.systemui.Dependency; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.PluginInstanceManager.PluginInfo; -import com.android.systemui.plugins.PluginManagerImpl.PluginInstanceManagerFactory; +import com.android.systemui.plugins.Plugin; +import com.android.systemui.plugins.PluginInitializerImpl; +import com.android.systemui.plugins.PluginListener; import com.android.systemui.plugins.annotations.ProvidesInterface; +import com.android.systemui.shared.plugins.PluginInstanceManager.PluginInfo; +import com.android.systemui.shared.plugins.PluginManagerImpl.PluginInstanceManagerFactory; import org.junit.Before; import org.junit.Test; @@ -74,8 +78,14 @@ public class PluginManagerTest extends SysuiTestCase { when(mMockFactory.createPluginInstanceManager(Mockito.any(), Mockito.any(), Mockito.any(), Mockito.anyBoolean(), Mockito.any(), Mockito.any(), Mockito.any())) .thenReturn(mMockPluginInstance); - mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, true, new String[0], - mMockExceptionHandler); + + mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, true, + mMockExceptionHandler, new PluginInitializerImpl() { + @Override + public String[] getWhitelistedPlugins(Context context) { + return new String[0]; + } + }); resetExceptionHandler(); mMockListener = mock(PluginListener.class); } @@ -109,7 +119,12 @@ public class PluginManagerTest extends SysuiTestCase { @RunWithLooper(setAsMainLooper = true) public void testNonDebuggable_noWhitelist() { mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, false, - new String[0], mMockExceptionHandler); + mMockExceptionHandler, new PluginInitializerImpl() { + @Override + public String[] getWhitelistedPlugins(Context context) { + return new String[0]; + } + }); resetExceptionHandler(); mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class); @@ -121,7 +136,12 @@ public class PluginManagerTest extends SysuiTestCase { @RunWithLooper(setAsMainLooper = true) public void testNonDebuggable_whitelistedPkg() { mPluginManager = new PluginManagerImpl(getContext(), mMockFactory, false, - new String[] {WHITELISTED_PACKAGE}, mMockExceptionHandler); + mMockExceptionHandler, new PluginInitializerImpl() { + @Override + public String[] getWhitelistedPlugins(Context context) { + return new String[] {WHITELISTED_PACKAGE}; + } + }); resetExceptionHandler(); mPluginManager.addPluginListener("myAction", mMockListener, TestPlugin.class); diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java similarity index 95% rename from packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java rename to packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java index 0b4d9b525c1b6..9bad78d2d45cd 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/plugins/VersionInfoTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/shared/plugins/VersionInfoTest.java @@ -12,7 +12,7 @@ * permissions and limitations under the License. */ -package com.android.systemui.plugins; +package com.android.systemui.shared.plugins; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; @@ -20,7 +20,8 @@ import static org.junit.Assert.assertTrue; import android.support.test.filters.SmallTest; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.VersionInfo.InvalidVersionException; +import com.android.systemui.plugins.OverlayPlugin; +import com.android.systemui.shared.plugins.VersionInfo.InvalidVersionException; import com.android.systemui.plugins.annotations.Requires; import com.android.systemui.plugins.qs.QS; import com.android.systemui.plugins.qs.DetailAdapter; diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java index b22a6468f5fa9..1cceefa7910c9 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/policy/ExtensionControllerImplTest.java @@ -33,7 +33,7 @@ import com.android.systemui.SysuiTestCase; import com.android.systemui.plugins.OverlayPlugin; import com.android.systemui.plugins.Plugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.policy.ConfigurationController.ConfigurationListener; import com.android.systemui.statusbar.policy.ExtensionController.Extension; import com.android.systemui.statusbar.policy.ExtensionController.TunerFactory; 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 0a83a896dfafe..5f54bceb6b9b7 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 @@ -14,12 +14,11 @@ package com.android.systemui.utils.leaks; -import android.content.Context; import android.testing.LeakCheck; import com.android.systemui.plugins.Plugin; import com.android.systemui.plugins.PluginListener; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; public class FakePluginManager implements PluginManager { diff --git a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/LeakCheckedTest.java b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/LeakCheckedTest.java index ecda9620f7fe4..f47912623e1fc 100644 --- a/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/LeakCheckedTest.java +++ b/packages/SystemUI/tests/src/com/android/systemui/utils/leaks/LeakCheckedTest.java @@ -20,7 +20,7 @@ import android.testing.LeakCheck; import android.util.ArrayMap; import com.android.systemui.SysuiTestCase; -import com.android.systemui.plugins.PluginManager; +import com.android.systemui.shared.plugins.PluginManager; import com.android.systemui.statusbar.phone.ManagedProfileController; import com.android.systemui.statusbar.phone.StatusBarIconController; import com.android.systemui.statusbar.policy.BatteryController;