summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author TreeHugger Robot <treehugger-gerrit@google.com> 2016-09-21 16:27:23 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2016-09-21 16:27:26 +0000
commit31d2280c7014e2a79c9ff5efd4217821b24786c2 (patch)
tree2e28259f76ef8411a9b2ff49db0116ffeca11646
parent746aa69054d37a0263a648b9de36485b2fd1900d (diff)
parentbeda2ddbec2f32adeba20d562a53bb3dd83b902d (diff)
Merge "Add PluginInflateContainer"
-rw-r--r--packages/SystemUI/plugin/src/com/android/systemui/plugins/ViewProvider.java21
-rw-r--r--packages/SystemUI/res/values/attrs.xml4
-rw-r--r--packages/SystemUI/src/com/android/systemui/AutoReinflateContainer.java8
-rw-r--r--packages/SystemUI/src/com/android/systemui/PluginInflateContainer.java111
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();
+ }
+}