1
0
mirror of https://codeberg.org/Freeyourgadget/Gadgetbridge synced 2024-12-26 02:25:50 +01:00

Garmin: calendar integration improvements

use the protobuf fields described in the documentation[0]
build the message according to the requested fields

[0] https://gadgetbridge.org/internals/specifics/garmin-protocol/#calendarevent
This commit is contained in:
Daniele Gobbetti 2024-04-25 14:59:08 +02:00
parent ed0d41aa3a
commit e46ea03693
2 changed files with 49 additions and 14 deletions

View File

@ -3,7 +3,6 @@ package nodomain.freeyourgadget.gadgetbridge.service.devices.garmin;
import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.InvalidProtocolBufferException;
import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import org.slf4j.LoggerFactory;
@ -157,16 +156,33 @@ public class ProtocolBufferHandler implements MessageHandler {
LOG.debug("CalendarService Skipping event {} that is out of requested time range", mEvt.getTitle()); LOG.debug("CalendarService Skipping event {} that is out of requested time range", mEvt.getTitle());
continue; continue;
} }
if (!calendarServiceRequest.getIncludeAllDay() && mEvt.isAllDay()) {
LOG.debug("CalendarService Skipping event {} that is AllDay", mEvt.getTitle());
continue;
}
watchEvents.add(GdiCalendarService.CalendarService.CalendarEvent.newBuilder() if (watchEvents.size() >= calendarServiceRequest.getMaxEvents() * 2) { //NOTE: Tested with values higher than double of the reported max without issues
.setTitle(mEvt.getTitle()) LOG.debug("Reached the maximum number of events supported by the watch");
break;
}
final GdiCalendarService.CalendarService.CalendarEvent.Builder event = GdiCalendarService.CalendarService.CalendarEvent.newBuilder()
.setTitle(mEvt.getTitle().substring(0, Math.min(mEvt.getTitle().length(), calendarServiceRequest.getMaxTitleLength())))
.setAllDay(mEvt.isAllDay()) .setAllDay(mEvt.isAllDay())
.setBegin(mEvt.getBeginSeconds()) .setStartDate(mEvt.getBeginSeconds())
.setEnd(mEvt.getEndSeconds()) .setEndDate(mEvt.getEndSeconds());
.setLocation(StringUtils.defaultString(mEvt.getLocation()))
.setDescription(StringUtils.defaultString(mEvt.getDescription())) if (calendarServiceRequest.getIncludeLocation() && mEvt.getLocation() != null) {
.build() event.setLocation(mEvt.getLocation().substring(0, Math.min(mEvt.getLocation().length(), calendarServiceRequest.getMaxLocationLength())));
); }
if (calendarServiceRequest.getIncludeDescription() && mEvt.getDescription() != null) {
event.setDescription(mEvt.getDescription().substring(0, Math.min(mEvt.getDescription().length(), calendarServiceRequest.getMaxDescriptionLength())));
}
if (calendarServiceRequest.getIncludeOrganizer() && mEvt.getOrganizer() != null) {
event.setDescription(mEvt.getOrganizer().substring(0, Math.min(mEvt.getOrganizer().length(), calendarServiceRequest.getMaxOrganizerLength())));
}
watchEvents.add(event.build());
} }
LOG.debug("CalendarService Sending {} events to watch", watchEvents.size()); LOG.debug("CalendarService Sending {} events to watch", watchEvents.size());
@ -174,7 +190,7 @@ public class ProtocolBufferHandler implements MessageHandler {
GdiCalendarService.CalendarService.newBuilder().setCalendarResponse( GdiCalendarService.CalendarService.newBuilder().setCalendarResponse(
GdiCalendarService.CalendarService.CalendarServiceResponse.newBuilder() GdiCalendarService.CalendarService.CalendarServiceResponse.newBuilder()
.addAllCalendarEvent(watchEvents) .addAllCalendarEvent(watchEvents)
.setUnknown(1) .setStatus(GdiCalendarService.CalendarService.CalendarServiceResponse.ResponseStatus.OK)
) )
).build(); ).build();
} }
@ -182,7 +198,7 @@ public class ProtocolBufferHandler implements MessageHandler {
return GdiSmartProto.Smart.newBuilder().setCalendarService( return GdiSmartProto.Smart.newBuilder().setCalendarService(
GdiCalendarService.CalendarService.newBuilder().setCalendarResponse( GdiCalendarService.CalendarService.newBuilder().setCalendarResponse(
GdiCalendarService.CalendarService.CalendarServiceResponse.newBuilder() GdiCalendarService.CalendarService.CalendarServiceResponse.newBuilder()
.setUnknown(0) .setStatus(GdiCalendarService.CalendarService.CalendarServiceResponse.ResponseStatus.UNKNOWN_RESPONSE_STATUS)
) )
).build(); ).build();
} }

View File

@ -11,19 +11,38 @@ message CalendarService {
message CalendarServiceRequest { message CalendarServiceRequest {
optional uint32 begin = 1; optional uint32 begin = 1;
optional uint32 end = 2; optional uint32 end = 2;
optional bool include_organizer = 3 [default = false];
optional bool include_title = 4 [default = true];
optional bool include_location = 5 [default = true];
optional bool include_description = 6 [default = false];
optional bool include_start_date = 7 [default = true];
optional bool include_end_date = 8 [default = false];
optional bool include_all_day = 9 [default = false];
optional uint32 max_organizer_length = 10;
optional uint32 max_title_length = 11;
optional uint32 max_location_length = 12;
optional uint32 max_description_length = 13;
optional uint32 max_events = 14;
} }
message CalendarServiceResponse { message CalendarServiceResponse {
optional uint32 unknown = 1; enum ResponseStatus {
UNKNOWN_RESPONSE_STATUS = 0;
OK = 1;
INVALID_DATE_RANGE = 2;
}
optional ResponseStatus status = 1;
repeated CalendarEvent calendar_event = 2; repeated CalendarEvent calendar_event = 2;
} }
message CalendarEvent { message CalendarEvent {
optional string organizer = 1;
optional string title = 2; optional string title = 2;
optional string location = 3 [default = ""]; optional string location = 3 [default = ""];
optional string description = 4 [default = ""]; optional string description = 4 [default = ""];
optional uint32 begin = 5; optional uint32 start_date = 5;
optional uint32 end = 6; optional uint32 end_date = 6;
optional bool all_day = 7; optional bool all_day = 7;
repeated uint32 reminder_time_in_secs = 8;
} }
} }