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

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

Issue 1610053005: bluetooth: android: Fix a couple of crashes when adapter is turned on/off. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebased on latest 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.BluetoothDevice; 10 import android.bluetooth.BluetoothDevice;
(...skipping 28 matching lines...) Expand all
39 * 39 *
40 * Each Wrapper base class accepts an Android API object and passes through 40 * Each Wrapper base class accepts an Android API object and passes through
41 * calls to it. When under test, Fake subclasses override all methods that 41 * calls to it. When under test, Fake subclasses override all methods that
42 * pass through to the Android object and instead provide fake implementations. 42 * pass through to the Android object and instead provide fake implementations.
43 */ 43 */
44 @JNINamespace("device") 44 @JNINamespace("device")
45 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 45 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
46 class Wrappers { 46 class Wrappers {
47 private static final String TAG = "Bluetooth"; 47 private static final String TAG = "Bluetooth";
48 48
49 public static final int DEVICE_CLASS_UNSPECIFIED = 0x1F00;
50
49 /** 51 /**
50 * Wraps android.bluetooth.BluetoothAdapter. 52 * Wraps android.bluetooth.BluetoothAdapter.
51 */ 53 */
52 static class BluetoothAdapterWrapper { 54 static class BluetoothAdapterWrapper {
53 private final BluetoothAdapter mAdapter; 55 private final BluetoothAdapter mAdapter;
54 protected final ContextWrapper mContext; 56 protected final ContextWrapper mContext;
55 protected final BluetoothLeScannerWrapper mScanner; 57 protected BluetoothLeScannerWrapper mScannerWrapper;
56 58
57 /** 59 /**
58 * Creates a BluetoothAdapterWrapper using the default 60 * Creates a BluetoothAdapterWrapper using the default
59 * android.bluetooth.BluetoothAdapter. May fail if the default adapter 61 * android.bluetooth.BluetoothAdapter. May fail if the default adapter
60 * is not available or if the application does not have sufficient 62 * is not available or if the application does not have sufficient
61 * permissions. 63 * permissions.
62 */ 64 */
63 @CalledByNative("BluetoothAdapterWrapper") 65 @CalledByNative("BluetoothAdapterWrapper")
64 public static BluetoothAdapterWrapper createWithDefaultAdapter(Context c ontext) { 66 public static BluetoothAdapterWrapper createWithDefaultAdapter(Context c ontext) {
65 final boolean hasMinAPI = Build.VERSION.SDK_INT >= Build.VERSION_COD ES.LOLLIPOP; 67 final boolean hasMinAPI = Build.VERSION.SDK_INT >= Build.VERSION_COD ES.LOLLIPOP;
(...skipping 21 matching lines...) Expand all
87 if (!hasLowEnergyFeature) { 89 if (!hasLowEnergyFeature) {
88 Log.i(TAG, "BluetoothAdapterWrapper.create failed: No Low Energy support."); 90 Log.i(TAG, "BluetoothAdapterWrapper.create failed: No Low Energy support.");
89 return null; 91 return null;
90 } 92 }
91 93
92 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter(); 94 BluetoothAdapter adapter = BluetoothAdapter.getDefaultAdapter();
93 if (adapter == null) { 95 if (adapter == null) {
94 Log.i(TAG, "BluetoothAdapterWrapper.create failed: Default adapt er not found."); 96 Log.i(TAG, "BluetoothAdapterWrapper.create failed: Default adapt er not found.");
95 return null; 97 return null;
96 } else { 98 } else {
97 return new BluetoothAdapterWrapper(adapter, new ContextWrapper(c ontext), 99 return new BluetoothAdapterWrapper(adapter, new ContextWrapper(c ontext));
98 new BluetoothLeScannerWrapper(adapter.getBluetoothLeScan ner()));
99 } 100 }
100 } 101 }
101 102
102 public BluetoothAdapterWrapper(BluetoothAdapter adapter, ContextWrapper context, 103 public BluetoothAdapterWrapper(BluetoothAdapter adapter, ContextWrapper context) {
103 BluetoothLeScannerWrapper scanner) {
104 mAdapter = adapter; 104 mAdapter = adapter;
105 mContext = context; 105 mContext = context;
106 mScanner = scanner; 106 }
107
108 public boolean disable() {
109 return mAdapter.disable();
110 }
111
112 public boolean enable() {
113 return mAdapter.enable();
114 }
115
116 public String getAddress() {
117 return mAdapter.getAddress();
118 }
119
120 public BluetoothLeScannerWrapper getBluetoothLeScanner() {
121 BluetoothLeScanner scanner = mAdapter.getBluetoothLeScanner();
122 if (scanner == null) {
123 return null;
124 }
125 if (mScannerWrapper == null) {
126 mScannerWrapper = new BluetoothLeScannerWrapper(scanner);
127 }
128 return mScannerWrapper;
107 } 129 }
108 130
109 public ContextWrapper getContext() { 131 public ContextWrapper getContext() {
110 return mContext; 132 return mContext;
111 } 133 }
112 134
113 public BluetoothLeScannerWrapper getBluetoothLeScanner() {
114 return mScanner;
115 }
116
117 public boolean isEnabled() {
118 return mAdapter.isEnabled();
119 }
120
121 public String getAddress() {
122 return mAdapter.getAddress();
123 }
124
125 public String getName() { 135 public String getName() {
126 return mAdapter.getName(); 136 return mAdapter.getName();
127 } 137 }
128 138
129 public int getScanMode() { 139 public int getScanMode() {
130 return mAdapter.getScanMode(); 140 return mAdapter.getScanMode();
131 } 141 }
132 142
133 public boolean isDiscovering() { 143 public boolean isDiscovering() {
134 return mAdapter.isDiscovering(); 144 return mAdapter.isDiscovering();
135 } 145 }
146
147 public boolean isEnabled() {
148 return mAdapter.isEnabled();
149 }
136 } 150 }
137 151
138 /** 152 /**
139 * Wraps android.content.Context. 153 * Wraps android.content.Context.
140 */ 154 */
141 static class ContextWrapper { 155 static class ContextWrapper {
142 private final Context mContext; 156 private final Context mContext;
143 157
144 public ContextWrapper(Context context) { 158 public ContextWrapper(Context context) {
145 mContext = context; 159 mContext = context;
146 } 160 }
147 161
148 public boolean checkPermission(String permission) { 162 public boolean checkPermission(String permission) {
149 return mContext.checkPermission(permission, Process.myPid(), Process .myUid()) 163 return mContext.checkPermission(permission, Process.myPid(), Process .myUid())
150 == PackageManager.PERMISSION_GRANTED; 164 == PackageManager.PERMISSION_GRANTED;
151 } 165 }
152 } 166 }
153 167
154 /** 168 /**
155 * Wraps android.bluetooth.BluetoothLeScanner. 169 * Wraps android.bluetooth.BluetoothLeScanner.
156 */ 170 */
157 static class BluetoothLeScannerWrapper { 171 static class BluetoothLeScannerWrapper {
158 private final BluetoothLeScanner mScanner; 172 protected final BluetoothLeScanner mScanner;
159 private final HashMap<ScanCallbackWrapper, ForwardScanCallbackToWrapper> mCallbacks; 173 private final HashMap<ScanCallbackWrapper, ForwardScanCallbackToWrapper> mCallbacks;
160 174
161 public BluetoothLeScannerWrapper(BluetoothLeScanner scanner) { 175 public BluetoothLeScannerWrapper(BluetoothLeScanner scanner) {
162 mScanner = scanner; 176 mScanner = scanner;
163 mCallbacks = new HashMap<ScanCallbackWrapper, ForwardScanCallbackToW rapper>(); 177 mCallbacks = new HashMap<ScanCallbackWrapper, ForwardScanCallbackToW rapper>();
164 } 178 }
165 179
166 public void startScan( 180 public void startScan(
167 List<ScanFilter> filters, int scanSettingsScanMode, ScanCallback Wrapper callback) { 181 List<ScanFilter> filters, int scanSettingsScanMode, ScanCallback Wrapper callback) {
168 ScanSettings settings = 182 ScanSettings settings =
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
269 mDevice.connectGatt(context, autoConnect, 283 mDevice.connectGatt(context, autoConnect,
270 new ForwardBluetoothGattCallbackToWrapper(callback, this)), 284 new ForwardBluetoothGattCallbackToWrapper(callback, this)),
271 this); 285 this);
272 } 286 }
273 287
274 public String getAddress() { 288 public String getAddress() {
275 return mDevice.getAddress(); 289 return mDevice.getAddress();
276 } 290 }
277 291
278 public int getBluetoothClass_getDeviceClass() { 292 public int getBluetoothClass_getDeviceClass() {
293 if (mDevice == null || mDevice.getBluetoothClass() == null) {
294 // BluetoothDevice.getBluetoothClass() returns null if adapter h as been powered off.
295 // Return DEVICE_CLASS_UNSPECIFIED in these cases.
296 return DEVICE_CLASS_UNSPECIFIED;
297 }
279 return mDevice.getBluetoothClass().getDeviceClass(); 298 return mDevice.getBluetoothClass().getDeviceClass();
280 } 299 }
281 300
282 public int getBondState() { 301 public int getBondState() {
283 return mDevice.getBondState(); 302 return mDevice.getBondState();
284 } 303 }
285 304
286 public String getName() { 305 public String getName() {
287 return mDevice.getName(); 306 return mDevice.getName();
288 } 307 }
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
536 555
537 public byte[] getValue() { 556 public byte[] getValue() {
538 return mDescriptor.getValue(); 557 return mDescriptor.getValue();
539 } 558 }
540 559
541 public boolean setValue(byte[] value) { 560 public boolean setValue(byte[] value) {
542 return mDescriptor.setValue(value); 561 return mDescriptor.setValue(value);
543 } 562 }
544 } 563 }
545 } 564 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698