Merge "Make 3rd party lockscreen widgets work on secondary users" into jb-mr1.1-dev

This commit is contained in:
Amith Yamasani
2012-12-05 05:44:55 -08:00
committed by Android (Google) Code Review
4 changed files with 31 additions and 4 deletions

View File

@@ -60,6 +60,7 @@ public class AppWidgetHost {
public void updateAppWidget(int appWidgetId, RemoteViews views) { public void updateAppWidget(int appWidgetId, RemoteViews views) {
if (isLocalBinder() && views != null) { if (isLocalBinder() && views != null) {
views = views.clone(); views = views.clone();
views.setUser(mUser);
} }
Message msg = mHandler.obtainMessage(HANDLE_UPDATE); Message msg = mHandler.obtainMessage(HANDLE_UPDATE);
msg.arg1 = appWidgetId; msg.arg1 = appWidgetId;
@@ -123,6 +124,8 @@ public class AppWidgetHost {
Callbacks mCallbacks = new Callbacks(); Callbacks mCallbacks = new Callbacks();
final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>(); final HashMap<Integer,AppWidgetHostView> mViews = new HashMap<Integer, AppWidgetHostView>();
private OnClickHandler mOnClickHandler; private OnClickHandler mOnClickHandler;
// Optionally set by lockscreen
private UserHandle mUser;
public AppWidgetHost(Context context, int hostId) { public AppWidgetHost(Context context, int hostId) {
this(context, hostId, null, context.getMainLooper()); this(context, hostId, null, context.getMainLooper());
@@ -137,9 +140,15 @@ public class AppWidgetHost {
mOnClickHandler = handler; mOnClickHandler = handler;
mHandler = new UpdateHandler(looper); mHandler = new UpdateHandler(looper);
mDisplayMetrics = context.getResources().getDisplayMetrics(); mDisplayMetrics = context.getResources().getDisplayMetrics();
mUser = Process.myUserHandle();
bindService(); bindService();
} }
/** @hide */
public void setUserId(int userId) {
mUser = new UserHandle(userId);
}
private static void bindService() { private static void bindService() {
synchronized (sServiceLock) { synchronized (sServiceLock) {
if (sService == null) { if (sService == null) {
@@ -179,6 +188,9 @@ public class AppWidgetHost {
final int N = updatedIds.length; final int N = updatedIds.length;
for (int i=0; i<N; i++) { 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)); updateAppWidgetView(updatedIds[i], updatedViews.get(i));
} }
} }
@@ -350,6 +362,7 @@ public class AppWidgetHost {
public final AppWidgetHostView createView(Context context, int appWidgetId, public final AppWidgetHostView createView(Context context, int appWidgetId,
AppWidgetProviderInfo appWidget) { AppWidgetProviderInfo appWidget) {
AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget); AppWidgetHostView view = onCreateView(context, appWidgetId, appWidget);
view.setUserId(mUser.getIdentifier());
view.setOnClickHandler(mOnClickHandler); view.setOnClickHandler(mOnClickHandler);
view.setAppWidget(appWidgetId, appWidget); view.setAppWidget(appWidgetId, appWidget);
synchronized (mViews) { synchronized (mViews) {
@@ -358,6 +371,9 @@ public class AppWidgetHost {
RemoteViews views; RemoteViews views;
try { try {
views = sService.getAppWidgetViews(appWidgetId); views = sService.getAppWidgetViews(appWidgetId);
if (views != null) {
views.setUser(mUser);
}
} catch (RemoteException e) { } catch (RemoteException e) {
throw new RuntimeException("system server dead?", e); throw new RuntimeException("system server dead?", e);
} }

View File

@@ -31,7 +31,9 @@ import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Parcel; import android.os.Parcel;
import android.os.Parcelable; import android.os.Parcelable;
import android.os.Process;
import android.os.SystemClock; import android.os.SystemClock;
import android.os.UserHandle;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
@@ -85,6 +87,7 @@ public class AppWidgetHostView extends FrameLayout {
Bitmap mOld; Bitmap mOld;
Paint mOldPaint = new Paint(); Paint mOldPaint = new Paint();
private OnClickHandler mOnClickHandler; private OnClickHandler mOnClickHandler;
private UserHandle mUser;
/** /**
* Create a host view. Uses default fade animations. * 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) { public AppWidgetHostView(Context context, int animationIn, int animationOut) {
super(context); super(context);
mContext = context; mContext = context;
mUser = Process.myUserHandle();
// We want to segregate the view ids within AppWidgets to prevent // We want to segregate the view ids within AppWidgets to prevent
// problems when those ids collide with view ids in the AppWidgetHost. // problems when those ids collide with view ids in the AppWidgetHost.
setIsRootNamespace(true); setIsRootNamespace(true);
} }
/** @hide */
public void setUserId(int userId) {
mUser = new UserHandle(userId);
}
/** /**
* Pass the given handler to RemoteViews when updating this widget. Unless this * Pass the given handler to RemoteViews when updating this widget. Unless this
* is done immediatly after construction, a call to {@link #updateAppWidget(RemoteViews)} * is done immediatly after construction, a call to {@link #updateAppWidget(RemoteViews)}
@@ -465,7 +473,8 @@ public class AppWidgetHostView extends FrameLayout {
try { try {
// Return if cloned successfully, otherwise default // Return if cloned successfully, otherwise default
return mContext.createPackageContext(packageName, Context.CONTEXT_RESTRICTED); return mContext.createPackageContextAsUser(packageName, Context.CONTEXT_RESTRICTED,
mUser);
} catch (NameNotFoundException e) { } catch (NameNotFoundException e) {
Log.e(TAG, "Package name " + packageName + " not found"); Log.e(TAG, "Package name " + packageName + " not found");
return mContext; return mContext;
@@ -539,8 +548,8 @@ public class AppWidgetHostView extends FrameLayout {
try { try {
if (mInfo != null) { if (mInfo != null) {
Context theirContext = mContext.createPackageContext( Context theirContext = mContext.createPackageContextAsUser(
mInfo.provider.getPackageName(), Context.CONTEXT_RESTRICTED); mInfo.provider.getPackageName(), Context.CONTEXT_RESTRICTED, mUser);
mRemoteContext = theirContext; mRemoteContext = theirContext;
LayoutInflater inflater = (LayoutInflater) LayoutInflater inflater = (LayoutInflater)
theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); theirContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

View File

@@ -1001,6 +1001,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
long itemId = 0; long itemId = 0;
try { try {
remoteViews = factory.getViewAt(position); remoteViews = factory.getViewAt(position);
remoteViews.setUser(new UserHandle(mUserId));
itemId = factory.getItemId(position); itemId = factory.getItemId(position);
} catch (RemoteException e) { } catch (RemoteException e) {
Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + e.getMessage()); Log.e(TAG, "Error in updateRemoteViews(" + position + "): " + e.getMessage());

View File

@@ -133,6 +133,7 @@ public class KeyguardHostView extends KeyguardViewBase {
mUserId = mLockPatternUtils.getCurrentUser(); mUserId = mLockPatternUtils.getCurrentUser();
mAppWidgetHost = new AppWidgetHost( mAppWidgetHost = new AppWidgetHost(
context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper()); context, APPWIDGET_HOST_ID, mOnClickHandler, Looper.myLooper());
mAppWidgetHost.setUserId(mUserId);
cleanupAppWidgetIds(); cleanupAppWidgetIds();
mAppWidgetManager = AppWidgetManager.getInstance(mContext); mAppWidgetManager = AppWidgetManager.getInstance(mContext);