Merge "Logs hearing aid information when a hearing aid is bonded(connected)" into tm-qpr-dev

This commit is contained in:
Angela Wang
2022-09-17 01:00:19 +00:00
committed by Android (Google) Code Review
4 changed files with 151 additions and 0 deletions

View File

@@ -81,8 +81,10 @@ public class CachedBluetoothDevice implements Comparable<CachedBluetoothDevice>
private int mDeviceMode;
private long mHiSyncId;
private int mGroupId;
// Need this since there is no method for getting RSSI
short mRssi;
// mProfiles and mRemovedProfiles does not do swap() between main and sub device. It is
// because current sub device is only for HearingAid and its profile is the same.
private final Collection<LocalBluetoothProfile> mProfiles = new CopyOnWriteArrayList<>();

View File

@@ -0,0 +1,73 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settingslib.bluetooth;
import android.util.Log;
import com.android.internal.annotations.VisibleForTesting;
import com.android.internal.util.FrameworkStatsLog;
import java.util.HashMap;
/** Utils class to report hearing aid metrics to statsd */
public final class HearingAidStatsLogUtils {
private static final String TAG = "HearingAidStatsLogUtils";
private static final HashMap<String, Integer> sDeviceAddressToBondEntryMap = new HashMap<>();
/**
* Sets the mapping from hearing aid device to the bond entry where this device starts it's
* bonding(connecting) process.
*
* @param bondEntry The entry page id where the bonding process starts
* @param device The bonding(connecting) hearing aid device
*/
public static void setBondEntryForDevice(int bondEntry, CachedBluetoothDevice device) {
sDeviceAddressToBondEntryMap.put(device.getAddress(), bondEntry);
}
/**
* Logs hearing aid device information to westworld, including device mode, device side, and
* entry page id where the binding(connecting) process starts.
*
* Only logs the info once after hearing aid is bonded(connected). Clears the map entry of this
* device when logging is completed.
*
* @param device The bonded(connected) hearing aid device
*/
public static void logHearingAidInfo(CachedBluetoothDevice device) {
final String deviceAddress = device.getAddress();
if (sDeviceAddressToBondEntryMap.containsKey(deviceAddress)) {
final int bondEntry = sDeviceAddressToBondEntryMap.getOrDefault(deviceAddress, -1);
final int deviceMode = device.getDeviceMode();
final int deviceSide = device.getDeviceSide();
FrameworkStatsLog.write(FrameworkStatsLog.HEARING_AID_INFO_REPORTED, deviceMode,
deviceSide, bondEntry);
sDeviceAddressToBondEntryMap.remove(deviceAddress);
} else {
Log.w(TAG, "The device address was not found. Hearing aid device info is not logged.");
}
}
@VisibleForTesting
static HashMap<String, Integer> getDeviceAddressToBondEntryMap() {
return sDeviceAddressToBondEntryMap;
}
private HearingAidStatsLogUtils() {}
}

View File

@@ -352,6 +352,8 @@ public class LocalBluetoothProfileManager {
cachedDevice.setHiSyncId(newHiSyncId);
}
}
HearingAidStatsLogUtils.logHearingAidInfo(cachedDevice);
}
if (getCsipSetCoordinatorProfile() != null

View File

@@ -0,0 +1,74 @@
/*
* Copyright (C) 2022 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.settingslib.bluetooth;
import static com.google.common.truth.Truth.assertThat;
import static org.mockito.Mockito.when;
import com.android.internal.util.FrameworkStatsLog;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnit;
import org.mockito.junit.MockitoRule;
import org.robolectric.RobolectricTestRunner;
import java.util.HashMap;
@RunWith(RobolectricTestRunner.class)
public class HearingAidStatsLogUtilsTest {
private static final String TEST_DEVICE_ADDRESS = "00:A1:A1:A1:A1:A1";
@Rule
public final MockitoRule mockito = MockitoJUnit.rule();
@Mock
private CachedBluetoothDevice mCachedBluetoothDevice;
@Test
public void setBondEntryForDevice_addsEntryToDeviceAddressToBondEntryMap() {
when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS);
HearingAidStatsLogUtils.setBondEntryForDevice(
FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH,
mCachedBluetoothDevice);
final HashMap<String, Integer> map =
HearingAidStatsLogUtils.getDeviceAddressToBondEntryMap();
assertThat(map.containsKey(TEST_DEVICE_ADDRESS)).isTrue();
assertThat(map.get(TEST_DEVICE_ADDRESS)).isEqualTo(
FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH);
}
@Test
public void logHearingAidInfo_removesEntryFromDeviceAddressToBondEntryMap() {
when(mCachedBluetoothDevice.getAddress()).thenReturn(TEST_DEVICE_ADDRESS);
HearingAidStatsLogUtils.setBondEntryForDevice(
FrameworkStatsLog.HEARING_AID_INFO_REPORTED__BOND_ENTRY__BLUETOOTH,
mCachedBluetoothDevice);
HearingAidStatsLogUtils.logHearingAidInfo(mCachedBluetoothDevice);
final HashMap<String, Integer> map =
HearingAidStatsLogUtils.getDeviceAddressToBondEntryMap();
assertThat(map.containsKey(TEST_DEVICE_ADDRESS)).isFalse();
}
}