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

Commit 264c28ad authored by Winson's avatar Winson
Browse files

Split ParsedIntentInfoImpl

Also encapsulates the IntentFilter logic so it's a field instead of
being the superclass of ParsedIntentInfo. This means the Parcelable
implementation is now standard and some hacky workarounds can be
removed.

Bug: 178218967
Bug: 191781357

Change-Id: Ic69faa91cc2559f7cff569fc0549b83974218ff8
parent 96b96b30
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -111,8 +111,8 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
    public static ForStringSet sForStringSet = Parcelling.Cache.getOrCreate(ForStringSet.class);
    public static ForInternedStringSet sForInternedStringSet =
            Parcelling.Cache.getOrCreate(ForInternedStringSet.class);
    protected static ParsedIntentInfo.StringPairListParceler sForIntentInfoPairs =
            Parcelling.Cache.getOrCreate(ParsedIntentInfo.StringPairListParceler.class);
    protected static ParsingUtils.StringPairListParceler sForIntentInfoPairs =
            new ParsingUtils.StringPairListParceler();

    private static final Comparator<ParsedMainComponent> ORDER_COMPARATOR =
            (first, second) -> Integer.compare(second.getOrder(), first.getOrder());
@@ -278,7 +278,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
    protected List<ParsedInstrumentation> instrumentations = emptyList();

    @NonNull
    @DataClass.ParcelWith(ParsedIntentInfo.ListParceler.class)
//    @DataClass.ParcelWith(ParsingUtils.StringPairListParceler.class)
    private List<Pair<String, ParsedIntentInfo>> preferredActivityFilters = emptyList();

    @NonNull
