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

Commit c266e060 authored by Android Build Coastguard Worker's avatar Android Build Coastguard Worker
Browse files

Snap for 11449429 from 9a6cf3aa to 24Q2-release

Change-Id: Id29390c29511d44f51638a252283eaf919c0cdaf
parents 7e820f3b 9a6cf3aa
Loading
Loading
Loading
Loading
+25 −43
Original line number Diff line number Diff line
@@ -47,9 +47,8 @@ import java.util.concurrent.atomic.AtomicInteger;
 * In both cases the {@link ObexServerSockets} object have terminated, and a new must be created.
 */
public class ObexServerSockets {
    private final String mTag;
    private static final String STAG = "ObexServerSockets";
    private static final boolean D = true; // TODO: set to false!
    private static final String TAG = "ObexServerSockets";
    private static final boolean D = true; // TODO: set this to false!

    private final IObexConnectionHandler mConHandler;
    /* The wrapped sockets */
@@ -66,7 +65,6 @@ public class ObexServerSockets {
        mConHandler = conHandler;
        mRfcommSocket = rfcommSocket;
        mL2capSocket = l2capSocket;
        mTag = "ObexServerSockets" + sInstanceCounter.getAndIncrement();
    }

    /**
@@ -113,7 +111,7 @@ public class ObexServerSockets {
    private static ObexServerSockets create(IObexConnectionHandler validator, int rfcommChannel,
            int l2capPsm, boolean isSecure) {
        if (D) {
            Log.d(STAG, "create(rfcomm = " + rfcommChannel + ", l2capPsm = " + l2capPsm + ")");
            Log.d(TAG, "create(rfcomm = " + rfcommChannel + ", l2capPsm = " + l2capPsm + ")");
        }
        BluetoothAdapter bt = BluetoothAdapter.getDefaultAdapter();
        if (bt == null) {
@@ -142,10 +140,10 @@ public class ObexServerSockets {
                    }
                }
            } catch (IOException e) {
                Log.e(STAG, "Error create ServerSockets ", e);
                Log.e(TAG, "Error create ServerSockets ", e);
                initSocketOK = false;
            } catch (SecurityException e) {
                Log.e(STAG, "Error create ServerSockets ", e);
                Log.e(TAG, "Error create ServerSockets ", e);
                initSocketOK = false;
                break;
            }
@@ -154,16 +152,16 @@ public class ObexServerSockets {
                int state = bt.getState();
                if ((state != BluetoothAdapter.STATE_TURNING_ON) && (state
                        != BluetoothAdapter.STATE_ON)) {
                    Log.w(STAG, "initServerSockets failed as BT is (being) turned off");
                    Log.w(TAG, "initServerSockets failed as BT is (being) turned off");
                    break;
                }
                try {
                    if (D) {
                        Log.v(STAG, "waiting 300 ms...");
                        Log.v(TAG, "waiting 300 ms...");
                    }
                    Thread.sleep(300);
                } catch (InterruptedException e) {
                    Log.e(STAG, "create() was interrupted");
                    Log.e(TAG, "create() was interrupted");
                }
            } else {
                break;
@@ -172,13 +170,13 @@ public class ObexServerSockets {

        if (initSocketOK) {
            if (D) {
                Log.d(STAG, "Succeed to create listening sockets ");
                Log.d(TAG, "Succeed to create listening sockets ");
            }
            ObexServerSockets sockets = new ObexServerSockets(validator, rfcommSocket, l2capSocket);
            sockets.startAccept();
            return sockets;
        } else {
            Log.e(STAG, "Error to create listening socket after " + CREATE_RETRY_TIME + " try");
            Log.e(TAG, "Error to create listening socket after " + CREATE_RETRY_TIME + " try");
            return null;
        }
    }
@@ -207,9 +205,7 @@ public class ObexServerSockets {
     * the {@link IObexConnectionValidator#onConnect()}, at which point both threads will exit.
     */
    private void startAccept() {
        if (D) {
            Log.d(mTag, "startAccept()");
        }
        Log.d(TAG, "startAccept()");

        mRfcommThread = new SocketAcceptThread(mRfcommSocket);
        mRfcommThread.start();
@@ -225,9 +221,7 @@ public class ObexServerSockets {
     * @return true if the connection is accepted, false otherwise.
     */
    private synchronized boolean onConnect(BluetoothDevice device, BluetoothSocket conSocket) {
        if (D) {
            Log.d(mTag, "onConnect() socket: " + conSocket);
        }
        Log.d(TAG, "onConnect() socket: " + conSocket);
        return mConHandler.onConnect(device, conSocket);
    }

@@ -238,7 +232,7 @@ public class ObexServerSockets {
        shutdown(false);
        BluetoothAdapter mAdapter = BluetoothAdapter.getDefaultAdapter();
        if ((mAdapter != null) && (mAdapter.getState() == BluetoothAdapter.STATE_ON)) {
            Log.d(mTag, "onAcceptFailed() calling shutdown...");
            Log.d(TAG, "onAcceptFailed() calling shutdown...");
            mConHandler.onAcceptFailed();
        }
    }
@@ -249,9 +243,7 @@ public class ObexServerSockets {
     * has ended execution
     */
    public synchronized void shutdown(boolean block) {
        if (D) {
            Log.d(mTag, "shutdown(block = " + block + ")");
        }
        Log.d(TAG, "shutdown(block = " + block + ")");
        if (mRfcommThread != null) {
            mRfcommThread.shutdown();
        }
@@ -270,7 +262,7 @@ public class ObexServerSockets {
                        mL2capThread = null;
                    }
                } catch (InterruptedException e) {
                    Log.i(mTag, "shutdown() interrupted, continue waiting...", e);
                    Log.i(TAG, "shutdown() interrupted, continue waiting...", e);
                }
            }
        } else {
@@ -314,28 +306,24 @@ public class ObexServerSockets {
                    BluetoothDevice device;

                    try {
                        if (D) {
                            Log.d(mTag, "Accepting socket connection...");
                        }
                        Log.d(TAG, "Accepting socket connection...");

                        connSocket = mServerSocket.accept();
                        if (D) {
                            Log.d(mTag, "Accepted socket connection from: " + mServerSocket);
                        }
                        Log.d(TAG, "Accepted socket connection from: " + mServerSocket);

                        if (connSocket == null) {
                            // TODO: Do we need a max error count, to avoid spinning?
                            Log.w(mTag, "connSocket is null - reattempt accept");
                            Log.w(TAG, "connSocket is null - reattempt accept");
                            continue;
                        }
                        device = connSocket.getRemoteDevice();

                        if (device == null) {
                            Log.i(mTag, "getRemoteDevice() = null - reattempt accept");
                            Log.i(TAG, "getRemoteDevice() = null - reattempt accept");
                            try {
                                connSocket.close();
                            } catch (IOException e) {
                                Log.w(mTag, "Error closing the socket. ignoring...", e);
                                Log.w(TAG, "Error closing the socket. ignoring...", e);
                            }
                            continue;
                        }
@@ -348,7 +336,7 @@ public class ObexServerSockets {
                            /* Close connection if we already have a connection with another device
                             * by responding to the OBEX connect request.
                             */
                            Log.i(mTag, "RemoteDevice is invalid - creating ObexRejectServer.");
                            Log.i(TAG, "RemoteDevice is invalid - creating ObexRejectServer.");
                            BluetoothObexTransport obexTrans =
                                    new BluetoothObexTransport(connSocket);
                            // Create and detach a selfdestructing ServerSession to respond to any
@@ -364,16 +352,14 @@ public class ObexServerSockets {
                        if (mStopped) {
                            // Expected exception because of shutdown.
                        } else {
                            Log.w(mTag, "Accept exception for " + mServerSocket, ex);
                            Log.w(TAG, "Accept exception for " + mServerSocket, ex);
                            ObexServerSockets.this.onAcceptFailed();
                        }
                        mStopped = true;
                    }
                } // End while()
            } finally {
                if (D) {
                    Log.d(mTag, "AcceptThread ended for: " + mServerSocket);
                }
                Log.d(TAG, "AcceptThread ended for: " + mServerSocket);
            }
        }

@@ -391,18 +377,14 @@ public class ObexServerSockets {
                try {
                    mServerSocket.close();
                } catch (IOException e) {
                    if (D) {
                        Log.d(mTag, "Exception while thread shutdown:", e);
                    }
                    Log.w(TAG, "Exception while thread shutdown:", e);
                }
            }
            // If called from another thread, interrupt the thread
            if (!Thread.currentThread().equals(this)) {
                // TODO: Will this interrupt the thread if it is blocked in synchronized?
                // Else: change to use InterruptableLock
                if (D) {
                    Log.d(mTag, "shutdown called from another thread - interrupt().");
                }
                Log.d(TAG, "shutdown called from another thread - interrupt().");
                interrupt();
            }
        }
+17 −0
Original line number Diff line number Diff line
@@ -189,6 +189,23 @@ public final class Utils {
        return String.format("XX:XX:XX:XX:%02X:%02X", address[4], address[5]);
    }

    /**
     * Returns the correct device address to be used for connections over BR/EDR transport.
     *
     * @param device the device for which to obtain the connection address
     * @return either identity address or device address as a byte array
     */
    public static byte[] getByteBrEdrAddress(BluetoothDevice device) {
        final AdapterService service = AdapterService.getAdapterService();
        // If dual mode device bonded over BLE first, BR/EDR address will be identity address
        // Otherwise, BR/EDR address will be same address as in BluetoothDevice#getAddress
        byte[] address = service.getByteIdentityAddress(device);
        if (address == null) {
            address = getByteAddress(device);
        }
        return address;
    }

    public static byte[] getByteAddress(BluetoothDevice device) {
        return getBytesFromAddress(device.getAddress());
    }
+6 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.util.Log;

import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.flags.Flags;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;

@@ -173,8 +174,12 @@ public class A2dpNativeInterface {
        if (device == null) {
            return Utils.getBytesFromAddress("00:00:00:00:00:00");
        }
        if (Flags.identityAddressNullIfUnknown()) {
            return Utils.getByteBrEdrAddress(device);
        } else {
            return mAdapterService.getByteIdentityAddress(device);
        }
    }

    private void sendMessageToService(A2dpStackEvent event) {
        A2dpService service = A2dpService.getA2dpService();
+6 −1
Original line number Diff line number Diff line
@@ -21,6 +21,7 @@ import android.util.Log;

import com.android.bluetooth.Utils;
import com.android.bluetooth.btservice.AdapterService;
import com.android.bluetooth.flags.Flags;
import com.android.internal.annotations.GuardedBy;
import com.android.internal.annotations.VisibleForTesting;

@@ -85,8 +86,12 @@ public class A2dpSinkNativeInterface {
    }

    private byte[] getByteAddress(BluetoothDevice device) {
        if (Flags.identityAddressNullIfUnknown()) {
            return Utils.getByteBrEdrAddress(device);
        } else {
            return mAdapterService.getByteIdentityAddress(device);
        }
    }

    /**
     * Initiates an A2DP connection to a remote device.
+16 −23
Original line number Diff line number Diff line
@@ -31,12 +31,12 @@ import android.util.Log;
import com.android.bluetooth.btservice.AdapterService;
import com.android.internal.annotations.VisibleForTesting;

import java.util.HashSet;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

/**
 * Manages distnace measurement operations and interacts with Gabeldorsche stack.
 * Manages distance measurement operations and interacts with Gabeldorsche stack.
 *
 * @hide
 */
@@ -52,12 +52,10 @@ public class DistanceMeasurementManager {
    private final AdapterService mAdapterService;
    private HandlerThread mHandlerThread;
    DistanceMeasurementNativeInterface mDistanceMeasurementNativeInterface;
    private ConcurrentHashMap<String, HashSet<DistanceMeasurementTracker>> mRssiTrackers =
            new ConcurrentHashMap<>();
    private final ConcurrentHashMap<String, CopyOnWriteArraySet<DistanceMeasurementTracker>>
            mRssiTrackers = new ConcurrentHashMap<>();

    /**
     * Constructor of {@link DistanceMeasurementManager}.
     */
    /** Constructor of {@link DistanceMeasurementManager}. */
    DistanceMeasurementManager(AdapterService adapterService) {
        mAdapterService = adapterService;

@@ -111,14 +109,13 @@ public class DistanceMeasurementManager {
    }

    private synchronized void startRssiTracker(DistanceMeasurementTracker tracker) {
        mRssiTrackers.putIfAbsent(tracker.mIdentityAddress,
                new HashSet<DistanceMeasurementTracker>());
        HashSet<DistanceMeasurementTracker> set = mRssiTrackers.get(tracker.mIdentityAddress);
        if (set.contains(tracker)) {
        mRssiTrackers.putIfAbsent(tracker.mIdentityAddress, new CopyOnWriteArraySet<>());
        CopyOnWriteArraySet<DistanceMeasurementTracker> set =
                mRssiTrackers.get(tracker.mIdentityAddress);
        if (!set.add(tracker)) {
            Log.w(TAG, "Already registered");
            return;
        }
        set.add(tracker);
        mDistanceMeasurementNativeInterface.startDistanceMeasurement(tracker.mIdentityAddress,
                tracker.mFrequency, DistanceMeasurementMethod.DISTANCE_MEASUREMENT_METHOD_RSSI);
    }
@@ -151,7 +148,7 @@ public class DistanceMeasurementManager {

    private synchronized int stopRssiTracker(UUID uuid, String identityAddress,
            boolean timeout) {
        HashSet<DistanceMeasurementTracker> set = mRssiTrackers.get(identityAddress);
        CopyOnWriteArraySet<DistanceMeasurementTracker> set = mRssiTrackers.get(identityAddress);
        if (set == null) {
            Log.w(TAG, "Can't find rssi tracker");
            return BluetoothStatusCodes.ERROR_DISTANCE_MEASUREMENT_INTERNAL;
@@ -231,7 +228,7 @@ public class DistanceMeasurementManager {
    }

    void handleRssiStarted(String address) {
        HashSet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        CopyOnWriteArraySet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        if (set == null) {
            Log.w(TAG, "Can't find rssi tracker");
            return;
@@ -262,7 +259,7 @@ public class DistanceMeasurementManager {
    }

    void handleRssiStartFail(String address, int reason) {
        HashSet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        CopyOnWriteArraySet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        if (set == null) {
            Log.w(TAG, "Can't find rssi tracker");
            return;
@@ -272,10 +269,8 @@ public class DistanceMeasurementManager {
                invokeStartFail(tracker.mCallback, tracker.mDevice, reason);
            }
        }
        synchronized (set) {
        set.removeIf(tracker -> !tracker.mStarted);
    }
    }

    void onDistanceMeasurementStopped(String address, int reason, int method) {
        logd("onDistanceMeasurementStopped address:" + BluetoothUtils.toAnonymizedAddress(address)
@@ -290,7 +285,7 @@ public class DistanceMeasurementManager {
    }

    void handleRssiStopped(String address, int reason) {
        HashSet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        CopyOnWriteArraySet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        if (set == null) {
            Log.w(TAG, "Can't find rssi tracker");
            return;
@@ -301,10 +296,8 @@ public class DistanceMeasurementManager {
                invokeOnStopped(tracker.mCallback, tracker.mDevice, reason);
            }
        }
        synchronized (set) {
        set.removeIf(tracker -> tracker.mStarted);
    }
    }

    void onDistanceMeasurementResult(String address, int centimeter, int errorCentimeter,
            int azimuthAngle, int errorAzimuthAngle, int altitudeAngle, int errorAltitudeAngle,
@@ -323,7 +316,7 @@ public class DistanceMeasurementManager {
    }

    void handleRssiResult(String address, DistanceMeasurementResult result) {
        HashSet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        CopyOnWriteArraySet<DistanceMeasurementTracker> set = mRssiTrackers.get(address);
        if (set == null) {
            Log.w(TAG, "Can't find rssi tracker");
            return;
Loading