summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/api/current.txt4
-rw-r--r--core/java/android/os/BinderProxy.java34
-rw-r--r--core/java/android/os/IBinder.java39
-rw-r--r--core/java/android/os/RemoteCallbackList.java46
-rw-r--r--core/tests/coretests/BinderFrozenStateChangeCallbackTestApp/src/com/android/frameworks/coretests/bfscctestapp/BfsccTestAppCmdService.java3
-rw-r--r--core/tests/coretests/src/android/os/BinderFrozenStateChangeNotificationTest.java4
-rw-r--r--core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java3
7 files changed, 21 insertions, 112 deletions
diff --git a/core/api/current.txt b/core/api/current.txt
index b927c06a7245..280e99613914 100644
--- a/core/api/current.txt
+++ b/core/api/current.txt
@@ -33261,7 +33261,7 @@ package android.os {
}
public interface IBinder {
- method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default void addFrozenStateChangeCallback(@NonNull java.util.concurrent.Executor, @NonNull android.os.IBinder.FrozenStateChangeCallback) throws android.os.RemoteException;
+ method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default void addFrozenStateChangeCallback(@NonNull android.os.IBinder.FrozenStateChangeCallback) throws android.os.RemoteException;
method public void dump(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException;
method public void dumpAsync(@NonNull java.io.FileDescriptor, @Nullable String[]) throws android.os.RemoteException;
method @Nullable public String getInterfaceDescriptor() throws android.os.RemoteException;
@@ -33885,7 +33885,6 @@ package android.os {
method public void finishBroadcast();
method public Object getBroadcastCookie(int);
method public E getBroadcastItem(int);
- method @FlaggedApi("android.os.binder_frozen_state_change_callback") @Nullable public java.util.concurrent.Executor getExecutor();
method @FlaggedApi("android.os.binder_frozen_state_change_callback") public int getFrozenCalleePolicy();
method @FlaggedApi("android.os.binder_frozen_state_change_callback") public int getMaxQueueSize();
method public Object getRegisteredCallbackCookie(int);
@@ -33906,7 +33905,6 @@ package android.os {
@FlaggedApi("android.os.binder_frozen_state_change_callback") public static final class RemoteCallbackList.Builder<E extends android.os.IInterface> {
ctor public RemoteCallbackList.Builder(int);
method @NonNull public android.os.RemoteCallbackList<E> build();
- method @NonNull public android.os.RemoteCallbackList.Builder setExecutor(@NonNull java.util.concurrent.Executor);
method @NonNull public android.os.RemoteCallbackList.Builder setInterfaceDiedCallback(@NonNull android.os.RemoteCallbackList.Builder.InterfaceDiedCallback<E>);
method @NonNull public android.os.RemoteCallbackList.Builder setMaxQueueSize(int);
}
diff --git a/core/java/android/os/BinderProxy.java b/core/java/android/os/BinderProxy.java
index 01222cdd38b3..3b5a99ed089a 100644
--- a/core/java/android/os/BinderProxy.java
+++ b/core/java/android/os/BinderProxy.java
@@ -36,7 +36,6 @@ import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
-import java.util.concurrent.Executor;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -652,39 +651,28 @@ public final class BinderProxy implements IBinder {
private native boolean unlinkToDeathNative(DeathRecipient recipient, int flags);
/**
- * This map is to hold strong reference to the frozen state callbacks.
- *
- * The callbacks are only weakly referenced by JNI so the strong references here are needed to
- * keep the callbacks around until the proxy is GC'ed.
- *
- * The key is the original callback passed into {@link #addFrozenStateChangeCallback}. The value
- * is the wrapped callback created in {@link #addFrozenStateChangeCallback} to dispatch the
- * calls on the desired executor.
+ * This list is to hold strong reference to the frozen state callbacks. The callbacks are only
+ * weakly referenced by JNI so the strong references here are needed to keep the callbacks
+ * around until the proxy is GC'ed.
*/
- private Map<FrozenStateChangeCallback, FrozenStateChangeCallback> mFrozenStateChangeCallbacks =
- Collections.synchronizedMap(new HashMap<>());
+ private List<FrozenStateChangeCallback> mFrozenStateChangeCallbacks =
+ Collections.synchronizedList(new ArrayList<>());
/**
* See {@link IBinder#addFrozenStateChangeCallback(FrozenStateChangeCallback)}
*/
- public void addFrozenStateChangeCallback(Executor executor, FrozenStateChangeCallback callback)
+ public void addFrozenStateChangeCallback(FrozenStateChangeCallback callback)
throws RemoteException {
- FrozenStateChangeCallback wrappedCallback = (who, state) ->
- executor.execute(() -> callback.onFrozenStateChanged(who, state));
- addFrozenStateChangeCallbackNative(wrappedCallback);
- mFrozenStateChangeCallbacks.put(callback, wrappedCallback);
+ addFrozenStateChangeCallbackNative(callback);
+ mFrozenStateChangeCallbacks.add(callback);
}
/**
* See {@link IBinder#removeFrozenStateChangeCallback}
*/
- public boolean removeFrozenStateChangeCallback(FrozenStateChangeCallback callback)
- throws IllegalArgumentException {
- FrozenStateChangeCallback wrappedCallback = mFrozenStateChangeCallbacks.remove(callback);
- if (wrappedCallback == null) {
- throw new IllegalArgumentException("callback not found");
- }
- return removeFrozenStateChangeCallbackNative(wrappedCallback);
+ public boolean removeFrozenStateChangeCallback(FrozenStateChangeCallback callback) {
+ mFrozenStateChangeCallbacks.remove(callback);
+ return removeFrozenStateChangeCallbackNative(callback);
}
private native void addFrozenStateChangeCallbackNative(FrozenStateChangeCallback callback)
diff --git a/core/java/android/os/IBinder.java b/core/java/android/os/IBinder.java
index 8cfd32449537..a997f4c86704 100644
--- a/core/java/android/os/IBinder.java
+++ b/core/java/android/os/IBinder.java
@@ -16,7 +16,6 @@
package android.os;
-import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -26,7 +25,6 @@ import android.compat.annotation.UnsupportedAppUsage;
import java.io.FileDescriptor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
-import java.util.concurrent.Executor;
/**
* Base interface for a remotable object, the core part of a lightweight
@@ -399,31 +397,12 @@ public interface IBinder {
@interface State {
}
- /**
- * Represents the frozen state of the remote process.
- *
- * While in this state, the remote process won't be able to receive and handle a
- * transaction. Therefore, any asynchronous transactions will be buffered and delivered when
- * the process is unfrozen, and any synchronous transactions will result in an error.
- *
- * Buffered transactions may be stale by the time that the process is unfrozen and handles
- * them. To avoid overwhelming the remote process with stale events or overflowing their
- * buffers, it's best to avoid sending binder transactions to a frozen process.
- */
int STATE_FROZEN = 0;
-
- /**
- * Represents the unfrozen state of the remote process.
- *
- * In this state, the process hosting the object can execute and is not restricted
- * by the freezer from using the CPU or responding to binder transactions.
- */
int STATE_UNFROZEN = 1;
/**
* Interface for receiving a callback when the process hosting an IBinder
* has changed its frozen state.
- *
* @param who The IBinder whose hosting process has changed state.
* @param state The latest state.
*/
@@ -448,29 +427,13 @@ public interface IBinder {
* <p>You will only receive state change notifications for remote binders, as local binders by
* definition can't be frozen without you being frozen too.</p>
*
- * @param executor The executor on which to run the callback.
- * @param callback The callback used to deliver state change notifications.
- *
* <p>@throws {@link UnsupportedOperationException} if the kernel binder driver does not support
* this feature.
*/
@FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK)
- default void addFrozenStateChangeCallback(
- @NonNull @CallbackExecutor Executor executor,
- @NonNull FrozenStateChangeCallback callback)
- throws RemoteException {
- throw new UnsupportedOperationException();
- }
-
- /**
- * Same as {@link #addFrozenStateChangeCallback(Executor, FrozenStateChangeCallback)} except
- * that callbacks are invoked on a binder thread.
- *
- * @hide
- */
default void addFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback)
throws RemoteException {
- addFrozenStateChangeCallback(Runnable::run, callback);
+ throw new UnsupportedOperationException();
}
/**
diff --git a/core/java/android/os/RemoteCallbackList.java b/core/java/android/os/RemoteCallbackList.java
index d5630fd46eb4..91c482faf7d7 100644
--- a/core/java/android/os/RemoteCallbackList.java
+++ b/core/java/android/os/RemoteCallbackList.java
@@ -16,7 +16,6 @@
package android.os;
-import android.annotation.CallbackExecutor;
import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
@@ -30,7 +29,6 @@ import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
-import java.util.concurrent.Executor;
import java.util.function.BiConsumer;
import java.util.function.Consumer;
@@ -136,7 +134,6 @@ public class RemoteCallbackList<E extends IInterface> {
private final @FrozenCalleePolicy int mFrozenCalleePolicy;
private final int mMaxQueueSize;
- private final Executor mExecutor;
private final class Interface implements IBinder.DeathRecipient,
IBinder.FrozenStateChangeCallback {
@@ -200,7 +197,7 @@ public class RemoteCallbackList<E extends IInterface> {
void maybeSubscribeToFrozenCallback() throws RemoteException {
if (mFrozenCalleePolicy != FROZEN_CALLEE_POLICY_UNSET) {
try {
- mBinder.addFrozenStateChangeCallback(mExecutor, this);
+ mBinder.addFrozenStateChangeCallback(this);
} catch (UnsupportedOperationException e) {
// The kernel does not support frozen notifications. In this case we want to
// silently fall back to FROZEN_CALLEE_POLICY_UNSET. This is done by simply
@@ -240,7 +237,6 @@ public class RemoteCallbackList<E extends IInterface> {
private @FrozenCalleePolicy int mFrozenCalleePolicy;
private int mMaxQueueSize = DEFAULT_MAX_QUEUE_SIZE;
private InterfaceDiedCallback mInterfaceDiedCallback;
- private Executor mExecutor;
/**
* Creates a Builder for {@link RemoteCallbackList}.
@@ -289,18 +285,6 @@ public class RemoteCallbackList<E extends IInterface> {
}
/**
- * Sets the executor to be used when invoking callbacks asynchronously.
- *
- * This is only used when callbacks need to be invoked asynchronously, e.g. when the process
- * hosting a callback becomes unfrozen. Callbacks that can be invoked immediately run on the
- * same thread that calls {@link #broadcast} synchronously.
- */
- public @NonNull Builder setExecutor(@NonNull @CallbackExecutor Executor executor) {
- mExecutor = executor;
- return this;
- }
-
- /**
* For notifying when the process hosting a callback interface has died.
*
* @param <E> The remote callback interface type.
@@ -324,21 +308,15 @@ public class RemoteCallbackList<E extends IInterface> {
* @return The built {@link RemoteCallbackList} object.
*/
public @NonNull RemoteCallbackList<E> build() {
- Executor executor = mExecutor;
- if (executor == null && mFrozenCalleePolicy != FROZEN_CALLEE_POLICY_UNSET) {
- // TODO Throw an exception here once the existing API caller is updated to provide
- // an executor.
- executor = new HandlerExecutor(Handler.getMain());
- }
if (mInterfaceDiedCallback != null) {
- return new RemoteCallbackList<E>(mFrozenCalleePolicy, mMaxQueueSize, executor) {
+ return new RemoteCallbackList<E>(mFrozenCalleePolicy, mMaxQueueSize) {
@Override
public void onCallbackDied(E deadInterface, Object cookie) {
mInterfaceDiedCallback.onInterfaceDied(this, deadInterface, cookie);
}
};
}
- return new RemoteCallbackList<E>(mFrozenCalleePolicy, mMaxQueueSize, executor);
+ return new RemoteCallbackList<E>(mFrozenCalleePolicy, mMaxQueueSize);
}
}
@@ -363,23 +341,13 @@ public class RemoteCallbackList<E extends IInterface> {
}
/**
- * Returns the executor used when invoking callbacks asynchronously.
- *
- * @return The executor.
- */
- @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK)
- public @Nullable Executor getExecutor() {
- return mExecutor;
- }
-
- /**
* Creates a RemoteCallbackList with {@link #FROZEN_CALLEE_POLICY_UNSET}. This is equivalent to
* <pre>
* new RemoteCallbackList.Build(RemoteCallbackList.FROZEN_CALLEE_POLICY_UNSET).build()
* </pre>
*/
public RemoteCallbackList() {
- this(FROZEN_CALLEE_POLICY_UNSET, DEFAULT_MAX_QUEUE_SIZE, null);
+ this(FROZEN_CALLEE_POLICY_UNSET, DEFAULT_MAX_QUEUE_SIZE);
}
/**
@@ -394,14 +362,10 @@ public class RemoteCallbackList<E extends IInterface> {
* recipient's process is frozen. Once the limit is reached, the oldest callbacks would be
* dropped to keep the size under limit. Ignored except for
* {@link #FROZEN_CALLEE_POLICY_ENQUEUE_ALL}.
- *
- * @param executor The executor used when invoking callbacks asynchronously.
*/
- private RemoteCallbackList(@FrozenCalleePolicy int frozenCalleePolicy, int maxQueueSize,
- @CallbackExecutor Executor executor) {
+ private RemoteCallbackList(@FrozenCalleePolicy int frozenCalleePolicy, int maxQueueSize) {
mFrozenCalleePolicy = frozenCalleePolicy;
mMaxQueueSize = maxQueueSize;
- mExecutor = executor;
}
/**
diff --git a/core/tests/coretests/BinderFrozenStateChangeCallbackTestApp/src/com/android/frameworks/coretests/bfscctestapp/BfsccTestAppCmdService.java b/core/tests/coretests/BinderFrozenStateChangeCallbackTestApp/src/com/android/frameworks/coretests/bfscctestapp/BfsccTestAppCmdService.java
index 945147db1ef5..fe54aa8d87f0 100644
--- a/core/tests/coretests/BinderFrozenStateChangeCallbackTestApp/src/com/android/frameworks/coretests/bfscctestapp/BfsccTestAppCmdService.java
+++ b/core/tests/coretests/BinderFrozenStateChangeCallbackTestApp/src/com/android/frameworks/coretests/bfscctestapp/BfsccTestAppCmdService.java
@@ -18,8 +18,6 @@ package com.android.frameworks.coretests.bfscctestapp;
import android.app.Service;
import android.content.Intent;
-import android.os.Handler;
-import android.os.HandlerExecutor;
import android.os.IBinder;
import android.os.RemoteException;
@@ -38,7 +36,6 @@ public class BfsccTestAppCmdService extends Service {
@Override
public void listenTo(IBinder binder) throws RemoteException {
binder.addFrozenStateChangeCallback(
- new HandlerExecutor(Handler.getMain()),
(IBinder who, int state) -> mNotifications.offer(state));
}
diff --git a/core/tests/coretests/src/android/os/BinderFrozenStateChangeNotificationTest.java b/core/tests/coretests/src/android/os/BinderFrozenStateChangeNotificationTest.java
index 523fe1a8aa5d..195a18a5f521 100644
--- a/core/tests/coretests/src/android/os/BinderFrozenStateChangeNotificationTest.java
+++ b/core/tests/coretests/src/android/os/BinderFrozenStateChangeNotificationTest.java
@@ -200,7 +200,7 @@ public class BinderFrozenStateChangeNotificationTest {
IBinder.FrozenStateChangeCallback callback =
(IBinder who, int state) -> results.offer(who);
try {
- binder.addFrozenStateChangeCallback(new HandlerExecutor(Handler.getMain()), callback);
+ binder.addFrozenStateChangeCallback(callback);
} catch (UnsupportedOperationException e) {
return;
}
@@ -227,7 +227,7 @@ public class BinderFrozenStateChangeNotificationTest {
final IBinder.FrozenStateChangeCallback callback =
(IBinder who, int state) ->
queue.offer(state == IBinder.FrozenStateChangeCallback.STATE_FROZEN);
- binder.addFrozenStateChangeCallback(new HandlerExecutor(Handler.getMain()), callback);
+ binder.addFrozenStateChangeCallback(callback);
return callback;
} catch (UnsupportedOperationException e) {
return null;
diff --git a/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java b/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java
index f888c9ba93a9..d0070678d4fa 100644
--- a/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java
+++ b/core/tests/coretests/src/com/android/internal/os/BinderDeathDispatcherTest.java
@@ -42,7 +42,6 @@ import org.junit.Test;
import org.junit.runner.RunWith;
import java.io.FileDescriptor;
-import java.util.concurrent.Executor;
@SmallTest
@RunWith(AndroidJUnit4.class)
@@ -126,7 +125,7 @@ public class BinderDeathDispatcherTest {
}
@Override
- public void addFrozenStateChangeCallback(Executor e, FrozenStateChangeCallback callback)
+ public void addFrozenStateChangeCallback(FrozenStateChangeCallback callback)
throws RemoteException {
}