From c616b3e2f16c99c51e0543256c219e799ff32232 Mon Sep 17 00:00:00 2001 From: Svetoslav Date: Mon, 22 Sep 2014 12:25:24 -0700 Subject: [PATCH] Fix a bug in parsing app widget state XML. When restoring app widget state from XML we read all providers, hosts, and widgets and only after reading all hosts and providers for all members of the group we hookup the widgets as they may cross profile boundary. To esntablish the host-widget and provider- widget relation we use a tag for the host and the provider that are assigned before saving the state to XML. When restoring we are using the tags to match widgets with hosts and providers. The bug was that we were not clearing the tag of all hosts and providers before reading from XML as we want the only tags that are defined to be the ones we are reading. This resulted in wrong app widget restore for a secondary user. bug:17505027 Change-Id: I035d8f13142c6b9dbc9d658b82390f9cd8d75e0d --- .../server/appwidget/AppWidgetServiceImpl.java | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index d05de697d40f2..86cfdb98b7154 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -434,6 +434,8 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } + clearProvidersAndHostsTagsLocked(); + loadGroupWidgetProvidersLocked(newProfileIds); loadGroupStateLocked(newProfileIds); } @@ -2372,6 +2374,20 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku } } + private void clearProvidersAndHostsTagsLocked() { + final int providerCount = mProviders.size(); + for (int i = 0; i < providerCount; i++) { + Provider provider = mProviders.get(i); + provider.tag = TAG_UNDEFINED; + } + + final int hostCount = mHosts.size(); + for (int i = 0; i < hostCount; i++) { + Host host = mHosts.get(i); + host.tag = TAG_UNDEFINED; + } + } + private boolean writeProfileStateToFileLocked(FileOutputStream stream, int userId) { int N;