diff options
| author | 2014-08-07 00:58:07 +0000 | |
|---|---|---|
| committer | 2014-08-05 00:35:13 +0000 | |
| commit | 67739a3a19a76773440e8a4353b311e9ee31e18c (patch) | |
| tree | 1f501027d266bd2c77aabead55c89078adfd7a34 | |
| parent | 14e15fe4abf083ac1bb83163946bd1e679e19108 (diff) | |
| parent | 0da85b6c9073956b620c6a88b44027e9ee80066c (diff) | |
Merge "Fix regression in remote views." into lmp-dev
| -rw-r--r-- | core/java/android/app/Notification.java | 7 | ||||
| -rw-r--r-- | core/java/android/widget/RemoteViews.java | 89 |
2 files changed, 61 insertions, 35 deletions
diff --git a/core/java/android/app/Notification.java b/core/java/android/app/Notification.java index 5b36b8bd74fb..5684a7a0966b 100644 --- a/core/java/android/app/Notification.java +++ b/core/java/android/app/Notification.java @@ -2577,7 +2577,8 @@ public class Notification implements Parcelable private RemoteViews applyStandardTemplate(int resId, boolean fitIn1U) { Bitmap profileIcon = getProfileBadge(); - RemoteViews contentView = new BuilderRemoteViews(mContext.getPackageName(), resId); + RemoteViews contentView = new BuilderRemoteViews(mContext.getPackageName(), + mOriginatingUserId, resId); boolean showLine3 = false; boolean showLine2 = false; @@ -4576,8 +4577,8 @@ public class Notification implements Parcelable super(parcel); } - public BuilderRemoteViews(String packageName, int layoutId) { - super(packageName, layoutId); + public BuilderRemoteViews(String packageName, int userId, int layoutId) { + super(packageName, userId, layoutId); } @Override diff --git a/core/java/android/widget/RemoteViews.java b/core/java/android/widget/RemoteViews.java index 1098fa23db37..8aef304872e9 100644 --- a/core/java/android/widget/RemoteViews.java +++ b/core/java/android/widget/RemoteViews.java @@ -18,6 +18,7 @@ package android.widget; import android.app.ActivityOptions; import android.app.ActivityThread; +import android.app.Application; import android.app.PendingIntent; import android.appwidget.AppWidgetHostView; import android.content.Context; @@ -81,12 +82,6 @@ public class RemoteViews implements Parcelable, Filter { private ApplicationInfo mApplication; /** - * The package name of the package containing the layout - * resource. (Added to the parcel) - */ - private final String mPackage; - - /** * The resource ID of the layout file. (Added to the parcel) */ private final int mLayoutId; @@ -1635,11 +1630,34 @@ public class RemoteViews implements Parcelable, Filter { * @param layoutId The id of the layout resource */ public RemoteViews(String packageName, int layoutId) { - mPackage = packageName; + this(getApplicationInfo(packageName, UserHandle.myUserId()), layoutId); + } + + /** + * Create a new RemoteViews object that will display the views contained + * in the specified layout file. + * + * @param packageName Name of the package that contains the layout resource. + * @param userId The user under which the package is running. + * @param layoutId The id of the layout resource. + * + * @hide + */ + public RemoteViews(String packageName, int userId, int layoutId) { + this(getApplicationInfo(packageName, userId), layoutId); + } + + /** + * Create a new RemoteViews object that will display the views contained + * in the specified layout file. + * + * @param application The application whose content is shown by the views. + * @param layoutId The id of the layout resource. + */ + private RemoteViews(ApplicationInfo application, int layoutId) { + mApplication = application; mLayoutId = layoutId; mBitmapCache = new BitmapCache(); - mApplication = ActivityThread.currentApplication().getApplicationInfo(); - // setup the memory usage statistics mMemoryUsageCounter = new MemoryUsageCounter(); recalculateMemoryUsage(); @@ -1660,10 +1678,11 @@ public class RemoteViews implements Parcelable, Filter { if (landscape == null || portrait == null) { throw new RuntimeException("Both RemoteViews must be non-null"); } - if (landscape.getPackage().compareTo(portrait.getPackage()) != 0) { - throw new RuntimeException("Both RemoteViews must share the same package"); + if (landscape.mApplication.uid != portrait.mApplication.uid + || !landscape.mApplication.packageName.equals(portrait.mApplication.packageName)) { + throw new RuntimeException("Both RemoteViews must share the same package and user"); } - mPackage = portrait.getPackage(); + mApplication = portrait.mApplication; mLayoutId = portrait.getLayoutId(); mLandscape = landscape; @@ -1700,7 +1719,7 @@ public class RemoteViews implements Parcelable, Filter { } if (mode == MODE_NORMAL) { - mPackage = parcel.readString(); + mApplication = parcel.readParcelable(null); mLayoutId = parcel.readInt(); mIsWidgetCollectionChild = parcel.readInt() == 1; @@ -1764,12 +1783,10 @@ public class RemoteViews implements Parcelable, Filter { // MODE_HAS_LANDSCAPE_AND_PORTRAIT mLandscape = new RemoteViews(parcel, mBitmapCache); mPortrait = new RemoteViews(parcel, mBitmapCache); - mPackage = mPortrait.getPackage(); + mApplication = mPortrait.mApplication; mLayoutId = mPortrait.getLayoutId(); } - mApplication = parcel.readParcelable(null); - // setup the memory usage statistics mMemoryUsageCounter = new MemoryUsageCounter(); recalculateMemoryUsage(); @@ -1786,7 +1803,7 @@ public class RemoteViews implements Parcelable, Filter { } public String getPackage() { - return mPackage; + return mApplication.packageName; } /** @@ -2565,19 +2582,7 @@ public class RemoteViews implements Parcelable, Filter { return context.createApplicationContext(mApplication, Context.CONTEXT_RESTRICTED); } catch (NameNotFoundException e) { - Log.e(LOG_TAG, "Package name " + mPackage + " not found"); - } - } - - if (mPackage != null) { - if (context.getPackageName().equals(mPackage)) { - return context; - } - try { - return context.createPackageContext( - mPackage, Context.CONTEXT_RESTRICTED); - } catch (NameNotFoundException e) { - Log.e(LOG_TAG, "Package name " + mPackage + " not found"); + Log.e(LOG_TAG, "Package name " + mApplication.packageName + " not found"); } } @@ -2614,7 +2619,7 @@ public class RemoteViews implements Parcelable, Filter { if (mIsRoot) { mBitmapCache.writeBitmapsToParcel(dest, flags); } - dest.writeString(mPackage); + dest.writeParcelable(mApplication, flags); dest.writeInt(mLayoutId); dest.writeInt(mIsWidgetCollectionChild ? 1 : 0); int count; @@ -2638,8 +2643,28 @@ public class RemoteViews implements Parcelable, Filter { mLandscape.writeToParcel(dest, flags); mPortrait.writeToParcel(dest, flags); } + } + + private static ApplicationInfo getApplicationInfo(String packageName, int userId) { + // Get the application for the passed in package and user. + Application application = ActivityThread.currentApplication(); + if (application == null) { + throw new IllegalStateException("Cannot create remote views out of an aplication."); + } + + ApplicationInfo applicationInfo = application.getApplicationInfo(); + if (UserHandle.getUserId(applicationInfo.uid) != userId + || !applicationInfo.packageName.equals(packageName)) { + try { + Context context = application.getApplicationContext().createPackageContextAsUser( + packageName, 0, new UserHandle(userId)); + applicationInfo = context.getApplicationInfo(); + } catch (NameNotFoundException nnfe) { + throw new IllegalArgumentException("No such package " + packageName); + } + } - dest.writeParcelable(mApplication, 0); + return applicationInfo; } /** |