From 8e6d4d387ba1c16e66f677330ff5549edbce4dd2 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 28 Sep 2022 13:51:15 -0700 Subject: [PATCH] create text selection menu for an existing highlight --- .../networking/ReadingProgressMutations.kt | 36 +++++++++++++++++ .../omnivore/omnivore/ui/reader/WebReader.kt | 39 +++++++++++++++---- .../omnivore/ui/reader/WebReaderViewModel.kt | 3 -- .../res/menu/highlight_selection_menu.xml | 15 +++++++ .../app/src/main/res/values/strings.xml | 1 + 5 files changed, 84 insertions(+), 10 deletions(-) create mode 100644 android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ReadingProgressMutations.kt create mode 100644 android/Omnivore/app/src/main/res/menu/highlight_selection_menu.xml diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ReadingProgressMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ReadingProgressMutations.kt new file mode 100644 index 000000000..f6670efe3 --- /dev/null +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/ReadingProgressMutations.kt @@ -0,0 +1,36 @@ +package app.omnivore.omnivore.networking + +import app.omnivore.omnivore.graphql.generated.SaveArticleReadingProgressMutation +import app.omnivore.omnivore.graphql.generated.type.SaveArticleReadingProgressInput + + +import android.util.Log +import com.google.gson.Gson + +data class ReadingProgressParams( + val id: String?, + val readingProgressPercent: Double?, + val readingProgressAnchorIndex: Int? +) { + fun asSaveReadingProgressInput() = SaveArticleReadingProgressInput( + id = id ?: "", + readingProgressPercent = readingProgressPercent ?: 0.0, + readingProgressAnchorIndex = readingProgressAnchorIndex ?: 0 + ) +} + +suspend fun Networker.updateReadingProgress(jsonString: String): Boolean { + val input = Gson().fromJson(jsonString, ReadingProgressParams::class.java).asSaveReadingProgressInput() + + Log.d("Loggo", "created reading progress input: $input") + + val result = authenticatedApolloClient() + .mutation(SaveArticleReadingProgressMutation(input)) + .execute() + + val articleID = result.data?.saveArticleReadingProgress?.onSaveArticleReadingProgressSuccess?.updatedArticle?.id + + Log.d("Loggo", "updated article with id: $articleID") + + return articleID != 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 776e98123..fc272beae 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 @@ -17,6 +17,8 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.ui.viewinterop.AndroidView import app.omnivore.omnivore.R +import app.omnivore.omnivore.networking.ReadingProgressParams +import com.google.gson.Gson import org.json.JSONObject @@ -76,7 +78,17 @@ fun WebReader(params: WebReaderParams, webReaderViewModel: WebReaderViewModel) { } val javascriptInterface = AndroidWebKitMessenger { actionID, json -> - webReaderViewModel.handleIncomingWebMessage(actionID, json) + when (actionID) { + "existingHighlightTap" -> { + isExistingHighlightSelected = true + actionTapCoordinates = Gson().fromJson(json, ActionTapCoordinates::class.java) + Log.d("Loggo", "receive existing highlight tap action: $actionTapCoordinates") + startActionMode(null) + } + else -> { + webReaderViewModel.handleIncomingWebMessage(actionID, json) + } + } } addJavascriptInterface(javascriptInterface, "AndroidWebKitMessenger") @@ -112,10 +124,18 @@ fun WebReader(params: WebReaderParams, webReaderViewModel: WebReaderViewModel) { } class OmnivoreWebView(context: Context) : WebView(context) { + var isExistingHighlightSelected = false + var actionTapCoordinates: ActionTapCoordinates? = null + private val actionModeCallback = object : ActionMode.Callback2() { // Called when the action mode is created; startActionMode() was called override fun onCreateActionMode(mode: ActionMode, menu: Menu): Boolean { - mode.menuInflater.inflate(R.menu.text_selection_menu, menu) + if (isExistingHighlightSelected) { + mode.menuInflater.inflate(R.menu.highlight_selection_menu, menu) + isExistingHighlightSelected = false + } else { + mode.menuInflater.inflate(R.menu.text_selection_menu, menu) + } return true } @@ -158,21 +178,19 @@ class OmnivoreWebView(context: Context) : WebView(context) { } } - private var currentActionModeCallback: ActionMode.Callback? = actionModeCallback - override fun startActionMode(callback: ActionMode.Callback?): ActionMode { - return super.startActionMode(currentActionModeCallback) + return super.startActionMode(actionModeCallback) } override fun startActionModeForChild( originalView: View?, callback: ActionMode.Callback? ): ActionMode { - return super.startActionModeForChild(originalView, currentActionModeCallback) + return super.startActionModeForChild(originalView, actionModeCallback) } override fun startActionMode(callback: ActionMode.Callback?, type: Int): ActionMode { - return super.startActionMode(currentActionModeCallback, type) + return super.startActionMode(actionModeCallback, type) } } @@ -182,3 +200,10 @@ class AndroidWebKitMessenger(val messageHandler: (String, String) -> Unit) { messageHandler(actionID, jsonString) } } + +data class ActionTapCoordinates( + val rectX: Double, + val rectY: Double, + val rectWidth: Double, + val rectHeight: Double, +) 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 d3cf9cef7..cb0908ed5 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 @@ -78,9 +78,6 @@ class WebReaderViewModel @Inject constructor( annotationLiveData.value = annotation } } - "existingHighlightTap" -> { - Log.d("Loggo", "receive existing highlight tap action: $jsonString") - } "shareHighlight" -> { // unimplemented } diff --git a/android/Omnivore/app/src/main/res/menu/highlight_selection_menu.xml b/android/Omnivore/app/src/main/res/menu/highlight_selection_menu.xml new file mode 100644 index 000000000..4cc6d8400 --- /dev/null +++ b/android/Omnivore/app/src/main/res/menu/highlight_selection_menu.xml @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/android/Omnivore/app/src/main/res/values/strings.xml b/android/Omnivore/app/src/main/res/values/strings.xml index 7bb14ba15..b6ed5d009 100644 --- a/android/Omnivore/app/src/main/res/values/strings.xml +++ b/android/Omnivore/app/src/main/res/values/strings.xml @@ -5,4 +5,5 @@ Save articles and read them later in our distraction-free reader. Highlight Annotate + Delete