Logging to help find the cause of widget crash in clock widget.

This will continue to crash as before, but will show some useful
information in the exception.

Bug: 7450247

Change-Id: Ib3160a5f64154517791d165973c12294ecd09901
diff --git a/services/java/com/android/server/AppWidgetServiceImpl.java b/services/java/com/android/server/AppWidgetServiceImpl.java
index fe92b26..bba5192 100644
--- a/services/java/com/android/server/AppWidgetServiceImpl.java
+++ b/services/java/com/android/server/AppWidgetServiceImpl.java
@@ -336,6 +336,7 @@
                 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 @@
             }
 
             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 @@
             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 @@
         }
     }
 
+    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;