diff options
Diffstat (limited to 'device/bluetooth/android')
-rw-r--r-- | device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java | 29 | ||||
-rw-r--r-- | device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java | 49 |
2 files changed, 60 insertions, 18 deletions
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java index 0774ea2..0a54a0b 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothAdapter.java @@ -111,6 +111,16 @@ final class ChromeBluetoothAdapter { return isPresent() && mAdapter.isEnabled(); } + // Implements BluetoothAdapterAndroid::SetPowered. + @CalledByNative + private boolean setPowered(boolean powered) { + if (powered) { + return isPresent() && mAdapter.enable(); + } else { + return isPresent() && mAdapter.disable(); + } + } + // Implements BluetoothAdapterAndroid::IsDiscoverable. @CalledByNative private boolean isDiscoverable() { @@ -184,6 +194,10 @@ final class ChromeBluetoothAdapter { private boolean startScan() { Wrappers.BluetoothLeScannerWrapper scanner = mAdapter.getBluetoothLeScanner(); + if (scanner == null) { + return false; + } + if (!canScan()) { return false; } @@ -199,6 +213,11 @@ final class ChromeBluetoothAdapter { scanner.startScan(null /* filters */, scanMode, mScanCallback); } catch (IllegalArgumentException e) { Log.e(TAG, "Cannot start scan: " + e); + mScanCallback = null; + return false; + } catch (IllegalStateException e) { + Log.e(TAG, "Adapter is off. Cannot start scan: " + e); + mScanCallback = null; return false; } return true; @@ -212,12 +231,16 @@ final class ChromeBluetoothAdapter { if (mScanCallback == null) { return false; } + try { - mAdapter.getBluetoothLeScanner().stopScan(mScanCallback); + Wrappers.BluetoothLeScannerWrapper scanner = mAdapter.getBluetoothLeScanner(); + if (scanner != null) { + scanner.stopScan(mScanCallback); + } } catch (IllegalArgumentException e) { Log.e(TAG, "Cannot stop scan: " + e); - mScanCallback = null; - return false; + } catch (IllegalStateException e) { + Log.e(TAG, "Adapter is off. Cannot stop scan: " + e); } mScanCallback = null; return true; diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java index 2ccdaae..9287f85 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/Wrappers.java @@ -46,13 +46,15 @@ import java.util.UUID; class Wrappers { private static final String TAG = "Bluetooth"; + public static final int DEVICE_CLASS_UNSPECIFIED = 0x1F00; + /** * Wraps android.bluetooth.BluetoothAdapter. */ static class BluetoothAdapterWrapper { private final BluetoothAdapter mAdapter; protected final ContextWrapper mContext; - protected final BluetoothLeScannerWrapper mScanner; + protected BluetoothLeScannerWrapper mScannerWrapper; /** * Creates a BluetoothAdapterWrapper using the default @@ -94,34 +96,42 @@ class Wrappers { Log.i(TAG, "BluetoothAdapterWrapper.create failed: Default adapter not found."); return null; } else { - return new BluetoothAdapterWrapper(adapter, new ContextWrapper(context), - new BluetoothLeScannerWrapper(adapter.getBluetoothLeScanner())); + return new BluetoothAdapterWrapper(adapter, new ContextWrapper(context)); } } - public BluetoothAdapterWrapper(BluetoothAdapter adapter, ContextWrapper context, - BluetoothLeScannerWrapper scanner) { + public BluetoothAdapterWrapper(BluetoothAdapter adapter, ContextWrapper context) { mAdapter = adapter; mContext = context; - mScanner = scanner; - } - - public ContextWrapper getContext() { - return mContext; } - public BluetoothLeScannerWrapper getBluetoothLeScanner() { - return mScanner; + public boolean disable() { + return mAdapter.disable(); } - public boolean isEnabled() { - return mAdapter.isEnabled(); + public boolean enable() { + return mAdapter.enable(); } public String getAddress() { return mAdapter.getAddress(); } + public BluetoothLeScannerWrapper getBluetoothLeScanner() { + BluetoothLeScanner scanner = mAdapter.getBluetoothLeScanner(); + if (scanner == null) { + return null; + } + if (mScannerWrapper == null) { + mScannerWrapper = new BluetoothLeScannerWrapper(scanner); + } + return mScannerWrapper; + } + + public ContextWrapper getContext() { + return mContext; + } + public String getName() { return mAdapter.getName(); } @@ -133,6 +143,10 @@ class Wrappers { public boolean isDiscovering() { return mAdapter.isDiscovering(); } + + public boolean isEnabled() { + return mAdapter.isEnabled(); + } } /** @@ -155,7 +169,7 @@ class Wrappers { * Wraps android.bluetooth.BluetoothLeScanner. */ static class BluetoothLeScannerWrapper { - private final BluetoothLeScanner mScanner; + protected final BluetoothLeScanner mScanner; private final HashMap<ScanCallbackWrapper, ForwardScanCallbackToWrapper> mCallbacks; public BluetoothLeScannerWrapper(BluetoothLeScanner scanner) { @@ -276,6 +290,11 @@ class Wrappers { } public int getBluetoothClass_getDeviceClass() { + if (mDevice == null || mDevice.getBluetoothClass() == null) { + // BluetoothDevice.getBluetoothClass() returns null if adapter has been powered off. + // Return DEVICE_CLASS_UNSPECIFIED in these cases. + return DEVICE_CLASS_UNSPECIFIED; + } return mDevice.getBluetoothClass().getDeviceClass(); } |