|
@@ -0,0 +1,73 @@
|
|
|
+package eu.kanade.tachiyomi.ui.base.delegate
|
|
|
+
|
|
|
+import android.content.Intent
|
|
|
+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.data.preference.PreferencesHelper
|
|
|
+import eu.kanade.tachiyomi.ui.security.UnlockActivity
|
|
|
+import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
|
|
|
+import eu.kanade.tachiyomi.util.view.setSecureScreen
|
|
|
+import kotlinx.coroutines.flow.combine
|
|
|
+import kotlinx.coroutines.flow.launchIn
|
|
|
+import kotlinx.coroutines.flow.onEach
|
|
|
+import uy.kohesive.injekt.injectLazy
|
|
|
+import java.util.Date
|
|
|
+
|
|
|
+interface SecureActivityDelegate {
|
|
|
+ fun registerSecureActivity(activity: AppCompatActivity)
|
|
|
+
|
|
|
+ companion object {
|
|
|
+ var locked: Boolean = true
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+class SecureActivityDelegateImpl : SecureActivityDelegate, DefaultLifecycleObserver {
|
|
|
+
|
|
|
+ private lateinit var activity: AppCompatActivity
|
|
|
+
|
|
|
+ private val preferences: PreferencesHelper by injectLazy()
|
|
|
+
|
|
|
+ override fun registerSecureActivity(activity: AppCompatActivity) {
|
|
|
+ this.activity = activity
|
|
|
+ activity.lifecycle.addObserver(this)
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onCreate(owner: LifecycleOwner) {
|
|
|
+ setSecureScreen()
|
|
|
+ }
|
|
|
+
|
|
|
+ override fun onResume(owner: LifecycleOwner) {
|
|
|
+ setAppLock()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun setSecureScreen() {
|
|
|
+ val secureScreenFlow = preferences.secureScreen().asFlow()
|
|
|
+ val incognitoModeFlow = preferences.incognitoMode().asFlow()
|
|
|
+ combine(secureScreenFlow, incognitoModeFlow) { secureScreen, incognitoMode ->
|
|
|
+ secureScreen == PreferenceValues.SecureScreenMode.ALWAYS ||
|
|
|
+ secureScreen == PreferenceValues.SecureScreenMode.INCOGNITO && incognitoMode
|
|
|
+ }
|
|
|
+ .onEach { activity.window.setSecureScreen(it) }
|
|
|
+ .launchIn(activity.lifecycleScope)
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun setAppLock() {
|
|
|
+ if (!preferences.useAuthenticator().get()) return
|
|
|
+ if (activity.isAuthenticationSupported()) {
|
|
|
+ if (!isAppLocked()) return
|
|
|
+ activity.startActivity(Intent(activity, UnlockActivity::class.java))
|
|
|
+ activity.overridePendingTransition(0, 0)
|
|
|
+ } else {
|
|
|
+ preferences.useAuthenticator().set(false)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun isAppLocked(): Boolean {
|
|
|
+ if (!SecureActivityDelegate.locked) return false
|
|
|
+ return preferences.lockAppAfter().get() <= 0 ||
|
|
|
+ Date().time >= preferences.lastAppUnlock().get() + 60 * 1000 * preferences.lockAppAfter().get()
|
|
|
+ }
|
|
|
+}
|