diff --git a/core/api/current.txt b/core/api/current.txt index 95729da35cab2..af34dc40838a6 100644 --- a/core/api/current.txt +++ b/core/api/current.txt @@ -11642,13 +11642,13 @@ package android.content.om { } public class OverlayManager { + method public void commit(@NonNull android.content.om.OverlayManagerTransaction); 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 static android.content.om.OverlayManagerTransaction newInstance(); 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); diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 96b76034c0317..0fcc72a1f6881 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -323,8 +323,27 @@ public class OverlayManager { * * @hide */ + private void commitToSystemServer(@NonNull final OverlayManagerTransaction transaction) { + try { + mService.commit(transaction); + } catch (RemoteException e) { + throw e.rethrowFromSystemServer(); + } + } + + /** + * Commit the overlay manager transaction. + * + *

Applications can register overlays and unregister the registered overlays in an atomic + * operation via {@link OverlayManagerTransaction}. + * + * @see OverlayManagerTransaction + * + * @param transaction the series of overlay related requests to perform + * @throws Exception if not all the requests could be successfully + */ public void commit(@NonNull final OverlayManagerTransaction transaction) { - if (transaction.isSelfTargetingTransaction() + if (transaction.isSelfTargeting() || mService == null || mService.asBinder() == null) { try { @@ -335,11 +354,7 @@ public class OverlayManager { return; } - try { - mService.commit(transaction); - } catch (RemoteException e) { - throw e.rethrowFromSystemServer(); - } + commitToSystemServer(transaction); } /** diff --git a/core/java/android/content/om/OverlayManagerTransaction.java b/core/java/android/content/om/OverlayManagerTransaction.java index 5fd695b9fbaa0..becd0ea285afd 100644 --- a/core/java/android/content/om/OverlayManagerTransaction.java +++ b/core/java/android/content/om/OverlayManagerTransaction.java @@ -16,20 +16,20 @@ package android.content.om; +import static android.annotation.SystemApi.Client.SYSTEM_SERVER; + import static com.android.internal.util.Preconditions.checkNotNull; import android.annotation.IntDef; import android.annotation.NonNull; -import android.annotation.NonUiContext; import android.annotation.Nullable; import android.annotation.SuppressLint; -import android.content.pm.PackageManager; +import android.annotation.SystemApi; import android.os.Bundle; import android.os.Parcel; import android.os.Parcelable; import android.os.UserHandle; -import java.io.IOException; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; @@ -63,7 +63,7 @@ public final class OverlayManagerTransaction implements Parcelable { // TODO: remove @hide from this class when OverlayManager is added to the // SDK, but keep OverlayManagerTransaction.Request @hidden private final List mRequests; - private final OverlayManager mOverlayManager; + private final boolean mSelfTargeting; /** * Container for a batch of requests to the OverlayManagerService. @@ -79,21 +79,23 @@ public final class OverlayManagerTransaction implements Parcelable { * } */ private OverlayManagerTransaction( - @NonNull final List requests, @Nullable OverlayManager overlayManager) { + @NonNull final List requests, boolean selfTargeting) { Objects.requireNonNull(requests); if (requests.contains(null)) { throw new IllegalArgumentException("null request"); } mRequests = requests; - mOverlayManager = overlayManager; + mSelfTargeting = selfTargeting; } /** - * Get an overlay manager transaction with the specified handler. - * @param overlayManager handles this transaction. + * Get an overlay manager transaction. + * + * @return a new {@link OverlayManagerTransaction} instance. */ - public OverlayManagerTransaction(@NonNull OverlayManager overlayManager) { - this(new ArrayList<>(), Objects.requireNonNull(overlayManager)); + @NonNull + public static OverlayManagerTransaction newInstance() { + return new OverlayManagerTransaction(new ArrayList<>(), true /* selfTargeting */); } private OverlayManagerTransaction(@NonNull final Parcel source) { @@ -106,7 +108,7 @@ public final class OverlayManagerTransaction implements Parcelable { final Bundle extras = source.readBundle(null); mRequests.add(new Request(request, overlay, userId, extras)); } - mOverlayManager = null; + mSelfTargeting = false; } /** @@ -117,6 +119,7 @@ public final class OverlayManagerTransaction implements Parcelable { */ @SuppressLint("ReferencesHidden") @NonNull + @SystemApi(client = SYSTEM_SERVER) public Iterator getRequests() { return mRequests.iterator(); } @@ -137,6 +140,7 @@ public final class OverlayManagerTransaction implements Parcelable { * * @hide */ + @SystemApi(client = SYSTEM_SERVER) public static final class Request { @IntDef(prefix = "TYPE_", value = { TYPE_SET_ENABLED, @@ -200,7 +204,7 @@ public final class OverlayManagerTransaction implements Parcelable { /** * Builder class for OverlayManagerTransaction objects. - * + * TODO(b/269197647): mark the API used by the systemUI. * @hide */ public static final class Builder { @@ -282,7 +286,7 @@ public final class OverlayManagerTransaction implements Parcelable { */ @NonNull public OverlayManagerTransaction build() { - return new OverlayManagerTransaction(mRequests, null /* overlayManager */); + return new OverlayManagerTransaction(mRequests, false /* selfTargeting */); } } @@ -325,20 +329,6 @@ public final class OverlayManagerTransaction implements Parcelable { } }; - /** - * Commit the overlay manager transaction to register or unregister overlays for self-targeting. - * - *

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. - */ - @NonUiContext - public void commit() throws PackageManager.NameNotFoundException, IOException { - mOverlayManager.commitSelfTarget(this); - } - private static Request generateRegisterFabricatedOverlayRequest( @NonNull FabricatedOverlay overlay) { Objects.requireNonNull(overlay); @@ -385,7 +375,10 @@ public final class OverlayManagerTransaction implements Parcelable { mRequests.add(generateUnRegisterFabricatedOverlayRequest(overlay)); } - boolean isSelfTargetingTransaction() { - return mOverlayManager != null; + /** + * Indicate whether the transaction is for self-targeting or not. + */ + boolean isSelfTargeting() { + return mSelfTargeting; } }