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

Commit 26fea725 authored by Winson Chiu's avatar Winson Chiu Committed by Android (Google) Code Review
Browse files

Merge "Overlay, actor, and target app visibility handling"

parents 95781fe5 3f46dbd7
Loading
Loading
Loading
Loading
+5 −0
Original line number Diff line number Diff line
@@ -229,6 +229,11 @@ public interface AndroidPackage extends Parcelable {

    String getOverlayTargetName();

    /**
     * Map of overlayable name to actor name.
     */
    Map<String, String> getOverlayables();

    // TODO(b/135203078): Does this and getAppInfoPackageName have to be separate methods?
    //  The refactor makes them the same value with no known consequences, so should be redundant.
    String getPackageName();
+19 −2
Original line number Diff line number Diff line
@@ -52,6 +52,7 @@ import android.content.pm.permission.SplitPermissionInfoParcelable;
import android.content.pm.split.DefaultSplitAssetLoader;
import android.content.pm.split.SplitAssetDependencyLoader;
import android.content.pm.split.SplitAssetLoader;
import android.content.res.ApkAssets;
import android.content.res.AssetManager;
import android.content.res.Configuration;
import android.content.res.Resources;
@@ -92,6 +93,7 @@ import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.Set;

/** @hide */
@@ -287,8 +289,23 @@ public class ApkParseUtils {
                                + result.getErrorMessage());
            }

            return result.getResultAndNull()
                    .setVolumeUuid(volumeUuid)
            ParsingPackage pkg = result.getResultAndNull();
            ApkAssets apkAssets = assets.getApkAssets()[0];
            if (apkAssets.definesOverlayable()) {
                SparseArray<String> packageNames = assets.getAssignedPackageIdentifiers();
                int size = packageNames.size();
                for (int index = 0; index < size; index++) {
                    String packageName = packageNames.get(index);
                    Map<String, String> overlayableToActor = assets.getOverlayableMap(packageName);
                    if (overlayableToActor != null && !overlayableToActor.isEmpty()) {
                        for (String overlayable : overlayableToActor.keySet()) {
                            pkg.addOverlayable(overlayable, overlayableToActor.get(overlayable));
                        }
                    }
                }
            }

            return pkg.setVolumeUuid(volumeUuid)
                    .setApplicationVolumeUuid(volumeUuid)
                    .setSigningDetails(SigningDetails.UNKNOWN);
        } catch (PackageParserException e) {
+22 −2
Original line number Diff line number Diff line
@@ -18,6 +18,8 @@ package android.content.pm.parsing;

import static android.os.Build.VERSION_CODES.DONUT;

import static java.util.Collections.emptyMap;

import android.annotation.NonNull;
import android.annotation.Nullable;
import android.content.Intent;
@@ -55,11 +57,13 @@ import android.util.SparseArray;
import com.android.internal.R;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.ArrayUtils;
import com.android.internal.util.CollectionUtils;
import com.android.server.SystemConfig;

import java.security.PublicKey;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@@ -126,6 +130,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android
    private String overlayCategory;
    private int overlayPriority;
    private boolean overlayIsStatic;
    private Map<String, String> overlayables = emptyMap();

    private String staticSharedLibName;
    private long staticSharedLibVersion;
@@ -475,7 +480,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android

    @Override
    public Map<String, ArraySet<PublicKey>> getKeySetMapping() {
        return keySetMapping == null ? Collections.emptyMap() : keySetMapping;
        return keySetMapping == null ? emptyMap() : keySetMapping;
    }

    @Override
@@ -772,6 +777,13 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android
        return this;
    }

    @Override
    public ParsingPackage addOverlayable(String overlayableName, String actorName) {
        this.overlayables = CollectionUtils.add(this.overlayables,
                TextUtils.safeIntern(overlayableName), TextUtils.safeIntern(actorName));
        return this;
    }

    @Override
    public PackageImpl addAdoptPermission(String adoptPermission) {
        this.adoptPermissions = ArrayUtils.add(this.adoptPermissions, adoptPermission);
@@ -2124,6 +2136,11 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android
        return overlayTargetName;
    }

    @Override
    public Map<String, String> getOverlayables() {
        return overlayables;
    }

    @Override
    public boolean isOverlayIsStatic() {
        return overlayIsStatic;
@@ -2291,7 +2308,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android
        appInfo.metaData = appMetaData;
        appInfo.minAspectRatio = minAspectRatio;
        appInfo.minSdkVersion = minSdkVersion;
        appInfo.name = name;
        appInfo.name = className;
        if (appInfo.name != null) {
            appInfo.name = appInfo.name.trim();
        }
@@ -2957,6 +2974,7 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android
        dest.writeString(this.overlayCategory);
        dest.writeInt(this.overlayPriority);
        dest.writeBoolean(this.overlayIsStatic);
        dest.writeMap(this.overlayables);
        dest.writeString(this.staticSharedLibName);
        dest.writeLong(this.staticSharedLibVersion);
        dest.writeStringList(this.libraryNames);
@@ -3100,6 +3118,8 @@ public final class PackageImpl implements ParsingPackage, ParsedPackage, Android
        this.overlayCategory = in.readString();
        this.overlayPriority = in.readInt();
        this.overlayIsStatic = in.readBoolean();
        this.overlayables = new HashMap<>();
        in.readMap(overlayables, boot);
        this.staticSharedLibName = TextUtils.safeIntern(in.readString());
        this.staticSharedLibVersion = in.readLong();
        this.libraryNames = in.createStringArrayList();
+2 −0
Original line number Diff line number Diff line
@@ -62,6 +62,8 @@ public interface ParsingPackage extends AndroidPackage {

    ParsingPackage addOriginalPackage(String originalPackage);

    ParsingPackage addOverlayable(String overlayableName, String actorName);

    ParsingPackage addPermission(ParsedPermission permission);

    ParsingPackage addPermissionGroup(ParsedPermissionGroup permissionGroup);
+11 −0
Original line number Diff line number Diff line
@@ -307,6 +307,17 @@ public class CollectionUtils {
        return cur;
    }

    /**
     * @see #add(List, Object)
     */
    public static @NonNull <K, V> Map<K, V> add(@Nullable Map<K, V> map, K key, V value) {
        if (map == null || map == Collections.emptyMap()) {
            map = new ArrayMap<>();
        }
        map.put(key, value);
        return map;
    }

    /**
     * Similar to {@link List#remove}, but with support for list values of {@code null} and
     * {@link Collections#emptyList}
Loading