From 94022e8997084be458a1faf46e72efab1d59e973 Mon Sep 17 00:00:00 2001 From: Amith Yamasani Date: Tue, 4 Dec 2012 11:05:39 -0800 Subject: [PATCH] Make 3rd party lockscreen widgets work on secondary users If you install a lockscreen widget app on a secondary user, lockscreen fails to find it. There were several places where the correct context and userId were required under the covers - AppWidgetHost, AppWidgetHostView and RemoteViewsAdapter. Set the user id in the required places and use it to query the package information. Bug: 7662835 Change-Id: Ife482c8ab2a2e601650b7cfe2660e88d3b8f2050 --- core/java/android/appwidget/AppWidgetHost.java | 16 ++++++++++++++++ .../android/appwidget/AppWidgetHostView.java | 17 +++++++++++++---- .../java/android/widget/RemoteViewsAdapter.java | 1 + .../policy/impl/keyguard/KeyguardHostView.java | 1 + 4 files changed, 31 insertions(+), 4 deletions(-) diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java index 6a99ccdd0d8de..fa3bf4d32a6d3 100644 --- a/core/java/android/appwidget/AppWidgetHost.java +++ b/core/java/android/appwidget/AppWidgetHost.java @@ -60,6 +60,7 @@ public class AppWidgetHost { public void updateAppWidget(int appWidgetId, RemoteViews views) { if (isLocalBinder() && views != null) { views = views.clone(); + views.setUser(mUser); } Message msg = mHandler.obtainMessage(HANDLE_UPDATE); msg.arg1 = appWidgetId; @@ -123,6 +124,8 @@ public class AppWidgetHost { Callbacks mCallbacks = new Callbacks(); final HashMap mViews = new HashMap(); private OnClickHandler mOnClickHandler; + // Optionally set by lockscreen + private UserHandle mUser; public AppWidgetHost(Context context, int hostId) { this(context, hostId, null, context.getMainLooper()); @@ -137,9 +140,15 @@ public class AppWidgetHost { mOnClickHandler = handler; mHandler = new UpdateHandler(looper); mDisplayMetrics = context.getResources().getDisplayMetrics(); + mUser = Process.myUserHandle(); bindService(); } + /** @hide */ + public void setUserId(int userId) { + mUser = new UserHandle(userId); + } + private static void bindService() { synchronized (sServiceLock) { if (sService == null) { @@ -179,6 +188,9 @@ public class AppWidgetHost { final int N = updatedIds.length; for (int i=0; i