diff options
| -rw-r--r-- | core/java/android/content/pm/IPackageManager.aidl | 2 | ||||
| -rw-r--r-- | services/core/java/com/android/server/pm/PackageManagerService.java | 39 |
2 files changed, 36 insertions, 5 deletions
diff --git a/core/java/android/content/pm/IPackageManager.aidl b/core/java/android/content/pm/IPackageManager.aidl index 19cca8ed1f66..01f4e00210bd 100644 --- a/core/java/android/content/pm/IPackageManager.aidl +++ b/core/java/android/content/pm/IPackageManager.aidl @@ -138,6 +138,8 @@ interface IPackageManager { ResolveInfo resolveIntent(in Intent intent, String resolvedType, int flags, int userId); + ResolveInfo findPersistentPreferredActivity(in Intent intent, int userId); + boolean canForwardTo(in Intent intent, String resolvedType, int sourceUserId, int targetUserId); ParceledListSlice queryIntentActivities(in Intent intent, diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index af1e007f9be3..dbb3f95d3e8b 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -3745,6 +3745,19 @@ public class PackageManagerService extends IPackageManager.Stub { } /** + * Update given intent when being used to request {@link ResolveInfo}. + */ + private Intent updateIntentForResolve(Intent intent) { + if (intent.getSelector() != null) { + intent = intent.getSelector(); + } + if (DEBUG_PREFERRED) { + intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); + } + return intent; + } + + /** * Update given flags when being used to request {@link ResolveInfo}. */ int updateFlagsForResolve(int flags, int userId, Object cookie) { @@ -5128,6 +5141,26 @@ public class PackageManagerService extends IPackageManager.Stub { } @Override + public ResolveInfo findPersistentPreferredActivity(Intent intent, int userId) { + if (!UserHandle.isSameApp(Binder.getCallingUid(), Process.SYSTEM_UID)) { + throw new SecurityException( + "findPersistentPreferredActivity can only be run by the system"); + } + if (!sUserManager.exists(userId)) { + return null; + } + intent = updateIntentForResolve(intent); + final String resolvedType = intent.resolveTypeIfNeeded(mContext.getContentResolver()); + final int flags = updateFlagsForResolve(0, userId, intent); + final List<ResolveInfo> query = queryIntentActivitiesInternal(intent, resolvedType, flags, + userId); + synchronized (mPackages) { + return findPersistentPreferredActivityLP(intent, resolvedType, flags, query, false, + userId); + } + } + + @Override public void setLastChosenActivity(Intent intent, String resolvedType, int flags, IntentFilter filter, int match, ComponentName activity) { final int userId = UserHandle.getCallingUserId(); @@ -5393,13 +5426,9 @@ public class PackageManagerService extends IPackageManager.Stub { boolean removeMatches, boolean debug, int userId) { if (!sUserManager.exists(userId)) return null; flags = updateFlagsForResolve(flags, userId, intent); + intent = updateIntentForResolve(intent); // writer synchronized (mPackages) { - if (intent.getSelector() != null) { - intent = intent.getSelector(); - } - if (DEBUG_PREFERRED) intent.addFlags(Intent.FLAG_DEBUG_LOG_RESOLUTION); - // Try to find a matching persistent preferred activity. ResolveInfo pri = findPersistentPreferredActivityLP(intent, resolvedType, flags, query, debug, userId); |