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

Commit a7d4e1d2 authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "[Companion] Synchronize state access in CallbackProxy"

parents 13fe27bf 08727b02
Loading
Loading
Loading
Loading
+32 −23
Original line number Diff line number Diff line
@@ -37,6 +37,7 @@ import android.util.Log;

import java.util.Collections;
import java.util.List;
import java.util.function.BiConsumer;

/**
 * System level service for managing companion devices
@@ -271,6 +272,8 @@ public final class CompanionDeviceManager {
        private Handler mHandler;
        private AssociationRequest mRequest;

        final Object mLock = new Object();

        private CallbackProxy(AssociationRequest request, Callback callback, Handler handler) {
            mCallback = callback;
            mHandler = handler;
@@ -280,28 +283,33 @@ public final class CompanionDeviceManager {

        @Override
        public void onSuccess(PendingIntent launcher) {
            Handler handler = mHandler;
            if (handler == null) return;
            handler.post(() -> {
                Callback callback = mCallback;
                if (callback == null) return;
                callback.onDeviceFound(launcher.getIntentSender());
            });
            lockAndPost(Callback::onDeviceFound, launcher.getIntentSender());
        }

        @Override
        public void onFailure(CharSequence reason) {
            Handler handler = mHandler;
            if (handler == null) return;
            handler.post(() -> {
                Callback callback = mCallback;
                if (callback == null) return;
                callback.onFailure(reason);
            lockAndPost(Callback::onFailure, reason);
        }

        <T> void lockAndPost(BiConsumer<Callback, T> action, T payload) {
            synchronized (mLock) {
                if (mHandler != null) {
                    mHandler.post(() -> {
                        Callback callback = null;
                        synchronized (mLock) {
                            callback = mCallback;
                        }
                        if (callback != null) {
                            action.accept(callback, payload);
                        }
                    });
                }
            }
        }

        @Override
        public void onActivityDestroyed(Activity activity) {
            synchronized (mLock) {
                if (activity != getActivity()) return;
                try {
                    mService.stopScan(mRequest, this, getCallingPackage());
@@ -313,6 +321,7 @@ public final class CompanionDeviceManager {
                mHandler = null;
                mRequest = null;
            }
        }

        @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) {}
        @Override public void onActivityStarted(Activity activity) {}