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

Commit bb9682e1 authored by Jose Lima's avatar Jose Lima
Browse files

Allow replacing ResolverActivity via config value

Changed PackageManager to read a config value that indicates if
the default ResolverActivity should be replaced by a custom version.
This config value can be replaced via an overlay.

Bug: 10081151
Change-Id: I6f1c59d053b89fabf52bcda620eb5d4026406701
parent 74596aaa
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -1171,6 +1171,11 @@
    <string name="config_chooseTypeAndAccountActivity"
            >android/android.accounts.ChooseTypeAndAccountActivity</string>

    <!-- Component name of a custom ResolverActivity (Intent resolver) to be used instead of
         the default framework version. If left empty, then the framework version will be used.
         Example: com.google.android.myapp/.resolver.MyResolverActivity  -->
    <string name="config_customResolverActivity"></string>

    <!-- Apps that are authorized to access shared accounts, overridden by product overlays -->
    <string name="config_appsAuthorizedForSharedAccounts">;com.android.settings;</string>

+1 −0
Original line number Diff line number Diff line
@@ -824,6 +824,7 @@
  <java-symbol type="string" name="owner_name" />
  <java-symbol type="string" name="config_chooseAccountActivity" />
  <java-symbol type="string" name="config_chooseTypeAndAccountActivity" />
  <java-symbol type="string" name="config_customResolverActivity" />
  <java-symbol type="string" name="config_appsAuthorizedForSharedAccounts" />
  <java-symbol type="string" name="error_message_title" />
  <java-symbol type="string" name="action_bar_home_description_format" />
+64 −17
Original line number Diff line number Diff line
@@ -91,6 +91,7 @@ import android.content.pm.ManifestDigest;
import android.content.pm.VerificationParams;
import android.content.pm.VerifierDeviceIdentity;
import android.content.pm.VerifierInfo;
import android.content.res.Resources;
import android.net.Uri;
import android.os.Binder;
import android.os.Build;
@@ -116,6 +117,7 @@ import android.os.Environment.UserEnvironment;
import android.os.UserManager;
import android.security.KeyStore;
import android.security.SystemKeyStore;
import android.text.TextUtils;
import android.util.DisplayMetrics;
import android.util.EventLog;
import android.util.Log;
@@ -158,6 +160,8 @@ import libcore.io.IoUtils;
import libcore.io.Libcore;
import libcore.io.StructStat;

import com.android.internal.R;

/**
 * Keep track of all those .apks everywhere.
 * 
@@ -420,6 +424,9 @@ public class PackageManagerService extends IPackageManager.Stub {
    final ResolveInfo mResolveInfo = new ResolveInfo();
    ComponentName mResolveComponentName;
    PackageParser.Package mPlatformPackage;
    ComponentName mCustomResolverComponentName;

    boolean mResolverReplaced = false;

    // Set of pending broadcasts for aggregating enable/disable of components.
    static class PendingPackageBroadcasts {
@@ -1115,6 +1122,15 @@ public class PackageManagerService extends IPackageManager.Stub {
            mRestoredSettings = mSettings.readLPw(this, sUserManager.getUsers(false),
                    mSdkVersion, mOnlyCore);

            String customResolverActivity = Resources.getSystem().getString(
                    R.string.config_customResolverActivity);
            if (TextUtils.isEmpty(customResolverActivity)) {
                customResolverActivity = null;
            } else {
                mCustomResolverComponentName = ComponentName.unflattenFromString(
                        customResolverActivity);
            }

            long startTime = SystemClock.uptimeMillis();

            EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_PMS_SYSTEM_SCAN_START,
@@ -3979,6 +3995,11 @@ public class PackageManagerService extends IPackageManager.Stub {
            pkg.applicationInfo.flags |= ApplicationInfo.FLAG_PRIVILEGED;
        }

        if (mCustomResolverComponentName != null &&
                mCustomResolverComponentName.getPackageName().equals(pkg.packageName)) {
            setUpCustomResolverActivity(pkg);
        }

        if (pkg.packageName.equals("android")) {
            synchronized (mPackages) {
                if (mAndroidApplication != null) {
@@ -3990,11 +4011,12 @@ public class PackageManagerService extends IPackageManager.Stub {
                    return null;
                }

                // Set up information for our fall-back user intent resolution
                // activity.
                // Set up information for our fall-back user intent resolution activity.
                mPlatformPackage = pkg;
                pkg.mVersionCode = mSdkVersion;
                mAndroidApplication = pkg.applicationInfo;

                if (!mResolverReplaced) {
                    mResolveActivity.applicationInfo = mAndroidApplication;
                    mResolveActivity.name = ResolverActivity.class.getName();
                    mResolveActivity.packageName = mAndroidApplication.packageName;
@@ -4012,6 +4034,7 @@ public class PackageManagerService extends IPackageManager.Stub {
                            mAndroidApplication.packageName, mResolveActivity.name);
                }
            }
        }

        if (DEBUG_PACKAGE_SCANNING) {
            if ((parseFlags & PackageParser.PARSE_CHATTY) != 0)
@@ -4874,6 +4897,30 @@ public class PackageManagerService extends IPackageManager.Stub {
        return pkg;
    }

    private void setUpCustomResolverActivity(PackageParser.Package pkg) {
        synchronized (mPackages) {
            mResolverReplaced = true;
            // Set up information for custom user intent resolution activity.
            mResolveActivity.applicationInfo = pkg.applicationInfo;
            mResolveActivity.name = mCustomResolverComponentName.getClassName();
            mResolveActivity.packageName = pkg.applicationInfo.packageName;
            mResolveActivity.processName = null;
            mResolveActivity.launchMode = ActivityInfo.LAUNCH_MULTIPLE;
            mResolveActivity.flags = ActivityInfo.FLAG_EXCLUDE_FROM_RECENTS |
                    ActivityInfo.FLAG_FINISH_ON_CLOSE_SYSTEM_DIALOGS;
            mResolveActivity.theme = 0;
            mResolveActivity.exported = true;
            mResolveActivity.enabled = true;
            mResolveInfo.activityInfo = mResolveActivity;
            mResolveInfo.priority = 0;
            mResolveInfo.preferredOrder = 0;
            mResolveInfo.match = 0;
            mResolveComponentName = mCustomResolverComponentName;
            Slog.i(TAG, "Replacing default ResolverActivity with custom activity: " +
                    mResolveComponentName);
        }
    }

    private void setInternalAppNativeLibraryPath(PackageParser.Package pkg,
            PackageSetting pkgSetting) {
        final String apkLibPath = getApkName(pkgSetting.codePathString);