Bluetooth: fix GATT race conditions when using Handler

Bug: 65596701
Test: manual
Change-Id: Id703cea0543626bdd5a583da95615b650bbcc331
diff --git a/core/java/android/bluetooth/BluetoothGatt.java b/core/java/android/bluetooth/BluetoothGatt.java
index 759d772..3ded05d 100644
--- a/core/java/android/bluetooth/BluetoothGatt.java
+++ b/core/java/android/bluetooth/BluetoothGatt.java
@@ -371,12 +371,11 @@
                         return;
                     }
 
-                    if (status == 0) characteristic.setValue(value);
-
                     runOrQueueCallback(new Runnable() {
                         @Override
                         public void run() {
                             if (mCallback != null) {
+                                if (status == 0) characteristic.setValue(value);
                                 mCallback.onCharacteristicRead(BluetoothGatt.this, characteristic,
                                         status);
                             }
@@ -454,12 +453,11 @@
                             handle);
                     if (characteristic == null) return;
 
-                    characteristic.setValue(value);
-
                     runOrQueueCallback(new Runnable() {
                         @Override
                         public void run() {
                             if (mCallback != null) {
+                                characteristic.setValue(value);
                                 mCallback.onCharacteristicChanged(BluetoothGatt.this,
                                         characteristic);
                             }
@@ -489,7 +487,6 @@
                     BluetoothGattDescriptor descriptor = getDescriptorById(mDevice, handle);
                     if (descriptor == null) return;
 
-                    if (status == 0) descriptor.setValue(value);
 
                     if ((status == GATT_INSUFFICIENT_AUTHENTICATION
                             || status == GATT_INSUFFICIENT_ENCRYPTION)
@@ -511,6 +508,7 @@
                         @Override
                         public void run() {
                             if (mCallback != null) {
+                                if (status == 0) descriptor.setValue(value);
                                 mCallback.onDescriptorRead(BluetoothGatt.this, descriptor, status);
                             }
                         }