Loading android/app/src/com/android/bluetooth/btservice/AdapterService.java +8 −0 Original line number Diff line number Diff line Loading @@ -5963,10 +5963,18 @@ public class AdapterService extends Service { return mGattService == null ? null : mGattService.getBinder(); } public GattService getBluetoothGattService() { return mGattService; } IBinder getBluetoothScan() { return mScanController == null ? null : mScanController.getBinder(); } public ScanController getBluetoothScanController() { return mScanController; } void unregAllGattClient(AttributionSource source) { if (mGattService != null) { mGattService.unregAll(source); Loading android/app/src/com/android/bluetooth/gatt/GattService.java +1 −1 Original line number Diff line number Diff line Loading @@ -292,7 +292,7 @@ public class GattService extends ProfileService { sGattService = instance; } TransitionalScanHelper getTransitionalScanHelper() { public TransitionalScanHelper getTransitionalScanHelper() { return mTransitionalScanHelper; } Loading android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +75 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.bluetooth.IBluetoothLeAudioCallback; import android.bluetooth.IBluetoothLeBroadcastCallback; import android.bluetooth.IBluetoothVolumeControl; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.IScannerCallback; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; Loading Loading @@ -222,6 +223,8 @@ public class LeAudioService extends ProfileService { /* When mScanCallback is not null, it means scan is started. */ ScanCallback mScanCallback; private final AudioServerScanCallback2 mScanCallback2 = new AudioServerScanCallback2(); public LeAudioService(Context ctx) { this(ctx, LeAudioNativeInterface.getInstance()); } Loading Loading @@ -1790,8 +1793,68 @@ public class LeAudioService extends ProfileService { return true; } private class AudioServerScanCallback2 extends IScannerCallback.Stub { // See BluetoothLeScanner.BleScanCallbackWrapper.mScannerId int mScannerId = 0; synchronized void startBackgroundScan() { if (mScannerId != 0) { Log.d(TAG, "Scanner is already registered with id " + mScannerId); return; } if (Flags.scanManagerRefactor()) { mAdapterService .getBluetoothScanController() .getTransitionalScanHelper() .registerScannerInternal(this, null); } else { mAdapterService .getBluetoothGattService() .getTransitionalScanHelper() .registerScannerInternal(this, null); } } synchronized void stopBackgroundScan() { if (mScannerId == 0) { Log.d(TAG, "Scanner is already unregistered"); return; } if (Flags.scanManagerRefactor()) { mAdapterService .getBluetoothScanController() .getTransitionalScanHelper() .unregisterScannerInternal(mScannerId); } else { mAdapterService .getBluetoothGattService() .getTransitionalScanHelper() .unregisterScannerInternal(mScannerId); } } @Override public synchronized void onScannerRegistered(int status, int scannerId) { mScannerId = scannerId; } // Eventually we should be able to start scan from native when b/276350722 is done // All the result returned here are ignored @Override public void onScanResult(ScanResult scanResult) {} @Override public void onBatchScanResults(List<ScanResult> batchResults) {} @Override public void onFoundOrLost(boolean onFound, ScanResult scanResult) {} @Override public void onScanManagerErrorCallback(int errorCode) {} } private class AudioServerScanCallback extends ScanCallback { int mMaxScanRetires = 10; int mMaxScanRetries = 10; int mScanRetries = 0; @Override Loading @@ -1814,7 +1877,7 @@ public class LeAudioService extends ProfileService { switch (errorCode) { case SCAN_FAILED_INTERNAL_ERROR: case SCAN_FAILED_APPLICATION_REGISTRATION_FAILED: if (mScanRetries < mMaxScanRetires) { if (mScanRetries < mMaxScanRetries) { mScanRetries++; Log.w(TAG, "Failed to start. Let's retry"); mHandler.post(() -> startAudioServersBackgroundScan(/* retry= */ true)); Loading Loading @@ -2793,6 +2856,11 @@ public class LeAudioService extends ProfileService { void stopAudioServersBackgroundScan() { Log.d(TAG, "stopAudioServersBackgroundScan"); if (Flags.leaudioCallStartScanDirectly()) { mScanCallback2.stopBackgroundScan(); return; } if (mAudioServersScanner == null || mScanCallback == null) { Log.d(TAG, "stopAudioServersBackgroundScan: already stopped"); return; Loading @@ -2815,6 +2883,11 @@ public class LeAudioService extends ProfileService { return; } if (Flags.leaudioCallStartScanDirectly()) { mScanCallback2.startBackgroundScan(); return; } if (mAudioServersScanner == null) { mAudioServersScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner(); if (mAudioServersScanner == null) { Loading android/app/src/com/android/bluetooth/le_scan/ScanController.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ public class ScanController { mTransitionalScanHelper.notifyProfileConnectionStateChange(profile, fromState, toState); } TransitionalScanHelper getTransitionalScanHelper() { public TransitionalScanHelper getTransitionalScanHelper() { return mTransitionalScanHelper; } Loading android/app/src/com/android/bluetooth/le_scan/TransitionalScanHelper.java +12 −3 Original line number Diff line number Diff line Loading @@ -1065,9 +1065,6 @@ public class TransitionalScanHelper { return; } UUID uuid = UUID.randomUUID(); Log.d(TAG, "registerScanner() - UUID=" + uuid); enforceImpersonatationPermissionIfNeeded(workSource); AppScanStats app = mScannerMap.getAppScanStatsByUid(Binder.getCallingUid()); Loading @@ -1082,6 +1079,13 @@ public class TransitionalScanHelper { } return; } registerScannerInternal(callback, workSource); } /** Intended for internal use within the Bluetooth app. Bypass permission check */ public void registerScannerInternal(IScannerCallback callback, WorkSource workSource) { UUID uuid = UUID.randomUUID(); Log.d(TAG, "registerScanner() - UUID=" + uuid); mScannerMap.add(uuid, workSource, callback, null, mContext, this); mScanManager.registerScanner(uuid); Loading @@ -1094,6 +1098,11 @@ public class TransitionalScanHelper { return; } unregisterScannerInternal(scannerId); } /** Intended for internal use within the Bluetooth app. Bypass permission check */ public void unregisterScannerInternal(int scannerId) { Log.d(TAG, "unregisterScanner() - scannerId=" + scannerId); mScannerMap.remove(scannerId); mScanManager.unregisterScanner(scannerId); Loading Loading
android/app/src/com/android/bluetooth/btservice/AdapterService.java +8 −0 Original line number Diff line number Diff line Loading @@ -5963,10 +5963,18 @@ public class AdapterService extends Service { return mGattService == null ? null : mGattService.getBinder(); } public GattService getBluetoothGattService() { return mGattService; } IBinder getBluetoothScan() { return mScanController == null ? null : mScanController.getBinder(); } public ScanController getBluetoothScanController() { return mScanController; } void unregAllGattClient(AttributionSource source) { if (mGattService != null) { mGattService.unregAll(source); Loading
android/app/src/com/android/bluetooth/gatt/GattService.java +1 −1 Original line number Diff line number Diff line Loading @@ -292,7 +292,7 @@ public class GattService extends ProfileService { sGattService = instance; } TransitionalScanHelper getTransitionalScanHelper() { public TransitionalScanHelper getTransitionalScanHelper() { return mTransitionalScanHelper; } Loading
android/app/src/com/android/bluetooth/le_audio/LeAudioService.java +75 −2 Original line number Diff line number Diff line Loading @@ -48,6 +48,7 @@ import android.bluetooth.IBluetoothLeAudioCallback; import android.bluetooth.IBluetoothLeBroadcastCallback; import android.bluetooth.IBluetoothVolumeControl; import android.bluetooth.le.BluetoothLeScanner; import android.bluetooth.le.IScannerCallback; import android.bluetooth.le.ScanCallback; import android.bluetooth.le.ScanFilter; import android.bluetooth.le.ScanResult; Loading Loading @@ -222,6 +223,8 @@ public class LeAudioService extends ProfileService { /* When mScanCallback is not null, it means scan is started. */ ScanCallback mScanCallback; private final AudioServerScanCallback2 mScanCallback2 = new AudioServerScanCallback2(); public LeAudioService(Context ctx) { this(ctx, LeAudioNativeInterface.getInstance()); } Loading Loading @@ -1790,8 +1793,68 @@ public class LeAudioService extends ProfileService { return true; } private class AudioServerScanCallback2 extends IScannerCallback.Stub { // See BluetoothLeScanner.BleScanCallbackWrapper.mScannerId int mScannerId = 0; synchronized void startBackgroundScan() { if (mScannerId != 0) { Log.d(TAG, "Scanner is already registered with id " + mScannerId); return; } if (Flags.scanManagerRefactor()) { mAdapterService .getBluetoothScanController() .getTransitionalScanHelper() .registerScannerInternal(this, null); } else { mAdapterService .getBluetoothGattService() .getTransitionalScanHelper() .registerScannerInternal(this, null); } } synchronized void stopBackgroundScan() { if (mScannerId == 0) { Log.d(TAG, "Scanner is already unregistered"); return; } if (Flags.scanManagerRefactor()) { mAdapterService .getBluetoothScanController() .getTransitionalScanHelper() .unregisterScannerInternal(mScannerId); } else { mAdapterService .getBluetoothGattService() .getTransitionalScanHelper() .unregisterScannerInternal(mScannerId); } } @Override public synchronized void onScannerRegistered(int status, int scannerId) { mScannerId = scannerId; } // Eventually we should be able to start scan from native when b/276350722 is done // All the result returned here are ignored @Override public void onScanResult(ScanResult scanResult) {} @Override public void onBatchScanResults(List<ScanResult> batchResults) {} @Override public void onFoundOrLost(boolean onFound, ScanResult scanResult) {} @Override public void onScanManagerErrorCallback(int errorCode) {} } private class AudioServerScanCallback extends ScanCallback { int mMaxScanRetires = 10; int mMaxScanRetries = 10; int mScanRetries = 0; @Override Loading @@ -1814,7 +1877,7 @@ public class LeAudioService extends ProfileService { switch (errorCode) { case SCAN_FAILED_INTERNAL_ERROR: case SCAN_FAILED_APPLICATION_REGISTRATION_FAILED: if (mScanRetries < mMaxScanRetires) { if (mScanRetries < mMaxScanRetries) { mScanRetries++; Log.w(TAG, "Failed to start. Let's retry"); mHandler.post(() -> startAudioServersBackgroundScan(/* retry= */ true)); Loading Loading @@ -2793,6 +2856,11 @@ public class LeAudioService extends ProfileService { void stopAudioServersBackgroundScan() { Log.d(TAG, "stopAudioServersBackgroundScan"); if (Flags.leaudioCallStartScanDirectly()) { mScanCallback2.stopBackgroundScan(); return; } if (mAudioServersScanner == null || mScanCallback == null) { Log.d(TAG, "stopAudioServersBackgroundScan: already stopped"); return; Loading @@ -2815,6 +2883,11 @@ public class LeAudioService extends ProfileService { return; } if (Flags.leaudioCallStartScanDirectly()) { mScanCallback2.startBackgroundScan(); return; } if (mAudioServersScanner == null) { mAudioServersScanner = BluetoothAdapter.getDefaultAdapter().getBluetoothLeScanner(); if (mAudioServersScanner == null) { Loading
android/app/src/com/android/bluetooth/le_scan/ScanController.java +1 −1 Original line number Diff line number Diff line Loading @@ -64,7 +64,7 @@ public class ScanController { mTransitionalScanHelper.notifyProfileConnectionStateChange(profile, fromState, toState); } TransitionalScanHelper getTransitionalScanHelper() { public TransitionalScanHelper getTransitionalScanHelper() { return mTransitionalScanHelper; } Loading
android/app/src/com/android/bluetooth/le_scan/TransitionalScanHelper.java +12 −3 Original line number Diff line number Diff line Loading @@ -1065,9 +1065,6 @@ public class TransitionalScanHelper { return; } UUID uuid = UUID.randomUUID(); Log.d(TAG, "registerScanner() - UUID=" + uuid); enforceImpersonatationPermissionIfNeeded(workSource); AppScanStats app = mScannerMap.getAppScanStatsByUid(Binder.getCallingUid()); Loading @@ -1082,6 +1079,13 @@ public class TransitionalScanHelper { } return; } registerScannerInternal(callback, workSource); } /** Intended for internal use within the Bluetooth app. Bypass permission check */ public void registerScannerInternal(IScannerCallback callback, WorkSource workSource) { UUID uuid = UUID.randomUUID(); Log.d(TAG, "registerScanner() - UUID=" + uuid); mScannerMap.add(uuid, workSource, callback, null, mContext, this); mScanManager.registerScanner(uuid); Loading @@ -1094,6 +1098,11 @@ public class TransitionalScanHelper { return; } unregisterScannerInternal(scannerId); } /** Intended for internal use within the Bluetooth app. Bypass permission check */ public void unregisterScannerInternal(int scannerId) { Log.d(TAG, "unregisterScanner() - scannerId=" + scannerId); mScannerMap.remove(scannerId); mScanManager.unregisterScanner(scannerId); Loading