From c9dc3ce8c278b8c757f72adc22eeaeeb3f2073a2 Mon Sep 17 00:00:00 2001 From: Aryan Date: Thu, 19 Mar 2026 19:59:51 +0530 Subject: [PATCH] Epub reader themes (#97) * Implemented a custom theme engine for the EPUB reader, allowing users to switch between built-in themes (System, Light, Dark, Sepia, Slate, and OLED). Key changes include: - Added `ReaderThemePanel` and theme selection logic to `EpubReaderScreen`. - Introduced a theme persistence layer using SharedPreferences. - Updated `ChapterWebView` and `epub_reader.js` to dynamically apply background and text colors via JavaScript, including improved contrast adjustment for inline styles. - Enhanced `CssParser` and `ContentStyler` in the paginated reader to adapt CSS colors based on the active theme's background and text luminance. - Integrated theme-specific background and text colors into `PaginatedReaderScreen` and its layout components. - Added a theme palette icon to the reader controls. * Added custom theme builder and texture support to EPUB reader * Refactored color picker(PDF) into shared components and enhanced EPUB theme editor * Updated theme customization UI and improved WebView theme application efficiency * Updated page flip animation to use paper color with a theme-based tint * Improved state restoration during paginated reader reconfiguration --- app/src/main/assets/epub_reader.js | 212 ++++- app/src/main/java/com/aryan/reader/Common.kt | 297 ++++++ .../aryan/reader/epubreader/ChapterWebView.kt | 900 ++++++++++-------- .../reader/epubreader/EpubReaderControls.kt | 8 + .../reader/epubreader/EpubReaderScreen.kt | 670 ++++++++++++- .../reader/paginatedreader/BookPaginator.kt | 31 +- .../reader/paginatedreader/ContentStyler.kt | 20 +- .../aryan/reader/paginatedreader/CssParser.kt | 90 +- .../reader/paginatedreader/PaginatedReader.kt | 113 ++- .../PaginatedReaderViewModel.kt | 18 +- .../com/aryan/reader/pdf/ToolSettingsPopup.kt | 295 +----- app/src/main/res/drawable-nodpi/palette.xml | 10 + .../res/drawable-nodpi/texture_canvas.png | Bin 0 -> 80065 bytes .../main/res/drawable-nodpi/texture_eink.webp | Bin 0 -> 15394 bytes .../main/res/drawable-nodpi/texture_paper.png | Bin 0 -> 56983 bytes .../main/res/drawable-nodpi/texture_slate.png | Bin 0 -> 81533 bytes 16 files changed, 1817 insertions(+), 847 deletions(-) create mode 100644 app/src/main/res/drawable-nodpi/palette.xml create mode 100644 app/src/main/res/drawable-nodpi/texture_canvas.png create mode 100644 app/src/main/res/drawable-nodpi/texture_eink.webp create mode 100644 app/src/main/res/drawable-nodpi/texture_paper.png create mode 100644 app/src/main/res/drawable-nodpi/texture_slate.png diff --git a/app/src/main/assets/epub_reader.js b/app/src/main/assets/epub_reader.js index 3584f19..4121089 100644 --- a/app/src/main/assets/epub_reader.js +++ b/app/src/main/assets/epub_reader.js @@ -189,7 +189,7 @@ window.VIEWPORT_PADDING_BOTTOM = bottom || 0; }; - window.applyReaderTheme = function (isDark) { + window.applyReaderTheme = function (isDark, bgHex, textHex, textureBase64) { var styleId = "readerThemeStyle"; var themeStyleElement = document.getElementById(styleId); @@ -199,65 +199,185 @@ document.head.appendChild(themeStyleElement); } - // Set a class on the root element for theme state var themeClassName = isDark ? "dark-theme" : "light-theme"; var oppositeThemeClassName = isDark ? "light-theme" : "dark-theme"; document.documentElement.classList.remove(oppositeThemeClassName); document.documentElement.classList.add(themeClassName); - var css = ""; + var effectiveBg = bgHex || (isDark ? '#121212' : '#FFFFFF'); + var effectiveText = textHex || (isDark ? '#E0E0E0' : '#000000'); - if (isDark) { - css = ` html.dark-theme, html.dark-theme body { - background-color: #121212 !important; - color: #E0E0E0 !important; - } + var textureCss = textureBase64 + ? `background-image: url('${textureBase64}'); background-repeat: repeat; background-blend-mode: multiply;` + : 'background-image: none;'; - html.dark-theme a { - color: #BB86FC !important; - } + var css = ` + :root { + --reader-bg: ${effectiveBg}; + --reader-text: ${effectiveText}; + } + html.${themeClassName}, html.${themeClassName} body { + background-color: var(--reader-bg) !important; + color: var(--reader-text) !important; + ${textureCss} + } - html.dark-theme a p, - html.dark-theme a div, - html.dark-theme a span, - html.dark-theme a li, - html.dark-theme a h1, - html.dark-theme a h2, - html.dark-theme a h3, - html.dark-theme a h4, - html.dark-theme a h5, - html.dark-theme a h6 { - color: #E0E0E0 !important; - background-color: transparent !important; - } + html.${themeClassName} a { + color: ${isDark ? '#BB86FC' : '#1A0DAB'} !important; + } - html.dark-theme blockquote, html.dark-theme pre, - html.dark-theme figcaption, html.dark-theme caption, - html.dark-theme label, html.dark-theme dt, html.dark-theme dd { - color: inherit !important; - background-color: transparent !important; - } + html.${themeClassName} a p, + html.${themeClassName} a div, + html.${themeClassName} a span, + html.${themeClassName} a li, + html.${themeClassName} a h1, + html.${themeClassName} a h2, + html.${themeClassName} a h3, + html.${themeClassName} a h4, + html.${themeClassName} a h5, + html.${themeClassName} a h6 { + color: var(--reader-text) !important; + background-color: transparent !important; + } - html.dark-theme hr { - border-color: #444444 !important; - background-color: #444444 !important; - } + html.${themeClassName} blockquote, html.${themeClassName} pre, + html.${themeClassName} figcaption, html.${themeClassName} caption, + html.${themeClassName} label, html.${themeClassName} dt, html.${themeClassName} dd { + color: inherit !important; + background-color: transparent !important; + } - html.dark-theme table, html.dark-theme tr, html.dark-theme td, html.dark-theme th { - background-color: transparent !important; - border-color: #555 !important; - } + html.${themeClassName} hr { + border-color: ${isDark ? '#444444' : '#CCCCCC'} !important; + background-color: ${isDark ? '#444444' : '#CCCCCC'} !important; + } - `; - } else { - css = ` html.light-theme { - background-color: #FFFFFF; - } - - `; - } + html.${themeClassName} table, html.${themeClassName} tr, html.${themeClassName} td, html.${themeClassName} th { + background-color: transparent !important; + border-color: ${isDark ? '#555' : '#CCC'} !important; + } + `; themeStyleElement.innerHTML = css; + + if (window.adjustInlineColorsForContrast) { + window.adjustInlineColorsForContrast(isDark, effectiveBg); + } + }; + + function getLuminance(r, g, b) { + var a = [r, g, b].map(function (v) { + v /= 255; + return v <= 0.03928 + ? v / 12.92 + : Math.pow((v + 0.055) / 1.055, 2.4); + }); + return a[0] * 0.2126 + a[1] * 0.7152 + a[2] * 0.0722; + } + + function hexToRgb(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? { + r: parseInt(result[1], 16), + g: parseInt(result[2], 16), + b: parseInt(result[3], 16) + } : {r:255,g:255,b:255}; + } + + function rgbStringToRgb(rgbStr) { + var parts = rgbStr.match(/^rgba?\((\d+),\s*(\d+),\s*(\d+)/i); + if (parts) { + return { r: parseInt(parts[1]), g: parseInt(parts[2]), b: parseInt(parts[3]) }; + } + return null; + } + + function rgbToHsl(r, g, b) { + r /= 255; g /= 255; b /= 255; + var max = Math.max(r, g, b), min = Math.min(r, g, b); + var h, s, l = (max + min) / 2; + + if(max == min){ + h = s = 0; // achromatic + }else{ + var d = max - min; + s = l > 0.5 ? d / (2 - max - min) : d / (max + min); + switch(max){ + case r: h = (g - b) / d + (g < b ? 6 : 0); break; + case g: h = (b - r) / d + 2; break; + case b: h = (r - g) / d + 4; break; + } + h /= 6; + } + return[h, s, l]; + } + + function hslToRgb(h, s, l) { + var r, g, b; + if(s == 0){ + r = g = b = l; // achromatic + }else{ + var hue2rgb = function hue2rgb(p, q, t){ + if(t < 0) t += 1; + if(t > 1) t -= 1; + if(t < 1/6) return p + (q - p) * 6 * t; + if(t < 1/2) return q; + if(t < 2/3) return p + (q - p) * (2/3 - t) * 6; + return p; + } + var q = l < 0.5 ? l * (1 + s) : l + s - l * s; + var p = 2 * l - q; + r = hue2rgb(p, q, h + 1/3); + g = hue2rgb(p, q, h); + b = hue2rgb(p, q, h - 1/3); + } + return[Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)]; + } + + window.adjustInlineColorsForContrast = function(isDark, bgHex) { + var bgRgb = hexToRgb(bgHex); + var bgLum = getLuminance(bgRgb.r, bgRgb.g, bgRgb.b); + + var elements = document.querySelectorAll('[style*="color"]'); + elements.forEach(function(el) { + var style = window.getComputedStyle(el); + var colorStr = style.color; + var rgb = rgbStringToRgb(colorStr); + if (rgb) { + var lum = getLuminance(rgb.r, rgb.g, rgb.b); + var l1 = Math.max(bgLum, lum); + var l2 = Math.min(bgLum, lum); + var contrast = (l1 + 0.05) / (l2 + 0.05); + + if (contrast < 4.5) { + var hsl = rgbToHsl(rgb.r, rgb.g, rgb.b); + if (bgLum < 0.5) { + hsl[2] = Math.max(hsl[2], 0.7); // Lighten + } else { + hsl[2] = Math.min(hsl[2], 0.3); // Darken + } + var newRgb = hslToRgb(hsl[0], hsl[1], hsl[2]); + el.style.setProperty('color', `rgb(${newRgb[0]}, ${newRgb[1]}, ${newRgb[2]})`, 'important'); + } + } + }); + + var bgElements = document.querySelectorAll('[style*="background"]'); + bgElements.forEach(function(el) { + var style = window.getComputedStyle(el); + var bgStr = style.backgroundColor; + if (bgStr && bgStr !== 'rgba(0, 0, 0, 0)' && bgStr !== 'transparent') { + var rgb = rgbStringToRgb(bgStr); + if (rgb) { + var lum = getLuminance(rgb.r, rgb.g, rgb.b); + if (isDark && lum > 0.5) { + el.style.setProperty('background-color', 'transparent', 'important'); + } else if (!isDark && lum < 0.2) { + el.style.setProperty('background-color', 'transparent', 'important'); + } + } + } + }); }; function handleHighlightInteraction(e) { diff --git a/app/src/main/java/com/aryan/reader/Common.kt b/app/src/main/java/com/aryan/reader/Common.kt index 4f5f287..2fe545e 100644 --- a/app/src/main/java/com/aryan/reader/Common.kt +++ b/app/src/main/java/com/aryan/reader/Common.kt @@ -39,6 +39,10 @@ import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import android.speech.tts.TextToSpeech import android.speech.tts.Voice +import androidx.compose.foundation.Canvas +import androidx.compose.foundation.gestures.awaitEachGesture +import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.drag import androidx.compose.foundation.layout.WindowInsetsSides import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize @@ -56,6 +60,7 @@ import androidx.compose.foundation.lazy.items import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField import androidx.compose.foundation.text.KeyboardActions import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.foundation.verticalScroll @@ -103,9 +108,16 @@ import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.geometry.Offset +import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.drawscope.Stroke +import androidx.compose.ui.graphics.toArgb +import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalClipboardManager import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager @@ -116,13 +128,17 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.TextLayoutResult +import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.font.FontFamily import androidx.compose.ui.text.font.FontStyle import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.ImeAction +import androidx.compose.ui.text.input.KeyboardType +import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Popup import androidx.compose.ui.window.PopupProperties import androidx.media3.common.util.UnstableApi @@ -156,6 +172,8 @@ import java.io.File import java.net.HttpURLConnection import java.net.URL import androidx.core.content.edit +import androidx.core.graphics.toColorInt +import kotlin.math.roundToInt const val aiServerBasePath = BuildConfig.AI_WORKER_URL const val summarizeEndpoint = "/summarize" @@ -1717,4 +1735,283 @@ fun DeviceVoiceSettingsSheet( } } } +} + +@Composable +fun SpectrumBox( + hue: Float, + saturation: Float, + currentColor: Color, + onHueSatChanged: (Float, Float) -> Unit, + modifier: Modifier = Modifier +) { + val rainbowColors = listOf( + Color.Red, Color.Yellow, Color.Green, Color.Cyan, Color.Blue, Color.Magenta, Color.Red + ) + val touchPadding = 12.dp + + Box( + modifier = modifier.pointerInput(Unit) { + awaitEachGesture { + val down = awaitFirstDown() + + val paddingPx = touchPadding.toPx() + val activeWidth = size.width.toFloat() - (paddingPx * 2) + val activeHeight = size.height.toFloat() - (paddingPx * 2) + + fun update(offset: Offset) { + val relativeX = offset.x - paddingPx + val relativeY = offset.y - paddingPx + + val h = (relativeX / activeWidth).coerceIn(0f, 1f) * 360f + val s = (relativeY / activeHeight).coerceIn(0f, 1f) + onHueSatChanged(h, s) + } + + update(down.position) + drag(down.id) { change -> + change.consume() + update(change.position) + } + } + } + ) { + Canvas( + modifier = Modifier + .fillMaxSize() + .padding(touchPadding) + .clip(RoundedCornerShape(12.dp)) + ) { + drawRect( + brush = Brush.horizontalGradient(rainbowColors) + ) + drawRect( + brush = Brush.verticalGradient( + colors = listOf(Color.White, Color.White.copy(alpha = 0f)) + ) + ) + } + + Canvas(modifier = Modifier.fillMaxSize()) { + val paddingPx = touchPadding.toPx() + val activeWidth = size.width - (paddingPx * 2) + val activeHeight = size.height - (paddingPx * 2) + + val x = paddingPx + (hue / 360f) * activeWidth + val y = paddingPx + saturation * activeHeight + + val pointerRadius = 10.dp.toPx() + val strokeWidth = 2.dp.toPx() + + drawCircle( + color = Color.Black.copy(alpha = 0.25f), + radius = pointerRadius + 1.dp.toPx(), + center = Offset(x, y + 1.dp.toPx()) + ) + + drawCircle( + color = currentColor.copy(alpha = 1f), + radius = pointerRadius, + center = Offset(x, y) + ) + + drawCircle( + color = Color.White, + radius = pointerRadius, + center = Offset(x, y), + style = Stroke(width = strokeWidth) + ) + } + } +} + +@Composable +fun BrightnessSlider( + hue: Float, + saturation: Float, + value: Float, + onValueChanged: (Float) -> Unit, + modifier: Modifier = Modifier +) { + val baseColor = remember(hue, saturation) { + Color.hsv(hue, saturation, 1f) + } + + Box( + modifier = modifier.pointerInput(Unit) { + awaitEachGesture { + val down = awaitFirstDown() + fun update(offset: Offset) { + val v = (offset.x / size.width.toFloat()).coerceIn(0f, 1f) + onValueChanged(v) + } + update(down.position) + drag(down.id) { change -> + change.consume() + update(change.position) + } + } + } + ) { + Canvas(modifier = Modifier.fillMaxSize()) { + drawRect( + brush = Brush.horizontalGradient( + colors = listOf(Color.Black, baseColor) + ) + ) + + val x = value * size.width + drawCircle( + color = Color.White, + radius = 8.dp.toPx(), + center = Offset(x, size.height / 2) + ) + } + } +} + +@Composable +fun RgbInputColumn( + label: String, + value: Float, + onValueChange: (Float) -> Unit, + modifier: Modifier = Modifier +) { + val intValue = (value * 255).roundToInt() + Column( + horizontalAlignment = Alignment.CenterHorizontally, + modifier = modifier + ) { + Text( + text = label, + color = Color.Gray, + fontSize = 11.sp, + maxLines = 1 + ) + Spacer(Modifier.height(4.dp)) + RgbInput(value = intValue, onValueChange = onValueChange) + } +} + +@Composable +fun RgbInput( + value: Int, + onValueChange: (Float) -> Unit +) { + var text by remember(value) { mutableStateOf(value.toString()) } + + LaunchedEffect(value) { + text = value.toString() + } + + BasicTextField( + value = text, + onValueChange = { newText -> + if (newText.length <= 3 && newText.all { it.isDigit() }) { + val intVal = newText.toIntOrNull() + if (intVal != null) { + onValueChange(intVal.coerceIn(0, 255) / 255f) + } + } + }, + textStyle = TextStyle( + color = Color.White, + textAlign = TextAlign.Center, + fontSize = 13.sp + ), + keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), + singleLine = true, + modifier = Modifier + .fillMaxWidth() + .height(36.dp) + .background(Color(0xFF3E3E3E), RoundedCornerShape(8.dp)) + .padding(vertical = 9.dp) + ) +} + +@Composable +fun HexInput( + color: Color, + onHexChanged: (Color) -> Unit +) { + val hexValue = remember(color) { + String.format("%06X", (0xFFFFFF and color.toArgb())) + } + var text by remember(hexValue) { mutableStateOf(hexValue) } + + LaunchedEffect(color) { + val currentParsed = try { + Color(("#$text").toColorInt()) + } catch (_: Exception) { + null + } + if (currentParsed?.toArgb() != color.toArgb()) { + text = String.format("%06X", (0xFFFFFF and color.toArgb())) + } + } + + Row( + modifier = Modifier + .fillMaxWidth() + .height(36.dp) + .background(Color(0xFF3E3E3E), RoundedCornerShape(8.dp)) + .padding(horizontal = 8.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.Center + ) { + Text( + text = "#", + color = Color.Gray, + fontSize = 13.sp, + fontWeight = FontWeight.Bold + ) + BasicTextField( + value = text, + onValueChange = { newText -> + if (newText.length <= 6) { + val uppercased = newText.uppercase() + if (uppercased.all { it.isDigit() || it in 'A'..'F' }) { + text = uppercased + if (uppercased.length == 6) { + try { + val parsedColorInt = "#$uppercased".toColorInt() + val newColor = Color(parsedColorInt) + onHexChanged(newColor) + } catch (_: Exception) { + } + } + } + } + }, + textStyle = TextStyle( + color = Color.White, + textAlign = TextAlign.Start, + fontSize = 13.sp + ), + singleLine = true, + cursorBrush = SolidColor(Color.White), + modifier = Modifier + .padding(start = 2.dp) + .width(50.dp) + ) + } +} + +@Composable +fun ColorComparePill( + oldColor: Color, + newColor: Color, + modifier: Modifier = Modifier +) { + Canvas(modifier = modifier.clip(RoundedCornerShape(8.dp))) { + drawRect( + color = oldColor.copy(alpha = 1f), + size = androidx.compose.ui.geometry.Size(size.width / 2, size.height) + ) + drawRect( + color = newColor.copy(alpha = 1f), + topLeft = Offset(size.width / 2, 0f), + size = androidx.compose.ui.geometry.Size(size.width / 2, size.height) + ) + } } \ No newline at end of file diff --git a/app/src/main/java/com/aryan/reader/epubreader/ChapterWebView.kt b/app/src/main/java/com/aryan/reader/epubreader/ChapterWebView.kt index c8b610e..7267acf 100644 --- a/app/src/main/java/com/aryan/reader/epubreader/ChapterWebView.kt +++ b/app/src/main/java/com/aryan/reader/epubreader/ChapterWebView.kt @@ -26,8 +26,10 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.content.Intent +import android.graphics.BitmapFactory import android.graphics.Color import android.graphics.Rect +import android.util.Base64 import android.webkit.JavascriptInterface import android.webkit.WebResourceRequest import android.webkit.WebSettings @@ -66,6 +68,7 @@ import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity @@ -84,6 +87,7 @@ import kotlinx.coroutines.launch import org.json.JSONObject import timber.log.Timber import java.io.BufferedReader +import java.io.ByteArrayOutputStream import java.io.InputStreamReader private fun getFontCssInjection(): String { @@ -150,7 +154,14 @@ class HighlightJsBridge( } @JavascriptInterface - fun onHighlightClicked(cfi: String, text: String, left: Int, top: Int, right: Int, bottom: Int) { + fun onHighlightClicked( + cfi: String, + text: String, + left: Int, + top: Int, + right: Int, + bottom: Int + ) { onClickCallback?.invoke(cfi, text, left, top, right, bottom) } } @@ -175,7 +186,8 @@ class CfiJsBridge( fun onCfiExtracted(jsonResponse: String) { try { // --- ADDED LOG --- - Timber.tag("PosSaveDiag").d("CfiJsBridge.onCfiExtracted: Raw JSON received from JS: $jsonResponse") + Timber.tag("PosSaveDiag") + .d("CfiJsBridge.onCfiExtracted: Raw JSON received from JS: $jsonResponse") val json = JSONObject(jsonResponse) val cfi = json.optString("cfi", "/4") @@ -196,7 +208,8 @@ class CfiJsBridge( onCfiReady(cfi) } } catch (e: Exception) { - Timber.tag("PosSaveDiag").e(e, "CfiJsBridge.onCfiExtracted: Error parsing CFI JSON response: $jsonResponse") + Timber.tag("PosSaveDiag") + .e(e, "CfiJsBridge.onCfiExtracted: Error parsing CFI JSON response: $jsonResponse") onCfiReady("/4") } } @@ -270,8 +283,7 @@ private data class CustomMenuState( @Suppress("unused") class AiJsBridge( - private val scope: CoroutineScope, - private val onContentReady: suspend (String) -> Unit + private val scope: CoroutineScope, private val onContentReady: suspend (String) -> Unit ) { @JavascriptInterface fun onContentExtractedForSummarization(text: String) { @@ -297,6 +309,8 @@ fun ChapterWebView( onChunkRequested: (Int) -> Unit, chapterTitle: String, isDarkTheme: Boolean, + effectiveBg: androidx.compose.ui.graphics.Color, + effectiveText: androidx.compose.ui.graphics.Color, initialScrollTarget: ChapterScrollPosition?, initialPageScrollY: Int?, initialCfi: String?, @@ -335,7 +349,8 @@ fun ChapterWebView( onHighlightClicked: () -> Unit, onAutoScrollChapterEnd: () -> Unit = {}, activeHighlightPalette: List, - onUpdatePalette: (Int, HighlightColor) -> Unit + onUpdatePalette: (Int, HighlightColor) -> Unit, + activeTextureId: String? = null ) { Timber.d( "RenderChapterViaWebView for '$chapterTitle', Key: $key, isDarkTheme: $isDarkTheme, initialScrollTarget: $initialScrollTarget" @@ -352,6 +367,21 @@ fun ChapterWebView( var showPaletteManager by remember { mutableStateOf(false) } + val textureBase64 by remember(activeTextureId) { + mutableStateOf( + activeTextureId?.let { id -> + ReaderTexture.entries.find { it.id == id }?.resId?.let { resId -> + val bmp = BitmapFactory.decodeResource(context.resources, resId) + val out = ByteArrayOutputStream() + bmp.compress(android.graphics.Bitmap.CompressFormat.PNG, 100, out) + "data:image/png;base64," + Base64.encodeToString( + out.toByteArray(), + Base64.NO_WRAP + ) + } + }) + } + val currentOnSnippetForBookmarkReady by rememberUpdatedState(onSnippetForBookmarkReady) val currentOnCfiGenerated by rememberUpdatedState(onCfiGenerated) val currentOnBookmarkCfiGenerated by rememberUpdatedState(onBookmarkCfiGenerated) @@ -359,8 +389,7 @@ fun ChapterWebView( LaunchedEffect(currentFontSize, currentLineHeight) { localWebViewRef?.evaluateJavascript( - "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", - null + "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", null ) } @@ -391,9 +420,7 @@ fun ChapterWebView( } catch (e: ActivityNotFoundException) { Timber.e(e, "No activity found to handle intent for URL: $urlToShow") Toast.makeText( - context, - "No browser found to open the link.", - Toast.LENGTH_LONG + context, "No browser found to open the link.", Toast.LENGTH_LONG ).show() } showExternalLinkDialog = null @@ -409,14 +436,19 @@ fun ChapterWebView( }, dismissButton = { TextButton(onClick = { showExternalLinkDialog = null }) { Text("Cancel") } - } - ) + }) } Box(modifier = modifier.fillMaxSize()) { + + LaunchedEffect(isDarkTheme, effectiveBg, effectiveText, textureBase64) { + val bgHex = String.format("#%06X", (0xFFFFFF and effectiveBg.toArgb())) + val textHex = String.format("#%06X", (0xFFFFFF and effectiveText.toArgb())) + localWebViewRef?.evaluateJavascript("javascript:window.applyReaderTheme($isDarkTheme, '$bgHex', '$textHex', ${textureBase64?.let { "'$it'" } ?: "null"});", null) + } + key( key, - isDarkTheme, currentFontSize, currentLineHeight, currentFontFamily, @@ -424,408 +456,427 @@ fun ChapterWebView( ) { AndroidView( factory = { ctx -> - Timber.d( - "InteractiveWebView factory for $chapterTitle (Key: $key), isDarkTheme: $isDarkTheme, initialScroll: $initialScrollTarget" + Timber.d( + "InteractiveWebView factory for $chapterTitle (Key: $key), isDarkTheme: $isDarkTheme, initialScroll: $initialScrollTarget" + ) + val webView = InteractiveWebView( + context = ctx, + onSingleTap = onTap, + onPotentialScroll = onPotentialScroll, + onOverScrollTop = onOverScrollTop, + onOverScrollBottom = onOverScrollBottom, + onReleaseOverScrollTop = onReleaseOverScrollTop, + onReleaseOverScrollBottom = onReleaseOverScrollBottom, + onShowCustomSelectionMenu = { text, bounds, finishCallback -> + if (text.isNotBlank() && !bounds.isEmpty) { + customMenuState = CustomMenuState( + selectedText = text, + selectionBounds = Rect(bounds), + finishActionModeCallback = finishCallback, + isExistingHighlight = false + ) + } else { + customMenuState = null + finishCallback() + } + }, + onHideCustomSelectionMenu = { + if (customMenuState?.isExistingHighlight != true) { + customMenuState = null + } + }).apply { + localWebViewRef = this + onWebViewInstanceCreated(this) + addJavascriptInterface( + PageInfoBridge(onScrollStateUpdate), "PageInfoReporter" ) - val webView = InteractiveWebView( - context = ctx, - onSingleTap = onTap, - onPotentialScroll = onPotentialScroll, - onOverScrollTop = onOverScrollTop, - onOverScrollBottom = onOverScrollBottom, - onReleaseOverScrollTop = onReleaseOverScrollTop, - onReleaseOverScrollBottom = onReleaseOverScrollBottom, - onShowCustomSelectionMenu = { text, bounds, finishCallback -> - if (text.isNotBlank() && !bounds.isEmpty) { - customMenuState = CustomMenuState( - selectedText = text, - selectionBounds = Rect(bounds), - finishActionModeCallback = finishCallback, - isExistingHighlight = false - ) - } else { - customMenuState = null - finishCallback() - } - }, - onHideCustomSelectionMenu = { - if (customMenuState?.isExistingHighlight != true) { - customMenuState = null - } - } - ).apply { - localWebViewRef = this - onWebViewInstanceCreated(this) - addJavascriptInterface( - PageInfoBridge(onScrollStateUpdate), - "PageInfoReporter" - ) - addJavascriptInterface( - ProgressJsBridge(onTopChunkUpdated), - "ProgressReporter" - ) - addJavascriptInterface(ContentBridge(onChunkRequested), "ContentBridge") + addJavascriptInterface( + ProgressJsBridge(onTopChunkUpdated), "ProgressReporter" + ) + addJavascriptInterface(ContentBridge(onChunkRequested), "ContentBridge") - addJavascriptInterface(HighlightJsBridge( - onCreateCallback = onHighlightCreated, - onClickCallback = { cfi, text, left, top, right, bottom -> + addJavascriptInterface( + HighlightJsBridge( + onCreateCallback = onHighlightCreated, + onClickCallback = { cfi, text, left, top, right, bottom -> - onHighlightClicked() + onHighlightClicked() - val densityValue = density.density - val locationOnScreen = IntArray(2) - this.getLocationOnScreen(locationOnScreen) - val xOffset = locationOnScreen[0] - val yOffset = locationOnScreen[1] + val densityValue = density.density + val locationOnScreen = IntArray(2) + this.getLocationOnScreen(locationOnScreen) + val xOffset = locationOnScreen[0] + val yOffset = locationOnScreen[1] - val rect = Rect( - (left * densityValue).toInt() + xOffset, - (top * densityValue).toInt() + yOffset, - (right * densityValue).toInt() + xOffset, - (bottom * densityValue).toInt() + yOffset - ) + val rect = Rect( + (left * densityValue).toInt() + xOffset, + (top * densityValue).toInt() + yOffset, + (right * densityValue).toInt() + xOffset, + (bottom * densityValue).toInt() + yOffset + ) - customMenuState = CustomMenuState( - selectedText = text, - selectionBounds = rect, - finishActionModeCallback = { - localWebViewRef?.evaluateJavascript("javascript:if(window.getSelection) window.getSelection().removeAllRanges();", null) - }, - cfi = cfi, - isExistingHighlight = true - ) - } - ), "HighlightBridge") - - addJavascriptInterface( - AutoScrollJsBridge { - onAutoScrollChapterEnd() - }, - "AutoScrollBridge" - ) - - webChromeClient = object : android.webkit.WebChromeClient() { - override fun onConsoleMessage(consoleMessage: android.webkit.ConsoleMessage?): Boolean { - consoleMessage?.let { - val message = it.message() - when { - message.startsWith("BookmarkDiagnosis") -> { - Timber.tag("BookmarkDiagnosis").d("JS -> ${message.substringAfter("BookmarkDiagnosis: ")}") - } - - message.startsWith("CFI_DIAGNOSIS:") -> { - Timber.d( - "JS -> ${message.substringAfter("CFI_DIAGNOSIS: ")}" - ) - } - - message.startsWith("ImageDiagnosis") -> { - Timber.d("JS -> $message") - } - - message.startsWith("TTS_HIGHLIGHT_DIAGNOSIS:") -> { - Timber.d( - "JS -> ${message.substringAfter("TTS_HIGHLIGHT_DIAGNOSIS: ")}" - ) - } - - message.startsWith("HIGHLIGHT_DEBUG:") -> { - Timber.d( - "JS -> ${message.substringAfter("HIGHLIGHT_DEBUG: ")}" - ) - } - - message.startsWith("ReaderFontDiagnosis") -> { - Timber.d( - "JS -> ${message.substringAfter("ReaderFontDiagnosis: ")}" - ) - } - - message.startsWith("AutoScrollDiagnosis") -> { - Timber.d( - "JS -> ${message.substringAfter("AutoScrollDiagnosis: ")}" - ) - } - - message.startsWith("FRAG_NAV_DEBUG") -> { - Timber.tag("FRAG_NAV_DEBUG").d("JS -> ${message.substringAfter("FRAG_NAV_DEBUG: ")}") - } - - else -> { - Timber.d( - "[${it.sourceId()}:${it.lineNumber()}] ${it.message()}" - ) - } - } - } - return true - } - } - addJavascriptInterface( - CfiJsBridge( - onCfiReady = { cfi -> currentOnCfiGenerated(cfi) }, - onCfiForBookmarkReady = { cfi -> currentOnBookmarkCfiGenerated(cfi) }, - onScrollFinishedCallback = { success -> currentOnScrollFinished(success) } - ), "CfiBridge" - ) - - addJavascriptInterface( - SnippetJsBridge { cfi, snippet -> - currentOnSnippetForBookmarkReady(cfi, snippet) - }, "SnippetBridge" - ) - addJavascriptInterface(TtsJsBridge(ttsScope, onTtsTextReady), "TtsBridge") - addJavascriptInterface( - AiJsBridge(ttsScope, onContentReadyForSummarization), - "AiBridge" - ) - - webViewClient = object : WebViewClient() { - override fun shouldOverrideUrlLoading( - view: WebView?, - request: WebResourceRequest? - ): Boolean { - val url = request?.url?.toString() - if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) { - Timber.d("Intercepted external link: $url") - showExternalLinkDialog = url - return true - } - return false - } - - override fun onLoadResource(view: WebView?, url: String?) { - super.onLoadResource(view, url) - if (url?.contains(".jpg", true) == true || - url?.contains(".jpeg", true) == true || - url?.contains(".png", true) == true || - url?.contains(".gif", true) == true || - url?.contains(".svg", true) == true || - url?.contains("image", true) == true - ) { - Timber.d( - "WebView is attempting to load resource: $url" - ) - } - } - - override fun onPageFinished(view: WebView?, url: String?) { - super.onPageFinished(view, url) - Timber.d( - "onPageFinished. Injecting CSS and Font: ${currentFontFamily.fontFamilyName}" - ) - - view?.evaluateJavascript(jsToInject, null) - view?.evaluateJavascript( - "javascript:window.applyReaderTheme($isDarkTheme);", - null - ) - - val fragmentsJson = org.json.JSONArray(tocFragments).toString() - Timber.tag("FRAG_NAV_DEBUG").d("onPageFinished: Re-injecting TOC_FRAGMENTS: $fragmentsJson") - view?.evaluateJavascript("javascript:window.TOC_FRAGMENTS = $fragmentsJson;", null) - - view?.evaluateJavascript("javascript:setTimeout(window.auditTocFragments, 500);", null) - - view?.evaluateJavascript("javascript:window.HighlightBridgeHelper.restoreHighlights('${escapeJsString(highlightsJson)}');", null) - - val fontCss = getFontCssInjection().replace("\n", " ") - val customFontCss = if (customFontPath != null) { - "@font-face { font-family: 'CustomFont'; src: url('file://$customFontPath'); }" - } else "" - val combinedCss = "$fontCss $customFontCss" - - val injectFontJs = - "var style = document.createElement('style'); style.id='injectedFonts'; style.innerHTML = \"$combinedCss\"; document.head.appendChild(style);" - view?.evaluateJavascript("javascript:$injectFontJs") { - Timber.d("CSS Injection result: $it") - } - - val fontNameForJs = if (customFontPath != null) { - "CustomFont" - } else if (currentFontFamily == ReaderFont.ORIGINAL) { - "" - } else { - currentFontFamily.fontFamilyName - } - - view?.evaluateJavascript( - "javascript:window.updateReaderStyles($currentFontSize, $currentLineHeight, '$fontNameForJs', '${currentTextAlign.cssValue}');", - null - ) - - view?.evaluateJavascript( - "javascript:window.checkImagesForDiagnosis();", - null - ) - - view?.evaluateJavascript( - "javascript:window.virtualization.init($initialChunkIndex, $totalChunks);", - null - ) - - @Suppress("VariableNeverRead") var scrollActionTaken = false - - if (!initialCfi.isNullOrBlank()) { - val cfiJsCommand = - "javascript:window.scrollToCfi('$initialCfi');" - Timber.d( - "WebView onPageFinished: Executing initial scroll to CFI: $initialCfi" - ) - view?.evaluateJavascript(cfiJsCommand) { - onChapterInitiallyScrolled() - scrollActionTaken = true - } - } else if (!initialFragmentId.isNullOrBlank()) { - Timber.d("WebView onPageFinished: Scrolling to Element ID: $initialFragmentId") - view?.evaluateJavascript( - "javascript:var el = document.getElementById('$initialFragmentId'); if(el) { el.scrollIntoView(); } else { console.log('Element not found: $initialFragmentId'); }", + customMenuState = CustomMenuState( + selectedText = text, + selectionBounds = rect, + finishActionModeCallback = { + localWebViewRef?.evaluateJavascript( + "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", null ) - onChapterInitiallyScrolled() - scrollActionTaken = true - } else if (initialScrollTarget != null) { - val scrollJsCommand = when (initialScrollTarget) { - ChapterScrollPosition.END -> "javascript:window.scrollToChapterEnd();" - else -> "javascript:window.scrollToChapterStart();" + }, + cfi = cfi, + isExistingHighlight = true + ) + }), "HighlightBridge") + + addJavascriptInterface( + AutoScrollJsBridge { + onAutoScrollChapterEnd() + }, "AutoScrollBridge" + ) + + webChromeClient = object : android.webkit.WebChromeClient() { + override fun onConsoleMessage(consoleMessage: android.webkit.ConsoleMessage?): Boolean { + consoleMessage?.let { + val message = it.message() + when { + message.startsWith("BookmarkDiagnosis") -> { + Timber.tag("BookmarkDiagnosis") + .d("JS -> ${message.substringAfter("BookmarkDiagnosis: ")}") } - Timber.d( - "WebView onPageFinished: Executing initial scroll to target: $initialScrollTarget" - ) - view?.evaluateJavascript(scrollJsCommand) { - onChapterInitiallyScrolled() - scrollActionTaken = true + + message.startsWith("CFI_DIAGNOSIS:") -> { + Timber.d( + "JS -> ${message.substringAfter("CFI_DIAGNOSIS: ")}" + ) } - } else if (initialPageScrollY != null && initialPageScrollY > 0) { - val scrollJsCommand = - "javascript:window.scrollToSpecificY($initialPageScrollY);" - Timber.d( - "WebView onPageFinished: Executing initial scroll to Y: $initialPageScrollY" - ) - view?.evaluateJavascript(scrollJsCommand) { - onChapterInitiallyScrolled() - scrollActionTaken = true + + message.startsWith("ImageDiagnosis") -> { + Timber.d("JS -> $message") } - } else { - Timber.d( - "WebView onPageFinished: No specific scroll, defaulting to start." - ) - view?.evaluateJavascript("javascript:window.scrollToChapterStart();") { - onChapterInitiallyScrolled() - scrollActionTaken = true + + message.startsWith("TTS_HIGHLIGHT_DIAGNOSIS:") -> { + Timber.d( + "JS -> ${message.substringAfter("TTS_HIGHLIGHT_DIAGNOSIS: ")}" + ) + } + + message.startsWith("HIGHLIGHT_DEBUG:") -> { + Timber.d( + "JS -> ${message.substringAfter("HIGHLIGHT_DEBUG: ")}" + ) + } + + message.startsWith("ReaderFontDiagnosis") -> { + Timber.d( + "JS -> ${message.substringAfter("ReaderFontDiagnosis: ")}" + ) + } + + message.startsWith("AutoScrollDiagnosis") -> { + Timber.d( + "JS -> ${message.substringAfter("AutoScrollDiagnosis: ")}" + ) + } + + message.startsWith("FRAG_NAV_DEBUG") -> { + Timber.tag("FRAG_NAV_DEBUG") + .d("JS -> ${message.substringAfter("FRAG_NAV_DEBUG: ")}") + } + + else -> { + Timber.d( + "[${it.sourceId()}:${it.lineNumber()}] ${it.message()}" + ) } } + } + return true + } + } + addJavascriptInterface( + CfiJsBridge( + onCfiReady = { cfi -> currentOnCfiGenerated(cfi) }, + onCfiForBookmarkReady = { cfi -> currentOnBookmarkCfiGenerated(cfi) }, + onScrollFinishedCallback = { success -> + currentOnScrollFinished(success) + }), "CfiBridge") - view?.clearFocus() - view?.evaluateJavascript( - "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", - null + addJavascriptInterface( + SnippetJsBridge { cfi, snippet -> + currentOnSnippetForBookmarkReady(cfi, snippet) + }, "SnippetBridge" + ) + addJavascriptInterface(TtsJsBridge(ttsScope, onTtsTextReady), "TtsBridge") + addJavascriptInterface( + AiJsBridge(ttsScope, onContentReadyForSummarization), "AiBridge" + ) + + webViewClient = object : WebViewClient() { + override fun shouldOverrideUrlLoading( + view: WebView?, request: WebResourceRequest? + ): Boolean { + val url = request?.url?.toString() + if (url != null && (url.startsWith("http://") || url.startsWith("https://"))) { + Timber.d("Intercepted external link: $url") + showExternalLinkDialog = url + return true + } + return false + } + + override fun onLoadResource(view: WebView?, url: String?) { + super.onLoadResource(view, url) + if (url?.contains(".jpg", true) == true || url?.contains( + ".jpeg", + true + ) == true || url?.contains( + ".png", + true + ) == true || url?.contains( + ".gif", + true + ) == true || url?.contains( + ".svg", + true + ) == true || url?.contains("image", true) == true + ) { + Timber.d( + "WebView is attempting to load resource: $url" ) } } - settings.apply { - javaScriptEnabled = true - allowFileAccess = true - allowContentAccess = true - domStorageEnabled = true - layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL - setNeedInitialFocus(false) - setSupportZoom(false) - builtInZoomControls = false - displayZoomControls = false - useWideViewPort = true - loadWithOverviewMode = true + + override fun onPageFinished(view: WebView?, url: String?) { + super.onPageFinished(view, url) + Timber.d( + "onPageFinished. Injecting CSS and Font: ${currentFontFamily.fontFamilyName}" + ) + + view?.evaluateJavascript(jsToInject, null) + + val bgHex = String.format("#%06X", (0xFFFFFF and effectiveBg.toArgb())) + val textHex = + String.format("#%06X", (0xFFFFFF and effectiveText.toArgb())) + view?.evaluateJavascript("javascript:window.applyReaderTheme($isDarkTheme, '$bgHex', '$textHex', ${textureBase64?.let { "'$it'" } ?: "null"});", + null) + + val fragmentsJson = org.json.JSONArray(tocFragments).toString() + Timber.tag("FRAG_NAV_DEBUG") + .d("onPageFinished: Re-injecting TOC_FRAGMENTS: $fragmentsJson") + view?.evaluateJavascript( + "javascript:window.TOC_FRAGMENTS = $fragmentsJson;", + null + ) + + view?.evaluateJavascript( + "javascript:setTimeout(window.auditTocFragments, 500);", + null + ) + + view?.evaluateJavascript( + "javascript:window.HighlightBridgeHelper.restoreHighlights('${ + escapeJsString( + highlightsJson + ) + }');", null + ) + + val fontCss = getFontCssInjection().replace("\n", " ") + val customFontCss = if (customFontPath != null) { + "@font-face { font-family: 'CustomFont'; src: url('file://$customFontPath'); }" + } else "" + val combinedCss = "$fontCss $customFontCss" + + val injectFontJs = + "var style = document.createElement('style'); style.id='injectedFonts'; style.innerHTML = \"$combinedCss\"; document.head.appendChild(style);" + view?.evaluateJavascript("javascript:$injectFontJs") { + Timber.d("CSS Injection result: $it") + } + + val fontNameForJs = if (customFontPath != null) { + "CustomFont" + } else if (currentFontFamily == ReaderFont.ORIGINAL) { + "" + } else { + currentFontFamily.fontFamilyName + } + + view?.evaluateJavascript( + "javascript:window.updateReaderStyles($currentFontSize, $currentLineHeight, '$fontNameForJs', '${currentTextAlign.cssValue}');", + null + ) + + view?.evaluateJavascript( + "javascript:window.checkImagesForDiagnosis();", null + ) + + view?.evaluateJavascript( + "javascript:window.virtualization.init($initialChunkIndex, $totalChunks);", + null + ) + + @Suppress("VariableNeverRead") var scrollActionTaken = false + + if (!initialCfi.isNullOrBlank()) { + val cfiJsCommand = "javascript:window.scrollToCfi('$initialCfi');" + Timber.d( + "WebView onPageFinished: Executing initial scroll to CFI: $initialCfi" + ) + view?.evaluateJavascript(cfiJsCommand) { + onChapterInitiallyScrolled() + scrollActionTaken = true + } + } else if (!initialFragmentId.isNullOrBlank()) { + Timber.d("WebView onPageFinished: Scrolling to Element ID: $initialFragmentId") + view?.evaluateJavascript( + "javascript:var el = document.getElementById('$initialFragmentId'); if(el) { el.scrollIntoView(); } else { console.log('Element not found: $initialFragmentId'); }", + null + ) + onChapterInitiallyScrolled() + scrollActionTaken = true + } else if (initialScrollTarget != null) { + val scrollJsCommand = when (initialScrollTarget) { + ChapterScrollPosition.END -> "javascript:window.scrollToChapterEnd();" + else -> "javascript:window.scrollToChapterStart();" + } + Timber.d( + "WebView onPageFinished: Executing initial scroll to target: $initialScrollTarget" + ) + view?.evaluateJavascript(scrollJsCommand) { + onChapterInitiallyScrolled() + scrollActionTaken = true + } + } else if (initialPageScrollY != null && initialPageScrollY > 0) { + val scrollJsCommand = + "javascript:window.scrollToSpecificY($initialPageScrollY);" + Timber.d( + "WebView onPageFinished: Executing initial scroll to Y: $initialPageScrollY" + ) + view?.evaluateJavascript(scrollJsCommand) { + onChapterInitiallyScrolled() + scrollActionTaken = true + } + } else { + Timber.d( + "WebView onPageFinished: No specific scroll, defaulting to start." + ) + view?.evaluateJavascript("javascript:window.scrollToChapterStart();") { + onChapterInitiallyScrolled() + scrollActionTaken = true + } + } + + view?.clearFocus() + view?.evaluateJavascript( + "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", + null + ) } - isVerticalScrollBarEnabled = false - isHorizontalScrollBarEnabled = false - this.setBackgroundColor(Color.TRANSPARENT) - Timber.d( - "WebView loading initial data with base URL: $baseUrl (Key: $key)" - ) - loadDataWithBaseURL(baseUrl, initialHtmlContent, "text/html", "UTF-8", null) } - webView - }, - update = { webView -> + settings.apply { + javaScriptEnabled = true + allowFileAccess = true + allowContentAccess = true + domStorageEnabled = true + layoutAlgorithm = WebSettings.LayoutAlgorithm.NORMAL + setNeedInitialFocus(false) + setSupportZoom(false) + builtInZoomControls = false + displayZoomControls = false + useWideViewPort = true + loadWithOverviewMode = true + } + isVerticalScrollBarEnabled = false + isHorizontalScrollBarEnabled = false + this.setBackgroundColor(Color.TRANSPARENT) Timber.d( - "WebView update. Setting Font: ${currentFontFamily.fontFamilyName}" + "WebView loading initial data with base URL: $baseUrl (Key: $key)" ) - localWebViewRef = webView - onWebViewInstanceCreated(webView) - val fontCss = getFontCssInjection().replace("\n", " ") - val customFontCss = if (customFontPath != null) { - "@font-face { font-family: 'CustomFont'; src: url('file://$customFontPath'); }" - } else "" - val combinedCss = "$fontCss $customFontCss" - val injectFontJs = - "var style = document.getElementById('injectedFonts'); if(!style) { style = document.createElement('style'); style.id='injectedFonts'; document.head.appendChild(style); } style.innerHTML = \"$combinedCss\";" - webView.evaluateJavascript("javascript:$injectFontJs", null) - val fontNameForJs = if (customFontPath != null) { - "CustomFont" - } else if (currentFontFamily == ReaderFont.ORIGINAL) { - "" - } else { - currentFontFamily.fontFamilyName - } - val fragmentsJson = org.json.JSONArray(tocFragments).toString() - Timber.tag("FRAG_NAV_DEBUG").d("Injecting TOC_FRAGMENTS via setter: $fragmentsJson") + loadDataWithBaseURL(baseUrl, initialHtmlContent, "text/html", "UTF-8", null) + } + webView + }, update = { webView -> + Timber.d( + "WebView update. Setting Font: ${currentFontFamily.fontFamilyName}" + ) + localWebViewRef = webView + onWebViewInstanceCreated(webView) + val fontCss = getFontCssInjection().replace("\n", " ") + val customFontCss = if (customFontPath != null) { + "@font-face { font-family: 'CustomFont'; src: url('file://$customFontPath'); }" + } else "" + val combinedCss = "$fontCss $customFontCss" + val injectFontJs = + "var style = document.getElementById('injectedFonts'); if(!style) { style = document.createElement('style'); style.id='injectedFonts'; document.head.appendChild(style); } style.innerHTML = \"$combinedCss\";" + webView.evaluateJavascript("javascript:$injectFontJs", null) + val fontNameForJs = if (customFontPath != null) { + "CustomFont" + } else if (currentFontFamily == ReaderFont.ORIGINAL) { + "" + } else { + currentFontFamily.fontFamilyName + } + val fragmentsJson = org.json.JSONArray(tocFragments).toString() + Timber.tag("FRAG_NAV_DEBUG").d("Injecting TOC_FRAGMENTS via setter: $fragmentsJson") - webView.evaluateJavascript("javascript:window.setTocFragments($fragmentsJson);", null) + webView.evaluateJavascript( + "javascript:window.setTocFragments($fragmentsJson);", + null + ) - webView.evaluateJavascript( - "javascript:window.updateReaderStyles($currentFontSize, $currentLineHeight, '$fontNameForJs', '${currentTextAlign.cssValue}');", - null - ) - }, - modifier = Modifier.fillMaxSize() + webView.evaluateJavascript( + "javascript:window.updateReaderStyles($currentFontSize, $currentLineHeight, '$fontNameForJs', '${currentTextAlign.cssValue}');", + null + ) + }, modifier = Modifier.fillMaxSize() ) } // Custom Selection Menu Popup customMenuState?.let { state -> - val popupPositionProvider = remember(state.selectionBounds, density, state.isExistingHighlight) { - object : PopupPositionProvider { - override fun calculatePosition( - anchorBounds: IntRect, - windowSize: IntSize, - layoutDirection: LayoutDirection, - popupContentSize: IntSize - ): IntOffset { - val topMargin = with(density) { 16.dp.toPx() }.toInt() - val bottomMargin = with(density) { - if (state.isExistingHighlight) 16.dp.toPx() else 60.dp.toPx() - }.toInt() + val popupPositionProvider = + remember(state.selectionBounds, density, state.isExistingHighlight) { + object : PopupPositionProvider { + override fun calculatePosition( + anchorBounds: IntRect, + windowSize: IntSize, + layoutDirection: LayoutDirection, + popupContentSize: IntSize + ): IntOffset { + val topMargin = with(density) { 16.dp.toPx() }.toInt() + val bottomMargin = with(density) { + if (state.isExistingHighlight) 16.dp.toPx() else 60.dp.toPx() + }.toInt() - var x = state.selectionBounds.centerX() - popupContentSize.width / 2 + var x = state.selectionBounds.centerX() - popupContentSize.width / 2 - var y = state.selectionBounds.top - popupContentSize.height - topMargin - if (y < with(density) { 24.dp.toPx() }.toInt()) { - y = state.selectionBounds.bottom + bottomMargin - } - if (x < 0) x = 0 - if (x + popupContentSize.width > windowSize.width) { - x = windowSize.width - popupContentSize.width - } - if (y + popupContentSize.height > windowSize.height) { - y = windowSize.height - popupContentSize.height - } - if (y < 0) y = 0 + var y = state.selectionBounds.top - popupContentSize.height - topMargin + if (y < with(density) { 24.dp.toPx() }.toInt()) { + y = state.selectionBounds.bottom + bottomMargin + } + if (x < 0) x = 0 + if (x + popupContentSize.width > windowSize.width) { + x = windowSize.width - popupContentSize.width + } + if (y + popupContentSize.height > windowSize.height) { + y = windowSize.height - popupContentSize.height + } + if (y < 0) y = 0 - return IntOffset( - x.coerceIn(0, windowSize.width - popupContentSize.width), - y.coerceIn(0, windowSize.height - popupContentSize.height) - ) + return IntOffset( + x.coerceIn(0, windowSize.width - popupContentSize.width), + y.coerceIn(0, windowSize.height - popupContentSize.height) + ) + } } } - } Popup( - popupPositionProvider = popupPositionProvider, - onDismissRequest = { + popupPositionProvider = popupPositionProvider, onDismissRequest = { state.finishActionModeCallback() customMenuState = null - } - ) { + }) { Surface( shape = RoundedCornerShape(12.dp), shadowElevation = 6.dp, @@ -849,36 +900,31 @@ fun ChapterWebView( .size(32.dp) .background(colorEnum.color, CircleShape) .pointerInput(colorEnum) { - detectTapGestures( - onTap = { - Timber.d("Kotlin: Color clicked. Existing? ${state.isExistingHighlight}") - if (state.isExistingHighlight && state.cfi != null) { - localWebViewRef?.evaluateJavascript( - "javascript:window.HighlightBridgeHelper.updateHighlightStyle('${state.cfi}', '${colorEnum.cssClass}', '${colorEnum.id}');", - null - ) - } else { - localWebViewRef?.evaluateJavascript( - "javascript:window.HighlightBridgeHelper.createUserHighlight('${colorEnum.cssClass}', '${colorEnum.id}');", - null - ) - } - state.finishActionModeCallback() - localWebViewRef?.clearFocus() - customMenuState = null - }, - onLongPress = { - showPaletteManager = true + detectTapGestures(onTap = { + Timber.d("Kotlin: Color clicked. Existing? ${state.isExistingHighlight}") + if (state.isExistingHighlight && state.cfi != null) { + localWebViewRef?.evaluateJavascript( + "javascript:window.HighlightBridgeHelper.updateHighlightStyle('${state.cfi}', '${colorEnum.cssClass}', '${colorEnum.id}');", + null + ) + } else { + localWebViewRef?.evaluateJavascript( + "javascript:window.HighlightBridgeHelper.createUserHighlight('${colorEnum.cssClass}', '${colorEnum.id}');", + null + ) } - ) - } - ) + state.finishActionModeCallback() + localWebViewRef?.clearFocus() + customMenuState = null + }, onLongPress = { + showPaletteManager = true + }) + }) } Spacer(modifier = Modifier.width(8.dp)) SpectrumButton( - onClick = { showPaletteManager = true }, - size = 32.dp + onClick = { showPaletteManager = true }, size = 32.dp ) } @@ -892,14 +938,18 @@ fun ChapterWebView( ) { PaginatedTextSelectionMenu( onCopy = { - val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText("Copied Text", state.selectedText) - clipboard.setPrimaryClip(clip) - state.finishActionModeCallback() - localWebViewRef?.clearFocus() - localWebViewRef?.evaluateJavascript("javascript:if(window.getSelection) window.getSelection().removeAllRanges();", null) - customMenuState = null - }, + val clipboard = + context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText("Copied Text", state.selectedText) + clipboard.setPrimaryClip(clip) + state.finishActionModeCallback() + localWebViewRef?.clearFocus() + localWebViewRef?.evaluateJavascript( + "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", + null + ) + customMenuState = null + }, onSelectAll = null, onDictionary = { val textToDefine = state.selectedText @@ -924,24 +974,34 @@ fun ChapterWebView( }, onHighlight = null, // Highlight handles itself above in the Colors Row onTts = { - localWebViewRef?.evaluateJavascript("javascript:window.TtsBridgeHelper.extractAndRelayTextFromSelection();", null) + localWebViewRef?.evaluateJavascript( + "javascript:window.TtsBridgeHelper.extractAndRelayTextFromSelection();", + null + ) state.finishActionModeCallback() localWebViewRef?.clearFocus() - localWebViewRef?.evaluateJavascript("javascript:if(window.getSelection) window.getSelection().removeAllRanges();", null) + localWebViewRef?.evaluateJavascript( + "javascript:if(window.getSelection) window.getSelection().removeAllRanges();", + null + ) customMenuState = null }, onDelete = if (state.isExistingHighlight && state.cfi != null) { { val highlightToDelete = userHighlights.find { h -> - h.cfi == state.cfi || h.cfi.split("|").contains(state.cfi) + h.cfi == state.cfi || h.cfi.split("|") + .contains(state.cfi) } if (highlightToDelete != null) { val cssClassToDelete = highlightToDelete.color.cssClass val allCfiParts = highlightToDelete.cfi.split("|") allCfiParts.forEach { partCfi -> localWebViewRef?.evaluateJavascript( - "javascript:window.HighlightBridgeHelper.removeHighlightByCfi('${escapeJsString(partCfi)}', '$cssClassToDelete');", - null + "javascript:window.HighlightBridgeHelper.removeHighlightByCfi('${ + escapeJsString( + partCfi + ) + }', '$cssClassToDelete');", null ) } onHighlightDeleted(highlightToDelete.cfi) @@ -951,8 +1011,7 @@ fun ChapterWebView( } } else null, isProUser = isProUser, - isOss = isOss - ) + isOss = isOss) } } } @@ -967,8 +1026,7 @@ fun ChapterWebView( onUpdatePalette(index, color) } showPaletteManager = false - } - ) + }) } } } \ No newline at end of file diff --git a/app/src/main/java/com/aryan/reader/epubreader/EpubReaderControls.kt b/app/src/main/java/com/aryan/reader/epubreader/EpubReaderControls.kt index 02f08c2..9f6ddd3 100644 --- a/app/src/main/java/com/aryan/reader/epubreader/EpubReaderControls.kt +++ b/app/src/main/java/com/aryan/reader/epubreader/EpubReaderControls.kt @@ -152,6 +152,7 @@ fun EpubReaderTopBar( onOpenTtsSettings: () -> Unit, onOpenDeviceVoiceSettings: () -> Unit, onOpenDictionarySettings: () -> Unit, + onOpenThemeSettings: () -> Unit, searchFocusRequester: androidx.compose.ui.focus.FocusRequester, modifier: Modifier = Modifier, onToggleReflow: (() -> Unit)? = null, @@ -209,6 +210,13 @@ fun EpubReaderTopBar( contentDescription = "Dictionary Settings" ) } + TooltipIconButton( + text = "Theme", + description = "Theme Settings", + onClick = onOpenThemeSettings + ) { + Icon(painter = painterResource(id = R.drawable.palette), contentDescription = "Theme Settings") + } Box { var showMoreMenu by remember { mutableStateOf(false) } TooltipIconButton( diff --git a/app/src/main/java/com/aryan/reader/epubreader/EpubReaderScreen.kt b/app/src/main/java/com/aryan/reader/epubreader/EpubReaderScreen.kt index 0215ad1..d7775dc 100644 --- a/app/src/main/java/com/aryan/reader/epubreader/EpubReaderScreen.kt +++ b/app/src/main/java/com/aryan/reader/epubreader/EpubReaderScreen.kt @@ -29,11 +29,13 @@ import android.annotation.SuppressLint import android.app.Activity import android.content.Context import android.content.pm.PackageManager +import com.aryan.reader.SpectrumBox +import com.aryan.reader.BrightnessSlider +import com.aryan.reader.ColorComparePill +import com.aryan.reader.HexInput +import com.aryan.reader.RgbInputColumn import android.graphics.Bitmap import android.media.AudioManager -import androidx.compose.foundation.gestures.awaitEachGesture -import androidx.compose.foundation.gestures.awaitFirstDown -import androidx.compose.foundation.gestures.waitForUpOrCancellation import android.net.Uri import android.os.Build import android.webkit.WebView @@ -51,14 +53,20 @@ import androidx.compose.animation.fadeOut import androidx.compose.animation.slideInVertically import androidx.compose.animation.slideOutVertically import androidx.compose.animation.togetherWith +import androidx.compose.foundation.BorderStroke import androidx.compose.foundation.background import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.focusable +import androidx.compose.foundation.gestures.awaitEachGesture +import androidx.compose.foundation.gestures.awaitFirstDown +import androidx.compose.foundation.gestures.waitForUpOrCancellation import androidx.compose.foundation.isSystemInDarkTheme +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.asPaddingValues @@ -71,26 +79,35 @@ import androidx.compose.foundation.layout.offset import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.statusBars +import androidx.compose.foundation.layout.width import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.layout.windowInsetsEndWidth import androidx.compose.foundation.layout.windowInsetsStartWidth import androidx.compose.foundation.pager.rememberPagerState +import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Add import androidx.compose.material.icons.filled.ArrowDownward import androidx.compose.material.icons.filled.ArrowUpward +import androidx.compose.material.icons.filled.Delete +import androidx.compose.material.icons.filled.Edit import androidx.compose.material.icons.filled.Info import androidx.compose.material3.AlertDialog +import androidx.compose.material3.Button import androidx.compose.material3.CircularProgressIndicator import androidx.compose.material3.DrawerValue import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.ModalBottomSheet import androidx.compose.material3.ModalNavigationDrawer import androidx.compose.material3.Scaffold +import androidx.compose.material3.Slider import androidx.compose.material3.SnackbarHost import androidx.compose.material3.SnackbarHostState +import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.rememberDrawerState @@ -116,19 +133,32 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.BiasAlignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha +import androidx.compose.ui.draw.clip +import androidx.compose.ui.draw.drawBehind import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester +import androidx.compose.ui.graphics.BlendMode import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.ImageBitmap +import androidx.compose.ui.graphics.ImageShader +import androidx.compose.ui.graphics.ShaderBrush +import androidx.compose.ui.graphics.TileMode +import androidx.compose.ui.graphics.luminance +import androidx.compose.ui.graphics.toArgb import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalDensity import androidx.compose.ui.platform.LocalFocusManager +import androidx.compose.ui.platform.LocalResources import androidx.compose.ui.platform.LocalSoftwareKeyboardController import androidx.compose.ui.platform.LocalView import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.imageResource +import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import androidx.core.content.ContextCompat import androidx.core.content.edit import androidx.core.view.WindowCompat @@ -143,6 +173,7 @@ import com.aryan.reader.BuildConfig import com.aryan.reader.CustomTopBanner import com.aryan.reader.DeviceVoiceSettingsSheet import com.aryan.reader.MainViewModel +import com.aryan.reader.R import com.aryan.reader.RenderMode import com.aryan.reader.SearchResult import com.aryan.reader.SummarizationResult @@ -335,6 +366,94 @@ private fun saveExternalSearchPackage(context: Context, packageName: String) { prefs.edit { putString(PREF_EXTERNAL_SEARCH_PKG, packageName) } } +enum class ReaderTexture(val id: String, val resId: Int, val displayName: String) { + PAPER("paper", R.drawable.texture_paper, "Paper"), + CANVAS("canvas", R.drawable.texture_canvas, "Canvas"), + EINK("eink", R.drawable.texture_eink, "E-Ink"), + SLATE("slate", R.drawable.texture_slate, "Slate") +} + +data class ReaderTheme( + val id: String, + val name: String, + val backgroundColor: Color, + val textColor: Color, + val isDark: Boolean, + val textureId: String? = null, + val isCustom: Boolean = false +) + +val BuiltInThemes = listOf( + ReaderTheme("system", "System", Color.Unspecified, Color.Unspecified, false), + ReaderTheme("light", "Light", Color(0xFFFFFFFF), Color(0xFF000000), false), + ReaderTheme("dark", "Dark", Color(0xFF121212), Color(0xFFE0E0E0), true), + ReaderTheme("sepia", "Sepia", Color(0xFFFBF0D9), Color(0xFF5F4B32), false), + ReaderTheme("slate", "Slate", Color(0xFF2E3440), Color(0xFFECEFF4), true), + ReaderTheme("oled", "OLED", Color(0xFF000000), Color(0xFFB0B0B0), true) +) + +private const val PREF_READER_THEME = "reader_theme_id" +private const val PREF_CUSTOM_THEMES = "custom_themes_json" + +private fun saveReaderThemeId(context: Context, themeId: String) { + val prefs = context.getSharedPreferences("reader_prefs", Context.MODE_PRIVATE) + prefs.edit { putString(PREF_READER_THEME, themeId) } +} + +private fun loadReaderThemeId(context: Context): String { + val prefs = context.getSharedPreferences("reader_prefs", Context.MODE_PRIVATE) + return prefs.getString(PREF_READER_THEME, "system") ?: "system" +} + +private fun saveCustomThemes(context: Context, themes: List) { + val prefs = context.getSharedPreferences("reader_prefs", Context.MODE_PRIVATE) + val jsonArray = JSONArray() + themes.filter { it.isCustom }.forEach { theme -> + val obj = JSONObject().apply { + put("id", theme.id) + put("name", theme.name) + put("bgColor", theme.backgroundColor.toArgb()) + put("textColor", theme.textColor.toArgb()) + put("isDark", theme.isDark) + theme.textureId?.let { put("textureId", it) } + } + jsonArray.put(obj) + } + prefs.edit { putString(PREF_CUSTOM_THEMES, jsonArray.toString()) } +} + +private fun loadCustomThemes(context: Context): List { + val prefs = context.getSharedPreferences("reader_prefs", Context.MODE_PRIVATE) + val jsonString = prefs.getString(PREF_CUSTOM_THEMES, "[]") ?: "[]" + val themes = mutableListOf() + try { + val jsonArray = org.json.JSONArray(jsonString) + for (i in 0 until jsonArray.length()) { + val obj = jsonArray.getJSONObject(i) + themes.add( + ReaderTheme( + id = obj.getString("id"), + name = obj.getString("name"), + backgroundColor = Color(obj.getInt("bgColor")), + textColor = Color(obj.getInt("textColor")), + isDark = obj.getBoolean("isDark"), + textureId = if (obj.has("textureId")) obj.getString("textureId") else null, + isCustom = true + ) + ) + } + } catch (e: Exception) { + Timber.e(e, "Failed to parse custom themes") + } + return themes +} + +private fun calculateContrastRatio(color1: Color, color2: Color): Float { + val l1 = max(color1.luminance(), color2.luminance()) + val l2 = min(color1.luminance(), color2.luminance()) + return (l1 + 0.05f) / (l2 + 0.05f) +} + @RequiresApi(Build.VERSION_CODES.VANILLA_ICE_CREAM) @Composable fun EpubReaderScreen( @@ -957,9 +1076,33 @@ fun EpubReaderHost( } var showPermissionRationaleDialog by remember { mutableStateOf(false) } - val isDarkTheme = isSystemInDarkTheme() var showTtsSettingsSheet by remember { mutableStateOf(false) } var showDeviceVoiceSettingsSheet by remember { mutableStateOf(false) } + var showThemePanel by remember { mutableStateOf(false) } + + var currentThemeId by remember { mutableStateOf(loadReaderThemeId(context)) } + var customThemes by remember { mutableStateOf(loadCustomThemes(context)) } + + val activeTheme = remember(currentThemeId, customThemes) { + BuiltInThemes.find { it.id == currentThemeId } + ?: customThemes.find { it.id == currentThemeId } + ?: BuiltInThemes[0] + } + + val systemIsDark = isSystemInDarkTheme() + val isDarkTheme = if (activeTheme.id == "system") systemIsDark else activeTheme.isDark + + val effectiveBg = remember(activeTheme, systemIsDark) { + if (activeTheme.id == "system") { + if (systemIsDark) Color(0xFF121212) else Color(0xFFFFFFFF) + } else activeTheme.backgroundColor + } + val effectiveText = remember(activeTheme, systemIsDark) { + if (activeTheme.id == "system") { + if (systemIsDark) Color(0xFFE0E0E0) else Color(0xFF000000) + } else activeTheme.textColor + } + val activeTextureId = activeTheme.textureId val currentChapterInPaginatedMode by remember { derivedStateOf { @@ -1892,6 +2035,7 @@ fun EpubReaderHost( Box( modifier = Modifier .fillMaxSize() + .background(effectiveBg) .padding(scaffoldPaddingValues) .focusRequester(containerFocusRequester) .focusable() @@ -2080,6 +2224,8 @@ fun EpubReaderHost( key = chapterKeyForWebView, chapterTitle = chapterToRender.title, isDarkTheme = isDarkTheme, + effectiveBg = effectiveBg, + effectiveText = effectiveText, initialScrollTarget = initialScrollTargetForChapter, initialPageScrollY = currentScrollYPosition, initialCfi = cfiToLoad, @@ -2276,6 +2422,7 @@ fun EpubReaderHost( currentFontFamily = currentFontFamily, customFontPath = currentCustomFontPath, currentTextAlign = currentTextAlign, + activeTextureId = activeTextureId, onHighlightClicked = { lastHighlightClickTime = System.currentTimeMillis() showBars = false @@ -2622,6 +2769,8 @@ fun EpubReaderHost( PaginatedReaderScreen( book = epubBook, isDarkTheme = isDarkTheme, + effectiveBg = effectiveBg, + effectiveText = effectiveText, pagerState = paginatedPagerState, searchQuery = searchState.searchQuery, fontSizeMultiplier = currentFontSizeEm, @@ -2636,6 +2785,7 @@ fun EpubReaderHost( cfi = ttsState.sourceCfi ?: "", offset = ttsState.startOffsetInSource ).takeIf { ttsState.currentText != null && ttsState.sourceCfi != null && ttsState.startOffsetInSource != -1 }, + activeTextureId = activeTextureId, initialChapterIndexInBook = lastKnownLocator?.chapterIndex, modifier = Modifier.alpha(if (isPagerInitialized) 1f else 0f), onPaginatorReady = { newPaginator -> @@ -3305,6 +3455,7 @@ fun EpubReaderHost( onOpenTtsSettings = { showTtsSettingsSheet = true }, onOpenDictionarySettings = { showDictionarySettingsSheet = true }, onOpenDeviceVoiceSettings = { showDeviceVoiceSettingsSheet = true }, + onOpenThemeSettings = { showThemePanel = true }, onToggleReflow = if (onToggleReflow != null) { { val activeChapter = if (currentRenderMode == RenderMode.PAGINATED) { @@ -3876,5 +4027,516 @@ fun EpubReaderHost( Spacer(Modifier.height(16.dp)) } } + + if (showThemePanel) { + ReaderThemePanel( + isVisible = true, + currentThemeId = currentThemeId, + onThemeSelected = { + currentThemeId = it + saveReaderThemeId(context, it) + showThemePanel = false + }, + onDismiss = { showThemePanel = false }, + customThemes = customThemes, + onCustomThemesUpdated = { customThemes = it; saveCustomThemes(context, it) } + ) + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ReaderThemePanel( + isVisible: Boolean, + currentThemeId: String, + customThemes: List, + onThemeSelected: (String) -> Unit, + onCustomThemesUpdated: (List) -> Unit, + onDismiss: () -> Unit +) { + if (!isVisible) return + var showBuilder by remember { mutableStateOf(false) } + var editingTheme by remember { mutableStateOf(null) } + + val sheetState = rememberModalBottomSheetState(skipPartiallyExpanded = true) + + ModalBottomSheet( + onDismissRequest = onDismiss, + sheetState = sheetState, + containerColor = MaterialTheme.colorScheme.surface, + contentWindowInsets = { WindowInsets.navigationBars } + ) { + AnimatedContent(targetState = showBuilder, label = "ThemePanelTransition") { isBuilding -> + if (isBuilding) { + ThemeBuilderView( + initialTheme = editingTheme, + onSave = { newTheme -> + val updatedList = if (editingTheme != null) { + customThemes.map { if (it.id == newTheme.id) newTheme else it } + } else { + customThemes + newTheme + } + onCustomThemesUpdated(updatedList) + onThemeSelected(newTheme.id) + showBuilder = false + editingTheme = null + }, + onCancel = { + showBuilder = false + editingTheme = null + } + ) + } else { + Column( + modifier = Modifier + .fillMaxWidth() + .fillMaxHeight(0.65f) + .padding(16.dp) + .padding(bottom = 16.dp) + ) { + Text( + "Reading Themes", + style = MaterialTheme.typography.titleLarge, + fontWeight = FontWeight.Bold, + modifier = Modifier.padding(bottom = 16.dp) + ) + + Text("Presets", style = MaterialTheme.typography.labelLarge, color = MaterialTheme.colorScheme.primary) + Spacer(Modifier.height(8.dp)) + ThemeGrid(themes = BuiltInThemes, currentThemeId = currentThemeId, onThemeSelected = onThemeSelected) + + Spacer(Modifier.height(24.dp)) + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.CenterVertically + ) { + Text("My Themes", style = MaterialTheme.typography.labelLarge, color = MaterialTheme.colorScheme.primary) + IconButton(onClick = { editingTheme = null; showBuilder = true }, modifier = Modifier.size(24.dp)) { + Icon(Icons.Default.Add, contentDescription = "Create Theme", tint = MaterialTheme.colorScheme.primary) + } + } + Spacer(Modifier.height(8.dp)) + + if (customThemes.isEmpty()) { + Text("No custom themes yet. Tap '+' to create one.", style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant) + } else { + ThemeGrid( + themes = customThemes, + currentThemeId = currentThemeId, + onThemeSelected = onThemeSelected, + onEdit = { editingTheme = it; showBuilder = true }, + onDelete = { themeToDelete -> + val updated = customThemes.filter { it.id != themeToDelete.id } + onCustomThemesUpdated(updated) + if (currentThemeId == themeToDelete.id) onThemeSelected("system") + } + ) + } + } + } + } + } +} + +@Composable +fun ThemeGrid( + themes: List, + currentThemeId: String, + onThemeSelected: (String) -> Unit, + onEdit: ((ReaderTheme) -> Unit)? = null, + onDelete: ((ReaderTheme) -> Unit)? = null +) { + androidx.compose.foundation.lazy.grid.LazyVerticalGrid( + columns = androidx.compose.foundation.lazy.grid.GridCells.Adaptive(minSize = 80.dp), + horizontalArrangement = Arrangement.spacedBy(8.dp), + verticalArrangement = Arrangement.spacedBy(16.dp) + ) { + items(themes.size) { index -> + val theme = themes[index] + val isSelected = currentThemeId == theme.id + val bgColor = if (theme.id == "system") MaterialTheme.colorScheme.surfaceVariant else theme.backgroundColor + val textColor = if (theme.id == "system") MaterialTheme.colorScheme.onSurfaceVariant else theme.textColor + val borderColor = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outlineVariant + + Column( + horizontalAlignment = Alignment.CenterHorizontally, + ) { + Box( + modifier = Modifier + .size(56.dp) + .background(bgColor, CircleShape) + .border(if (isSelected) 3.dp else 1.dp, borderColor, CircleShape) + .clickable { onThemeSelected(theme.id) }, + contentAlignment = Alignment.Center + ) { + Text(text = "Aa", color = textColor, style = MaterialTheme.typography.bodyMedium, fontWeight = FontWeight.Bold) + } + Spacer(modifier = Modifier.height(8.dp)) + Text(text = theme.name, style = MaterialTheme.typography.labelSmall, color = if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.onSurface, maxLines = 1, overflow = TextOverflow.Ellipsis) + + if (theme.isCustom && onEdit != null && onDelete != null) { + Spacer(modifier = Modifier.height(6.dp)) + Surface( + shape = RoundedCornerShape(16.dp), + color = MaterialTheme.colorScheme.surfaceVariant, + ) { + Row( + modifier = Modifier.padding(horizontal = 6.dp, vertical = 4.dp), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + Icon(Icons.Default.Edit, "Edit", Modifier.size(28.dp).clip(CircleShape).clickable { onEdit(theme) }.padding(6.dp), tint = MaterialTheme.colorScheme.primary) + Spacer(Modifier.width(4.dp)) + Icon(Icons.Default.Delete, "Delete", Modifier.size(28.dp).clip(CircleShape).clickable { onDelete(theme) }.padding(6.dp), tint = MaterialTheme.colorScheme.error) + } + } + } + } + } + } +} + +@Composable +fun ThemeBuilderView( + initialTheme: ReaderTheme?, + onSave: (ReaderTheme) -> Unit, + onCancel: () -> Unit +) { + var name by remember { mutableStateOf(initialTheme?.name ?: "Custom Theme") } + var bgColor by remember { mutableStateOf(initialTheme?.backgroundColor ?: Color(0xFFF5F5F5)) } + var txtColor by remember { mutableStateOf(initialTheme?.textColor ?: Color(0xFF111111)) } + var textureId by remember { mutableStateOf(initialTheme?.textureId) } + + var editingColorType by remember { mutableStateOf(null) } + + val contrast = calculateContrastRatio(bgColor, txtColor) + val isDark = bgColor.luminance() < 0.5f + + Column(modifier = Modifier.fillMaxWidth().fillMaxHeight(0.65f).padding(16.dp)) { + Row(Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically) { + TextButton(onClick = onCancel) { Text("Cancel") } + Text(if (initialTheme == null) "New Theme" else "Edit Theme", fontWeight = FontWeight.Bold, style = MaterialTheme.typography.titleMedium) + TextButton(onClick = { + onSave(ReaderTheme(id = initialTheme?.id ?: System.currentTimeMillis().toString(), name = name, backgroundColor = bgColor, textColor = txtColor, isDark = isDark, textureId = textureId, isCustom = true)) + }) { Text("Save") } + } + + androidx.compose.material3.OutlinedTextField( + value = name, + onValueChange = { name = it }, + label = { Text("Theme Name") }, + modifier = Modifier.fillMaxWidth().padding(vertical = 8.dp), + singleLine = true + ) + + // Live Preview Card + Surface( + modifier = Modifier.fillMaxWidth().height(120.dp).padding(vertical = 8.dp), + shape = RoundedCornerShape(12.dp), + color = bgColor, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant) + ) { + // Draw Texture if selected (kept logic for future) + val context = LocalContext.current + Box(modifier = Modifier.fillMaxSize().run { + val texRes = ReaderTexture.entries.find { it.id == textureId }?.resId + if (texRes != null) { + val bmp = ImageBitmap.imageResource(context.resources, texRes) + this.drawBehind { + drawRect(ShaderBrush(ImageShader(bmp, TileMode.Repeated, TileMode.Repeated)), blendMode = BlendMode.Multiply, alpha = 0.5f) + } + } else this + }) { + Column(Modifier.padding(16.dp).fillMaxWidth()) { + Text( + text = "So many books, so little time.", + color = txtColor, + style = MaterialTheme.typography.titleMedium + ) + Spacer(Modifier.height(8.dp)) + Text( + text = "- Frank Zappa", + color = txtColor, + style = MaterialTheme.typography.bodyMedium, + modifier = Modifier.fillMaxWidth(), + textAlign = TextAlign.End + ) + } + } + } + + // Animated Contrast Warning + AnimatedVisibility(visible = contrast < 4.5f) { + Text( + "⚠️ Low contrast! This might cause eye strain.", + color = MaterialTheme.colorScheme.error, + style = MaterialTheme.typography.labelSmall, + modifier = Modifier.padding(bottom = 8.dp) + ) + } + + Spacer(Modifier.height(16.dp)) + + // Sleek Color Swatches + Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(16.dp)) { + ColorSwatchItem( + label = "Page Color", + color = bgColor, + onClick = { editingColorType = "bg" }, + modifier = Modifier.weight(1f) + ) + ColorSwatchItem( + label = "Text Color", + color = txtColor, + onClick = { editingColorType = "text" }, + modifier = Modifier.weight(1f) + ) + } + + // Texture UI hidden for now + /* + Spacer(Modifier.height(16.dp)) + Text("Texture", style = MaterialTheme.typography.labelMedium) + Row(Modifier.fillMaxWidth().padding(top = 8.dp), horizontalArrangement = Arrangement.spacedBy(12.dp)) { + TextureOption("None", null, textureId == null) { textureId = null } + ReaderTexture.entries.forEach { tex -> + TextureOption(tex.displayName, tex.resId, textureId == tex.id) { textureId = tex.id } + } + } + */ + Spacer(Modifier.height(16.dp)) + } + + editingColorType?.let { type -> + ThemeColorPickerDialog( + initialColor = if (type == "bg") bgColor else txtColor, + title = if (type == "bg") "Page Color" else "Text Color", + bgColor = bgColor, + textColor = txtColor, + editingColorType = type, + onDismiss = { editingColorType = null }, + onColorChanged = { newColor -> + if (type == "bg") bgColor = newColor else txtColor = newColor + } + ) + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ColorSwatchItem(label: String, color: Color, onClick: () -> Unit, modifier: Modifier = Modifier) { + Column(modifier = modifier) { + Text(label, style = MaterialTheme.typography.labelMedium, modifier = Modifier.padding(bottom = 8.dp)) + Surface( + onClick = onClick, + shape = RoundedCornerShape(12.dp), + color = color, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant), + modifier = Modifier.fillMaxWidth().height(56.dp) + ) {} + } +} + +@Composable +fun ThemeColorPickerDialog( + initialColor: Color, + title: String, + bgColor: Color, + textColor: Color, + editingColorType: String, + onDismiss: () -> Unit, + onColorChanged: (Color) -> Unit +) { + val initialHsv = remember(initialColor) { + val hsv = FloatArray(3) + android.graphics.Color.colorToHSV(initialColor.toArgb(), hsv) + hsv + } + + var hue by remember { mutableFloatStateOf(initialHsv[0]) } + var saturation by remember { mutableFloatStateOf(initialHsv[1]) } + var value by remember { mutableFloatStateOf(initialHsv[2]) } + + val currentColor by remember { + derivedStateOf { + val hsv = floatArrayOf(hue, saturation, value) + val argb = android.graphics.Color.HSVToColor(255, hsv) + Color(argb) + } + } + + LaunchedEffect(currentColor) { + onColorChanged(currentColor) + } + + fun updateFromColor(color: Color) { + val hsv = FloatArray(3) + android.graphics.Color.colorToHSV(color.toArgb(), hsv) + hue = hsv[0] + saturation = hsv[1] + value = hsv[2] + } + + androidx.compose.ui.window.Dialog( + onDismissRequest = onDismiss, + properties = androidx.compose.ui.window.DialogProperties(usePlatformDefaultWidth = false) + ) { + Surface( + shape = RoundedCornerShape(24.dp), + color = Color(0xFF2C2C2C), + modifier = Modifier + .fillMaxWidth(0.85f) + .padding(8.dp) + ) { + Column( + modifier = Modifier.padding(20.dp), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Box( + modifier = Modifier + .background(Color(0xFF3E3E3E), RoundedCornerShape(16.dp)) + .padding(horizontal = 24.dp, vertical = 8.dp) + ) { + Text( + text = title, + style = MaterialTheme.typography.titleMedium, + fontWeight = FontWeight.SemiBold, + color = Color.White + ) + } + + Spacer(Modifier.height(16.dp)) + + val liveBgColor = if (editingColorType == "bg") currentColor else bgColor + val liveTextColor = if (editingColorType == "text") currentColor else textColor + + Surface( + modifier = Modifier.fillMaxWidth().height(64.dp), + shape = RoundedCornerShape(12.dp), + color = liveBgColor, + border = BorderStroke(1.dp, MaterialTheme.colorScheme.outlineVariant) + ) { + Column(Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally) { + Text( + text = "Live Preview", + color = liveTextColor, + style = MaterialTheme.typography.bodyMedium, + fontWeight = FontWeight.Bold + ) + Text( + text = "Reading is dreaming.", + color = liveTextColor, + style = MaterialTheme.typography.bodySmall + ) + } + } + + Spacer(Modifier.height(20.dp)) + + SpectrumBox( + hue = hue, + saturation = saturation, + currentColor = currentColor, + onHueSatChanged = { h, s -> hue = h; saturation = s }, + modifier = Modifier.fillMaxWidth().height(220.dp) + ) + + Spacer(Modifier.height(20.dp)) + + BrightnessSlider( + hue = hue, + saturation = saturation, + value = value, + onValueChanged = { value = it }, + modifier = Modifier.fillMaxWidth().height(24.dp).clip(RoundedCornerShape(12.dp)) + ) + + Spacer(Modifier.height(24.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.Bottom, + horizontalArrangement = Arrangement.spacedBy(12.dp) + ) { + ColorComparePill( + oldColor = initialColor, + newColor = currentColor, + modifier = Modifier.width(64.dp).height(36.dp) + ) + + Column( + modifier = Modifier.weight(1.6f), + horizontalAlignment = Alignment.CenterHorizontally + ) { + Text("Hex", color = Color.Gray, fontSize = 12.sp, maxLines = 1) + Spacer(Modifier.height(4.dp)) + HexInput(color = currentColor, onHexChanged = { updateFromColor(it) }) + } + + Row( + modifier = Modifier.weight(2.4f), + horizontalArrangement = Arrangement.spacedBy(6.dp) + ) { + RgbInputColumn( + label = "R", value = currentColor.red, + onValueChange = { r -> updateFromColor(currentColor.copy(red = r)) }, + modifier = Modifier.weight(1f) + ) + RgbInputColumn( + label = "G", value = currentColor.green, + onValueChange = { g -> updateFromColor(currentColor.copy(green = g)) }, + modifier = Modifier.weight(1f) + ) + RgbInputColumn( + label = "B", value = currentColor.blue, + onValueChange = { b -> updateFromColor(currentColor.copy(blue = b)) }, + modifier = Modifier.weight(1f) + ) + } + } + + Spacer(Modifier.height(24.dp)) + + Row( + modifier = Modifier.fillMaxWidth(), + horizontalArrangement = Arrangement.End, + verticalAlignment = Alignment.CenterVertically + ) { + Button( + onClick = onDismiss, + colors = androidx.compose.material3.ButtonDefaults.buttonColors( + containerColor = Color.White, + contentColor = Color.Black + ) + ) { + Text("Done") + } + } + } + } + } +} + +@Composable +fun TextureOption(name: String, resId: Int?, isSelected: Boolean, onClick: () -> Unit) { + Column(horizontalAlignment = Alignment.CenterHorizontally, modifier = Modifier.clickable(onClick = onClick)) { + Box(modifier = Modifier.size(48.dp).clip(CircleShape).border(if (isSelected) 3.dp else 1.dp, if (isSelected) MaterialTheme.colorScheme.primary else MaterialTheme.colorScheme.outlineVariant, CircleShape).run { + if (resId != null) { + val bmp = ImageBitmap.imageResource(LocalResources.current, resId) + this.drawBehind { drawRect(ShaderBrush(ImageShader(bmp, TileMode.Repeated, TileMode.Repeated))) } + } else this.background(MaterialTheme.colorScheme.surfaceVariant) + }) + Text(name, style = MaterialTheme.typography.labelSmall, modifier = Modifier.padding(top = 4.dp)) + } +} + +@Composable +fun ColorSlider(color: Color, onColorChanged: (Color) -> Unit) { + Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(8.dp)) { + Slider(value = color.red, onValueChange = { onColorChanged(color.copy(red = it)) }, colors = androidx.compose.material3.SliderDefaults.colors(thumbColor = Color.Red, activeTrackColor = Color.Red), modifier = Modifier.weight(1f)) + Slider(value = color.green, onValueChange = { onColorChanged(color.copy(green = it)) }, colors = androidx.compose.material3.SliderDefaults.colors(thumbColor = Color.Green, activeTrackColor = Color.Green), modifier = Modifier.weight(1f)) + Slider(value = color.blue, onValueChange = { onColorChanged(color.copy(blue = it)) }, colors = androidx.compose.material3.SliderDefaults.colors(thumbColor = Color.Blue, activeTrackColor = Color.Blue), modifier = Modifier.weight(1f)) } } \ No newline at end of file diff --git a/app/src/main/java/com/aryan/reader/paginatedreader/BookPaginator.kt b/app/src/main/java/com/aryan/reader/paginatedreader/BookPaginator.kt index 62a3d87..0bc0bfe 100644 --- a/app/src/main/java/com/aryan/reader/paginatedreader/BookPaginator.kt +++ b/app/src/main/java/com/aryan/reader/paginatedreader/BookPaginator.kt @@ -107,6 +107,8 @@ class BookPaginator( private val density: Density, private val fontFamilyMap: Map, private val isDarkTheme: Boolean, + private val themeBackgroundColor: Color, + private val themeTextColor: Color, private val bookId: String, private val initialChapterToPaginate: Int, private val bookCss: Map, @@ -127,7 +129,7 @@ class BookPaginator( override var generation by mutableIntStateOf(0) private set - override val pageShiftRequest = MutableSharedFlow(extraBufferCapacity = 1, onBufferOverflow = BufferOverflow.DROP_OLDEST) + override val pageShiftRequest = MutableSharedFlow(extraBufferCapacity = 100, onBufferOverflow = BufferOverflow.DROP_OLDEST) private val currentUserChapterIndex = MutableStateFlow(initialChapterToPaginate) internal val chapterPageCounts = ConcurrentHashMap() @@ -404,6 +406,8 @@ class BookPaginator( fontFamilyMap = fontFamilyMap, density = density, isDarkTheme = isDarkTheme, + themeBackgroundColor = themeBackgroundColor, + themeTextColor = themeTextColor, chapterAbsPath = chapter.absPath, extractionBasePath = extractionBasePath, userTextAlign = userTextAlign @@ -475,10 +479,10 @@ class BookPaginator( val processedHtml = document.outerHtml() var parsingCssRules = OptimizedCssRules() - val uaResult = CssParser.parse(cssContent = userAgentStylesheet, cssPath = null, baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = constraints, isDarkTheme = false) + val uaResult = CssParser.parse(cssContent = userAgentStylesheet, cssPath = null, baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = constraints, isDarkTheme = false, themeBackgroundColor = themeBackgroundColor, themeTextColor = themeTextColor) parsingCssRules = parsingCssRules.merge(uaResult.rules) bookCss.forEach { (path, content) -> - val bookCssResult = CssParser.parse(cssContent = content, cssPath = path, baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = constraints, isDarkTheme = false) + val bookCssResult = CssParser.parse(cssContent = content, cssPath = path, baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = constraints, isDarkTheme = false, themeBackgroundColor = themeBackgroundColor, themeTextColor = themeTextColor) parsingCssRules = parsingCssRules.merge(bookCssResult.rules) } @@ -950,8 +954,8 @@ class BookPaginator( return@launch } - val chapterStartPage = calculateAccurateStartIndex(targetChapterIndex) val chapterPages = pageCache[targetChapterIndex] ?: paginateChapter(targetChapterIndex) + val chapterStartPage = calculateAccurateStartIndex(targetChapterIndex) if (chapterPages == null) { Timber.e("Href Navigation failed: Could not paginate target chapter $targetChapterIndex.") @@ -983,8 +987,8 @@ class BookPaginator( val targetChapterIndex = result.locationInSource Timber.i("Finding page for search result: '${result.query}' in chapter $targetChapterIndex") - val chapterStartPage = calculateAccurateStartIndex(targetChapterIndex) val chapterPages = pageCache[targetChapterIndex] ?: paginateChapter(targetChapterIndex) + val chapterStartPage = calculateAccurateStartIndex(targetChapterIndex) if (chapterPages == null) { Timber.e("Search result navigation failed: Could not paginate target chapter $targetChapterIndex.") @@ -1055,8 +1059,8 @@ class BookPaginator( val targetChapterIndex = locator.chapterIndex Timber.i("Finding page for locator: Chapter $targetChapterIndex, Block ${locator.blockIndex}, Offset ${locator.charOffset}") - val chapterStartPage = chapterStartPageIndices[targetChapterIndex] ?: 0 val chapterPages = pageCache[targetChapterIndex] ?: paginateChapter(targetChapterIndex) + val chapterStartPage = chapterStartPageIndices[targetChapterIndex] ?: 0 if (chapterPages.isNullOrEmpty()) { Timber.e("Locator navigation failed: Could not paginate target chapter $targetChapterIndex.") @@ -1068,6 +1072,8 @@ class BookPaginator( for ((pageIndex, page) in chapterPages.withIndex()) { for (block in page.content) { if (block.blockIndex == locator.blockIndex) { + Timber.tag("ThemeReconfig").d("Block Index Match: Found block ${locator.blockIndex} on page $pageIndex of Chapter $targetChapterIndex") + if (fallbackPageInChapter == -1) { fallbackPageInChapter = pageIndex } @@ -1077,19 +1083,20 @@ class BookPaginator( val startOffsetOnPage = textBlock.startCharOffsetInSource val endOffsetOnPage = startOffsetOnPage + textBlock.content.length - if (locator.charOffset in startOffsetOnPage.., private val density: Density, private val isDarkTheme: Boolean, + private val themeBackgroundColor: Color, + private val themeTextColor: Color, private val chapterAbsPath: String, private val extractionBasePath: String, private val userTextAlign: TextAlign? @@ -59,7 +61,6 @@ class ContentStyler( return groupFloatingBlocks(semanticBlocks.mapNotNull { styleBlock(it) }) } - // ADD this function to group floating blocks, similar to the original parser private fun groupFloatingBlocks(blocks: List): List { if (blocks.isEmpty()) return emptyList() @@ -71,7 +72,6 @@ class ContentStyler( val floatDirection = (currentBlock as? ImageBlock)?.style?.float if (currentBlock is ImageBlock && floatDirection in listOf("left", "right")) { - val floatedImage = currentBlock val paragraphsToWrap = mutableListOf() while (processingQueue.isNotEmpty()) { @@ -86,11 +86,11 @@ class ContentStyler( } } val wrappingBlock = WrappingContentBlock( - floatedImage, + currentBlock, paragraphsToWrap, - elementId = floatedImage.elementId, - cfi = floatedImage.cfi, - blockIndex = floatedImage.blockIndex + elementId = currentBlock.elementId, + cfi = currentBlock.cfi, + blockIndex = currentBlock.blockIndex ) result.add(wrappingBlock) } else { @@ -208,7 +208,7 @@ class ContentStyler( private fun applyThemeToStyle(style: CssStyle): CssStyle { val newSpanStyle = style.spanStyle.let { original -> val newColor = if (original.color.isSpecified) { - CssParser.adaptColorForTheme(original.color, isDarkTheme, isBackground = false) + CssParser.adaptColorForTheme(original.color, isDarkTheme, isBackground = false, themeBackgroundColor, themeTextColor) } else { original.color } @@ -217,14 +217,14 @@ class ContentStyler( val newBlockStyle = style.blockStyle.let { original -> val newBgColor = if (original.backgroundColor.isSpecified) { - CssParser.adaptColorForTheme(original.backgroundColor, isDarkTheme, isBackground = true) + CssParser.adaptColorForTheme(original.backgroundColor, isDarkTheme, isBackground = true, themeBackgroundColor, themeTextColor) } else { original.backgroundColor } fun themeBorder(b: BorderStyle?): BorderStyle? { if (b == null) return null - val newColor = CssParser.adaptColorForTheme(b.color, isDarkTheme, isBackground = false) + val newColor = CssParser.adaptColorForTheme(b.color, isDarkTheme, isBackground = false, themeBackgroundColor, themeTextColor) return b.copy(color = newColor) } @@ -474,7 +474,7 @@ class ContentStyler( } private fun toRoman(number: Int): String { - if (number < 1 || number > 3999) return number.toString() + if (number !in 1..3999) return number.toString() val values = listOf(1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1) val symbols = listOf("M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I") val result = StringBuilder() diff --git a/app/src/main/java/com/aryan/reader/paginatedreader/CssParser.kt b/app/src/main/java/com/aryan/reader/paginatedreader/CssParser.kt index b1e486b..f782ab6 100644 --- a/app/src/main/java/com/aryan/reader/paginatedreader/CssParser.kt +++ b/app/src/main/java/com/aryan/reader/paginatedreader/CssParser.kt @@ -19,9 +19,6 @@ */ package com.aryan.reader.paginatedreader -import android.os.Build -import timber.log.Timber -import androidx.annotation.RequiresApi import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.isSpecified import androidx.compose.ui.graphics.toArgb @@ -38,6 +35,7 @@ import androidx.compose.ui.unit.TextUnit import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.em import androidx.compose.ui.unit.sp +import timber.log.Timber import java.io.File import java.util.regex.Pattern import kotlin.math.roundToInt @@ -67,24 +65,64 @@ object CssParser { "thick" to 5.dp ) - internal fun adaptColorForTheme(color: Color, isDarkTheme: Boolean, isBackground: Boolean): Color { + internal fun adaptColorForTheme( + color: Color, + isDarkTheme: Boolean, + isBackground: Boolean, + themeBackground: Color = Color.Unspecified, + themeText: Color = Color.Unspecified + ): Color { if (!color.isSpecified) return color - if (color.alpha < 0.9f) return color + if (color.alpha < 0.9f && color != Color.Transparent) return color + if (color == Color.Transparent) return color - val luminance = color.luminance() - - return if (isDarkTheme) { - if (isBackground) { - if (luminance > 0.9) Color.Transparent else color + if (!themeBackground.isSpecified || !themeText.isSpecified) { + val luminance = color.luminance() + return if (isDarkTheme) { + if (isBackground) { + if (luminance > 0.9) Color.Transparent else color + } else { + if (luminance < 0.2) Color.White.copy(alpha = 0.87f) else color + } } else { - if (luminance < 0.2) Color.White.copy(alpha = 0.87f) else color + if (isBackground) { + if (luminance < 0.1) Color.Transparent else color + } else { + if (luminance > 0.8) Color.Black.copy(alpha = 0.87f) else color + } + } + } + + val bgLuminance = themeBackground.luminance() + val colorLuminance = color.luminance() + + val l1 = maxOf(bgLuminance, colorLuminance) + val l2 = minOf(bgLuminance, colorLuminance) + val contrast = (l1 + 0.05f) / (l2 + 0.05f) + + if (isBackground) { + return if (isDarkTheme && colorLuminance > 0.5f) { + Color.Transparent + } else if (!isDarkTheme && colorLuminance < 0.2f) { + Color.Transparent + } else { + color } } else { - if (isBackground) { - if (luminance < 0.1) Color.Transparent else color - } else { - if (luminance > 0.8) Color.Black.copy(alpha = 0.87f) else color + if (contrast >= 4.5f) { + return color } + + val hsl = FloatArray(3) + androidx.core.graphics.ColorUtils.colorToHSL(color.toArgb(), hsl) + + if (bgLuminance < 0.5f) { + hsl[2] = hsl[2].coerceAtLeast(0.7f) + } else { + hsl[2] = hsl[2].coerceAtMost(0.3f) + } + + return Color(androidx.core.graphics.ColorUtils.HSLToColor(hsl)) } } @@ -138,7 +176,9 @@ object CssParser { baseFontSizeSp: Float, density: Float, constraints: Constraints, - isDarkTheme: Boolean + isDarkTheme: Boolean, + themeBackgroundColor: Color = Color.Unspecified, + themeTextColor: Color = Color.Unspecified ): OptimizedCssParseResult { val byTag = mutableMapOf>() val byClass = mutableMapOf>() @@ -192,11 +232,11 @@ object CssParser { val specificity = calculateSpecificity(originalSelector) val normalStyle = parseProperties( propertiesGroup, baseFontSizeSp, density, constraints, onlyImportant = false, - isDarkTheme + isDarkTheme, themeBackgroundColor, themeTextColor ) val importantStyle = parseProperties( propertiesGroup, baseFontSizeSp, density, constraints, onlyImportant = true, - isDarkTheme + isDarkTheme, themeBackgroundColor, themeTextColor ) fun addRule(style: CssStyle, spec: Int) { @@ -335,7 +375,9 @@ object CssParser { density: Float, constraints: Constraints, onlyImportant: Boolean, - isDarkTheme: Boolean + isDarkTheme: Boolean, + themeBackgroundColor: Color = Color.Unspecified, + themeTextColor: Color = Color.Unspecified ): CssStyle { var spanStyle = SpanStyle() var paragraphStyle = ParagraphStyle() @@ -427,7 +469,7 @@ object CssParser { styleStr: String? ) { val parsedWidth = widthStr?.let { parseCssSizeToDp(it, baseFontSizeSp, density, containerWidthPx) } ?: 0.dp - val parsedColor = colorStr?.let { parseColor(it) }?.let { this@CssParser.adaptColorForTheme(it, isDarkTheme, isBackground = false) } + val parsedColor = colorStr?.let { parseColor(it) }?.let { this@CssParser.adaptColorForTheme(it, isDarkTheme, isBackground = false, themeBackgroundColor, themeTextColor) } val isExplicitWidth = widthStr != null @@ -482,7 +524,7 @@ object CssParser { } "color" -> { parseColor(value)?.let { - spanStyle = spanStyle.copy(color = this@CssParser.adaptColorForTheme(it, isDarkTheme, isBackground = false)) + spanStyle = spanStyle.copy(color = this@CssParser.adaptColorForTheme(it, isDarkTheme, isBackground = false, themeBackgroundColor, themeTextColor)) } } "text-align" -> { @@ -587,7 +629,7 @@ object CssParser { "background-color" -> { val originalColor = parseColor(value) ?: Color.Unspecified - backgroundColor = this@CssParser.adaptColorForTheme(originalColor, isDarkTheme, isBackground = true) + backgroundColor = this@CssParser.adaptColorForTheme(originalColor, isDarkTheme, isBackground = true, themeBackgroundColor, themeTextColor) } // Border Properties @@ -727,7 +769,7 @@ object CssParser { textEmphasisStyleString = value } "text-emphasis-color", "-epub-text-emphasis-color" -> { - textEmphasisColor = parseColor(value)?.let { this@CssParser.adaptColorForTheme(it, isDarkTheme, isBackground = false) } + textEmphasisColor = parseColor(value)?.let { this@CssParser.adaptColorForTheme(it, isDarkTheme, isBackground = false, themeBackgroundColor, themeTextColor) } } "text-emphasis-position", "-epub-text-emphasis-position" -> { if (value in listOf("over", "under")) { @@ -785,7 +827,7 @@ object CssParser { val finalStyle = style ?: "none" val finalColor = color ?: spanStyle.color.takeIf { it.isSpecified } ?: Color.Black - val adaptedColor = this@CssParser.adaptColorForTheme(finalColor, isDarkTheme, isBackground = false) + val adaptedColor = this@CssParser.adaptColorForTheme(finalColor, isDarkTheme, isBackground = false, themeBackgroundColor, themeTextColor) if (finalWidth > 0.dp && finalStyle != "none" && finalStyle != "hidden") { return BorderStyle(finalWidth, adaptedColor, finalStyle) diff --git a/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReader.kt b/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReader.kt index 05ccf4e..2de4398 100644 --- a/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReader.kt +++ b/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReader.kt @@ -121,6 +121,7 @@ import androidx.compose.ui.platform.LocalTextToolbar import androidx.compose.ui.platform.LocalViewConfiguration import androidx.compose.ui.platform.TextToolbar import androidx.compose.ui.platform.TextToolbarStatus +import androidx.compose.ui.res.imageResource import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.PlatformTextStyle @@ -490,6 +491,8 @@ private fun WrappingContentLayout( fun PaginatedReaderScreen( book: EpubBook, isDarkTheme: Boolean, + effectiveBg: Color, + effectiveText: Color, pagerState: PagerState, isPageTurnAnimationEnabled: Boolean, searchQuery: String, @@ -513,7 +516,8 @@ fun PaginatedReaderScreen( onHighlightCreated: (String, String, String) -> Unit, onHighlightDeleted: (String) -> Unit, activeHighlightPalette: List, - onUpdatePalette: (Int, HighlightColor) -> Unit + onUpdatePalette: (Int, HighlightColor) -> Unit, + activeTextureId: String? = null ) { LaunchedEffect(userHighlights) { Timber.d("PaginatedReaderScreen: Received ${userHighlights.size} highlights.") @@ -522,10 +526,26 @@ fun PaginatedReaderScreen( } } - BoxWithConstraints(modifier = modifier.fillMaxSize()) { + val context = LocalContext.current + val textureBitmap = remember(activeTextureId) { + activeTextureId?.let { id -> + com.aryan.reader.epubreader.ReaderTexture.entries.find { it.id == id }?.resId?.let { resId -> + androidx.compose.ui.graphics.ImageBitmap.imageResource(context.resources, resId) + } + } + } + + val textureModifier = if (textureBitmap != null) { + Modifier.drawBehind { + val brush = androidx.compose.ui.graphics.ShaderBrush( + androidx.compose.ui.graphics.ImageShader(textureBitmap, androidx.compose.ui.graphics.TileMode.Repeated, androidx.compose.ui.graphics.TileMode.Repeated) + ) + drawRect(brush = brush, blendMode = BlendMode.Multiply, alpha = 0.6f) + } + } else Modifier + + BoxWithConstraints(modifier = modifier.fillMaxSize().background(effectiveBg).then(textureModifier)) { val textMeasurer = rememberTextMeasurer() - val textColor = if (isDarkTheme) MaterialTheme.colorScheme.onBackground - else MaterialTheme.colorScheme.onSurface val baseTextStyle = MaterialTheme.typography.bodyLarge var debouncedFontSizeMult by remember { mutableFloatStateOf(fontSizeMultiplier) } @@ -536,22 +556,36 @@ fun PaginatedReaderScreen( var anchorLocatorForReconfig by remember { mutableStateOf(null) } val currentPaginatorRef = remember { mutableStateOf(null) } - val previousConstraints = remember { arrayOf(this.constraints) } - if (previousConstraints[0] != this.constraints) { + val previousState = remember { + arrayOf(this.constraints, isDarkTheme, effectiveBg, effectiveText) + } + + if (previousState[0] != this.constraints || + previousState[1] != isDarkTheme || + previousState[2] != effectiveBg || + previousState[3] != effectiveText + ) { val activePaginator = currentPaginatorRef.value if (activePaginator is BookPaginator) { val currentPage = pagerState.currentPage val locator = activePaginator.getLocatorForPage(currentPage) - if (locator != null) { - anchorLocatorForReconfig = locator - } + anchorLocatorForReconfig = locator + + Timber.tag("ThemeReconfig").d(""" + RECONFIG DETECTED + - Reason: ${if (previousState[0] != this.constraints) "Constraints" else "Theme/Colors"} + - Current Page: $currentPage + - Saved Locator: $locator + """.trimIndent()) } - previousConstraints[0] = this.constraints + previousState[0] = this.constraints + previousState[1] = isDarkTheme + previousState[2] = effectiveBg + previousState[3] = effectiveText } val textStyle = remember( - baseTextStyle, - textColor, + baseTextStyle, effectiveText, debouncedFontSizeMult, debouncedLineHeightMult, debouncedFontFamily @@ -560,7 +594,7 @@ fun PaginatedReaderScreen( val adjustedLineHeight = adjustedFontSize * debouncedLineHeightMult baseTextStyle.copy( - color = textColor, + color = effectiveText, fontSize = adjustedFontSize, lineHeight = adjustedLineHeight, fontFamily = debouncedFontFamily, @@ -636,7 +670,7 @@ fun PaginatedReaderScreen( remember(initialChapterIndexInBook, anchorLocatorForReconfig) { anchorLocatorForReconfig?.chapterIndex ?: initialChapterIndexInBook ?: 0 } - val paginator = remember(book, textConstraints, isDarkTheme, textStyle, userTextAlign) { + val paginator = remember(book, textConstraints, isDarkTheme, textStyle, userTextAlign, effectiveBg, effectiveText) { val userAgentStylesheet = UserAgentStylesheet.default var allRules = OptimizedCssRules() val allFontFaces = mutableListOf() @@ -647,7 +681,9 @@ fun PaginatedReaderScreen( baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = textConstraints, - isDarkTheme = isDarkTheme + isDarkTheme = isDarkTheme, + themeBackgroundColor = effectiveBg, + themeTextColor = effectiveText ) allRules = allRules.merge(uaResult.rules) allFontFaces.addAll(uaResult.fontFaces) @@ -659,7 +695,9 @@ fun PaginatedReaderScreen( baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = textConstraints, - isDarkTheme = isDarkTheme + isDarkTheme = isDarkTheme, + themeBackgroundColor = effectiveBg, + themeTextColor = effectiveText ) allRules = allRules.merge(bookCssResult.rules) allFontFaces.addAll(bookCssResult.fontFaces) @@ -687,6 +725,8 @@ fun PaginatedReaderScreen( density = density, fontFamilyMap = fontFamilyMap, isDarkTheme = isDarkTheme, + themeBackgroundColor = effectiveBg, + themeTextColor = effectiveText, bookId = uniqueBookId, bookCacheDao = bookCacheDao, proto = proto, @@ -707,31 +747,28 @@ fun PaginatedReaderScreen( LaunchedEffect(paginator) { if (anchorLocatorForReconfig != null) { - Timber.d("Waiting for paginator to initialize before restoring anchor...") + Timber.tag("ThemeReconfig").d("Restoration Effect Triggered for Locator: $anchorLocatorForReconfig") - // Suspend until isLoading becomes false snapshotFlow { paginator.isLoading }.filter { !it }.first() val targetLocator = anchorLocatorForReconfig if (targetLocator != null) { - Timber.d( - "Paginator initialized. Restoring anchor: Chapter=${targetLocator.chapterIndex}, Block=${targetLocator.blockIndex}, Offset=${targetLocator.charOffset}" - ) - val page = paginator.findPageForLocator(targetLocator) + + Timber.tag("ThemeReconfig").d(""" + Restoration Progress: + - Target Locator: $targetLocator + - Paginator found Page: $page + - Chapter Start Page: ${paginator.chapterStartPageIndices[targetLocator.chapterIndex]} + """.trimIndent()) + if (page != null) { pagerState.scrollToPage(page) - Timber.d("Restored to page: $page") } else { - val startPage = - paginator.chapterStartPageIndices[targetLocator.chapterIndex] + val startPage = paginator.chapterStartPageIndices[targetLocator.chapterIndex] if (startPage != null) { - Timber.w( - "Exact locator not found. Falling back to start of chapter at page $startPage" - ) + Timber.tag("ThemeReconfig").w("Precise page not found, falling back to chapter start: $startPage") pagerState.scrollToPage(startPage) - } else { - Timber.e("Failed to restore position. Chapter start index not found.") } } anchorLocatorForReconfig = null @@ -780,6 +817,7 @@ fun PaginatedReaderScreen( uiState = uiState, pagerState = pagerState, isPageTurnAnimationEnabled = isPageTurnAnimationEnabled, + effectiveBg = effectiveBg, searchQuery = searchQuery, ttsHighlightInfo = ttsHighlightInfo, textStyle = textStyle, @@ -814,7 +852,8 @@ fun PaginatedReaderScreen( onHighlightDeleted = onHighlightDeleted, isDarkTheme = isDarkTheme, activeHighlightPalette = activeHighlightPalette, - onUpdatePalette = onUpdatePalette + onUpdatePalette = onUpdatePalette, + effectiveText = effectiveText ) } } @@ -1366,6 +1405,8 @@ internal fun PaginatedReaderContent( uiState: PaginatedReaderUiState, pagerState: PagerState, isPageTurnAnimationEnabled: Boolean, + effectiveBg: Color, + effectiveText: Color, searchQuery: String, ttsHighlightInfo: TtsHighlightInfo?, textStyle: TextStyle, @@ -1526,7 +1567,7 @@ internal fun PaginatedReaderContent( val pageModifier = if (isPageTurnAnimationEnabled) { Modifier .zIndex(zIndex) - .realisticBookPage(pagerState, pageIndex, isDarkTheme, pageTurnTouchY) // UPDATED + .realisticBookPage(pagerState, pageIndex, effectiveBg, isDarkTheme, pageTurnTouchY) } else { Modifier } @@ -3396,6 +3437,7 @@ private fun RenderFlexChildBlock( private fun Modifier.realisticBookPage( pagerState: PagerState, pageIndex: Int, + paperColor: Color, isDarkTheme: Boolean, touchY: Float? ): Modifier = composed { @@ -3419,7 +3461,6 @@ private fun Modifier.realisticBookPage( } .drawWithContent { val pageOffset = (pageIndex - pagerState.currentPage) - pagerState.currentPageOffsetFraction - val paperColor = if (isDarkTheme) Color(0xFF121212) else Color(0xFFFFFFFF) if (abs(pageOffset) < 0.001f) { drawRect(color = paperColor) @@ -3507,8 +3548,10 @@ private fun Modifier.realisticBookPage( clipRect(0f, 0f, w, h) { clipPath(frontPath) { - val flapColor = if (isDarkTheme) Color(0xFF2A2A2A) else Color(0xFFF0F0F0) - drawPath(reflectedScreenPath, color = flapColor) + drawPath(reflectedScreenPath, color = paperColor) + + val flapTint = if (isDarkTheme) Color.White.copy(alpha = 0.08f) else Color.Black.copy(alpha = 0.06f) + drawPath(reflectedScreenPath, color = flapTint) val innerShadowWidth = shadowWidth * 0.7f val innerShadowBrush = Brush.linearGradient( diff --git a/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModel.kt b/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModel.kt index 0fd4d2c..a507736 100644 --- a/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModel.kt +++ b/app/src/main/java/com/aryan/reader/paginatedreader/PaginatedReaderViewModel.kt @@ -72,6 +72,8 @@ class PaginatedReaderViewModel : ViewModel() { textStyle: TextStyle, density: Density, isDarkTheme: Boolean, + themeBackgroundColor: androidx.compose.ui.graphics.Color, + themeTextColor: androidx.compose.ui.graphics.Color, context: Context, initialChapterToPaginate: Int?, mathMLRenderer: MathMLRenderer @@ -83,7 +85,7 @@ class PaginatedReaderViewModel : ViewModel() { // CSS Parsing and Font Loading val userAgentStylesheet = UserAgentStylesheet.default - var allRules = OptimizedCssRules() // CHANGED from: mutableListOf() + var allRules = OptimizedCssRules() val allFontFaces = mutableListOf() val uaResult = CssParser.parse( @@ -92,9 +94,11 @@ class PaginatedReaderViewModel : ViewModel() { baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = textConstraints, - isDarkTheme = isDarkTheme + isDarkTheme = isDarkTheme, + themeBackgroundColor = themeBackgroundColor, + themeTextColor = themeTextColor ) - allRules = allRules.merge(uaResult.rules) // CHANGED + allRules = allRules.merge(uaResult.rules) allFontFaces.addAll(uaResult.fontFaces) book.css.forEach { (path, content) -> @@ -104,9 +108,11 @@ class PaginatedReaderViewModel : ViewModel() { baseFontSizeSp = textStyle.fontSize.value, density = density.density, constraints = textConstraints, - isDarkTheme = isDarkTheme + isDarkTheme = isDarkTheme, + themeBackgroundColor = themeBackgroundColor, + themeTextColor = themeTextColor ) - allRules = allRules.merge(bookCssResult.rules) // CHANGED + allRules = allRules.merge(bookCssResult.rules) allFontFaces.addAll(bookCssResult.fontFaces) } val fontFamilyMap = loadFontFamilies( @@ -125,6 +131,8 @@ class PaginatedReaderViewModel : ViewModel() { density = density, fontFamilyMap = fontFamilyMap, isDarkTheme = isDarkTheme, + themeBackgroundColor = themeBackgroundColor, + themeTextColor = themeTextColor, bookId = bookId, bookCacheDao = bookCacheDao, proto = proto, diff --git a/app/src/main/java/com/aryan/reader/pdf/ToolSettingsPopup.kt b/app/src/main/java/com/aryan/reader/pdf/ToolSettingsPopup.kt index cde0510..1591b7f 100644 --- a/app/src/main/java/com/aryan/reader/pdf/ToolSettingsPopup.kt +++ b/app/src/main/java/com/aryan/reader/pdf/ToolSettingsPopup.kt @@ -23,10 +23,7 @@ import androidx.compose.animation.core.animateFloatAsState import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.clickable -import androidx.compose.foundation.gestures.awaitEachGesture -import androidx.compose.foundation.gestures.awaitFirstDown import androidx.compose.foundation.gestures.detectTapGestures -import androidx.compose.foundation.gestures.drag import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -40,8 +37,6 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.foundation.text.BasicTextField -import androidx.compose.foundation.text.KeyboardOptions import androidx.compose.material3.Button import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.ExperimentalMaterial3Api @@ -54,7 +49,6 @@ import androidx.compose.material3.SwitchDefaults import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf @@ -71,7 +65,6 @@ import androidx.compose.ui.geometry.CornerRadius import androidx.compose.ui.geometry.Offset import androidx.compose.ui.graphics.Brush import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.SolidColor import androidx.compose.ui.graphics.drawscope.Stroke import androidx.compose.ui.graphics.drawscope.clipPath import androidx.compose.ui.graphics.toArgb @@ -79,15 +72,16 @@ import androidx.compose.ui.input.pointer.pointerInput import androidx.compose.ui.platform.testTag import androidx.compose.ui.semantics.selected import androidx.compose.ui.semantics.semantics -import androidx.compose.ui.text.TextStyle import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.KeyboardType -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import androidx.compose.ui.window.DialogProperties -import androidx.core.graphics.toColorInt +import com.aryan.reader.BrightnessSlider +import com.aryan.reader.ColorComparePill +import com.aryan.reader.HexInput +import com.aryan.reader.RgbInputColumn +import com.aryan.reader.SpectrumBox import kotlin.math.roundToInt @OptIn(ExperimentalMaterial3Api::class) @@ -589,285 +583,6 @@ private fun ColorPickerDialog( } } -@Composable -private fun SpectrumBox( - hue: Float, - saturation: Float, - currentColor: Color, - onHueSatChanged: (Float, Float) -> Unit, - modifier: Modifier = Modifier -) { - val rainbowColors = listOf( - Color.Red, Color.Yellow, Color.Green, Color.Cyan, Color.Blue, Color.Magenta, Color.Red - ) - val touchPadding = 12.dp - - Box( - modifier = modifier.pointerInput(Unit) { - awaitEachGesture { - val down = awaitFirstDown() - - val paddingPx = touchPadding.toPx() - val activeWidth = size.width.toFloat() - (paddingPx * 2) - val activeHeight = size.height.toFloat() - (paddingPx * 2) - - fun update(offset: Offset) { - val relativeX = offset.x - paddingPx - val relativeY = offset.y - paddingPx - - val h = (relativeX / activeWidth).coerceIn(0f, 1f) * 360f - val s = (relativeY / activeHeight).coerceIn(0f, 1f) - onHueSatChanged(h, s) - } - - update(down.position) - drag(down.id) { change -> - change.consume() - update(change.position) - } - } - } - ) { - Canvas( - modifier = Modifier - .fillMaxSize() - .padding(touchPadding) - .clip(RoundedCornerShape(12.dp)) - ) { - drawRect( - brush = Brush.horizontalGradient(rainbowColors) - ) - drawRect( - brush = Brush.verticalGradient( - colors = listOf(Color.White, Color.White.copy(alpha = 0f)) - ) - ) - } - - Canvas(modifier = Modifier.fillMaxSize()) { - val paddingPx = touchPadding.toPx() - val activeWidth = size.width - (paddingPx * 2) - val activeHeight = size.height - (paddingPx * 2) - - val x = paddingPx + (hue / 360f) * activeWidth - val y = paddingPx + saturation * activeHeight - - val pointerRadius = 10.dp.toPx() - val strokeWidth = 2.dp.toPx() - - drawCircle( - color = Color.Black.copy(alpha = 0.25f), - radius = pointerRadius + 1.dp.toPx(), - center = Offset(x, y + 1.dp.toPx()) - ) - - drawCircle( - color = currentColor.copy(alpha = 1f), - radius = pointerRadius, - center = Offset(x, y) - ) - - drawCircle( - color = Color.White, - radius = pointerRadius, - center = Offset(x, y), - style = Stroke(width = strokeWidth) - ) - } - } -} - -@Composable -private fun BrightnessSlider( - hue: Float, - saturation: Float, - value: Float, - onValueChanged: (Float) -> Unit, - modifier: Modifier = Modifier -) { - val baseColor = remember(hue, saturation) { - Color.hsv(hue, saturation, 1f) - } - - Box( - modifier = modifier.pointerInput(Unit) { - awaitEachGesture { - val down = awaitFirstDown() - fun update(offset: Offset) { - val v = (offset.x / size.width.toFloat()).coerceIn(0f, 1f) - onValueChanged(v) - } - update(down.position) - drag(down.id) { change -> - change.consume() - update(change.position) - } - } - } - ) { - Canvas(modifier = Modifier.fillMaxSize()) { - drawRect( - brush = Brush.horizontalGradient( - colors = listOf(Color.Black, baseColor) - ) - ) - - val x = value * size.width - drawCircle( - color = Color.White, - radius = 8.dp.toPx(), - center = Offset(x, size.height / 2) - ) - } - } -} - -@Composable -private fun RgbInputColumn( - label: String, - value: Float, - onValueChange: (Float) -> Unit, - modifier: Modifier = Modifier -) { - val intValue = (value * 255).roundToInt() - Column( - horizontalAlignment = Alignment.CenterHorizontally, - modifier = modifier - ) { - Text( - text = label, - color = Color.Gray, - fontSize = 11.sp, - maxLines = 1 - ) - Spacer(Modifier.height(4.dp)) - RgbInput(value = intValue, onValueChange = onValueChange) - } -} - -@Composable -private fun RgbInput( - value: Int, - onValueChange: (Float) -> Unit -) { - var text by remember(value) { mutableStateOf(value.toString()) } - - LaunchedEffect(value) { - text = value.toString() - } - - BasicTextField( - value = text, - onValueChange = { newText -> - if (newText.length <= 3 && newText.all { it.isDigit() }) { - val intVal = newText.toIntOrNull() - if (intVal != null) { - onValueChange(intVal.coerceIn(0, 255) / 255f) - } - } - }, - textStyle = TextStyle( - color = Color.White, - textAlign = TextAlign.Center, - fontSize = 13.sp - ), - keyboardOptions = KeyboardOptions(keyboardType = KeyboardType.Number), - singleLine = true, - modifier = Modifier - .fillMaxWidth() - .height(36.dp) - .background(Color(0xFF3E3E3E), RoundedCornerShape(8.dp)) - .padding(vertical = 9.dp) - ) -} - -@Composable -private fun HexInput( - color: Color, - onHexChanged: (Color) -> Unit -) { - val hexValue = remember(color) { - String.format("%06X", (0xFFFFFF and color.toArgb())) - } - var text by remember(hexValue) { mutableStateOf(hexValue) } - - LaunchedEffect(color) { - val currentParsed = try { - Color(("#$text").toColorInt()) - } catch (_: Exception) { - null - } - if (currentParsed?.toArgb() != color.toArgb()) { - text = String.format("%06X", (0xFFFFFF and color.toArgb())) - } - } - - Row( - modifier = Modifier - .fillMaxWidth() - .height(36.dp) - .background(Color(0xFF3E3E3E), RoundedCornerShape(8.dp)) - .padding(horizontal = 8.dp), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Center - ) { - Text( - text = "#", - color = Color.Gray, - fontSize = 13.sp, - fontWeight = FontWeight.Bold - ) - BasicTextField( - value = text, - onValueChange = { newText -> - if (newText.length <= 6) { - val uppercased = newText.uppercase() - if (uppercased.all { it.isDigit() || it in 'A'..'F' }) { - text = uppercased - if (uppercased.length == 6) { - try { - val parsedColorInt = "#$uppercased".toColorInt() - val newColor = Color(parsedColorInt) - onHexChanged(newColor) - } catch (_: Exception) { - } - } - } - } - }, - textStyle = TextStyle( - color = Color.White, - textAlign = TextAlign.Start, - fontSize = 13.sp - ), - singleLine = true, - cursorBrush = SolidColor(Color.White), - modifier = Modifier - .padding(start = 2.dp) - .width(50.dp) - ) - } -} - -@Composable -private fun ColorComparePill( - oldColor: Color, - newColor: Color, - modifier: Modifier = Modifier -) { - Canvas(modifier = modifier.clip(RoundedCornerShape(8.dp))) { - drawRect( - color = oldColor.copy(alpha = 1f), - size = androidx.compose.ui.geometry.Size(size.width / 2, size.height) - ) - drawRect( - color = newColor.copy(alpha = 1f), - topLeft = Offset(size.width / 2, 0f), - size = androidx.compose.ui.geometry.Size(size.width / 2, size.height) - ) - } -} - @Composable private fun PenItem( type: PenType, diff --git a/app/src/main/res/drawable-nodpi/palette.xml b/app/src/main/res/drawable-nodpi/palette.xml new file mode 100644 index 0000000..f701027 --- /dev/null +++ b/app/src/main/res/drawable-nodpi/palette.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable-nodpi/texture_canvas.png b/app/src/main/res/drawable-nodpi/texture_canvas.png new file mode 100644 index 0000000000000000000000000000000000000000..edd5c0168d57583eaed34ca492a06a6f61f1879a GIT binary patch literal 80065 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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/texture_eink.webp b/app/src/main/res/drawable-nodpi/texture_eink.webp new file mode 100644 index 0000000000000000000000000000000000000000..050f115dfc6e9f5454bf3194c869097ba1100380 GIT binary patch literal 15394 zcmV+-Jl(@mNk&E*JOBV!MM6+kP&gnCJOBW2!T_BCDv$w?0X|72jz%J)At54?Nw`o6 z329+=me+qOyoVX94-h7R&C+`GX7T>~A3z=*S@ioippKndS;R{=oGS#hSUHp2{K;?Ks);Sd@%cU;Jf08qPZN_Spcs5$Czb{z8QzGVFsK~WlQ^*il zNG^BUkfKyE%|{|W5sgkFW?zB!t-t#NK6Xm$rY?gYD+W^YAjT{Yb~xleVm7K*E3@@& zs!ZHkHxA~D|6Hmr?*(rape6;f@B4epMoINe?#3H2Ti|Y*Npj1k91a2}vDiJbDqxPb zSUZX;oLM&I0e=!H7jBOmbGFY^h^5@5g^ji1^tRlF+CsS!;Dq=Po1`6drS`$*Nt}{S zF%qGG>pM08LN^v#(y5Pae3aD_KIwM8BpZ{4T$~gYL8wb(1kpMVGt;!nFzH7lLfc2q4N^H-uzs$l++zv4 zR|=ZFV$*^ga*fEV%|YDR7k$rcFA$ScB9cV(f|Z$VdU zQ4M$Gk+L-}6%9z{Z~sH-?Y;W4W3uKAixS(|_U}p~A)lc;Aegg5w>Ztm69m_`tcdq( zY(*?}e`G1H`q13yH@Zm!Mjs!WIsegHRC(ox%`_!1|8Lb9X{igc4z`U>2t@eKPNr ztpy3X{hn7)DQEwiVOS0~gWmxwmRiO+)=g}O%_xzErlRRA``S1L7RV6$;Gs`ZX^T zeM#PR$g%yz6D1k}?y7HlE`Sf#EpF8U;Of*PD|AC4H@P9SDT6xkMG3Wwrl`eV;SssR zy23&}V<$BHU@Z7t^vMD&4X8y7uC0)xv7~WBBKyKTq+}W5e{8D+9ExFz5V?dY6P4J& zM%o6eynq#sV*l1XxCpN3cWAl_Qdtbv+K&!Ow@R$4p8$W<7(L0gt;dvRCEigTNVieq zZ8R-jKR)}o9B)6^%^rP!vZ+I)=Cy&HfUAar(FNn70NSU6ne#7(7049TxY{ER`(7UV> z)c!V@Vq-xPgX~`|oYGTW7$rK~q<|s#Ua2*&EGs4o79zgE+J?8a6)Kn8Qn2Pl!Z@1oS@WSXuRMCou(y z+%?Y!k=m6+irV@HsFQ^*GsDPQ1;&J&Bfb-e6s`aO{{1xOY+1OjyJmMu`$VS)+zoJNxi`V8 zCnkFl4F=3ah1ck!X$^s}@@EPssSoPI)?rzH-CZT??w2_1Jk_1c6k7zf;*rh|^PajI zEg?FhDVE8{)WFBBw*^=F7%#Y5a%Q<{FIS~7_xMoL94)dFtR;`13Gdhxr< z6EccyM8>M8vvm(y5b>)IN;nmP8vf2h{UtH)o=%RA3qD?tD^+KfEqZ!*h+~XN5GOe4 zvA+fxBIbxhc?Y;~UgrnqV^xzp!1I4rf)@oCQycu(c3T+{I~uu3IuX>>%mbWMsh5RFa%{+;nI*)LKMpXGy5#i z+NIEY2*4TrzRnB;7VSKyTd$@O^GMtvO;s$_Z2_VAn*X{?U|-&c<*aTDC0cn$$1$&P zf4xWL@;3qq5*d7#w8am5FlZH?_rrF5HI2BPqu28-U8Ym*H8F5OdI+PM5dWsCK9C5a zskPd1HjVZ}2#nmuIBl2J=iN8)!=L_`sQlfuAspvfrUM@K5gQmqklv}hOj*_B1e4S$3NRug+S z8Z!JnqFxE{vniwbleMePY9aRO1Ljg!D&sr5usDEuRXmc2nL!1t z=&q$g4_`<-6;hMIe-=aRGrcZqHsD5Eih_lI|-DU2&dV@BmppkQEPF|wQr4KKstt7(u1Ua^KG*tYb z20JInK-|cEkn4-p2OPJYpR-7Ul>KVY3(c>t{eH&kIr^(_?v)*@W{u4^l{tA(9o^5X zsTs7TB6ID`OaaNom2x>)-mFf|S#-3LGmjnI03sfDe%d0Y5~)CEfpEn?uPvtlg~jC8 zK0o)mU^df+gIs-khb{^JCtD0bYC{5#=+KgnP-t{~KUrnca0@g9RLM6&9iK}TVmUs~ z@~~ecPUz5DJ2?Ss;yO(<`2Dqd2%U9aRVS&)%Pq0hFMl7n)HFcRFNk^-e%0JuZjVeT zCsiuLeYqTv8xi~~)8Ecyd?I`XG|*FHs~8V0Z0HJE+heRoj<`ZkZnYV9i~?V7tJCkQ zZhN;J4ijsCtfg=!4j-xv%D{Z#XCzr$lhgQ#D?F&L1Xg{DqldB0KAZf*n68a;#uyQ( z6!nPkCK+CG}9AS~}v`7p?9VUu))SngZ+3}}|W+_i!sMqWe= zli2S_BumhRXHG&gq%rbg*KY?J!oVvUTh@9YP#3A0ACP_4HgdT@(MXFR+4_>%()Ni) z?taxqJOU6?@9y^1*T^LR6FJwouD`V`dehUNThfib!PM!Qr&!{6Cw8zzM4s+H$rA{spO~N<*Zt#P=7NbM7}~SU!%FbT z(35`$AfWl94Yb`7C>1x$Kc{fNKR;haCfDk-s%?+DHu(U(4-G3NXm|D!QMGvb076>%4q@5u z5libc$dK$CZBTOXVG3J%nn<#mYyiY_@`c!;Tnr&fUFBze#t3;?MinKXEeGpmD>AA4 z{=!)j%CJ(uMA_<=f5rPY&5(%A`VK%AN$dG+!_U?GZN>5C7b-l22~51a=BAPR6nBZ- z^`k`=9DV*5Y`iC?djhA4^p5??eX^miQbApo&=#{8JjkdfZR(9mlK zBWX!+yXa$sgg*}tLVmBxsvn9JVvT7Lxh=GSbbIYqnqXc|j)R+2`1mo!Ti4|+fti6^ zCyiyO-<@(&Tu;;p#I@c>WaG-HA6tuQuzjy4JStHqO^USWUaz>&gB1*XYGH>JX(Jq) zOd~7IA~Q%rFwYUl_a=R$SKAb&&GbnVGcI1tO6m{%`Rjqr?KX-`J442mEL}}TrogB+ zNp>D{2W-1bbvVU-tUVWmX3SWV;d)*2Td_%@kqWoJDbnw+>8oG$tY;99nPTJ2NO7(t zBJ;>J;4{GcxSnkt+wABn0OuyWOBVNB~|BIR3IgR-~b^(u4{M8lMZ&W zs5>|7RXnu7{@buqT;-(XEA4qw>u>Yc&!`9+G_i7D((0|hL;z)TD*aW#V{xC#Po3Gy zVPC?nm1){NNZi)sM<+^;2c#01wxUrh^pGBdbfWCE2x(GUz`StidBI3gTSI4-pLTAp z&4xGcXQ*V@nuDuU!V_7RAV`OuydSgehv&iNpWf>-?Lc2(N_+L{1LuvJpV!64=u{RV zdBQh_d!37n08MT&7o3d+<-ru->BEnGGn_5+l**@B9vMl+F+3hyIpO8S_enD3Am!9xxse8lt=QHs zaut@s#YPHC9^3ruqK6u%bSy+jEM#K&;M$X5(pbzE9>C_pWc46%OT|=A_;6RTo?0H$QJ95cZ1IAMM9_^cHoMq4Q& z9f(^9xe4{4n^-)idlv#c9Qi;c{6+-`%%aeQIQ;#tn5qqtoqAv`Q88~ zY@r|oAS0cTHW@b1VKU)uKmX(#W5pc2;8i82Ieht@+dT2C$ToRLAcyN7F!Sh~fePCM zJ6BnIqGPR)6fZx7fQN$GX!7&kwZwu@q)z1L&>kXq+2WI|A>vQS4@dN2lht|7&&r`U z1ihP8ne#;f9RnI*pS+bZ-r7$tkzs#V?(@G+T|x?rzfMY%PdSH>Ocz)r2D=w;y(!Tvj zO4lvNm7-*?N)%GK3{u`(*(-m!1ZWjH$~2U8=r;De^-DXciD~|jG66sYS6PQ|a3E*G z_m0_?XpyT4ih&`uY~2zX)TyonmY~b7L;$snZc~>K63-zYgtZ|Vw#V;M@kF#5R1>^Y zq>e08HUxVa=3VA7^o1zqiw0yI&DW9Bha+jCVKRw4vcB&n^#_A7)H6>!Ubur5jv*40 zvDVEs5^!O{YdkdY;e@T?q|z`*^UTMzuw4?Gj{UkMgJL|ME|RYS!MdE zl|x3$t^uY4#))Ns(EVbL`k)<2CwZyI5tQskx5=Q(9552m8+WT{fdqDXZvsB_D|RqT zk-Vvg?S0pa7-Z%5Yq+9Wz*wRSEJ_7)5MJTg2F^!{8erZ43wvo4;6=*u1B%XXPp(x2Ze`πrtz_XRejDELRE-a)?zPT&J;-8eWA^ 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

X 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�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 literal 0 HcmV?d00001 diff --git a/app/src/main/res/drawable-nodpi/texture_slate.png b/app/src/main/res/drawable-nodpi/texture_slate.png new file mode 100644 index 0000000000000000000000000000000000000000..9fddee646a4cabf8332d4ed11d8ffac62fc64703 GIT binary patch literal 81533 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