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

Commit d27a3fac authored by Hai Zhang's avatar Hai Zhang Committed by Automerger Merge Worker
Browse files

Merge "Fix com.android.server.wm.TaskFpsCallbackController#unregisterListener...

Merge "Fix com.android.server.wm.TaskFpsCallbackController#unregisterListener method NEVER works" am: 4b755813 am: d18d95e0 am: f492f15c am: de4c4363

Original change: https://android-review.googlesource.com/c/platform/frameworks/base/+/2191395



Change-Id: Ib91a5da18050a009c62c6b25af6acb052739ee88
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents ab1217ce de4c4363
Loading
Loading
Loading
Loading
+21 −11
Original line number Diff line number Diff line
@@ -26,8 +26,8 @@ import java.util.HashMap;
final class TaskFpsCallbackController {

    private final Context mContext;
    private final HashMap<ITaskFpsCallback, Long> mTaskFpsCallbacks;
    private final HashMap<ITaskFpsCallback, IBinder.DeathRecipient> mDeathRecipients;
    private final HashMap<IBinder, Long> mTaskFpsCallbacks;
    private final HashMap<IBinder, IBinder.DeathRecipient> mDeathRecipients;

    TaskFpsCallbackController(Context context) {
        mContext = context;
@@ -36,32 +36,42 @@ final class TaskFpsCallbackController {
    }

    void registerListener(int taskId, ITaskFpsCallback callback) {
        if (mTaskFpsCallbacks.containsKey(callback)) {
        if (callback == null) {
            return;
        }

        IBinder binder = callback.asBinder();
        if (mTaskFpsCallbacks.containsKey(binder)) {
            return;
        }

        final long nativeListener = nativeRegister(callback, taskId);
        mTaskFpsCallbacks.put(callback, nativeListener);
        mTaskFpsCallbacks.put(binder, nativeListener);

        final IBinder.DeathRecipient deathRecipient = () -> unregisterListener(callback);
        try {
            callback.asBinder().linkToDeath(deathRecipient, 0);
            mDeathRecipients.put(callback, deathRecipient);
            binder.linkToDeath(deathRecipient, 0);
            mDeathRecipients.put(binder, deathRecipient);
        } catch (RemoteException e) {
            // ignore
        }
    }

    void unregisterListener(ITaskFpsCallback callback) {
        if (!mTaskFpsCallbacks.containsKey(callback)) {
        if (callback == null) {
            return;
        }

        IBinder binder = callback.asBinder();
        if (!mTaskFpsCallbacks.containsKey(binder)) {
            return;
        }

        callback.asBinder().unlinkToDeath(mDeathRecipients.get(callback), 0);
        mDeathRecipients.remove(callback);
        binder.unlinkToDeath(mDeathRecipients.get(binder), 0);
        mDeathRecipients.remove(binder);

        nativeUnregister(mTaskFpsCallbacks.get(callback));
        mTaskFpsCallbacks.remove(callback);
        nativeUnregister(mTaskFpsCallbacks.get(binder));
        mTaskFpsCallbacks.remove(binder);
    }

    private static native long nativeRegister(ITaskFpsCallback callback, int taskId);