Loading android/app/jni/com_android_bluetooth_gatt.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -1546,11 +1546,12 @@ void set_scan_params_cmpl_cb(int client_if, uint8_t status) { static void gattSetScanParametersNative(JNIEnv* /* env */, jobject /* object */, jint client_if, jint scan_interval_unit, jint scan_window_unit) { jint scan_window_unit, jint scan_phy) { if (!sGattIf) return; sGattIf->scanner->SetScanParameters( client_if, /* use active scan */ 0x01, scan_interval_unit, scan_window_unit, base::Bind(&set_scan_params_cmpl_cb, client_if)); scan_window_unit, scan_phy, base::Bind(&set_scan_params_cmpl_cb, client_if)); } void scan_filter_param_cb(uint8_t client_if, uint8_t avbl_space, uint8_t action, Loading Loading @@ -2615,7 +2616,7 @@ static int register_com_android_bluetooth_gatt_scan(JNIEnv* env) { (void*)gattClientScanFilterClearNative}, {"gattClientScanFilterEnableNative", "(IZ)V", (void*)gattClientScanFilterEnableNative}, {"gattSetScanParametersNative", "(III)V", {"gattSetScanParametersNative", "(IIII)V", (void*)gattSetScanParametersNative}, }; const int result = REGISTER_NATIVE_METHODS( Loading android/app/src/com/android/bluetooth/le_scan/ScanManager.java +11 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.RequiresPermission; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanFilter; Loading Loading @@ -1091,6 +1092,7 @@ public class ScanManager { // convert scanWindow and scanInterval from ms to LE scan units(0.625ms) int scanWindow = Utils.millsToUnit(scanWindowMs); int scanInterval = Utils.millsToUnit(scanIntervalMs); int scanPhy = getScanPhy(client.settings); mNativeInterface.gattClientScan(false); if (!AppScanStats.recordScanRadioStop()) { Log.w(TAG, "There is no scan radio to stop"); Loading @@ -1103,8 +1105,8 @@ public class ScanManager { + ", in scan unit: " + scanInterval + " / " + scanWindow + " )" + client); } mNativeInterface.gattSetScanParameters(client.scannerId, scanInterval, scanWindow); mNativeInterface.gattSetScanParameters( client.scannerId, scanInterval, scanWindow, scanPhy); mNativeInterface.gattClientScan(true); if (!AppScanStats.recordScanRadioStart(curScanSetting)) { Log.w(TAG, "Scan radio already started"); Loading Loading @@ -1789,6 +1791,13 @@ public class ScanManager { } } private int getScanPhy(ScanSettings settings) { if (settings == null) { return BluetoothDevice.PHY_LE_1M; } return settings.getPhy(); } private int getOnFoundOnLostTimeoutMillis(ScanSettings settings, boolean onFound) { int factor; int timeout = ONLOST_ONFOUND_BASE_TIMEOUT_MS; Loading android/app/src/com/android/bluetooth/le_scan/ScanNativeInterface.java +7 −7 Original line number Diff line number Diff line Loading @@ -78,8 +78,10 @@ public class ScanNativeInterface { private native void registerScannerNative(long appUuidLsb, long appUuidMsb); private native void unregisterScannerNative(int scannerId); private native void gattClientScanNative(boolean start); private native void gattSetScanParametersNative(int clientIf, int scanInterval, int scanWindow); private native void gattSetScanParametersNative( int clientIf, int scanInterval, int scanWindow, int scanPhy); /************************** Filter related native methods ********************************/ private native void gattClientScanFilterAddNative(int clientId, ScanFilterQueue.Entry[] entries, int filterIndex); Loading Loading @@ -119,11 +121,9 @@ public class ScanNativeInterface { gattClientScanNative(start); } /** * Configure BLE scan parameters */ public void gattSetScanParameters(int clientIf, int scanInterval, int scanWindow) { gattSetScanParametersNative(clientIf, scanInterval, scanWindow); /** Configure BLE scan parameters */ public void gattSetScanParameters(int clientIf, int scanInterval, int scanWindow, int scanPhy) { gattSetScanParametersNative(clientIf, scanInterval, scanWindow, scanPhy); } /** Loading android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanManagerTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; Loading Loading @@ -305,6 +306,22 @@ public class ScanManagerTest { return scanSettings; } private ScanSettings createScanSettingsWithPhy(int scanMode, int phy) { ScanSettings scanSettings; scanSettings = new ScanSettings.Builder().setScanMode(scanMode).setPhy(phy).build(); return scanSettings; } private ScanClient createScanClientWithPhy( int id, boolean isFiltered, boolean isEmptyFilter, int scanMode, int phy) { List<ScanFilter> scanFilterList = createScanFilterList(isFiltered, isEmptyFilter); ScanSettings scanSettings = createScanSettingsWithPhy(scanMode, phy); ScanClient client = new ScanClient(id, scanSettings, scanFilterList); return client; } private Message createStartStopScanMessage(boolean isStartScan, Object obj) { Message message = new Message(); message.what = isStartScan ? ScanManager.MSG_START_BLE_SCAN : ScanManager.MSG_STOP_BLE_SCAN; Loading Loading @@ -1519,4 +1536,40 @@ public class ScanManagerTest { TestUtils.waitForLooperToFinishScheduledTask(mHandler.getLooper()); assertThat(mScanManager.mProfilesConnecting).isEqualTo(3); } @Test public void testSetScanPhy() { final boolean isFiltered = false; final boolean isEmptyFilter = false; // Set scan mode map {original scan mode (ScanMode) : expected scan mode (expectedScanMode)} SparseIntArray scanModeMap = new SparseIntArray(); scanModeMap.put(SCAN_MODE_LOW_POWER, SCAN_MODE_LOW_POWER); scanModeMap.put(SCAN_MODE_BALANCED, SCAN_MODE_BALANCED); scanModeMap.put(SCAN_MODE_LOW_LATENCY, SCAN_MODE_LOW_LATENCY); scanModeMap.put(SCAN_MODE_AMBIENT_DISCOVERY, SCAN_MODE_AMBIENT_DISCOVERY); for (int i = 0; i < scanModeMap.size(); i++) { int phy = 2; int ScanMode = scanModeMap.keyAt(i); int expectedScanMode = scanModeMap.get(ScanMode); Log.d( TAG, "ScanMode: " + String.valueOf(ScanMode) + " expectedScanMode: " + String.valueOf(expectedScanMode)); // Turn on screen sendMessageWaitForProcessed(createScreenOnOffMessage(true)); // Create scan client ScanClient client = createScanClientWithPhy(i, isFiltered, isEmptyFilter, ScanMode, phy); // Start scan sendMessageWaitForProcessed(createStartStopScanMessage(true, client)); assertThat(client.settings.getPhy()).isEqualTo(phy); verify(mScanNativeInterface, atLeastOnce()) .gattSetScanParameters(anyInt(), anyInt(), anyInt(), eq(phy)); } } } system/blueberry/facade/hci/le_scanning_manager_facade.proto +1 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ message SetScanParametersRequest { LeScanType scan_type = 2; uint32 scan_interval = 3; uint32 scan_window = 4; uint32 scan_phy = 5; } message AdvertisingReportMsg { Loading Loading
android/app/jni/com_android_bluetooth_gatt.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -1546,11 +1546,12 @@ void set_scan_params_cmpl_cb(int client_if, uint8_t status) { static void gattSetScanParametersNative(JNIEnv* /* env */, jobject /* object */, jint client_if, jint scan_interval_unit, jint scan_window_unit) { jint scan_window_unit, jint scan_phy) { if (!sGattIf) return; sGattIf->scanner->SetScanParameters( client_if, /* use active scan */ 0x01, scan_interval_unit, scan_window_unit, base::Bind(&set_scan_params_cmpl_cb, client_if)); scan_window_unit, scan_phy, base::Bind(&set_scan_params_cmpl_cb, client_if)); } void scan_filter_param_cb(uint8_t client_if, uint8_t avbl_space, uint8_t action, Loading Loading @@ -2615,7 +2616,7 @@ static int register_com_android_bluetooth_gatt_scan(JNIEnv* env) { (void*)gattClientScanFilterClearNative}, {"gattClientScanFilterEnableNative", "(IZ)V", (void*)gattClientScanFilterEnableNative}, {"gattSetScanParametersNative", "(III)V", {"gattSetScanParametersNative", "(IIII)V", (void*)gattSetScanParametersNative}, }; const int result = REGISTER_NATIVE_METHODS( Loading
android/app/src/com/android/bluetooth/le_scan/ScanManager.java +11 −2 Original line number Diff line number Diff line Loading @@ -20,6 +20,7 @@ import android.annotation.RequiresPermission; import android.app.ActivityManager; import android.app.AlarmManager; import android.app.PendingIntent; import android.bluetooth.BluetoothDevice; import android.bluetooth.BluetoothProfile; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanFilter; Loading Loading @@ -1091,6 +1092,7 @@ public class ScanManager { // convert scanWindow and scanInterval from ms to LE scan units(0.625ms) int scanWindow = Utils.millsToUnit(scanWindowMs); int scanInterval = Utils.millsToUnit(scanIntervalMs); int scanPhy = getScanPhy(client.settings); mNativeInterface.gattClientScan(false); if (!AppScanStats.recordScanRadioStop()) { Log.w(TAG, "There is no scan radio to stop"); Loading @@ -1103,8 +1105,8 @@ public class ScanManager { + ", in scan unit: " + scanInterval + " / " + scanWindow + " )" + client); } mNativeInterface.gattSetScanParameters(client.scannerId, scanInterval, scanWindow); mNativeInterface.gattSetScanParameters( client.scannerId, scanInterval, scanWindow, scanPhy); mNativeInterface.gattClientScan(true); if (!AppScanStats.recordScanRadioStart(curScanSetting)) { Log.w(TAG, "Scan radio already started"); Loading Loading @@ -1789,6 +1791,13 @@ public class ScanManager { } } private int getScanPhy(ScanSettings settings) { if (settings == null) { return BluetoothDevice.PHY_LE_1M; } return settings.getPhy(); } private int getOnFoundOnLostTimeoutMillis(ScanSettings settings, boolean onFound) { int factor; int timeout = ONLOST_ONFOUND_BASE_TIMEOUT_MS; Loading
android/app/src/com/android/bluetooth/le_scan/ScanNativeInterface.java +7 −7 Original line number Diff line number Diff line Loading @@ -78,8 +78,10 @@ public class ScanNativeInterface { private native void registerScannerNative(long appUuidLsb, long appUuidMsb); private native void unregisterScannerNative(int scannerId); private native void gattClientScanNative(boolean start); private native void gattSetScanParametersNative(int clientIf, int scanInterval, int scanWindow); private native void gattSetScanParametersNative( int clientIf, int scanInterval, int scanWindow, int scanPhy); /************************** Filter related native methods ********************************/ private native void gattClientScanFilterAddNative(int clientId, ScanFilterQueue.Entry[] entries, int filterIndex); Loading Loading @@ -119,11 +121,9 @@ public class ScanNativeInterface { gattClientScanNative(start); } /** * Configure BLE scan parameters */ public void gattSetScanParameters(int clientIf, int scanInterval, int scanWindow) { gattSetScanParametersNative(clientIf, scanInterval, scanWindow); /** Configure BLE scan parameters */ public void gattSetScanParameters(int clientIf, int scanInterval, int scanWindow, int scanPhy) { gattSetScanParametersNative(clientIf, scanInterval, scanWindow, scanPhy); } /** Loading
android/app/tests/unit/src/com/android/bluetooth/le_scan/ScanManagerTest.java +53 −0 Original line number Diff line number Diff line Loading @@ -29,6 +29,7 @@ import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.Mockito.atLeastOnce; import static org.mockito.Mockito.atMost; import static org.mockito.Mockito.doReturn; import static org.mockito.Mockito.eq; Loading Loading @@ -305,6 +306,22 @@ public class ScanManagerTest { return scanSettings; } private ScanSettings createScanSettingsWithPhy(int scanMode, int phy) { ScanSettings scanSettings; scanSettings = new ScanSettings.Builder().setScanMode(scanMode).setPhy(phy).build(); return scanSettings; } private ScanClient createScanClientWithPhy( int id, boolean isFiltered, boolean isEmptyFilter, int scanMode, int phy) { List<ScanFilter> scanFilterList = createScanFilterList(isFiltered, isEmptyFilter); ScanSettings scanSettings = createScanSettingsWithPhy(scanMode, phy); ScanClient client = new ScanClient(id, scanSettings, scanFilterList); return client; } private Message createStartStopScanMessage(boolean isStartScan, Object obj) { Message message = new Message(); message.what = isStartScan ? ScanManager.MSG_START_BLE_SCAN : ScanManager.MSG_STOP_BLE_SCAN; Loading Loading @@ -1519,4 +1536,40 @@ public class ScanManagerTest { TestUtils.waitForLooperToFinishScheduledTask(mHandler.getLooper()); assertThat(mScanManager.mProfilesConnecting).isEqualTo(3); } @Test public void testSetScanPhy() { final boolean isFiltered = false; final boolean isEmptyFilter = false; // Set scan mode map {original scan mode (ScanMode) : expected scan mode (expectedScanMode)} SparseIntArray scanModeMap = new SparseIntArray(); scanModeMap.put(SCAN_MODE_LOW_POWER, SCAN_MODE_LOW_POWER); scanModeMap.put(SCAN_MODE_BALANCED, SCAN_MODE_BALANCED); scanModeMap.put(SCAN_MODE_LOW_LATENCY, SCAN_MODE_LOW_LATENCY); scanModeMap.put(SCAN_MODE_AMBIENT_DISCOVERY, SCAN_MODE_AMBIENT_DISCOVERY); for (int i = 0; i < scanModeMap.size(); i++) { int phy = 2; int ScanMode = scanModeMap.keyAt(i); int expectedScanMode = scanModeMap.get(ScanMode); Log.d( TAG, "ScanMode: " + String.valueOf(ScanMode) + " expectedScanMode: " + String.valueOf(expectedScanMode)); // Turn on screen sendMessageWaitForProcessed(createScreenOnOffMessage(true)); // Create scan client ScanClient client = createScanClientWithPhy(i, isFiltered, isEmptyFilter, ScanMode, phy); // Start scan sendMessageWaitForProcessed(createStartStopScanMessage(true, client)); assertThat(client.settings.getPhy()).isEqualTo(phy); verify(mScanNativeInterface, atLeastOnce()) .gattSetScanParameters(anyInt(), anyInt(), anyInt(), eq(phy)); } } }
system/blueberry/facade/hci/le_scanning_manager_facade.proto +1 −0 Original line number Diff line number Diff line Loading @@ -55,6 +55,7 @@ message SetScanParametersRequest { LeScanType scan_type = 2; uint32 scan_interval = 3; uint32 scan_window = 4; uint32 scan_phy = 5; } message AdvertisingReportMsg { Loading