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

Commit d56b3c95 authored by Matthew Xie's avatar Matthew Xie Committed by Android (Google) Code Review
Browse files

Merge "Move Bluetooth remove service record handler to the app main thread"

parents f0eb7655 484867a8
Loading
Loading
Loading
Loading
+19 −12
Original line number Diff line number Diff line
@@ -22,6 +22,7 @@ import android.content.Context;
import android.os.Binder;
import android.os.Handler;
import android.os.IBinder;
import android.os.Looper;
import android.os.Message;
import android.os.ParcelUuid;
import android.os.RemoteException;
@@ -348,6 +349,8 @@ public final class BluetoothAdapter {

    private final IBluetooth mService;

    private Handler mServiceRecordHandler;

    /**
     * Get a handle to the default local Bluetooth adapter.
     * <p>Currently Android only supports one Bluetooth adapter, but the API
@@ -376,6 +379,7 @@ public final class BluetoothAdapter {
            throw new IllegalArgumentException("service is null");
        }
        mService = service;
        mServiceRecordHandler = null;
    }

    /**
@@ -1011,7 +1015,21 @@ public final class BluetoothAdapter {
            } catch (IOException e) {}
            throw new IOException("Not able to register SDP record for " + name);
        }
        socket.setCloseHandler(mHandler, handle);

        if (mServiceRecordHandler == null) {
            mServiceRecordHandler = new Handler(Looper.getMainLooper()) {
                    public void handleMessage(Message msg) {
                        /* handle socket closing */
                        int handle = msg.what;
                        try {
                            if (DBG) Log.d(TAG, "Removing service record " +
                                           Integer.toHexString(handle));
                            mService.removeServiceRecord(handle);
                        } catch (RemoteException e) {Log.e(TAG, "", e);}
                    }
                };
        }
        socket.setCloseHandler(mServiceRecordHandler, handle);
        return socket;
    }

@@ -1243,17 +1261,6 @@ public final class BluetoothAdapter {
        return Collections.unmodifiableSet(devices);
    }

    private Handler mHandler = new Handler() {
        public void handleMessage(Message msg) {
            /* handle socket closing */
            int handle = msg.what;
            try {
                if (DBG) Log.d(TAG, "Removing service record " + Integer.toHexString(handle));
                mService.removeServiceRecord(handle);
            } catch (RemoteException e) {Log.e(TAG, "", e);}
        }
    };

    /**
     * Validate a Bluetooth address, such as "00:43:A8:23:10:F0"
     * <p>Alphabetic characters must be uppercase to be valid.
+8 −1
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ public class BluetoothService extends IBluetooth.Stub {

    private static final int MESSAGE_UUID_INTENT = 1;
    private static final int MESSAGE_AUTO_PAIRING_FAILURE_ATTEMPT_DELAY = 2;
    private static final int MESSAGE_REMOVE_SERVICE_RECORD = 3;

    private static final int RFCOMM_RECORD_REAPER = 10;
    private static final int STATE_CHANGE_REAPER = 11;
@@ -537,6 +538,10 @@ public class BluetoothService extends IBluetooth.Stub {
                }
                if (attempt > 0) mBondState.clearPinAttempts(address);
                break;
            case MESSAGE_REMOVE_SERVICE_RECORD:
                Pair<Integer, Integer> pair = (Pair<Integer, Integer>) msg.obj;
                checkAndRemoveRecord(pair.first, pair.second);
                break;
            }
        }
    };
@@ -1542,7 +1547,9 @@ public class BluetoothService extends IBluetooth.Stub {
    public void removeServiceRecord(int handle) {
        mContext.enforceCallingOrSelfPermission(BLUETOOTH_PERM,
                                                "Need BLUETOOTH permission");
        checkAndRemoveRecord(handle, Binder.getCallingPid());
        Message message = mHandler.obtainMessage(MESSAGE_REMOVE_SERVICE_RECORD);
        message.obj = new Pair<Integer, Integer>(handle, Binder.getCallingPid());
        mHandler.sendMessage(message);
    }

    private synchronized void checkAndRemoveRecord(int handle, int pid) {