diff --git a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt
index 3675ac171..fd840c68f 100644
--- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt
+++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt
@@ -94,6 +94,9 @@ object PreferenceKeys {
const val REQUIRED_NETWORK = "required_network"
const val LAST_STREAM_VIDEO_ID = "last_stream_video_id"
const val IGNORED_NOTIFICATION_CHANNELS = "ignored_notification_channels"
+ const val NOTIFICATION_TIME_ENABLED = "notification_time"
+ const val NOTIFICATION_START_TIME = "notification_start_time"
+ const val NOTIFICATION_END_TIME = "notification_end_time"
/**
* Advanced
diff --git a/app/src/main/java/com/github/libretube/ui/views/TimePickerPreference.kt b/app/src/main/java/com/github/libretube/ui/views/TimePickerPreference.kt
new file mode 100644
index 000000000..3eabff8d8
--- /dev/null
+++ b/app/src/main/java/com/github/libretube/ui/views/TimePickerPreference.kt
@@ -0,0 +1,65 @@
+package com.github.libretube.ui.views
+
+import android.app.Activity
+import android.content.Context
+import android.text.format.DateFormat.is24HourFormat
+import android.util.AttributeSet
+import androidx.appcompat.app.AppCompatActivity
+import androidx.preference.Preference
+import com.github.libretube.util.PreferenceHelper
+import com.github.libretube.util.TextUtils
+import com.google.android.material.timepicker.MaterialTimePicker
+import com.google.android.material.timepicker.TimeFormat
+
+class TimePickerPreference(
+ context: Context,
+ attributeSet: AttributeSet
+) : Preference(context, attributeSet) {
+ override fun getSummary(): CharSequence {
+ val prefStr = PreferenceHelper.getString(key, "")
+ return if (prefStr != "") prefStr else "00:00"
+ }
+
+ override fun onClick() {
+ val picker = MaterialTimePicker.Builder()
+ .setInputMode(MaterialTimePicker.INPUT_MODE_CLOCK)
+ .setTimeFormat(getTimeFormat())
+ .setHour(getHour())
+ .setMinute(getMinutes())
+ .build()
+
+ picker.addOnPositiveButtonClickListener {
+ val timeStr = getTimeStr(picker)
+ PreferenceHelper.putString(key, timeStr)
+ summary = timeStr
+ }
+ picker.show((context as AppCompatActivity).supportFragmentManager, null)
+ }
+
+ private fun getTimeFormat(): Int {
+ return if (is24HourFormat(context)) TimeFormat.CLOCK_24H else TimeFormat.CLOCK_12H
+ }
+
+ private fun getPrefStringPart(index: Int): String? {
+ val prefStr = PreferenceHelper.getString(key, "").split(SEPARATOR).getOrNull(index)
+ return if (prefStr != "") prefStr else null
+ }
+
+ private fun getHour(): Int {
+ return getPrefStringPart(0)?.toInt() ?: 0
+ }
+
+ private fun getMinutes(): Int {
+ return getPrefStringPart(1)?.toInt() ?: 0
+ }
+
+ private fun getTimeStr(picker: MaterialTimePicker): String {
+ val hour = TextUtils.toTwoDecimalsString(picker.hour)
+ val minute = TextUtils.toTwoDecimalsString(picker.minute)
+ return "$hour$SEPARATOR$minute"
+ }
+
+ companion object {
+ const val SEPARATOR = ":"
+ }
+}
diff --git a/app/src/main/java/com/github/libretube/util/NotificationHelper.kt b/app/src/main/java/com/github/libretube/util/NotificationHelper.kt
index ec467e9fb..046401f99 100644
--- a/app/src/main/java/com/github/libretube/util/NotificationHelper.kt
+++ b/app/src/main/java/com/github/libretube/util/NotificationHelper.kt
@@ -8,6 +8,7 @@ import androidx.work.PeriodicWorkRequest
import androidx.work.WorkManager
import com.github.libretube.constants.NOTIFICATION_WORK_NAME
import com.github.libretube.constants.PreferenceKeys
+import com.github.libretube.workers.NotificationWorker
import java.util.concurrent.TimeUnit
object NotificationHelper {
diff --git a/app/src/main/java/com/github/libretube/util/TextUtils.kt b/app/src/main/java/com/github/libretube/util/TextUtils.kt
index 63b8966f1..8b8cc4008 100644
--- a/app/src/main/java/com/github/libretube/util/TextUtils.kt
+++ b/app/src/main/java/com/github/libretube/util/TextUtils.kt
@@ -5,4 +5,8 @@ object TextUtils {
* Separator used for descriptions
*/
const val SEPARATOR = " • "
+
+ fun toTwoDecimalsString(num: Int): String {
+ return if (num >= 10) num.toString() else "0$num"
+ }
}
diff --git a/app/src/main/java/com/github/libretube/util/NotificationWorker.kt b/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt
similarity index 98%
rename from app/src/main/java/com/github/libretube/util/NotificationWorker.kt
rename to app/src/main/java/com/github/libretube/workers/NotificationWorker.kt
index 351918cad..d31b4a9c0 100644
--- a/app/src/main/java/com/github/libretube/util/NotificationWorker.kt
+++ b/app/src/main/java/com/github/libretube/workers/NotificationWorker.kt
@@ -1,4 +1,4 @@
-package com.github.libretube.util
+package com.github.libretube.workers
import android.app.NotificationManager
import android.app.PendingIntent
@@ -15,6 +15,7 @@ import com.github.libretube.api.SubscriptionHelper
import com.github.libretube.constants.PUSH_CHANNEL_ID
import com.github.libretube.extensions.toID
import com.github.libretube.ui.activities.MainActivity
+import com.github.libretube.util.PreferenceHelper
import kotlinx.coroutines.async
import kotlinx.coroutines.runBlocking
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index fe3fb8831..c8aa47125 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -360,6 +360,11 @@
Confirm unsubscribing
Show a confirmation dialog before unsubscribing.
Play all
+ Time
+ Start time
+ End time
+ Notification time
+ Time span in which notifications are allowed to show.
Download Service
diff --git a/app/src/main/res/xml/notification_settings.xml b/app/src/main/res/xml/notification_settings.xml
index 4d6568710..b0b536dd2 100644
--- a/app/src/main/res/xml/notification_settings.xml
+++ b/app/src/main/res/xml/notification_settings.xml
@@ -31,4 +31,22 @@
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file