diff options
author | Amith Yamasani <yamasani@google.com> | 2012-12-05 13:00:41 -0800 |
---|---|---|
committer | Android Git Automerger <android-git-automerger@android.com> | 2012-12-05 13:00:41 -0800 |
commit | c1493e1a01c45b491071142eefb485c90f08d823 (patch) | |
tree | 984fa0e156d4f644d5192469e605831e56ba3869 | |
parent | 8435d0e8ffe75d3fe49d3c730907ff571c59024d (diff) | |
parent | 368ee53f25cdff7ea89293d2cc81e95816919369 (diff) | |
download | frameworks_base-c1493e1a01c45b491071142eefb485c90f08d823.zip frameworks_base-c1493e1a01c45b491071142eefb485c90f08d823.tar.gz frameworks_base-c1493e1a01c45b491071142eefb485c90f08d823.tar.bz2 |
am 368ee53f: am f663cad2: am 6c58b155: Merge "Make 3rd party lockscreen widgets work on secondary users" into jb-mr1.1-dev
* commit '368ee53f25cdff7ea89293d2cc81e95816919369':
Make 3rd party lockscreen widgets work on secondary users
4 files changed, 31 insertions, 4 deletions
diff --git a/core/java/android/appwidget/AppWidgetHost.java b/core/java/android/appwidget/AppWidgetHost.java index 6a99ccd..fa3bf4d 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<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>(); 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<N; i++) { + if (updatedViews.get(i) != null) { + updatedViews.get(i).setUser(new UserHandle(userId)); + } updateAppWidgetView(updatedIds[i], updatedViews.get(i)); } } @@ -350,6 +362,7 @@ public class AppWidgetHost { public final AppWidgetHostView createView(Context context, int appWidgetId, AppWidgetProviderInfo appWidget) { AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget); + view.setUserId(mUser.getIdentifier()); view.setOnClickHandler(mOnClickHandler); view.setAppWidget(appWidgetId, appWidget); synchronized (mViews) { @@ -358,6 +371,9 @@ public class AppWidgetHost { RemoteViews views; try { views = sService.getAppWidgetViews(appWidgetId); + if (views != null) { + views.setUser(mUser); + } } catch (RemoteException e) { throw new RuntimeException("system server dead?", e); } diff --git a/core/java/android/appwidget/AppWidgetHostView.java b/core/java/android/appwidget/AppWidgetHostView.java index 52771ee..700bba8 100644 --- a/core/java/android/appwidget/AppWidgetHostView.java +++ b/core/java/android/appwidget/AppWidgetHostView.java @@ -31,7 +31,9 @@ import android.os.Build; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; +import android.os.Process; import android.os.SystemClock; +import android.os.UserHandle; import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; @@ -85,6 +87,7 @@ public class AppWidgetHostView extends FrameLayout { Bitmap mOld; Paint mOldPaint = new Paint(); private OnClickHandler mOnClickHandler; + private UserHandle mUser; /** * Create a host view. Uses default fade animations. @@ -112,12 +115,17 @@ public class AppWidgetHostView extends FrameLayout { public AppWidgetHostView(Context context, int animationIn, int animationOut) { super(context); mContext = context; - + mUser = Process.myUserHandle(); // We want to segregate the view ids within AppWidgets to prevent // problems when those ids collide with view ids in the AppWidgetHost. setIsRootNamespace(true); } + /** @hide */ + public void setUserId(int userId) { + mUser = new UserHandle(userId); + } + /** * Pass the given handler to RemoteViews when updating this widget. Unless this * is done immediatly after construction, a call to {@link #updateAppWidget(RemoteViews)} @@ -465,7 +473,8 @@ public class AppWidgetHostView extends FrameLayout { try { // Return if cloned successfully, otherwise default - return mContext.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); + return mContext.createPackageContextAsUser(packageName, Context.CONTEXT_RESTRICTED, + mUser); } catch (NameNotFoundException e) { Log.e(TAG, "Package name " + packageName + " not found"); return mContext; @@ -539,8 +548,8 @@ public class AppWidgetHostView extends FrameLayout { try { if (mInfo != null) { - Context theirContext = mContext.createPackageContext( - mInfo.provider.getPackageName(), Context.CONTEXT_RESTRICTED); + Context theirContext = mContext.createPackageContextAsUser( + mInfo.provider.getPackageName(), Context.CONTEXT_RESTRICTED, mUser); mRemoteContext = theirContext; LayoutInflater inflater = (LayoutInflater) theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); diff --git a/core/java/android/widget/RemoteViewsAdapter.java b/core/java/android/widget/RemoteViewsAdapter.java index 499f6ad..b088c59 100644 --- a/core/java/android/widget/RemoteViewsAdapter.java +++ b/core/java/android/widget/RemoteViewsAdapter.java @@ -1001,6 +1001,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback long itemId = 0; try { remoteViews = factory.getViewAt(position); + remoteViews.setUser(new UserHandle(mUserId)); itemId = factory.getItemId(position); } catch (RemoteException e) { Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + e.getMessage()); diff --git a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java index c47f89d..801b627 100644 --- a/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java +++ b/policy/src/com/android/internal/policy/impl/keyguard/KeyguardHostView.java @@ -133,6 +133,7 @@ public class KeyguardHostView extends KeyguardViewBase { mUserId = mLockPatternUtils.getCurrentUser(); mAppWidgetHost = new AppWidgetHost( context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper()); + mAppWidgetHost.setUserId(mUserId); cleanupAppWidgetIds(); mAppWidgetManager = AppWidgetManager.getInstance(mContext); |