Upgrade secure screen (adding incognito support)

Co-Authored-By: arkon <4098258+arkon@users.noreply.github.com>
This commit is contained in:
Jays2Kings 2022-05-08 04:15:11 -04:00
parent 4048811e7a
commit 3b7a13ddc9
12 changed files with 78 additions and 24 deletions

View file

@ -6,6 +6,7 @@ import eu.kanade.tachiyomi.data.backup.BackupCreatorJob
import eu.kanade.tachiyomi.data.download.DownloadProvider
import eu.kanade.tachiyomi.data.library.LibraryUpdateJob
import eu.kanade.tachiyomi.data.preference.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.data.preference.plusAssign
import eu.kanade.tachiyomi.data.track.TrackManager
@ -195,6 +196,12 @@ object Migrations {
preferences.navigationModeWebtoon().set(5)
}
}
if (oldVersion < 90) {
val oldSecureScreen = prefs.getBoolean("secure_screen", false)
if (oldSecureScreen) {
preferences.secureScreen().set(PreferenceValues.SecureScreenMode.ALWAYS)
}
}
return true
}

View file

@ -189,8 +189,6 @@ object PreferenceKeys {
const val lastUnlock = "last_unlock"
const val secureScreen = "secure_screen"
const val hideNotificationContent = "hide_notification_content"
const val removeArticles = "remove_articles"

View file

@ -1,5 +1,7 @@
package eu.kanade.tachiyomi.data.preference
import eu.kanade.tachiyomi.R
// Library
const val MANGA_NON_COMPLETED = "manga_ongoing"
const val MANGA_HAS_UNREAD = "manga_fully_read"
@ -9,3 +11,11 @@ const val MANGA_NON_READ = "manga_started"
const val DEVICE_ONLY_ON_WIFI = "wifi"
const val DEVICE_CHARGING = "ac"
const val DEVICE_BATTERY_NOT_LOW = "battery_not_low"
object PreferenceValues {
enum class SecureScreenMode(val titleResId: Int) {
ALWAYS(R.string.always),
INCOGNITO(R.string.incognito_mode),
NEVER(R.string.never),
}
}

View file

@ -32,6 +32,7 @@ import java.text.DateFormat
import java.text.SimpleDateFormat
import java.util.Locale
import eu.kanade.tachiyomi.data.preference.PreferenceKeys as Keys
import eu.kanade.tachiyomi.data.preference.PreferenceValues as Values
fun <T> Preference<T>.asImmediateFlow(block: (value: T) -> Unit): Flow<T> {
block(get())
@ -325,7 +326,7 @@ class PreferencesHelper(val context: Context) {
fun lastUnlock() = flowPrefs.getLong(Keys.lastUnlock, 0)
fun secureScreen() = flowPrefs.getBoolean(Keys.secureScreen, false)
fun secureScreen() = flowPrefs.getEnum("secure_screen_v2", Values.SecureScreenMode.INCOGNITO)
fun hideNotificationContent() = prefs.getBoolean(Keys.hideNotificationContent, false)

View file

@ -488,6 +488,7 @@ open class MainActivity : BaseActivity<MainActivityBinding>(), DownloadServiceLi
.asImmediateFlowIn(lifecycleScope) {
binding.toolbar.setIncognitoMode(it)
binding.searchToolbar.setIncognitoMode(it)
SecureActivityDelegate.setSecure(this)
}
preferences.sideNavIconAlignment()
.asImmediateFlowIn(lifecycleScope) {

View file

@ -82,6 +82,7 @@ import eu.kanade.tachiyomi.ui.reader.viewer.pager.PagerViewer
import eu.kanade.tachiyomi.ui.reader.viewer.pager.R2LPagerViewer
import eu.kanade.tachiyomi.ui.reader.viewer.pager.VerticalPagerViewer
import eu.kanade.tachiyomi.ui.reader.viewer.webtoon.WebtoonViewer
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.ui.webview.WebViewActivity
import eu.kanade.tachiyomi.util.storage.getUriCompat
import eu.kanade.tachiyomi.util.system.contextCompatColor
@ -294,6 +295,11 @@ class ReaderActivity : BaseRxActivity<ReaderPresenter>() {
binding.chaptersSheet.chaptersBottomSheet.setup(this)
config = ReaderConfig()
initializeMenu()
preferences.incognitoMode()
.asImmediateFlowIn(lifecycleScope) {
SecureActivityDelegate.setSecure(this)
}
}
/**

View file

@ -2,8 +2,10 @@ package eu.kanade.tachiyomi.ui.security
import android.app.Activity
import android.content.Intent
import android.view.Window
import android.view.WindowManager
import androidx.biometric.BiometricManager
import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.PreferencesHelper
import eu.kanade.tachiyomi.ui.main.SearchActivity
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil
@ -16,15 +18,21 @@ object SecureActivityDelegate {
var locked: Boolean = true
fun setSecure(activity: Activity?, force: Boolean? = null) {
val enabled = force ?: preferences.secureScreen().get()
fun setSecure(activity: Activity?) {
val incognitoMode = preferences.incognitoMode().get()
val enabled = when (preferences.secureScreen().get()) {
PreferenceValues.SecureScreenMode.ALWAYS -> true
PreferenceValues.SecureScreenMode.INCOGNITO -> incognitoMode
else -> false
}
activity?.window?.setSecureScreen(enabled)
}
private fun Window.setSecureScreen(enabled: Boolean) {
if (enabled) {
activity?.window?.setFlags(
WindowManager.LayoutParams.FLAG_SECURE,
WindowManager.LayoutParams.FLAG_SECURE,
)
setFlags(WindowManager.LayoutParams.FLAG_SECURE, WindowManager.LayoutParams.FLAG_SECURE)
} else {
activity?.window?.clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
clearFlags(WindowManager.LayoutParams.FLAG_SECURE)
}
}

View file

@ -178,7 +178,12 @@ fun <T> ListPreference.bindTo(preference: com.fredporciuncula.flow.preferences.P
defaultValue = preference.defaultValue.toString()
}
inline fun <T> IntListMatPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference<T>) {
fun <T> ListMatPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference<T>) {
key = preference.key
defaultValue = preference.defaultValue.toString()
}
fun <T> IntListMatPreference.bindTo(preference: com.fredporciuncula.flow.preferences.Preference<T>) {
key = preference.key
defaultValue = preference.defaultValue
}

View file

@ -4,6 +4,7 @@ import androidx.fragment.app.FragmentActivity
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.PreferenceKeys
import eu.kanade.tachiyomi.data.preference.PreferenceValues
import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.system.AuthenticatorUtil.isAuthenticationSupported
@ -45,22 +46,25 @@ class SettingsSecurityController : SettingsController() {
}
}
switchPreference {
key = PreferenceKeys.secureScreen
titleRes = R.string.secure_screen
summaryRes = R.string.hide_app_block_screenshots
defaultValue = false
onChange {
it as Boolean
SecureActivityDelegate.setSecure(activity, it)
true
}
}
switchPreference {
key = PreferenceKeys.hideNotificationContent
titleRes = R.string.hide_notification_content
defaultValue = false
}
listPreference(activity) {
bindTo(preferences.secureScreen())
titleRes = R.string.secure_screen
entriesRes = PreferenceValues.SecureScreenMode.values().map { it.titleResId }.toTypedArray()
entryValues = PreferenceValues.SecureScreenMode.values().map { it.name }
onChange {
it as String
SecureActivityDelegate.setSecure(activity)
true
}
}
infoPreference(R.string.secure_screen_summary)
}
}

View file

@ -25,6 +25,7 @@ import androidx.core.view.isVisible
import androidx.core.view.marginBottom
import androidx.core.view.updateLayoutParams
import androidx.core.view.updatePadding
import androidx.lifecycle.lifecycleScope
import androidx.webkit.WebSettingsCompat.DARK_STRATEGY_WEB_THEME_DARKENING_ONLY
import androidx.webkit.WebSettingsCompat.FORCE_DARK_OFF
import androidx.webkit.WebSettingsCompat.FORCE_DARK_ON
@ -32,8 +33,10 @@ import androidx.webkit.WebSettingsCompat.setForceDark
import androidx.webkit.WebSettingsCompat.setForceDarkStrategy
import androidx.webkit.WebViewFeature
import eu.kanade.tachiyomi.R
import eu.kanade.tachiyomi.data.preference.asImmediateFlowIn
import eu.kanade.tachiyomi.databinding.WebviewActivityBinding
import eu.kanade.tachiyomi.ui.base.activity.BaseActivity
import eu.kanade.tachiyomi.ui.security.SecureActivityDelegate
import eu.kanade.tachiyomi.util.system.ThemeUtil
import eu.kanade.tachiyomi.util.system.getPrefTheme
import eu.kanade.tachiyomi.util.system.getResourceColor
@ -149,6 +152,11 @@ open class BaseWebViewActivity : BaseActivity<WebviewActivityBinding>() {
binding.webview.restoreState(it)
}
}
preferences.incognitoMode()
.asImmediateFlowIn(lifecycleScope) {
SecureActivityDelegate.setSecure(this)
}
}
private fun setWebDarkMode() {

View file

@ -7,6 +7,12 @@
android:title="@string/back"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_open_in_app"
android:icon="@drawable/ic_browse_24dp"
android:title="@string/open_in_app"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_web_forward"
android:icon="@drawable/ic_arrow_forward_24dp"

View file

@ -702,6 +702,7 @@
<string name="check_for_updates">Check for updates</string>
<string name="updated_to_">Updated to v%1$s</string>
<string name="secure_screen">Secure screen</string>
<string name="secure_screen_summary">Secure screen hides app contents when switching apps and block screenshots</string>
<string name="hide_bottom_nav">Auto-hide bottom navigation</string>
<string name="side_nav_icon_alignment">Side navigation icon alignment</string>
<string name="use_side_navigation">Use side navigation</string>
@ -714,7 +715,6 @@
<string name="expanded_toolbar">Expanded toolbar</string>
<string name="show_larger_toolbar">Show a larger, expanded toolbar at the top of most pages (does not show on smaller devices regardless of setting)</string>
<string name="hides_on_scroll">Hides when scrolling</string>
<string name="hide_app_block_screenshots">Hide app contents when switching apps and block screenshots</string>
<string name="hide_notification_content">Hide notification content</string>
<string name="security">Security</string>
<string name="starting_screen">Starting screen</string>