Pebble: send sunrise/sunset to watch for today and tomorrow, also delete previous timeline pins

here
Andreas Shimokawa 2016-05-16 23:37:40 +02:00
parent 017f650b3f
commit 4bd578ebea
12 changed files with 97 additions and 23 deletions

View File

@ -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);
}
}

View File

@ -54,4 +54,6 @@ public interface EventHandler {
void onEnableHeartRateSleepSupport(boolean enable);
void onAddCalendarEvent(CalendarEventSpec calendarEventSpec);
void onDeleteCalendarEvent(int type, long id);
}

View File

@ -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);
}
}

View File

@ -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";

View File

@ -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;

View File

@ -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);
}
}

View File

@ -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.
*

View File

@ -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;

View File

@ -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);
}
}
}

View File

@ -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);
}
}

View File

@ -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;
}

View File

@ -136,6 +136,11 @@ public class TestDeviceSupport extends AbstractDeviceSupport {
}
@Override
public void onDeleteCalendarEvent(int type, long id) {
}
@Override
public void onEnableRealtimeHeartRateMeasurement(boolean enable) {