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

Commit 9476c7d7 authored by SongFerng Wang's avatar SongFerng Wang Committed by Android (Google) Code Review
Browse files

Merge "The switchMemberDeviceContent does not transmit the profile" into udc-dev

parents 687b7e22 e8e53500
Loading
Loading
Loading
Loading
+1 −27
Original line number Diff line number Diff line
@@ -940,6 +940,7 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
                + getName()
                + ", groupId="
                + mGroupId
                + ", member= " + mMemberDevices
                + ")";
    }

@@ -1493,33 +1494,6 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
        mMemberDevices.remove(memberDevice);
    }

    /**
     * In order to show the preference for the whole group, we always set the main device as the
     * first connected device in the coordinated set, and then switch the content of the main
     * device and member devices.
     *
     * @param newMainDevice the new Main device which is from the previous main device's member
     *                      list.
     */
    public void switchMemberDeviceContent(CachedBluetoothDevice newMainDevice) {
        // Backup from main device
        final BluetoothDevice tmpDevice = mDevice;
        final short tmpRssi = mRssi;
        final boolean tmpJustDiscovered = mJustDiscovered;
        // Set main device from sub device
        release();
        mDevice = newMainDevice.mDevice;
        mRssi = newMainDevice.mRssi;
        mJustDiscovered = newMainDevice.mJustDiscovered;

        // Set sub device from backup
        newMainDevice.release();
        newMainDevice.mDevice = tmpDevice;
        newMainDevice.mRssi = tmpRssi;
        newMainDevice.mJustDiscovered = tmpJustDiscovered;
        fetchActiveDevices();
    }

    /**
     * Get cached bluetooth icon with description
     */
