mirror of
https://codeberg.org/Freeyourgadget/Gadgetbridge
synced 2024-11-04 09:17:29 +01:00
Garmin: initial plumbing for notifications' images (blind implementation)
This commit adds the signaling of notifications with images to the watch. According to https://codeberg.org/Freeyourgadget/Gadgetbridge/issues/3469 the watch should followup with a protobuf request "MediaRequest". The protobuf is documented in https://gadgetbridge.org/internals/specifics/garmin-protocol/#mediarequest As examples and only intended to help further developments, two new methods getNotificationAttachmentPath and getNotificationAttachmentBitmap are added to GarminSupport
This commit is contained in:
parent
1435c3a937
commit
34fd0ee04c
@ -2,6 +2,8 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin;
|
|||||||
|
|
||||||
import android.bluetooth.BluetoothGatt;
|
import android.bluetooth.BluetoothGatt;
|
||||||
import android.bluetooth.BluetoothGattCharacteristic;
|
import android.bluetooth.BluetoothGattCharacteristic;
|
||||||
|
import android.graphics.Bitmap;
|
||||||
|
import android.graphics.BitmapFactory;
|
||||||
import android.location.Location;
|
import android.location.Location;
|
||||||
import android.net.Uri;
|
import android.net.Uri;
|
||||||
import android.widget.Toast;
|
import android.widget.Toast;
|
||||||
@ -236,6 +238,15 @@ public class GarminSupport extends AbstractBTLEDeviceSupport implements ICommuni
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
protected String getNotificationAttachmentPath(int notificationId) {
|
||||||
|
return notificationsHandler.getNotificationAttachmentPath(notificationId);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Bitmap getNotificationAttachmentBitmap(int notificationId) {
|
||||||
|
Bitmap pippo = BitmapFactory.decodeFile(getNotificationAttachmentPath(notificationId));
|
||||||
|
return pippo;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onSetCallState(CallSpec callSpec) {
|
public void onSetCallState(CallSpec callSpec) {
|
||||||
LOG.info("INCOMING CALLSPEC: {}", callSpec.command);
|
LOG.info("INCOMING CALLSPEC: {}", callSpec.command);
|
||||||
|
@ -117,7 +117,9 @@ public class NotificationsHandler implements MessageHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return new NotificationUpdateMessage(notificationUpdateType, notificationSpec.type, getNotificationsCount(notificationSpec.type), notificationSpec.getId(), hasActions);
|
|
||||||
|
final boolean hasPicture = !nodomain.freeyourgadget.gadgetbridge.util.StringUtils.isEmpty(notificationSpec.picturePath);
|
||||||
|
return new NotificationUpdateMessage(notificationUpdateType, notificationSpec.type, getNotificationsCount(notificationSpec.type), notificationSpec.getId(), hasActions, hasPicture);
|
||||||
}
|
}
|
||||||
|
|
||||||
private int getNotificationsCount(NotificationType notificationType) {
|
private int getNotificationsCount(NotificationType notificationType) {
|
||||||
@ -137,6 +139,13 @@ public class NotificationsHandler implements MessageHandler {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getNotificationAttachmentPath(int notificationId) {
|
||||||
|
NotificationSpec notificationSpec = getNotificationSpecFromQueue(notificationId);
|
||||||
|
if (null != notificationSpec)
|
||||||
|
return notificationSpec.picturePath;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public NotificationUpdateMessage onDeleteNotification(int id) {
|
public NotificationUpdateMessage onDeleteNotification(int id) {
|
||||||
if (!enabled)
|
if (!enabled)
|
||||||
return null;
|
return null;
|
||||||
@ -146,7 +155,7 @@ public class NotificationsHandler implements MessageHandler {
|
|||||||
NotificationSpec e = iterator.next();
|
NotificationSpec e = iterator.next();
|
||||||
if (e.getId() == id) {
|
if (e.getId() == id) {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
return new NotificationUpdateMessage(NotificationUpdateMessage.NotificationUpdateType.REMOVE, e.type, getNotificationsCount(e.type), id, false);
|
return new NotificationUpdateMessage(NotificationUpdateMessage.NotificationUpdateType.REMOVE, e.type, getNotificationsCount(e.type), id, false, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
@ -278,6 +287,7 @@ public class NotificationsHandler implements MessageHandler {
|
|||||||
// Garmin extensions
|
// Garmin extensions
|
||||||
// PHONE_NUMBER(126, true),
|
// PHONE_NUMBER(126, true),
|
||||||
ACTIONS(127, false, true),
|
ACTIONS(127, false, true),
|
||||||
|
ATTACHMENTS(128),
|
||||||
;
|
;
|
||||||
private static final SparseArray<NotificationAttribute> valueByCode;
|
private static final SparseArray<NotificationAttribute> valueByCode;
|
||||||
|
|
||||||
@ -339,6 +349,10 @@ public class NotificationsHandler implements MessageHandler {
|
|||||||
case ACTIONS:
|
case ACTIONS:
|
||||||
toReturn = encodeNotificationActionsString(notificationSpec);
|
toReturn = encodeNotificationActionsString(notificationSpec);
|
||||||
break;
|
break;
|
||||||
|
case ATTACHMENTS:
|
||||||
|
LOG.debug("NOTIFICATION ATTACHMENTS REQUESTED. Notification Id: {}", notificationSpec.getId());
|
||||||
|
toReturn = "1"; //TODO: possibly the number of attachments, or is it a progressive ID of the attachment to be requested?
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
if (maxLength == 0)
|
if (maxLength == 0)
|
||||||
return toReturn.getBytes(StandardCharsets.UTF_8);
|
return toReturn.getBytes(StandardCharsets.UTF_8);
|
||||||
|
@ -13,15 +13,17 @@ public class NotificationUpdateMessage extends GFDIMessage {
|
|||||||
final private int count; //how many notifications of the same type are present
|
final private int count; //how many notifications of the same type are present
|
||||||
final private int notificationId;
|
final private int notificationId;
|
||||||
final private boolean hasActions;
|
final private boolean hasActions;
|
||||||
|
final private boolean hasPicture;
|
||||||
final private boolean useLegacyActions = false;
|
final private boolean useLegacyActions = false;
|
||||||
|
|
||||||
public NotificationUpdateMessage(NotificationUpdateType notificationUpdateType, NotificationType notificationType, int count, int notificationId, boolean hasActions) {
|
public NotificationUpdateMessage(NotificationUpdateType notificationUpdateType, NotificationType notificationType, int count, int notificationId, boolean hasActions, boolean hasPicture) {
|
||||||
this.garminMessage = GarminMessage.NOTIFICATION_UPDATE;
|
this.garminMessage = GarminMessage.NOTIFICATION_UPDATE;
|
||||||
this.notificationUpdateType = notificationUpdateType;
|
this.notificationUpdateType = notificationUpdateType;
|
||||||
this.notificationType = notificationType;
|
this.notificationType = notificationType;
|
||||||
this.count = count;
|
this.count = count;
|
||||||
this.notificationId = notificationId;
|
this.notificationId = notificationId;
|
||||||
this.hasActions = hasActions;
|
this.hasActions = hasActions;
|
||||||
|
this.hasPicture = hasPicture;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -45,47 +47,13 @@ public class NotificationUpdateMessage extends GFDIMessage {
|
|||||||
flags.add(NotificationPhoneFlags.NEW_ACTIONS);
|
flags.add(NotificationPhoneFlags.NEW_ACTIONS);
|
||||||
if (this.useLegacyActions)
|
if (this.useLegacyActions)
|
||||||
flags.add(NotificationPhoneFlags.LEGACY_ACTIONS);
|
flags.add(NotificationPhoneFlags.LEGACY_ACTIONS);
|
||||||
|
if (this.hasPicture)
|
||||||
|
flags.add(NotificationPhoneFlags.HAS_ATTACHMENTS);
|
||||||
|
|
||||||
return (int) EnumUtils.generateBitVector(NotificationPhoneFlags.class, flags);
|
return (int) EnumUtils.generateBitVector(NotificationPhoneFlags.class, flags);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//no image
|
|
||||||
//00 updatetype
|
|
||||||
// 12 flags
|
|
||||||
// 00 notif type
|
|
||||||
// 00 count
|
|
||||||
// 03000000
|
|
||||||
// 02
|
|
||||||
|
|
||||||
|
|
||||||
//image
|
|
||||||
//00
|
|
||||||
// 12
|
|
||||||
// 00
|
|
||||||
// 00
|
|
||||||
// 04000000
|
|
||||||
// 06
|
|
||||||
|
|
||||||
//0F00
|
|
||||||
// A913
|
|
||||||
// 00
|
|
||||||
// 12
|
|
||||||
// 0C
|
|
||||||
// 00
|
|
||||||
// 471D2A66
|
|
||||||
// 02
|
|
||||||
// BC14
|
|
||||||
|
|
||||||
//0F00
|
|
||||||
// A913
|
|
||||||
// 00
|
|
||||||
// 11
|
|
||||||
// 00
|
|
||||||
// 00
|
|
||||||
// 461D2A66
|
|
||||||
// 00
|
|
||||||
// 8C00
|
|
||||||
private int getCategoryFlags(NotificationType notificationType) {
|
private int getCategoryFlags(NotificationType notificationType) {
|
||||||
EnumSet<NotificationFlag> flags = EnumSet.noneOf(NotificationFlag.class);
|
EnumSet<NotificationFlag> flags = EnumSet.noneOf(NotificationFlag.class);
|
||||||
if (this.hasActions && this.useLegacyActions) { //only needed for legacy actions
|
if (this.hasActions && this.useLegacyActions) { //only needed for legacy actions
|
||||||
|
Loading…
Reference in New Issue
Block a user