From 0bdf9d9e28572bba38fd36ad518e817dbdd04fe5 Mon Sep 17 00:00:00 2001 From: mueller-ma Date: Sat, 15 Apr 2023 21:08:03 +0200 Subject: Add option to enable sleep timer based on current time (#6384) --- .../core/preferences/SleepTimerPreferences.java | 40 +++++++++++++++-- .../core/service/playback/PlaybackService.java | 50 ++++++++++++++-------- 2 files changed, 68 insertions(+), 22 deletions(-) (limited to 'core') diff --git a/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java b/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java index b56e7e6f3..96ffe5cb6 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java +++ b/core/src/main/java/de/danoeh/antennapod/core/preferences/SleepTimerPreferences.java @@ -2,9 +2,10 @@ package de.danoeh.antennapod.core.preferences; import android.content.Context; import android.content.SharedPreferences; -import androidx.annotation.NonNull; import android.util.Log; +import androidx.annotation.NonNull; + import java.util.concurrent.TimeUnit; public class SleepTimerPreferences { @@ -17,8 +18,12 @@ public class SleepTimerPreferences { private static final String PREF_VIBRATE = "Vibrate"; private static final String PREF_SHAKE_TO_RESET = "ShakeToReset"; private static final String PREF_AUTO_ENABLE = "AutoEnable"; + private static final String PREF_AUTO_ENABLE_FROM = "AutoEnableFrom"; + private static final String PREF_AUTO_ENABLE_TO = "AutoEnableTo"; - private static final String DEFAULT_VALUE = "15"; + private static final String DEFAULT_LAST_TIMER = "15"; + private static final int DEFAULT_AUTO_ENABLE_FROM = 22; + private static final int DEFAULT_AUTO_ENABLE_TO = 6; private static SharedPreferences prefs; @@ -37,7 +42,7 @@ public class SleepTimerPreferences { } public static String lastTimerValue() { - return prefs.getString(PREF_VALUE, DEFAULT_VALUE); + return prefs.getString(PREF_VALUE, DEFAULT_LAST_TIMER); } public static long timerMillis() { @@ -69,4 +74,33 @@ public class SleepTimerPreferences { return prefs.getBoolean(PREF_AUTO_ENABLE, false); } + public static void setAutoEnableFrom(int hourOfDay) { + prefs.edit().putInt(PREF_AUTO_ENABLE_FROM, hourOfDay).apply(); + } + + public static int autoEnableFrom() { + return prefs.getInt(PREF_AUTO_ENABLE_FROM, DEFAULT_AUTO_ENABLE_FROM); + } + + public static void setAutoEnableTo(int hourOfDay) { + prefs.edit().putInt(PREF_AUTO_ENABLE_TO, hourOfDay).apply(); + } + + public static int autoEnableTo() { + return prefs.getInt(PREF_AUTO_ENABLE_TO, DEFAULT_AUTO_ENABLE_TO); + } + + public static boolean isInTimeRange(int from, int to, int current) { + // Range covers one day + if (from < to) { + return from <= current && current < to; + } + + // Range covers two days + if (from <= current) { + return true; + } + + return current < to; + } } diff --git a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java index f207339bc..da23ebf53 100644 --- a/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java +++ b/core/src/main/java/de/danoeh/antennapod/core/service/playback/PlaybackService.java @@ -44,37 +44,22 @@ import androidx.core.app.NotificationCompat; import androidx.core.app.NotificationManagerCompat; import androidx.media.MediaBrowserServiceCompat; -import de.danoeh.antennapod.core.service.QuickSettingsTileService; -import de.danoeh.antennapod.core.util.playback.PlayableUtils; -import de.danoeh.antennapod.event.playback.BufferUpdateEvent; -import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; -import de.danoeh.antennapod.event.PlayerErrorEvent; -import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent; -import de.danoeh.antennapod.model.feed.FeedItemFilter; -import de.danoeh.antennapod.model.feed.SortOrder; -import de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer; -import de.danoeh.antennapod.playback.base.PlayerStatus; -import de.danoeh.antennapod.playback.cast.CastPsmp; -import de.danoeh.antennapod.playback.cast.CastStateListener; -import de.danoeh.antennapod.storage.preferences.UserPreferences; import org.greenrobot.eventbus.EventBus; import org.greenrobot.eventbus.Subscribe; import org.greenrobot.eventbus.ThreadMode; import java.util.ArrayList; +import java.util.Calendar; import java.util.Collections; +import java.util.GregorianCalendar; import java.util.List; import java.util.concurrent.TimeUnit; import de.danoeh.antennapod.core.R; -import de.danoeh.antennapod.event.MessageEvent; -import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; -import de.danoeh.antennapod.event.settings.SkipIntroEndingChangedEvent; -import de.danoeh.antennapod.event.settings.SpeedPresetChangedEvent; -import de.danoeh.antennapod.event.settings.VolumeAdaptionChangedEvent; import de.danoeh.antennapod.core.preferences.PlaybackPreferences; import de.danoeh.antennapod.core.preferences.SleepTimerPreferences; import de.danoeh.antennapod.core.receiver.MediaButtonReceiver; +import de.danoeh.antennapod.core.service.QuickSettingsTileService; import de.danoeh.antennapod.core.storage.DBReader; import de.danoeh.antennapod.core.storage.DBWriter; import de.danoeh.antennapod.core.storage.FeedSearcher; @@ -83,14 +68,31 @@ import de.danoeh.antennapod.core.util.FeedItemUtil; import de.danoeh.antennapod.core.util.IntentUtils; import de.danoeh.antennapod.core.util.NetworkUtils; import de.danoeh.antennapod.core.util.gui.NotificationUtils; +import de.danoeh.antennapod.core.util.playback.PlayableUtils; import de.danoeh.antennapod.core.util.playback.PlaybackServiceStarter; import de.danoeh.antennapod.core.widget.WidgetUpdater; +import de.danoeh.antennapod.event.MessageEvent; +import de.danoeh.antennapod.event.PlayerErrorEvent; +import de.danoeh.antennapod.event.playback.BufferUpdateEvent; +import de.danoeh.antennapod.event.playback.PlaybackPositionEvent; +import de.danoeh.antennapod.event.playback.PlaybackServiceEvent; +import de.danoeh.antennapod.event.playback.SleepTimerUpdatedEvent; +import de.danoeh.antennapod.event.settings.SkipIntroEndingChangedEvent; +import de.danoeh.antennapod.event.settings.SpeedPresetChangedEvent; +import de.danoeh.antennapod.event.settings.VolumeAdaptionChangedEvent; import de.danoeh.antennapod.model.feed.Feed; import de.danoeh.antennapod.model.feed.FeedItem; +import de.danoeh.antennapod.model.feed.FeedItemFilter; import de.danoeh.antennapod.model.feed.FeedMedia; import de.danoeh.antennapod.model.feed.FeedPreferences; +import de.danoeh.antennapod.model.feed.SortOrder; import de.danoeh.antennapod.model.playback.MediaType; import de.danoeh.antennapod.model.playback.Playable; +import de.danoeh.antennapod.playback.base.PlaybackServiceMediaPlayer; +import de.danoeh.antennapod.playback.base.PlayerStatus; +import de.danoeh.antennapod.playback.cast.CastPsmp; +import de.danoeh.antennapod.playback.cast.CastStateListener; +import de.danoeh.antennapod.storage.preferences.UserPreferences; import de.danoeh.antennapod.ui.appstartintent.MainActivityStarter; import de.danoeh.antennapod.ui.appstartintent.VideoPlayerActivityStarter; import io.reactivex.Completable; @@ -797,8 +799,18 @@ public class PlaybackService extends MediaBrowserServiceCompat { stateManager.validStartCommandWasReceived(); stateManager.startForeground(R.id.notification_playing, notificationBuilder.build()); // set sleep timer if auto-enabled + boolean autoEnableByTime = true; + int fromSetting = SleepTimerPreferences.autoEnableFrom(); + int toSetting = SleepTimerPreferences.autoEnableTo(); + if (fromSetting != toSetting) { + Calendar now = new GregorianCalendar(); + now.setTimeInMillis(System.currentTimeMillis()); + int currentHour = now.get(Calendar.HOUR_OF_DAY); + autoEnableByTime = SleepTimerPreferences.isInTimeRange(fromSetting, toSetting, currentHour); + } + if (newInfo.oldPlayerStatus != null && newInfo.oldPlayerStatus != PlayerStatus.SEEKING - && SleepTimerPreferences.autoEnable() && !sleepTimerActive()) { + && SleepTimerPreferences.autoEnable() && autoEnableByTime && !sleepTimerActive()) { setSleepTimer(SleepTimerPreferences.timerMillis()); EventBus.getDefault().post(new MessageEvent(getString(R.string.sleep_timer_enabled_label), PlaybackService.this::disableSleepTimer)); -- cgit v1.2.3