Loading android/app/src/com/android/bluetooth/gatt/AdvertiseManager.java +3 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.bluetooth.gatt; import static android.bluetooth.BluetoothProtoEnums.LE_ADV_ERROR_ON_START_COUNT; import android.bluetooth.le.AdvertiseCallback; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertisingSetParameters; Loading Loading @@ -175,6 +177,7 @@ public class AdvertiseManager { stats.recordAdvertiseStop(); } mAdvertiserMap.removeAppAdvertiseStats(regId); AppAdvertiseStats.recordAdvertiseErrorCount(LE_ADV_ERROR_ON_START_COUNT); } callback.onAdvertisingSetStarted(advertiserId, txPower, status); Loading android/app/src/com/android/bluetooth/gatt/AppAdvertiseStats.java +114 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.bluetooth.gatt; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertisingSetParameters; import android.bluetooth.le.PeriodicAdvertisingParameters; Loading @@ -24,6 +25,8 @@ import android.util.SparseArray; import androidx.annotation.VisibleForTesting; import com.android.bluetooth.btservice.MetricsLogger; import java.time.Duration; import java.time.Instant; import java.time.ZoneId; Loading Loading @@ -164,6 +167,7 @@ public class AppAdvertiseStats { mPeriodicIncludeTxPower = periodicParameters.getIncludeTxPower(); mPeriodicInterval = periodicParameters.getInterval(); } recordAdvertiseEnableCount(true, mConnectable, mPeriodicAdvertisingEnabled); } void recordAdvertiseStart(int duration, int maxExtAdvEvents) { Loading @@ -171,14 +175,37 @@ public class AppAdvertiseStats { } void recordAdvertiseStop() { mAdvertisingEnabled = false; mPeriodicAdvertisingEnabled = false; recordAdvertiseEnableCount(false, mConnectable, mPeriodicAdvertisingEnabled); if (!mAdvertiserRecords.isEmpty()) { AppAdvertiserRecord record = mAdvertiserRecords.get(mAdvertiserRecords.size() - 1); record.stopTime = Instant.now(); Duration duration = Duration.between(record.startTime, record.stopTime); recordAdvertiseDurationCount(duration, mConnectable, mPeriodicAdvertisingEnabled); } mAdvertisingEnabled = false; mPeriodicAdvertisingEnabled = false; } static void recordAdvertiseInstanceCount(int instanceCount) { if (instanceCount < 5) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_5, 1); } else if (instanceCount < 10) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_10, 1); } else if (instanceCount < 15) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_15, 1); } else { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_15P, 1); } } static void recordAdvertiseErrorCount(int key) { if (key != BluetoothProtoEnums.LE_ADV_ERROR_ON_START_COUNT) { return; } MetricsLogger.getInstance().cacheCount(key, 1); } void enableAdvertisingSet(boolean enable, int duration, int maxExtAdvEvents) { if (enable) { //if the advertisingSet have not been disabled, skip enabling. Loading Loading @@ -269,6 +296,91 @@ public class AppAdvertiseStats { this.mId = id; } private static void recordAdvertiseDurationCount(Duration duration, boolean isConnectable, boolean inPeriodic) { if (duration.compareTo(Duration.ofMinutes(1)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_1M, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_1M, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_1M, 1); } } else if (duration.compareTo(Duration.ofMinutes(30)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_30M, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_30M, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_30M, 1); } } else if (duration.compareTo(Duration.ofHours(1)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_1H, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_1H, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_1H, 1); } } else if (duration.compareTo(Duration.ofHours(3)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_3H, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_3H, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_3H, 1); } } else { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_3HP, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_3HP, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_3HP, 1); } } } private static void recordAdvertiseEnableCount(boolean enable, boolean isConnectable, boolean inPeriodic) { if (enable) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_COUNT_ENABLE, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_ENABLE, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_ENABLE, 1); } } else { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_COUNT_DISABLE, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_DISABLE, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_DISABLE, 1); } } } private static String printByteArrayInHex(byte[] data) { final StringBuilder hex = new StringBuilder(); for (byte b : data) { Loading android/app/src/com/android/bluetooth/gatt/ContextMap.java +3 −0 Original line number Diff line number Diff line Loading @@ -486,6 +486,9 @@ public class ContextMap<C, T> { } stats.recordAdvertiseStart(parameters, advertiseData, scanResponse, periodicParameters, periodicData, duration, maxExtAdvEvents); int advertiseInstanceCount = mAppAdvertiseStats.size(); Log.d(TAG, "advertiseInstanceCount is " + advertiseInstanceCount); AppAdvertiseStats.recordAdvertiseInstanceCount(advertiseInstanceCount); } } Loading android/app/tests/unit/src/com/android/bluetooth/gatt/AppAdvertiseStatsTest.java +74 −0 Original line number Diff line number Diff line Loading @@ -18,16 +18,27 @@ package com.android.bluetooth.gatt; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertisingSetParameters; import android.bluetooth.le.PeriodicAdvertisingParameters; import com.android.bluetooth.btservice.MetricsLogger; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; /** * Test cases for {@link AppAdvertiseStats}. Loading @@ -42,6 +53,21 @@ public class AppAdvertiseStatsTest { @Mock private GattService service; @Mock private MetricsLogger mMetricsLogger; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); MetricsLogger.setInstanceForTesting(mMetricsLogger); } @After public void tearDown() throws Exception { MetricsLogger.setInstanceForTesting(null); MetricsLogger.getInstance(); } @Test public void constructor() { int appUid = 0; Loading Loading @@ -255,4 +281,52 @@ public class AppAdvertiseStatsTest { AppAdvertiseStats.dumpToString(sb, appAdvertiseStats); } @Test public void testAdvertiseCounterMetrics() { int appUid = 0; int id = 1; String name = "name"; AppAdvertiseStats appAdvertiseStats = new AppAdvertiseStats(appUid, id, name, map, service); AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder() .setConnectable(true).build(); AdvertiseData advertiseData = new AdvertiseData.Builder().build(); AdvertiseData scanResponse = new AdvertiseData.Builder().build(); PeriodicAdvertisingParameters periodicParameters = new PeriodicAdvertisingParameters.Builder().build(); AdvertiseData periodicData = new AdvertiseData.Builder().build(); appAdvertiseStats.recordAdvertiseStart( parameters, advertiseData, scanResponse, periodicParameters, periodicData, 0, 0 ); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_ENABLE), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_ENABLE), eq((long)1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_ENABLE), eq((long) 1)); Mockito.clearInvocations(mMetricsLogger); appAdvertiseStats.recordAdvertiseStop(); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_DISABLE), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_DISABLE), eq((long)1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_DISABLE), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_1M), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_1M), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_1M), eq((long) 1)); } } Loading
android/app/src/com/android/bluetooth/gatt/AdvertiseManager.java +3 −0 Original line number Diff line number Diff line Loading @@ -16,6 +16,8 @@ package com.android.bluetooth.gatt; import static android.bluetooth.BluetoothProtoEnums.LE_ADV_ERROR_ON_START_COUNT; import android.bluetooth.le.AdvertiseCallback; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertisingSetParameters; Loading Loading @@ -175,6 +177,7 @@ public class AdvertiseManager { stats.recordAdvertiseStop(); } mAdvertiserMap.removeAppAdvertiseStats(regId); AppAdvertiseStats.recordAdvertiseErrorCount(LE_ADV_ERROR_ON_START_COUNT); } callback.onAdvertisingSetStarted(advertiserId, txPower, status); Loading
android/app/src/com/android/bluetooth/gatt/AppAdvertiseStats.java +114 −2 Original line number Diff line number Diff line Loading @@ -16,6 +16,7 @@ package com.android.bluetooth.gatt; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertisingSetParameters; import android.bluetooth.le.PeriodicAdvertisingParameters; Loading @@ -24,6 +25,8 @@ import android.util.SparseArray; import androidx.annotation.VisibleForTesting; import com.android.bluetooth.btservice.MetricsLogger; import java.time.Duration; import java.time.Instant; import java.time.ZoneId; Loading Loading @@ -164,6 +167,7 @@ public class AppAdvertiseStats { mPeriodicIncludeTxPower = periodicParameters.getIncludeTxPower(); mPeriodicInterval = periodicParameters.getInterval(); } recordAdvertiseEnableCount(true, mConnectable, mPeriodicAdvertisingEnabled); } void recordAdvertiseStart(int duration, int maxExtAdvEvents) { Loading @@ -171,14 +175,37 @@ public class AppAdvertiseStats { } void recordAdvertiseStop() { mAdvertisingEnabled = false; mPeriodicAdvertisingEnabled = false; recordAdvertiseEnableCount(false, mConnectable, mPeriodicAdvertisingEnabled); if (!mAdvertiserRecords.isEmpty()) { AppAdvertiserRecord record = mAdvertiserRecords.get(mAdvertiserRecords.size() - 1); record.stopTime = Instant.now(); Duration duration = Duration.between(record.startTime, record.stopTime); recordAdvertiseDurationCount(duration, mConnectable, mPeriodicAdvertisingEnabled); } mAdvertisingEnabled = false; mPeriodicAdvertisingEnabled = false; } static void recordAdvertiseInstanceCount(int instanceCount) { if (instanceCount < 5) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_5, 1); } else if (instanceCount < 10) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_10, 1); } else if (instanceCount < 15) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_15, 1); } else { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_INSTANCE_COUNT_15P, 1); } } static void recordAdvertiseErrorCount(int key) { if (key != BluetoothProtoEnums.LE_ADV_ERROR_ON_START_COUNT) { return; } MetricsLogger.getInstance().cacheCount(key, 1); } void enableAdvertisingSet(boolean enable, int duration, int maxExtAdvEvents) { if (enable) { //if the advertisingSet have not been disabled, skip enabling. Loading Loading @@ -269,6 +296,91 @@ public class AppAdvertiseStats { this.mId = id; } private static void recordAdvertiseDurationCount(Duration duration, boolean isConnectable, boolean inPeriodic) { if (duration.compareTo(Duration.ofMinutes(1)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_1M, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_1M, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_1M, 1); } } else if (duration.compareTo(Duration.ofMinutes(30)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_30M, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_30M, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_30M, 1); } } else if (duration.compareTo(Duration.ofHours(1)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_1H, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_1H, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_1H, 1); } } else if (duration.compareTo(Duration.ofHours(3)) < 0) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_3H, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_3H, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_3H, 1); } } else { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_3HP, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_3HP, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_3HP, 1); } } } private static void recordAdvertiseEnableCount(boolean enable, boolean isConnectable, boolean inPeriodic) { if (enable) { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_COUNT_ENABLE, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_ENABLE, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_ENABLE, 1); } } else { MetricsLogger.getInstance().cacheCount(BluetoothProtoEnums.LE_ADV_COUNT_DISABLE, 1); if (isConnectable) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_DISABLE, 1); } if (inPeriodic) { MetricsLogger.getInstance().cacheCount( BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_DISABLE, 1); } } } private static String printByteArrayInHex(byte[] data) { final StringBuilder hex = new StringBuilder(); for (byte b : data) { Loading
android/app/src/com/android/bluetooth/gatt/ContextMap.java +3 −0 Original line number Diff line number Diff line Loading @@ -486,6 +486,9 @@ public class ContextMap<C, T> { } stats.recordAdvertiseStart(parameters, advertiseData, scanResponse, periodicParameters, periodicData, duration, maxExtAdvEvents); int advertiseInstanceCount = mAppAdvertiseStats.size(); Log.d(TAG, "advertiseInstanceCount is " + advertiseInstanceCount); AppAdvertiseStats.recordAdvertiseInstanceCount(advertiseInstanceCount); } } Loading
android/app/tests/unit/src/com/android/bluetooth/gatt/AppAdvertiseStatsTest.java +74 −0 Original line number Diff line number Diff line Loading @@ -18,16 +18,27 @@ package com.android.bluetooth.gatt; import static com.google.common.truth.Truth.assertThat; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import android.bluetooth.BluetoothProtoEnums; import android.bluetooth.le.AdvertiseData; import android.bluetooth.le.AdvertisingSetParameters; import android.bluetooth.le.PeriodicAdvertisingParameters; import com.android.bluetooth.btservice.MetricsLogger; import androidx.test.filters.SmallTest; import androidx.test.runner.AndroidJUnit4; import org.junit.After; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; /** * Test cases for {@link AppAdvertiseStats}. Loading @@ -42,6 +53,21 @@ public class AppAdvertiseStatsTest { @Mock private GattService service; @Mock private MetricsLogger mMetricsLogger; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); MetricsLogger.setInstanceForTesting(mMetricsLogger); } @After public void tearDown() throws Exception { MetricsLogger.setInstanceForTesting(null); MetricsLogger.getInstance(); } @Test public void constructor() { int appUid = 0; Loading Loading @@ -255,4 +281,52 @@ public class AppAdvertiseStatsTest { AppAdvertiseStats.dumpToString(sb, appAdvertiseStats); } @Test public void testAdvertiseCounterMetrics() { int appUid = 0; int id = 1; String name = "name"; AppAdvertiseStats appAdvertiseStats = new AppAdvertiseStats(appUid, id, name, map, service); AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder() .setConnectable(true).build(); AdvertiseData advertiseData = new AdvertiseData.Builder().build(); AdvertiseData scanResponse = new AdvertiseData.Builder().build(); PeriodicAdvertisingParameters periodicParameters = new PeriodicAdvertisingParameters.Builder().build(); AdvertiseData periodicData = new AdvertiseData.Builder().build(); appAdvertiseStats.recordAdvertiseStart( parameters, advertiseData, scanResponse, periodicParameters, periodicData, 0, 0 ); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_ENABLE), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_ENABLE), eq((long)1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_ENABLE), eq((long) 1)); Mockito.clearInvocations(mMetricsLogger); appAdvertiseStats.recordAdvertiseStop(); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_DISABLE), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_CONNECTABLE_DISABLE), eq((long)1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_COUNT_PERIODIC_DISABLE), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_DURATION_COUNT_TOTAL_1M), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_DURATION_COUNT_CONNECTABLE_1M), eq((long) 1)); verify(mMetricsLogger, times(1)).cacheCount( eq(BluetoothProtoEnums.LE_ADV_DURATION_COUNT_PERIODIC_1M), eq((long) 1)); } }