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

Commit 4a85db56 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge changes from topic "178218967"

* changes:
  Split ParsedIntentInfoImpl
  Split ParsedUsesPermissionImpl
  Split ParsedProcessImpl
  Split ParsedPermissionGroupImpl
  Split ParsedPermissionImpl
  Split ParsedInstrumentationImpl
  Split ParsedAttributionImpl
  Split ParsedServiceImpl
  Split ParsedProviderImpl
  Split ParsedActivityImpl
  Split ParsedMainComponentImpl
  Split ParsedComponentImpl
parents 20bea9cc 264c28ad
Loading
Loading
Loading
Loading
+26 −14
Original line number Diff line number Diff line
@@ -34,17 +34,25 @@ import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.Property;
import android.content.pm.SigningDetails;
import android.content.pm.parsing.component.ParsedActivity;
import android.content.pm.parsing.component.ParsedActivityImpl;
import android.content.pm.parsing.component.ParsedAttribution;
import android.content.pm.parsing.component.ParsedAttributionImpl;
import android.content.pm.parsing.component.ParsedComponent;
import android.content.pm.parsing.component.ParsedInstrumentation;
import android.content.pm.parsing.component.ParsedInstrumentationImpl;
import android.content.pm.parsing.component.ParsedIntentInfo;
import android.content.pm.parsing.component.ParsedMainComponent;
import android.content.pm.parsing.component.ParsedPermission;
import android.content.pm.parsing.component.ParsedPermissionGroup;
import android.content.pm.parsing.component.ParsedPermissionGroupImpl;
import android.content.pm.parsing.component.ParsedPermissionImpl;
import android.content.pm.parsing.component.ParsedProcess;
import android.content.pm.parsing.component.ParsedProvider;
import android.content.pm.parsing.component.ParsedProviderImpl;
import android.content.pm.parsing.component.ParsedService;
import android.content.pm.parsing.component.ParsedServiceImpl;
import android.content.pm.parsing.component.ParsedUsesPermission;
import android.content.pm.parsing.component.ParsedUsesPermissionImpl;
import android.content.res.TypedArray;
import android.os.Build;
import android.os.Bundle;
@@ -103,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());
@@ -270,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
@@ -718,7 +726,7 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,

    @Override
    public ParsingPackageImpl addImplicitPermission(String permission) {
        addUsesPermission(new ParsedUsesPermission(permission, 0 /*usesPermissionFlags*/));
        addUsesPermission(new ParsedUsesPermissionImpl(permission, 0 /*usesPermissionFlags*/));
        this.implicitPermissions = CollectionUtils.add(this.implicitPermissions,
                TextUtils.safeIntern(permission));
        return this;
@@ -1277,20 +1285,24 @@ public class ParsingPackageImpl implements ParsingPackage, ParsingPackageHidden,
        this.originalPackages = in.createStringArrayList();
        this.adoptPermissions = sForInternedStringList.unparcel(in);
        this.requestedPermissions = sForInternedStringList.unparcel(in);
        this.usesPermissions = in.createTypedArrayList(ParsedUsesPermission.CREATOR);
        this.usesPermissions = ParsingUtils.createTypedInterfaceList(in,
                ParsedUsesPermissionImpl.CREATOR);
        this.implicitPermissions = sForInternedStringList.unparcel(in);
        this.upgradeKeySets = sForStringSet.unparcel(in);
        this.keySetMapping = ParsingPackageUtils.readKeySetMapping(in);
        this.protectedBroadcasts = sForInternedStringList.unparcel(in);

        this.activities = in.createTypedArrayList(ParsedActivity.CREATOR);
        this.receivers = in.createTypedArrayList(ParsedActivity.CREATOR);
        this.services = in.createTypedArrayList(ParsedService.CREATOR);
        this.providers = in.createTypedArrayList(ParsedProvider.CREATOR);
        this.attributions = in.createTypedArrayList(ParsedAttribution.CREATOR);
        this.permissions = in.createTypedArrayList(ParsedPermission.CREATOR);
        this.permissionGroups = in.createTypedArrayList(ParsedPermissionGroup.CREATOR);
        this.instrumentations = in.createTypedArrayList(ParsedInstrumentation.CREATOR);
        this.activities = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR);
        this.receivers = ParsingUtils.createTypedInterfaceList(in, ParsedActivityImpl.CREATOR);
        this.services = ParsingUtils.createTypedInterfaceList(in, ParsedServiceImpl.CREATOR);
        this.providers = ParsingUtils.createTypedInterfaceList(in, ParsedProviderImpl.CREATOR);
        this.attributions = ParsingUtils.createTypedInterfaceList(in,
                ParsedAttributionImpl.CREATOR);
        this.permissions = ParsingUtils.createTypedInterfaceList(in, ParsedPermissionImpl.CREATOR);
        this.permissionGroups = ParsingUtils.createTypedInterfaceList(in,
                ParsedPermissionGroupImpl.CREATOR);
        this.instrumentations = ParsingUtils.createTypedInterfaceList(in,
                ParsedInstrumentationImpl.CREATOR);
        this.preferredActivityFilters = sForIntentInfoPairs.unparcel(in);
        this.processes = in.readHashMap(boot);
        this.metaData = in.readBundle(boot);
