diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsSelectionSheet.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsSelectionSheet.kt index 6adeeb60b..28dff7936 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsSelectionSheet.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/components/LabelsSelectionSheet.kt @@ -9,9 +9,7 @@ import androidx.compose.foundation.layout.* import androidx.compose.foundation.lazy.LazyColumn 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.verticalScroll import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.ModalBottomSheetLayout import androidx.compose.material.ModalBottomSheetValue @@ -28,50 +26,9 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog import app.omnivore.omnivore.persistence.entities.SavedItemLabel import app.omnivore.omnivore.ui.library.LibraryViewModel -import app.omnivore.omnivore.ui.reader.WebReaderParams -import app.omnivore.omnivore.ui.reader.WebReaderViewModel -@Composable -fun WebReaderLabelsSelectionSheet(viewModel: WebReaderViewModel) { - val isActive: Boolean by viewModel.showLabelsSelectionSheetLiveData.observeAsState(false) - val labels: List by viewModel.savedItemLabelsLiveData.observeAsState(listOf()) - val webReaderParams: WebReaderParams? by viewModel.webReaderParamsLiveData.observeAsState(null) - - val modalBottomSheetState = rememberModalBottomSheetState( - ModalBottomSheetValue.HalfExpanded, - ) - - if (isActive) { - ModalBottomSheetLayout( - sheetBackgroundColor = Color.Transparent, - sheetState = modalBottomSheetState, - sheetContent = { - BottomSheetUI { - LabelsSelectionSheetContent( - labels = labels, - initialSelectedLabels = webReaderParams?.labels ?: listOf(), - onCancel = { - viewModel.showLabelsSelectionSheetLiveData.value = false - }, - isLibraryMode = false, - onSave = { - if (it != labels) { - viewModel.updateSavedItemLabels(savedItemID = webReaderParams?.item?.savedItemId ?: "", labels = it) - } - viewModel.showLabelsSelectionSheetLiveData.value = false - }, - onCreateLabel = { newLabelName, labelHexValue -> - viewModel.createNewSavedItemLabel(newLabelName, labelHexValue) - } - ) - } - } - ) {} - } -} @Composable fun LabelsSelectionSheet(viewModel: LibraryViewModel) { 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 6dc195ffc..fdfb893ac 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 @@ -11,6 +11,7 @@ import android.view.* import android.view.View.OnScrollChangeListener import android.view.ViewTreeObserver.OnScrollChangedListener import android.webkit.JavascriptInterface +import android.webkit.WebResourceRequest import android.webkit.WebView import android.webkit.WebViewClient import androidx.compose.foundation.isSystemInDarkTheme @@ -62,6 +63,17 @@ fun WebReader( viewModel?.showNavBar() view?.animate()?.alpha(1.0f)?.duration = 200 } + + override fun shouldOverrideUrlLoading( + view: WebView?, + request: WebResourceRequest? + ): Boolean { + Log.d("reader","SHOULD OVERRIDE REQUEST: ${request?.url} hasGesture: ${request?.hasGesture()} isForMainFrame: ${request?.isForMainFrame()}") + if ((request?.isForMainFrame == true) && (request?.hasGesture() == true)) { + return false + } + return super.shouldOverrideUrlLoading(view, request) + } } val javascriptInterface = AndroidWebKitMessenger { actionID, json -> diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt index cfbb23703..8c4f5e196 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/WebReaderLoadingContainer.kt @@ -34,7 +34,6 @@ import app.omnivore.omnivore.MainActivity import app.omnivore.omnivore.R import app.omnivore.omnivore.persistence.entities.SavedItemLabel import app.omnivore.omnivore.ui.components.LabelsSelectionSheetContent -import app.omnivore.omnivore.ui.components.WebReaderLabelsSelectionSheet import app.omnivore.omnivore.ui.notebook.NotebookView import app.omnivore.omnivore.ui.notebook.NotebookViewModel import app.omnivore.omnivore.ui.savedItemViews.SavedItemContextMenu @@ -124,7 +123,7 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, val onBackPressedDispatcher = LocalOnBackPressedDispatcherOwner.current?.onBackPressedDispatcher var isMenuExpanded by remember { mutableStateOf(false) } - var bottomSheetState by remember { mutableStateOf(BottomSheetState.NONE) } + val bottomSheetState: BottomSheetState? by webReaderViewModel.bottomSheetStateLiveData.observeAsState(BottomSheetState.NONE) val isDarkMode = isSystemInDarkTheme() val currentThemeKey = webReaderViewModel.currentThemeKey.observeAsState() @@ -175,22 +174,6 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, } } ?: Color(0xFF000000) - annotation?.let { - bottomSheetState = BottomSheetState.HIGHLIGHTNOTE - coroutineScope.launch { - modalBottomSheetState.animateTo(ModalBottomSheetValue.Expanded) - } - } - - val showLabelsSelector: Boolean by webReaderViewModel.showLabelsSelectionSheetLiveData.observeAsState(false) - - if (showLabelsSelector) { - bottomSheetState = BottomSheetState.LABELS - coroutineScope.launch { - modalBottomSheetState.animateTo(ModalBottomSheetValue.HalfExpanded) - } - } - ModalBottomSheetLayout( modifier = Modifier .statusBarsPadding(), @@ -219,14 +202,14 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, webReaderViewModel.saveAnnotation(it) coroutineScope.launch { modalBottomSheetState.hide() - bottomSheetState = BottomSheetState.NONE + webReaderViewModel.resetBottomSheet() } }, onCancel = { webReaderViewModel.cancelAnnotationEdit() coroutineScope.launch { modalBottomSheetState.hide() - bottomSheetState = BottomSheetState.NONE + webReaderViewModel.resetBottomSheet() } } ) @@ -241,7 +224,7 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, onCancel = { coroutineScope.launch { modalBottomSheetState.hide() - bottomSheetState = BottomSheetState.NONE + webReaderViewModel.resetBottomSheet() } }, isLibraryMode = false, @@ -253,7 +236,7 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, } coroutineScope.launch { modalBottomSheetState.hide() - bottomSheetState = BottomSheetState.NONE + webReaderViewModel.resetBottomSheet() } }, onCreateLabel = { newLabelName, labelHexValue -> @@ -264,6 +247,9 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, } BottomSheetState.NONE -> { + } + else -> { + } } Spacer(modifier = Modifier.weight(1.0F)) @@ -304,7 +290,7 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, webReaderParams?.let { IconButton(onClick = { coroutineScope.launch { - bottomSheetState = BottomSheetState.NOTEBOOK + webReaderViewModel.setBottomSheet(BottomSheetState.NOTEBOOK) modalBottomSheetState.animateTo(ModalBottomSheetValue.Expanded) } }) { @@ -317,7 +303,7 @@ fun WebReaderLoadingContainer(slug: String? = null, requestID: String? = null, } IconButton(onClick = { coroutineScope.launch { - bottomSheetState = BottomSheetState.PREFERENCES + webReaderViewModel.setBottomSheet(BottomSheetState.PREFERENCES) modalBottomSheetState.animateTo(ModalBottomSheetValue.HalfExpanded) } }) { 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 752d42018..5210ccfd6 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 @@ -2,6 +2,7 @@ package app.omnivore.omnivore.ui.reader import android.util.Log import androidx.compose.foundation.ScrollState +import androidx.compose.material.ModalBottomSheetValue import androidx.compose.runtime.remember import androidx.compose.ui.geometry.Offset import androidx.compose.ui.input.nestedscroll.NestedScrollConnection @@ -64,6 +65,8 @@ class WebReaderViewModel @Inject constructor( val showLabelsSelectionSheetLiveData = MutableLiveData(false) val savedItemLabelsLiveData = dataService.db.savedItemLabelDao().getSavedItemLabelsLiveData() + val bottomSheetStateLiveData = MutableLiveData(BottomSheetState.NONE) + var hasTappedExistingHighlight = false var lastTapCoordinates: TapCoordinates? = null private var isLoading = false @@ -85,6 +88,14 @@ class WebReaderViewModel @Inject constructor( onScrollChange(maxToolbarHeightPx) } + fun setBottomSheet(state: BottomSheetState) { + bottomSheetStateLiveData.postValue(state) + } + + fun resetBottomSheet() { + bottomSheetStateLiveData.postValue(BottomSheetState.NONE) + } + fun onScrollChange(delta: Float) { val newHeight = (currentToolbarHeightLiveData.value ?: 0.0f) + delta currentToolbarHeightLiveData.value = newHeight.coerceIn(0f, maxToolbarHeightPx) @@ -185,6 +196,7 @@ class WebReaderViewModel @Inject constructor( } SavedItemAction.EditLabels -> { showLabelsSelectionSheetLiveData.value = true + bottomSheetStateLiveData.postValue(BottomSheetState.LABELS) } } } @@ -225,6 +237,7 @@ class WebReaderViewModel @Inject constructor( .fromJson(jsonString, AnnotationWebViewMessage::class.java) .annotation ?: "" annotationLiveData.value = annotation + bottomSheetStateLiveData.postValue(BottomSheetState.HIGHLIGHTNOTE) } } "shareHighlight" -> {