1 /* 2 * Copyright (C) 2023 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.bluetooth.gatt; 18 19 import android.bluetooth.le.AdvertisingSetParameters; 20 import android.bluetooth.le.PeriodicAdvertisingParameters; 21 22 import androidx.annotation.VisibleForTesting; 23 24 import com.android.internal.annotations.GuardedBy; 25 26 /** Native interface for AdvertiseManager */ 27 @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) 28 public class AdvertiseManagerNativeInterface { 29 private static final String TAG = AdvertiseManagerNativeInterface.class.getSimpleName(); 30 31 @GuardedBy("INSTANCE_LOCK") 32 private static AdvertiseManagerNativeInterface sInstance; 33 34 private static final Object INSTANCE_LOCK = new Object(); 35 36 private AdvertiseManager mManager; 37 38 /** Get singleton instance. */ getInstance()39 static AdvertiseManagerNativeInterface getInstance() { 40 synchronized (INSTANCE_LOCK) { 41 if (sInstance == null) { 42 sInstance = new AdvertiseManagerNativeInterface(); 43 } 44 return sInstance; 45 } 46 } 47 48 /** Set singleton instance. */ 49 @VisibleForTesting setInstance(AdvertiseManagerNativeInterface instance)50 public static void setInstance(AdvertiseManagerNativeInterface instance) { 51 synchronized (INSTANCE_LOCK) { 52 sInstance = instance; 53 } 54 } 55 init(AdvertiseManager manager)56 void init(AdvertiseManager manager) { 57 mManager = manager; 58 initializeNative(); 59 } 60 cleanup()61 void cleanup() { 62 cleanupNative(); 63 mManager = null; 64 } 65 startAdvertisingSet( AdvertisingSetParameters parameters, byte[] advertiseDataBytes, byte[] scanResponseBytes, PeriodicAdvertisingParameters periodicParameters, byte[] periodicDataBytes, int duration, int maxExtAdvEvents, int cbId, int serverIf)66 void startAdvertisingSet( 67 AdvertisingSetParameters parameters, 68 byte[] advertiseDataBytes, 69 byte[] scanResponseBytes, 70 PeriodicAdvertisingParameters periodicParameters, 71 byte[] periodicDataBytes, 72 int duration, 73 int maxExtAdvEvents, 74 int cbId, 75 int serverIf) { 76 startAdvertisingSetNative( 77 parameters, 78 advertiseDataBytes, 79 scanResponseBytes, 80 periodicParameters, 81 periodicDataBytes, 82 duration, 83 maxExtAdvEvents, 84 cbId, 85 serverIf); 86 } 87 stopAdvertisingSet(int advertiserId)88 void stopAdvertisingSet(int advertiserId) { 89 stopAdvertisingSetNative(advertiserId); 90 } 91 getOwnAddress(int advertiserId)92 void getOwnAddress(int advertiserId) { 93 getOwnAddressNative(advertiserId); 94 } 95 enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents)96 void enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents) { 97 enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents); 98 } 99 setAdvertisingData(int advertiserId, byte[] advertiseDataBytes)100 void setAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { 101 setAdvertisingDataNative(advertiserId, advertiseDataBytes); 102 } 103 setScanResponseData(int advertiserId, byte[] advertiseDataBytes)104 void setScanResponseData(int advertiserId, byte[] advertiseDataBytes) { 105 setScanResponseDataNative(advertiserId, advertiseDataBytes); 106 } 107 setAdvertisingParameters(int advertiserId, AdvertisingSetParameters parameters)108 void setAdvertisingParameters(int advertiserId, AdvertisingSetParameters parameters) { 109 setAdvertisingParametersNative(advertiserId, parameters); 110 } 111 setPeriodicAdvertisingParameters( int advertiserId, PeriodicAdvertisingParameters parameters)112 void setPeriodicAdvertisingParameters( 113 int advertiserId, PeriodicAdvertisingParameters parameters) { 114 setPeriodicAdvertisingParametersNative(advertiserId, parameters); 115 } 116 setPeriodicAdvertisingData(int advertiserId, byte[] advertiseDataBytes)117 void setPeriodicAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { 118 setPeriodicAdvertisingDataNative(advertiserId, advertiseDataBytes); 119 } 120 setPeriodicAdvertisingEnable(int advertiserId, boolean enable)121 void setPeriodicAdvertisingEnable(int advertiserId, boolean enable) { 122 setPeriodicAdvertisingEnableNative(advertiserId, enable); 123 } 124 onAdvertisingSetStarted(int regId, int advertiserId, int txPower, int status)125 void onAdvertisingSetStarted(int regId, int advertiserId, int txPower, int status) { 126 mManager.doOnAdvertiseThread( 127 () -> mManager.onAdvertisingSetStarted(regId, advertiserId, txPower, status)); 128 } 129 onOwnAddressRead(int advertiserId, int addressType, String address)130 void onOwnAddressRead(int advertiserId, int addressType, String address) { 131 mManager.doOnAdvertiseThread( 132 () -> mManager.onOwnAddressRead(advertiserId, addressType, address)); 133 } 134 onAdvertisingEnabled(int advertiserId, boolean enable, int status)135 void onAdvertisingEnabled(int advertiserId, boolean enable, int status) { 136 mManager.doOnAdvertiseThread( 137 () -> mManager.onAdvertisingEnabled(advertiserId, enable, status)); 138 } 139 onAdvertisingDataSet(int advertiserId, int status)140 void onAdvertisingDataSet(int advertiserId, int status) { 141 mManager.doOnAdvertiseThread(() -> mManager.onAdvertisingDataSet(advertiserId, status)); 142 } 143 onScanResponseDataSet(int advertiserId, int status)144 void onScanResponseDataSet(int advertiserId, int status) { 145 mManager.doOnAdvertiseThread(() -> mManager.onScanResponseDataSet(advertiserId, status)); 146 } 147 onAdvertisingParametersUpdated(int advertiserId, int txPower, int status)148 void onAdvertisingParametersUpdated(int advertiserId, int txPower, int status) { 149 mManager.doOnAdvertiseThread( 150 () -> mManager.onAdvertisingParametersUpdated(advertiserId, txPower, status)); 151 } 152 onPeriodicAdvertisingParametersUpdated(int advertiserId, int status)153 void onPeriodicAdvertisingParametersUpdated(int advertiserId, int status) { 154 mManager.doOnAdvertiseThread( 155 () -> mManager.onPeriodicAdvertisingParametersUpdated(advertiserId, status)); 156 } 157 onPeriodicAdvertisingDataSet(int advertiserId, int status)158 void onPeriodicAdvertisingDataSet(int advertiserId, int status) { 159 mManager.doOnAdvertiseThread( 160 () -> mManager.onPeriodicAdvertisingDataSet(advertiserId, status)); 161 } 162 onPeriodicAdvertisingEnabled(int advertiserId, boolean enable, int status)163 void onPeriodicAdvertisingEnabled(int advertiserId, boolean enable, int status) { 164 mManager.doOnAdvertiseThread( 165 () -> mManager.onPeriodicAdvertisingEnabled(advertiserId, enable, status)); 166 } 167 initializeNative()168 private native void initializeNative(); 169 cleanupNative()170 private native void cleanupNative(); 171 startAdvertisingSetNative( AdvertisingSetParameters parameters, byte[] advertiseData, byte[] scanResponse, PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration, int maxExtAdvEvents, int regId, int serverIf)172 private native void startAdvertisingSetNative( 173 AdvertisingSetParameters parameters, 174 byte[] advertiseData, 175 byte[] scanResponse, 176 PeriodicAdvertisingParameters periodicParameters, 177 byte[] periodicData, 178 int duration, 179 int maxExtAdvEvents, 180 int regId, 181 int serverIf); 182 stopAdvertisingSetNative(int advertiserId)183 private native void stopAdvertisingSetNative(int advertiserId); 184 getOwnAddressNative(int advertiserId)185 private native void getOwnAddressNative(int advertiserId); 186 enableAdvertisingSetNative( int advertiserId, boolean enable, int duration, int maxExtAdvEvents)187 private native void enableAdvertisingSetNative( 188 int advertiserId, boolean enable, int duration, int maxExtAdvEvents); 189 setAdvertisingDataNative(int advertiserId, byte[] data)190 private native void setAdvertisingDataNative(int advertiserId, byte[] data); 191 setScanResponseDataNative(int advertiserId, byte[] data)192 private native void setScanResponseDataNative(int advertiserId, byte[] data); 193 setAdvertisingParametersNative( int advertiserId, AdvertisingSetParameters parameters)194 private native void setAdvertisingParametersNative( 195 int advertiserId, AdvertisingSetParameters parameters); 196 setPeriodicAdvertisingParametersNative( int advertiserId, PeriodicAdvertisingParameters parameters)197 private native void setPeriodicAdvertisingParametersNative( 198 int advertiserId, PeriodicAdvertisingParameters parameters); 199 setPeriodicAdvertisingDataNative(int advertiserId, byte[] data)200 private native void setPeriodicAdvertisingDataNative(int advertiserId, byte[] data); 201 setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable)202 private native void setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable); 203 } 204