@@ -1685,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));
            }
+70 −61
Original line number Diff line number Diff line
@@ -49,8 +49,10 @@ import android.content.pm.PackageManager;
import android.content.pm.PackageManager.Property;
import android.content.pm.Signature;
import android.content.pm.SigningDetails;
import android.content.pm.parsing.component.ComponentMutateUtils;
import android.content.pm.parsing.component.ComponentParseUtils;
import android.content.pm.parsing.component.ParsedActivity;
import android.content.pm.parsing.component.ParsedActivityImpl;
import android.content.pm.parsing.component.ParsedActivityUtils;
import android.content.pm.parsing.component.ParsedAttribution;
import android.content.pm.parsing.component.ParsedAttributionUtils;
@@ -70,6 +72,7 @@ import android.content.pm.parsing.component.ParsedProviderUtils;
import android.content.pm.parsing.component.ParsedService;
import android.content.pm.parsing.component.ParsedServiceUtils;
import android.content.pm.parsing.component.ParsedUsesPermission;
import android.content.pm.parsing.component.ParsedUsesPermissionImpl;
import android.content.pm.parsing.result.ParseInput;
import android.content.pm.parsing.result.ParseInput.DeferredError;
import android.content.pm.parsing.result.ParseResult;
@@ -267,8 +270,8 @@ public class ParsingPackageUtils {
            boolean collectCertificates) {
        ParseResult<ParsingPackage> result;

        ParsingPackageUtils parser = new ParsingPackageUtils(false, null, null, splitPermissions,
                new Callback() {
        ParsingPackageUtils parser = new ParsingPackageUtils(false, null /*separateProcesses*/,
                null /*displayMetrics*/, splitPermissions, new Callback() {
            @Override
            public boolean hasFeature(String feature) {
                // Assume the device doesn't support anything. This will affect permission
@@ -625,8 +628,8 @@ public class ParsingPackageUtils {

        final TypedArray manifestArray = res.obtainAttributes(parser, R.styleable.AndroidManifest);
        try {
            final boolean isCoreApp =
                    parser.getAttributeBooleanValue(null, "coreApp", false);
            final boolean isCoreApp = parser.getAttributeBooleanValue(null /*namespace*/,
                    "coreApp",false);
            final ParsingPackage pkg = mCallback.startParsingPackage(
                    pkgName, apkPath, codePath, manifestArray, isCoreApp);
            final ParseResult<ParsingPackage> result =
@@ -732,6 +735,13 @@ public class ParsingPackageUtils {
        } finally {
            sa.recycle();
        }

        // If the loaded component did not specify a split, inherit the split name
        // based on the split it is defined in.
        // This is used to later load the correct split when starting this
        // component.
        String defaultSplitName = pkg.getSplitNames()[splitIndex];

        final int depth = parser.getDepth();
        int type;
        while ((type = parser.next()) != XmlPullParser.END_DOCUMENT
@@ -753,8 +763,7 @@ public class ParsingPackageUtils {
                case "receiver":
                    ParseResult<ParsedActivity> activityResult =
                            ParsedActivityUtils.parseActivityOrReceiver(mSeparateProcesses, pkg,
                                    res,
                                    parser, flags, sUseRoundIcon, input);
                                    res, parser, flags, sUseRoundIcon, defaultSplitName, input);
                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
                        if (isActivity) {
@@ -768,8 +777,8 @@ public class ParsingPackageUtils {
                    break;
                case "service":
                    ParseResult<ParsedService> serviceResult = ParsedServiceUtils.parseService(
                            mSeparateProcesses, pkg, res, parser, flags,
                            sUseRoundIcon, input);
                            mSeparateProcesses, pkg, res, parser, flags, sUseRoundIcon,
                            defaultSplitName, input);
                    if (serviceResult.isSuccess()) {
                        ParsedService service = serviceResult.getResult();
                        pkg.addService(service);
@@ -780,7 +789,7 @@ public class ParsingPackageUtils {
                case "provider":
                    ParseResult<ParsedProvider> providerResult =
                            ParsedProviderUtils.parseProvider(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, input);
                                    flags, sUseRoundIcon, defaultSplitName, input);
                    if (providerResult.isSuccess()) {
                        ParsedProvider provider = providerResult.getResult();
                        pkg.addProvider(provider);
@@ -790,7 +799,7 @@ public class ParsingPackageUtils {
                    break;
                case "activity-alias":
                    activityResult = ParsedActivityUtils.parseActivityAlias(pkg, res, parser,
                            sUseRoundIcon, input);
                            sUseRoundIcon, defaultSplitName, input);
                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
                        pkg.addActivity(activity);
@@ -807,14 +816,6 @@ public class ParsingPackageUtils {
            if (result.isError()) {
                return input.error(result);
            }

            if (mainComponent != null && mainComponent.getSplitName() == null) {
                // If the loaded component did not specify a split, inherit the split name
                // based on the split it is defined in.
                // This is used to later load the correct split when starting this
                // component.
                mainComponent.setSplitName(pkg.getSplitNames()[splitIndex]);
            }
        }

        return input.success(pkg);
@@ -832,15 +833,15 @@ public class ParsingPackageUtils {
                // note: application meta-data is stored off to the side, so it can
                // remain null in the primary copy (we like to avoid extra copies because
                // it can be large)
                ParseResult<Property> metaDataResult = parseMetaData(pkg, null, res,
                        parser, "<meta-data>", input);
                ParseResult<Property> metaDataResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<meta-data>", input);
                if (metaDataResult.isSuccess() && metaDataResult.getResult() != null) {
                    pkg.setMetaData(metaDataResult.getResult().toBundle(pkg.getMetaData()));
                }
                return metaDataResult;
            case "property":
                ParseResult<Property> propertyResult = parseMetaData(pkg, null, res,
                        parser, "<property>", input);
                ParseResult<Property> propertyResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<property>", input);
                if (propertyResult.isSuccess()) {
                    pkg.addProperty(propertyResult.getResult());
                }
@@ -919,7 +920,7 @@ public class ParsingPackageUtils {
            }
        }

        if (!ParsedAttribution.isCombinationValid(pkg.getAttributions())) {
        if (!ParsedAttributionUtils.isCombinationValid(pkg.getAttributions())) {
            return input.error(
                    INSTALL_PARSE_FAILED_BAD_MANIFEST,
                    "Combination <attribution> tags are not valid"
@@ -1339,7 +1340,7 @@ public class ParsingPackageUtils {
            }

            if (!found) {
                pkg.addUsesPermission(new ParsedUsesPermission(name, usesPermissionFlags));
                pkg.addUsesPermission(new ParsedUsesPermissionImpl(name, usesPermissionFlags));
            }
            return success;
        } finally {
@@ -1807,13 +1808,14 @@ public class ParsingPackageUtils {
                continue;
            }
            if (parser.getName().equals("intent")) {
                ParseResult<ParsedIntentInfo> result = ParsedIntentInfoUtils.parseIntentInfo(null,
                        pkg, res, parser, true /*allowGlobs*/, true /*allowAutoVerify*/, input);
                ParseResult<ParsedIntentInfo> result = ParsedIntentInfoUtils.parseIntentInfo(
                        null /*className*/, pkg, res, parser, true /*allowGlobs*/,
                        true /*allowAutoVerify*/, input);
                if (result.isError()) {
                    return input.error(result);
                }

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

                Uri data = null;
                String dataType = null;
@@ -2077,7 +2079,7 @@ public class ParsingPackageUtils {
                        R.styleable.AndroidManifestApplication_process);
            }
            ParseResult<String> processNameResult = ComponentParseUtils.buildProcessName(
                    pkgName, null, pname, flags, mSeparateProcesses, input);
                    pkgName, null /*defProc*/, pname, flags, mSeparateProcesses, input);
            if (processNameResult.isError()) {
                return input.error(processNameResult);
            }
@@ -2146,7 +2148,8 @@ public class ParsingPackageUtils {
                case "receiver":
                    ParseResult<ParsedActivity> activityResult =
                            ParsedActivityUtils.parseActivityOrReceiver(mSeparateProcesses, pkg,
                                    res, parser, flags, sUseRoundIcon, input);
                                    res, parser, flags, sUseRoundIcon, null /*defaultSplitName*/,
                                    input);

                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
@@ -2164,7 +2167,8 @@ public class ParsingPackageUtils {
                case "service":
                    ParseResult<ParsedService> serviceResult =
                            ParsedServiceUtils.parseService(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, input);
                                    flags, sUseRoundIcon, null /*defaultSplitName*/,
                                    input);
                    if (serviceResult.isSuccess()) {
                        ParsedService service = serviceResult.getResult();
                        hasServiceOrder |= (service.getOrder() != 0);
@@ -2176,7 +2180,8 @@ public class ParsingPackageUtils {
                case "provider":
                    ParseResult<ParsedProvider> providerResult =
                            ParsedProviderUtils.parseProvider(mSeparateProcesses, pkg, res, parser,
                                    flags, sUseRoundIcon, input);
                                    flags, sUseRoundIcon, null /*defaultSplitName*/,
                                    input);
                    if (providerResult.isSuccess()) {
                        pkg.addProvider(providerResult.getResult());
                    }
@@ -2185,7 +2190,8 @@ public class ParsingPackageUtils {
                    break;
                case "activity-alias":
                    activityResult = ParsedActivityUtils.parseActivityAlias(pkg, res,
                            parser, sUseRoundIcon, input);
                            parser, sUseRoundIcon, null /*defaultSplitName*/,
                            input);
                    if (activityResult.isSuccess()) {
                        ParsedActivity activity = activityResult.getResult();
                        hasActivityOrder |= (activity.getOrder() != 0);
@@ -2327,15 +2333,15 @@ public class ParsingPackageUtils {
                // note: application meta-data is stored off to the side, so it can
                // remain null in the primary copy (we like to avoid extra copies because
                // it can be large)
                final ParseResult<Property> metaDataResult = parseMetaData(pkg, null, res,
                        parser, "<meta-data>", input);
                final ParseResult<Property> metaDataResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<meta-data>", input);
                if (metaDataResult.isSuccess() && metaDataResult.getResult() != null) {
                    pkg.setMetaData(metaDataResult.getResult().toBundle(pkg.getMetaData()));
                }
                return metaDataResult;
            case "property":
                final ParseResult<Property> propertyResult = parseMetaData(pkg, null, res,
                        parser, "<property>", input);
                final ParseResult<Property> propertyResult = parseMetaData(pkg, null /*component*/,
                        res, parser, "<property>", input);
                if (propertyResult.isSuccess()) {
                    pkg.addProperty(propertyResult.getResult());
                }
@@ -2647,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) ||
@@ -2697,7 +2703,8 @@ public class ParsingPackageUtils {
                    ? activity.getMetaData().getFloat(METADATA_MAX_ASPECT_RATIO, maxAspectRatio)
                    : maxAspectRatio;

            activity.setMaxAspectRatio(activity.getResizeMode(), activityAspectRatio);
            ComponentMutateUtils.setMaxAspectRatio(activity, activity.getResizeMode(),
                    activityAspectRatio);
        }
    }

@@ -2714,7 +2721,8 @@ public class ParsingPackageUtils {
        for (int index = 0; index < activitiesSize; index++) {
            ParsedActivity activity = activities.get(index);
            if (activity.getMinAspectRatio() == ASPECT_RATIO_NOT_SET) {
                activity.setMinAspectRatio(activity.getResizeMode(), minAspectRatio);
                ComponentMutateUtils.setMinAspectRatio(activity, activity.getResizeMode(),
                        minAspectRatio);
            }
        }
    }
@@ -2731,7 +2739,7 @@ public class ParsingPackageUtils {
            if (supportsSizeChanges || (activity.getMetaData() != null
                    && activity.getMetaData().getBoolean(
                            METADATA_SUPPORTS_SIZE_CHANGES, false))) {
                activity.setSupportsSizeChanges(true);
                ComponentMutateUtils.setSupportsSizeChanges(activity, true);
            }
        }
    }
@@ -2871,7 +2879,7 @@ public class ParsingPackageUtils {
    private static void convertCompatPermissions(ParsingPackage pkg) {
        for (int i = 0, size = CompatibilityPermissionInfo.COMPAT_PERMS.length; i < size; i++) {
            final CompatibilityPermissionInfo info = CompatibilityPermissionInfo.COMPAT_PERMS[i];
            if (pkg.getTargetSdkVersion() >= info.sdkVersion) {
            if (pkg.getTargetSdkVersion() >= info.getSdkVersion()) {
                break;
            }
            if (!pkg.getRequestedPermissions().contains(info.getName())) {
@@ -2910,8 +2918,9 @@ public class ParsingPackageUtils {
        int activitiesSize = activities.size();
        for (int index = 0; index < activitiesSize; index++) {
            ParsedActivity activity = activities.get(index);
            activity.setResizeMode(RESIZE_MODE_UNRESIZEABLE)
                    .setFlags(activity.getFlags() & ~FLAG_SUPPORTS_PICTURE_IN_PICTURE);
            ComponentMutateUtils.setResizeMode(activity, RESIZE_MODE_UNRESIZEABLE);
            ComponentMutateUtils.setExactFlags(activity,
                    activity.getFlags() & ~FLAG_SUPPORTS_PICTURE_IN_PICTURE);
        }
    }

+70 −0
Original line number Diff line number Diff line
@@ -20,16 +20,24 @@ 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;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/** @hide **/
public class ParsingUtils {
@@ -74,4 +82,66 @@ public class ParsingUtils {
        XmlUtils.skipCurrentTag(parser);
        return input.success(null); // Type doesn't matter
    }

    /**
     * Use with {@link Parcel#writeTypedList(List)}
     *
     * @see Parcel#createTypedArrayList(Parcelable.Creator)
     */
    @NonNull
    public static <Interface, Impl extends Interface> List<Interface> createTypedInterfaceList(
            @NonNull Parcel parcel, @NonNull Parcelable.Creator<Impl> creator) {
        int size = parcel.readInt();
        if (size < 0) {
            return new ArrayList<>();
        }
        ArrayList<Interface> list = new ArrayList<Interface>(size);
        while (size > 0) {
            list.add(parcel.readTypedObject(creator));
            size--;
        }
        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;
        }
    }
}
+98 −0

File added.

Preview size limit exceeded, changes collapsed.

+7 −5
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,13 +46,14 @@ 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 ParsedComponent> ParseResult<Component> parseAllMetaData(
    static <Component extends ParsedComponentImpl> ParseResult<Component> parseAllMetaData(
            ParsingPackage pkg, Resources res, XmlResourceParser parser, String tag,
            Component component, ParseInput input) throws XmlPullParserException, IOException {
        final int depth = parser.getDepth();
Loading