From 2bf5b6e6f768178b5c4edd51ad005fc88a1c4409 Mon Sep 17 00:00:00 2001 From: Bnyro Date: Tue, 17 Jan 2023 18:21:59 +0100 Subject: [PATCH] Replace the break reminder with a sleep timer --- .../libretube/constants/PreferenceKeys.kt | 4 +- .../libretube/ui/activities/MainActivity.kt | 17 +++-- .../ui/preferences/GeneralSettings.kt | 15 +++-- .../libretube/ui/tools/BreakReminder.kt | 55 ---------------- .../github/libretube/ui/tools/SleepTimer.kt | 62 +++++++++++++++++++ app/src/main/res/values/strings.xml | 1 + app/src/main/res/xml/general_settings.xml | 6 +- 7 files changed, 85 insertions(+), 75 deletions(-) delete mode 100644 app/src/main/java/com/github/libretube/ui/tools/BreakReminder.kt create mode 100644 app/src/main/java/com/github/libretube/ui/tools/SleepTimer.kt 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 56d9070d4..f460c9f94 100644 --- a/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt +++ b/app/src/main/java/com/github/libretube/constants/PreferenceKeys.kt @@ -18,8 +18,8 @@ object PreferenceKeys { const val LANGUAGE = "language" const val REGION = "region" const val AUTO_ROTATION = "auto_rotation" - const val BREAK_REMINDER_TOGGLE = "break_reminder_toggle" - const val BREAK_REMINDER = "break_reminder" + const val SLEEP_TIMER = "sleep_timer_toggle" + const val SLEEP_TIMER_DELAY = "sleep_timer_delay" const val SAVE_FEED = "save_feed" const val NAVBAR_ITEMS = "navbar_items" const val START_FRAGMENT = "start_fragment" diff --git a/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt b/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt index e5059634d..cbd3d7239 100644 --- a/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt +++ b/app/src/main/java/com/github/libretube/ui/activities/MainActivity.kt @@ -35,7 +35,7 @@ import com.github.libretube.ui.fragments.PlayerFragment import com.github.libretube.ui.models.PlayerViewModel import com.github.libretube.ui.models.SearchViewModel import com.github.libretube.ui.models.SubscriptionsViewModel -import com.github.libretube.ui.tools.BreakReminder +import com.github.libretube.ui.tools.SleepTimer import com.github.libretube.util.NavBarHelper import com.github.libretube.util.NavigationHelper import com.github.libretube.util.NetworkHelper @@ -132,13 +132,12 @@ class MainActivity : BaseActivity() { binding.toolbar.title = ThemeHelper.getStyledAppName(this) - /** - * handle error logs - */ - val log = PreferenceHelper.getErrorLog() - if (log != "") ErrorDialog().show(supportFragmentManager, null) + // handle error logs + PreferenceHelper.getErrorLog().ifBlank { null }?.let { + ErrorDialog().show(supportFragmentManager, null) + } - BreakReminder.setupBreakReminder(applicationContext) + SleepTimer.setup(this) setupSubscriptionsBadge() @@ -157,11 +156,9 @@ class MainActivity : BaseActivity() { } if (binding.mainMotionLayout.progress == 0F) { - try { + runCatching { minimizePlayer() return - } catch (e: Exception) { - // current fragment isn't the player fragment } } diff --git a/app/src/main/java/com/github/libretube/ui/preferences/GeneralSettings.kt b/app/src/main/java/com/github/libretube/ui/preferences/GeneralSettings.kt index 4c4b58e3f..5d28cf875 100644 --- a/app/src/main/java/com/github/libretube/ui/preferences/GeneralSettings.kt +++ b/app/src/main/java/com/github/libretube/ui/preferences/GeneralSettings.kt @@ -30,21 +30,26 @@ class GeneralSettings : BasePreferenceFragment() { val autoRotation = findPreference(PreferenceKeys.AUTO_ROTATION) autoRotation?.setOnPreferenceChangeListener { _, _ -> - val restartDialog = RequireRestartDialog() - restartDialog.show(childFragmentManager, RequireRestartDialog::class.java.name) + RequireRestartDialog().show(childFragmentManager, RequireRestartDialog::class.java.name) true } val breakReminder = - findPreference(PreferenceKeys.BREAK_REMINDER_TOGGLE) - val breakReminderTime = findPreference(PreferenceKeys.BREAK_REMINDER) + findPreference(PreferenceKeys.SLEEP_TIMER) + val breakReminderTime = findPreference(PreferenceKeys.SLEEP_TIMER_DELAY) breakReminderTime?.isEnabled = PreferenceHelper.getBoolean( - PreferenceKeys.BREAK_REMINDER_TOGGLE, + PreferenceKeys.SLEEP_TIMER, false ) breakReminder?.setOnPreferenceChangeListener { _, newValue -> breakReminderTime?.isEnabled = newValue as Boolean + RequireRestartDialog().show(childFragmentManager, RequireRestartDialog::class.java.name) + true + } + + breakReminderTime?.setOnPreferenceChangeListener { _, _ -> + RequireRestartDialog().show(childFragmentManager, RequireRestartDialog::class.java.name) true } } diff --git a/app/src/main/java/com/github/libretube/ui/tools/BreakReminder.kt b/app/src/main/java/com/github/libretube/ui/tools/BreakReminder.kt deleted file mode 100644 index 7e38e059f..000000000 --- a/app/src/main/java/com/github/libretube/ui/tools/BreakReminder.kt +++ /dev/null @@ -1,55 +0,0 @@ -package com.github.libretube.ui.tools - -import android.content.Context -import android.os.Handler -import android.os.Looper -import android.widget.Toast -import com.github.libretube.R -import com.github.libretube.constants.PreferenceKeys -import com.github.libretube.util.PreferenceHelper -import com.google.android.material.dialog.MaterialAlertDialogBuilder - -object BreakReminder { - /** - * Show a break reminder when watched too long - */ - fun setupBreakReminder(context: Context) { - if (!PreferenceHelper.getBoolean( - PreferenceKeys.BREAK_REMINDER_TOGGLE, - false - ) - ) { - return - } - val breakReminderPref = PreferenceHelper.getString( - PreferenceKeys.BREAK_REMINDER, - "0" - ) - if (!breakReminderPref.all { Character.isDigit(it) } || - breakReminderPref == "" || breakReminderPref == "0" - ) { - return - } - Handler(Looper.getMainLooper()).postDelayed( - { - try { - MaterialAlertDialogBuilder(context) - .setTitle(R.string.take_a_break) - .setMessage( - context.getString( - R.string.already_spent_time, - breakReminderPref - ) - ) - .setPositiveButton(R.string.okay, null) - .show() - } catch (e: Exception) { - runCatching { - Toast.makeText(context, R.string.take_a_break, Toast.LENGTH_LONG).show() - } - } - }, - breakReminderPref.toLong() * 60 * 1000 - ) - } -} diff --git a/app/src/main/java/com/github/libretube/ui/tools/SleepTimer.kt b/app/src/main/java/com/github/libretube/ui/tools/SleepTimer.kt new file mode 100644 index 000000000..5fe8c2b74 --- /dev/null +++ b/app/src/main/java/com/github/libretube/ui/tools/SleepTimer.kt @@ -0,0 +1,62 @@ +package com.github.libretube.ui.tools + +import android.content.Context +import android.os.Handler +import android.os.Looper +import com.github.libretube.R +import com.github.libretube.constants.PreferenceKeys +import com.github.libretube.ui.activities.MainActivity +import com.github.libretube.util.PreferenceHelper +import com.google.android.material.snackbar.Snackbar + +object SleepTimer { + private val handler = Handler(Looper.getMainLooper()) + private const val REACTION_INTERVAL = 5L + + /** + * Kill the app after showing a warning after a certain amount of time + * @param context This must not be the applicationContext! + */ + fun setup(context: Context) { + if (!PreferenceHelper.getBoolean(PreferenceKeys.SLEEP_TIMER, false)) return + + val breakReminderPref = PreferenceHelper.getString( + PreferenceKeys.SLEEP_TIMER_DELAY, + "" + ).ifEmpty { return } + + handler.postDelayed( + { + var killApp = true + val mainActivity = context as? MainActivity ?: return@postDelayed + val snackBar = Snackbar.make( + mainActivity.binding.root, + R.string.take_a_break, + Snackbar.LENGTH_INDEFINITE + ) + .setAction(R.string.cancel) { + killApp = false + } + snackBar.show() + (0..REACTION_INTERVAL).forEach { + handler.postDelayed({ + val remainingTime = " (${REACTION_INTERVAL - it})" + snackBar.setText(context.getString(R.string.take_a_break) + remainingTime) + }, it * 1000) + } + handler.postDelayed( + killApp@{ + if (!killApp) return@killApp + + // kill the application + mainActivity.finishAffinity() + mainActivity.finish() + android.os.Process.killProcess(android.os.Process.myPid()) + }, + REACTION_INTERVAL * 1000 + ) + }, + breakReminderPref.toLong() * 60 * 1000 + ) + } +} diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 2d656d3c3..2146b817b 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -440,6 +440,7 @@ Audio player Audio only mode Turn LibreTube into a music player. + Sleep timer Download Service diff --git a/app/src/main/res/xml/general_settings.xml b/app/src/main/res/xml/general_settings.xml index 67b585be7..e98d056ff 100644 --- a/app/src/main/res/xml/general_settings.xml +++ b/app/src/main/res/xml/general_settings.xml @@ -50,14 +50,14 @@ + app:key="sleep_timer_toggle" + app:title="@string/sleep_timer" />