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

Commit 86953502 authored by Yurii Zubrytskyi's avatar Yurii Zubrytskyi
Browse files

[res] Simplify overlayable support in OverlayReferenceMapper

We don't have support for mulitple overlayable definitions per
package, and having that in the mock interface causes GC
pressure during boot for no reasons other than supporting test
inferfaces

Test: build + boot + \
  atest OverlayReferenceMapperTests AppsFilterImplTest
Flag: EXEMPT refactoring
Change-Id: I318d2118348ff484d9e9d4e27d50c9b1f464b7ca
parent d08c5650
Loading
Loading
Loading
Loading
+24 −37
Original line number Diff line number Diff line
@@ -26,13 +26,10 @@ import android.util.Slog;

import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.CollectionUtils;
import com.android.server.SystemConfig;
import com.android.server.pm.pkg.AndroidPackage;

import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -121,20 +118,16 @@ public class OverlayReferenceMapper {
                return actorPair.first;
            }

            @NonNull
            @Nullable
            @Override
            public Map<String, Set<String>> getTargetToOverlayables(@NonNull AndroidPackage pkg) {
            public Pair<String, String> getTargetToOverlayables(@NonNull AndroidPackage pkg) {
                String target = pkg.getOverlayTarget();
                if (TextUtils.isEmpty(target)) {
                    return Collections.emptyMap();
                    return null;
                }

                String overlayable = pkg.getOverlayTargetOverlayableName();
                Map<String, Set<String>> targetToOverlayables = new HashMap<>();
                Set<String> overlayables = new HashSet<>();
                overlayables.add(overlayable);
                targetToOverlayables.put(target, overlayables);
                return targetToOverlayables;
                return Pair.create(target, overlayable);
            }
        };
    }
