AdvertiseManager.java revision 917f34e18aa235e68ac0663e24f52100e95970b7
127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang/* 2917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski * Copyright (C) 2017 The Android Open Source Project 327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * 427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * Licensed under the Apache License, Version 2.0 (the "License"); 527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * you may not use this file except in compliance with the License. 627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * You may obtain a copy of the License at 727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * 827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * http://www.apache.org/licenses/LICENSE-2.0 927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * 1027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * Unless required by applicable law or agreed to in writing, software 1127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * distributed under the License is distributed on an "AS IS" BASIS, 1227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * See the License for the specific language governing permissions and 1427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * limitations under the License. 1527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang */ 1627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 1727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangpackage com.android.bluetooth.gatt; 1827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 19917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport android.bluetooth.le.AdvertiseData; 20917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport android.bluetooth.le.AdvertisingSetParameters; 21917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport android.bluetooth.le.IAdvertisingSetCallback; 22917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport android.bluetooth.le.PeriodicAdvertisingParameters; 2327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport android.os.Handler; 2427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport android.os.HandlerThread; 25917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport android.os.IBinder; 26917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport android.os.IInterface; 2727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport android.os.Looper; 2827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport android.os.Message; 2927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport android.os.RemoteException; 3027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport android.util.Log; 3127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport com.android.bluetooth.Utils; 3227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport com.android.bluetooth.btservice.AdapterService; 33917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport java.util.Collections; 34917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport java.util.HashMap; 3527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport java.util.HashSet; 36917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowskiimport java.util.Map; 3727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport java.util.Set; 3827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport java.util.UUID; 3927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport java.util.concurrent.CountDownLatch; 4027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangimport java.util.concurrent.TimeUnit; 4127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 4227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang/** 43a1664d61821a59145f8095a75373403a0c54244eWei Wang * Manages Bluetooth LE advertising operations and interacts with bluedroid stack. TODO: add tests. 4427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * 4527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * @hide 4627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang */ 4727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wangclass AdvertiseManager { 4827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang private static final boolean DBG = GattServiceConfig.DBG; 4927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang private static final String TAG = GattServiceConfig.TAG_PREFIX + "AdvertiseManager"; 5027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 5127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang private final GattService mService; 52a1664d61821a59145f8095a75373403a0c54244eWei Wang private final AdapterService mAdapterService; 53917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski private Handler mHandler; 54917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Map<IBinder, AdvertiserInfo> mAdvertisers = Collections.synchronizedMap(new HashMap<>()); 55917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski static int sTempRegistrationId = -1; 5627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 5727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang /** 5827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * Constructor of {@link AdvertiseManager}. 5927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang */ 60a1664d61821a59145f8095a75373403a0c54244eWei Wang AdvertiseManager(GattService service, AdapterService adapterService) { 6127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang logd("advertise manager created"); 62a1664d61821a59145f8095a75373403a0c54244eWei Wang mService = service; 63a1664d61821a59145f8095a75373403a0c54244eWei Wang mAdapterService = adapterService; 6427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 6527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 6627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang /** 6727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang * Start a {@link HandlerThread} that handles advertising operations. 6827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang */ 6927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang void start() { 70917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski initializeNative(); 7127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang HandlerThread thread = new HandlerThread("BluetoothAdvertiseManager"); 7227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang thread.start(); 73917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski mHandler = new Handler(thread.getLooper()); 7427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 7527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 7627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang void cleanup() { 77917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski logd("cleanup()"); 78917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski cleanupNative(); 79917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski mAdvertisers.clear(); 80917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski sTempRegistrationId = -1; 81ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra 82ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra if (mHandler != null) { 83ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra // Shut down the thread 84ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra mHandler.removeCallbacksAndMessages(null); 85ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra Looper looper = mHandler.getLooper(); 86ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra if (looper != null) { 87ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra looper.quit(); 88ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra } 89ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra mHandler = null; 90ba73d4b554ff0016d6b11a6102c2a75b5b0c149dMatadeen Mishra } 9127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 9227bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 93917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski class AdvertiserInfo { 94917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski /* When id is negative, the registration is ongoing. When the registration finishes, id 95917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski * becomes equal to advertiser_id */ 96917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski public Integer id; 97917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski public AdvertisingSetDeathRecipient deathRecipient; 98917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski public IAdvertisingSetCallback callback; 99917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 100917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski AdvertiserInfo(Integer id, AdvertisingSetDeathRecipient deathRecipient, 101917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IAdvertisingSetCallback callback) { 102917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski this.id = id; 103917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski this.deathRecipient = deathRecipient; 104917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski this.callback = callback; 1057bdbdb9c5c81e08957c442f91d70fb34d8b34ddeJakub Pawlowski } 10664bf8e33481bb787aec895c603748eedb634a93bJakub Pawlowski } 10764bf8e33481bb787aec895c603748eedb634a93bJakub Pawlowski 108917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IBinder toBinder(IAdvertisingSetCallback e) { 109917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski return ((IInterface) e).asBinder(); 11027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 11127bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 112917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski class AdvertisingSetDeathRecipient implements IBinder.DeathRecipient { 113917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IAdvertisingSetCallback callback; 114917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 115917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski public AdvertisingSetDeathRecipient(IAdvertisingSetCallback callback) { 116917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski this.callback = callback; 11727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 11827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 119917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski @Override 120917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski public void binderDied() { 121917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (DBG) Log.d(TAG, "Binder is dead - unregistering advertising set"); 122917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski stopAdvertisingSet(callback); 12327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 12427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 12527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 126917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Map.Entry<IBinder, AdvertiserInfo> findAdvertiser(int advertiser_id) { 127917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Map.Entry<IBinder, AdvertiserInfo> entry = null; 128917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski for (Map.Entry<IBinder, AdvertiserInfo> e : mAdvertisers.entrySet()) { 129917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (e.getValue().id == advertiser_id) { 130917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski entry = e; 131917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski break; 13218999c2cfd477050de0ca88c3a73458235d82656Wei Wang } 13318999c2cfd477050de0ca88c3a73458235d82656Wei Wang } 134917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski return entry; 13518999c2cfd477050de0ca88c3a73458235d82656Wei Wang } 13618999c2cfd477050de0ca88c3a73458235d82656Wei Wang 137917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski void onAdvertisingSetStarted(int reg_id, int advertiser_id, int status) throws Exception { 138917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (DBG) 139917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Log.d(TAG, "onAdvertisingSetStarted() - reg_id=" + reg_id + ", advertiser_id=" 140917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski + advertiser_id + ", status=" + status); 141917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 142917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Map.Entry<IBinder, AdvertiserInfo> entry = findAdvertiser(reg_id); 14327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 144917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (entry == null) { 145917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Log.i(TAG, "onAdvertisingSetStarted() - no callback found for reg_id " + reg_id); 146917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski // Advertising set was stopped before it was properly registered. 147917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski stopAdvertisingSetNative(advertiser_id); 148917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski return; 14927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 15027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 151917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IAdvertisingSetCallback callback = entry.getValue().callback; 152917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (status == 0) { 153917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski entry.setValue( 154917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski new AdvertiserInfo(advertiser_id, entry.getValue().deathRecipient, callback)); 155917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski } else { 156917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IBinder binder = entry.getKey(); 157917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski binder.unlinkToDeath(entry.getValue().deathRecipient, 0); 158917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski mAdvertisers.remove(binder); 15927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 16027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 161917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski callback.onAdvertisingSetStarted(advertiser_id, status); 162917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski } 16327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 164917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski void onAdvertisingSetEnabled(int advertiser_id, boolean enable, int status) throws Exception { 165917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski logd("onAdvertisingSetEnabled() - advertiser_id=" + advertiser_id + ", enable=" + enable 166917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski + ", status=" + status); 16727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 168917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Map.Entry<IBinder, AdvertiserInfo> entry = findAdvertiser(advertiser_id); 169917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (entry == null) { 170917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Log.i(TAG, "onAdvertisingSetEnable() - no callback found for advertiser_id " 171917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski + advertiser_id); 172917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski return; 17327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 174917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 175917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IAdvertisingSetCallback callback = entry.getValue().callback; 176917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski callback.onAdvertisingEnabled(advertiser_id, enable, status); 17727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 17827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 179917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski void startAdvertisingSet(AdvertisingSetParameters parameters, AdvertiseData advertiseData, 180917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski AdvertiseData scanResponse, PeriodicAdvertisingParameters periodicParameters, 181917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski AdvertiseData periodicData, IAdvertisingSetCallback callback) { 182917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski AdvertisingSetDeathRecipient deathRecipient = new AdvertisingSetDeathRecipient(callback); 183917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IBinder binder = toBinder(callback); 184917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski try { 185917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski binder.linkToDeath(deathRecipient, 0); 186917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski } catch (RemoteException e) { 187917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski throw new IllegalArgumentException("Can't link to advertiser's death"); 18827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 18927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 190917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski String deviceName = AdapterService.getAdapterService().getName(); 191917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski byte[] adv_data = AdvertiseHelper.advertiseDataToBytes(advertiseData, deviceName); 192917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski byte[] scan_response = AdvertiseHelper.advertiseDataToBytes(scanResponse, deviceName); 193917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski byte[] periodic_data = AdvertiseHelper.advertiseDataToBytes(periodicData, deviceName); 194917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 195917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski int cb_id = --sTempRegistrationId; 196917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski mAdvertisers.put(binder, new AdvertiserInfo(cb_id, deathRecipient, callback)); 197917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 198917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski logd("startAdvertisingSet() - reg_id=" + cb_id + ", callback: " + binder); 199917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski startAdvertisingSetNative( 200917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski parameters, adv_data, scan_response, periodicParameters, periodic_data, cb_id); 201917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski } 202917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 203917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski void stopAdvertisingSet(IAdvertisingSetCallback callback) { 204917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski IBinder binder = toBinder(callback); 205917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (DBG) Log.d(TAG, "stopAdvertisingSet() " + binder); 20627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 207917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski AdvertiserInfo adv = mAdvertisers.remove(binder); 208917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (adv == null) { 209917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Log.e(TAG, "stopAdvertisingSet() - no client found for callback"); 210917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski return; 211917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski } 21264bf8e33481bb787aec895c603748eedb634a93bJakub Pawlowski 213917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Integer advertiser_id = adv.id; 214917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski binder.unlinkToDeath(adv.deathRecipient, 0); 21564bf8e33481bb787aec895c603748eedb634a93bJakub Pawlowski 216917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski if (advertiser_id < 0) { 217917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski Log.i(TAG, "stopAdvertisingSet() - advertiser not finished registration yet"); 218917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski // Advertiser will be freed once initiated in onAdvertisingSetStarted() 219917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski return; 220917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski } 221e82cce565b1549001f5a70526239c2d92106f85aJakub Pawlowski 222917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski stopAdvertisingSetNative(advertiser_id); 22327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 22427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 22527bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang private void logd(String s) { 22627bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang if (DBG) { 22727bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang Log.d(TAG, s); 22827bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 22927bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 23027bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 231917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski static { 232917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski classInitNative(); 23327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang } 23427bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang 235917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski private native static void classInitNative(); 236917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski private native void initializeNative(); 237917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski private native void cleanupNative(); 238917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski private native void startAdvertisingSetNative(AdvertisingSetParameters parameters, 239917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski byte[] advertiseData, byte[] scanResponse, 240917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski PeriodicAdvertisingParameters periodicParameters, byte[] periodicData, int reg_id); 241917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski 242917f34e18aa235e68ac0663e24f52100e95970b7Jakub Pawlowski private native void stopAdvertisingSetNative(int advertiser_id); 24327bd5f277ccf471f2fa9cd9151a2a226b51bc825Wei Wang} 244