Merge "Ensure recipient can be launched before attempting broadcast delivery" into klp-dev
This commit is contained in:
committed by
Android (Google) Code Review
commit
99437f252b
@@ -53,6 +53,7 @@ import android.content.IntentSender;
|
||||
* {@hide}
|
||||
*/
|
||||
interface IPackageManager {
|
||||
boolean isPackageAvailable(String packageName, int userId);
|
||||
PackageInfo getPackageInfo(String packageName, int flags, int userId);
|
||||
int getPackageUid(String packageName, int userId);
|
||||
int[] getPackageGids(String packageName);
|
||||
|
||||
@@ -282,6 +282,10 @@ public class PackageParser {
|
||||
|| (flags & PackageManager.GET_UNINSTALLED_PACKAGES) != 0;
|
||||
}
|
||||
|
||||
public static boolean isAvailable(PackageUserState state) {
|
||||
return checkUseInstalledOrBlocked(0, state);
|
||||
}
|
||||
|
||||
public static PackageInfo generatePackageInfo(PackageParser.Package p,
|
||||
int gids[], int flags, long firstInstallTime, long lastUpdateTime,
|
||||
HashSet<String> grantedPermissions, PackageUserState state, int userId) {
|
||||
|
||||
@@ -27,6 +27,7 @@ import android.content.ComponentName;
|
||||
import android.content.IIntentReceiver;
|
||||
import android.content.Intent;
|
||||
import android.content.pm.ActivityInfo;
|
||||
import android.content.pm.PackageInfo;
|
||||
import android.content.pm.PackageManager;
|
||||
import android.content.pm.ResolveInfo;
|
||||
import android.os.Bundle;
|
||||
@@ -814,6 +815,26 @@ public final class BroadcastQueue {
|
||||
+ " to " + r.curApp + ": process crashing");
|
||||
skip = true;
|
||||
}
|
||||
if (!skip) {
|
||||
boolean isAvailable = false;
|
||||
try {
|
||||
isAvailable = AppGlobals.getPackageManager().isPackageAvailable(
|
||||
info.activityInfo.packageName,
|
||||
UserHandle.getUserId(info.activityInfo.applicationInfo.uid));
|
||||
} catch (Exception e) {
|
||||
// all such failures mean we skip this receiver
|
||||
Slog.w(TAG, "Exception getting recipient info for "
|
||||
+ info.activityInfo.packageName, e);
|
||||
}
|
||||
if (!isAvailable) {
|
||||
if (DEBUG_BROADCAST) {
|
||||
Slog.v(TAG, "Skipping delivery to " + info.activityInfo.packageName
|
||||
+ " / " + info.activityInfo.applicationInfo.uid
|
||||
+ " : package no longer available");
|
||||
}
|
||||
skip = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (skip) {
|
||||
if (DEBUG_BROADCAST) Slog.v(TAG,
|
||||
|
||||
@@ -1771,6 +1771,24 @@ public class PackageManagerService extends IPackageManager.Stub {
|
||||
state, userId);
|
||||
}
|
||||
|
||||
public boolean isPackageAvailable(String packageName, int userId) {
|
||||
if (!sUserManager.exists(userId)) return false;
|
||||
enforceCrossUserPermission(Binder.getCallingUid(), userId, false, "is package available");
|
||||
synchronized (mPackages) {
|
||||
PackageParser.Package p = mPackages.get(packageName);
|
||||
if (p != null) {
|
||||
final PackageSetting ps = (PackageSetting) p.mExtras;
|
||||
if (ps != null) {
|
||||
final PackageUserState state = ps.readUserState(userId);
|
||||
if (state != null) {
|
||||
return PackageParser.isAvailable(state);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PackageInfo getPackageInfo(String packageName, int flags, int userId) {
|
||||
if (!sUserManager.exists(userId)) return null;
|
||||
|
||||
Reference in New Issue
Block a user