From 8f85ec94c4ba5b3a6b4545cab0b711b81db4ed3f Mon Sep 17 00:00:00 2001 From: Pinyao Ting Date: Thu, 14 Apr 2022 09:26:29 -0700 Subject: [PATCH] Add null check for label when persisting provider info As observed in b/229075212, provider info might not have a label. Adding a null check to prevent system crash in persisting said provider info. Bug: 229075212 Test: manual Change-Id: I56a90415858dcef1829e8f92ee3f1f87a0f890aa --- .../android/server/appwidget/AppWidgetServiceImpl.java | 6 +++++- .../com/android/server/appwidget/AppWidgetXmlUtil.java | 9 ++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index bc4b2a6f5247e..5acae4859ee89 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -154,7 +154,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private static final String TAG = "AppWidgetServiceImpl"; private static final boolean DEBUG = false; - private static final boolean DEBUG_PROVIDER_INFO_CACHE = true; + static final boolean DEBUG_PROVIDER_INFO_CACHE = true; private static final String OLD_KEYGUARD_HOST_PACKAGE = "android"; private static final String NEW_KEYGUARD_HOST_PACKAGE = "com.android.keyguard"; @@ -2001,6 +2001,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } + @GuardedBy("mLock") private void scheduleNotifyProviderChangedLocked(Widget widget) { long requestId = UPDATE_COUNTER.incrementAndGet(); if (widget != null) { @@ -2330,6 +2331,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku sendBroadcastAsUser(intent, widget.provider.id.getProfile()); } + @GuardedBy("mLock") private void registerForBroadcastsLocked(Provider provider, int[] appWidgetIds) { AppWidgetProviderInfo info = provider.getInfoLocked(mContext); if (info.updatePeriodMillis > 0) { @@ -3433,6 +3435,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku * * @return whether any providers were updated */ + @GuardedBy("mLock") private boolean updateProvidersForPackageLocked(String packageName, int userId, Set removedProviders) { boolean providersUpdated = false; @@ -4218,6 +4221,7 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku /** * Adds all pending updates in {@param outUpdates} keys by the update time. */ + @GuardedBy("mLock") public void getPendingUpdatesForIdLocked(Context context, int appWidgetId, LongSparseArray outUpdates) { long updateSequenceNo = lastWidgetUpdateSequenceNo; diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java index 297575ca168fa..6a5dcc8c5945f 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetXmlUtil.java @@ -22,6 +22,7 @@ import android.appwidget.AppWidgetProviderInfo; import android.content.ComponentName; import android.os.Build; import android.text.TextUtils; +import android.util.Slog; import android.util.TypedXmlPullParser; import android.util.TypedXmlSerializer; @@ -33,6 +34,8 @@ import java.util.Objects; */ public class AppWidgetXmlUtil { + private static final String TAG = "AppWidgetXmlUtil"; + private static final String ATTR_MIN_WIDTH = "min_width"; private static final String ATTR_MIN_HEIGHT = "min_height"; private static final String ATTR_MIN_RESIZE_WIDTH = "min_resize_width"; @@ -77,7 +80,11 @@ public class AppWidgetXmlUtil { if (info.configure != null) { out.attribute(null, ATTR_CONFIGURE, info.configure.flattenToShortString()); } - out.attribute(null, ATTR_LABEL, info.label); + if (info.label != null) { + out.attribute(null, ATTR_LABEL, info.label); + } else if (AppWidgetServiceImpl.DEBUG_PROVIDER_INFO_CACHE) { + Slog.e(TAG, "Label is empty in " + info.provider); + } out.attributeInt(null, ATTR_ICON, info.icon); out.attributeInt(null, ATTR_PREVIEW_IMAGE, info.previewImage); out.attributeInt(null, ATTR_PREVIEW_LAYOUT, info.previewLayout);