Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(284)

Side by Side Diff: device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java

Issue 1711393002: bluetooth: android: register for adapter on/off events. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased on master Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2015 The Chromium Authors. All rights reserved. 1 // Copyright 2015 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 package org.chromium.device.bluetooth; 5 package org.chromium.device.bluetooth;
6 6
7 import android.Manifest; 7 import android.Manifest;
8 import android.annotation.TargetApi; 8 import android.annotation.TargetApi;
9 import android.bluetooth.BluetoothAdapter; 9 import android.bluetooth.BluetoothAdapter;
10 import android.bluetooth.le.ScanSettings; 10 import android.bluetooth.le.ScanSettings;
11 import android.content.BroadcastReceiver;
12 import android.content.Context;
13 import android.content.Intent;
14 import android.content.IntentFilter;
11 import android.os.Build; 15 import android.os.Build;
12 import android.os.ParcelUuid; 16 import android.os.ParcelUuid;
13 17
14 import org.chromium.base.Log; 18 import org.chromium.base.Log;
15 import org.chromium.base.annotations.CalledByNative; 19 import org.chromium.base.annotations.CalledByNative;
16 import org.chromium.base.annotations.JNINamespace; 20 import org.chromium.base.annotations.JNINamespace;
17 21
18 import java.util.List; 22 import java.util.List;
19 23
20 /** 24 /**
21 * Exposes android.bluetooth.BluetoothAdapter as necessary for C++ 25 * Exposes android.bluetooth.BluetoothAdapter as necessary for C++
22 * device::BluetoothAdapterAndroid, which implements the cross platform 26 * device::BluetoothAdapterAndroid, which implements the cross platform
23 * device::BluetoothAdapter. 27 * device::BluetoothAdapter.
24 * 28 *
25 * Lifetime is controlled by device::BluetoothAdapterAndroid. 29 * Lifetime is controlled by device::BluetoothAdapterAndroid.
26 */ 30 */
27 @JNINamespace("device") 31 @JNINamespace("device")
28 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 32 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
29 final class ChromeBluetoothAdapter { 33 final class ChromeBluetoothAdapter extends BroadcastReceiver {
30 private static final String TAG = "Bluetooth"; 34 private static final String TAG = "Bluetooth";
31 35
32 private long mNativeBluetoothAdapterAndroid; 36 private long mNativeBluetoothAdapterAndroid;
33 private Wrappers.BluetoothAdapterWrapper mAdapter; 37 private Wrappers.BluetoothAdapterWrapper mAdapter;
Ted C 2016/02/26 17:50:35 can you mark this final?
scheib 2016/02/26 20:23:47 Done.
34 private int mNumDiscoverySessions; 38 private int mNumDiscoverySessions;
35 private ScanCallback mScanCallback; 39 private ScanCallback mScanCallback;
36 40
37 // ------------------------------------------------------------------------- -------------------- 41 // ------------------------------------------------------------------------- --------------------
38 // Construction and handler for C++ object destruction. 42 // Construction and handler for C++ object destruction.
39 43
40 /** 44 /**
41 * Constructs a ChromeBluetoothAdapter. 45 * Constructs a ChromeBluetoothAdapter.
42 * @param nativeBluetoothAdapterAndroid Is the associated C++ 46 * @param nativeBluetoothAdapterAndroid Is the associated C++
43 * BluetoothAdapterAndroid pointer valu e. 47 * BluetoothAdapterAndroid pointer valu e.
44 * @param adapterWrapper Wraps the default android.bluetooth.BluetoothAdapte r, 48 * @param adapterWrapper Wraps the default android.bluetooth.BluetoothAdapte r,
45 * but may be either null if an adapter is not availab le 49 * but may be either null if an adapter is not availab le
46 * or a fake for testing. 50 * or a fake for testing.
47 */ 51 */
48 public ChromeBluetoothAdapter( 52 public ChromeBluetoothAdapter(
49 long nativeBluetoothAdapterAndroid, Wrappers.BluetoothAdapterWrapper adapterWrapper) { 53 long nativeBluetoothAdapterAndroid, Wrappers.BluetoothAdapterWrapper adapterWrapper) {
50 mNativeBluetoothAdapterAndroid = nativeBluetoothAdapterAndroid; 54 mNativeBluetoothAdapterAndroid = nativeBluetoothAdapterAndroid;
51 mAdapter = adapterWrapper; 55 mAdapter = adapterWrapper;
56 registerBroadcastReceiver();
52 if (adapterWrapper == null) { 57 if (adapterWrapper == null) {
53 Log.i(TAG, "ChromeBluetoothAdapter created with no adapterWrapper.") ; 58 Log.i(TAG, "ChromeBluetoothAdapter created with no adapterWrapper.") ;
54 } else { 59 } else {
55 Log.i(TAG, "ChromeBluetoothAdapter created with provided adapterWrap per."); 60 Log.i(TAG, "ChromeBluetoothAdapter created with provided adapterWrap per.");
56 } 61 }
57 } 62 }
58 63
59 /** 64 /**
60 * Handles C++ object being destroyed. 65 * Handles C++ object being destroyed.
61 */ 66 */
62 @CalledByNative 67 @CalledByNative
63 private void onBluetoothAdapterAndroidDestruction() { 68 private void onBluetoothAdapterAndroidDestruction() {
64 stopScan(); 69 stopScan();
65 mNativeBluetoothAdapterAndroid = 0; 70 mNativeBluetoothAdapterAndroid = 0;
71 unregisterBroadcastReceiver();
66 } 72 }
67 73
68 // ------------------------------------------------------------------------- -------------------- 74 // ------------------------------------------------------------------------- --------------------
69 // BluetoothAdapterAndroid methods implemented in java: 75 // BluetoothAdapterAndroid methods implemented in java:
70 76
71 // Implements BluetoothAdapterAndroid::Create. 77 // Implements BluetoothAdapterAndroid::Create.
72 // 'Object' type must be used for |adapterWrapper| because inner class 78 // 'Object' type must be used for |adapterWrapper| because inner class
73 // Wrappers.BluetoothAdapterWrapper reference is not handled by jni_generato r.py JavaToJni. 79 // Wrappers.BluetoothAdapterWrapper reference is not handled by jni_generato r.py JavaToJni.
74 // http://crbug.com/505554 80 // http://crbug.com/505554
75 @CalledByNative 81 @CalledByNative
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
180 186
181 /** 187 /**
182 * @return true if Chromium has permission to scan for Bluetooth devices. 188 * @return true if Chromium has permission to scan for Bluetooth devices.
183 */ 189 */
184 private boolean canScan() { 190 private boolean canScan() {
185 Wrappers.ContextWrapper context = mAdapter.getContext(); 191 Wrappers.ContextWrapper context = mAdapter.getContext();
186 return context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATIO N) 192 return context.checkPermission(Manifest.permission.ACCESS_COARSE_LOCATIO N)
187 || context.checkPermission(Manifest.permission.ACCESS_FINE_LOCAT ION); 193 || context.checkPermission(Manifest.permission.ACCESS_FINE_LOCAT ION);
188 } 194 }
189 195
196 private void registerBroadcastReceiver() {
197 if (mAdapter != null) {
198 mAdapter.getContext().registerReceiver(
199 this, new IntentFilter(BluetoothAdapter.ACTION_STATE_CHANGED ));
200 }
201 }
202
203 private void unregisterBroadcastReceiver() {
204 if (mAdapter != null) {
205 mAdapter.getContext().unregisterReceiver(this);
Ted C 2016/02/26 17:50:35 my comment about marking the adapter final is to e
scheib 2016/02/26 20:23:47 Acknowledged.
206 }
207 }
208
190 /** 209 /**
191 * Starts a Low Energy scan. 210 * Starts a Low Energy scan.
192 * @return True on success. 211 * @return True on success.
193 */ 212 */
194 private boolean startScan() { 213 private boolean startScan() {
195 Wrappers.BluetoothLeScannerWrapper scanner = mAdapter.getBluetoothLeScan ner(); 214 Wrappers.BluetoothLeScannerWrapper scanner = mAdapter.getBluetoothLeScan ner();
196 215
197 if (scanner == null) { 216 if (scanner == null) {
198 return false; 217 return false;
199 } 218 }
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after
268 } 287 }
269 288
270 @Override 289 @Override
271 public void onScanFailed(int errorCode) { 290 public void onScanFailed(int errorCode) {
272 Log.w(TAG, "onScanFailed: %d", errorCode); 291 Log.w(TAG, "onScanFailed: %d", errorCode);
273 nativeOnScanFailed(mNativeBluetoothAdapterAndroid); 292 nativeOnScanFailed(mNativeBluetoothAdapterAndroid);
274 mNumDiscoverySessions = 0; 293 mNumDiscoverySessions = 0;
275 } 294 }
276 } 295 }
277 296
297 @Override
298 public void onReceive(Context context, Intent intent) {
299 String action = intent.getAction();
300
301 if (isPresent() && BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)) {
302 int state = intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, Bluetoo thAdapter.ERROR);
303
304 Log.w(TAG, "onReceive: BluetoothAdapter.ACTION_STATE_CHANGED: %s",
305 getBluetoothStateString(state));
306
307 switch (state) {
308 case BluetoothAdapter.STATE_ON:
309 nativeOnAdapterStateChanged(mNativeBluetoothAdapterAndroid, true);
310 break;
311 case BluetoothAdapter.STATE_OFF:
312 nativeOnAdapterStateChanged(mNativeBluetoothAdapterAndroid, false);
313 break;
314 default:
315 // do nothing
316 }
317 }
318 }
319
320 private String getBluetoothStateString(int state) {
321 switch (state) {
322 case BluetoothAdapter.STATE_OFF:
323 return "STATE_OFF";
324 case BluetoothAdapter.STATE_ON:
325 return "STATE_ON";
326 case BluetoothAdapter.STATE_TURNING_OFF:
327 return "STATE_TURNING_OFF";
328 case BluetoothAdapter.STATE_TURNING_ON:
329 return "STATE_TURNING_ON";
330 default:
331 assert false;
332 return "illegal state: " + state;
333 }
334 }
335
278 // ------------------------------------------------------------------------- -------------------- 336 // ------------------------------------------------------------------------- --------------------
279 // BluetoothAdapterAndroid C++ methods declared for access from java: 337 // BluetoothAdapterAndroid C++ methods declared for access from java:
280 338
281 // Binds to BluetoothAdapterAndroid::OnScanFailed. 339 // Binds to BluetoothAdapterAndroid::OnScanFailed.
282 private native void nativeOnScanFailed(long nativeBluetoothAdapterAndroid); 340 private native void nativeOnScanFailed(long nativeBluetoothAdapterAndroid);
283 341
284 // Binds to BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan. 342 // Binds to BluetoothAdapterAndroid::CreateOrUpdateDeviceOnScan.
285 // 'Object' type must be used for |bluetoothDeviceWrapper| because inner cla ss 343 // 'Object' type must be used for |bluetoothDeviceWrapper| because inner cla ss
286 // Wrappers.BluetoothDeviceWrapper reference is not handled by jni_generator .py JavaToJni. 344 // Wrappers.BluetoothDeviceWrapper reference is not handled by jni_generator .py JavaToJni.
287 // http://crbug.com/505554 345 // http://crbug.com/505554
288 private native void nativeCreateOrUpdateDeviceOnScan(long nativeBluetoothAda pterAndroid, 346 private native void nativeCreateOrUpdateDeviceOnScan(long nativeBluetoothAda pterAndroid,
289 String address, Object bluetoothDeviceWrapper, List<ParcelUuid> adve rtisedUuids); 347 String address, Object bluetoothDeviceWrapper, List<ParcelUuid> adve rtisedUuids);
348
349 // Binds to BluetoothAdapterAndroid::nativeOnAdapterStateChanged
350 private native void nativeOnAdapterStateChanged(
351 long nativeBluetoothAdapterAndroid, boolean powered);
290 } 352 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698