Merge "Move plugin support to shared lib"

This commit is contained in:
Tony Wickham
2018-10-01 18:18:01 +00:00
committed by Android (Google) Code Review
30 changed files with 229 additions and 99 deletions

View File

@@ -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",

View File

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

View File

@@ -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<T extends Plugin> {
@@ -71,8 +73,7 @@ public class PluginInstanceManager<T extends Plugin> {
PluginInstanceManager(Context context, String action, PluginListener<T> 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<T extends Plugin> {
public void destroy() {
if (DEBUG) Log.d(TAG, "stopListening");
ArrayList<PluginInfo> plugins = new ArrayList<>(mPluginHandler.mPlugins);
ArrayList<PluginInfo> plugins = new ArrayList<PluginInfo>(mPluginHandler.mPlugins);
for (PluginInfo plugin : plugins) {
mMainHandler.obtainMessage(MainHandler.PLUGIN_DISCONNECTED,
plugin.mPlugin).sendToTarget();
@@ -132,7 +133,7 @@ public class PluginInstanceManager<T extends Plugin> {
public boolean checkAndDisable(String className) {
boolean disableAny = false;
ArrayList<PluginInfo> plugins = new ArrayList<>(mPluginHandler.mPlugins);
ArrayList<PluginInfo> plugins = new ArrayList<PluginInfo>(mPluginHandler.mPlugins);
for (PluginInfo info : plugins) {
if (className.startsWith(info.mPackage)) {
disable(info);
@@ -143,7 +144,7 @@ public class PluginInstanceManager<T extends Plugin> {
}
public boolean disableAll() {
ArrayList<PluginInfo> plugins = new ArrayList<>(mPluginHandler.mPlugins);
ArrayList<PluginInfo> plugins = new ArrayList<PluginInfo>(mPluginHandler.mPlugins);
for (int i = 0; i < plugins.size(); i++) {
disable(plugins.get(i));
}
@@ -165,7 +166,7 @@ public class PluginInstanceManager<T extends Plugin> {
}
public <T> boolean dependsOn(Plugin p, Class<T> cls) {
ArrayList<PluginInfo> plugins = new ArrayList<>(mPluginHandler.mPlugins);
ArrayList<PluginInfo> plugins = new ArrayList<PluginInfo>(mPluginHandler.mPlugins);
for (PluginInfo info : plugins) {
if (info.mPlugin.getClass().getName().equals(p.getClass().getName())) {
return info.mVersion != null && info.mVersion.hasClass(cls);

View File

@@ -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 {
<T> boolean dependsOn(Plugin p, Class<T> cls);
static <P> String getAction(Class<P> cls) {
ProvidesInterface info = cls.getDeclaredAnnotation(ProvidesInterface.class);
if (info == null) {
throw new RuntimeException(cls + " doesn't provide an interface");
class Helper {
public static <P> String getAction(Class<P> 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();
}
}

View File

@@ -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 extends Plugin> T getOneShotPlugin(Class<T> 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<T> p = mFactory.createPluginInstanceManager(mContext, action, null,
// Passing null causes compiler to complain about incompatible (generic) types.
PluginListener<Plugin> dummy = null;
PluginInstanceManager<T> p = mFactory.createPluginInstanceManager(mContext, action, dummy,
false, mLooper, cls, this);
mPluginPrefs.addAction(action);
PluginInfo<T> info = p.getPlugin();
@@ -140,7 +145,7 @@ public class PluginManagerImpl extends BroadcastReceiver implements PluginManage
public <T extends Plugin> void addPluginListener(PluginListener<T> listener, Class<?> cls,
boolean allowMultiple) {
addPluginListener(PluginManager.getAction(cls), listener, cls, allowMultiple);
addPluginListener(PluginManager.Helper.getAction(cls), listener, cls, allowMultiple);
}
public <T extends Plugin> void addPluginListener(String action, PluginListener<T> 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);
}
});
}
}

View File

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

View File

@@ -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<Class<?>, 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<Class<?>, Version> versions = new ArrayMap<>(mVersions);
plugin.mVersions.forEach(new BiConsumer<Class<?>, 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<Class<?>, Version>() {
@Override
public void accept(Class<?> aClass, Version version) {
if (version.mRequired) {
throw new InvalidVersionException("Missing required dependency "
+ aClass.getSimpleName(), false);
}
}
});
}

View File

@@ -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.

View File

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

View File

@@ -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;
/**

View File

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

View File

@@ -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 {

View File

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

View File

@@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 <P extends T> ExtensionController.ExtensionBuilder<T> withPlugin(Class<P> cls) {
return withPlugin(cls, PluginManager.getAction(cls));
return withPlugin(cls, PluginManager.Helper.getAction(cls));
}
@Override

View File

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

View File

@@ -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 {

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -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 {

View File

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