Merge "Make 3rd party lockscreen widgets work on secondary users" into jb-mr1.1-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
6c58b155c3
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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());
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user