From cc5078332ba01d71b13980f61c3f697f5a356260 Mon Sep 17 00:00:00 2001 From: Davis Mosenkovs Date: Thu, 15 Feb 2024 22:32:44 +0200 Subject: [PATCH] TimeChangeReceiver: Ensure the alarm is set Ensure TimeChangeReceiver alarm is scheduled when enabling datetime_synconconnect and registering TimeChangeReceiver broadcast receiver. It is important to re-schedule the alarm after registering broadcast receiver, because: 1. if broadcast receiver was unregistered while previous alarm arrived, there is no alarm scheduled; 2. re-scheduling the alarm resets the periodic time sync timer when first device is connected (which is desired). It is important to re-schedule the alarm when datetime_synconconnect gets enabled, because there might be no alarm scheduled. Call onSetTime() when enabling datetime_synconconnect. --- .../freeyourgadget/gadgetbridge/GBApplication.java | 1 - .../gadgetbridge/activities/SettingsActivity.java | 12 ++++++++++++ .../externalevents/TimeChangeReceiver.java | 6 ++++++ .../service/DeviceCommunicationService.java | 3 +++ 4 files changed, 21 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java index dab02000a..43e75585a 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/GBApplication.java @@ -246,7 +246,6 @@ public class GBApplication extends Application { loadAppsPebbleBlackList(); PeriodicExporter.enablePeriodicExport(context); - TimeChangeReceiver.scheduleNextDstChangeOrPeriodicSync(context); if (isRunningMarshmallowOrLater()) { notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java index bdd9cb090..b4f15caa2 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/activities/SettingsActivity.java @@ -71,6 +71,7 @@ import nodomain.freeyourgadget.gadgetbridge.devices.miband.MiBandPreferencesActi import nodomain.freeyourgadget.gadgetbridge.devices.pebble.PebbleSettingsActivity; import nodomain.freeyourgadget.gadgetbridge.devices.qhybrid.ConfigActivity; import nodomain.freeyourgadget.gadgetbridge.devices.zetime.ZeTimePreferenceActivity; +import nodomain.freeyourgadget.gadgetbridge.externalevents.TimeChangeReceiver; import nodomain.freeyourgadget.gadgetbridge.model.Weather; import nodomain.freeyourgadget.gadgetbridge.util.AndroidUtils; import nodomain.freeyourgadget.gadgetbridge.util.FileUtils; @@ -173,6 +174,17 @@ public class SettingsActivity extends AbstractSettingsActivityV2 { }); } + pref = findPreference("datetime_synconconnect"); + if (pref != null) { + pref.setOnPreferenceChangeListener((preference, newVal) -> { + if (Boolean.TRUE.equals(newVal)) { + TimeChangeReceiver.scheduleNextDstChangeOrPeriodicSync(requireContext()); + GBApplication.deviceService().onSetTime(); + } + return true; + }); + } + pref = findPreference("log_to_file"); if (pref != null) { pref.setOnPreferenceChangeListener((preference, newVal) -> { diff --git a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/TimeChangeReceiver.java b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/TimeChangeReceiver.java index 79b4d9ade..5899cb911 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/TimeChangeReceiver.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/externalevents/TimeChangeReceiver.java @@ -143,6 +143,12 @@ public class TimeChangeReceiver extends BroadcastReceiver { } } + public static void ifEnabledScheduleNextDstChangeOrPeriodicSync(final Context context) { + if (GBApplication.getPrefs().getBoolean("datetime_synconconnect", true)) { + scheduleNextDstChangeOrPeriodicSync(context); + } + } + private static boolean canScheduleExactAlarms(final Context context, final AlarmManager am) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { return am.canScheduleExactAlarms(); 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 41324f009..ce9f0a0ec 100644 --- a/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java +++ b/app/src/main/java/nodomain/freeyourgadget/gadgetbridge/service/DeviceCommunicationService.java @@ -1181,6 +1181,9 @@ public class DeviceCommunicationService extends Service implements SharedPrefere filter.addAction("android.intent.action.TIMEZONE_CHANGED"); filter.addAction(TimeChangeReceiver.ACTION_DST_CHANGED_OR_PERIODIC_SYNC); registerReceiver(mTimeChangeReceiver, filter); + // Ensure alarm is scheduled after registering broadcast receiver + // (this is important in case receiver was unregistered when the previous alarm arrived). + TimeChangeReceiver.ifEnabledScheduleNextDstChangeOrPeriodicSync(this); } if (mBlueToothPairingRequestReceiver == null) { mBlueToothPairingRequestReceiver = new BluetoothPairingRequestReceiver(this);