+53 −0
Original line number Diff line number Diff line
@@ -464,6 +464,59 @@ public class CachedBluetoothDeviceManager {
        return !(mOngoingSetMemberPair == null) && mOngoingSetMemberPair.equals(device);
    }

    /**
     * In order to show the preference for the whole group, we always set the main device as the
     * first connected device in the coordinated set, and then switch the relationship of the main
     * device and member devices.
     *
     * @param newMainDevice the new Main device which is from the previous main device's member
     *                      list.
     */
    public void switchRelationshipFromMemberToMain(CachedBluetoothDevice newMainDevice) {
        if (newMainDevice == null) {
            log("switchRelationshipFromMemberToMain: input is null");
            return;
        }
        log("switchRelationshipFromMemberToMain: CachedBluetoothDevice list: " + mCachedDevices);

        final CachedBluetoothDevice finalNewMainDevice = newMainDevice;
        int newMainGroupId = newMainDevice.getGroupId();
        CachedBluetoothDevice oldMainDevice = mCachedDevices.stream()
                .filter(cachedDevice -> !cachedDevice.equals(finalNewMainDevice)
                        && cachedDevice.getGroupId() == newMainGroupId).findFirst().orElse(null);
        boolean hasMainDevice = oldMainDevice != null;
        Set<CachedBluetoothDevice> memberSet =
                hasMainDevice ? oldMainDevice.getMemberDevice() : null;
        boolean isMemberDevice = memberSet != null && memberSet.contains(newMainDevice);
        if (!hasMainDevice || !isMemberDevice) {
            log("switchRelationshipFromMemberToMain: "
                    + newMainDevice.getDevice().getAnonymizedAddress()
                    + " is not the member device.");
            return;
        }

        mCachedDevices.remove(oldMainDevice);
        // When both LE Audio devices are disconnected, receiving member device
        // connection. To switch content and dispatch to notify UI change
        mBtManager.getEventManager().dispatchDeviceRemoved(oldMainDevice);

        for (CachedBluetoothDevice memberDeviceItem : memberSet) {
            if (memberDeviceItem.equals(newMainDevice)) {
                continue;
            }
            newMainDevice.addMemberDevice(memberDeviceItem);
        }
        memberSet.clear();
        newMainDevice.addMemberDevice(oldMainDevice);

        mCachedDevices.add(newMainDevice);
        // It is necessary to do remove and add for updating the mapping on
        // preference and device
        mBtManager.getEventManager().dispatchDeviceAdded(newMainDevice);
        log("switchRelationshipFromMemberToMain: After change, CachedBluetoothDevice list: "
                + mCachedDevices);
    }

    private void log(String msg) {
        if (DEBUG) {
            Log.d(TAG, msg);
+8 −16
Original line number Diff line number Diff line
@@ -238,14 +238,10 @@ public class CsipDeviceManager {
                        mainDevice.refresh();
                        return true;
                    } else {
                        // When both LE Audio devices are disconnected, receiving member device
                        // connection. To switch content and dispatch to notify UI change
                        mBtManager.getEventManager().dispatchDeviceRemoved(mainDevice);
                        mainDevice.switchMemberDeviceContent(cachedDevice);
                        mainDevice.refresh();
                        // It is necessary to do remove and add for updating the mapping on
                        // preference and device
                        mBtManager.getEventManager().dispatchDeviceAdded(mainDevice);
                        final CachedBluetoothDeviceManager deviceManager =
                                mBtManager.getCachedDeviceManager();
                        deviceManager.switchRelationshipFromMemberToMain(cachedDevice);
                        cachedDevice.refresh();
                        return true;
                    }
                }
@@ -266,14 +262,10 @@ public class CsipDeviceManager {
                for (CachedBluetoothDevice device: memberSet) {
                    if (device.isConnected()) {
                        log("set device: " + device + " as the main device");
                        // Main device is disconnected and sub device is connected
                        // To copy data from sub device to main device
                        mBtManager.getEventManager().dispatchDeviceRemoved(cachedDevice);
                        cachedDevice.switchMemberDeviceContent(device);
                        cachedDevice.refresh();
                        // It is necessary to do remove and add for updating the mapping on
                        // preference and device
                        mBtManager.getEventManager().dispatchDeviceAdded(cachedDevice);
                        final CachedBluetoothDeviceManager deviceManager =
                                mBtManager.getCachedDeviceManager();
                        deviceManager.switchRelationshipFromMemberToMain(device);
                        device.refresh();
                        return true;
                    }
                }
+83 −0
Original line number Diff line number Diff line
@@ -604,4 +604,87 @@ public class CachedBluetoothDeviceManagerTest {
        verify(mDevice2).setPhonebookAccessPermission(BluetoothDevice.ACCESS_ALLOWED);
        verify(mDevice2).createBond(BluetoothDevice.TRANSPORT_LE);
    }

    @Test
    public void switchRelationshipFromMemberToMain_switchesMainDevice_switchesSuccessful() {
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
        doReturn(CAP_GROUP2).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
        assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isFalse();
        assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isTrue();
        assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();

        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2);

        assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue();
        assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse();
        assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isFalse();
        assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue();
    }

    @Test
    public void switchRelationshipFromMemberToMain_moreMembersCase_switchesSuccessful() {
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();

        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2);

        assertThat(mCachedDeviceManager.isSubDevice(mDevice1)).isTrue();
        assertThat(mCachedDeviceManager.isSubDevice(mDevice2)).isFalse();
        assertThat(mCachedDeviceManager.isSubDevice(mDevice3)).isTrue();
        assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice1)).isTrue();
        assertThat(cachedDevice2.getMemberDevice().contains(cachedDevice3)).isTrue();
    }

    @Test
    public void switchRelationshipFromMemberToMain_inputDeviceIsMainDevice_doesNotChangelist() {
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
        Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();

        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice1);

        devices = mCachedDeviceManager.getCachedDevicesCopy();
        assertThat(devices).contains(cachedDevice1);
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isTrue();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
    }

    @Test
    public void switchRelationshipFromMemberToMain_inputDeviceNotInMemberList_doesNotChangelist() {
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice1);
        CachedBluetoothDevice cachedDevice1 = mCachedDeviceManager.addDevice(mDevice1);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice2);
        doReturn(CAP_GROUP1).when(mCsipSetCoordinatorProfile).getGroupUuidMapByDevice(mDevice3);
        CachedBluetoothDevice cachedDevice2 = mCachedDeviceManager.addDevice(mDevice2);
        cachedDevice1.getMemberDevice().remove(cachedDevice2);
        CachedBluetoothDevice cachedDevice3 = mCachedDeviceManager.addDevice(mDevice3);
        Collection<CachedBluetoothDevice> devices = mCachedDeviceManager.getCachedDevicesCopy();

        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();

        mCachedDeviceManager.switchRelationshipFromMemberToMain(cachedDevice2);

        devices = mCachedDeviceManager.getCachedDevicesCopy();
        assertThat(devices).contains(cachedDevice1);
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice2)).isFalse();
        assertThat(cachedDevice1.getMemberDevice().contains(cachedDevice3)).isTrue();
    }
}
+0 −19
Original line number Diff line number Diff line
@@ -1137,25 +1137,6 @@ public class CachedBluetoothDeviceTest {
        assertThat(mCachedDevice.mDrawableCache.size()).isEqualTo(0);
    }

    @Test
    public void switchMemberDeviceContent_switchMainDevice_switchesSuccessful() {
        mCachedDevice.mRssi = RSSI_1;
        mCachedDevice.mJustDiscovered = JUSTDISCOVERED_1;
        mSubCachedDevice.mRssi = RSSI_2;
        mSubCachedDevice.mJustDiscovered = JUSTDISCOVERED_2;
        mCachedDevice.addMemberDevice(mSubCachedDevice);

        mCachedDevice.switchMemberDeviceContent(mSubCachedDevice);

        assertThat(mCachedDevice.mRssi).isEqualTo(RSSI_2);
        assertThat(mCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_2);
        assertThat(mCachedDevice.mDevice).isEqualTo(mSubDevice);
        assertThat(mSubCachedDevice.mRssi).isEqualTo(RSSI_1);
        assertThat(mSubCachedDevice.mJustDiscovered).isEqualTo(JUSTDISCOVERED_1);
        assertThat(mSubCachedDevice.mDevice).isEqualTo(mDevice);
        assertThat(mCachedDevice.getMemberDevice().contains(mSubCachedDevice)).isTrue();
    }

    @Test
    public void isConnectedHearingAidDevice_isConnectedAshaHearingAidDevice_returnTrue() {
        when(mProfileManager.getHearingAidProfile()).thenReturn(mHearingAidProfile);