From 8a228cf12ae9e3a90f4d84baa8aee2cb88a38644 Mon Sep 17 00:00:00 2001 From: Jin Seok Park Date: Wed, 3 Mar 2021 23:56:47 +0900 Subject: [PATCH] Revise PendingIntent.queryIntentComponents API 1. Make return type NonNull 2. Use ParceledListSlice for binder call from PendingIntent to ActivityManagerService Bug: 180617184 Test: atest CtsAppTestCases:android.app.cts.PendingIntentTest #testGetIntentComponentAndType Change-Id: Ifc4d111da07b9e1c665c07568cbed994927b0ff2 --- core/api/module-lib-current.txt | 2 +- core/api/test-current.txt | 2 +- core/java/android/app/IActivityManager.aidl | 2 +- core/java/android/app/PendingIntent.java | 12 ++++++++---- .../server/am/ActivityManagerService.java | 16 ++++++++-------- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/core/api/module-lib-current.txt b/core/api/module-lib-current.txt index e6f0e48046552..e0748b730c01c 100644 --- a/core/api/module-lib-current.txt +++ b/core/api/module-lib-current.txt @@ -35,7 +35,7 @@ package android.app { } public final class PendingIntent implements android.os.Parcelable { - method @Nullable @RequiresPermission(android.Manifest.permission.GET_INTENT_SENDER_INTENT) public java.util.List queryIntentComponents(int); + method @NonNull @RequiresPermission(android.Manifest.permission.GET_INTENT_SENDER_INTENT) public java.util.List queryIntentComponents(int); } public class StatusBarManager { diff --git a/core/api/test-current.txt b/core/api/test-current.txt index 28724f271a7fc..942605b9e1f29 100644 --- a/core/api/test-current.txt +++ b/core/api/test-current.txt @@ -292,7 +292,7 @@ package android.app { } public final class PendingIntent implements android.os.Parcelable { - method @Nullable @RequiresPermission("android.permission.GET_INTENT_SENDER_INTENT") public java.util.List queryIntentComponents(int); + method @NonNull @RequiresPermission("android.permission.GET_INTENT_SENDER_INTENT") public java.util.List queryIntentComponents(int); field @Deprecated public static final int FLAG_MUTABLE_UNAUDITED = 33554432; // 0x2000000 } diff --git a/core/java/android/app/IActivityManager.aidl b/core/java/android/app/IActivityManager.aidl index 3a8172ea98b82..ef0dcabbe1111 100644 --- a/core/java/android/app/IActivityManager.aidl +++ b/core/java/android/app/IActivityManager.aidl @@ -706,7 +706,7 @@ interface IActivityManager { boolean stopProfile(int userId); /** Called by PendingIntent.queryIntentComponents() */ - List queryIntentComponentsForIntentSender(in IIntentSender sender, int matchFlags); + ParceledListSlice queryIntentComponentsForIntentSender(in IIntentSender sender, int matchFlags); int getUidProcessCapabilities(int uid, in String callingPackage); } diff --git a/core/java/android/app/PendingIntent.java b/core/java/android/app/PendingIntent.java index 549bd4b9fe6af..009c9366b1d67 100644 --- a/core/java/android/app/PendingIntent.java +++ b/core/java/android/app/PendingIntent.java @@ -26,7 +26,6 @@ import android.annotation.IntDef; import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.RequiresPermission; -import android.annotation.SuppressLint; import android.annotation.SystemApi; import android.annotation.SystemApi.Client; import android.annotation.TestApi; @@ -41,6 +40,7 @@ import android.content.IIntentSender; import android.content.Intent; import android.content.IntentSender; import android.content.pm.PackageManager.ResolveInfoFlags; +import android.content.pm.ParceledListSlice; import android.content.pm.ResolveInfo; import android.os.Build; import android.os.Bundle; @@ -60,6 +60,7 @@ import com.android.internal.os.IResultReceiver; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; +import java.util.Collections; import java.util.List; import java.util.Objects; @@ -1239,14 +1240,17 @@ public final class PendingIntent implements Parcelable { * @param flags MATCH_* flags from {@link android.content.pm.PackageManager}. * @hide */ - @SuppressLint("NullableCollection") @RequiresPermission(permission.GET_INTENT_SENDER_INTENT) @SystemApi(client = Client.MODULE_LIBRARIES) @TestApi - public @Nullable List queryIntentComponents(@ResolveInfoFlags int flags) { + public @NonNull List queryIntentComponents(@ResolveInfoFlags int flags) { try { - return ActivityManager.getService() + ParceledListSlice parceledList = ActivityManager.getService() .queryIntentComponentsForIntentSender(mTarget, flags); + if (parceledList == null) { + return Collections.emptyList(); + } + return parceledList.getList(); } catch (RemoteException e) { throw e.rethrowFromSystemServer(); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index 5e61f94826c15..52efb23b266f2 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -92,6 +92,7 @@ import static android.text.format.DateUtils.DAY_IN_MILLIS; import static com.android.internal.protolog.ProtoLogGroup.WM_DEBUG_CONFIGURATION; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALL; +import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALLOWLISTS; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ANR; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKGROUND_CHECK; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_BACKUP; @@ -104,7 +105,6 @@ import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_OOM_ADJ; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_POWER; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_PROCESSES; import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_SERVICE; -import static com.android.server.am.ActivityManagerDebugConfig.DEBUG_ALLOWLISTS; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BACKUP; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_BROADCAST; import static com.android.server.am.ActivityManagerDebugConfig.POSTFIX_CLEANUP; @@ -4963,7 +4963,7 @@ public class ActivityManagerService extends IActivityManager.Stub } @Override - public List queryIntentComponentsForIntentSender( + public ParceledListSlice queryIntentComponentsForIntentSender( IIntentSender pendingResult, int matchFlags) { enforceCallingPermission(Manifest.permission.GET_INTENT_SENDER_INTENT, "queryIntentComponentsForIntentSender()"); @@ -4981,15 +4981,15 @@ public class ActivityManagerService extends IActivityManager.Stub final int userId = res.key.userId; switch (res.key.type) { case ActivityManager.INTENT_SENDER_ACTIVITY: - return mContext.getPackageManager().queryIntentActivitiesAsUser( - intent, matchFlags, userId); + return new ParceledListSlice<>(mContext.getPackageManager() + .queryIntentActivitiesAsUser(intent, matchFlags, userId)); case ActivityManager.INTENT_SENDER_SERVICE: case ActivityManager.INTENT_SENDER_FOREGROUND_SERVICE: - return mContext.getPackageManager().queryIntentServicesAsUser( - intent, matchFlags, userId); + return new ParceledListSlice<>(mContext.getPackageManager() + .queryIntentServicesAsUser(intent, matchFlags, userId)); case ActivityManager.INTENT_SENDER_BROADCAST: - return mContext.getPackageManager().queryBroadcastReceiversAsUser( - intent, matchFlags, userId); + return new ParceledListSlice<>(mContext.getPackageManager() + .queryBroadcastReceiversAsUser(intent, matchFlags, userId)); default: // ActivityManager.INTENT_SENDER_ACTIVITY_RESULT throw new IllegalStateException("Unsupported intent sender type: " + res.key.type); }