1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-11-29 13:26:50 +01:00

Handle notifications with long body

This commit is contained in:
mkusnierz 2019-10-18 09:42:31 +02:00
parent cf61ab9d38
commit 290a90ec0e
2 changed files with 38 additions and 20 deletions

View File

@ -28,8 +28,8 @@ public final class WatchXPlusConstants {
public static final UUID UUID_CHARACTERISTIC_UNKNOWN_3 = UUID.fromString("0000a803-0000-1000-8000-00805f9b34fb"); public static final UUID UUID_CHARACTERISTIC_UNKNOWN_3 = UUID.fromString("0000a803-0000-1000-8000-00805f9b34fb");
public static final UUID UUID_CHARACTERISTIC_UNKNOWN_4 = UUID.fromString("0000a804-0000-1000-8000-00805f9b34fb"); public static final UUID UUID_CHARACTERISTIC_UNKNOWN_4 = UUID.fromString("0000a804-0000-1000-8000-00805f9b34fb");
public static final int NOTIFICATION_CHANNEL_DEFAULT = 7; public static final int NOTIFICATION_CHANNEL_DEFAULT = 0;
public static final int NOTIFICATION_CHANNEL_PHONE_CALL = 1024; public static final int NOTIFICATION_CHANNEL_PHONE_CALL = 10;
public static final byte RESPONSE = 0x13; public static final byte RESPONSE = 0x13;
public static final byte REQUEST = 0x31; public static final byte REQUEST = 0x31;

View File

@ -142,14 +142,13 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
String senderOrTitle = StringUtils.getFirstOf(notificationSpec.sender, notificationSpec.title); String senderOrTitle = StringUtils.getFirstOf(notificationSpec.sender, notificationSpec.title);
String message = StringUtils.truncate(senderOrTitle, 32) + "\0"; String message = StringUtils.truncate(senderOrTitle, 14) + "\0";
// TODO: Commented out to simplify testing if (notificationSpec.subject != null) {
// if (notificationSpec.subject != null) { message += StringUtils.truncate(notificationSpec.subject, 20) + ": ";
// message += StringUtils.truncate(notificationSpec.subject, 128) + "\n\n"; }
// } if (notificationSpec.body != null) {
// if (notificationSpec.body != null) { message += StringUtils.truncate(notificationSpec.body, 64);
// message += StringUtils.truncate(notificationSpec.body, 128); }
// }
sendNotification(WatchXPlusConstants.NOTIFICATION_CHANNEL_DEFAULT, message); sendNotification(WatchXPlusConstants.NOTIFICATION_CHANNEL_DEFAULT, message);
} }
@ -159,17 +158,36 @@ public class WatchXPlusDeviceSupport extends AbstractBTLEDeviceSupport {
TransactionBuilder builder = performInitialized("showNotification"); TransactionBuilder builder = performInitialized("showNotification");
byte[] command = WatchXPlusConstants.CMD_NOTIFICATION_TEXT_TASK; byte[] command = WatchXPlusConstants.CMD_NOTIFICATION_TEXT_TASK;
byte[] text = notificationText.getBytes("UTF-8"); byte[] text = notificationText.getBytes("UTF-8");
byte[] value = new byte[text.length + 2]; byte[] messagePart;
value[0] = (byte)(notificationChannel);
// TODO: Split message into 9-byte arrays and send them one by one.
// Set the message index to FF to indicate end of message
value[1] = (byte) 0xFF;
System.arraycopy(text, 0, value, 2, text.length);
int messageLength = text.length;
int parts = messageLength / 9;
int remainder = messageLength % 9;
// Increment parts quantity if message length is not multiple of 9
if (remainder != 0) {
parts++;
}
for (int messageIndex = 0; messageIndex < parts; messageIndex++) {
if(messageIndex+1 != parts || remainder == 0) {
messagePart = new byte[11];
} else {
messagePart = new byte[remainder+2];
}
System.arraycopy(text, messageIndex*9, messagePart, 2, messagePart.length-2);
if(messageIndex+1 == parts) {
messageIndex = 0xFF;
}
messagePart[0] = (byte)notificationChannel;
messagePart[1] = (byte)messageIndex;
builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE), builder.write(getCharacteristic(WatchXPlusConstants.UUID_CHARACTERISTIC_WRITE),
buildCommand(command, buildCommand(command,
WatchXPlusConstants.KEEP_ALIVE, WatchXPlusConstants.KEEP_ALIVE,
value)); messagePart));
}
performImmediately(builder); performImmediately(builder);
} catch (IOException e) { } catch (IOException e) {
LOG.warn("Unable to send notification", e); LOG.warn("Unable to send notification", e);