Merge "Load shared library dependencies for AppWidgets" into lmp-dev

This commit is contained in:
Adam Lesinski
2014-10-07 19:51:16 +00:00
committed by Android (Google) Code Review
7 changed files with 103 additions and 14 deletions

View File

@ -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;
}

View File

@ -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 {

View File

@ -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>

View File

@ -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>

View File

@ -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" />

View File

@ -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) {
}
}

View File

@ -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>