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