summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Steven Ng <stevenckng@google.com> 2021-02-09 09:14:44 +0000
committer Android (Google) Code Review <android-gerrit@google.com> 2021-02-09 09:14:44 +0000
commit005028d9259d34f30c9d4cbe8d224a788b8e558e (patch)
tree702381bec3d479d472c315a488f7d600421610be
parent4bc0e4eb1250d6eccfb8d4404f7bc22001eb61fd (diff)
parentcd5c9b0642c691f6f2d0e432052828964fbdbbf3 (diff)
Merge "Add a layout attribute in widget metadata for widget preview" into sc-dev
-rw-r--r--core/api/current.txt2
-rw-r--r--core/java/android/appwidget/AppWidgetProviderInfo.java24
-rw-r--r--core/res/res/values/attrs.xml12
-rw-r--r--core/res/res/values/public.xml1
-rw-r--r--services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java2
-rw-r--r--services/tests/servicestests/res/layout/widget_preview.xml21
-rw-r--r--services/tests/servicestests/res/xml/dummy_appwidget_info.xml2
-rw-r--r--services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java10
8 files changed, 70 insertions, 4 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index 77829fb5f23a..838dd55e34d5 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -1100,6 +1100,7 @@ package android {
field public static final int presentationTheme = 16843712; // 0x10103c0
field public static final int preserveLegacyExternalStorage = 16844308; // 0x1010614
field public static final int previewImage = 16843482; // 0x10102da
+ field public static final int previewLayout = 16844327; // 0x1010627
field public static final int primaryContentAlpha = 16844114; // 0x1010552
field public static final int priority = 16842780; // 0x101001c
field public static final int privateImeOptions = 16843299; // 0x1010223
@@ -8386,6 +8387,7 @@ package android.appwidget {
field public int minResizeWidth;
field public int minWidth;
field public int previewImage;
+ field @IdRes public int previewLayout;
field public android.content.ComponentName provider;
field public int resizeMode;
field public int updatePeriodMillis;
diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java
index e96e22c4764a..42214d047740 100644
--- a/core/java/android/appwidget/AppWidgetProviderInfo.java
+++ b/core/java/android/appwidget/AppWidgetProviderInfo.java
@@ -247,12 +247,29 @@ public class AppWidgetProviderInfo implements Parcelable {
* A preview of what the AppWidget will look like after it's configured.
* If not supplied, the AppWidget's icon will be used.
*
- * <p>This field corresponds to the <code>android:previewImage</code> attribute in
- * the <code>&lt;receiver&gt;</code> element in the AndroidManifest.xml file.
+ * <p>This field corresponds to the <code>android:previewImage</code> attribute in the AppWidget
+ * meta-data file.
*/
public int previewImage;
/**
+ * The layout resource id of a preview of what the AppWidget will look like after it's
+ * configured.
+ *
+ * <p>Unlike previewImage, previewLayout can better showcase AppWidget in different locales,
+ * system themes, display sizes & density etc.
+ *
+ * <p>If supplied, this will take precedence over the previewImage on supported widget hosts.
+ * Otherwise, previewImage will be used.
+ *
+ * <p>This field corresponds to the <code>android:previewLayout</code> attribute in the
+ * AppWidget meta-data file.
+ */
+ @SuppressLint("MutableBareField")
+ @IdRes
+ public int previewLayout;
+
+ /**
* The rules by which a widget can be resized. See {@link #RESIZE_NONE},
* {@link #RESIZE_NONE}, {@link #RESIZE_HORIZONTAL},
* {@link #RESIZE_VERTICAL}, {@link #RESIZE_BOTH}.
@@ -320,6 +337,7 @@ public class AppWidgetProviderInfo implements Parcelable {
this.label = in.readString();
this.icon = in.readInt();
this.previewImage = in.readInt();
+ this.previewLayout = in.readInt();
this.autoAdvanceViewId = in.readInt();
this.resizeMode = in.readInt();
this.widgetCategory = in.readInt();
@@ -429,6 +447,7 @@ public class AppWidgetProviderInfo implements Parcelable {
out.writeString(this.label);
out.writeInt(this.icon);
out.writeInt(this.previewImage);
+ out.writeInt(this.previewLayout);
out.writeInt(this.autoAdvanceViewId);
out.writeInt(this.resizeMode);
out.writeInt(this.widgetCategory);
@@ -453,6 +472,7 @@ public class AppWidgetProviderInfo implements Parcelable {
that.label = this.label;
that.icon = this.icon;
that.previewImage = this.previewImage;
+ that.previewLayout = this.previewLayout;
that.autoAdvanceViewId = this.autoAdvanceViewId;
that.resizeMode = this.resizeMode;
that.widgetCategory = this.widgetCategory;
diff --git a/core/res/res/values/attrs.xml b/core/res/res/values/attrs.xml
index 14df77527a08..e567c3d7d486 100644
--- a/core/res/res/values/attrs.xml
+++ b/core/res/res/values/attrs.xml
@@ -7969,9 +7969,17 @@
<!-- A class name in the AppWidget's package to be launched to configure.
If not supplied, then no activity will be launched. -->
<attr name="configure" format="string" />
- <!-- A preview of what the AppWidget will look like after it's configured.
- If not supplied, the AppWidget's icon will be used. -->
+ <!-- A preview, in a drawable resource id, of what the AppWidget will look like after it's
+ configured.
+ If not supplied, the AppWidget's icon will be used. -->
<attr name="previewImage" format="reference" />
+ <!-- The layout resource id of a preview of what the AppWidget will look like after it's
+ configured.
+ Unlike previewImage, previewLayout can better showcase AppWidget in different locales,
+ system themes, display sizes & density etc.
+ If supplied, this will take precedence over the previewImage on supported widget hosts.
+ Otherwise, previewImage will be used. -->
+ <attr name="previewLayout" format="reference" />
<!-- The view id of the AppWidget subview which should be auto-advanced.
by the widget's host. -->
<attr name="autoAdvanceViewId" format="reference" />
diff --git a/core/res/res/values/public.xml b/core/res/res/values/public.xml
index 30cfb8986035..97ec0f4fa71e 100644
--- a/core/res/res/values/public.xml
+++ b/core/res/res/values/public.xml
@@ -3061,6 +3061,7 @@
<public name="nativeHeapZeroInit" />
<!-- @hide @SystemApi -->
<public name="hotwordDetectionService" />
+ <public name="previewLayout" />
</public-group>
<public-group type="drawable" first-id="0x010800b5">
diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
index e4a86c3744ce..eff410caa2d4 100644
--- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
+++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java
@@ -2647,6 +2647,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
info.icon = activityInfo.getIconResource();
info.previewImage = sa.getResourceId(
com.android.internal.R.styleable.AppWidgetProviderInfo_previewImage, 0);
+ info.previewLayout = sa.getResourceId(
+ com.android.internal.R.styleable.AppWidgetProviderInfo_previewLayout, 0);
info.autoAdvanceViewId = sa.getResourceId(
com.android.internal.R.styleable.AppWidgetProviderInfo_autoAdvanceViewId, -1);
info.resizeMode = sa.getInt(
diff --git a/services/tests/servicestests/res/layout/widget_preview.xml b/services/tests/servicestests/res/layout/widget_preview.xml
new file mode 100644
index 000000000000..137ff46663d5
--- /dev/null
+++ b/services/tests/servicestests/res/layout/widget_preview.xml
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!--
+ ~ Copyright (C) 2021 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.
+ -->
+<TextView android:id="@+id/widget_preview"
+ xmlns:android="http://schemas.android.com/apk/res/android"
+ android:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:text="Widget preview" /> \ No newline at end of file
diff --git a/services/tests/servicestests/res/xml/dummy_appwidget_info.xml b/services/tests/servicestests/res/xml/dummy_appwidget_info.xml
index 65462168c5d8..72f025dbabe9 100644
--- a/services/tests/servicestests/res/xml/dummy_appwidget_info.xml
+++ b/services/tests/servicestests/res/xml/dummy_appwidget_info.xml
@@ -1,3 +1,4 @@
+<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright (C) 2017 The Android Open Source Project
~
@@ -19,6 +20,7 @@
android:minHeight="40dp"
android:updatePeriodMillis="86400000"
android:previewImage="@drawable/icon1"
+ android:previewLayout="@layout/widget_preview"
android:resizeMode="horizontal|vertical"
android:description="@string/widget_description"
android:widgetCategory="home_screen">
diff --git a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
index 96f434405199..78eb2df58925 100644
--- a/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
+++ b/services/tests/servicestests/src/com/android/server/appwidget/AppWidgetServiceImplTest.java
@@ -16,6 +16,8 @@
package com.android.server.appwidget;
+import static com.google.common.truth.Truth.assertThat;
+
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyInt;
import static org.mockito.ArgumentMatchers.anyString;
@@ -44,6 +46,7 @@ import android.test.InstrumentationTestCase;
import android.test.suitebuilder.annotation.SmallTest;
import android.widget.RemoteViews;
+import com.android.frameworks.servicestests.R;
import com.android.internal.appwidget.IAppWidgetHost;
import com.android.server.LocalServices;
@@ -293,6 +296,13 @@ public class AppWidgetServiceImplTest extends InstrumentationTestCase {
}
}
+ public void testGetPreviewLayout() {
+ AppWidgetProviderInfo info =
+ mManager.getInstalledProvidersForPackage(mPkgName, null).get(0);
+
+ assertThat(info.previewLayout).isEqualTo(R.layout.widget_preview);
+ }
+
private int setupHostAndWidget() {
List<PendingHostUpdate> updates = mService.startListening(
mMockHost, mPkgName, HOST_ID, new int[0]).getList();