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

Commit 43e523ee authored by LuK1337's avatar LuK1337 Committed by Michael Bestas
Browse files

Allow lineage resources package to be overlayed by RRO packages

Change-Id: I152ef9a87b16338e14af508e0f1f42830688c5ea
parent 8a914df7
Loading
Loading
Loading
Loading
+29 −20
Original line number Diff line number Diff line
@@ -35,6 +35,8 @@ import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.HashMap;
import java.util.Map;
import java.util.function.BiConsumer;
import java.util.function.Supplier;

@@ -327,13 +329,14 @@ public class OverlayConfig {
     * precedence.
     */
    @VisibleForTesting
    public ArrayList<IdmapInvocation> getImmutableFrameworkOverlayIdmapInvocations() {
    public ArrayList<IdmapInvocation> getImmutableFrameworkOverlayIdmapInvocations(
            String packageName) {
        final ArrayList<IdmapInvocation> idmapInvocations = new ArrayList<>();
        final ArrayList<Configuration> sortedConfigs = getSortedOverlays();
        for (int i = 0, n = sortedConfigs.size(); i < n; i++) {
            final Configuration overlay = sortedConfigs.get(i);
            if (overlay.parsedConfig.mutable || !overlay.parsedConfig.enabled
                    || !"android".equals(overlay.parsedConfig.parsedInfo.targetPackageName)) {
                    || !packageName.equals(overlay.parsedConfig.parsedInfo.targetPackageName)) {
                continue;
            }

@@ -372,11 +375,16 @@ public class OverlayConfig {
     */
    @NonNull
    public String[] createImmutableFrameworkIdmapsInZygote() {
        final String targetPath = "/system/framework/framework-res.apk";
        final ArrayList<String> idmapPaths = new ArrayList<>();
        final ArrayList<IdmapInvocation> idmapInvocations =
                getImmutableFrameworkOverlayIdmapInvocations();

        for (Map.Entry<String, String> target : new HashMap<String, String>() {{
                put("/system/framework/framework-res.apk", "android");
                put("/system/framework/org.lineageos.platform-res.apk", "lineageos.platform");
        }}.entrySet()) {
            final String targetPath = target.getKey();
            final String targetPackageName = target.getValue();
            final ArrayList<IdmapInvocation> idmapInvocations =
                    getImmutableFrameworkOverlayIdmapInvocations(targetPackageName);
            for (int i = 0, n = idmapInvocations.size(); i < n; i++) {
                final IdmapInvocation invocation = idmapInvocations.get(i);
                final String[] idmaps = createIdmap(targetPath,
@@ -393,6 +401,7 @@ public class OverlayConfig {

                idmapPaths.addAll(Arrays.asList(idmaps));
            }
        }

        return idmapPaths.toArray(new String[0]);
    }
+2 −2
Original line number Diff line number Diff line
@@ -393,7 +393,7 @@ public class OverlayConfigTest {
        final OverlayConfig overlayConfig = createConfigImpl();
        if (mScannerRule.getIteration() == OverlayConfigIterationRule.Iteration.ZYGOTE) {
            final ArrayList<IdmapInvocation> idmapInvocations =
                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations();
                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations("android");
            assertEquals(2, idmapInvocations.size());

            final IdmapInvocation i0 = idmapInvocations.get(0);
@@ -430,7 +430,7 @@ public class OverlayConfigTest {

        if (mScannerRule.getIteration() == OverlayConfigIterationRule.Iteration.ZYGOTE) {
            final ArrayList<IdmapInvocation> idmapInvocations =
                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations();
                    overlayConfig.getImmutableFrameworkOverlayIdmapInvocations("android");
            assertEquals(3, idmapInvocations.size());

            final IdmapInvocation i0 = idmapInvocations.get(0);
+2 −1
Original line number Diff line number Diff line
@@ -779,7 +779,8 @@ final class OverlayManagerServiceImpl {
        // Immutable RROs targeting to "android", ie framework-res.apk, are handled by native
        // layers.
        final OverlayInfo updatedOverlayInfo = mSettings.getOverlayInfo(overlay, userId);
        if (targetPackage != null && !("android".equals(info.getTargetPackageName())
        if (targetPackage != null && !(("android".equals(info.getTargetPackageName()) ||
                                        "lineageos.platform".equals(info.getTargetPackageName()))
                && !isPackageConfiguredMutable(overlayPackage))) {
            modified |= mIdmapManager.createIdmap(targetPackage, overlayPackage,
                    updatedOverlayInfo.baseCodePath, overlay.getOverlayName(), userId);
+2 −1
Original line number Diff line number Diff line
@@ -235,7 +235,8 @@ final class OverlayManagerSettings {
    }

    private static boolean isImmutableFrameworkOverlay(@NonNull SettingsItem item) {
        return !item.isMutable() && "android".equals(item.getTargetPackageName());
        return !item.isMutable() && "android".equals(item.getTargetPackageName())
               && "lineageos.platform".equals(item.getTargetPackageName());
    }

    /**