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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
@@ -2207,9 +2207,15 @@ class AppWidgetServiceImpl extends IAppWidgetService.Stub implements WidgetBacku
|
||||
private List<ResolveInfo> 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 {
|
||||
|
||||
@@ -25,5 +25,13 @@
|
||||
<category android:name="android.intent.category.LAUNCHER" />
|
||||
</intent-filter>
|
||||
</activity>
|
||||
|
||||
<receiver android:name="DependentAppwidgetProvider">
|
||||
<intent-filter>
|
||||
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
|
||||
</intent-filter>
|
||||
<meta-data android:name="android.appwidget.provider"
|
||||
android:resource="@xml/dependent_appwidget_info" />
|
||||
</receiver>
|
||||
</application>
|
||||
</manifest>
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
|
||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:orientation="vertical"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="match_parent">
|
||||
|
||||
<TextView android:id="@+id/label"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:text="@com.google.android.test.shared_library:string/shared_string"
|
||||
style="@com.google.android.test.shared_library:style/CodeFont"/>
|
||||
|
||||
<ImageView
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:src="@com.google.android.test.shared_library:drawable/size_48x48"/>
|
||||
</LinearLayout>
|
||||
@@ -0,0 +1,22 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<!-- 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.
|
||||
-->
|
||||
|
||||
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:minWidth="40dp"
|
||||
android:minHeight="40dp"
|
||||
android:updatePeriodMillis="0"
|
||||
android:initialLayout="@layout/dependent_appwidget"
|
||||
android:resizeMode="horizontal|vertical" />
|
||||
@@ -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) {
|
||||
|
||||
}
|
||||
}
|
||||
@@ -13,5 +13,7 @@
|
||||
<public type="attr" name="zip" id="0x00010005" />
|
||||
<public type="attr" name="country" id="0x00010006" />
|
||||
|
||||
<public type="drawable" name="size_48x48" id="0x00030000" />
|
||||
|
||||
<public type="array" name="animals" id="0x02050000" />
|
||||
</resources>
|
||||
|
||||
Reference in New Issue
Block a user