mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Split security preferences from PrefrencesHelper (#8030)
This commit is contained in:
		@@ -16,6 +16,7 @@ import eu.kanade.data.listOfStringsAdapter
 | 
			
		||||
import eu.kanade.domain.source.service.SourcePreferences
 | 
			
		||||
import eu.kanade.tachiyomi.core.preference.AndroidPreferenceStore
 | 
			
		||||
import eu.kanade.tachiyomi.core.preference.PreferenceStore
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.ChapterCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.cache.CoverCache
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.DownloadManager
 | 
			
		||||
@@ -143,6 +144,9 @@ class PreferenceModule(val application: Application) : InjektModule {
 | 
			
		||||
        addSingletonFactory {
 | 
			
		||||
            SourcePreferences(get())
 | 
			
		||||
        }
 | 
			
		||||
        addSingletonFactory {
 | 
			
		||||
            SecurityPreferences(get())
 | 
			
		||||
        }
 | 
			
		||||
        addSingletonFactory {
 | 
			
		||||
            PreferencesHelper(
 | 
			
		||||
                context = application,
 | 
			
		||||
 
 | 
			
		||||
@@ -5,6 +5,7 @@ import android.os.Build
 | 
			
		||||
import androidx.core.content.edit
 | 
			
		||||
import androidx.preference.PreferenceManager
 | 
			
		||||
import eu.kanade.domain.source.service.SourcePreferences
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
 | 
			
		||||
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.MANGA_NON_COMPLETED
 | 
			
		||||
@@ -39,6 +40,7 @@ object Migrations {
 | 
			
		||||
        preferences: PreferencesHelper,
 | 
			
		||||
        networkPreferences: NetworkPreferences,
 | 
			
		||||
        sourcePreferences: SourcePreferences,
 | 
			
		||||
        securityPreferences: SecurityPreferences,
 | 
			
		||||
    ): Boolean {
 | 
			
		||||
        val oldVersion = preferences.lastVersionCode().get()
 | 
			
		||||
        if (oldVersion < BuildConfig.VERSION_CODE) {
 | 
			
		||||
@@ -254,7 +256,7 @@ object Migrations {
 | 
			
		||||
            if (oldVersion < 75) {
 | 
			
		||||
                val oldSecureScreen = prefs.getBoolean("secure_screen", false)
 | 
			
		||||
                if (oldSecureScreen) {
 | 
			
		||||
                    preferences.secureScreen().set(PreferenceValues.SecureScreenMode.ALWAYS)
 | 
			
		||||
                    securityPreferences.secureScreen().set(SecurityPreferences.SecureScreenMode.ALWAYS)
 | 
			
		||||
                }
 | 
			
		||||
                if (DeviceUtil.isMiui && preferences.extensionInstaller().get() == PreferenceValues.ExtensionInstaller.PACKAGEINSTALLER) {
 | 
			
		||||
                    preferences.extensionInstaller().set(PreferenceValues.ExtensionInstaller.LEGACY)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,9 @@ import android.graphics.BitmapFactory
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import com.hippo.unifile.UniFile
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.Notifications
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.util.storage.getUriCompat
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.notificationBuilder
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.notificationManager
 | 
			
		||||
@@ -17,7 +17,7 @@ import java.util.concurrent.TimeUnit
 | 
			
		||||
 | 
			
		||||
class BackupNotifier(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    private val preferences: PreferencesHelper by injectLazy()
 | 
			
		||||
    private val preferences: SecurityPreferences by injectLazy()
 | 
			
		||||
 | 
			
		||||
    private val progressNotificationBuilder = context.notificationBuilder(Notifications.CHANNEL_BACKUP_RESTORE_PROGRESS) {
 | 
			
		||||
        setLargeIcon(BitmapFactory.decodeResource(context.resources, R.mipmap.ic_launcher))
 | 
			
		||||
 
 | 
			
		||||
@@ -5,11 +5,11 @@ import android.content.Context
 | 
			
		||||
import android.graphics.BitmapFactory
 | 
			
		||||
import androidx.core.app.NotificationCompat
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.model.Download
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationHandler
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.Notifications
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.chop
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.notificationBuilder
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.notificationManager
 | 
			
		||||
@@ -23,7 +23,7 @@ import java.util.regex.Pattern
 | 
			
		||||
 */
 | 
			
		||||
internal class DownloadNotifier(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    private val preferences: PreferencesHelper by injectLazy()
 | 
			
		||||
    private val preferences: SecurityPreferences by injectLazy()
 | 
			
		||||
 | 
			
		||||
    private val progressNotificationBuilder by lazy {
 | 
			
		||||
        context.notificationBuilder(Notifications.CHANNEL_DOWNLOADER_PROGRESS) {
 | 
			
		||||
 
 | 
			
		||||
@@ -16,11 +16,11 @@ import coil.transform.CircleCropTransformation
 | 
			
		||||
import eu.kanade.domain.chapter.model.Chapter
 | 
			
		||||
import eu.kanade.domain.manga.model.Manga
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.data.download.Downloader
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationHandler
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.NotificationReceiver
 | 
			
		||||
import eu.kanade.tachiyomi.data.notification.Notifications
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.ui.main.MainActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.chop
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.launchUI
 | 
			
		||||
@@ -33,7 +33,7 @@ import java.text.DecimalFormatSymbols
 | 
			
		||||
 | 
			
		||||
class LibraryUpdateNotifier(private val context: Context) {
 | 
			
		||||
 | 
			
		||||
    private val preferences: PreferencesHelper by injectLazy()
 | 
			
		||||
    private val preferences: SecurityPreferences by injectLazy()
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Pending intent of action that cancels the library update
 | 
			
		||||
 
 | 
			
		||||
@@ -37,8 +37,6 @@ object PreferenceKeys {
 | 
			
		||||
 | 
			
		||||
    const val librarySortingMode = "library_sorting_mode"
 | 
			
		||||
 | 
			
		||||
    const val hideNotificationContent = "hide_notification_content"
 | 
			
		||||
 | 
			
		||||
    const val autoUpdateMetadata = "auto_update_metadata"
 | 
			
		||||
 | 
			
		||||
    const val autoUpdateTrackers = "auto_update_trackers"
 | 
			
		||||
 
 | 
			
		||||
@@ -74,10 +74,4 @@ object PreferenceValues {
 | 
			
		||||
        PACKAGEINSTALLER(R.string.ext_installer_packageinstaller),
 | 
			
		||||
        SHIZUKU(R.string.ext_installer_shizuku),
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    enum class SecureScreenMode(val titleResId: Int) {
 | 
			
		||||
        ALWAYS(R.string.lock_always),
 | 
			
		||||
        INCOGNITO(R.string.pref_incognito_mode),
 | 
			
		||||
        NEVER(R.string.lock_never),
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -46,20 +46,6 @@ class PreferencesHelper(
 | 
			
		||||
 | 
			
		||||
    fun sideNavIconAlignment() = this.preferenceStore.getInt("pref_side_nav_icon_alignment", 0)
 | 
			
		||||
 | 
			
		||||
    fun useAuthenticator() = this.preferenceStore.getBoolean("use_biometric_lock", false)
 | 
			
		||||
 | 
			
		||||
    fun lockAppAfter() = this.preferenceStore.getInt("lock_app_after", 0)
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * For app lock. Will be set when there is a pending timed lock.
 | 
			
		||||
     * Otherwise this pref should be deleted.
 | 
			
		||||
     */
 | 
			
		||||
    fun lastAppClosed() = this.preferenceStore.getLong("last_app_closed", 0)
 | 
			
		||||
 | 
			
		||||
    fun secureScreen() = this.preferenceStore.getEnum("secure_screen_v2", Values.SecureScreenMode.INCOGNITO)
 | 
			
		||||
 | 
			
		||||
    fun hideNotificationContent() = this.preferenceStore.getBoolean(Keys.hideNotificationContent, false)
 | 
			
		||||
 | 
			
		||||
    fun autoUpdateMetadata() = this.preferenceStore.getBoolean(Keys.autoUpdateMetadata, false)
 | 
			
		||||
 | 
			
		||||
    fun autoUpdateTrackers() = this.preferenceStore.getBoolean(Keys.autoUpdateTrackers, false)
 | 
			
		||||
 
 | 
			
		||||
@@ -46,7 +46,7 @@ import coil.transform.RoundedCornersTransformation
 | 
			
		||||
import eu.kanade.data.DatabaseHandler
 | 
			
		||||
import eu.kanade.domain.manga.model.MangaCover
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.ui.main.MainActivity
 | 
			
		||||
import eu.kanade.tachiyomi.ui.manga.MangaController
 | 
			
		||||
import eu.kanade.tachiyomi.util.lang.launchIO
 | 
			
		||||
@@ -61,7 +61,7 @@ import java.util.Date
 | 
			
		||||
 | 
			
		||||
class UpdatesGridGlanceWidget : GlanceAppWidget() {
 | 
			
		||||
    private val app: Application by injectLazy()
 | 
			
		||||
    private val preferences: PreferencesHelper by injectLazy()
 | 
			
		||||
    private val preferences: SecurityPreferences by injectLazy()
 | 
			
		||||
 | 
			
		||||
    private val coroutineScope = MainScope()
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ import androidx.appcompat.app.AppCompatActivity
 | 
			
		||||
import androidx.lifecycle.DefaultLifecycleObserver
 | 
			
		||||
import androidx.lifecycle.LifecycleOwner
 | 
			
		||||
import androidx.lifecycle.lifecycleScope
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
 | 
			
		||||
import eu.kanade.tachiyomi.ui.security.UnlockActivity
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil
 | 
			
		||||
@@ -24,7 +24,7 @@ interface SecureActivityDelegate {
 | 
			
		||||
 | 
			
		||||
    companion object {
 | 
			
		||||
        fun onApplicationCreated() {
 | 
			
		||||
            val lockDelay = Injekt.get<PreferencesHelper>().lockAppAfter().get()
 | 
			
		||||
            val lockDelay = Injekt.get<SecurityPreferences>().lockAppAfter().get()
 | 
			
		||||
            if (lockDelay == 0) {
 | 
			
		||||
                // Restore always active app lock
 | 
			
		||||
                // Delayed lock will be restored later on activity resume
 | 
			
		||||
@@ -33,7 +33,7 @@ interface SecureActivityDelegate {
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        fun onApplicationStopped() {
 | 
			
		||||
            val preferences = Injekt.get<PreferencesHelper>()
 | 
			
		||||
            val preferences = Injekt.get<SecurityPreferences>()
 | 
			
		||||
            if (!preferences.useAuthenticator().get()) return
 | 
			
		||||
            if (lockState != LockState.ACTIVE) {
 | 
			
		||||
                preferences.lastAppClosed().set(Date().time)
 | 
			
		||||
@@ -49,7 +49,7 @@ interface SecureActivityDelegate {
 | 
			
		||||
 | 
			
		||||
        fun unlock() {
 | 
			
		||||
            lockState = LockState.INACTIVE
 | 
			
		||||
            Injekt.get<PreferencesHelper>().lastAppClosed().delete()
 | 
			
		||||
            Injekt.get<SecurityPreferences>().lastAppClosed().delete()
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@@ -67,6 +67,7 @@ class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObser
 | 
			
		||||
    private lateinit var activity: AppCompatActivity
 | 
			
		||||
 | 
			
		||||
    private val preferences: PreferencesHelper by injectLazy()
 | 
			
		||||
    private val securityPreferences: SecurityPreferences by injectLazy()
 | 
			
		||||
 | 
			
		||||
    override fun registerSecureActivity(activity: AppCompatActivity) {
 | 
			
		||||
        this.activity = activity
 | 
			
		||||
@@ -82,31 +83,31 @@ class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObser
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setSecureScreen() {
 | 
			
		||||
        val secureScreenFlow = preferences.secureScreen().changes()
 | 
			
		||||
        val secureScreenFlow = securityPreferences.secureScreen().changes()
 | 
			
		||||
        val incognitoModeFlow = preferences.incognitoMode().changes()
 | 
			
		||||
        combine(secureScreenFlow, incognitoModeFlow) { secureScreen, incognitoMode ->
 | 
			
		||||
            secureScreen == PreferenceValues.SecureScreenMode.ALWAYS ||
 | 
			
		||||
                secureScreen == PreferenceValues.SecureScreenMode.INCOGNITO && incognitoMode
 | 
			
		||||
            secureScreen == SecurityPreferences.SecureScreenMode.ALWAYS ||
 | 
			
		||||
                secureScreen == SecurityPreferences.SecureScreenMode.INCOGNITO && incognitoMode
 | 
			
		||||
        }
 | 
			
		||||
            .onEach { activity.window.setSecureScreen(it) }
 | 
			
		||||
            .launchIn(activity.lifecycleScope)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun setAppLock() {
 | 
			
		||||
        if (!preferences.useAuthenticator().get()) return
 | 
			
		||||
        if (!securityPreferences.useAuthenticator().get()) return
 | 
			
		||||
        if (activity.isAuthenticationSupported()) {
 | 
			
		||||
            updatePendingLockStatus()
 | 
			
		||||
            if (!isAppLocked()) return
 | 
			
		||||
            activity.startActivity(Intent(activity, UnlockActivity::class.java))
 | 
			
		||||
            activity.overridePendingTransition(0, 0)
 | 
			
		||||
        } else {
 | 
			
		||||
            preferences.useAuthenticator().set(false)
 | 
			
		||||
            securityPreferences.useAuthenticator().set(false)
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private fun updatePendingLockStatus() {
 | 
			
		||||
        val lastClosedPref = preferences.lastAppClosed()
 | 
			
		||||
        val lockDelay = 60000 * preferences.lockAppAfter().get()
 | 
			
		||||
        val lastClosedPref = securityPreferences.lastAppClosed()
 | 
			
		||||
        val lockDelay = 60000 * securityPreferences.lockAppAfter().get()
 | 
			
		||||
        if (lastClosedPref.isSet() && lockDelay > 0) {
 | 
			
		||||
            // Restore pending status in case app was killed
 | 
			
		||||
            lockState = LockState.PENDING
 | 
			
		||||
 
 | 
			
		||||
@@ -116,6 +116,7 @@ class MainActivity : BaseActivity() {
 | 
			
		||||
                preferences = preferences,
 | 
			
		||||
                networkPreferences = Injekt.get(),
 | 
			
		||||
                sourcePreferences = sourcePreferences,
 | 
			
		||||
                securityPreferences = Injekt.get(),
 | 
			
		||||
            )
 | 
			
		||||
        } else {
 | 
			
		||||
            false
 | 
			
		||||
 
 | 
			
		||||
@@ -5,9 +5,8 @@ import androidx.fragment.app.FragmentActivity
 | 
			
		||||
import androidx.preference.Preference
 | 
			
		||||
import androidx.preference.PreferenceScreen
 | 
			
		||||
import eu.kanade.tachiyomi.R
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceValues
 | 
			
		||||
import eu.kanade.tachiyomi.core.security.SecurityPreferences
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.bindTo
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.defaultValue
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.entriesRes
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.infoPreference
 | 
			
		||||
import eu.kanade.tachiyomi.util.preference.intListPreference
 | 
			
		||||
@@ -19,16 +18,18 @@ import eu.kanade.tachiyomi.util.system.AuthenticatorUtil
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.startAuthentication
 | 
			
		||||
import eu.kanade.tachiyomi.util.system.toast
 | 
			
		||||
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
 | 
			
		||||
import uy.kohesive.injekt.injectLazy
 | 
			
		||||
 | 
			
		||||
class SettingsSecurityController : SettingsController() {
 | 
			
		||||
 | 
			
		||||
    private val securityPreferences: SecurityPreferences by injectLazy()
 | 
			
		||||
 | 
			
		||||
    override fun setupPreferenceScreen(screen: PreferenceScreen) = screen.apply {
 | 
			
		||||
        titleRes = R.string.pref_category_security
 | 
			
		||||
 | 
			
		||||
        if (context.isAuthenticationSupported()) {
 | 
			
		||||
            switchPreference {
 | 
			
		||||
                bindTo(preferences.useAuthenticator())
 | 
			
		||||
                bindTo(securityPreferences.useAuthenticator())
 | 
			
		||||
                titleRes = R.string.lock_with_biometrics
 | 
			
		||||
 | 
			
		||||
                requireAuthentication(
 | 
			
		||||
@@ -39,7 +40,7 @@ class SettingsSecurityController : SettingsController() {
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            intListPreference {
 | 
			
		||||
                bindTo(preferences.lockAppAfter())
 | 
			
		||||
                bindTo(securityPreferences.lockAppAfter())
 | 
			
		||||
                titleRes = R.string.lock_when_idle
 | 
			
		||||
                val values = arrayOf("0", "1", "2", "5", "10", "-1")
 | 
			
		||||
                entries = values.mapNotNull {
 | 
			
		||||
@@ -79,22 +80,21 @@ class SettingsSecurityController : SettingsController() {
 | 
			
		||||
                    false
 | 
			
		||||
                }
 | 
			
		||||
 | 
			
		||||
                visibleIf(preferences.useAuthenticator()) { it }
 | 
			
		||||
                visibleIf(securityPreferences.useAuthenticator()) { it }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        switchPreference {
 | 
			
		||||
            key = Keys.hideNotificationContent
 | 
			
		||||
            bindTo(securityPreferences.hideNotificationContent())
 | 
			
		||||
            titleRes = R.string.hide_notification_content
 | 
			
		||||
            defaultValue = false
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        listPreference {
 | 
			
		||||
            bindTo(preferences.secureScreen())
 | 
			
		||||
            bindTo(securityPreferences.secureScreen())
 | 
			
		||||
            titleRes = R.string.secure_screen
 | 
			
		||||
            summary = "%s"
 | 
			
		||||
            entriesRes = PreferenceValues.SecureScreenMode.values().map { it.titleResId }.toTypedArray()
 | 
			
		||||
            entryValues = PreferenceValues.SecureScreenMode.values().map { it.name }.toTypedArray()
 | 
			
		||||
            entriesRes = SecurityPreferences.SecureScreenMode.values().map { it.titleResId }.toTypedArray()
 | 
			
		||||
            entryValues = SecurityPreferences.SecureScreenMode.values().map { it.name }.toTypedArray()
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        infoPreference(R.string.secure_screen_summary)
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user