diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
index 7ecc5d45f..42958343e 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferenceKeys.kt
@@ -359,6 +359,8 @@ object PreferenceKeys {
const val authenticatorTimeRanges = "biometric_time_ranges"
+ const val authenticatorDays = "biometric_days"
+
const val sortTagsForLibrary = "sort_tags_for_library"
const val dontDeleteFromCategories = "dont_delete_from_categories"
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
index beb4936b9..f47aedb5e 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/preference/PreferencesHelper.kt
@@ -474,6 +474,8 @@ class PreferencesHelper(val context: Context) {
fun authenticatorTimeRanges() = flowPrefs.getStringSet(Keys.authenticatorTimeRanges, mutableSetOf())
+ fun authenticatorDays() = flowPrefs.getInt(Keys.authenticatorDays, 0x7F)
+
fun sortTagsForLibrary() = flowPrefs.getStringSet(Keys.sortTagsForLibrary, mutableSetOf())
fun dontDeleteFromCategories() = flowPrefs.getStringSet(Keys.dontDeleteFromCategories, emptySet())
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/TimeRange.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/TimeRange.kt
index c880b055d..c1c2e4a81 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/TimeRange.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/category/biometric/TimeRange.kt
@@ -8,7 +8,7 @@ import java.util.Date
import java.util.SimpleTimeZone
import kotlin.time.Duration
-data class TimeRange(val startTime: Duration, val endTime: Duration) {
+data class TimeRange(private val startTime: Duration, private val endTime: Duration) {
override fun toString(): String {
val startHour = startTime.inWholeHours
val startMinute = (startTime - startHour.hours).inWholeMinutes
@@ -34,6 +34,10 @@ data class TimeRange(val startTime: Duration, val endTime: Duration) {
return startTime in other.startTime..other.endTime || endTime in other.startTime..other.endTime
}
+ operator fun contains(other: Duration): Boolean {
+ return other in startTime..endTime
+ }
+
companion object {
fun fromPreferenceString(timeRange: String): TimeRange? {
return timeRange.split(",").mapNotNull { it.toDoubleOrNull() }.let {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/security/SecureActivityDelegate.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/security/SecureActivityDelegate.kt
index e3c49d77e..d23c7d110 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/security/SecureActivityDelegate.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/security/SecureActivityDelegate.kt
@@ -52,18 +52,48 @@ class SecureActivityDelegate(private val activity: FragmentActivity) {
return false
}
- return preferences.lockAppAfter().get() <= 0 ||
- Date().time >= preferences.lastAppUnlock().get() + 60 * 1000 * preferences.lockAppAfter().get() &&
- preferences.authenticatorTimeRanges().get().mapNotNull { TimeRange.fromPreferenceString(it) }.let { timeRanges ->
- if (timeRanges.isNotEmpty()) {
- val today: Calendar = Calendar.getInstance()
- val now = today.get(Calendar.HOUR_OF_DAY).hours + today.get(Calendar.MINUTE).minutes
- timeRanges.any { now in it.startTime..it.endTime }
- } else true
+ // SY -->
+ val today: Calendar = Calendar.getInstance()
+ val timeRanges = preferences.authenticatorTimeRanges().get().mapNotNull { TimeRange.fromPreferenceString(it) }
+ if (timeRanges.isNotEmpty()) {
+ val now = today.get(Calendar.HOUR_OF_DAY).hours + today.get(Calendar.MINUTE).minutes
+ val locked = timeRanges.any { now in it }
+ if (!locked) {
+ return false
}
+ }
+
+ val lockedDays = preferences.authenticatorDays().get()
+ val locked = lockedDays == LOCK_ALL_DAYS || when (today.get(Calendar.DAY_OF_WEEK)) {
+ Calendar.SUNDAY -> (lockedDays and LOCK_SUNDAY) == LOCK_SUNDAY
+ Calendar.MONDAY -> (lockedDays and LOCK_MONDAY) == LOCK_MONDAY
+ Calendar.TUESDAY -> (lockedDays and LOCK_TUESDAY) == LOCK_TUESDAY
+ Calendar.WEDNESDAY -> (lockedDays and LOCK_WEDNESDAY) == LOCK_WEDNESDAY
+ Calendar.THURSDAY -> (lockedDays and LOCK_THURSDAY) == LOCK_THURSDAY
+ Calendar.FRIDAY -> (lockedDays and LOCK_FRIDAY) == LOCK_FRIDAY
+ Calendar.SATURDAY -> (lockedDays and LOCK_SATURDAY) == LOCK_SATURDAY
+ else -> false
+ }
+
+ if (!locked) {
+ return false
+ }
+ // SY <--
+
+ return preferences.lockAppAfter().get() <= 0 ||
+ Date().time >= preferences.lastAppUnlock().get() + 60 * 1000 * preferences.lockAppAfter().get()
}
companion object {
var locked: Boolean = true
+
+ const val LOCK_SUNDAY = 0x40
+ const val LOCK_MONDAY = 0x20
+ const val LOCK_TUESDAY = 0x10
+ const val LOCK_WEDNESDAY = 0x8
+ const val LOCK_THURSDAY = 0x4
+ const val LOCK_FRIDAY = 0x2
+ const val LOCK_SATURDAY = 0x1
+ const val LOCK_ALL_DAYS = 0x7F
}
}
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt
index d8700d672..fdd7dd23b 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsSecurityController.kt
@@ -1,10 +1,17 @@
package eu.kanade.tachiyomi.ui.setting
+import android.app.Dialog
+import android.os.Bundle
import androidx.preference.PreferenceScreen
+import com.afollestad.materialdialogs.MaterialDialog
+import com.afollestad.materialdialogs.list.listItemsMultiChoice
import eu.kanade.tachiyomi.R
+import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.asImmediateFlow
+import eu.kanade.tachiyomi.ui.base.controller.DialogController
import eu.kanade.tachiyomi.ui.base.controller.withFadeTransaction
import eu.kanade.tachiyomi.ui.category.biometric.BiometricTimesController
+import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.preference.defaultValue
import eu.kanade.tachiyomi.util.preference.intListPreference
import eu.kanade.tachiyomi.util.preference.onClick
@@ -14,6 +21,7 @@ import eu.kanade.tachiyomi.util.preference.switchPreference
import eu.kanade.tachiyomi.util.preference.titleRes
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil
import kotlinx.coroutines.flow.launchIn
+import uy.kohesive.injekt.injectLazy
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
class SettingsSecurityController : SettingsController() {
@@ -62,7 +70,7 @@ class SettingsSecurityController : SettingsController() {
key = "pref_edit_lock_times"
titleRes = R.string.action_edit_biometric_lock_times
- val timeRanges = preferences.authenticatorTimeRanges().get().count()
+ val timeRanges = preferences.authenticatorTimeRanges().get().size
summary = context.resources.getQuantityString(R.plurals.num_lock_times, timeRanges, timeRanges)
preferences.useAuthenticator().asImmediateFlow { isVisible = it }
@@ -72,5 +80,77 @@ class SettingsSecurityController : SettingsController() {
router.pushController(BiometricTimesController().withFadeTransaction())
}
}
+ preference {
+ key = "pref_edit_lock_days"
+ titleRes = R.string.biometric_lock_days
+ summaryRes = R.string.biometric_lock_days_summary
+
+ preferences.useAuthenticator().asImmediateFlow { isVisible = it }
+ .launchIn(viewScope)
+
+ onClick {
+ SetLockedDaysDialog().showDialog(router)
+ }
+ }
+ }
+
+ class SetLockedDaysDialog(bundle: Bundle? = null) : DialogController(bundle) {
+ val preferences: PreferencesHelper by injectLazy()
+
+ override fun onCreateDialog(savedViewState: Bundle?): Dialog {
+ val activity = activity!!
+ val options = arrayOf(
+ R.string.sunday,
+ R.string.monday,
+ R.string.tuesday,
+ R.string.wednesday,
+ R.string.thursday,
+ R.string.friday,
+ R.string.saturday
+ )
+ .map { activity.getString(it) }
+
+ val lockDays = preferences.authenticatorDays().get()
+ val initialSelection = List(7) {
+ val locked = when (it) {
+ 0 -> (lockDays and SecureActivityDelegate.LOCK_SUNDAY) == SecureActivityDelegate.LOCK_SUNDAY
+ 1 -> (lockDays and SecureActivityDelegate.LOCK_MONDAY) == SecureActivityDelegate.LOCK_MONDAY
+ 2 -> (lockDays and SecureActivityDelegate.LOCK_TUESDAY) == SecureActivityDelegate.LOCK_TUESDAY
+ 3 -> (lockDays and SecureActivityDelegate.LOCK_WEDNESDAY) == SecureActivityDelegate.LOCK_WEDNESDAY
+ 4 -> (lockDays and SecureActivityDelegate.LOCK_THURSDAY) == SecureActivityDelegate.LOCK_THURSDAY
+ 5 -> (lockDays and SecureActivityDelegate.LOCK_FRIDAY) == SecureActivityDelegate.LOCK_FRIDAY
+ 6 -> (lockDays and SecureActivityDelegate.LOCK_SATURDAY) == SecureActivityDelegate.LOCK_SATURDAY
+ else -> false
+ }
+ if (locked) {
+ it
+ } else null
+ }.filterNotNull().toIntArray()
+
+ return MaterialDialog(activity)
+ .title(R.string.biometric_lock_days)
+ .message(R.string.biometric_lock_days_summary)
+ .listItemsMultiChoice(
+ items = options,
+ initialSelection = initialSelection
+ ) { _, positions, _ ->
+ var flags = 0
+ positions.forEach {
+ when (it) {
+ 0 -> flags = flags or SecureActivityDelegate.LOCK_SUNDAY
+ 1 -> flags = flags or SecureActivityDelegate.LOCK_MONDAY
+ 2 -> flags = flags or SecureActivityDelegate.LOCK_TUESDAY
+ 3 -> flags = flags or SecureActivityDelegate.LOCK_WEDNESDAY
+ 4 -> flags = flags or SecureActivityDelegate.LOCK_THURSDAY
+ 5 -> flags = flags or SecureActivityDelegate.LOCK_FRIDAY
+ 6 -> flags = flags or SecureActivityDelegate.LOCK_SATURDAY
+ }
+ }
+
+ preferences.authenticatorDays().set(flags)
+ }
+ .positiveButton(android.R.string.ok)
+ .negativeButton(android.R.string.cancel)
+ }
}
}
diff --git a/app/src/main/res/values/strings_sy.xml b/app/src/main/res/values/strings_sy.xml
index f7802e06e..73e269b05 100644
--- a/app/src/main/res/values/strings_sy.xml
+++ b/app/src/main/res/values/strings_sy.xml
@@ -224,6 +224,16 @@
Enter end time
Biometric lock time completed
Invalid time selected
+ Biometric lock days
+ Days to have the app locked
+
+ Sunday
+ Monday
+ Tuesday
+ Wednesday
+ Thursday
+ Friday
+ Saturday
Page Downloading