diff options
| author | 2016-09-21 16:27:23 +0000 | |
|---|---|---|
| committer | 2016-09-21 16:27:26 +0000 | |
| commit | 31d2280c7014e2a79c9ff5efd4217821b24786c2 (patch) | |
| tree | 2e28259f76ef8411a9b2ff49db0116ffeca11646 | |
| parent | 746aa69054d37a0263a648b9de36485b2fd1900d (diff) | |
| parent | beda2ddbec2f32adeba20d562a53bb3dd83b902d (diff) | |
Merge "Add PluginInflateContainer"
4 files changed, 142 insertions, 2 deletions
diff --git a/packages/SystemUI/plugin/src/com/android/systemui/plugins/ViewProvider.java b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ViewProvider.java new file mode 100644 index 000000000000..18ca8e6e26a6 --- /dev/null +++ b/packages/SystemUI/plugin/src/com/android/systemui/plugins/ViewProvider.java @@ -0,0 +1,21 @@ +/* + * 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 android.view.View; + +public interface ViewProvider extends Plugin { + View getView(); +} diff --git a/packages/SystemUI/res/values/attrs.xml b/packages/SystemUI/res/values/attrs.xml index cbaf23f85fdc..ad65f82ab956 100644 --- a/packages/SystemUI/res/values/attrs.xml +++ b/packages/SystemUI/res/values/attrs.xml @@ -108,5 +108,9 @@ <attr name="enableAutoSizing" format="boolean" /> <attr name="itemHeight" format="dimension" /> </declare-styleable> + + <declare-styleable name="PluginInflateContainer"> + <attr name="viewType" format="string" /> + </declare-styleable> </resources> diff --git a/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java b/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java index 2aca7889f31b..810dd8c403a7 100644 --- a/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java +++ b/packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java @@ -72,9 +72,13 @@ public class AutoReinflateContainer extends FrameLayout { } } - private void inflateLayout() { - removeAllViews(); + protected void inflateLayoutImpl() { LayoutInflater.from(getContext()).inflate(mLayout, this); + } + + protected void inflateLayout() { + removeAllViews(); + inflateLayoutImpl(); final int N = mInflateListeners.size(); for (int i = 0; i < N; i++) { mInflateListeners.get(i).onInflated(getChildAt(0)); diff --git a/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java new file mode 100644 index 000000000000..efa7cae0821d --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java @@ -0,0 +1,111 @@ +/* + * 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; + +import android.annotation.Nullable; +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import android.util.Log; +import android.view.View; + +import com.android.systemui.plugins.PluginListener; +import com.android.systemui.plugins.PluginManager; +import com.android.systemui.plugins.ViewProvider; + +/** + * Define an interface or abstract class as follows that includes the + * version and action. + * + * public interface MyInterface { + * public static final String ACTION = + * "com.android.systemui.action.PLUGIN_MYINTERFACE"; + * + * public static final int VERSION = 1; + * + * void myImportantInterface(); + * } + * + * Then put in a PluginInflateContainer to use and specify the interface + * or class that will be implemented as viewType. The layout specified + * will be used by default and whenever a plugin is not present. + * + * <com.android.systemui.PluginInflateContainer + * android:id="@+id/some_id" + * android:layout_width="match_parent" + * android:layout_height="match_parent" + * android:layout="@layout/my_default_component" + * systemui:viewType="com.android.systemui.plugins.MyInterface" /> + */ +public class PluginInflateContainer extends AutoReinflateContainer + implements PluginListener<ViewProvider> { + + private static final String TAG = "PluginInflateContainer"; + + private String mAction; + private int mVersion; + private View mPluginView; + + public PluginInflateContainer(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.PluginInflateContainer); + String viewType = a.getString(R.styleable.PluginInflateContainer_viewType); + try { + Class c = Class.forName(viewType); + mAction = (String) c.getDeclaredField("ACTION").get(null); + mVersion = (int) c.getDeclaredField("VERSION").get(null); + } catch (Exception e) { + Log.d(TAG, "Problem getting class info " + viewType, e); + mAction = null; + mVersion = 0; + } + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + if (mAction != null) { + PluginManager.getInstance(getContext()).addPluginListener(mAction, this, mVersion); + } + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + if (mAction != null) { + PluginManager.getInstance(getContext()).removePluginListener(this); + } + } + + @Override + protected void inflateLayoutImpl() { + if (mPluginView != null) { + addView(mPluginView); + } else { + super.inflateLayoutImpl(); + } + } + + @Override + public void onPluginConnected(ViewProvider plugin) { + mPluginView = plugin.getView(); + inflateLayout(); + } + + @Override + public void onPluginDisconnected(ViewProvider plugin) { + mPluginView = null; + inflateLayout(); + } +} |