void notifyValueChanged(final BluetoothDevice device, final byte[] value) {
		// Keep a reference to the value callback, as it may change during execution
		final DataReceivedCallback valueCallback = this.valueCallback;

		// With no value callback there is no need for any merging
		if (valueCallback == null) {
			if (packetFilter == null || packetFilter.filter(value))
				complete = true;
			return;
		}

		if (dataMerger == null && (packetFilter == null || packetFilter.filter(value))) {
			complete = true;
			final Data data = new Data(value);
			handler.post(() -> {
				try {
					valueCallback.onDataReceived(device, data);
				} catch (final Throwable t) {
					Log.e(TAG, "Exception in Value callback", t);
				}
			});
		} else {
			final int c = count;
			handler.post(() -> {
				if (progressCallback != null) {
					try {
						progressCallback.onPacketReceived(device, value, c);
					} catch (final Throwable t) {
						Log.e(TAG, "Exception in Progress callback", t);
					}
				}
			});
			if (buffer == null)
				buffer = new DataStream();
			if (dataMerger.merge(buffer, value, count++)) {
				final byte[] merged = buffer.toByteArray();
				if (packetFilter == null || packetFilter.filter(merged)) {
					complete = true;
					final Data data = new Data(merged);
					handler.post(() -> {
						try {
							valueCallback.onDataReceived(device, data);
						} catch (final Throwable t) {
							Log.e(TAG, "Exception in Value callback", t);
						}
					});
				}
				buffer = null;
				count = 0;
			} // else
			// wait for more packets to be merged
		}
	}
Same as {@link #await(Object, long)}, but if received response is not valid,
this method will thrown an exception.

@param response the result object.
@param timeout  optional timeout in milliseconds.
@param <E>      a response class that extends {@link ProfileReadResponse}.
@return Object with a valid response.
@throws IllegalStateException       thrown when you try to call this method from
                                    the main (UI) thread.
@throws InterruptedException        thrown when the timeout occurred before the
                                    characteristic value has changed.
@throws CancellationException       thrown when the request has been cancelled.
@throws RequestFailedException      thrown when the trigger request has failed.
@throws DeviceDisconnectedException thrown when the device disconnected before the
                                    notification or indication was received.
@throws BluetoothDisabledException  thrown when the Bluetooth adapter has been disabled.
@throws InvalidRequestException     thrown when the request was called before the device was
                                    connected at least once (unknown device).
@throws InvalidDataException        thrown when the received data were not valid (that is when
                                    {@link ProfileReadResponse#onDataReceived(BluetoothDevice, Data)}
                                    failed to parse the data correctly and called
                                    {@link ProfileReadResponse#onInvalidDataReceived(BluetoothDevice, Data)}).
@deprecated Use {@link #timeout(long)} and {@link #awaitValid(E)} instead.
ble/src/main/java/no/nordicsemi/android/ble/WaitForValueChangedRequest.java