Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit db8d2bf0 authored by Makoto Onuki's avatar Makoto Onuki Committed by Jin Seok Park
Browse files

Let modules obtain target component of PendingIntent

- Media module needs to extract the component that a PendingIntent will
be sent to.

Currently, the code is bundled, so they're using the hidden
PendingIntent.getIntent() API, but we really do not want to make it @SystemApi.

So instead, adding a way to obtain the resolve information instead.

- !!Media should make sure the resolved components are actually owned by the
same package that called the API!!

Bug: 161334442
Test: not available yet
Change-Id: I09fc2e0bb23434394caadc638f48c05548376548
parent 3df00e17
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -6189,7 +6189,11 @@ package android.app {
    method public android.content.IntentSender getIntentSender();
    method public static android.app.PendingIntent getService(android.content.Context, int, @NonNull android.content.Intent, int);
    method @Deprecated public String getTargetPackage();
    method public boolean isActivity();
    method public boolean isBroadcast();
    method public boolean isForegroundService();
    method public boolean isImmutable();
    method public boolean isService();
    method @Nullable public static android.app.PendingIntent readPendingIntentOrNullFromParcel(@NonNull android.os.Parcel);
    method public void send() throws android.app.PendingIntent.CanceledException;
    method public void send(int) throws android.app.PendingIntent.CanceledException;
+12 −0
Original line number Diff line number Diff line
// Signature format: 2.0
package android {

  public static final class Manifest.permission {
    field public static final String GET_INTENT_SENDER_INTENT = "android.permission.GET_INTENT_SENDER_INTENT";
  }

}

package android.app {

  public class ActivityManager {
@@ -26,6 +34,10 @@ package android.app {
    field public static final String ACTION_NOTIFICATION_LISTENER_ENABLED_CHANGED = "android.app.action.NOTIFICATION_LISTENER_ENABLED_CHANGED";
  }

  public final class PendingIntent implements android.os.Parcelable {
    method @Nullable @RequiresPermission(android.Manifest.permission.GET_INTENT_SENDER_INTENT) public java.util.List<android.content.pm.ResolveInfo> queryIntentComponents(int);
  }

  public class StatusBarManager {
    method @RequiresPermission(android.Manifest.permission.STATUS_BAR) public void setExpansionDisabledForSimNetworkLock(boolean);
  }
+6 −0
Original line number Diff line number Diff line
@@ -51,6 +51,7 @@ import android.content.pm.ConfigurationInfo;
import android.content.pm.IPackageDataObserver;
import android.content.pm.ParceledListSlice;
import android.content.pm.ProviderInfo;
import android.content.pm.ResolveInfo;
import android.content.pm.UserInfo;
import android.content.res.Configuration;
import android.content.LocusId;
@@ -704,4 +705,9 @@ interface IActivityManager {
     * @throws IllegalArgumentException if the user is not a profile.
     */
    boolean stopProfile(int userId);

    /** Called by PendingIntent.queryIntentComponents() */
    List<ResolveInfo> queryIntentComponentsForIntentSender(in IIntentSender sender, int matchFlags);

    boolean isIntentSenderAService(in IIntentSender sender);
}
+45 −7
Original line number Diff line number Diff line
@@ -16,9 +16,13 @@

package android.app;

import android.Manifest.permission;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.annotation.RequiresPermission;
import android.annotation.SystemApi;
import android.annotation.SystemApi.Client;
import android.annotation.TestApi;
import android.compat.Compatibility;
import android.compat.annotation.ChangeId;
@@ -29,6 +33,8 @@ import android.content.IIntentReceiver;
import android.content.IIntentSender;
import android.content.Intent;
import android.content.IntentSender;
import android.content.pm.PackageManager.ResolveInfoFlags;
import android.content.pm.ResolveInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
@@ -46,6 +52,7 @@ import com.android.internal.os.IResultReceiver;

import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.List;

/**
 * A description of an Intent and target action to perform with it.  Instances
@@ -1168,10 +1175,9 @@ public final class PendingIntent implements Parcelable {
    }

    /**
     * @hide
     * Check whether this PendingIntent will launch an Activity.
     * @return TRUE if this {@link PendingIntent} was created with
     * {@link #getActivity} or {@link #getActivities}.
     */
    @UnsupportedAppUsage
    public boolean isActivity() {
        try {
            return ActivityManager.getService()
@@ -1182,8 +1188,7 @@ public final class PendingIntent implements Parcelable {
    }

    /**
     * @hide
     * Check whether this PendingIntent will launch a foreground service
     * @return TRUE if this {@link PendingIntent} was created with {@link #getForegroundService}.
     */
    public boolean isForegroundService() {
        try {
@@ -1195,8 +1200,19 @@ public final class PendingIntent implements Parcelable {
    }

    /**
     * @hide
     * Check whether this PendingIntent will launch an Activity.
     * @return TRUE if this {@link PendingIntent} was created with {@link #getService}.
     */
    public boolean isService() {
        try {
            return ActivityManager.getService()
                    .isIntentSenderAService(mTarget);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * @return TRUE if this {@link PendingIntent} was created with {@link #getBroadcast}.
     */
    public boolean isBroadcast() {
        try {
@@ -1235,6 +1251,28 @@ public final class PendingIntent implements Parcelable {
        }
    }

    /**
     * Resolve the intent set in this {@link PendingIntent}. Note if the pending intent is
     * generated for another user, the resulting component may not exist on the calling user.
     * Use {@link android.content.pm.ApplicationInfo#uid} of the resulting
     * {@link android.content.pm.ComponentInfo} with
     * {@link android.os.UserHandle#getUserHandleForUid(int)} to see which user will receive
     * the intent.
     *
     * @param flags MATCH_* flags from {@link android.content.pm.PackageManager}.
     * @hide
     */
    @RequiresPermission(permission.GET_INTENT_SENDER_INTENT)
    @SystemApi(client = Client.MODULE_LIBRARIES)
    public @Nullable List<ResolveInfo> queryIntentComponents(@ResolveInfoFlags int flags) {
        try {
            return ActivityManager.getService()
                    .queryIntentComponentsForIntentSender(mTarget, flags);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

    /**
     * Comparison operator on two PendingIntent objects, such that true
     * is returned then they both represent the same operation from the
+3 −2
Original line number Diff line number Diff line
@@ -2659,8 +2659,9 @@
    <permission android:name="android.permission.GET_PROCESS_STATE_AND_OOM_SCORE"
        android:protectionLevel="signature|privileged|development" />

    <!-- Allows use of PendingIntent.getIntent().
         @hide -->
    <!-- Allows use of PendingIntent.getIntent(), .
         @hide @SystemApi(client=android.annotation.SystemApi.Client.MODULE_LIBRARIES)
         -->
    <permission android:name="android.permission.GET_INTENT_SENDER_INTENT"
        android:protectionLevel="signature" />

Loading