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

Commit 02a6b73e authored by Todd Kennedy's avatar Todd Kennedy
Browse files

Bind with the correct action

While services themselves don't need an action when an explicit
component is specified, services in GMS may be different. In
the case of instant apps, the resolver service is hidden behind
a proxy that uses the action to route to the actual, implementing
service.

Bug: 36594944
Test: see that ephemeral resolution occurs
Change-Id: Id8c352614f780dc63f36c65be2ddb2d480b6846b
parent 399dba4a
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.pm.InstantAppResolveInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.IBinder;
@@ -28,9 +29,12 @@ import android.os.IRemoteCallback;
import android.os.Looper;
import android.os.Message;
import android.os.RemoteException;
import android.util.Log;
import android.util.Slog;

import com.android.internal.os.SomeArgs;

import java.util.Arrays;
import java.util.List;

/**
@@ -39,6 +43,9 @@ import java.util.List;
 */
@SystemApi
public abstract class InstantAppResolverService extends Service {
    private static final boolean DEBUG_EPHEMERAL = Build.IS_DEBUGGABLE;
    private static final String TAG = "PackageManager";

    /** @hide */
    public static final String EXTRA_RESOLVE_INFO = "android.app.extra.RESOLVE_INFO";
    /** @hide */
@@ -132,11 +139,19 @@ public abstract class InstantAppResolverService extends Service {
    @Deprecated
    void _onGetInstantAppResolveInfo(int[] digestPrefix, String token,
            InstantAppResolutionCallback callback) {
        if (DEBUG_EPHEMERAL) {
            Slog.d(TAG, "Instant resolver; getInstantAppResolveInfo;"
                    + " prefix: " + Arrays.toString(digestPrefix));
        }
        onGetInstantAppResolveInfo(digestPrefix, token, callback);
    }
    @Deprecated
    void _onGetInstantAppIntentFilter(int digestPrefix[], String token, String hostName,
            InstantAppResolutionCallback callback) {
        if (DEBUG_EPHEMERAL) {
            Slog.d(TAG, "Instant resolver; getInstantAppIntentFilter;"
                    + " prefix: " + Arrays.toString(digestPrefix));
        }
        onGetInstantAppIntentFilter(digestPrefix, token, callback);
    }

+3 −2
Original line number Diff line number Diff line
@@ -64,9 +64,10 @@ final class EphemeralResolverConnection implements DeathRecipient {
    private volatile boolean mBindRequested;
    private IInstantAppResolver mRemoteInstance;

    public EphemeralResolverConnection(Context context, ComponentName componentName) {
    public EphemeralResolverConnection(
            Context context, ComponentName componentName, String action) {
        mContext = context;
        mIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE).setComponent(componentName);
        mIntent = new Intent(action).setComponent(componentName);
    }

    public final List<InstantAppResolveInfo> getInstantAppResolveInfoList(int hashPrefix[],
+17 −13
Original line number Diff line number Diff line
@@ -2813,15 +2813,17 @@ public class PackageManagerService extends IPackageManager.Stub {
            }
            mInstallerService = new PackageInstallerService(context, this);
            final ComponentName ephemeralResolverComponent = getEphemeralResolverLPr();
            if (ephemeralResolverComponent != null) {
            final Pair<ComponentName, String> instantAppResolverComponent =
                    getInstantAppResolverLPr();
            if (instantAppResolverComponent != null) {
                if (DEBUG_EPHEMERAL) {
                    Slog.d(TAG, "Set ephemeral resolver: " + ephemeralResolverComponent);
                    Slog.d(TAG, "Set ephemeral resolver: " + instantAppResolverComponent);
                }
                mInstantAppResolverConnection =
                        new EphemeralResolverConnection(mContext, ephemeralResolverComponent);
                mInstantAppResolverConnection = new EphemeralResolverConnection(
                        mContext, instantAppResolverComponent.first,
                        instantAppResolverComponent.second);
                mInstantAppResolverSettingsComponent =
                        getEphemeralResolverSettingsLPr(ephemeralResolverComponent);
                        getInstantAppResolverSettingsLPr(instantAppResolverComponent.first);
            } else {
                mInstantAppResolverConnection = null;
                mInstantAppResolverSettingsComponent = null;
@@ -2868,7 +2870,7 @@ public class PackageManagerService extends IPackageManager.Stub {
    private void updateInstantAppInstallerLocked() {
        final ComponentName oldInstantAppInstallerComponent = mInstantAppInstallerComponent;
        final ActivityInfo newInstantAppInstaller = getEphemeralInstallerLPr();
        final ActivityInfo newInstantAppInstaller = getInstantAppInstallerLPr();
        ComponentName newInstantAppInstallerComponent = newInstantAppInstaller == null
                ? null : newInstantAppInstaller.getComponentName();
@@ -3045,7 +3047,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
    }
    private @Nullable ComponentName getEphemeralResolverLPr() {
    private @Nullable Pair<ComponentName, String> getInstantAppResolverLPr() {
        final String[] packageArray =
                mContext.getResources().getStringArray(R.array.config_ephemeralResolverPackage);
        if (packageArray.length == 0 && !Build.IS_DEBUGGABLE) {
@@ -3060,7 +3062,8 @@ public class PackageManagerService extends IPackageManager.Stub {
                MATCH_DIRECT_BOOT_AWARE
                | MATCH_DIRECT_BOOT_UNAWARE
                | (!Build.IS_DEBUGGABLE ? MATCH_SYSTEM_ONLY : 0);
        final Intent resolverIntent = new Intent(Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE);
        String actionName = Intent.ACTION_RESOLVE_INSTANT_APP_PACKAGE;
        final Intent resolverIntent = new Intent(actionName);
        List<ResolveInfo> resolvers = queryIntentServicesInternal(resolverIntent, null,
                resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/);
        // temporarily look for the old action
@@ -3068,7 +3071,8 @@ public class PackageManagerService extends IPackageManager.Stub {
            if (DEBUG_EPHEMERAL) {
                Slog.d(TAG, "Ephemeral resolver not found with new action; try old one");
            }
            resolverIntent.setAction(Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE);
            actionName = Intent.ACTION_RESOLVE_EPHEMERAL_PACKAGE;
            resolverIntent.setAction(actionName);
            resolvers = queryIntentServicesInternal(resolverIntent, null,
                    resolveFlags, UserHandle.USER_SYSTEM, callingUid, false /*includeInstantApps*/);
        }
@@ -3101,7 +3105,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                Slog.v(TAG, "Ephemeral resolver found;"
                        + " pkg: " + packageName + ", info:" + info);
            }
            return new ComponentName(packageName, info.serviceInfo.name);
            return new Pair<>(new ComponentName(packageName, info.serviceInfo.name), actionName);
        }
        if (DEBUG_EPHEMERAL) {
            Slog.v(TAG, "Ephemeral resolver NOT found");
@@ -3109,7 +3113,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        return null;
    }
    private @Nullable ActivityInfo getEphemeralInstallerLPr() {
    private @Nullable ActivityInfo getInstantAppInstallerLPr() {
        final Intent intent = new Intent(Intent.ACTION_INSTALL_INSTANT_APP_PACKAGE);
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        intent.setDataAndType(Uri.fromFile(new File("foo.apk")), PACKAGE_MIME_TYPE);
@@ -3151,7 +3155,7 @@ public class PackageManagerService extends IPackageManager.Stub {
        }
    }
    private @Nullable ComponentName getEphemeralResolverSettingsLPr(
    private @Nullable ComponentName getInstantAppResolverSettingsLPr(
            @NonNull ComponentName resolver) {
        final Intent intent =  new Intent(Intent.ACTION_INSTANT_APP_RESOLVER_SETTINGS)
                .addCategory(Intent.CATEGORY_DEFAULT)