diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Constants.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Constants.kt index 5476df750..fe5d75097 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Constants.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Constants.kt @@ -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" diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebPreferencesDialog.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebPreferencesDialog.kt index 769c8a6a0..3a967f554 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebPreferencesDialog.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebPreferencesDialog.kt @@ -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 ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt index 27e0bff99..3c1294c1b 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt @@ -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 { diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt index 53fa6c433..a73c3e2ca 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt @@ -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( diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt index f2c711c6c..adfe7f46b 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt @@ -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)