From e5fec25fd5eefb164200121180c410baa02e4cf7 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Mon, 12 Dec 2022 16:36:30 -0800 Subject: [PATCH] add context menu to web reader (but keep it disabled for now) --- .../app/omnivore/omnivore/ui/home/HomeView.kt | 2 +- .../omnivore/ui/home/HomeViewModel.kt | 1 - .../LinkedItemCard.kt | 44 +++------------- .../linkedItemViews/LinkedItemContextMenu.kt | 52 +++++++++++++++++++ .../omnivore/omnivore/ui/reader/WebReader.kt | 18 ++++++- .../omnivore/ui/reader/WebReaderViewModel.kt | 33 ++++++++++++ 6 files changed, 111 insertions(+), 39 deletions(-) rename android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/{home => linkedItemViews}/LinkedItemCard.kt (69%) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt index 9389ccb0f..c004fae7b 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/HomeView.kt @@ -18,10 +18,10 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.unit.dp -import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavHostController import app.omnivore.omnivore.Routes import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.ui.linkedItemViews.LinkedItemCard import app.omnivore.omnivore.ui.reader.PDFReaderActivity import kotlinx.coroutines.flow.distinctUntilChanged 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 5c29a8127..199e8c183 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 @@ -1,6 +1,5 @@ package app.omnivore.omnivore.ui.home -import android.util.Log import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue 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/linkedItemViews/LinkedItemCard.kt similarity index 69% rename from android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/home/LinkedItemCard.kt rename to android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemCard.kt index f6667b1b1..05bdb58d3 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/linkedItemViews/LinkedItemCard.kt @@ -1,11 +1,8 @@ -package app.omnivore.omnivore.ui.home +package app.omnivore.omnivore.ui.linkedItemViews import androidx.compose.foundation.* import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Delete -import androidx.compose.material.icons.outlined.List import androidx.compose.material3.* import androidx.compose.runtime.* import androidx.compose.ui.Alignment @@ -16,6 +13,7 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import app.omnivore.omnivore.models.LinkedItem +import app.omnivore.omnivore.ui.home.LinkedItemAction import coil.compose.rememberAsyncImagePainter @OptIn(ExperimentalFoundationApi::class) @@ -82,37 +80,11 @@ fun LinkedItemCard(item: LinkedItem, onClickHandler: () -> Unit, actionHandler: Divider(color = MaterialTheme.colorScheme.outlineVariant, thickness = 1.dp) - DropdownMenu( - expanded = isMenuExpanded, - onDismissRequest = { isMenuExpanded = false } - ) { - DropdownMenuItem( - text = { Text(if (item.isArchived) "Unarchive" else "Archive") }, - onClick = { - val action = if (item.isArchived) LinkedItemAction.Unarchive else LinkedItemAction.Archive - actionHandler(action) - isMenuExpanded = false - }, - leadingIcon = { - Icon( - Icons.Outlined.List, // TODO: use more appropriate icon - contentDescription = null - ) - } - ) - DropdownMenuItem( - text = { Text("Remove Item") }, - onClick = { - actionHandler(LinkedItemAction.Delete) - isMenuExpanded = false - }, - leadingIcon = { - Icon( - Icons.Outlined.Delete, - contentDescription = null - ) - } - ) - } + LinkedItemContextMenu( + isExpanded = isMenuExpanded, + isArchived = item.isArchived, + onDismiss = { isMenuExpanded = false }, + actionHandler = actionHandler + ) } } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt new file mode 100644 index 000000000..ea11a4038 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/linkedItemViews/LinkedItemContextMenu.kt @@ -0,0 +1,52 @@ +package app.omnivore.omnivore.ui.linkedItemViews + +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.outlined.Delete +import androidx.compose.material.icons.outlined.List +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 app.omnivore.omnivore.ui.home.LinkedItemAction + +@Composable +fun LinkedItemContextMenu( + isExpanded: Boolean, + isArchived: Boolean, + onDismiss: () -> Unit, + actionHandler: (LinkedItemAction) -> Unit +) { + DropdownMenu( + expanded = isExpanded, + onDismissRequest = onDismiss + ) { + DropdownMenuItem( + text = { Text(if (isArchived) "Unarchive" else "Archive") }, + onClick = { + val action = if (isArchived) LinkedItemAction.Unarchive else LinkedItemAction.Archive + actionHandler(action) + onDismiss() + }, + leadingIcon = { + Icon( + Icons.Outlined.List, // TODO: use more appropriate icon + contentDescription = null + ) + } + ) + DropdownMenuItem( + text = { Text("Remove Item") }, + onClick = { + actionHandler(LinkedItemAction.Delete) + onDismiss() + }, + leadingIcon = { + Icon( + Icons.Outlined.Delete, + contentDescription = null + ) + } + ) + } +} diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt index af113b73e..debcfefbb 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReader.kt @@ -14,6 +14,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.verticalScroll import androidx.compose.material.TopAppBar import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Menu import androidx.compose.material.icons.filled.Settings import androidx.compose.material3.* import androidx.compose.runtime.* @@ -28,6 +29,7 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.viewinterop.AndroidView import androidx.core.content.ContextCompat.getSystemService import app.omnivore.omnivore.R +import app.omnivore.omnivore.ui.linkedItemViews.LinkedItemContextMenu import com.google.gson.Gson import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers @@ -39,6 +41,7 @@ import kotlin.math.roundToInt @Composable fun WebReaderLoadingContainer(slug: String, webReaderViewModel: WebReaderViewModel) { + var isMenuExpanded by remember { mutableStateOf(false) } var showWebPreferencesDialog by remember { mutableStateOf(false ) } val webReaderParams: WebReaderParams? by webReaderViewModel.webReaderParamsLiveData.observeAsState(null) @@ -94,12 +97,25 @@ fun WebReaderLoadingContainer(slug: String, webReaderViewModel: WebReaderViewMod backgroundColor = MaterialTheme.colorScheme.surfaceVariant, title = {}, actions = { + // Disabling menu until we implement local persistence +// IconButton(onClick = { isMenuExpanded = true }) { +// Icon( +// imageVector = Icons.Filled.Menu, +// contentDescription = null +// ) +// } IconButton(onClick = { showWebPreferencesDialog = true }) { Icon( - imageVector = Icons.Filled.Settings, + imageVector = Icons.Filled.Settings, // TODO: set a better icon contentDescription = null ) } + LinkedItemContextMenu( + isExpanded = isMenuExpanded, + isArchived = webReaderParams!!.item.isArchived, + onDismiss = { isMenuExpanded = false }, + actionHandler = { webReaderViewModel.handleLinkedItemAction(webReaderParams!!.item.id, it) } + ) } ) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt index acdc45403..3bc3e0084 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderViewModel.kt @@ -10,8 +10,11 @@ import app.omnivore.omnivore.DatastoreKeys import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.models.LinkedItem import app.omnivore.omnivore.networking.* +import app.omnivore.omnivore.ui.home.LinkedItemAction import com.google.gson.Gson import dagger.hilt.android.lifecycle.HiltViewModel +import kotlinx.coroutines.CoroutineScope +import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import kotlinx.coroutines.runBlocking import java.util.* @@ -62,6 +65,36 @@ class WebReaderViewModel @Inject constructor( } } + fun handleLinkedItemAction(itemID: String, action: LinkedItemAction) { + when (action) { + LinkedItemAction.Delete -> { + viewModelScope.launch { + networker.deleteLinkedItem(itemID) + popToHomeView(itemID) + } + } + LinkedItemAction.Archive -> { + viewModelScope.launch { + networker.archiveLinkedItem(itemID) + popToHomeView(itemID) + } + } + LinkedItemAction.Unarchive -> { + viewModelScope.launch { + networker.unarchiveLinkedItem(itemID) + popToHomeView(itemID) + } + } + } + } + + private fun popToHomeView(itemID: String) { + CoroutineScope(Dispatchers.Main).launch { + // TODO: pop to home + Log.d("maxx", "should pop to home and remove item with ID: $itemID") + } + } + fun handleIncomingWebMessage(actionID: String, jsonString: String) { when (actionID) { "createHighlight" -> {