diff options
Diffstat (limited to 'services/java/com/android/server/AppWidgetServiceImpl.java')
| -rw-r--r-- | services/java/com/android/server/AppWidgetServiceImpl.java | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java index d2354a6..bba5192 100644 --- a/services/java/com/android/server/AppWidgetServiceImpl.java +++ b/services/java/com/android/server/AppWidgetServiceImpl.java @@ -336,6 +336,7 @@ class AppWidgetServiceImpl { pw.print(info.autoAdvanceViewId); pw.print(" initialLayout=#"); pw.print(Integer.toHexString(info.initialLayout)); + pw.print(" uid="); pw.print(p.uid); pw.print(" zombie="); pw.println(p.zombie); } @@ -699,6 +700,10 @@ class AppWidgetServiceImpl { } int userId = UserHandle.getUserId(id.provider.uid); + if (userId != mUserId) { + Slog.w(TAG, "AppWidgetServiceImpl of user " + mUserId + + " binding to provider on user " + userId); + } // Bind to the RemoteViewsService (which will trigger a callback to the // RemoteViewsAdapter.onServiceConnected()) final long token = Binder.clearCallingIdentity(); @@ -966,6 +971,13 @@ class AppWidgetServiceImpl { ensureStateLoadedLocked(); for (int i = 0; i < N; i++) { AppWidgetId id = lookupAppWidgetIdLocked(appWidgetIds[i]); + if (id == null) { + String message = "AppWidgetId NPE: mUserId=" + mUserId + + ", callingUid=" + Binder.getCallingUid() + + ", appWidgetIds[i]=" + appWidgetIds[i] + + "\n mAppWidgets:\n" + getUserWidgets(); + throw new NullPointerException(message); + } if (id.views != null) { // Only trigger a partial update for a widget if it has received a full update updateAppWidgetInstanceLocked(id, views, true); @@ -974,6 +986,18 @@ class AppWidgetServiceImpl { } } + private String getUserWidgets() { + StringBuffer sb = new StringBuffer(); + for (AppWidgetId widget: mAppWidgetIds) { + sb.append(" id="); sb.append(widget.appWidgetId); + sb.append(", hostUid="); sb.append(widget.host.uid); + sb.append(", provider="); sb.append(widget.provider.info.provider.toString()); + sb.append("\n"); + } + sb.append("\n"); + return sb.toString(); + } + public void notifyAppWidgetViewDataChanged(int[] appWidgetIds, int viewId) { if (appWidgetIds == null) { return; @@ -1358,6 +1382,28 @@ class AppWidgetServiceImpl { } } + static int[] getAppWidgetIds(Host h) { + int instancesSize = h.instances.size(); + int appWidgetIds[] = new int[instancesSize]; + for (int i = 0; i < instancesSize; i++) { + appWidgetIds[i] = h.instances.get(i).appWidgetId; + } + return appWidgetIds; + } + + public int[] getAppWidgetIdsForHost(int hostId) { + synchronized (mAppWidgetIds) { + ensureStateLoadedLocked(); + int callingUid = Binder.getCallingUid(); + Host host = lookupHostLocked(callingUid, hostId); + if (host != null) { + return getAppWidgetIds(host); + } else { + return new int[0]; + } + } + } + private Provider parseProviderInfoXml(ComponentName component, ResolveInfo ri) { Provider p = null; |
