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

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

Issue 1712593002: bluetooth: android: Confirm the notify session after the descriptor has been written. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Address Vincent's comments Created 4 years, 9 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.annotation.TargetApi; 7 import android.annotation.TargetApi;
8 import android.bluetooth.BluetoothGattCharacteristic;
9 import android.bluetooth.BluetoothGattDescriptor;
10 import android.os.Build; 8 import android.os.Build;
11 9
12 import org.chromium.base.Log; 10 import org.chromium.base.Log;
13 import org.chromium.base.annotations.CalledByNative; 11 import org.chromium.base.annotations.CalledByNative;
14 import org.chromium.base.annotations.JNINamespace; 12 import org.chromium.base.annotations.JNINamespace;
15 13
16 import java.util.List; 14 import java.util.List;
17 import java.util.UUID;
18 15
19 /** 16 /**
20 * Exposes android.bluetooth.BluetoothGattCharacteristic as necessary 17 * Exposes android.bluetooth.BluetoothGattCharacteristic as necessary
21 * for C++ device::BluetoothRemoteGattCharacteristicAndroid. 18 * for C++ device::BluetoothRemoteGattCharacteristicAndroid.
22 * 19 *
23 * Lifetime is controlled by 20 * Lifetime is controlled by
24 * device::BluetoothRemoteGattCharacteristicAndroid. 21 * device::BluetoothRemoteGattCharacteristicAndroid.
25 */ 22 */
26 @JNINamespace("device") 23 @JNINamespace("device")
27 @TargetApi(Build.VERSION_CODES.LOLLIPOP) 24 @TargetApi(Build.VERSION_CODES.LOLLIPOP)
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
108 return mCharacteristic.getUuid().toString(); 105 return mCharacteristic.getUuid().toString();
109 } 106 }
110 107
111 // Implements BluetoothRemoteGattCharacteristicAndroid::GetProperties. 108 // Implements BluetoothRemoteGattCharacteristicAndroid::GetProperties.
112 @CalledByNative 109 @CalledByNative
113 private int getProperties() { 110 private int getProperties() {
114 // TODO(scheib): Must read Extended Properties Descriptor. crbug.com/548 449 111 // TODO(scheib): Must read Extended Properties Descriptor. crbug.com/548 449
115 return mCharacteristic.getProperties(); 112 return mCharacteristic.getProperties();
116 } 113 }
117 114
118 // Implements BluetoothRemoteGattCharacteristicAndroid::StartNotifySession.
119 @CalledByNative
120 private boolean startNotifySession() {
121 // Verify properties first, to provide clearest error log.
122 int properties = mCharacteristic.getProperties();
123 boolean hasNotify = (properties & BluetoothGattCharacteristic.PROPERTY_N OTIFY) != 0;
124 boolean hasIndicate = (properties & BluetoothGattCharacteristic.PROPERTY _INDICATE) != 0;
125 if (!hasNotify && !hasIndicate) {
126 Log.v(TAG, "startNotifySession failed! Characteristic needs NOTIFY o r INDICATE.");
127 return false;
128 }
129
130 // Find config descriptor.
131 Wrappers.BluetoothGattDescriptorWrapper clientCharacteristicConfiguratio nDescriptor =
132 mCharacteristic.getDescriptor(UUID.fromString(
133 "00002902-0000-1000-8000-00805F9B34FB" /* Config's stand ard UUID*/));
134 if (clientCharacteristicConfigurationDescriptor == null) {
135 Log.v(TAG, "startNotifySession config descriptor failed!");
136 return false;
137 }
138
139 // Request Android route onCharacteristicChanged notifications for this characteristic.
140 if (!mChromeDevice.mBluetoothGatt.setCharacteristicNotification(mCharact eristic, true)) {
141 Log.i(TAG, "startNotifySession setCharacteristicNotification failed. ");
142 return false;
143 }
144
145 // Enable notification on remote device's characteristic:
146 if (!clientCharacteristicConfigurationDescriptor.setValue(hasNotify
147 ? BluetoothGattDescriptor.ENABLE_NOTIFICATION_VALUE
148 : BluetoothGattDescriptor.ENABLE_INDICATION_VALUE)) {
149 Log.v(TAG, "startNotifySession descriptor setValue failed!");
150 return false;
151 }
152 Log.v(TAG, hasNotify ? "startNotifySession NOTIFY." : "startNotifySessio n INDICATE.");
153
154 if (!mChromeDevice.mBluetoothGatt.writeDescriptor(
155 clientCharacteristicConfigurationDescriptor)) {
156 Log.i(TAG, "startNotifySession writeDescriptor failed!");
157 return false;
158 }
159
160 return true;
161 }
162
163 // Implements BluetoothRemoteGattCharacteristicAndroid::ReadRemoteCharacteri stic. 115 // Implements BluetoothRemoteGattCharacteristicAndroid::ReadRemoteCharacteri stic.
164 @CalledByNative 116 @CalledByNative
165 private boolean readRemoteCharacteristic() { 117 private boolean readRemoteCharacteristic() {
166 if (!mChromeDevice.mBluetoothGatt.readCharacteristic(mCharacteristic)) { 118 if (!mChromeDevice.mBluetoothGatt.readCharacteristic(mCharacteristic)) {
167 Log.i(TAG, "readRemoteCharacteristic readCharacteristic failed."); 119 Log.i(TAG, "readRemoteCharacteristic readCharacteristic failed.");
168 return false; 120 return false;
169 } 121 }
170 return true; 122 return true;
171 } 123 }
172 124
173 // Implements BluetoothRemoteGattCharacteristicAndroid::WriteRemoteCharacter istic. 125 // Implements BluetoothRemoteGattCharacteristicAndroid::WriteRemoteCharacter istic.
174 @CalledByNative 126 @CalledByNative
175 private boolean writeRemoteCharacteristic(byte[] value) { 127 private boolean writeRemoteCharacteristic(byte[] value) {
176 if (!mCharacteristic.setValue(value)) { 128 if (!mCharacteristic.setValue(value)) {
177 Log.i(TAG, "writeRemoteCharacteristic setValue failed."); 129 Log.i(TAG, "writeRemoteCharacteristic setValue failed.");
178 return false; 130 return false;
179 } 131 }
180 if (!mChromeDevice.mBluetoothGatt.writeCharacteristic(mCharacteristic)) { 132 if (!mChromeDevice.mBluetoothGatt.writeCharacteristic(mCharacteristic)) {
181 Log.i(TAG, "writeRemoteCharacteristic writeCharacteristic failed."); 133 Log.i(TAG, "writeRemoteCharacteristic writeCharacteristic failed.");
182 return false; 134 return false;
183 } 135 }
184 return true; 136 return true;
185 } 137 }
186 138
139 // Enable or disable the notifications for this characteristic.
140 @CalledByNative
141 private boolean setCharacteristicNotification(boolean enabled) {
142 return mChromeDevice.mBluetoothGatt.setCharacteristicNotification(mChara cteristic, enabled);
143 }
144
187 // Creates objects for all descriptors. Designed only to be called by 145 // Creates objects for all descriptors. Designed only to be called by
188 // BluetoothRemoteGattCharacteristicAndroid::EnsureDescriptorsCreated. 146 // BluetoothRemoteGattCharacteristicAndroid::EnsureDescriptorsCreated.
189 @CalledByNative 147 @CalledByNative
190 private void createDescriptors() { 148 private void createDescriptors() {
191 List<Wrappers.BluetoothGattDescriptorWrapper> descriptors = 149 List<Wrappers.BluetoothGattDescriptorWrapper> descriptors =
192 mCharacteristic.getDescriptors(); 150 mCharacteristic.getDescriptors();
193 for (Wrappers.BluetoothGattDescriptorWrapper descriptor : descriptors) { 151 for (Wrappers.BluetoothGattDescriptorWrapper descriptor : descriptors) {
194 // Create an adapter unique descriptor ID. 152 // Create an adapter unique descriptor ID.
195 // TODO(crbug.com/576900) Unique descriptorInstanceId duplicate UUID values. 153 // TODO(crbug.com/576900) Unique descriptorInstanceId duplicate UUID values.
196 String descriptorInstanceId = mInstanceId + "/" + descriptor.getUuid ().toString(); 154 String descriptorInstanceId = mInstanceId + "/" + descriptor.getUuid ().toString();
(...skipping 14 matching lines...) Expand all
211 169
212 // Binds to BluetoothRemoteGattCharacteristicAndroid::OnWrite. 170 // Binds to BluetoothRemoteGattCharacteristicAndroid::OnWrite.
213 native void nativeOnWrite(long nativeBluetoothRemoteGattCharacteristicAndroi d, int status); 171 native void nativeOnWrite(long nativeBluetoothRemoteGattCharacteristicAndroi d, int status);
214 172
215 // Binds to BluetoothRemoteGattCharacteristicAndroid::CreateGattRemoteDescri ptor. 173 // Binds to BluetoothRemoteGattCharacteristicAndroid::CreateGattRemoteDescri ptor.
216 // TODO(http://crbug.com/505554): Replace 'Object' with specific type when J NI fixed. 174 // TODO(http://crbug.com/505554): Replace 'Object' with specific type when J NI fixed.
217 private native void nativeCreateGattRemoteDescriptor( 175 private native void nativeCreateGattRemoteDescriptor(
218 long nativeBluetoothRemoteGattCharacteristicAndroid, String instance Id, 176 long nativeBluetoothRemoteGattCharacteristicAndroid, String instance Id,
219 Object bluetoothGattDescriptorWrapper, Object chromeBluetoothDevice) ; 177 Object bluetoothGattDescriptorWrapper, Object chromeBluetoothDevice) ;
220 } 178 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698