Add justify text preference, reduce the number of times web content is refreshed

Refresh was being triggered by reading progress events, this
prevents us from reloading content on those events.
This commit is contained in:
Jackson Harper
2023-04-27 12:34:04 +08:00
parent 7d04a9811e
commit 94bf4515ac
5 changed files with 46 additions and 15 deletions

View File

@ -15,6 +15,7 @@ object DatastoreKeys {
const val preferredWebMaxWidthPercentage = "preferredWebMaxWidthPercentage"
const val preferredWebFontFamily = "preferredWebFontFamily"
const val prefersWebHighContrastText = "prefersWebHighContrastText"
const val prefersJustifyText = "prefersJustifyText"
const val lastUsedSavedItemFilter = "lastUsedSavedItemFilter"
const val lastUsedSavedItemSortFilter = "lastUsedSavedItemSortFilter"
const val preferredTheme = "preferredTheme"

View File

@ -49,6 +49,9 @@ fun WebPreferencesView(webReaderViewModel: WebReaderViewModel) {
val currentWebPreferences = webReaderViewModel.storedWebPreferences(isDark)
val isFontListExpanded = remember { mutableStateOf(false) }
val highContrastTextSwitchState = remember { mutableStateOf(currentWebPreferences.prefersHighContrastText) }
val justifyTextSwitchState = remember { mutableStateOf(currentWebPreferences.prefersJustifyText) }
val selectedWebFontRawValue = remember { mutableStateOf(currentWebPreferences.fontFamily.rawValue) }
Column(
@ -98,6 +101,18 @@ fun WebPreferencesView(webReaderViewModel: WebReaderViewModel) {
)
}
Row(verticalAlignment = Alignment.CenterVertically) {
Text("Justify Text")
Spacer(modifier = Modifier.weight(1.0F))
Switch(
checked = justifyTextSwitchState.value,
onCheckedChange = {
justifyTextSwitchState.value = it
webReaderViewModel.updateJustifyText(it)
}
)
}
Row(
verticalAlignment = Alignment.CenterVertically,
modifier = Modifier
@ -200,5 +215,6 @@ data class WebPreferences(
val themeKey: String,
val storedThemePreference: String,
val fontFamily: WebFont,
val prefersHighContrastText: Boolean
val prefersHighContrastText: Boolean,
val prefersJustifyText: Boolean
)

View File

@ -30,8 +30,8 @@ import java.util.*
@SuppressLint("SetJavaScriptEnabled")
@Composable
fun WebReader(
params: WebReaderParams,
preferences: WebPreferences,
styledContent: String,
webReaderViewModel: WebReaderViewModel
) {
val javascriptActionLoopUUID: UUID by webReaderViewModel
@ -39,14 +39,6 @@ fun WebReader(
.observeAsState(UUID.randomUUID())
WebView.setWebContentsDebuggingEnabled(true)
val webReaderContent = WebReaderContent(
preferences = preferences,
item = params.item,
articleContent = params.articleContent,
)
val styledContent = webReaderContent.styledContent()
val isInDarkMode = preferences.themeKey == "Dark" || preferences.themeKey == "Black"
Box {

View File

@ -122,17 +122,29 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, o
webReaderViewModel.maxToolbarHeightPx = with(LocalDensity.current) { maxToolbarHeight.roundToPx().toFloat() }
webReaderViewModel.loadItem(slug = slug, requestID = requestID)
val styledContent =
if (webReaderParams != null) {
val webReaderContent = WebReaderContent(
preferences = webReaderViewModel.storedWebPreferences(isSystemInDarkTheme()),
item = webReaderParams!!.item,
articleContent = webReaderParams!!.articleContent,
)
webReaderContent.styledContent()
} else {
null
}
Box(
modifier = Modifier
.fillMaxSize()
.systemBarsPadding()
.background(color = backgroundColor)
) {
if (webReaderParams != null) {
if (styledContent != null) {
WebReader(
webReaderParams!!,
webReaderViewModel.storedWebPreferences(isSystemInDarkTheme()),
webReaderViewModel
preferences = webReaderViewModel.storedWebPreferences(isSystemInDarkTheme()),
styledContent = styledContent,
webReaderViewModel = webReaderViewModel
)
TopAppBar(

View File

@ -266,6 +266,7 @@ class WebReaderViewModel @Inject constructor(
val storedWebFont = WebFont.values().first { it.rawValue == storedFontFamily }
val prefersHighContrastFont = datastoreRepo.getString(DatastoreKeys.prefersWebHighContrastText) == "true"
val prefersJustifyText = datastoreRepo.getString(DatastoreKeys.prefersJustifyText) == "true"
WebPreferences(
textFontSize = storedFontSize ?: 12,
@ -274,7 +275,8 @@ class WebReaderViewModel @Inject constructor(
themeKey = themeKey(isDarkMode, storedThemePreference),
storedThemePreference = storedThemePreference,
fontFamily = storedWebFont,
prefersHighContrastText = prefersHighContrastFont
prefersHighContrastText = prefersHighContrastFont,
prefersJustifyText = prefersJustifyText
)
}
@ -352,6 +354,14 @@ class WebReaderViewModel @Inject constructor(
enqueueScript(script)
}
fun updateJustifyText(justifyText: Boolean) {
runBlocking {
datastoreRepo.putString(DatastoreKeys.prefersJustifyText, justifyText.toString())
}
val script = "var event = new Event('updateJustifyText');event.justifyText = $justifyText;document.dispatchEvent(event);"
enqueueScript(script)
}
fun applyWebFont(font: WebFont) {
runBlocking {
datastoreRepo.putString(DatastoreKeys.preferredWebFontFamily, font.rawValue)