diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 812f6b0fc34be..ed1f6a2b1457f 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -17,6 +17,7 @@ package android.content.om; import android.annotation.NonNull; +import android.annotation.NonUiContext; import android.annotation.Nullable; import android.annotation.RequiresPermission; import android.annotation.SystemApi; @@ -25,12 +26,16 @@ import android.compat.Compatibility; import android.compat.annotation.ChangeId; import android.compat.annotation.EnabledSince; import android.content.Context; +import android.content.pm.PackageManager; import android.os.Build; import android.os.Process; import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; +import com.android.internal.content.om.OverlayManagerImpl; + +import java.io.IOException; import java.util.List; /** @@ -76,6 +81,7 @@ public class OverlayManager { private final IOverlayManager mService; private final Context mContext; + private final OverlayManagerImpl mOverlayManagerImpl; /** * Pre R a {@link java.lang.SecurityException} would only be thrown by setEnabled APIs (e @@ -117,6 +123,7 @@ public class OverlayManager { public OverlayManager(Context context, IOverlayManager service) { mContext = context; mService = service; + mOverlayManagerImpl = new OverlayManagerImpl(context); } /** @hide */ @@ -301,6 +308,17 @@ public class OverlayManager { * @hide */ public void commit(@NonNull final OverlayManagerTransaction transaction) { + if (transaction.isSelfTargetingTransaction() + || mService == null + || mService.asBinder() == null) { + try { + commitSelfTarget(transaction); + } catch (PackageManager.NameNotFoundException | IOException e) { + throw new RuntimeException(e); + } + return; + } + try { mService.commit(transaction); } catch (RemoteException e) { @@ -332,4 +350,48 @@ public class OverlayManager { throw e; } } + + /** + * Get a OverlayManagerTransaction.Builder to build out a overlay manager transaction. + * + * @return a builder of the overlay manager transaction. + * @hide + */ + @NonNull + public OverlayManagerTransaction.Builder beginTransaction() { + return new OverlayManagerTransaction.Builder(this); + } + + /** + * Commit the self-targeting transaction to register or unregister overlays. + * + *
Applications can request OverlayManager to register overlays and unregister the registered
+ * overlays via {@link OverlayManagerTransaction}.
+ *
+ * @throws IOException if there is a file operation error.
+ * @throws PackageManager.NameNotFoundException if the package name is not found.
+ * @hide
+ */
+ @NonUiContext
+ void commitSelfTarget(@NonNull final OverlayManagerTransaction transaction)
+ throws PackageManager.NameNotFoundException, IOException {
+ synchronized (mOverlayManagerImpl) {
+ mOverlayManagerImpl.commit(transaction);
+ }
+ }
+
+ /**
+ * Get the related information of overlays for {@code targetPackageName}.
+ *
+ * @param targetPackageName the target package name
+ * @return a list of overlay information
+ * @hide
+ */
+ @NonNull
+ @NonUiContext
+ public List Applications can register overlays and unregister the registered overlays via {@link
+ * OverlayManagerTransaction}.
+ *
+ * @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 {
+ mOverlayManager.commitSelfTarget(this);
+ }
+
+ boolean isSelfTargetingTransaction() {
+ return mOverlayManager != null;
+ }
}