@@ -174,7 +167,7 @@ public class OverlayReferenceMapper {
            }

            // TODO(b/135203078): Replace with isOverlay boolean flag check; fix test mocks
            if (!mProvider.getTargetToOverlayables(pkg).isEmpty()) {
            if (mProvider.getTargetToOverlayables(pkg) != null) {
                addOverlay(pkg, otherPkgs, changed);
            }

@@ -245,20 +238,17 @@ public class OverlayReferenceMapper {
            String target = targetPkg.getPackageName();
            removeTarget(target, changedPackages);

            Map<String, String> overlayablesToActors = targetPkg.getOverlayables();
            for (String overlayable : overlayablesToActors.keySet()) {
                String actor = overlayablesToActors.get(overlayable);
            final Map<String, String> overlayablesToActors = targetPkg.getOverlayables();
            for (final var entry : overlayablesToActors.entrySet()) {
                final String overlayable = entry.getKey();
                final String actor = entry.getValue();
                addTargetToMap(actor, target, changedPackages);

                for (AndroidPackage overlayPkg : otherPkgs.values()) {
                    Map<String, Set<String>> targetToOverlayables =
                    var targetToOverlayables =
                            mProvider.getTargetToOverlayables(overlayPkg);
                    Set<String> overlayables = targetToOverlayables.get(target);
                    if (CollectionUtils.isEmpty(overlayables)) {
                        continue;
                    }

                    if (overlayables.contains(overlayable)) {
                    if (targetToOverlayables != null && targetToOverlayables.first.equals(target)
                            && targetToOverlayables.second.equals(overlayable)) {
                        String overlay = overlayPkg.getPackageName();
                        addOverlayToMap(actor, target, overlay, changedPackages);
                    }
@@ -310,28 +300,25 @@ public class OverlayReferenceMapper {
            String overlay = overlayPkg.getPackageName();
            removeOverlay(overlay, changedPackages);

            Map<String, Set<String>> targetToOverlayables =
            Pair<String, String> targetToOverlayables =
                    mProvider.getTargetToOverlayables(overlayPkg);
            for (Map.Entry<String, Set<String>> entry : targetToOverlayables.entrySet()) {
                String target = entry.getKey();
                Set<String> overlayables = entry.getValue();
            if (targetToOverlayables != null) {
                String target = targetToOverlayables.first;
                AndroidPackage targetPkg = otherPkgs.get(target);
                if (targetPkg == null) {
                    continue;
                    return;
                }

                String targetPkgName = targetPkg.getPackageName();
                Map<String, String> overlayableToActor = targetPkg.getOverlayables();
                for (String overlayable : overlayables) {
                String overlayable = targetToOverlayables.second;
                String actor = overlayableToActor.get(overlayable);
                if (TextUtils.isEmpty(actor)) {
                        continue;
                    return;
                }
                addOverlayToMap(actor, targetPkgName, overlay, changedPackages);
            }
        }
    }
    }

    public void rebuildIfDeferred() {
        synchronized (mLock) {
@@ -430,11 +417,11 @@ public class OverlayReferenceMapper {
        String getActorPkg(@NonNull String actor);

        /**
         * Mock response of multiple overlay tags.
         * Mock response of overlay tags.
         *
         * TODO(b/119899133): Replace with actual implementation; fix OverlayReferenceMapperTests
         */
        @NonNull
        Map<String, Set<String>> getTargetToOverlayables(@NonNull AndroidPackage pkg);
        @Nullable
        Pair<String, String> getTargetToOverlayables(@NonNull AndroidPackage pkg);
    }
}
+11 −19
Original line number Diff line number Diff line
@@ -45,6 +45,7 @@ import android.os.UserHandle;
import android.platform.test.annotations.Presubmit;
import android.util.ArrayMap;
import android.util.ArraySet;
import android.util.Pair;
import android.util.SparseArray;

import androidx.annotation.NonNull;
@@ -78,10 +79,7 @@ import java.security.cert.CertificateException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import java.util.Set;

@Presubmit
@RunWith(JUnit4.class)
@@ -885,18 +883,15 @@ public class AppsFilterImplTest {
                        return null;
                    }

                    @NonNull
                    @Nullable
                    @Override
                    public Map<String, Set<String>> getTargetToOverlayables(
                    public Pair<String, String> getTargetToOverlayables(
                            @NonNull AndroidPackage pkg) {
                        if (overlay.getPackageName().equals(pkg.getPackageName())) {
                            Map<String, Set<String>> map = new ArrayMap<>();
                            Set<String> set = new ArraySet<>();
                            set.add(overlay.getOverlayTargetOverlayableName());
                            map.put(overlay.getOverlayTarget(), set);
                            return map;
                            return Pair.create(overlay.getOverlayTarget(),
                                    overlay.getOverlayTargetOverlayableName());
                        }
                        return Collections.emptyMap();
                        return null;
                    }
                },
                mMockHandler);
@@ -977,18 +972,15 @@ public class AppsFilterImplTest {
                        return null;
                    }

                    @NonNull
                    @Nullable
                    @Override
                    public Map<String, Set<String>> getTargetToOverlayables(
                    public Pair<String, String> getTargetToOverlayables(
                            @NonNull AndroidPackage pkg) {
                        if (overlay.getPackageName().equals(pkg.getPackageName())) {
                            Map<String, Set<String>> map = new ArrayMap<>();
                            Set<String> set = new ArraySet<>();
                            set.add(overlay.getOverlayTargetOverlayableName());
                            map.put(overlay.getOverlayTarget(), set);
                            return map;
                            return Pair.create(overlay.getOverlayTarget(),
                                    overlay.getOverlayTargetOverlayableName());
                        }
                        return Collections.emptyMap();
                        return null;
                    }
                },
                mMockHandler);
+8 −39
Original line number Diff line number Diff line
@@ -76,12 +76,10 @@ class OverlayReferenceMapperTests {
        val overlay1 = mockOverlay(1)
        mapper = mapper(
                overlayToTargetToOverlayables = mapOf(
                        overlay0.packageName to mapOf(
                                target.packageName to target.overlayables.keys
                        ),
                        overlay1.packageName to mapOf(
                                target.packageName to target.overlayables.keys
                        )
                        overlay0.packageName to android.util.Pair(target.packageName,
                            target.overlayables.keys.first()),
                        overlay1.packageName to android.util.Pair(target.packageName,
                            target.overlayables.keys.first())
                )
        )
        val existing = mapper.addInOrder(overlay0, overlay1) {
@@ -133,33 +131,6 @@ class OverlayReferenceMapperTests {
        assertMapping(ACTOR_PACKAGE_NAME to setOf(target))
    }

    @Test
    fun overlayWithMultipleTargets() {
        val target0 = mockTarget(0)
        val target1 = mockTarget(1)
        val overlay = mockOverlay()
        mapper = mapper(
                overlayToTargetToOverlayables = mapOf(
                        overlay.packageName to mapOf(
                                target0.packageName to target0.overlayables.keys,
                                target1.packageName to target1.overlayables.keys
                        )
                )
        )
        mapper.addInOrder(target0, target1, overlay) {
            assertThat(it).containsExactly(ACTOR_PACKAGE_NAME)
        }
        assertMapping(ACTOR_PACKAGE_NAME to setOf(target0, target1, overlay))
        mapper.remove(target0) {
            assertThat(it).containsExactly(ACTOR_PACKAGE_NAME)
        }
        assertMapping(ACTOR_PACKAGE_NAME to setOf(target1, overlay))
        mapper.remove(target1) {
            assertThat(it).containsExactly(ACTOR_PACKAGE_NAME)
        }
        assertEmpty()
    }

    @Test
    fun overlayWithoutTarget() {
        val overlay = mockOverlay()
@@ -219,17 +190,15 @@ class OverlayReferenceMapperTests {
        namedActors: Map<String, Map<String, String>> = Uri.parse(ACTOR_NAME).run {
            mapOf(authority!! to mapOf(pathSegments.first() to ACTOR_PACKAGE_NAME))
        },
        overlayToTargetToOverlayables: Map<String, Map<String, Set<String>>> = mapOf(
                mockOverlay().packageName to mapOf(
                        mockTarget().run { packageName to overlayables.keys }
                )
        )
        overlayToTargetToOverlayables: Map<String, android.util.Pair<String, String>> = mapOf(
                mockOverlay().packageName to mockTarget().run { android.util.Pair(packageName!!,
                    overlayables.keys.first()) })
    ) = OverlayReferenceMapper(deferRebuild, object : OverlayReferenceMapper.Provider {
        override fun getActorPkg(actor: String) =
                OverlayActorEnforcer.getPackageNameForActor(actor, namedActors).first

        override fun getTargetToOverlayables(pkg: AndroidPackage) =
                overlayToTargetToOverlayables[pkg.packageName] ?: emptyMap()
                overlayToTargetToOverlayables[pkg.packageName]
    })

    private fun mockTarget(increment: Int = 0) = mockThrowOnUnmocked<AndroidPackage> {