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 com.android.internal.annotations.GuardedBy; 23 import com.android.internal.annotations.VisibleForTesting; 24 25 /** Native interface for AdvertiseManager */ 26 @VisibleForTesting 27 public class AdvertiseManagerNativeInterface { 28 private static final String TAG = AdvertiseManagerNativeInterface.class.getSimpleName(); 29 30 @GuardedBy("INSTANCE_LOCK") 31 private static AdvertiseManagerNativeInterface sInstance; 32 33 private static final Object INSTANCE_LOCK = new Object(); 34 35 private AdvertiseManager mManager; 36 37 /** Get singleton instance. */ getInstance()38 public static AdvertiseManagerNativeInterface getInstance() { 39 synchronized (INSTANCE_LOCK) { 40 if (sInstance == null) { 41 sInstance = new AdvertiseManagerNativeInterface(); 42 } 43 return sInstance; 44 } 45 } 46 47 /** Set singleton instance. */ 48 @VisibleForTesting setInstance(AdvertiseManagerNativeInterface instance)49 public static void setInstance(AdvertiseManagerNativeInterface instance) { 50 synchronized (INSTANCE_LOCK) { 51 sInstance = instance; 52 } 53 } 54 init(AdvertiseManager manager)55 void init(AdvertiseManager manager) { 56 mManager = manager; 57 initializeNative(); 58 } 59 cleanup()60 void cleanup() { 61 cleanupNative(); 62 mManager = null; 63 } 64 startAdvertisingSet( AdvertisingSetParameters parameters, byte[] advertiseDataBytes, byte[] scanResponseBytes, PeriodicAdvertisingParameters periodicParameters, byte[] periodicDataBytes, int duration, int maxExtAdvEvents, int cbId, int serverIf)65 void startAdvertisingSet( 66 AdvertisingSetParameters parameters, 67 byte[] advertiseDataBytes, 68 byte[] scanResponseBytes, 69 PeriodicAdvertisingParameters periodicParameters, 70 byte[] periodicDataBytes, 71 int duration, 72 int maxExtAdvEvents, 73 int cbId, 74 int serverIf) { 75 startAdvertisingSetNative( 76 parameters, 77 advertiseDataBytes, 78 scanResponseBytes, 79 periodicParameters, 80 periodicDataBytes, 81 duration, 82 maxExtAdvEvents, 83 cbId, 84 serverIf); 85 } 86 stopAdvertisingSet(int advertiserId)87 void stopAdvertisingSet(int advertiserId) { 88 stopAdvertisingSetNative(advertiserId); 89 } 90 getOwnAddress(int advertiserId)91 void getOwnAddress(int advertiserId) { 92 getOwnAddressNative(advertiserId); 93 } 94 enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents)95 void enableAdvertisingSet(int advertiserId, boolean enable, int duration, int maxExtAdvEvents) { 96 enableAdvertisingSetNative(advertiserId, enable, duration, maxExtAdvEvents); 97 } 98 setAdvertisingData(int advertiserId, byte[] advertiseDataBytes)99 void setAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { 100 setAdvertisingDataNative(advertiserId, advertiseDataBytes); 101 } 102 setScanResponseData(int advertiserId, byte[] advertiseDataBytes)103 void setScanResponseData(int advertiserId, byte[] advertiseDataBytes) { 104 setScanResponseDataNative(advertiserId, advertiseDataBytes); 105 } 106 setAdvertisingParameters(int advertiserId, AdvertisingSetParameters parameters)107 void setAdvertisingParameters(int advertiserId, AdvertisingSetParameters parameters) { 108 setAdvertisingParametersNative(advertiserId, parameters); 109 } 110 setPeriodicAdvertisingParameters( int advertiserId, PeriodicAdvertisingParameters parameters)111 void setPeriodicAdvertisingParameters( 112 int advertiserId, PeriodicAdvertisingParameters parameters) { 113 setPeriodicAdvertisingParametersNative(advertiserId, parameters); 114 } 115 setPeriodicAdvertisingData(int advertiserId, byte[] advertiseDataBytes)116 void setPeriodicAdvertisingData(int advertiserId, byte[] advertiseDataBytes) { 117 setPeriodicAdvertisingDataNative(advertiserId, advertiseDataBytes); 118 } 119 setPeriodicAdvertisingEnable(int advertiserId, boolean enable)120 void setPeriodicAdvertisingEnable(int advertiserId, boolean enable) { 121 setPeriodicAdvertisingEnableNative(advertiserId, enable); 122 } 123 onAdvertisingSetStarted(int regId, int advertiserId, int txPower, int status)124 void onAdvertisingSetStarted(int regId, int advertiserId, int txPower, int status) 125 throws Exception { 126 mManager.onAdvertisingSetStarted(regId, advertiserId, txPower, status); 127 } 128 onOwnAddressRead(int advertiserId, int addressType, String address)129 void onOwnAddressRead(int advertiserId, int addressType, String address) throws Exception { 130 mManager.onOwnAddressRead(advertiserId, addressType, address); 131 } 132 onAdvertisingEnabled(int advertiserId, boolean enable, int status)133 void onAdvertisingEnabled(int advertiserId, boolean enable, int status) throws Exception { 134 mManager.onAdvertisingEnabled(advertiserId, enable, status); 135 } 136 onAdvertisingDataSet(int advertiserId, int status)137 void onAdvertisingDataSet(int advertiserId, int status) throws Exception { 138 mManager.onAdvertisingDataSet(advertiserId, status); 139 } 140 onScanResponseDataSet(int advertiserId, int status)141 void onScanResponseDataSet(int advertiserId, int status) throws Exception { 142 mManager.onScanResponseDataSet(advertiserId, status); 143 } 144 onAdvertisingParametersUpdated(int advertiserId, int txPower, int status)145 void onAdvertisingParametersUpdated(int advertiserId, int txPower, int status) 146 throws Exception { 147 mManager.onAdvertisingParametersUpdated(advertiserId, txPower, status); 148 } 149 onPeriodicAdvertisingParametersUpdated(int advertiserId, int status)150 void onPeriodicAdvertisingParametersUpdated(int advertiserId, int status) throws Exception { 151 mManager.onPeriodicAdvertisingParametersUpdated(advertiserId, status); 152 } 153 onPeriodicAdvertisingDataSet(int advertiserId, int status)154 void onPeriodicAdvertisingDataSet(int advertiserId, int status) throws Exception { 155 mManager.onPeriodicAdvertisingDataSet(advertiserId, status); 156 } 157 onPeriodicAdvertisingEnabled(int advertiserId, boolean enable, int status)158 void onPeriodicAdvertisingEnabled(int advertiserId, boolean enable, int status) 159 throws Exception { 160 mManager.onPeriodicAdvertisingEnabled(advertiserId, enable, status); 161 } 162 initializeNative()163 private native void initializeNative(); 164 cleanupNative()165 private native void cleanupNative(); 166 startAdvertisingSetNative( AdvertisingSetParameters parameters, byte[] advertiseData, byte[] scanResponse, PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int duration, int maxExtAdvEvents, int regId, int serverIf)167 private native void startAdvertisingSetNative( 168 AdvertisingSetParameters parameters, 169 byte[] advertiseData, 170 byte[] scanResponse, 171 PeriodicAdvertisingParameters periodicParameters, 172 byte[] periodicData, 173 int duration, 174 int maxExtAdvEvents, 175 int regId, 176 int serverIf); 177 stopAdvertisingSetNative(int advertiserId)178 private native void stopAdvertisingSetNative(int advertiserId); 179 getOwnAddressNative(int advertiserId)180 private native void getOwnAddressNative(int advertiserId); 181 enableAdvertisingSetNative( int advertiserId, boolean enable, int duration, int maxExtAdvEvents)182 private native void enableAdvertisingSetNative( 183 int advertiserId, boolean enable, int duration, int maxExtAdvEvents); 184 setAdvertisingDataNative(int advertiserId, byte[] data)185 private native void setAdvertisingDataNative(int advertiserId, byte[] data); 186 setScanResponseDataNative(int advertiserId, byte[] data)187 private native void setScanResponseDataNative(int advertiserId, byte[] data); 188 setAdvertisingParametersNative( int advertiserId, AdvertisingSetParameters parameters)189 private native void setAdvertisingParametersNative( 190 int advertiserId, AdvertisingSetParameters parameters); 191 setPeriodicAdvertisingParametersNative( int advertiserId, PeriodicAdvertisingParameters parameters)192 private native void setPeriodicAdvertisingParametersNative( 193 int advertiserId, PeriodicAdvertisingParameters parameters); 194 setPeriodicAdvertisingDataNative(int advertiserId, byte[] data)195 private native void setPeriodicAdvertisingDataNative(int advertiserId, byte[] data); 196 setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable)197 private native void setPeriodicAdvertisingEnableNative(int advertiserId, boolean enable); 198 } 199