Amazfit Bip: Support sending notification body, not only title
parent
a969d4b7dd
commit
fdcc51cb98
|
@ -33,12 +33,16 @@ import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
|
||||||
|
|
||||||
public class AlertNotificationProfile<T extends AbstractBTLEDeviceSupport> extends AbstractBleProfile<T> {
|
public class AlertNotificationProfile<T extends AbstractBTLEDeviceSupport> extends AbstractBleProfile<T> {
|
||||||
private static final Logger LOG = LoggerFactory.getLogger(AlertNotificationProfile.class);
|
private static final Logger LOG = LoggerFactory.getLogger(AlertNotificationProfile.class);
|
||||||
private static final int MAX_MSG_LENGTH = 18;
|
private int maxLength = 18; // Mi2-ism?
|
||||||
|
|
||||||
public AlertNotificationProfile(T support) {
|
public AlertNotificationProfile(T support) {
|
||||||
super(support);
|
super(support);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setMaxLength(int maxLength) {
|
||||||
|
this.maxLength = maxLength;
|
||||||
|
}
|
||||||
|
|
||||||
public void configure(TransactionBuilder builder, AlertNotificationControl control) {
|
public void configure(TransactionBuilder builder, AlertNotificationControl control) {
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_NOTIFICATION_CONTROL_POINT);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_ALERT_NOTIFICATION_CONTROL_POINT);
|
||||||
if (characteristic != null) {
|
if (characteristic != null) {
|
||||||
|
@ -57,21 +61,21 @@ public class AlertNotificationProfile<T extends AbstractBTLEDeviceSupport> exten
|
||||||
BluetoothGattCharacteristic characteristic = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_NEW_ALERT);
|
BluetoothGattCharacteristic characteristic = getCharacteristic(GattCharacteristic.UUID_CHARACTERISTIC_NEW_ALERT);
|
||||||
if (characteristic != null) {
|
if (characteristic != null) {
|
||||||
String message = StringUtils.ensureNotNull(alert.getMessage());
|
String message = StringUtils.ensureNotNull(alert.getMessage());
|
||||||
if (message.length() > MAX_MSG_LENGTH && strategy == OverflowStrategy.TRUNCATE) {
|
if (message.length() > maxLength && strategy == OverflowStrategy.TRUNCATE) {
|
||||||
message = StringUtils.truncate(message, MAX_MSG_LENGTH);
|
message = StringUtils.truncate(message, maxLength);
|
||||||
}
|
}
|
||||||
|
|
||||||
int numChunks = message.length() / MAX_MSG_LENGTH;
|
int numChunks = message.length() / maxLength;
|
||||||
if (message.length() % MAX_MSG_LENGTH > 0) {
|
if (message.length() % maxLength > 0) {
|
||||||
numChunks++;
|
numChunks++;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
boolean hasAlerted = false;
|
boolean hasAlerted = false;
|
||||||
for (int i = 0; i < numChunks; i++) {
|
for (int i = 0; i < numChunks; i++) {
|
||||||
int offset = i * MAX_MSG_LENGTH;
|
int offset = i * maxLength;
|
||||||
int restLength = message.length() - offset;
|
int restLength = message.length() - offset;
|
||||||
message = message.substring(offset, offset + Math.min(MAX_MSG_LENGTH, restLength));
|
message = message.substring(offset, offset + Math.min(maxLength, restLength));
|
||||||
if (hasAlerted && message.length() == 0) {
|
if (hasAlerted && message.length() == 0) {
|
||||||
// no need to do it again when there is no text content
|
// no need to do it again when there is no text content
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -33,7 +33,6 @@ import nodomain.freeyourgadget.gadgetbridge.service.btle.TransactionBuilder;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.common.SimpleNotification;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.common.SimpleNotification;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.NotificationStrategy;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband.NotificationStrategy;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.MiBand2Support;
|
import nodomain.freeyourgadget.gadgetbridge.service.devices.miband2.MiBand2Support;
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.NotificationUtils;
|
|
||||||
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
|
import nodomain.freeyourgadget.gadgetbridge.util.StringUtils;
|
||||||
|
|
||||||
public class AmazfitBipSupport extends MiBand2Support {
|
public class AmazfitBipSupport extends MiBand2Support {
|
||||||
|
@ -48,13 +47,17 @@ public class AmazfitBipSupport extends MiBand2Support {
|
||||||
onAlarmClock(notificationSpec);
|
onAlarmClock(notificationSpec);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
String message = NotificationUtils.getPreferredTextFor(notificationSpec, 40, 40, getContext()).trim();
|
|
||||||
|
|
||||||
// Fixup purging notification text in getPreferredTextFor() in case of UNKNOWN
|
String senderOrTiltle = StringUtils.getFirstOf(notificationSpec.sender, notificationSpec.title);
|
||||||
if (notificationSpec.type == NotificationType.UNKNOWN) {
|
String message = StringUtils.truncate(senderOrTiltle, 32) + "\0";
|
||||||
message = StringUtils.getFirstOf(notificationSpec.title, notificationSpec.body);
|
|
||||||
|
|
||||||
|
if (notificationSpec.subject != null) {
|
||||||
|
message += StringUtils.truncate(notificationSpec.subject, 128) + "\n\n";
|
||||||
}
|
}
|
||||||
|
if (notificationSpec.body != null) {
|
||||||
|
message += StringUtils.truncate(notificationSpec.body, 128);
|
||||||
|
}
|
||||||
|
|
||||||
String origin = notificationSpec.type.getGenericType();
|
String origin = notificationSpec.type.getGenericType();
|
||||||
SimpleNotification simpleNotification = new SimpleNotification(message, BLETypeConversions.toAlertCategory(notificationSpec.type));
|
SimpleNotification simpleNotification = new SimpleNotification(message, BLETypeConversions.toAlertCategory(notificationSpec.type));
|
||||||
performPreferredNotification(origin + " received", origin, simpleNotification, MiBand2Service.ALERT_LEVEL_MESSAGE, null);
|
performPreferredNotification(origin + " received", origin, simpleNotification, MiBand2Service.ALERT_LEVEL_MESSAGE, null);
|
||||||
|
|
|
@ -46,6 +46,7 @@ class AmazfitBipTextNotificationStrategy extends Mi2TextNotificationStrategy {
|
||||||
@Override
|
@Override
|
||||||
protected void sendAlert(@NonNull SimpleNotification simpleNotification, TransactionBuilder builder) {
|
protected void sendAlert(@NonNull SimpleNotification simpleNotification, TransactionBuilder builder) {
|
||||||
AlertNotificationProfile<?> profile = new AlertNotificationProfile<>(getSupport());
|
AlertNotificationProfile<?> profile = new AlertNotificationProfile<>(getSupport());
|
||||||
|
profile.setMaxLength(255); // TODO: find out real limit, certainly it is more than 18 which is default
|
||||||
|
|
||||||
AlertCategory category = simpleNotification.getAlertCategory();
|
AlertCategory category = simpleNotification.getAlertCategory();
|
||||||
switch (simpleNotification.getAlertCategory()) {
|
switch (simpleNotification.getAlertCategory()) {
|
||||||
|
@ -59,6 +60,6 @@ class AmazfitBipTextNotificationStrategy extends Mi2TextNotificationStrategy {
|
||||||
category = AlertCategory.SMS;
|
category = AlertCategory.SMS;
|
||||||
}
|
}
|
||||||
NewAlert alert = new NewAlert(category, 1, simpleNotification.getMessage());
|
NewAlert alert = new NewAlert(category, 1, simpleNotification.getMessage());
|
||||||
profile.newAlert(builder, alert, OverflowStrategy.MAKE_MULTIPLE);
|
profile.newAlert(builder, alert, OverflowStrategy.TRUNCATE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue