From d11fe3b41b56b4a9fd711a7156b8e8697374fd40 Mon Sep 17 00:00:00 2001 From: felkachang Date: Wed, 21 Sep 2022 16:09:56 +0800 Subject: [PATCH] Public self targeting API Apps can maintains overlays by using these public APIs. 1. Create a FabricatedOverlay instance and set the overlay content. 2. Get a OverlayManager by calling context.getSystemService(...) 3. Create an OverlayManagerTransaction. 4. Register/unregister the overlays via the OverlayManagerTransaction 5. Commit the OverlayManagerTransaction. Apps can use the registered overlay to overlay itself resources. 1. Get the overlay information by calling overlayManager.getOverlayInfosByTarget(...) 2. Create a ResourcesProvider by calling ResourcesProvider.loadOverlay(overlayInfo) 3. Create a ResourcesLoader to adding the ResourcesProvider in steps 2. 4. Overlay a Resources instance by calling Resources.addLoader(...) This patch removes @hide to public the above APIs. Bug: 205919743 CTS-Coverage-Bug: 262232910 API-Coverage-Bug: 262232910 Test: make update-api ; make Test: make online-sdk-docs offline-sdk-docs Test: atest \ OverlayHostTests \ OverlayDeviceTests \ SelfTargetingOverlayDeviceTests \ OverlayRemountedTest \ FrameworksServicesTests:com.android.server.om \ CtsContentTestCases:android.content.om.cts \ CtsContentTestCases:android.content.res.loader.cts \ idmap2_tests Change-Id: I34fee52f55cd2ce63613dfb43e8ab235eca47772 --- core/api/current.txt | 45 +++++++++++++++++++ core/api/system-current.txt | 5 --- core/java/android/content/Context.java | 1 - .../android/content/om/FabricatedOverlay.java | 9 +--- .../android/content/om/OverlayIdentifier.java | 3 -- core/java/android/content/om/OverlayInfo.java | 9 ---- .../android/content/om/OverlayManager.java | 3 -- .../content/om/OverlayManagerTransaction.java | 11 ----- .../content/res/loader/ResourcesProvider.java | 1 - 9 files changed, 46 insertions(+), 41 deletions(-) diff --git a/core/api/current.txt b/core/api/current.txt index b59e32dabc9c9..5ad2a7cfe318f 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -10010,6 +10010,7 @@ package android.content { field public static final String NFC_SERVICE = "nfc"; field public static final String NOTIFICATION_SERVICE = "notification"; field public static final String NSD_SERVICE = "servicediscovery"; + field public static final String OVERLAY_SERVICE = "overlay"; field public static final String PEOPLE_SERVICE = "people"; field public static final String PERFORMANCE_HINT_SERVICE = "performance_hint"; field public static final String POWER_SERVICE = "power"; @@ -11178,6 +11179,49 @@ package android.content { } +package android.content.om { + + public class FabricatedOverlay { + ctor public FabricatedOverlay(@NonNull String, @NonNull String); + method @NonNull public android.content.om.OverlayIdentifier getIdentifier(); + method @NonNull public void setResourceValue(@NonNull String, @IntRange(from=android.util.TypedValue.TYPE_FIRST_INT, to=android.util.TypedValue.TYPE_LAST_INT) int, int, @Nullable String); + method @NonNull public void setResourceValue(@NonNull String, int, @NonNull String, @Nullable String); + method @NonNull public void setResourceValue(@NonNull String, @NonNull android.os.ParcelFileDescriptor, @Nullable String); + method public void setTargetOverlayable(@Nullable String); + } + + public final class OverlayIdentifier implements android.os.Parcelable { + method public int describeContents(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public final class OverlayInfo implements android.os.Parcelable { + method public int describeContents(); + method @NonNull public android.content.om.OverlayIdentifier getOverlayIdentifier(); + method @Nullable public String getOverlayName(); + method @Nullable public String getTargetOverlayableName(); + method @NonNull public String getTargetPackageName(); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + + public class OverlayManager { + method @NonNull @NonUiContext public java.util.List getOverlayInfosForTarget(@NonNull String); + } + + public final class OverlayManagerTransaction implements android.os.Parcelable { + ctor public OverlayManagerTransaction(@NonNull android.content.om.OverlayManager); + method @NonUiContext public void commit() throws java.io.IOException, android.content.pm.PackageManager.NameNotFoundException; + method public int describeContents(); + method @NonNull public void registerFabricatedOverlay(@NonNull android.content.om.FabricatedOverlay); + method @NonNull public void unregisterFabricatedOverlay(@NonNull android.content.om.OverlayIdentifier); + method public void writeToParcel(@NonNull android.os.Parcel, int); + field @NonNull public static final android.os.Parcelable.Creator CREATOR; + } + +} + package android.content.pm { public class ActivityInfo extends android.content.pm.ComponentInfo implements android.os.Parcelable { @@ -13082,6 +13126,7 @@ package android.content.res.loader { method @NonNull public static android.content.res.loader.ResourcesProvider loadFromDirectory(@NonNull String, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromSplit(@NonNull android.content.Context, @NonNull String) throws java.io.IOException; method @NonNull public static android.content.res.loader.ResourcesProvider loadFromTable(@NonNull android.os.ParcelFileDescriptor, @Nullable android.content.res.loader.AssetsProvider) throws java.io.IOException; + method @NonNull public static android.content.res.loader.ResourcesProvider loadOverlay(@NonNull android.content.om.OverlayInfo) throws java.io.IOException; } } diff --git a/core/api/system-current.txt b/core/api/system-current.txt index fd28f97679268..e8f8d7c4c539c 100644 --- a/core/api/system-current.txt +++ b/core/api/system-current.txt @@ -3420,15 +3420,10 @@ package android.content.integrity { package android.content.om { public final class OverlayInfo implements android.os.Parcelable { - method public int describeContents(); method @Nullable public String getCategory(); method @NonNull public String getPackageName(); - method @Nullable public String getTargetOverlayableName(); - method @NonNull public String getTargetPackageName(); method public int getUserId(); method public boolean isEnabled(); - method public void writeToParcel(@NonNull android.os.Parcel, int); - field @NonNull public static final android.os.Parcelable.Creator CREATOR; } public class OverlayManager { diff --git a/core/java/android/content/Context.java b/core/java/android/content/Context.java index bb3bf5cc2b184..acc27c1a13348 100644 --- a/core/java/android/content/Context.java +++ b/core/java/android/content/Context.java @@ -5766,7 +5766,6 @@ public abstract class Context { * * @see #getSystemService(String) * @see android.content.om.OverlayManager - * @hide */ public static final String OVERLAY_SERVICE = "overlay"; diff --git a/core/java/android/content/om/FabricatedOverlay.java b/core/java/android/content/om/FabricatedOverlay.java index e4936bc36742d..7e787c9c3a8cc 100644 --- a/core/java/android/content/om/FabricatedOverlay.java +++ b/core/java/android/content/om/FabricatedOverlay.java @@ -78,16 +78,14 @@ import java.util.Objects; * * @see OverlayManager * @see OverlayManagerTransaction - * @hide */ public class FabricatedOverlay { /** * Retrieves the identifier for this fabricated overlay. * @return the overlay identifier - * - * @hide */ + @NonNull public OverlayIdentifier getIdentifier() { return new OverlayIdentifier( mOverlay.packageName, TextUtils.nullIfEmpty(mOverlay.overlayName)); @@ -325,7 +323,6 @@ public class FabricatedOverlay { * @param overlayName a name used to uniquely identify the fabricated overlay owned by the * caller itself. * @param targetPackage the name of the package to be overlaid - * @hide */ public FabricatedOverlay(@NonNull String overlayName, @NonNull String targetPackage) { this(generateFabricatedOverlayInternal( @@ -344,7 +341,6 @@ public class FabricatedOverlay { * should specify which overlayable to be overlaid. * * @param targetOverlayable the overlayable name defined in target package. - * @hide */ public void setTargetOverlayable(@Nullable String targetOverlayable) { mOverlay.targetOverlayable = TextUtils.emptyIfNull(targetOverlayable); @@ -438,7 +434,6 @@ public class FabricatedOverlay { * @param value the integer representing the new value * @param configuration The string representation of the config this overlay is enabled for * @see android.util.TypedValue#TYPE_INT_COLOR_ARGB8 android.util.TypedValue#type - * @hide */ @NonNull public void setResourceValue( @@ -470,7 +465,6 @@ public class FabricatedOverlay { * @param value the string representing the new value * @param configuration The string representation of the config this overlay is enabled for * @see android.util.TypedValue#TYPE_STRING android.util.TypedValue#type - * @hide */ @NonNull public void setResourceValue( @@ -491,7 +485,6 @@ public class FabricatedOverlay { * [package]:type/entry) * @param value the file descriptor whose contents are the value of the frro * @param configuration The string representation of the config this overlay is enabled for - * @hide */ @NonNull public void setResourceValue( diff --git a/core/java/android/content/om/OverlayIdentifier.java b/core/java/android/content/om/OverlayIdentifier.java index a43091e6d5e2f..f256372964f2d 100644 --- a/core/java/android/content/om/OverlayIdentifier.java +++ b/core/java/android/content/om/OverlayIdentifier.java @@ -41,7 +41,6 @@ import java.util.Objects; * @see OverlayInfo#getOverlayIdentifier() * @see OverlayManagerTransaction.Builder#unregisterFabricatedOverlay(OverlayIdentifier) */ -/** @hide */ @DataClass(genConstructor = false, genBuilder = false, genHiddenBuilder = false, genEqualsHashCode = true, genToString = false) public final class OverlayIdentifier implements Parcelable { @@ -176,7 +175,6 @@ public final class OverlayIdentifier implements Parcelable { /** * {@inheritDoc} - * @hide */ @Override @DataClass.Generated.Member @@ -194,7 +192,6 @@ public final class OverlayIdentifier implements Parcelable { /** * {@inheritDoc} - * @hide */ @Override @DataClass.Generated.Member diff --git a/core/java/android/content/om/OverlayInfo.java b/core/java/android/content/om/OverlayInfo.java index a81d16ab4ca34..ff1c08801dd79 100644 --- a/core/java/android/content/om/OverlayInfo.java +++ b/core/java/android/content/om/OverlayInfo.java @@ -46,9 +46,7 @@ import java.util.Objects; * --> * * @see OverlayManager#getOverlayInfosForTarget(String) - * @hide */ -@SystemApi public final class OverlayInfo implements CriticalOverlayInfo, Parcelable { /** @hide */ @@ -59,7 +57,6 @@ public final class OverlayInfo implements CriticalOverlayInfo, Parcelable { STATE_DISABLED, STATE_ENABLED, STATE_ENABLED_IMMUTABLE, - // @Deprecated STATE_TARGET_IS_BEING_REPLACED, STATE_OVERLAY_IS_BEING_REPLACED, STATE_SYSTEM_UPDATE_UNINSTALL, }) @@ -312,7 +309,6 @@ public final class OverlayInfo implements CriticalOverlayInfo, Parcelable { * Get the overlay name from the registered fabricated overlay. * * @return the overlay name - * @hide */ @Override @Nullable @@ -324,10 +320,8 @@ public final class OverlayInfo implements CriticalOverlayInfo, Parcelable { * Returns the name of the target overlaid package. * * @return the target package name - * @hide */ @Override - @SystemApi @NonNull public String getTargetPackageName() { return targetPackageName; @@ -359,9 +353,7 @@ public final class OverlayInfo implements CriticalOverlayInfo, Parcelable { * Return the target overlayable name. * * @return the name of the target overlayable resources set - * @hide */ - @SystemApi @Override @Nullable public String getTargetOverlayableName() { @@ -394,7 +386,6 @@ public final class OverlayInfo implements CriticalOverlayInfo, Parcelable { * * @return an identifier representing the current overlay. * @see OverlayManagerTransaction.Builder#unregisterFabricatedOverlay(OverlayIdentifier) - * @hide */ @Override @NonNull diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 7803cb8829178..96b76034c0317 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -54,9 +54,7 @@ import java.util.List; * * * @see OverlayManagerTransaction - * @hide */ -@SystemApi @SystemService(Context.OVERLAY_SERVICE) public class OverlayManager { @@ -392,7 +390,6 @@ public class OverlayManager { * * @param targetPackageName the target package name * @return a list of overlay information - * @hide */ @NonNull @NonUiContext diff --git a/core/java/android/content/om/OverlayManagerTransaction.java b/core/java/android/content/om/OverlayManagerTransaction.java index c7c605dca70c5..5fd695b9fbaa0 100644 --- a/core/java/android/content/om/OverlayManagerTransaction.java +++ b/core/java/android/content/om/OverlayManagerTransaction.java @@ -58,7 +58,6 @@ import java.util.Objects; * * @see OverlayManager * @see FabricatedOverlay - * @hide */ public final class OverlayManagerTransaction implements Parcelable { // TODO: remove @hide from this class when OverlayManager is added to the @@ -92,8 +91,6 @@ public final class OverlayManagerTransaction implements Parcelable { /** * Get an overlay manager transaction with the specified handler. * @param overlayManager handles this transaction. - * - * @hide */ public OverlayManagerTransaction(@NonNull OverlayManager overlayManager) { this(new ArrayList<>(), Objects.requireNonNull(overlayManager)); @@ -291,8 +288,6 @@ public final class OverlayManagerTransaction implements Parcelable { /** * {@inheritDoc} - * - * @hide */ @Override public int describeContents() { @@ -301,8 +296,6 @@ public final class OverlayManagerTransaction implements Parcelable { /** * {@inheritDoc} - * - * @hide */ @Override public void writeToParcel(@NonNull Parcel dest, int flags) { @@ -340,7 +333,6 @@ public final class OverlayManagerTransaction implements Parcelable { * * @throws IOException if there is a file operation error. * @throws PackageManager.NameNotFoundException if the package name is not found. - * @hide */ @NonUiContext public void commit() throws PackageManager.NameNotFoundException, IOException { @@ -374,8 +366,6 @@ public final class OverlayManagerTransaction implements Parcelable { * package or target overlayable is changed. * * @param overlay the overlay to register with the overlay manager - * - * @hide */ @NonNull public void registerFabricatedOverlay(@NonNull FabricatedOverlay overlay) { @@ -389,7 +379,6 @@ public final class OverlayManagerTransaction implements Parcelable { * * @see OverlayManager#getOverlayInfosForTarget(String) * @see OverlayInfo#getOverlayIdentifier() - * @hide */ @NonNull public void unregisterFabricatedOverlay(@NonNull OverlayIdentifier overlay) { diff --git a/core/java/android/content/res/loader/ResourcesProvider.java b/core/java/android/content/res/loader/ResourcesProvider.java index a5a1fa689f9bc..b097bc0dcd8cf 100644 --- a/core/java/android/content/res/loader/ResourcesProvider.java +++ b/core/java/android/content/res/loader/ResourcesProvider.java @@ -83,7 +83,6 @@ public class ResourcesProvider implements AutoCloseable, Closeable { * @return the resources provider instance for the {@code overlayInfo} * @throws IOException when the files can't be loaded. * @see OverlayManager#getOverlayInfosForTarget(String) to get the list of overlay info. - * @hide */ @SuppressLint("WrongConstant") // TODO(b/238713267): ApkAssets blocks PROPERTY_LOADER @NonNull