Loading android/app/jni/com_android_bluetooth_gatt.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -2682,7 +2682,7 @@ static void stopDistanceMeasurementNative(JNIEnv* env, jobject object, * JNI function definitinos */ // JNI functions defined in AdvertiseManager class. // JNI functions defined in AdvertiseManagerNativeInterface class. static JNINativeMethod sAdvertiseMethods[] = { {"classInitNative", "()V", (void*)advertiseClassInitNative}, {"initializeNative", "()V", (void*)advertiseInitializeNative}, Loading @@ -2691,8 +2691,8 @@ static JNINativeMethod sAdvertiseMethods[] = { "(Landroid/bluetooth/le/AdvertisingSetParameters;[B[BLandroid/bluetooth/" "le/PeriodicAdvertisingParameters;[BIIII)V", (void*)startAdvertisingSetNative}, {"getOwnAddressNative", "(I)V", (void*)getOwnAddressNative}, {"stopAdvertisingSetNative", "(I)V", (void*)stopAdvertisingSetNative}, {"getOwnAddressNative", "(I)V", (void*)getOwnAddressNative}, {"enableAdvertisingSetNative", "(IZII)V", (void*)enableAdvertisingSetNative}, {"setAdvertisingDataNative", "(I[B)V", (void*)setAdvertisingDataNative}, Loading Loading @@ -2848,8 +2848,8 @@ int register_com_android_bluetooth_gatt(JNIEnv* env) { env, "com/android/bluetooth/gatt/ScanNativeInterface", sScanMethods, NELEM(sScanMethods)); register_success &= jniRegisterNativeMethods( env, "com/android/bluetooth/gatt/AdvertiseManager", sAdvertiseMethods, NELEM(sAdvertiseMethods)); env, "com/android/bluetooth/gatt/AdvertiseManagerNativeInterface", sAdvertiseMethods, NELEM(sAdvertiseMethods)); register_success &= jniRegisterNativeMethods( env, "com/android/bluetooth/gatt/PeriodicScanManager", sPeriodicScanMethods, NELEM(sPeriodicScanMethods)); Loading android/app/src/com/android/bluetooth/gatt/AdvertiseManager.java +31 −57 Original line number Diff line number Diff line Loading @@ -51,20 +51,23 @@ public class AdvertiseManager { private final GattService mService; private final AdapterService mAdapterService; private final AdvertiseManagerNativeInterface mNativeInterface; private final AdvertiserMap mAdvertiserMap; private Handler mHandler; Map<IBinder, AdvertiserInfo> mAdvertisers = Collections.synchronizedMap(new HashMap<>()); static int sTempRegistrationId = -1; /** * Constructor of {@link AdvertiseManager}. */ AdvertiseManager(GattService service, AdapterService adapterService, /** Constructor of {@link AdvertiseManager}. */ AdvertiseManager( GattService service, AdvertiseManagerNativeInterface nativeInterface, AdapterService adapterService, AdvertiserMap advertiserMap) { if (DBG) { Log.d(TAG, "advertise manager created"); } mService = service; mNativeInterface = nativeInterface; mAdapterService = adapterService; mAdvertiserMap = advertiserMap; } Loading @@ -73,7 +76,7 @@ public class AdvertiseManager { * Start a {@link HandlerThread} that handles advertising operations. */ void start() { initializeNative(); mNativeInterface.init(this); HandlerThread thread = new HandlerThread("BluetoothAdvertiseManager"); thread.start(); mHandler = new Handler(thread.getLooper()); Loading @@ -83,7 +86,7 @@ public class AdvertiseManager { if (DBG) { Log.d(TAG, "cleanup()"); } cleanupNative(); mNativeInterface.cleanup(); mAdvertisers.clear(); sTempRegistrationId = -1; Loading Loading @@ -157,7 +160,7 @@ public class AdvertiseManager { if (entry == null) { Log.i(TAG, "onAdvertisingSetStarted() - no callback found for regId " + regId); // Advertising set was stopped before it was properly registered. stopAdvertisingSetNative(advertiserId); mNativeInterface.stopAdvertisingSet(advertiserId); return; } Loading Loading @@ -252,8 +255,15 @@ public class AdvertiseManager { mAdvertiserMap.recordAdvertiseStart(cbId, parameters, advertiseData, scanResponse, periodicParameters, periodicData, duration, maxExtAdvEvents); startAdvertisingSetNative(parameters, advDataBytes, scanResponseBytes, periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId, mNativeInterface.startAdvertisingSet( parameters, advDataBytes, scanResponseBytes, periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId, serverIf); } catch (IllegalArgumentException e) { Loading Loading @@ -289,7 +299,7 @@ public class AdvertiseManager { Log.w(TAG, "getOwnAddress() - bad advertiserId " + advertiserId); return; } getOwnAddressNative(advertiserId); mNativeInterface.getOwnAddress(advertiserId); } void stopAdvertisingSet(IAdvertisingSetCallback callback) { Loading @@ -313,7 +323,7 @@ public class AdvertiseManager { return; } stopAdvertisingSetNative(advertiserId); mNativeInterface.stopAdvertisingSet(advertiserId); try { callback.onAdvertisingSetStopped(advertiserId); Loading @@ -330,7 +340,7 @@ public class AdvertiseManager { Log.w(TAG, "enableAdvertisingSet() - bad advertiserId " + advertiserId); return; } enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents); mNativeInterface.enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents); mAdvertiserMap.enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents); Loading @@ -344,8 +354,8 @@ public class AdvertiseManager { } String deviceName = AdapterService.getAdapterService().getName(); try { setAdvertisingDataNative(advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mNativeInterface.setAdvertisingData( advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mAdvertiserMap.setAdvertisingData(advertiserId, data); } catch (IllegalArgumentException e) { Loading @@ -366,8 +376,8 @@ public class AdvertiseManager { } String deviceName = AdapterService.getAdapterService().getName(); try { setScanResponseDataNative(advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mNativeInterface.setScanResponseData( advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mAdvertiserMap.setScanResponseData(advertiserId, data); } catch (IllegalArgumentException e) { Loading @@ -386,7 +396,7 @@ public class AdvertiseManager { Log.w(TAG, "setAdvertisingParameters() - bad advertiserId " + advertiserId); return; } setAdvertisingParametersNative(advertiserId, parameters); mNativeInterface.setAdvertisingParameters(advertiserId, parameters); mAdvertiserMap.setAdvertisingParameters(advertiserId, parameters); } Loading @@ -398,7 +408,7 @@ public class AdvertiseManager { Log.w(TAG, "setPeriodicAdvertisingParameters() - bad advertiserId " + advertiserId); return; } setPeriodicAdvertisingParametersNative(advertiserId, parameters); mNativeInterface.setPeriodicAdvertisingParameters(advertiserId, parameters); mAdvertiserMap.setPeriodicAdvertisingParameters(advertiserId, parameters); } Loading @@ -411,8 +421,8 @@ public class AdvertiseManager { } String deviceName = AdapterService.getAdapterService().getName(); try { setPeriodicAdvertisingDataNative(advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mNativeInterface.setPeriodicAdvertisingData( advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mAdvertiserMap.setPeriodicAdvertisingData(advertiserId, data); } catch (IllegalArgumentException e) { Loading @@ -431,7 +441,7 @@ public class AdvertiseManager { Log.w(TAG, "setPeriodicAdvertisingEnable() - bad advertiserId " + advertiserId); return; } setPeriodicAdvertisingEnableNative(advertiserId, enable); mNativeInterface.setPeriodicAdvertisingEnable(advertiserId, enable); } void onAdvertisingDataSet(int advertiserId, int status) throws Exception { Loading Loading @@ -538,40 +548,4 @@ public class AdvertiseManager { stats.onPeriodicAdvertiseEnabled(enable); } } static { classInitNative(); } private static native void classInitNative(); private native void initializeNative(); private native void cleanupNative(); private native void startAdvertisingSetNative(AdvertisingSetParameters parameters, byte[] advertiseData, byte[] scanResponse, PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration, int maxExtAdvEvents, int regId, int serverIf); private native void getOwnAddressNative(int advertiserId); private native void stopAdvertisingSetNative(int advertiserId); private native void enableAdvertisingSetNative(int advertiserId, boolean enable, int duration, int maxExtAdvEvents); private native void setAdvertisingDataNative(int advertiserId, byte[] data); private native void setScanResponseDataNative(int advertiserId, byte[] data); private native void setAdvertisingParametersNative(int advertiserId, AdvertisingSetParameters parameters); private native void setPeriodicAdvertisingParametersNative(int advertiserId, PeriodicAdvertisingParameters parameters); private native void setPeriodicAdvertisingDataNative(int advertiserId, byte[] data); private native void setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable); } android/app/src/com/android/bluetooth/gatt/AdvertiseManagerNativeInterface.java 0 → 100644 +178 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.bluetooth.gatt; import android.bluetooth.le.AdvertisingSetParameters; import android.bluetooth.le.PeriodicAdvertisingParameters; import androidx.annotation.VisibleForTesting; /** Native interface for AdvertiseManager */ @VisibleForTesting public class AdvertiseManagerNativeInterface { AdvertiseManager mManager; void init(AdvertiseManager manager) { mManager = manager; initializeNative(); } void cleanup() { cleanupNative(); mManager = null; } void startAdvertisingSet( AdvertisingSetParameters parameters, byte[] advertiseDataBytes, byte[] scanResponseBytes, PeriodicAdvertisingParameters periodicParameters, byte[] periodicDataBytes, int duration, int maxExtAdvEvents, int cbId, int serverIf) { startAdvertisingSetNative( parameters, advertiseDataBytes, scanResponseBytes, periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId, serverIf); } void stopAdvertisingSet(int advertiserId) { stopAdvertisingSetNative(advertiserId); } void getOwnAddress(int advertiserId) { getOwnAddressNative(advertiserId); } void enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents) { enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents); } void setAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { setAdvertisingDataNative(advertiserId, advertiseDataBytes); } void setScanResponseData(int advertiserId, byte[] advertiseDataBytes) { setScanResponseDataNative(advertiserId, advertiseDataBytes); } void setAdvertisingParameters(int advertiserId, AdvertisingSetParameters parameters) { setAdvertisingParametersNative(advertiserId, parameters); } void setPeriodicAdvertisingParameters( int advertiserId, PeriodicAdvertisingParameters parameters) { setPeriodicAdvertisingParametersNative(advertiserId, parameters); } void setPeriodicAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { setPeriodicAdvertisingDataNative(advertiserId, advertiseDataBytes); } void setPeriodicAdvertisingEnable(int advertiserId, boolean enable) { setPeriodicAdvertisingEnableNative(advertiserId, enable); } static { classInitNative(); } void onAdvertisingSetStarted(int regId, int advertiserId, int txPower, int status) throws Exception { mManager.onAdvertisingSetStarted(regId, advertiserId, txPower, status); } void onOwnAddressRead(int advertiserId, int addressType, String address) throws Exception { mManager.onOwnAddressRead(advertiserId, addressType, address); } void onAdvertisingEnabled(int advertiserId, boolean enable, int status) throws Exception { mManager.onAdvertisingEnabled(advertiserId, enable, status); } void onAdvertisingDataSet(int advertiserId, int status) throws Exception { mManager.onAdvertisingDataSet(advertiserId, status); } void onScanResponseDataSet(int advertiserId, int status) throws Exception { mManager.onScanResponseDataSet(advertiserId, status); } void onAdvertisingParametersUpdated(int advertiserId, int txPower, int status) throws Exception { mManager.onAdvertisingParametersUpdated(advertiserId, txPower, status); } void onPeriodicAdvertisingParametersUpdated(int advertiserId, int status) throws Exception { mManager.onPeriodicAdvertisingParametersUpdated(advertiserId, status); } void onPeriodicAdvertisingDataSet(int advertiserId, int status) throws Exception { mManager.onPeriodicAdvertisingDataSet(advertiserId, status); } void onPeriodicAdvertisingEnabled(int advertiserId, boolean enable, int status) throws Exception { mManager.onPeriodicAdvertisingEnabled(advertiserId, enable, status); } private static native void classInitNative(); private native void initializeNative(); private native void cleanupNative(); private native void startAdvertisingSetNative( AdvertisingSetParameters parameters, byte[] advertiseData, byte[] scanResponse, PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration, int maxExtAdvEvents, int regId, int serverIf); private native void stopAdvertisingSetNative(int advertiserId); private native void getOwnAddressNative(int advertiserId); private native void enableAdvertisingSetNative( int advertiserId, boolean enable, int duration, int maxExtAdvEvents); private native void setAdvertisingDataNative(int advertiserId, byte[] data); private native void setScanResponseDataNative(int advertiserId, byte[] data); private native void setAdvertisingParametersNative( int advertiserId, AdvertisingSetParameters parameters); private native void setPeriodicAdvertisingParametersNative( int advertiserId, PeriodicAdvertisingParameters parameters); private native void setPeriodicAdvertisingDataNative(int advertiserId, byte[] data); private native void setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable); } android/app/src/com/android/bluetooth/gatt/GattService.java +6 −1 Original line number Diff line number Diff line Loading @@ -341,7 +341,12 @@ public class GattService extends ProfileService { mBluetoothAdapterProxy = BluetoothAdapterProxy.getInstance(); mCompanionManager = getSystemService(CompanionDeviceManager.class); mAppOps = getSystemService(AppOpsManager.class); mAdvertiseManager = new AdvertiseManager(this, mAdapterService, mAdvertiserMap); mAdvertiseManager = new AdvertiseManager( this, new AdvertiseManagerNativeInterface(), mAdapterService, mAdvertiserMap); mAdvertiseManager.start(); mScanManager = GattObjectsFactory.getInstance() Loading android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseManagerTest.java +5 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.bluetooth.gatt; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; Loading Loading @@ -59,6 +58,8 @@ public class AdvertiseManagerTest { @Mock private GattService.AdvertiserMap mAdvertiserMap; @Mock private AdvertiseManagerNativeInterface mNativeInterface; @Mock private IAdvertisingSetCallback mCallback; Loading @@ -74,7 +75,9 @@ public class AdvertiseManagerTest { TestUtils.setAdapterService(mAdapterService); mAdvertiseManager = new AdvertiseManager(mService, mAdapterService, mAdvertiserMap); mAdvertiseManager = new AdvertiseManager(mService, mNativeInterface, mAdapterService, mAdvertiserMap); AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder().build(); AdvertiseData advertiseData = new AdvertiseData.Builder().build(); AdvertiseData scanResponse = new AdvertiseData.Builder().build(); Loading Loading
android/app/jni/com_android_bluetooth_gatt.cpp +4 −4 Original line number Diff line number Diff line Loading @@ -2682,7 +2682,7 @@ static void stopDistanceMeasurementNative(JNIEnv* env, jobject object, * JNI function definitinos */ // JNI functions defined in AdvertiseManager class. // JNI functions defined in AdvertiseManagerNativeInterface class. static JNINativeMethod sAdvertiseMethods[] = { {"classInitNative", "()V", (void*)advertiseClassInitNative}, {"initializeNative", "()V", (void*)advertiseInitializeNative}, Loading @@ -2691,8 +2691,8 @@ static JNINativeMethod sAdvertiseMethods[] = { "(Landroid/bluetooth/le/AdvertisingSetParameters;[B[BLandroid/bluetooth/" "le/PeriodicAdvertisingParameters;[BIIII)V", (void*)startAdvertisingSetNative}, {"getOwnAddressNative", "(I)V", (void*)getOwnAddressNative}, {"stopAdvertisingSetNative", "(I)V", (void*)stopAdvertisingSetNative}, {"getOwnAddressNative", "(I)V", (void*)getOwnAddressNative}, {"enableAdvertisingSetNative", "(IZII)V", (void*)enableAdvertisingSetNative}, {"setAdvertisingDataNative", "(I[B)V", (void*)setAdvertisingDataNative}, Loading Loading @@ -2848,8 +2848,8 @@ int register_com_android_bluetooth_gatt(JNIEnv* env) { env, "com/android/bluetooth/gatt/ScanNativeInterface", sScanMethods, NELEM(sScanMethods)); register_success &= jniRegisterNativeMethods( env, "com/android/bluetooth/gatt/AdvertiseManager", sAdvertiseMethods, NELEM(sAdvertiseMethods)); env, "com/android/bluetooth/gatt/AdvertiseManagerNativeInterface", sAdvertiseMethods, NELEM(sAdvertiseMethods)); register_success &= jniRegisterNativeMethods( env, "com/android/bluetooth/gatt/PeriodicScanManager", sPeriodicScanMethods, NELEM(sPeriodicScanMethods)); Loading
android/app/src/com/android/bluetooth/gatt/AdvertiseManager.java +31 −57 Original line number Diff line number Diff line Loading @@ -51,20 +51,23 @@ public class AdvertiseManager { private final GattService mService; private final AdapterService mAdapterService; private final AdvertiseManagerNativeInterface mNativeInterface; private final AdvertiserMap mAdvertiserMap; private Handler mHandler; Map<IBinder, AdvertiserInfo> mAdvertisers = Collections.synchronizedMap(new HashMap<>()); static int sTempRegistrationId = -1; /** * Constructor of {@link AdvertiseManager}. */ AdvertiseManager(GattService service, AdapterService adapterService, /** Constructor of {@link AdvertiseManager}. */ AdvertiseManager( GattService service, AdvertiseManagerNativeInterface nativeInterface, AdapterService adapterService, AdvertiserMap advertiserMap) { if (DBG) { Log.d(TAG, "advertise manager created"); } mService = service; mNativeInterface = nativeInterface; mAdapterService = adapterService; mAdvertiserMap = advertiserMap; } Loading @@ -73,7 +76,7 @@ public class AdvertiseManager { * Start a {@link HandlerThread} that handles advertising operations. */ void start() { initializeNative(); mNativeInterface.init(this); HandlerThread thread = new HandlerThread("BluetoothAdvertiseManager"); thread.start(); mHandler = new Handler(thread.getLooper()); Loading @@ -83,7 +86,7 @@ public class AdvertiseManager { if (DBG) { Log.d(TAG, "cleanup()"); } cleanupNative(); mNativeInterface.cleanup(); mAdvertisers.clear(); sTempRegistrationId = -1; Loading Loading @@ -157,7 +160,7 @@ public class AdvertiseManager { if (entry == null) { Log.i(TAG, "onAdvertisingSetStarted() - no callback found for regId " + regId); // Advertising set was stopped before it was properly registered. stopAdvertisingSetNative(advertiserId); mNativeInterface.stopAdvertisingSet(advertiserId); return; } Loading Loading @@ -252,8 +255,15 @@ public class AdvertiseManager { mAdvertiserMap.recordAdvertiseStart(cbId, parameters, advertiseData, scanResponse, periodicParameters, periodicData, duration, maxExtAdvEvents); startAdvertisingSetNative(parameters, advDataBytes, scanResponseBytes, periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId, mNativeInterface.startAdvertisingSet( parameters, advDataBytes, scanResponseBytes, periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId, serverIf); } catch (IllegalArgumentException e) { Loading Loading @@ -289,7 +299,7 @@ public class AdvertiseManager { Log.w(TAG, "getOwnAddress() - bad advertiserId " + advertiserId); return; } getOwnAddressNative(advertiserId); mNativeInterface.getOwnAddress(advertiserId); } void stopAdvertisingSet(IAdvertisingSetCallback callback) { Loading @@ -313,7 +323,7 @@ public class AdvertiseManager { return; } stopAdvertisingSetNative(advertiserId); mNativeInterface.stopAdvertisingSet(advertiserId); try { callback.onAdvertisingSetStopped(advertiserId); Loading @@ -330,7 +340,7 @@ public class AdvertiseManager { Log.w(TAG, "enableAdvertisingSet() - bad advertiserId " + advertiserId); return; } enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents); mNativeInterface.enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents); mAdvertiserMap.enableAdvertisingSet(advertiserId, enable, duration, maxExtAdvEvents); Loading @@ -344,8 +354,8 @@ public class AdvertiseManager { } String deviceName = AdapterService.getAdapterService().getName(); try { setAdvertisingDataNative(advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mNativeInterface.setAdvertisingData( advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mAdvertiserMap.setAdvertisingData(advertiserId, data); } catch (IllegalArgumentException e) { Loading @@ -366,8 +376,8 @@ public class AdvertiseManager { } String deviceName = AdapterService.getAdapterService().getName(); try { setScanResponseDataNative(advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mNativeInterface.setScanResponseData( advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mAdvertiserMap.setScanResponseData(advertiserId, data); } catch (IllegalArgumentException e) { Loading @@ -386,7 +396,7 @@ public class AdvertiseManager { Log.w(TAG, "setAdvertisingParameters() - bad advertiserId " + advertiserId); return; } setAdvertisingParametersNative(advertiserId, parameters); mNativeInterface.setAdvertisingParameters(advertiserId, parameters); mAdvertiserMap.setAdvertisingParameters(advertiserId, parameters); } Loading @@ -398,7 +408,7 @@ public class AdvertiseManager { Log.w(TAG, "setPeriodicAdvertisingParameters() - bad advertiserId " + advertiserId); return; } setPeriodicAdvertisingParametersNative(advertiserId, parameters); mNativeInterface.setPeriodicAdvertisingParameters(advertiserId, parameters); mAdvertiserMap.setPeriodicAdvertisingParameters(advertiserId, parameters); } Loading @@ -411,8 +421,8 @@ public class AdvertiseManager { } String deviceName = AdapterService.getAdapterService().getName(); try { setPeriodicAdvertisingDataNative(advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mNativeInterface.setPeriodicAdvertisingData( advertiserId, AdvertiseHelper.advertiseDataToBytes(data, deviceName)); mAdvertiserMap.setPeriodicAdvertisingData(advertiserId, data); } catch (IllegalArgumentException e) { Loading @@ -431,7 +441,7 @@ public class AdvertiseManager { Log.w(TAG, "setPeriodicAdvertisingEnable() - bad advertiserId " + advertiserId); return; } setPeriodicAdvertisingEnableNative(advertiserId, enable); mNativeInterface.setPeriodicAdvertisingEnable(advertiserId, enable); } void onAdvertisingDataSet(int advertiserId, int status) throws Exception { Loading Loading @@ -538,40 +548,4 @@ public class AdvertiseManager { stats.onPeriodicAdvertiseEnabled(enable); } } static { classInitNative(); } private static native void classInitNative(); private native void initializeNative(); private native void cleanupNative(); private native void startAdvertisingSetNative(AdvertisingSetParameters parameters, byte[] advertiseData, byte[] scanResponse, PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration, int maxExtAdvEvents, int regId, int serverIf); private native void getOwnAddressNative(int advertiserId); private native void stopAdvertisingSetNative(int advertiserId); private native void enableAdvertisingSetNative(int advertiserId, boolean enable, int duration, int maxExtAdvEvents); private native void setAdvertisingDataNative(int advertiserId, byte[] data); private native void setScanResponseDataNative(int advertiserId, byte[] data); private native void setAdvertisingParametersNative(int advertiserId, AdvertisingSetParameters parameters); private native void setPeriodicAdvertisingParametersNative(int advertiserId, PeriodicAdvertisingParameters parameters); private native void setPeriodicAdvertisingDataNative(int advertiserId, byte[] data); private native void setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable); }
android/app/src/com/android/bluetooth/gatt/AdvertiseManagerNativeInterface.java 0 → 100644 +178 −0 Original line number Diff line number Diff line /* * Copyright (C) 2023 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.bluetooth.gatt; import android.bluetooth.le.AdvertisingSetParameters; import android.bluetooth.le.PeriodicAdvertisingParameters; import androidx.annotation.VisibleForTesting; /** Native interface for AdvertiseManager */ @VisibleForTesting public class AdvertiseManagerNativeInterface { AdvertiseManager mManager; void init(AdvertiseManager manager) { mManager = manager; initializeNative(); } void cleanup() { cleanupNative(); mManager = null; } void startAdvertisingSet( AdvertisingSetParameters parameters, byte[] advertiseDataBytes, byte[] scanResponseBytes, PeriodicAdvertisingParameters periodicParameters, byte[] periodicDataBytes, int duration, int maxExtAdvEvents, int cbId, int serverIf) { startAdvertisingSetNative( parameters, advertiseDataBytes, scanResponseBytes, periodicParameters, periodicDataBytes, duration, maxExtAdvEvents, cbId, serverIf); } void stopAdvertisingSet(int advertiserId) { stopAdvertisingSetNative(advertiserId); } void getOwnAddress(int advertiserId) { getOwnAddressNative(advertiserId); } void enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents) { enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents); } void setAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { setAdvertisingDataNative(advertiserId, advertiseDataBytes); } void setScanResponseData(int advertiserId, byte[] advertiseDataBytes) { setScanResponseDataNative(advertiserId, advertiseDataBytes); } void setAdvertisingParameters(int advertiserId, AdvertisingSetParameters parameters) { setAdvertisingParametersNative(advertiserId, parameters); } void setPeriodicAdvertisingParameters( int advertiserId, PeriodicAdvertisingParameters parameters) { setPeriodicAdvertisingParametersNative(advertiserId, parameters); } void setPeriodicAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { setPeriodicAdvertisingDataNative(advertiserId, advertiseDataBytes); } void setPeriodicAdvertisingEnable(int advertiserId, boolean enable) { setPeriodicAdvertisingEnableNative(advertiserId, enable); } static { classInitNative(); } void onAdvertisingSetStarted(int regId, int advertiserId, int txPower, int status) throws Exception { mManager.onAdvertisingSetStarted(regId, advertiserId, txPower, status); } void onOwnAddressRead(int advertiserId, int addressType, String address) throws Exception { mManager.onOwnAddressRead(advertiserId, addressType, address); } void onAdvertisingEnabled(int advertiserId, boolean enable, int status) throws Exception { mManager.onAdvertisingEnabled(advertiserId, enable, status); } void onAdvertisingDataSet(int advertiserId, int status) throws Exception { mManager.onAdvertisingDataSet(advertiserId, status); } void onScanResponseDataSet(int advertiserId, int status) throws Exception { mManager.onScanResponseDataSet(advertiserId, status); } void onAdvertisingParametersUpdated(int advertiserId, int txPower, int status) throws Exception { mManager.onAdvertisingParametersUpdated(advertiserId, txPower, status); } void onPeriodicAdvertisingParametersUpdated(int advertiserId, int status) throws Exception { mManager.onPeriodicAdvertisingParametersUpdated(advertiserId, status); } void onPeriodicAdvertisingDataSet(int advertiserId, int status) throws Exception { mManager.onPeriodicAdvertisingDataSet(advertiserId, status); } void onPeriodicAdvertisingEnabled(int advertiserId, boolean enable, int status) throws Exception { mManager.onPeriodicAdvertisingEnabled(advertiserId, enable, status); } private static native void classInitNative(); private native void initializeNative(); private native void cleanupNative(); private native void startAdvertisingSetNative( AdvertisingSetParameters parameters, byte[] advertiseData, byte[] scanResponse, PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration, int maxExtAdvEvents, int regId, int serverIf); private native void stopAdvertisingSetNative(int advertiserId); private native void getOwnAddressNative(int advertiserId); private native void enableAdvertisingSetNative( int advertiserId, boolean enable, int duration, int maxExtAdvEvents); private native void setAdvertisingDataNative(int advertiserId, byte[] data); private native void setScanResponseDataNative(int advertiserId, byte[] data); private native void setAdvertisingParametersNative( int advertiserId, AdvertisingSetParameters parameters); private native void setPeriodicAdvertisingParametersNative( int advertiserId, PeriodicAdvertisingParameters parameters); private native void setPeriodicAdvertisingDataNative(int advertiserId, byte[] data); private native void setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable); }
android/app/src/com/android/bluetooth/gatt/GattService.java +6 −1 Original line number Diff line number Diff line Loading @@ -341,7 +341,12 @@ public class GattService extends ProfileService { mBluetoothAdapterProxy = BluetoothAdapterProxy.getInstance(); mCompanionManager = getSystemService(CompanionDeviceManager.class); mAppOps = getSystemService(AppOpsManager.class); mAdvertiseManager = new AdvertiseManager(this, mAdapterService, mAdvertiserMap); mAdvertiseManager = new AdvertiseManager( this, new AdvertiseManagerNativeInterface(), mAdapterService, mAdvertiserMap); mAdvertiseManager.start(); mScanManager = GattObjectsFactory.getInstance() Loading
android/app/tests/unit/src/com/android/bluetooth/gatt/AdvertiseManagerTest.java +5 −2 Original line number Diff line number Diff line Loading @@ -16,7 +16,6 @@ package com.android.bluetooth.gatt; import static com.google.common.truth.Truth.assertThat; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; Loading Loading @@ -59,6 +58,8 @@ public class AdvertiseManagerTest { @Mock private GattService.AdvertiserMap mAdvertiserMap; @Mock private AdvertiseManagerNativeInterface mNativeInterface; @Mock private IAdvertisingSetCallback mCallback; Loading @@ -74,7 +75,9 @@ public class AdvertiseManagerTest { TestUtils.setAdapterService(mAdapterService); mAdvertiseManager = new AdvertiseManager(mService, mAdapterService, mAdvertiserMap); mAdvertiseManager = new AdvertiseManager(mService, mNativeInterface, mAdapterService, mAdvertiserMap); AdvertisingSetParameters parameters = new AdvertisingSetParameters.Builder().build(); AdvertiseData advertiseData = new AdvertiseData.Builder().build(); AdvertiseData scanResponse = new AdvertiseData.Builder().build(); Loading