diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt index 36140cb11..65a4fce36 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/Routes.kt @@ -2,6 +2,6 @@ package app.omnivore.omnivore sealed class Routes(val route: String) { object Home : Routes("Home") - object WebReader : Routes("WebReader") + object WebAppReader : Routes("WebAppReader") object Settings: Routes("Settings") } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt index 85ba6ecec..3bb4c5863 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeViewModel.kt @@ -92,10 +92,12 @@ class HomeViewModel @Inject constructor( readingProgress = it.node.readingProgressPercent, readingProgressAnchor = it.node.readingProgressAnchorIndex, imageURLString = it.node.image, + pageURLString = it.node.url, descriptionText = it.node.description, publisherURLString = it.node.originalArticleUrl, author = it.node.author, - slug = it.node.slug + slug = it.node.slug, + publishDate = it.node.publishedAt ) } @@ -133,12 +135,12 @@ public data class LinkedItem( public val imageURLString: String?, // public val onDeviceImageURLString: String?, // public val documentDirectoryPath: String?, -// public val pageURLString: String, + public val pageURLString: String, public val descriptionText: String?, public val publisherURLString: String?, // public val siteName: String?, public val author: String?, -// public val publishDate: Any?, + public val publishDate: Any?, public val slug: String, // public val isArchived: Boolean, // public val contentReader: String?, @@ -147,4 +149,8 @@ public data class LinkedItem( fun publisherDisplayName(): String? { return publisherURLString?.toUri()?.host } + + fun labelsJSONString(): String { + return "" + } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt new file mode 100644 index 000000000..9eea20b5b --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt @@ -0,0 +1,44 @@ +package app.omnivore.omnivore.ui.reader + +import android.annotation.SuppressLint +import android.view.ViewGroup +import android.webkit.CookieManager +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.compose.runtime.Composable +import androidx.compose.ui.viewinterop.AndroidView +import app.omnivore.omnivore.BuildConfig + +@SuppressLint("SetJavaScriptEnabled") +@Composable +fun WebReader(slug: String, authCookieString: String) { + WebView.setWebContentsDebuggingEnabled(true) + + val url = BuildConfig.OMNIVORE_WEB_URL + "/app/me/$slug" + + AndroidView(factory = { + WebView(it).apply { + layoutParams = ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, + ViewGroup.LayoutParams.MATCH_PARENT + ) + + settings.javaScriptEnabled = true + settings.allowContentAccess = true + settings.allowFileAccess = true + settings.domStorageEnabled = true + + webViewClient = object : WebViewClient() { + } + + CookieManager.getInstance().setAcceptThirdPartyCookies(this, true) + CookieManager.getInstance().setAcceptCookie(true) + CookieManager.getInstance().setCookie(BuildConfig.OMNIVORE_API_URL, authCookieString) + CookieManager.getInstance().setCookie(BuildConfig.OMNIVORE_WEB_URL, authCookieString) { + loadUrl(url) + } + } + }, update = { + it.loadUrl(url) + }) +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt new file mode 100644 index 000000000..56f94efe4 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderContent.kt @@ -0,0 +1,106 @@ +package app.omnivore.omnivore.ui.reader + +import app.omnivore.omnivore.ui.home.LinkedItem + +enum class WebFont(val displayText: String, val rawValue: String) { + INTER("Inter", "Inter"), + SYSTEM("System Default", "unset"), + OPEN_DYSLEXIC("Open Dyslexic", "OpenDyslexic"), + MERRIWEATHER("Merriweather", "Merriweather"), + LORA("Lora", "Lora"), + OPEN_SANS("Open Sans", "Open Sans"), + ROBOTO("Roboto", "Roboto"), + CRIMSON_TEXT("Crimson Text", "Crimson Text"), + SOURCE_SERIF_PRO("Source Serif Pro", "Source Serif Pro"), + Inter("Inter", "Inter"), +} + +enum class ArticleContentStatus(val rawValue: String) { + FAILED("FAILED"), + PROCESSING("PROCESSING"), + SUCCEEDED("SUCCEEDED"), + UNKNOWN("UNKNOWN") +} + +data class ArticleContent( + val title: String, + val htmlContent: String, + val highlightsJSONString: String, + val contentStatus: String, // ArticleContentStatus, + val objectID: String?, // whatever the Room Equivalent of objectID is +) + +data class WebReaderContent( + val textFontSize: Int, + val lineHeight: Int, + val maxWidthPercentage: Int, + val item: LinkedItem, + val themeKey: String, + val fontFamily: WebFont, + val articleContent: ArticleContent, + val prefersHighContrastText: Boolean +) { + fun styledContent(): String { + // TODO: Kotlinize these three values (pasted from Swift) + val savedAt = "new Date((item.unwrappedSavedAt.timeIntervalSince1970 * 1000)).toISOString()" + val createdAt = "new Date((item.unwrappedCreatedAt.timeIntervalSince1970 * 1000)).toISOString()" + val publishedAt = if (item.publishDate != null) "new Date((item.publishDate!.timeIntervalSince1970 * 1000)).toISOString()" else "undefined" + + return """ + + + + + + + + +
+
HIIIIII
+ + + + + + + + """.trimIndent() + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt index 6eb12ee04..cb8c122b1 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/root/RootView.kt @@ -19,6 +19,7 @@ import app.omnivore.omnivore.ui.auth.WelcomeScreen import app.omnivore.omnivore.ui.home.HomeView import app.omnivore.omnivore.ui.home.HomeViewModel import app.omnivore.omnivore.ui.reader.ArticleWebView +import app.omnivore.omnivore.ui.reader.WebReader import com.google.accompanist.systemuicontroller.rememberSystemUiController @Composable @@ -69,13 +70,20 @@ fun PrimaryNavigator( ) } - composable("WebReader/{slug}") { + composable("WebAppReader/{slug}") { ArticleWebView( it.arguments?.getString("slug") ?: "", authCookieString = loginViewModel.getAuthCookieString() ?: "" ) } + composable("WebReader/{slug}") { + WebReader( + it.arguments?.getString("slug") ?: "", + authCookieString = loginViewModel.getAuthCookieString() ?: "" + ) + } + composable(Routes.Settings.route) { SettingsView(loginViewModel = loginViewModel, navController = navController) }