diff options
3 files changed, 65 insertions, 93 deletions
diff --git a/services/core/java/com/android/server/om/OverlayReferenceMapper.java b/services/core/java/com/android/server/om/OverlayReferenceMapper.java index fdceabe74dd8..18de9952ed19 100644 --- a/services/core/java/com/android/server/om/OverlayReferenceMapper.java +++ b/services/core/java/com/android/server/om/OverlayReferenceMapper.java @@ -26,15 +26,13 @@ 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.Objects; import java.util.Set; /** @@ -121,20 +119,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 +168,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 +239,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) + && Objects.equals(targetToOverlayables.second, overlayable)) { String overlay = overlayPkg.getPackageName(); addOverlayToMap(actor, target, overlay, changedPackages); } @@ -310,25 +301,22 @@ 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 actor = overlayableToActor.get(overlayable); - if (TextUtils.isEmpty(actor)) { - continue; - } - addOverlayToMap(actor, targetPkgName, overlay, changedPackages); + String overlayable = targetToOverlayables.second; + String actor = overlayableToActor.get(overlayable); + if (TextUtils.isEmpty(actor)) { + return; } + addOverlayToMap(actor, targetPkgName, overlay, changedPackages); } } } @@ -430,11 +418,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); } } diff --git a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java index 7277fd79fdd5..66aaa562b873 100644 --- a/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java +++ b/services/tests/PackageManagerServiceTests/server/src/com/android/server/pm/AppsFilterImplTest.java @@ -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); diff --git a/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt b/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt index 1352adef783f..ad6e467efeef 100644 --- a/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt +++ b/services/tests/servicestests/src/com/android/server/om/OverlayReferenceMapperTests.kt @@ -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) { @@ -134,42 +132,38 @@ class OverlayReferenceMapperTests { } @Test - fun overlayWithMultipleTargets() { - val target0 = mockTarget(0) - val target1 = mockTarget(1) + fun overlayWithoutTarget() { 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) + mapper.addInOrder(overlay) { + assertThat(it).isEmpty() } - assertMapping(ACTOR_PACKAGE_NAME to setOf(target1, overlay)) - mapper.remove(target1) { - assertThat(it).containsExactly(ACTOR_PACKAGE_NAME) + // An overlay can only have visibility exposed through its target + assertEmpty() + mapper.remove(overlay) { + assertThat(it).isEmpty() } assertEmpty() } @Test - fun overlayWithoutTarget() { + fun targetWithNullOverlayable() { + val target = mockTarget() val overlay = mockOverlay() - mapper.addInOrder(overlay) { + mapper = mapper( + overlayToTargetToOverlayables = mapOf( + overlay.packageName to android.util.Pair(target.packageName, null) + ) + ) + val existing = mapper.addInOrder(overlay) { assertThat(it).isEmpty() } - // An overlay can only have visibility exposed through its target assertEmpty() - mapper.remove(overlay) { - assertThat(it).isEmpty() + mapper.addInOrder(target, existing = existing) { + assertThat(it).containsExactly(ACTOR_PACKAGE_NAME) + } + assertMapping(ACTOR_PACKAGE_NAME to setOf(target)) + mapper.remove(target) { + assertThat(it).containsExactly(ACTOR_PACKAGE_NAME) } assertEmpty() } @@ -219,17 +213,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> { |