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 be3f1227a..49c91433e 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 @@ -13,6 +13,7 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.compose.ui.window.Dialog +import androidx.core.net.toUri import androidx.lifecycle.* import app.omnivore.omnivore.AppleConstants import app.omnivore.omnivore.Constants @@ -67,6 +68,8 @@ class HomeViewModel @Inject constructor( readingProgressAnchor = it.node.readingProgressAnchorIndex, imageURLString = it.node.image, descriptionText = it.node.description, + publisherURLString = it.node.originalArticleUrl, + author = it.node.author, slug = it.node.slug ) } @@ -90,12 +93,16 @@ public data class LinkedItem( // public val documentDirectoryPath: String?, // public val pageURLString: String, public val descriptionText: String?, -// public val publisherURLString: String?, + public val publisherURLString: String?, // public val siteName: String?, -// public val author: String?, + public val author: String?, // public val publishDate: Any?, public val slug: String, // public val isArchived: Boolean, // public val contentReader: String?, // public val originalHtml: String?, -) +) { + fun publisherDisplayName(): String? { + return publisherURLString?.toUri()?.host + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/LinkedItemCard.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/LinkedItemCard.kt index c4ab6d4ed..1d901cd95 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/LinkedItemCard.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/LinkedItemCard.kt @@ -2,52 +2,75 @@ package app.omnivore.omnivore.ui.home import androidx.compose.foundation.layout.* import androidx.compose.foundation.Image -import androidx.compose.material3.Card -import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.foundation.clickable +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material3.Divider import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.sp import coil.compose.rememberAsyncImagePainter -@OptIn(ExperimentalMaterial3Api::class) @Composable -fun LinkedItemCard( - item: LinkedItem, - onClickHandler: () -> Unit, - modifier: Modifier = Modifier -) { - Card( - onClick = { onClickHandler() }, - shape = MaterialTheme.shapes.medium, - modifier = modifier - .fillMaxWidth() - .padding(15.dp) - ) { - Row { - Image( - painter = rememberAsyncImagePainter(item.imageURLString), - contentDescription = "Image associated with linked item", - modifier = Modifier.size(100.dp) - ) +fun LinkedItemCard(item: LinkedItem, onClickHandler: () -> Unit) { + val publisherDisplayName = item.publisherDisplayName() - Column(modifier = Modifier.padding(8.dp)) { + Column { + Row( + horizontalArrangement = Arrangement.SpaceBetween, + verticalAlignment = Alignment.Top, + modifier = Modifier + .fillMaxWidth() + .padding(12.dp) + .clickable(onClick = onClickHandler) + ) { + Column( + verticalArrangement = Arrangement.spacedBy(4.dp), + modifier = Modifier + .weight(1f, fill = false) + .padding(end = 8.dp) + ) { Text( text = item.title, style = MaterialTheme.typography.titleMedium, - maxLines = 2, - overflow = TextOverflow.Ellipsis + lineHeight = 20.sp ) - Text( - text = item.descriptionText ?: "", - maxLines = 1, - overflow = TextOverflow.Ellipsis, - style = MaterialTheme.typography.bodyMedium - ) + if (item.author != null) { + Text( + text = "By ${item.author}", + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } + + if (publisherDisplayName != null) { + Text( + text = publisherDisplayName, + style = MaterialTheme.typography.bodyMedium, + maxLines = 1, + overflow = TextOverflow.Ellipsis + ) + } } + + Image( + painter = rememberAsyncImagePainter(item.imageURLString), + contentDescription = "Image associated with linked item", + modifier = Modifier + .padding(top = 6.dp) + .clip(RoundedCornerShape(6.dp)) + .size(80.dp) + ) } + + Divider(color = MaterialTheme.colorScheme.outlineVariant, thickness = 1.dp) } } 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 6f3c8e376..6eb12ee04 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 @@ -27,20 +27,15 @@ fun RootView( homeViewModel: HomeViewModel ) { val hasAuthToken: Boolean by loginViewModel.hasAuthTokenLiveData.observeAsState(false) - // Remember a SystemUiController val systemUiController = rememberSystemUiController() val useDarkIcons = !isSystemInDarkTheme() DisposableEffect(systemUiController, useDarkIcons) { - // Update all of the system bar colors to be transparent, and use - // dark icons if we're in light theme systemUiController.setSystemBarsColor( color = Color.Black, darkIcons = false ) - // setStatusBarColor() and setNavigationBarColor() also exist - onDispose {} }