/* * Copyright (C) 2016 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 com.android.systemui.plugins.annotations.Requires; import android.content.Context; /** * Plugins are separate APKs that * are expected to implement interfaces provided by SystemUI. Their * code is dynamically loaded into the SysUI process which can allow * for multiple prototypes to be created and run on a single android * build. * * PluginLifecycle: *
* * plugin.onCreate(Context sysuiContext, Context pluginContext); * --- This is always called before any other calls * * pluginListener.onPluginConnected(Plugin p); * --- This lets the plugin hook know that a plugin is now connected. * * ** Any other calls back and forth between sysui/plugin ** * * pluginListener.onPluginDisconnected(Plugin p); * --- Lets the plugin hook know that it should stop interacting with * this plugin and drop all references to it. * * plugin.onDestroy(); * --- Finally the plugin can perform any cleanup to ensure that its not * leaking into the SysUI process. * * Any time a plugin APK is updated the plugin is destroyed and recreated * to load the new code/resources. * ** * Creating plugin hooks: * * To create a plugin hook, first create an interface in * frameworks/base/packages/SystemUI/plugin that extends Plugin. * Include in it any hooks you want to be able to call into from * sysui and create callback interfaces for anything you need to * pass through into the plugin. * * Then to attach to any plugins simply add a plugin listener and * onPluginConnected will get called whenever new plugins are installed, * updated, or enabled. Like this example from SystemUIApplication: * *
* {@literal * PluginManager.getInstance(this).addPluginListener(OverlayPlugin.COMPONENT, * new PluginListener* Note the VERSION included here. Any time incompatible changes in the * interface are made, this version should be changed to ensure old plugins * aren't accidentally loaded. Since the plugin library is provided by * SystemUI, default implementations can be added for new methods to avoid * version changes when possible. * * Implementing a Plugin: * * See the ExamplePlugin for an example Android.mk on how to compile * a plugin. Note that SystemUILib is not static for plugins, its classes * are provided by SystemUI. * * Plugin security is based around a signature permission, so plugins must * hold the following permission in their manifest. * *() { * @Override * public void onPluginConnected(OverlayPlugin plugin) { * StatusBar phoneStatusBar = getComponent(StatusBar.class); * if (phoneStatusBar != null) { * plugin.setup(phoneStatusBar.getStatusBarWindow(), * phoneStatusBar.getNavigationBarView()); * } * } * }, OverlayPlugin.VERSION, true /* Allow multiple plugins *\/); * } *
* {@literal ** * A plugin is found through a querying for services, so to let SysUI know * about it, create a service with a name that points at your implementation * of the plugin interface with the action accompanying it: * ** } *
* {@literal **/ public interface Plugin { /** * @deprecated * @see Requires */ default int getVersion() { // Default of -1 indicates the plugin supports the new Requires model. return -1; } default void onCreate(Context sysuiContext, Context pluginContext) { } default void onDestroy() { } }* * } ** **