From 1cbf6fbbb4835f97b9fd6ad6814966c01bdeeba3 Mon Sep 17 00:00:00 2001 From: felkachang Date: Mon, 19 Sep 2022 13:06:23 +0800 Subject: [PATCH] Let self-targeting apps be able access OverlayManager Self-targeting apps can't get an OverlayManager instance without the system privilege. This patch makes sure that the self-targeting application can get an OverlayManager instance via Context. ``` OverlayManager overlayManager = context.getSystemService(OverlayManager.class); ``` In order to make the self-targeting feature compatible in the future, this patch adds SELF_TARGETING_OVERLAY compatibility feature. Test: atest \ OverlayHostTests \ OverlayDeviceTests \ SelfTargetingOverlayDeviceTests \ OverlayRemountedTest \ FrameworksServicesTests:com.android.server.om \ CtsContentTestCases:android.content.om.cts \ idmap2_tests Bug: 205919743 Change-Id: Ib0b619a2a54e22d31e6c14bf700e421688b6f506 --- core/java/android/app/SystemServiceRegistry.java | 6 +++++- core/java/android/content/om/OverlayManager.java | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/core/java/android/app/SystemServiceRegistry.java b/core/java/android/app/SystemServiceRegistry.java index e54a0841dd26f..5d87012ec7e73 100644 --- a/core/java/android/app/SystemServiceRegistry.java +++ b/core/java/android/app/SystemServiceRegistry.java @@ -58,6 +58,7 @@ import android.companion.CompanionDeviceManager; import android.companion.ICompanionDeviceManager; import android.companion.virtual.IVirtualDeviceManager; import android.companion.virtual.VirtualDeviceManager; +import android.compat.Compatibility; import android.content.ClipboardManager; import android.content.ContentCaptureOptions; import android.content.Context; @@ -1092,7 +1093,10 @@ public final class SystemServiceRegistry { new CachedServiceFetcher() { @Override public OverlayManager createService(ContextImpl ctx) throws ServiceNotFoundException { - IBinder b = ServiceManager.getServiceOrThrow(Context.OVERLAY_SERVICE); + final IBinder b = + (Compatibility.isChangeEnabled(OverlayManager.SELF_TARGETING_OVERLAY)) + ? ServiceManager.getService(Context.OVERLAY_SERVICE) + : ServiceManager.getServiceOrThrow(Context.OVERLAY_SERVICE); return new OverlayManager(ctx, IOverlayManager.Stub.asInterface(b)); }}); diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 94275aea0c4d8..812f6b0fc34be 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -91,6 +91,21 @@ public class OverlayManager { @EnabledSince(targetSdkVersion = Build.VERSION_CODES.R) private static final long THROW_SECURITY_EXCEPTIONS = 147340954; + /** + * Applications can use OverlayManager to create overlays to overlay on itself resources. The + * overlay target is itself and the work range is only in caller application. + * + *

In {@link android.content.Context#getSystemService(String)}, it crashes because of {@link + * java.lang.NullPointerException} if the parameter is OverlayManager. if the self-targeting is + * enabled, the caller application can get the OverlayManager instance to use self-targeting + * functionality. + * + * @hide + */ + @ChangeId + @EnabledSince(targetSdkVersion = Build.VERSION_CODES.UPSIDE_DOWN_CAKE) + public static final long SELF_TARGETING_OVERLAY = 205919743; + /** * Creates a new instance. *