Merge changes from topic "revert-injectors" into oc-mr1-dev
am: d33fe05c66
Change-Id: I7e66180252232f22e23e68b8aec7eedbd2bed82b
diff --git a/api/current.txt b/api/current.txt
index fdfafa5..90d70d1 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -4214,12 +4214,6 @@
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
- method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String);
- method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String);
- method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
- method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
diff --git a/api/system-current.txt b/api/system-current.txt
index 79a2c39..f7180ea 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -4378,12 +4378,6 @@
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
- method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String);
- method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String);
- method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
- method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
diff --git a/api/test-current.txt b/api/test-current.txt
index 6ec4b04..b665c69 100644
--- a/api/test-current.txt
+++ b/api/test-current.txt
@@ -4227,12 +4227,6 @@
public class Application extends android.content.ContextWrapper implements android.content.ComponentCallbacks2 {
ctor public Application();
- method public android.app.Activity instantiateActivity(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- method public android.app.backup.BackupAgent instantiateBackupAgent(java.lang.ClassLoader, java.lang.String);
- method public android.app.Instrumentation instantiateInstrumentation(java.lang.ClassLoader, java.lang.String);
- method public android.content.ContentProvider instantiateProvider(java.lang.ClassLoader, java.lang.String);
- method public android.content.BroadcastReceiver instantiateReceiver(java.lang.ClassLoader, java.lang.String, android.content.Intent);
- method public android.app.Service instantiateService(java.lang.ClassLoader, java.lang.String, android.content.Intent);
method public void onConfigurationChanged(android.content.res.Configuration);
method public void onCreate();
method public void onLowMemory();
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 43693e1..2e4ce18 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -2666,14 +2666,8 @@
Activity activity = null;
try {
java.lang.ClassLoader cl = appContext.getClassLoader();
- if (appContext.getApplicationContext() instanceof Application) {
- activity = ((Application) appContext.getApplicationContext())
- .instantiateActivity(cl, component.getClassName(), r.intent);
- }
- if (activity == null) {
- activity = mInstrumentation.newActivity(
- cl, component.getClassName(), r.intent);
- }
+ activity = mInstrumentation.newActivity(
+ cl, component.getClassName(), r.intent);
StrictMode.incrementExpectedActivityCount(activity.getClass());
r.intent.setExtrasClassLoader(cl);
r.intent.prepareToEnterProcess();
@@ -3169,8 +3163,7 @@
data.intent.setExtrasClassLoader(cl);
data.intent.prepareToEnterProcess();
data.setExtrasClassLoader(cl);
- receiver = instantiate(cl, component, data.intent, app,
- Application::instantiateReceiver);
+ receiver = (BroadcastReceiver)cl.loadClass(component).newInstance();
} catch (Exception e) {
if (DEBUG_BROADCAST) Slog.i(TAG,
"Finishing failed broadcast to " + data.intent.getComponent());
@@ -3258,13 +3251,12 @@
} else {
try {
if (DEBUG_BACKUP) Slog.v(TAG, "Initializing agent class " + classname);
- ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
java.lang.ClassLoader cl = packageInfo.getClassLoader();
- agent = instantiate(cl, classname, context,
- Application::instantiateBackupAgent);
+ agent = (BackupAgent) cl.loadClass(classname).newInstance();
// set up the agent's context
+ ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
context.setOuterContext(agent);
agent.attach(context);
@@ -3324,12 +3316,9 @@
LoadedApk packageInfo = getPackageInfoNoCheck(
data.info.applicationInfo, data.compatInfo);
Service service = null;
- Application app = null;
try {
- app = packageInfo.makeApplication(false, mInstrumentation);
java.lang.ClassLoader cl = packageInfo.getClassLoader();
- service = instantiate(cl, data.info.name, data.intent, app,
- Application::instantiateService);
+ service = (Service) cl.loadClass(data.info.name).newInstance();
} catch (Exception e) {
if (!mInstrumentation.onException(service, e)) {
throw new RuntimeException(
@@ -3344,6 +3333,7 @@
ContextImpl context = ContextImpl.createAppContext(this, packageInfo);
context.setOuterContext(service);
+ Application app = packageInfo.makeApplication(false, mInstrumentation);
service.attach(context, this, data.info.name, data.token, app,
ActivityManager.getService());
service.onCreate();
@@ -5682,8 +5672,8 @@
try {
final ClassLoader cl = instrContext.getClassLoader();
- mInstrumentation = instantiate(cl, data.instrumentationName.getClassName(),
- instrContext, Application::instantiateInstrumentation);
+ mInstrumentation = (Instrumentation)
+ cl.loadClass(data.instrumentationName.getClassName()).newInstance();
} catch (Exception e) {
throw new RuntimeException(
"Unable to instantiate instrumentation "
@@ -6234,8 +6224,8 @@
try {
final java.lang.ClassLoader cl = c.getClassLoader();
- localProvider = instantiate(cl, info.name, context,
- Application::instantiateProvider);
+ localProvider = (ContentProvider)cl.
+ loadClass(info.name).newInstance();
provider = localProvider.getIContentProvider();
if (provider == null) {
Slog.e(TAG, "Failed to instantiate class " +
@@ -6434,49 +6424,6 @@
}
}
- private <T> T instantiate(ClassLoader cl, String className, Context c,
- Instantiator<T> instantiator)
- throws ClassNotFoundException, IllegalAccessException, InstantiationException {
- Application app = getApp(c);
- if (app != null) {
- T a = instantiator.instantiate(app, cl, className);
- if (a != null) return a;
- }
- return (T) cl.loadClass(className).newInstance();
- }
-
- private <T> T instantiate(ClassLoader cl, String className, Intent intent, Context c,
- IntentInstantiator<T> instantiator)
- throws ClassNotFoundException, IllegalAccessException, InstantiationException {
- Application app = getApp(c);
- if (app != null) {
- T a = instantiator.instantiate(app, cl, className, intent);
- if (a != null) return a;
- }
- return (T) cl.loadClass(className).newInstance();
- }
-
- private Application getApp(Context c) {
- // We need this shortcut to avoid actually calling getApplicationContext() on an Application
- // because the Application may not return itself for getApplicationContext() because the
- // API doesn't enforce it.
- if (c instanceof Application) return (Application) c;
- if (c.getApplicationContext() instanceof Application) {
- return (Application) c.getApplicationContext();
- }
- return null;
- }
-
- private interface Instantiator<T> {
- T instantiate(Application app, ClassLoader cl, String className)
- throws ClassNotFoundException, IllegalAccessException, InstantiationException;
- }
-
- private interface IntentInstantiator<T> {
- T instantiate(Application app, ClassLoader cl, String className, Intent intent)
- throws ClassNotFoundException, IllegalAccessException, InstantiationException;
- }
-
private static class EventLoggingReporter implements EventLogger.Reporter {
@Override
public void report (int code, Object... list) {
diff --git a/core/java/android/app/Application.java b/core/java/android/app/Application.java
index cc23ec9..156df36 100644
--- a/core/java/android/app/Application.java
+++ b/core/java/android/app/Application.java
@@ -16,20 +16,17 @@
package android.app;
+import java.util.ArrayList;
+
import android.annotation.CallSuper;
-import android.app.backup.BackupAgent;
-import android.content.BroadcastReceiver;
import android.content.ComponentCallbacks;
import android.content.ComponentCallbacks2;
-import android.content.ContentProvider;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
-import java.util.ArrayList;
-
/**
* Base class for maintaining global application state. You can provide your own
* implementation by creating a subclass and specifying the fully-qualified name
@@ -292,73 +289,4 @@
}
}
}
-
- /**
- * Allows application to override the creation of activities. This can be used to
- * perform things such as dependency injection or class loader changes to these
- * classes. Return null to use the default creation flow.
- * @param cl The default classloader to use for instantiation.
- * @param className The class to be instantiated.
- * @param intent Intent creating the class.
- */
- public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) {
- return null;
- }
-
- /**
- * Allows application to override the creation of receivers. This can be used to
- * perform things such as dependency injection or class loader changes to these
- * classes. Return null to use the default creation flow.
- * @param cl The default classloader to use for instantiation.
- * @param className The class to be instantiated.
- * @param intent Intent creating the class.
- */
- public BroadcastReceiver instantiateReceiver(ClassLoader cl, String className, Intent intent) {
- return null;
- }
-
- /**
- * Allows application to override the creation of services. This can be used to
- * perform things such as dependency injection or class loader changes to these
- * classes. Return null to use the default creation flow.
- * @param cl The default classloader to use for instantiation.
- * @param className The class to be instantiated.
- * @param intent Intent creating the class.
- */
- public Service instantiateService(ClassLoader cl, String className, Intent intent) {
- return null;
- }
-
- /**
- * Allows application to override the creation of providers. This can be used to
- * perform things such as dependency injection or class loader changes to these
- * classes. Return null to use the default creation flow.
- * @param cl The default classloader to use for instantiation.
- * @param className The class to be instantiated.
- */
- public ContentProvider instantiateProvider(ClassLoader cl, String className) {
- return null;
- }
-
- /**
- * Allows application to override the creation of backup agents. This can be used to
- * perform things such as dependency injection or class loader changes to these
- * classes. Return null to use the default creation flow.
- * @param cl The default classloader to use for instantiation.
- * @param className The class to be instantiated.
- */
- public BackupAgent instantiateBackupAgent(ClassLoader cl, String className) {
- return null;
- }
-
- /**
- * Allows application to override the creation of instrumentation. This can be used to
- * perform things such as dependency injection or class loader changes to these
- * classes. Return null to use the default creation flow.
- * @param cl The default classloader to use for instantiation.
- * @param className The class to be instantiated.
- */
- public Instrumentation instantiateInstrumentation(ClassLoader cl, String className) {
- return null;
- }
}
\ No newline at end of file
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java
deleted file mode 100644
index 925214e..0000000
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright (C) 2017 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.app.Activity;
-import android.content.Context;
-import android.content.res.Resources;
-import android.os.Bundle;
-
-import com.android.systemui.plugins.annotations.ProvidesInterface;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-
-/**
- * A PluginActivity is an activity that replaces another full activity (e.g. RecentsActivity)
- * at runtime within the sysui process.
- */
-@ProvidesInterface(version = PluginActivity.VERSION)
-public abstract class PluginActivity extends Activity implements Plugin {
-
- public static final int VERSION = 1;
-
- public static final String ACTION_RECENTS = "com.android.systemui.action.PLUGIN_RECENTS";
-
- private Context mSysuiContext;
- private boolean mSettingActionBar;
-
- @Override
- public final void onCreate(Context sysuiContext, Context pluginContext) {
- mSysuiContext = sysuiContext;
- super.attachBaseContext(pluginContext);
- }
-
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- Theme theme = getClass().getDeclaredAnnotation(Theme.class);
- if (theme != null && theme.value() != 0) {
- setTheme(theme.value());
- }
- mSettingActionBar = true;
- getActionBar();
- mSettingActionBar = false;
- }
-
- @Override
- public Resources getResources() {
- return mSettingActionBar ? mSysuiContext.getResources() : super.getResources();
- }
-
- @Override
- protected void attachBaseContext(Context newBase) {
- mSysuiContext = newBase;
- }
-
- @Override
- public void onDestroy() {
- super.onDestroy();
- }
-
- public Context getSysuiContext() {
- return mSysuiContext;
- }
-
- public Context getPluginContext() {
- return getBaseContext();
- }
-
- /**
- * Since PluginActivities are declared as services instead of activities (since they
- * are plugins), they can't have a theme attached to them. Instead a PluginActivity
- * can annotate itself with @Theme to specify the resource of the style it wants
- * to be themed with.
- */
- @Retention(RetentionPolicy.RUNTIME)
- public @interface Theme {
- int value();
- }
-}
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java
index db2e376..25ce3dd 100644
--- a/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java
+++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java
@@ -21,11 +21,6 @@
public static final int VERSION = 1;
static DependencyProvider sProvider;
- /**
- * Allows a plugin to get a hold of static dependencies if they have declared dependence
- * on their interface. For one-shot plugins this will only work during onCreate and will
- * not work afterwards.
- */
public static <T> T get(Plugin p, Class<T> cls) {
return sProvider.get(p, cls);
}
diff --git a/packages/SystemUI/src/com/android/systemui/Dependency.java b/packages/SystemUI/src/com/android/systemui/Dependency.java
index ecc2111..49253ec 100644
--- a/packages/SystemUI/src/com/android/systemui/Dependency.java
+++ b/packages/SystemUI/src/com/android/systemui/Dependency.java
@@ -34,7 +34,6 @@
import com.android.systemui.keyguard.ScreenLifecycle;
import com.android.systemui.keyguard.WakefulnessLifecycle;
import com.android.systemui.plugins.ActivityStarter;
-import com.android.systemui.plugins.PluginActivityManager;
import com.android.systemui.plugins.PluginDependencyProvider;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.plugins.PluginManagerImpl;
@@ -295,8 +294,6 @@
mProviders.put(UiOffloadThread.class, UiOffloadThread::new);
- mProviders.put(PluginActivityManager.class,
- () -> new PluginActivityManager(mContext, getDependency(PluginManager.class)));
mProviders.put(PowerUI.WarningsUI.class, () -> new PowerNotificationWarnings(mContext));
diff --git a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
index 49a076f..9adafda 100644
--- a/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
+++ b/packages/SystemUI/src/com/android/systemui/SystemUIApplication.java
@@ -16,7 +16,6 @@
package com.android.systemui;
-import android.app.Activity;
import android.app.ActivityThread;
import android.app.Application;
import android.content.BroadcastReceiver;
@@ -41,7 +40,6 @@
import com.android.systemui.plugins.GlobalActions;
import com.android.systemui.plugins.OverlayPlugin;
import com.android.systemui.plugins.Plugin;
-import com.android.systemui.plugins.PluginActivityManager;
import com.android.systemui.plugins.PluginListener;
import com.android.systemui.plugins.PluginManager;
import com.android.systemui.power.PowerUI;
@@ -281,10 +279,4 @@
public SystemUI[] getServices() {
return mServices;
}
-
- @Override
- public Activity instantiateActivity(ClassLoader cl, String className, Intent intent) {
- if (!mServicesStarted) return null;
- return Dependency.get(PluginActivityManager.class).instantiate(cl, className, intent);
- }
}
diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java
deleted file mode 100644
index 9becc38..0000000
--- a/packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Copyright (C) 2017 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.app.Activity;
-import android.content.Context;
-import android.content.Intent;
-import android.text.TextUtils;
-import android.util.ArrayMap;
-
-public class PluginActivityManager {
-
- private final Context mContext;
- private final PluginManager mPluginManager;
- private final ArrayMap<String, String> mActionLookup = new ArrayMap<>();
-
- public PluginActivityManager(Context context, PluginManager pluginManager) {
- mContext = context;
- mPluginManager = pluginManager;
- }
-
- public void addActivityPlugin(String className, String action) {
- mActionLookup.put(className, action);
- }
-
- public Activity instantiate(ClassLoader cl, String className, Intent intent) {
- String action = mActionLookup.get(className);
- if (TextUtils.isEmpty(action)) return null;
- return mPluginManager.getOneShotPlugin(action, PluginActivity.class);
- }
-}
diff --git a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java
index a968399..493d244 100644
--- a/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java
+++ b/packages/SystemUI/src/com/android/systemui/plugins/PluginManagerImpl.java
@@ -42,6 +42,7 @@
import com.android.internal.messages.nano.SystemMessageProto.SystemMessage;
import com.android.systemui.Dependency;
import com.android.systemui.plugins.PluginInstanceManager.PluginContextWrapper;
+import com.android.systemui.plugins.PluginInstanceManager.PluginInfo;
import com.android.systemui.plugins.annotations.ProvidesInterface;
import dalvik.system.PathClassLoader;
@@ -119,21 +120,14 @@
}
PluginInstanceManager<T> p = mFactory.createPluginInstanceManager(mContext, action, null,
false, mLooper, cls, this);
- PluginListener<Plugin> listener = new PluginListener<Plugin>() {
- @Override
- public void onPluginConnected(Plugin plugin, Context pluginContext) { }
- };
- mPluginMap.put(listener, p);
mPluginPrefs.addAction(action);
- PluginInstanceManager.PluginInfo<T> info = p.getPlugin();
+ PluginInfo<T> info = p.getPlugin();
if (info != null) {
mOneShotPackages.add(info.mPackage);
mHasOneShot = true;
startListening();
- mPluginMap.remove(listener);
return info.mPlugin;
}
- mPluginMap.remove(listener);
return null;
}
diff --git a/packages/SystemUI/src/com/android/systemui/recents/Recents.java b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
index d10e080..4a8b43e 100644
--- a/packages/SystemUI/src/com/android/systemui/recents/Recents.java
+++ b/packages/SystemUI/src/com/android/systemui/recents/Recents.java
@@ -43,14 +43,11 @@
import com.android.internal.logging.MetricsLogger;
import com.android.internal.logging.nano.MetricsProto.MetricsEvent;
-import com.android.systemui.Dependency;
import com.android.systemui.EventLogConstants;
import com.android.systemui.EventLogTags;
import com.android.systemui.R;
import com.android.systemui.RecentsComponent;
import com.android.systemui.SystemUI;
-import com.android.systemui.plugins.PluginActivity;
-import com.android.systemui.plugins.PluginActivityManager;
import com.android.systemui.recents.events.EventBus;
import com.android.systemui.recents.events.activity.ConfigurationChangedEvent;
import com.android.systemui.recents.events.activity.DockedTopTaskEvent;
@@ -239,8 +236,6 @@
registerWithSystemUser();
}
putComponent(Recents.class, this);
- Dependency.get(PluginActivityManager.class).addActivityPlugin(RecentsImpl.RECENTS_ACTIVITY,
- PluginActivity.ACTION_RECENTS);
}
@Override
diff --git a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java
index bba982c..b8e9fcd 100644
--- a/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java
+++ b/packages/SystemUI/tests/src/com/android/systemui/plugins/PluginManagerTest.java
@@ -26,6 +26,8 @@
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
+import android.support.test.annotation.UiThreadTest;
+import android.support.test.runner.AndroidJUnit4;
import android.test.suitebuilder.annotation.SmallTest;
import android.testing.AndroidTestingRunner;
import android.testing.TestableLooper;
@@ -34,10 +36,11 @@
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.annotations.ProvidesInterface;
+import com.android.systemui.plugins.PluginInstanceManager.PluginInfo;
import com.android.systemui.plugins.PluginManagerImpl.PluginInstanceManagerFactory;
+import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
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 d1b1c5b..0a83a89 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,6 +14,7 @@
package com.android.systemui.utils.leaks;
+import android.content.Context;
import android.testing.LeakCheck;
import com.android.systemui.plugins.Plugin;