From 8387492a9bfd27426de79bdb8f1e3bcbf9682bf9 Mon Sep 17 00:00:00 2001 From: Jobobby04 Date: Wed, 2 Jun 2021 13:38:54 -0400 Subject: [PATCH] Add biometric lock days, fix biometric time range --- .../data/preference/PreferenceKeys.kt | 2 + .../data/preference/PreferencesHelper.kt | 2 + .../ui/category/biometric/TimeRange.kt | 6 +- .../ui/security/SecureActivityDelegate.kt | 46 +++++++++-- .../ui/setting/SettingsSecurityController.kt | 82 ++++++++++++++++++- app/src/main/res/values/strings_sy.xml | 10 +++ 6 files changed, 138 insertions(+), 10 deletions(-) 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