diff options
| author | 2021-02-09 09:14:44 +0000 | |
|---|---|---|
| committer | 2021-02-09 09:14:44 +0000 | |
| commit | 005028d9259d34f30c9d4cbe8d224a788b8e558e (patch) | |
| tree | 702381bec3d479d472c315a488f7d600421610be | |
| parent | 4bc0e4eb1250d6eccfb8d4404f7bc22001eb61fd (diff) | |
| parent | cd5c9b0642c691f6f2d0e432052828964fbdbbf3 (diff) | |
Merge "Add a layout attribute in widget metadata for widget preview" into sc-dev
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><receiver></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(); |