@@ -1697,7 +1697,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,

    private void addMimeGroupsFromComponent(ParsedComponent component) {
        for (int i = component.getIntents().size() - 1; i >= 0; i--) {
            IntentFilter filter = component.getIntents().get(i);
            IntentFilter filter = component.getIntents().get(i).getIntentFilter();
            for (int groupIndex = filter.countMimeGroups() - 1; groupIndex >= 0; groupIndex--) {
                mimeGroups = ArrayUtils.add(mimeGroups, filter.getMimeGroup(groupIndex));
            }
+2 −2
Original line number Diff line number Diff line
@@ -1815,7 +1815,7 @@ public class ParsingPackageUtils {
                    return input.error(result);
                }

                ParsedIntentInfo intentInfo = result.getResult();
                IntentFilter intentInfo = result.getResult().getIntentFilter();

                Uri data = null;
                String dataType = null;
@@ -2653,7 +2653,7 @@ public class ParsingPackageUtils {
            List<ParsedIntentInfo> filters = activity.getIntents();
            final int filtersSize = filters.size();
            for (int filtersIndex = 0; filtersIndex < filtersSize; filtersIndex++) {
                ParsedIntentInfo aii = filters.get(filtersIndex);
                IntentFilter aii = filters.get(filtersIndex).getIntentFilter();
                if (!aii.hasAction(Intent.ACTION_VIEW)) continue;
                if (!aii.hasAction(Intent.ACTION_DEFAULT)) continue;
                if (aii.hasDataScheme(IntentFilter.SCHEME_HTTP) ||
+49 −1
Original line number Diff line number Diff line
@@ -20,13 +20,17 @@ import static android.content.pm.parsing.ParsingPackageUtils.RIGID_PARSER;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.pm.parsing.component.ParsedIntentInfo;
import android.content.pm.parsing.component.ParsedIntentInfoImpl;
import android.content.pm.parsing.result.ParseInput;
import android.content.pm.parsing.result.ParseResult;
import android.content.res.XmlResourceParser;
import android.os.Parcel;
import android.os.Parcelable;
import android.util.Pair;
import android.util.Slog;

import com.android.internal.util.Parcelling;
import com.android.internal.util.XmlUtils;

import org.xmlpull.v1.XmlPullParserException;
@@ -80,10 +84,12 @@ public class ParsingUtils {
    }

    /**
     * Use with {@link Parcel#writeTypedList(List)}
     *
     * @see Parcel#createTypedArrayList(Parcelable.Creator)
     */
    @NonNull
    static <Interface, Impl extends Interface> List<Interface> createTypedInterfaceList(
    public static <Interface, Impl extends Interface> List<Interface> createTypedInterfaceList(
            @NonNull Parcel parcel, @NonNull Parcelable.Creator<Impl> creator) {
        int size = parcel.readInt();
        if (size < 0) {
@@ -96,4 +102,46 @@ public class ParsingUtils {
        }
        return list;
    }

    public static class StringPairListParceler implements
            Parcelling<List<Pair<String, ParsedIntentInfo>>> {

        @Override
        public void parcel(List<Pair<String, ParsedIntentInfo>> item, Parcel dest,
                int parcelFlags) {
            if (item == null) {
                dest.writeInt(-1);
                return;
            }

            final int size = item.size();
            dest.writeInt(size);

            for (int index = 0; index < size; index++) {
                Pair<String, ParsedIntentInfo> pair = item.get(index);
                dest.writeString(pair.first);
                dest.writeParcelable(pair.second, parcelFlags);
            }
        }

        @Override
        public List<Pair<String, ParsedIntentInfo>> unparcel(Parcel source) {
            int size = source.readInt();
            if (size == -1) {
                return null;
            }

            if (size == 0) {
                return new ArrayList<>(0);
            }

            final List<Pair<String, ParsedIntentInfo>> list = new ArrayList<>(size);
            for (int i = 0; i < size; ++i) {
                list.add(Pair.create(source.readString(), source.readParcelable(
                        ParsedIntentInfoImpl.class.getClassLoader())));
            }

            return list;
        }
    }
}
+6 −4
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.annotation.AttrRes;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.parsing.ParsingPackage;
import android.content.pm.parsing.ParsingPackageUtils;
import android.content.pm.parsing.ParsingUtils;
@@ -45,10 +46,11 @@ import java.io.IOException;
public class ComponentParseUtils {

    public static boolean isImplicitlyExposedIntent(ParsedIntentInfo intentInfo) {
        return intentInfo.hasCategory(Intent.CATEGORY_BROWSABLE)
                || intentInfo.hasAction(Intent.ACTION_SEND)
                || intentInfo.hasAction(Intent.ACTION_SENDTO)
                || intentInfo.hasAction(Intent.ACTION_SEND_MULTIPLE);
        IntentFilter intentFilter = intentInfo.getIntentFilter();
        return intentFilter.hasCategory(Intent.CATEGORY_BROWSABLE)
                || intentFilter.hasAction(Intent.ACTION_SEND)
                || intentFilter.hasAction(Intent.ACTION_SENDTO)
                || intentFilter.hasAction(Intent.ACTION_SEND_MULTIPLE);
    }

    static <Component extends ParsedComponentImpl> ParseResult<Component> parseAllMetaData(
+11 −8
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityTaskManager;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.pm.ActivityInfo;
import android.content.pm.parsing.ParsingPackage;
import android.content.pm.parsing.ParsingPackageUtils;
@@ -353,15 +354,16 @@ public class ParsedActivityUtils {
                ParseResult<ParsedIntentInfo> intentResult = parseIntentFilter(pkg, activity,
                        !isReceiver, visibleToEphemeral, resources, parser, input);
                if (intentResult.isSuccess()) {
                    ParsedIntentInfo intent = intentResult.getResult();
                    if (intent != null) {
                        activity.setOrder(Math.max(intent.getOrder(), activity.getOrder()));
                        activity.addIntent(intent);
                    ParsedIntentInfo intentInfo = intentResult.getResult();
                    if (intentInfo != null) {
                        IntentFilter intentFilter = intentInfo.getIntentFilter();
                        activity.setOrder(Math.max(intentFilter.getOrder(), activity.getOrder()));
                        activity.addIntent(intentInfo);
                        if (LOG_UNSAFE_BROADCASTS && isReceiver
                                && pkg.getTargetSdkVersion() >= Build.VERSION_CODES.O) {
                            int actionCount = intent.countActions();
                            int actionCount = intentFilter.countActions();
                            for (int i = 0; i < actionCount; i++) {
                                final String action = intent.getAction(i);
                                final String action = intentFilter.getAction(i);
                                if (action == null || !action.startsWith("android.")) {
                                    continue;
                                }
@@ -458,10 +460,11 @@ public class ParsedActivityUtils {

        ParsedIntentInfo intent = result.getResult();
        if (intent != null) {
            if (intent.isVisibleToInstantApp()) {
            final IntentFilter intentFilter = intent.getIntentFilter();
            if (intentFilter.isVisibleToInstantApp()) {
                activity.setFlags(activity.getFlags() | ActivityInfo.FLAG_VISIBLE_TO_INSTANT_APP);
            }
            if (intent.isImplicitlyVisibleToInstantApp()) {
            if (intentFilter.isImplicitlyVisibleToInstantApp()) {
                activity.setFlags(
                        activity.getFlags() | ActivityInfo.FLAG_IMPLICITLY_VISIBLE_TO_INSTANT_APP);
            }
Loading