private boolean internalSendNotification(@Nullable final BluetoothGattCharacteristic serverCharacteristic,
											 final boolean confirm, @Nullable final byte[] data) {
		if (serverManager == null || serverManager.getServer() == null || serverCharacteristic == null)
			return false;
		final int requiredProperty = confirm ? BluetoothGattCharacteristic.PROPERTY_INDICATE : BluetoothGattCharacteristic.PROPERTY_NOTIFY;
		if ((serverCharacteristic.getProperties() & requiredProperty) == 0)
			return false;
		final BluetoothGattDescriptor cccd = serverCharacteristic.getDescriptor(BleManager.CLIENT_CHARACTERISTIC_CONFIG_DESCRIPTOR_UUID);
		if (cccd == null)
			return false;
		// If notifications/indications were enabled, send the notification/indication.
		final byte[] value = descriptorValues != null && descriptorValues.containsKey(cccd) ? descriptorValues.get(cccd) : cccd.getValue();
		if (value != null && value.length == 2 && value[0] != 0) {
			log(Log.VERBOSE, () -> "[Server] Sending " + (confirm ? "indication" : "notification") + " to " + serverCharacteristic.getUuid());
			boolean result;
			if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
				log(Log.DEBUG, () -> "[Server] gattServer.notifyCharacteristicChanged(" + serverCharacteristic.getUuid() +
						", confirm=" + confirm +
						", value=" + ParserUtils.parseDebug(data) + ")");
				return serverManager.getServer().notifyCharacteristicChanged(bluetoothDevice, serverCharacteristic, confirm, data != null ? data : new byte[0])
						== BluetoothStatusCodes.SUCCESS;
			} else {
				log(Log.DEBUG, () -> "[Server] characteristic.setValue(" + ParserUtils.parseDebug(data) + ")");
				serverCharacteristic.setValue(data);
				log(Log.DEBUG, () -> "[Server] gattServer.notifyCharacteristicChanged(" + serverCharacteristic.getUuid() + ", confirm=" + confirm + ")");
				result = serverManager.getServer().notifyCharacteristicChanged(bluetoothDevice, serverCharacteristic, confirm);

				// The onNotificationSent callback is not called before Android Lollipop.
				if (result && Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
					notifyNotificationSent(bluetoothDevice);
					nextRequest(true);
				}
			}
			return result;
		} else {
			notifyNotificationsDisabled(bluetoothDevice);
		}
		// Otherwise, assume the data was sent. The remote side has not registered for them.
		nextRequest(true);
		return true;
	}
When the device is bonded and has the Generic Attribute service and the Service Changed
characteristic this method enables indications on this characteristic.
In case one of the requirements is not fulfilled this method returns <code>false</code>.

@return <code>true</code> when the request has been sent, <code>false</code> when the device
is not bonded, does not have the Generic Attribute service, the GA service does not have
the Service Changed characteristic or this characteristic does not have the CCCD.
ble/src/main/java/no/nordicsemi/android/ble/BleManagerHandler.java