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