diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java index 42f1c8151..6a8e539dc 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java @@ -231,33 +231,50 @@ public class DebugActivity extends GBActivity { public void onClick(View v) { GBApplication.deviceService().onSetTime(); - //FIXME: dont do it here, make another button + //FIXME: dont do it here, and make another button + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNRISE, 1); + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNRISE, 3); + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNSET, 2); + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNSET, 4); Prefs prefs = GBApplication.getPrefs(); float latitude = prefs.getFloat("location_latitude", 0); float longitude = prefs.getFloat("location_longitude", 0); - final GregorianCalendar dateTime = new GregorianCalendar(); - GregorianCalendar[] sunriseTransitSet = SPA.calculateSunriseTransitSet(dateTime, latitude, longitude, DeltaT.estimate(dateTime)); + final GregorianCalendar dateTimeToday = new GregorianCalendar(); + final GregorianCalendar dateTimeTomorrow = new GregorianCalendar(); + dateTimeTomorrow.add(GregorianCalendar.DAY_OF_MONTH, 1); - if (sunriseTransitSet[0] != null) { - CalendarEventSpec calendarEventSpec = new CalendarEventSpec(); - calendarEventSpec.id = -1; - calendarEventSpec.type = CalendarEventSpec.TYPE_SUNRISE; - calendarEventSpec.timestamp = (int) (sunriseTransitSet[0].getTimeInMillis() / 1000); - calendarEventSpec.durationInSeconds = 0; - calendarEventSpec.title = "Sunrise"; - calendarEventSpec.description = null; + GregorianCalendar[] sunriseTransitSetToday = SPA.calculateSunriseTransitSet(dateTimeToday, latitude, longitude, DeltaT.estimate(dateTimeToday)); + GregorianCalendar[] sunriseTransitSetTomorrow = SPA.calculateSunriseTransitSet(dateTimeTomorrow, latitude, longitude, DeltaT.estimate(dateTimeToday)); + + CalendarEventSpec calendarEventSpec = new CalendarEventSpec(); + calendarEventSpec.durationInSeconds = 0; + calendarEventSpec.description = null; + + calendarEventSpec.type = CalendarEventSpec.TYPE_SUNRISE; + calendarEventSpec.title = "Sunrise"; + if (sunriseTransitSetToday[0] != null) { + calendarEventSpec.id = 1; + calendarEventSpec.timestamp = (int) (sunriseTransitSetToday[0].getTimeInMillis() / 1000); GBApplication.deviceService().onAddCalendarEvent(calendarEventSpec); } - if (sunriseTransitSet[2] != null) { - CalendarEventSpec calendarEventSpec = new CalendarEventSpec(); - calendarEventSpec.id = -1; - calendarEventSpec.type = CalendarEventSpec.TYPE_SUNSET; - calendarEventSpec.timestamp = (int) (sunriseTransitSet[2].getTimeInMillis() / 1000); - calendarEventSpec.durationInSeconds = 0; - calendarEventSpec.title = "Sunset"; - calendarEventSpec.description = null; + if (sunriseTransitSetTomorrow[0] != null) { + calendarEventSpec.id = 2; + calendarEventSpec.timestamp = (int) (sunriseTransitSetTomorrow[0].getTimeInMillis() / 1000); + GBApplication.deviceService().onAddCalendarEvent(calendarEventSpec); + } + + calendarEventSpec.type = CalendarEventSpec.TYPE_SUNSET; + calendarEventSpec.title = "Sunset"; + if (sunriseTransitSetToday[2] != null) { + calendarEventSpec.id = 1; + calendarEventSpec.timestamp = (int) (sunriseTransitSetToday[2].getTimeInMillis() / 1000); + GBApplication.deviceService().onAddCalendarEvent(calendarEventSpec); + } + if (sunriseTransitSetTomorrow[2] != null) { + calendarEventSpec.id = 2; + calendarEventSpec.timestamp = (int) (sunriseTransitSetTomorrow[2].getTimeInMillis() / 1000); GBApplication.deviceService().onAddCalendarEvent(calendarEventSpec); } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java index cc8486c9c..d4f44101f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/devices/EventHandler.java @@ -54,4 +54,6 @@ public interface EventHandler { void onEnableHeartRateSleepSupport(boolean enable); void onAddCalendarEvent(CalendarEventSpec calendarEventSpec); + + void onDeleteCalendarEvent(int type, long id); } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java index e2f0a2207..6c51e6b29 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/impl/GBDeviceService.java @@ -236,4 +236,12 @@ public class GBDeviceService implements DeviceService { .putExtra(EXTRA_CALENDAREVENT_DESCRIPTION, calendarEventSpec.description); invokeService(intent); } + + @Override + public void onDeleteCalendarEvent(int type, long id) { + Intent intent = createIntent().setAction(ACTION_DELETE_CALENDAREVENT) + .putExtra(EXTRA_CALENDAREVENT_TYPE, type) + .putExtra(EXTRA_CALENDAREVENT_ID, id); + invokeService(intent); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java index 927a258be..aaf02798b 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/model/DeviceService.java @@ -37,6 +37,7 @@ public interface DeviceService extends EventHandler { String ACTION_ENABLE_HEARTRATE_SLEEP_SUPPORT = PREFIX + ".action.enable_heartrate_sleep_support"; String ACTION_HEARTRATE_MEASUREMENT = PREFIX + ".action.hr_measurement"; String ACTION_ADD_CALENDAREVENT = PREFIX + ".action.add_calendarevent"; + String ACTION_DELETE_CALENDAREVENT = PREFIX + ".action.delete_calendarevent"; String EXTRA_DEVICE_ADDRESS = "device_address"; String EXTRA_NOTIFICATION_BODY = "notification_body"; String EXTRA_NOTIFICATION_FLAGS = "notification_flags"; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 57f48fcde..12e8d1c08 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -47,6 +47,7 @@ import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_AP import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_CALLSTATE; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_CONNECT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DELETEAPP; +import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DELETE_CALENDAREVENT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_DISCONNECT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ENABLE_HEARTRATE_SLEEP_SUPPORT; import static nodomain.freeyourgadget.gadgetbridge.model.DeviceService.ACTION_ENABLE_REALTIME_HEARTRATE_MEASUREMENT; @@ -284,6 +285,12 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mDeviceSupport.onAddCalendarEvent(calendarEventSpec); break; } + case ACTION_DELETE_CALENDAREVENT: { + long id = intent.getLongExtra(EXTRA_CALENDAREVENT_ID, -1); + int type = intent.getIntExtra(EXTRA_CALENDAREVENT_TYPE, -1); + mDeviceSupport.onDeleteCalendarEvent(type, id); + break; + } case ACTION_REBOOT: { mDeviceSupport.onReboot(); break; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java index 166c65cb2..6753f27e1 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/ServiceDeviceSupport.java @@ -277,4 +277,12 @@ public class ServiceDeviceSupport implements DeviceSupport { } delegate.onAddCalendarEvent(calendarEventSpec); } + + @Override + public void onDeleteCalendarEvent(int type, long id) { + if (checkBusy("delete calendar event")) { + return; + } + delegate.onDeleteCalendarEvent(type, id); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java index 393ad81a3..ea2d4d7cf 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/miband/MiBandSupport.java @@ -388,6 +388,11 @@ public class MiBandSupport extends AbstractBTLEDeviceSupport { // not supported } + @Override + public void onDeleteCalendarEvent(int type, long id) { + // not supported + } + /** * Part of device initialization process. Do not call manually. * diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java index 83433496d..c81b3f58f 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleProtocol.java @@ -452,7 +452,6 @@ public class PebbleProtocol extends GBDeviceProtocol { if (isFw3x) { // 3.x notification - //return encodeTimelinePin(id, (int) ((ts + 600) & 0xffffffffL), (short) 90, PebbleIconID.TIMELINE_CALENDAR, title); // really, this is just for testing return encodeBlobdbNotification(id, (int) (ts & 0xffffffffL), title, subtitle, notificationSpec.body, notificationSpec.sourceName, hasHandle, notificationSpec.type, notificationSpec.cannedReplies); } else if (mForceProtocol || notificationSpec.type != NotificationType.EMAIL) { // 2.x notification @@ -480,7 +479,12 @@ public class PebbleProtocol extends GBDeviceProtocol { iconId = PebbleIconID.TIMELINE_CALENDAR; } - return encodeTimelinePin(id, calendarEventSpec.timestamp, (short)calendarEventSpec.durationInSeconds, iconId, calendarEventSpec.title, calendarEventSpec.description); + return encodeTimelinePin(new UUID(calendarEventSpec.type, id), calendarEventSpec.timestamp, (short) calendarEventSpec.durationInSeconds, iconId, calendarEventSpec.title, calendarEventSpec.description); + } + + @Override + public byte[] encodeDeleteCalendarEvent(int type, long id) { + return encodeBlobdb(new UUID(type, id), BLOBDB_DELETE, BLOBDB_PIN, null); } @Override @@ -761,11 +765,10 @@ public class PebbleProtocol extends GBDeviceProtocol { return buf.array(); } - private byte[] encodeTimelinePin(long id, int timestamp, short duration, int icon_id, String title, String subtitle) { + private byte[] encodeTimelinePin(UUID uuid, int timestamp, short duration, int icon_id, String title, String subtitle) { final short TIMELINE_PIN_LENGTH = 46; icon_id |= 0x80000000; - UUID uuid = new UUID(mRandom.nextLong(), id); byte attributes_count = 2; byte actions_count = 0; diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java index 7834161c4..f6f5f78ab 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/devices/pebble/PebbleSupport.java @@ -126,4 +126,11 @@ public class PebbleSupport extends AbstractSerialDeviceSupport { super.onAddCalendarEvent(calendarEventSpec); } } + + @Override + public void onDeleteCalendarEvent(int type, long id) { + if (reconnect()) { + super.onDeleteCalendarEvent(type, id); + } + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java index dee778211..18be585d9 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/AbstractSerialDeviceSupport.java @@ -188,9 +188,16 @@ public abstract class AbstractSerialDeviceSupport extends AbstractDeviceSupport byte[] bytes = gbDeviceProtocol.encodeEnableRealtimeHeartRateMeasurement(enable); sendToDevice(bytes); } + @Override public void onAddCalendarEvent(CalendarEventSpec calendarEventSpec) { byte[] bytes = gbDeviceProtocol.encodeAddCalendarEvent(calendarEventSpec); sendToDevice(bytes); } + + @Override + public void onDeleteCalendarEvent(int type, long id) { + byte[] bytes = gbDeviceProtocol.encodeDeleteCalendarEvent(type, id); + sendToDevice(bytes); + } } diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java index 1005f9800..79337b5d2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/serial/GBDeviceProtocol.java @@ -70,6 +70,10 @@ public abstract class GBDeviceProtocol { return null; } + public byte[] encodeDeleteCalendarEvent(int type, long id) { + return null; + } + public GBDeviceEvent[] decodeResponse(byte[] responseData) { return null; } diff --git a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java index 0c8056da6..45eea6ebf 100644 --- a/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java +++ b/app/src/test/java/nodomain/freeyourgadget/gadgetbridge/service/TestDeviceSupport.java @@ -136,6 +136,11 @@ public class TestDeviceSupport extends AbstractDeviceSupport { } + @Override + public void onDeleteCalendarEvent(int type, long id) { + + } + @Override public void onEnableRealtimeHeartRateMeasurement(boolean enable) {