Loading packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * 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(); } } packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java +5 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,11 @@ public class PluginDependency { 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); } Loading packages/SystemUI/src/com/android/systemui/Dependency.java +4 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.fragments.FragmentService; 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; Loading Loading @@ -276,6 +277,9 @@ public class Dependency extends SystemUI { mProviders.put(UiOffloadThread.class, UiOffloadThread::new); mProviders.put(PluginActivityManager.class, () -> new PluginActivityManager(mContext, getDependency(PluginManager.class))); // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); } Loading packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +8 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui; import android.app.Activity; import android.app.ActivityThread; import android.app.Application; import android.content.BroadcastReceiver; Loading @@ -39,6 +40,7 @@ import com.android.systemui.pip.PipUI; 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; Loading Loading @@ -266,4 +268,10 @@ public class SystemUIApplication extends Application implements SysUiServiceProv 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); } } packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java 0 → 100644 +43 −0 Original line number Diff line number Diff line /* * 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); } } Loading
packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginActivity.java 0 → 100644 +92 −0 Original line number Diff line number Diff line /* * 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(); } }
packages/SystemUI/plugin/src/com/android/systemui/plugins/PluginDependency.java +5 −0 Original line number Diff line number Diff line Loading @@ -21,6 +21,11 @@ public class PluginDependency { 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); } Loading
packages/SystemUI/src/com/android/systemui/Dependency.java +4 −0 Original line number Diff line number Diff line Loading @@ -31,6 +31,7 @@ import com.android.systemui.assist.AssistManager; import com.android.systemui.colorextraction.SysuiColorExtractor; import com.android.systemui.fragments.FragmentService; 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; Loading Loading @@ -276,6 +277,9 @@ public class Dependency extends SystemUI { mProviders.put(UiOffloadThread.class, UiOffloadThread::new); mProviders.put(PluginActivityManager.class, () -> new PluginActivityManager(mContext, getDependency(PluginManager.class))); // Put all dependencies above here so the factory can override them if it wants. SystemUIFactory.getInstance().injectDependencies(mProviders, mContext); } Loading
packages/SystemUI/src/com/android/systemui/SystemUIApplication.java +8 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.systemui; import android.app.Activity; import android.app.ActivityThread; import android.app.Application; import android.content.BroadcastReceiver; Loading @@ -39,6 +40,7 @@ import com.android.systemui.pip.PipUI; 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; Loading Loading @@ -266,4 +268,10 @@ public class SystemUIApplication extends Application implements SysUiServiceProv 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); } }
packages/SystemUI/src/com/android/systemui/plugins/PluginActivityManager.java 0 → 100644 +43 −0 Original line number Diff line number Diff line /* * 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); } }