Add share menu item in the reader

This commit is contained in:
Jackson Harper
2023-05-15 19:20:17 +08:00
parent f6b2484007
commit 3cf60df783
6 changed files with 57 additions and 69 deletions

View File

@ -1,6 +1,8 @@
package app.omnivore.omnivore.ui.library
import android.content.Context
import android.content.Intent
import android.net.Uri
import android.util.Log
import android.widget.Toast
import androidx.compose.material3.SnackbarHostState
@ -290,6 +292,9 @@ class LibraryViewModel @Inject constructor(
labelsSelectionCurrentItemLiveData.value = itemID
showLabelsSelectionSheetLiveData.value = true
}
else -> {
}
}
actionsMenuItemLiveData.postValue(null)
}
@ -401,5 +406,5 @@ enum class SavedItemAction {
Delete,
Archive,
Unarchive,
EditLabels
EditLabels,
}

View File

@ -11,6 +11,8 @@ import androidx.compose.foundation.shape.RoundedCornerShape
import androidx.compose.foundation.verticalScroll
import androidx.compose.material.Switch
import androidx.compose.material.Text
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.ArrowDropDown
import androidx.compose.material3.*
import androidx.compose.runtime.*
import androidx.compose.ui.Alignment
@ -25,6 +27,7 @@ import androidx.compose.ui.unit.sp
import app.omnivore.omnivore.R
import app.omnivore.omnivore.ui.theme.OmnivoreTheme
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ReaderPreferencesView(webReaderViewModel: WebReaderViewModel) {
val isDark = isSystemInDarkTheme()
@ -43,8 +46,6 @@ fun ReaderPreferencesView(webReaderViewModel: WebReaderViewModel) {
val themeState = remember { mutableStateOf(currentWebPreferences.storedThemePreference) }
val themeListState = rememberLazyListState()
OmnivoreTheme() {
Column(
modifier = Modifier
@ -65,16 +66,17 @@ fun ReaderPreferencesView(webReaderViewModel: WebReaderViewModel) {
))
Spacer(modifier = Modifier.weight(1.0F))
Box {
OutlinedButton(
shape = RoundedCornerShape(4.dp),
AssistChip(
onClick = { isFontListExpanded.value = true },
colors = ButtonDefaults.buttonColors(
contentColor = Color(red = 137, green = 137, blue = 137),
// containerColor = Color.Transparent,
),
) {
Text(selectedWebFontName.value)
}
label = { Text(selectedWebFontName.value, color = Color(red = 137, green = 137, blue = 137)) },
trailingIcon = {
Icon(
Icons.Default.ArrowDropDown,
contentDescription = "Choose the Reader font",
tint = Color(red = 137, green = 137, blue = 137)
)
},
)
if (isFontListExpanded.value) {
DropdownMenu(
expanded = isFontListExpanded.value,

View File

@ -307,6 +307,9 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null,
@OptIn(ExperimentalMaterialApi::class, ExperimentalMaterial3Api::class)
@Composable
fun ReaderTopAppBar(webReaderViewModel: WebReaderViewModel, onLibraryIconTap: (() -> Unit)? = null) {
val context = LocalContext.current
val onBackPressedDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher
val isDarkMode = isSystemInDarkTheme()
val currentThemeKey = webReaderViewModel.currentThemeKey.observeAsState()
val currentTheme = Themes.values().find { it.themeKey == currentThemeKey.value }
@ -345,7 +348,7 @@ fun ReaderTopAppBar(webReaderViewModel: WebReaderViewModel, onLibraryIconTap: ((
title = {},
navigationIcon = {
IconButton(onClick = {
// onBackPressedDispatcher?.onBackPressed()
onBackPressedDispatcher?.onBackPressed()
}) {
Icon(
imageVector = Icons.Filled.ArrowBack,
@ -394,9 +397,11 @@ fun ReaderTopAppBar(webReaderViewModel: WebReaderViewModel, onLibraryIconTap: ((
if (isMenuExpanded) {
webReaderParams?.let { params ->
SavedItemContextMenu(
context = context,
isExpanded = isMenuExpanded,
isArchived = params.item.isArchived,
onDismiss = { isMenuExpanded = false },
webReaderViewModel = webReaderViewModel,
actionHandler = {
webReaderViewModel.handleSavedItemAction(
params.item.savedItemId,

View File

@ -7,6 +7,7 @@ import android.content.Intent
import android.net.Uri
import android.util.Log
import android.widget.Toast
import androidx.compose.ui.platform.LocalContext
import androidx.core.content.ContextCompat.startActivity
import androidx.lifecycle.*
import app.omnivore.omnivore.DatastoreKeys
@ -108,6 +109,17 @@ class WebReaderViewModel @Inject constructor(
}
}
fun showShareLinkSheet(context: Context) {
webReaderParamsLiveData.value?.let {
val browserIntent = Intent(Intent.ACTION_SEND)
browserIntent.setType("text/plain")
browserIntent.putExtra(Intent.EXTRA_TEXT, it.item.pageURLString)
browserIntent.putExtra(Intent.EXTRA_SUBJECT, it.item.pageURLString)
context.startActivity(browserIntent)
}
}
fun openCurrentLink(context: Context) {
currentLink?.let {
openLink(context, it)

View File

@ -1,22 +1,28 @@
package app.omnivore.omnivore.ui.savedItemViews
import android.content.Context
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.outlined.CheckCircle
import androidx.compose.material.icons.outlined.Delete
import androidx.compose.material.icons.outlined.List
import androidx.compose.material.icons.outlined.Share
import androidx.compose.material3.DropdownMenu
import androidx.compose.material3.DropdownMenuItem
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.painterResource
import app.omnivore.omnivore.R
import app.omnivore.omnivore.ui.library.SavedItemAction
import app.omnivore.omnivore.ui.reader.WebReaderViewModel
@Composable
fun SavedItemContextMenu(
isExpanded: Boolean,
isArchived: Boolean,
context: Context,
webReaderViewModel: WebReaderViewModel,
onDismiss: () -> Unit,
actionHandler: (SavedItemAction) -> Unit
) {
@ -51,6 +57,19 @@ fun SavedItemContextMenu(
)
}
)
DropdownMenuItem(
text = { Text("Share Original") },
onClick = {
webReaderViewModel.showShareLinkSheet(context)
onDismiss()
},
leadingIcon = {
Icon(
Icons.Outlined.Share,
contentDescription = null
)
}
)
DropdownMenuItem(
text = { Text("Remove Item") },
onClick = {

View File

@ -9,62 +9,12 @@ import androidx.compose.ui.platform.LocalContext
private val LightColors = lightColorScheme(
primary = md_theme_light_primary,
onPrimary = md_theme_light_onPrimary,
primaryContainer = md_theme_light_primaryContainer,
onPrimaryContainer = md_theme_light_onPrimaryContainer,
secondary = md_theme_light_secondary,
onSecondary = md_theme_light_onSecondary,
secondaryContainer = md_theme_light_secondaryContainer,
onSecondaryContainer = md_theme_light_onSecondaryContainer,
tertiary = md_theme_light_tertiary,
onTertiary = md_theme_light_onTertiary,
tertiaryContainer = md_theme_light_tertiaryContainer,
onTertiaryContainer = md_theme_light_onTertiaryContainer,
error = md_theme_light_error,
errorContainer = md_theme_light_errorContainer,
onError = md_theme_light_onError,
onErrorContainer = md_theme_light_onErrorContainer,
background = md_theme_light_background,
onBackground = md_theme_light_onBackground,
surface = md_theme_light_surface,
onSurface = md_theme_light_onSurface,
surfaceVariant = md_theme_light_surfaceVariant,
onSurfaceVariant = md_theme_light_onSurfaceVariant,
outline = md_theme_light_outline,
inverseOnSurface = md_theme_light_inverseOnSurface,
inverseSurface = md_theme_light_inverseSurface,
inversePrimary = md_theme_light_inversePrimary,
surfaceTint = md_theme_light_surfaceTint,
)
private val DarkColors = darkColorScheme(
primary = md_theme_dark_primary,
onPrimary = md_theme_dark_onPrimary,
primaryContainer = md_theme_dark_primaryContainer,
onPrimaryContainer = md_theme_dark_onPrimaryContainer,
secondary = md_theme_dark_secondary,
onSecondary = md_theme_dark_onSecondary,
secondaryContainer = md_theme_dark_secondaryContainer,
onSecondaryContainer = md_theme_dark_onSecondaryContainer,
tertiary = md_theme_dark_tertiary,
onTertiary = md_theme_dark_onTertiary,
tertiaryContainer = md_theme_dark_tertiaryContainer,
onTertiaryContainer = md_theme_dark_onTertiaryContainer,
error = md_theme_dark_error,
errorContainer = md_theme_dark_errorContainer,
onError = md_theme_dark_onError,
onErrorContainer = md_theme_dark_onErrorContainer,
background = md_theme_dark_background,
onBackground = md_theme_dark_onBackground,
surface = md_theme_dark_surface,
onSurface = md_theme_dark_onSurface,
surfaceVariant = md_theme_dark_surfaceVariant,
onSurfaceVariant = md_theme_dark_onSurfaceVariant,
outline = md_theme_dark_outline,
inverseOnSurface = md_theme_dark_inverseOnSurface,
inverseSurface = md_theme_dark_inverseSurface,
inversePrimary = md_theme_dark_inversePrimary,
surfaceTint = md_theme_dark_surfaceTint,
)
@Composable
@ -73,12 +23,7 @@ fun OmnivoreTheme(
useDynamicTheme: Boolean = Build.VERSION.SDK_INT >= Build.VERSION_CODES.S,
content: @Composable () -> Unit
) {
val colorScheme = if (useDynamicTheme) {
val context = LocalContext.current
if (darkTheme) dynamicDarkColorScheme(context) else dynamicLightColorScheme(context)
} else {
if (darkTheme) darkColorScheme() else lightColorScheme()
}
val colorScheme = if (darkTheme) DarkColors else LightColors
MaterialTheme(
colorScheme = colorScheme,