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

Commit a5e5061b authored by Arthur Hsu's avatar Arthur Hsu
Browse files

Prevent sending broadcasts for non-changing properties.

This CL prevent sending broadcast for bluetooth device in case property
actually was not changed. This behaviour may depend on bluetooth layer
implementation details however it is good to have such guard here.

Original CL: ag/2955737

Bug: 66917724
Test: Build ok
Change-Id: Iaf553412ed0bf00fba4ac23bfcb82231379694cb
parent 86ddcab0
Loading
Loading
Loading
Loading
+49 −2
Original line number Diff line number Diff line
@@ -39,8 +39,10 @@ import com.android.bluetooth.hfp.HeadsetHalConstants;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Set;

final class RemoteDevices {
    private static final boolean DBG = false;
@@ -455,6 +457,32 @@ final class RemoteDevices {
        sAdapterService.sendBroadcast(intent, AdapterService.BLUETOOTH_PERM);
    }

    private static boolean areUuidsEqual(ParcelUuid[] uuids1, ParcelUuid[] uuids2) {
        final int length1 = uuids1 == null ? 0 : uuids1.length;
        final int length2 = uuids2 == null ? 0 : uuids2.length;
        if (length1 != length2) {
            return false;
        }
        Set<ParcelUuid> set = new HashSet<>();
        for (int i = 0; i < length1; ++i) {
            set.add(uuids1[i]);
        }
        for (int i = 0; i < length2; ++i) {
            set.remove(uuids2[i]);
        }
        return set.isEmpty();
    }

    private static boolean areStringsEqual(String string1, String string2) {
        if (string1 == null && string2 == null) {
            return true;
        }
        if (string1 == null || string2 == null) {
            return false;
        }
        return string1.equals(string2);
    }

    void devicePropertyChangedCallback(byte[] address, int[] types, byte[][] values) {
        Intent intent;
        byte[] val;
@@ -482,7 +510,12 @@ final class RemoteDevices {
                    debugLog("Property type: " + type);
                    switch (type) {
                        case AbstractionLayer.BT_PROPERTY_BDNAME:
                            device.mName = new String(val);
                            final String newName = new String(val);
                            if (areStringsEqual(newName, device.mName)) {
                                if (DBG) Log.d(TAG, "Skip name update for " + bdDevice);
                                break;
                            }
                            device.mName = newName;
                            intent = new Intent(BluetoothDevice.ACTION_NAME_CHANGED);
                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, bdDevice);
                            intent.putExtra(BluetoothDevice.EXTRA_NAME, device.mName);
@@ -502,6 +535,11 @@ final class RemoteDevices {
                            debugLog("Remote Address is:" + Utils.getAddressStringFromByte(val));
                            break;
                        case AbstractionLayer.BT_PROPERTY_CLASS_OF_DEVICE:
                            final int newClass = Utils.byteArrayToInt(val);
                            if (newClass == device.mBluetoothClass) {
                                if (DBG) Log.d(TAG, "Skip class update for " + bdDevice);
                                break;
                            }
                            device.mBluetoothClass = Utils.byteArrayToInt(val);
                            intent = new Intent(BluetoothDevice.ACTION_CLASS_CHANGED);
                            intent.putExtra(BluetoothDevice.EXTRA_DEVICE, bdDevice);
@@ -513,7 +551,16 @@ final class RemoteDevices {
                            break;
                        case AbstractionLayer.BT_PROPERTY_UUIDS:
                            int numUuids = val.length / AbstractionLayer.BT_UUID_SIZE;
                            device.mUuids = Utils.byteArrayToUuid(val);
                            final ParcelUuid[] newUuids = device.mUuids =
                                    Utils.byteArrayToUuid(val);
                            if (areUuidsEqual(newUuids, device.mUuids)) {
                                if (DBG) {
                                    Log.d(TAG, "Skip uuids update for "
                                            + bdDevice.getAddress());
                                }
                                break;
                            }
                            device.mUuids = newUuids;
                            if (sAdapterService.getState() == BluetoothAdapter.STATE_ON) {
                                sendUuidIntent(bdDevice);
                            }