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

Commit d96953ad authored by Svet Ganov's avatar Svet Ganov
Browse files

Preserve ranking attrs of resolve infos for installing a feature split

If an intent resolves to an activity in a fearture split not on the device
we create a synthetic resolve info to involve the installer that replaces
the resolve info for the missing activity. The synthetic resolve info was
not inheriting the priority/preferred order/default status resulting in a
different result ranking than what original resolve info would produce,
hence affecting resolution. Activities in a feature split should resolve
as if they are present on the device.

Also when downloading a feature split we involve the instant app installer
which resuls in a disabmiguation UI item "Instant app" with an instant app
icon despite that in this case the synthetic resolve info is for downloading
a piece of an already installed app (standard or instant). When installing
a feature spluit the user should see UI as if the piece of the app would
handle the intent.

Test: manual

bug:67710878

Change-Id: I8dd356c7b2c9742144f10e5b48daf5b28f6934ad
parent 3bdfe1a2
Loading
Loading
Loading
Loading
+34 −0
Original line number Diff line number Diff line
@@ -221,6 +221,40 @@ public class ResolveInfo implements Parcelable {
        return data;
    }

    /**
     * @return The resource that would be used when loading
     * the label for this resolve info.
     *
     * @hide
     */
    public int resolveLabelResId() {
        if (labelRes != 0) {
            return labelRes;
        }
        final ComponentInfo componentInfo = getComponentInfo();
        if (componentInfo.labelRes != 0) {
            return componentInfo.labelRes;
        }
        return componentInfo.applicationInfo.labelRes;
    }

    /**
     * @return The resource that would be used when loading
     * the icon for this resolve info.
     *
     * @hide
     */
    public int resolveIconResId() {
        if (icon != 0) {
            return icon;
        }
        final ComponentInfo componentInfo = getComponentInfo();
        if (componentInfo.icon != 0) {
            return componentInfo.icon;
        }
        return componentInfo.applicationInfo.icon;
    }

    /**
     * Retrieve the current graphical icon associated with this resolution.  This
     * will call back on the given PackageManager to load the icon from
+18 −3
Original line number Diff line number Diff line
@@ -7589,6 +7589,13 @@ public class PackageManagerService extends IPackageManager.Stub
                    && info.activityInfo.splitName != null
                    && !ArrayUtils.contains(info.activityInfo.applicationInfo.splitNames,
                            info.activityInfo.splitName)) {
                if (mInstantAppInstallerInfo == null) {
                    if (DEBUG_INSTALL) {
                        Slog.v(TAG, "No installer - not adding it to the ResolveInfo list");
                    }
                    resolveInfos.remove(i);
                    continue;
                }
                // requested activity is defined in a split that hasn't been installed yet.
                // add the installer to the resolve list
                if (DEBUG_INSTALL) {
@@ -7602,14 +7609,22 @@ public class PackageManagerService extends IPackageManager.Stub
                        installFailureActivity,
                        info.activityInfo.applicationInfo.versionCode,
                        null /*failureIntent*/);
                // make sure this resolver is the default
                installerInfo.isDefault = true;
                installerInfo.match = IntentFilter.MATCH_CATEGORY_SCHEME_SPECIFIC_PART
                        | IntentFilter.MATCH_ADJUSTMENT_NORMAL;
                // add a non-generic filter
                installerInfo.filter = new IntentFilter();
                // load resources from the correct package
                // This resolve info may appear in the chooser UI, so let us make it
                // look as the one it replaces as far as the user is concerned which
                // requires loading the correct label and icon for the resolve info.
                installerInfo.resolvePackageName = info.getComponentInfo().packageName;
                installerInfo.labelRes = info.resolveLabelResId();
                installerInfo.icon = info.resolveIconResId();
                // propagate priority/preferred order/default
                installerInfo.priority = info.priority;
                installerInfo.preferredOrder = info.preferredOrder;
                installerInfo.isDefault = info.isDefault;
                resolveInfos.set(i, installerInfo);
                continue;
            }