Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit c98b7c85 authored by Yu-Ting Tseng's avatar Yu-Ting Tseng Committed by Automerger Merge Worker
Browse files

Merge "Make the binder frozen state change API public" into main am: c801fa25

parents f6f1b4d9 c801fa25
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -33184,6 +33184,7 @@ package android.os {
  }
  public interface IBinder {
    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;
@@ -33192,6 +33193,7 @@ package android.os {
    method public void linkToDeath(@NonNull android.os.IBinder.DeathRecipient, int) throws android.os.RemoteException;
    method public boolean pingBinder();
    method @Nullable public android.os.IInterface queryLocalInterface(@NonNull String);
    method @FlaggedApi("android.os.binder_frozen_state_change_callback") public default boolean removeFrozenStateChangeCallback(@NonNull android.os.IBinder.FrozenStateChangeCallback);
    method public boolean transact(int, @NonNull android.os.Parcel, @Nullable android.os.Parcel, int) throws android.os.RemoteException;
    method public boolean unlinkToDeath(@NonNull android.os.IBinder.DeathRecipient, int);
    field public static final int DUMP_TRANSACTION = 1598311760; // 0x5f444d50
@@ -33209,6 +33211,12 @@ package android.os {
    method public default void binderDied(@NonNull android.os.IBinder);
  }
  @FlaggedApi("android.os.binder_frozen_state_change_callback") public static interface IBinder.FrozenStateChangeCallback {
    method public void onFrozenStateChanged(@NonNull android.os.IBinder, int);
    field public static final int STATE_FROZEN = 0; // 0x0
    field public static final int STATE_UNFROZEN = 1; // 0x1
  }
  public interface IInterface {
    method public android.os.IBinder asBinder();
  }
+8 −9
Original line number Diff line number Diff line
@@ -650,13 +650,13 @@ public final class BinderProxy implements IBinder {
     * weakly referenced by JNI so the strong references here are needed to keep the callbacks
     * around until the proxy is GC'ed.
     */
    private List<IFrozenStateChangeCallback> mFrozenStateChangeCallbacks =
    private List<FrozenStateChangeCallback> mFrozenStateChangeCallbacks =
            Collections.synchronizedList(new ArrayList<>());

    /**
     * See {@link IBinder#addFrozenStateChangeCallback(IFrozenStateChangeCallback)}
     * See {@link IBinder#addFrozenStateChangeCallback(FrozenStateChangeCallback)}
     */
    public void addFrozenStateChangeCallback(IFrozenStateChangeCallback callback)
    public void addFrozenStateChangeCallback(FrozenStateChangeCallback callback)
            throws RemoteException {
        addFrozenStateChangeCallbackNative(callback);
        mFrozenStateChangeCallbacks.add(callback);
@@ -665,16 +665,16 @@ public final class BinderProxy implements IBinder {
    /**
     * See {@link IBinder#removeFrozenStateChangeCallback}
     */
    public boolean removeFrozenStateChangeCallback(IFrozenStateChangeCallback callback) {
    public boolean removeFrozenStateChangeCallback(FrozenStateChangeCallback callback) {
        mFrozenStateChangeCallbacks.remove(callback);
        return removeFrozenStateChangeCallbackNative(callback);
    }

    private native void addFrozenStateChangeCallbackNative(IFrozenStateChangeCallback callback)
    private native void addFrozenStateChangeCallbackNative(FrozenStateChangeCallback callback)
            throws RemoteException;

    private native boolean removeFrozenStateChangeCallbackNative(
            IFrozenStateChangeCallback callback);
            FrozenStateChangeCallback callback);

    /**
     * Perform a dump on the remote object
@@ -762,10 +762,9 @@ public final class BinderProxy implements IBinder {
    }

    private static void invokeFrozenStateChangeCallback(
            IFrozenStateChangeCallback callback, IBinder binderProxy, int stateIndex) {
            FrozenStateChangeCallback callback, IBinder binderProxy, int stateIndex) {
        try {
            callback.onFrozenStateChanged(binderProxy,
                    IFrozenStateChangeCallback.State.values()[stateIndex]);
            callback.onFrozenStateChanged(binderProxy, stateIndex);
        } catch (RuntimeException exc) {
            Log.w("BinderNative", "Uncaught exception from frozen state change callback",
                    exc);
+31 −12
Original line number Diff line number Diff line
@@ -16,11 +16,15 @@

package android.os;

import android.annotation.FlaggedApi;
import android.annotation.IntDef;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.compat.annotation.UnsupportedAppUsage;

import java.io.FileDescriptor;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;

/**
 * Base interface for a remotable object, the core part of a lightweight
@@ -377,9 +381,24 @@ public interface IBinder {
     */
    public boolean unlinkToDeath(@NonNull DeathRecipient recipient, int flags);

    /** @hide */
    interface IFrozenStateChangeCallback {
        enum State {FROZEN, UNFROZEN};
    /**
     * A callback interface for receiving frozen state change events.
     */
    @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK)
    interface FrozenStateChangeCallback {
        /**
         * @hide
         */
        @IntDef(prefix = {"STATE_"}, value = {
                STATE_FROZEN,
                STATE_UNFROZEN,
        })
        @Retention(RetentionPolicy.SOURCE)
        @interface State {
        }

        int STATE_FROZEN = 0;
        int STATE_UNFROZEN = 1;

        /**
         * Interface for receiving a callback when the process hosting an IBinder
@@ -387,13 +406,13 @@ public interface IBinder {
         * @param who The IBinder whose hosting process has changed state.
         * @param state The latest state.
         */
        void onFrozenStateChanged(@NonNull IBinder who, State state);
        void onFrozenStateChanged(@NonNull IBinder who, @State int state);
    }

    /**
     * {@link addFrozenStateChangeCallback} provides a callback mechanism to notify about process
     * frozen/unfrozen events. Upon registration and any subsequent state changes, the callback is
     * invoked with the latest process frozen state.
     * This method provides a callback mechanism to notify about process frozen/unfrozen events.
     * Upon registration and any subsequent state changes, the callback is invoked with the latest
     * process frozen state.
     *
     * <p>If the listener process (the one using this API) is itself frozen, state change events
     * might be combined into a single one with the latest frozen state. This single event would
@@ -410,19 +429,19 @@ public interface IBinder {
     *
     * <p>@throws {@link UnsupportedOperationException} if the kernel binder driver does not support
     * this feature.
     * @hide
     */
    default void addFrozenStateChangeCallback(@NonNull IFrozenStateChangeCallback callback)
    @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK)
    default void addFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback)
            throws RemoteException {
        throw new UnsupportedOperationException();
    }

    /**
     * Unregister a {@link IFrozenStateChangeCallback}. The callback will no longer be invoked when
     * Unregister a {@link FrozenStateChangeCallback}. The callback will no longer be invoked when
     * the hosting process changes its frozen state.
     * @hide
     */
    default boolean removeFrozenStateChangeCallback(@NonNull IFrozenStateChangeCallback callback) {
    @FlaggedApi(Flags.FLAG_BINDER_FROZEN_STATE_CHANGE_CALLBACK)
    default boolean removeFrozenStateChangeCallback(@NonNull FrozenStateChangeCallback callback) {
        throw new UnsupportedOperationException();
    }
}
+8 −0
Original line number Diff line number Diff line
@@ -168,6 +168,14 @@ flag {
    bug: "317250784"
}

flag {
    name: "binder_frozen_state_change_callback"
    is_exported: true
    namespace: "system_performance"
    description: "Guards the frozen state change callback API."
    bug: "361157077"
}

flag {
    name: "message_queue_tail_tracking"
    namespace: "system_performance"
+3 −3
Original line number Diff line number Diff line
@@ -1747,9 +1747,9 @@ static const JNINativeMethod gBinderProxyMethods[] = {
    {"linkToDeathNative",   "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath},
    {"unlinkToDeathNative", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath},
    {"addFrozenStateChangeCallbackNative",
        "(Landroid/os/IBinder$IFrozenStateChangeCallback;)V", (void*)android_os_BinderProxy_addFrozenStateChangeCallback},
        "(Landroid/os/IBinder$FrozenStateChangeCallback;)V", (void*)android_os_BinderProxy_addFrozenStateChangeCallback},
    {"removeFrozenStateChangeCallbackNative",
        "(Landroid/os/IBinder$IFrozenStateChangeCallback;)Z", (void*)android_os_BinderProxy_removeFrozenStateChangeCallback},
        "(Landroid/os/IBinder$FrozenStateChangeCallback;)Z", (void*)android_os_BinderProxy_removeFrozenStateChangeCallback},
    {"getNativeFinalizer",  "()J", (void*)android_os_BinderProxy_getNativeFinalizer},
    {"getExtension",        "()Landroid/os/IBinder;", (void*)android_os_BinderProxy_getExtension},
};
@@ -1774,7 +1774,7 @@ static int int_register_android_os_BinderProxy(JNIEnv* env)
                                   "(Landroid/os/IBinder$DeathRecipient;Landroid/os/IBinder;)V");
    gBinderProxyOffsets.mInvokeFrozenStateChangeCallback =
            GetStaticMethodIDOrDie(env, clazz, "invokeFrozenStateChangeCallback",
                                   "(Landroid/os/IBinder$IFrozenStateChangeCallback;Landroid/os/"
                                   "(Landroid/os/IBinder$FrozenStateChangeCallback;Landroid/os/"
                                   "IBinder;I)V");
    gBinderProxyOffsets.mNativeData = GetFieldIDOrDie(env, clazz, "mNativeData", "J");

Loading