From d00bb5edcfc8ee5c2026f66785b703b388314b22 Mon Sep 17 00:00:00 2001 From: Adam Lesinski Date: Tue, 7 Oct 2014 12:14:45 -0700 Subject: [PATCH] Load shared library dependencies for AppWidgets PackageManager and AppWidgetHostServiceImpl should be loading the resources of any shared libraries being used by the app, as they have references in their Widgets or application icons/labels, etc. Bug:17668152 Change-Id: I359662334edb125d7570089916727df4eeba02bb --- .../app/ApplicationPackageManager.java | 30 +++++++++++-------- .../appwidget/AppWidgetServiceImpl.java | 8 ++++- .../SharedLibrary/client/AndroidManifest.xml | 8 +++++ .../client/res/layout/dependent_appwidget.xml | 18 +++++++++++ .../res/xml/dependent_appwidget_info.xml | 22 ++++++++++++++ .../DependentAppwidgetProvider.java | 29 ++++++++++++++++++ tests/SharedLibrary/lib/res/values/public.xml | 2 ++ 7 files changed, 103 insertions(+), 14 deletions(-) create mode 100644 tests/SharedLibrary/client/res/layout/dependent_appwidget.xml create mode 100644 tests/SharedLibrary/client/res/xml/dependent_appwidget_info.xml create mode 100644 tests/SharedLibrary/client/src/com/google/android/test/lib_client/DependentAppwidgetProvider.java diff --git a/core/java/android/app/ApplicationPackageManager.java b/core/java/android/app/ApplicationPackageManager.java index 6860683679fd4..1e1a6130bb186 100644 --- a/core/java/android/app/ApplicationPackageManager.java +++ b/core/java/android/app/ApplicationPackageManager.java @@ -80,6 +80,9 @@ final class ApplicationPackageManager extends PackageManager { private final static boolean DEBUG = false; private final static boolean DEBUG_ICONS = false; + // Default flags to use with PackageManager when no flags are given. + private final static int sDefaultFlags = PackageManager.GET_SHARED_LIBRARY_FILES; + private final Object mLock = new Object(); @GuardedBy("mLock") @@ -730,7 +733,7 @@ final class ApplicationPackageManager extends PackageManager { } if (appInfo == null) { try { - appInfo = getApplicationInfo(packageName, 0); + appInfo = getApplicationInfo(packageName, sDefaultFlags); } catch (NameNotFoundException e) { return null; } @@ -770,7 +773,7 @@ final class ApplicationPackageManager extends PackageManager { @Override public Drawable getActivityIcon(ComponentName activityName) throws NameNotFoundException { - return getActivityInfo(activityName, 0).loadIcon(this); + return getActivityInfo(activityName, sDefaultFlags).loadIcon(this); } @Override public Drawable getActivityIcon(Intent intent) @@ -799,13 +802,13 @@ final class ApplicationPackageManager extends PackageManager { @Override public Drawable getApplicationIcon(String packageName) throws NameNotFoundException { - return getApplicationIcon(getApplicationInfo(packageName, 0)); + return getApplicationIcon(getApplicationInfo(packageName, sDefaultFlags)); } @Override public Drawable getActivityBanner(ComponentName activityName) throws NameNotFoundException { - return getActivityInfo(activityName, 0).loadBanner(this); + return getActivityInfo(activityName, sDefaultFlags).loadBanner(this); } @Override @@ -832,13 +835,13 @@ final class ApplicationPackageManager extends PackageManager { @Override public Drawable getApplicationBanner(String packageName) throws NameNotFoundException { - return getApplicationBanner(getApplicationInfo(packageName, 0)); + return getApplicationBanner(getApplicationInfo(packageName, sDefaultFlags)); } @Override public Drawable getActivityLogo(ComponentName activityName) throws NameNotFoundException { - return getActivityInfo(activityName, 0).loadLogo(this); + return getActivityInfo(activityName, sDefaultFlags).loadLogo(this); } @Override @@ -865,7 +868,7 @@ final class ApplicationPackageManager extends PackageManager { @Override public Drawable getApplicationLogo(String packageName) throws NameNotFoundException { - return getApplicationLogo(getApplicationInfo(packageName, 0)); + return getApplicationLogo(getApplicationInfo(packageName, sDefaultFlags)); } @Override @@ -914,7 +917,7 @@ final class ApplicationPackageManager extends PackageManager { @Override public Resources getResourcesForActivity( ComponentName activityName) throws NameNotFoundException { return getResourcesForApplication( - getActivityInfo(activityName, 0).applicationInfo); + getActivityInfo(activityName, sDefaultFlags).applicationInfo); } @Override public Resources getResourcesForApplication( @@ -926,7 +929,8 @@ final class ApplicationPackageManager extends PackageManager { Resources r = mContext.mMainThread.getTopLevelResources( sameUid ? app.sourceDir : app.publicSourceDir, sameUid ? app.splitSourceDirs : app.splitPublicSourceDirs, - app.resourceDirs, null, Display.DEFAULT_DISPLAY, null, mContext.mPackageInfo); + app.resourceDirs, app.sharedLibraryFiles, Display.DEFAULT_DISPLAY, + null, mContext.mPackageInfo); if (r != null) { return r; } @@ -936,7 +940,7 @@ final class ApplicationPackageManager extends PackageManager { @Override public Resources getResourcesForApplication( String appPackageName) throws NameNotFoundException { return getResourcesForApplication( - getApplicationInfo(appPackageName, 0)); + getApplicationInfo(appPackageName, sDefaultFlags)); } /** @hide */ @@ -951,7 +955,7 @@ final class ApplicationPackageManager extends PackageManager { return mContext.mMainThread.getSystemContext().getResources(); } try { - ApplicationInfo ai = mPM.getApplicationInfo(appPackageName, 0, userId); + ApplicationInfo ai = mPM.getApplicationInfo(appPackageName, sDefaultFlags, userId); if (ai != null) { return getResourcesForApplication(ai); } @@ -1136,7 +1140,7 @@ final class ApplicationPackageManager extends PackageManager { } if (appInfo == null) { try { - appInfo = getApplicationInfo(packageName, 0); + appInfo = getApplicationInfo(packageName, sDefaultFlags); } catch (NameNotFoundException e) { return null; } @@ -1164,7 +1168,7 @@ final class ApplicationPackageManager extends PackageManager { ApplicationInfo appInfo) { if (appInfo == null) { try { - appInfo = getApplicationInfo(packageName, 0); + appInfo = getApplicationInfo(packageName, sDefaultFlags); } catch (NameNotFoundException e) { return null; } diff --git a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java index 86cfdb98b7154..fca13f8f91c79 100644 --- a/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java +++ b/services/appwidget/java/com/android/server/appwidget/AppWidgetServiceImpl.java @@ -2207,9 +2207,15 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku private List queryIntentReceivers(Intent intent, int userId) { final long identity = Binder.clearCallingIdentity(); try { + int flags = PackageManager.GET_META_DATA; + + // Widgets referencing shared libraries need to have their + // dependencies loaded. + flags |= PackageManager.GET_SHARED_LIBRARY_FILES; + return mPackageManager.queryIntentReceivers(intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), - PackageManager.GET_META_DATA, userId); + flags, userId); } catch (RemoteException re) { return Collections.emptyList(); } finally { diff --git a/tests/SharedLibrary/client/AndroidManifest.xml b/tests/SharedLibrary/client/AndroidManifest.xml index a39c7540ceffe..d1167fa7322f4 100644 --- a/tests/SharedLibrary/client/AndroidManifest.xml +++ b/tests/SharedLibrary/client/AndroidManifest.xml @@ -25,5 +25,13 @@ + + + + + + + diff --git a/tests/SharedLibrary/client/res/layout/dependent_appwidget.xml b/tests/SharedLibrary/client/res/layout/dependent_appwidget.xml new file mode 100644 index 0000000000000..13beafac9a020 --- /dev/null +++ b/tests/SharedLibrary/client/res/layout/dependent_appwidget.xml @@ -0,0 +1,18 @@ + + + + + + + + diff --git a/tests/SharedLibrary/client/res/xml/dependent_appwidget_info.xml b/tests/SharedLibrary/client/res/xml/dependent_appwidget_info.xml new file mode 100644 index 0000000000000..452e01008e99c --- /dev/null +++ b/tests/SharedLibrary/client/res/xml/dependent_appwidget_info.xml @@ -0,0 +1,22 @@ + + + + diff --git a/tests/SharedLibrary/client/src/com/google/android/test/lib_client/DependentAppwidgetProvider.java b/tests/SharedLibrary/client/src/com/google/android/test/lib_client/DependentAppwidgetProvider.java new file mode 100644 index 0000000000000..4e9b26b13d732 --- /dev/null +++ b/tests/SharedLibrary/client/src/com/google/android/test/lib_client/DependentAppwidgetProvider.java @@ -0,0 +1,29 @@ +/* + * Copyright (C) 2013 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.google.android.test.lib_client; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +public class DependentAppwidgetProvider extends BroadcastReceiver { + + @Override + public void onReceive(Context context, Intent intent) { + + } +} diff --git a/tests/SharedLibrary/lib/res/values/public.xml b/tests/SharedLibrary/lib/res/values/public.xml index 37b1ec9da8ca4..23d307e03a2dc 100644 --- a/tests/SharedLibrary/lib/res/values/public.xml +++ b/tests/SharedLibrary/lib/res/values/public.xml @@ -13,5 +13,7 @@ + +