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

Commit db1b748f authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Wait for state callback before ending constructor" into main am: 18bc36f7 am: 9fc6b957

parents deced079 9fc6b957
Loading
Loading
Loading
Loading
+33 −0
Original line number Original line Diff line number Diff line
@@ -96,8 +96,12 @@ import java.util.Map;
import java.util.Set;
import java.util.Set;
import java.util.UUID;
import java.util.UUID;
import java.util.WeakHashMap;
import java.util.WeakHashMap;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Executor;
import java.util.concurrent.Executor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.TimeoutException;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
import java.util.function.BiFunction;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Consumer;
@@ -873,6 +877,7 @@ public final class BluetoothAdapter {
    @GuardedBy("mServiceLock")
    @GuardedBy("mServiceLock")
    private IBluetooth mService;
    private IBluetooth mService;


    private static CompletableFuture<Void> sAdapterStateFuture = null;
    private static int sAdapterState = BluetoothAdapter.STATE_OFF;
    private static int sAdapterState = BluetoothAdapter.STATE_OFF;


    private final ReentrantReadWriteLock mServiceLock = new ReentrantReadWriteLock();
    private final ReentrantReadWriteLock mServiceLock = new ReentrantReadWriteLock();
@@ -1173,6 +1178,20 @@ public final class BluetoothAdapter {
                new CallbackWrapper(
                new CallbackWrapper(
                        registerBluetoothConnectionCallbackConsumer,
                        registerBluetoothConnectionCallbackConsumer,
                        unregisterBluetoothConnectionCallbackConsumer);
                        unregisterBluetoothConnectionCallbackConsumer);

        if (!Flags.broadcastAdapterStateWithCallback()) {
            return;
        }
        // Make sure that we are waiting on the state callback prior to returning from constructor
        CompletableFuture<Void> futureState = sAdapterStateFuture;
        if (futureState != null) {
            try {
                futureState.get(1_000, TimeUnit.MILLISECONDS);
            } catch (InterruptedException | ExecutionException | TimeoutException e) {
                Log.e(TAG, e.toString() + "\n" + Log.getStackTraceString(new Throwable()));
            }
        }
        Log.i(TAG, "Adapter created with state: " + nameForState(sAdapterState));
    }
    }


    /**
    /**
@@ -3784,6 +3803,12 @@ public final class BluetoothAdapter {


                @RequiresNoPermission
                @RequiresNoPermission
                public void onBluetoothAdapterStateChange(int newState) {
                public void onBluetoothAdapterStateChange(int newState) {
                    Log.v(TAG, "onBluetoothAdapterStateChange(" + nameForState(newState) + ")");
                    CompletableFuture<Void> future = sAdapterStateFuture;
                    sAdapterStateFuture = null;
                    if (future != null) {
                        future.complete(null);
                    }
                    sAdapterState = newState;
                    sAdapterState = newState;
                }
                }
            };
            };
@@ -4218,6 +4243,11 @@ public final class BluetoothAdapter {
            return;
            return;
        }
        }
        if (wantRegistered) {
        if (wantRegistered) {
            if (Flags.broadcastAdapterStateWithCallback()
                    && sAdapterState == BluetoothAdapter.STATE_OFF
                    && sAdapterStateFuture == null) {
                sAdapterStateFuture = new CompletableFuture<>();
            }
            try {
            try {
                sService =
                sService =
                        IBluetooth.Stub.asInterface(
                        IBluetooth.Stub.asInterface(
@@ -4232,6 +4262,9 @@ public final class BluetoothAdapter {
            } catch (RemoteException e) {
            } catch (RemoteException e) {
                throw e.rethrowAsRuntimeException();
                throw e.rethrowAsRuntimeException();
            }
            }
            if (Flags.broadcastAdapterStateWithCallback()) {
                sAdapterState = BluetoothAdapter.STATE_OFF;
            }
        }
        }
        sServiceRegistered = wantRegistered;
        sServiceRegistered = wantRegistered;
    }
    }