From 0b51675e5639ce86308f4c66cd10b23e0a4e7162 Mon Sep 17 00:00:00 2001 From: Sihua Ma Date: Tue, 17 May 2022 20:37:06 +0000 Subject: [PATCH] Add API in AppWidgetServiceImpl A new function is created to notify the service of inheritance information of the widget provider. Test: N/A Bug: 221890505 Change-Id: I5f43f8d6ecd66b54869bef58898b1d3809b43d9e --- .../appwidget/AppWidgetProviderInfo.java | 6 ++++ .../internal/appwidget/IAppWidgetService.aidl | 1 + .../appwidget/AppWidgetServiceImpl.java | 35 +++++++++++++++++++ .../server/appwidget/AppWidgetXmlUtil.java | 4 +++ 4 files changed, 46 insertions(+) diff --git a/core/java/android/appwidget/AppWidgetProviderInfo.java b/core/java/android/appwidget/AppWidgetProviderInfo.java index 2e94dd1a47c40..4d2317a6d0f45 100644 --- a/core/java/android/appwidget/AppWidgetProviderInfo.java +++ b/core/java/android/appwidget/AppWidgetProviderInfo.java @@ -355,6 +355,9 @@ public class AppWidgetProviderInfo implements Parcelable { @UnsupportedAppUsage public ActivityInfo providerInfo; + /** @hide */ + public boolean isExtendedFromAppWidgetProvider; + public AppWidgetProviderInfo() { } @@ -387,6 +390,7 @@ public class AppWidgetProviderInfo implements Parcelable { this.providerInfo = in.readTypedObject(ActivityInfo.CREATOR); this.widgetFeatures = in.readInt(); this.descriptionRes = in.readInt(); + this.isExtendedFromAppWidgetProvider = in.readBoolean(); } /** @@ -510,6 +514,7 @@ public class AppWidgetProviderInfo implements Parcelable { out.writeTypedObject(this.providerInfo, flags); out.writeInt(this.widgetFeatures); out.writeInt(this.descriptionRes); + out.writeBoolean(this.isExtendedFromAppWidgetProvider); } @Override @@ -539,6 +544,7 @@ public class AppWidgetProviderInfo implements Parcelable { that.providerInfo = this.providerInfo; that.widgetFeatures = this.widgetFeatures; that.descriptionRes = this.descriptionRes; + that.isExtendedFromAppWidgetProvider = this.isExtendedFromAppWidgetProvider; return that; } diff --git a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl index 2d68cb472fa31..e74898294c090 100644 --- a/core/java/com/android/internal/appwidget/IAppWidgetService.aidl +++ b/core/java/com/android/internal/appwidget/IAppWidgetService.aidl @@ -70,6 +70,7 @@ interface IAppWidgetService { @UnsupportedAppUsage(maxTargetSdk = 30, trackingBug = 170729553) boolean bindRemoteViewsService(String callingPackage, int appWidgetId, in Intent intent, IApplicationThread caller, IBinder token, IServiceConnection connection, int flags); + void notifyProviderInheritance(in ComponentName[] componentNames); @UnsupportedAppUsage int[] getAppWidgetIds(in ComponentName providerComponent); diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 8fe57e18ea374..cb1b75edbc87b 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -25,6 +25,7 @@ import static android.provider.DeviceConfig.NAMESPACE_SYSTEMUI; import static com.android.server.pm.PackageManagerService.PLATFORM_PACKAGE_NAME; import android.annotation.NonNull; +import android.annotation.Nullable; import android.annotation.UserIdInt; import android.app.ActivityManager; import android.app.ActivityManagerInternal; @@ -1443,6 +1444,40 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku updateAppWidgetIds(callingPackage, appWidgetIds, views, true); } + @Override + public void notifyProviderInheritance(@Nullable final ComponentName[] componentNames) { + final int userId = UserHandle.getCallingUserId(); + if (DEBUG) { + Slog.i(TAG, "notifyProviderInheritance() " + userId); + } + + if (componentNames == null) { + return; + } + + for (ComponentName componentName : componentNames) { + if (componentName == null) { + return; + } + mSecurityPolicy.enforceCallFromPackage(componentName.getPackageName()); + } + synchronized (mLock) { + ensureGroupStateLoadedLocked(userId); + + for (ComponentName componentName : componentNames) { + final ProviderId providerId = new ProviderId(Binder.getCallingUid(), componentName); + final Provider provider = lookupProviderLocked(providerId); + + if (provider == null || provider.info == null) { + return; + } + + provider.info.isExtendedFromAppWidgetProvider = true; + } + saveGroupStateAsync(userId); + } + } + @Override public void notifyAppWidgetViewDataChanged(String callingPackage, int[] appWidgetIds, int viewId) { diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java index 6a5dcc8c5945f..92435d0219f9e 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java @@ -57,6 +57,7 @@ public class AppWidgetXmlUtil { private static final String ATTR_WIDGET_CATEGORY = "widget_category"; private static final String ATTR_WIDGET_FEATURES = "widget_features"; private static final String ATTR_DESCRIPTION_RES = "description_res"; + private static final String ATTR_PROVIDER_INHERITANCE = "provider_inheritance"; private static final String ATTR_OS_FINGERPRINT = "os_fingerprint"; /** @@ -93,6 +94,7 @@ public class AppWidgetXmlUtil { out.attributeInt(null, ATTR_WIDGET_CATEGORY, info.widgetCategory); out.attributeInt(null, ATTR_WIDGET_FEATURES, info.widgetFeatures); out.attributeInt(null, ATTR_DESCRIPTION_RES, info.descriptionRes); + out.attributeBoolean(null, ATTR_PROVIDER_INHERITANCE, info.isExtendedFromAppWidgetProvider); out.attribute(null, ATTR_OS_FINGERPRINT, Build.FINGERPRINT); } @@ -133,6 +135,8 @@ public class AppWidgetXmlUtil { info.widgetCategory = parser.getAttributeInt(null, ATTR_WIDGET_CATEGORY, 0); info.widgetFeatures = parser.getAttributeInt(null, ATTR_WIDGET_FEATURES, 0); info.descriptionRes = parser.getAttributeInt(null, ATTR_DESCRIPTION_RES, 0); + info.isExtendedFromAppWidgetProvider = parser.getAttributeBoolean(null, + ATTR_PROVIDER_INHERITANCE, false); return info; } }