Merge "Move plugin support to shared lib"
This commit is contained in:
@@ -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",
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
@@ -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.
|
||||
|
||||
@@ -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));
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
@@ -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;
|
||||
@@ -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;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user