From c9c9b420dc6777c5c1faf70bbba7e36faabf2a92 Mon Sep 17 00:00:00 2001 From: Andreas Shimokawa Date: Tue, 24 May 2016 11:19:57 +0200 Subject: [PATCH] Pebble: Send sunrise and sunset events to the pebble every day using AlarmManager --- .../activities/DebugActivity.java | 47 ---------- .../externalevents/AlarmReceiver.java | 88 +++++++++++++++++++ .../service/DeviceCommunicationService.java | 10 +++ 3 files changed, 98 insertions(+), 47 deletions(-) create mode 100644 app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/AlarmReceiver.java 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 f52c440e8..c832148f4 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/DebugActivity.java @@ -230,53 +230,6 @@ public class DebugActivity extends GBActivity { @Override public void onClick(View v) { GBApplication.deviceService().onSetTime(); - - //FIXME: dont do it here, and make another button - GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNRISE, 1); - GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNRISE, 2); - GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNSET, 1); - GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNSET, 2); - - Prefs prefs = GBApplication.getPrefs(); - - float latitude = prefs.getFloat("location_latitude", 0); - float longitude = prefs.getFloat("location_longitude", 0); - final GregorianCalendar dateTimeToday = new GregorianCalendar(); - final GregorianCalendar dateTimeTomorrow = new GregorianCalendar(); - dateTimeTomorrow.add(GregorianCalendar.DAY_OF_MONTH, 1); - - 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 (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/externalevents/AlarmReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/AlarmReceiver.java new file mode 100644 index 000000000..b725c4b75 --- /dev/null +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/AlarmReceiver.java @@ -0,0 +1,88 @@ +package nodomain.freeyourgadget.gadgetbridge.externalevents; + + +import android.app.AlarmManager; +import android.app.PendingIntent; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; + +import net.e175.klaus.solarpositioning.DeltaT; +import net.e175.klaus.solarpositioning.SPA; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.Calendar; +import java.util.GregorianCalendar; + +import nodomain.freeyourgadget.gadgetbridge.BuildConfig; +import nodomain.freeyourgadget.gadgetbridge.GBApplication; +import nodomain.freeyourgadget.gadgetbridge.model.CalendarEventSpec; +import nodomain.freeyourgadget.gadgetbridge.service.DeviceCommunicationService; +import nodomain.freeyourgadget.gadgetbridge.util.Prefs; + +public class AlarmReceiver extends BroadcastReceiver { + private static final Logger LOG = LoggerFactory.getLogger(DeviceCommunicationService.class); + + public AlarmReceiver() { + Context context = GBApplication.getContext(); + Intent intent = new Intent("DAILY_ALARM"); + intent.setPackage(BuildConfig.APPLICATION_ID); + PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, new Intent("DAILY_ALARM"), 0); + AlarmManager am = (AlarmManager) (context.getSystemService(Context.ALARM_SERVICE)); + + am.setInexactRepeating(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + 10000, AlarmManager.INTERVAL_DAY, pendingIntent); + } + + @Override + public void onReceive(Context context, Intent intent) { + LOG.info("will resend sunrise and sunset events"); + + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNRISE, 1); + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNRISE, 2); + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNSET, 1); + GBApplication.deviceService().onDeleteCalendarEvent(CalendarEventSpec.TYPE_SUNSET, 2); + + Prefs prefs = GBApplication.getPrefs(); + + float latitude = prefs.getFloat("location_latitude", 0); + float longitude = prefs.getFloat("location_longitude", 0); + final GregorianCalendar dateTimeToday = new GregorianCalendar(); + final GregorianCalendar dateTimeTomorrow = new GregorianCalendar(); + dateTimeTomorrow.add(GregorianCalendar.DAY_OF_MONTH, 1); + + 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 (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/service/DeviceCommunicationService.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java index 4e5b73eab..ed7edc018 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -25,6 +25,7 @@ import java.util.UUID; import nodomain.freeyourgadget.gadgetbridge.GBApplication; import nodomain.freeyourgadget.gadgetbridge.R; +import nodomain.freeyourgadget.gadgetbridge.externalevents.AlarmReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.BluetoothConnectReceiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.K9Receiver; import nodomain.freeyourgadget.gadgetbridge.externalevents.MusicPlaybackReceiver; @@ -117,6 +118,7 @@ public class DeviceCommunicationService extends Service implements SharedPrefere private MusicPlaybackReceiver mMusicPlaybackReceiver = null; private TimeChangeReceiver mTimeChangeReceiver = null; private BluetoothConnectReceiver mBlueToothConnectReceiver = null; + private AlarmReceiver mAlarmReceiver = null; private Random mRandom = new Random(); @@ -495,6 +497,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere mBlueToothConnectReceiver = new BluetoothConnectReceiver(this); registerReceiver(mBlueToothConnectReceiver, new IntentFilter(BluetoothDevice.ACTION_ACL_CONNECTED)); } + if (mAlarmReceiver == null) { + mAlarmReceiver = new AlarmReceiver(); + registerReceiver(mAlarmReceiver, new IntentFilter("DAILY_ALARM")); + } } else { if (mPhoneCallReceiver != null) { unregisterReceiver(mPhoneCallReceiver); @@ -524,6 +530,10 @@ public class DeviceCommunicationService extends Service implements SharedPrefere unregisterReceiver(mBlueToothConnectReceiver); mBlueToothConnectReceiver = null; } + if (mAlarmReceiver != null) { + unregisterReceiver(mAlarmReceiver); + mAlarmReceiver = null; + } } }