From 5df82d0d14356eb763a075d5cd73c4ac237b0d16 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Tue, 6 Dec 2022 11:18:07 -0800 Subject: [PATCH 1/5] use action menu when tapping in existing highlights in pdf doc --- .../omnivore/omnivore/ui/reader/PDFReader.kt | 139 +++++++++++++----- .../res/menu/pdf_highlight_selection_menu.xml | 18 ++- .../app/src/main/res/values/strings.xml | 1 + 3 files changed, 113 insertions(+), 45 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt index 02c0646eb..1a94846be 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt @@ -6,17 +6,16 @@ import android.content.ClipData import android.content.ClipboardManager import android.content.Context import android.graphics.PointF +import android.graphics.Rect import android.graphics.RectF import android.graphics.drawable.Drawable import android.net.Uri import android.os.Bundle -import android.view.Gravity -import android.view.MotionEvent -import android.view.View +import android.util.Log +import android.view.* import android.widget.Button import android.widget.EditText import android.widget.ImageView -import android.widget.PopupMenu import androidx.activity.viewModels import androidx.appcompat.app.AppCompatActivity import androidx.core.content.ContextCompat @@ -53,6 +52,8 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan private var hasLoadedHighlights = false private var pendingHighlightAnnotation: HighlightAnnotation? = null private var textSelectionController: TextSelectionController? = null + private var clickedHighlight: Annotation? = null + private var clickedHighlightPosition: PointF? = null private lateinit var fragment: PdfFragment private lateinit var thumbnailBar: PdfThumbnailBar @@ -84,7 +85,11 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan viewModel.loadItem(slug, this) } - // TODO: implement onDestroy to remove listeners? + override fun onDestroy() { + resetHighlightTap() + // TODO: remove listeners? + super.onDestroy() + } private fun load(params: PDFReaderParams) { // First, try to restore a previously created fragment. @@ -254,7 +259,9 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan clickedAnnotation: Annotation? ): Boolean { if (clickedAnnotation != null) { - showHighlightSelectionPopover(clickedAnnotation) + clickedHighlight = clickedAnnotation + clickedHighlightPosition = pagePosition + startActionMode(null, ActionMode.TYPE_FLOATING) } return super.onPageClick(document, pageIndex, event, pagePosition, clickedAnnotation) @@ -265,38 +272,6 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan super.onPageChanged(document, pageIndex) } - private fun showHighlightSelectionPopover(clickedAnnotation: Annotation) { - // TODO: anchor popover at exact position of tap (maybe add an empty view at tap loc and anchor to that?) - val popupMenu = PopupMenu(this, fragment.view, Gravity.CENTER, androidx.appcompat.R.attr.actionOverflowMenuStyle, 0) - - popupMenu.menuInflater.inflate(R.menu.pdf_highlight_selection_menu, popupMenu.menu) - - popupMenu.setOnMenuItemClickListener { item -> - when(item.itemId) { - R.id.annotate -> { - viewModel.annotationUnderNoteEdit = clickedAnnotation - // Disabled notes for now since we didn't implement on ios -// showAnnotationView() - } - R.id.delete -> { - viewModel.deleteHighlight(clickedAnnotation) - fragment.document?.annotationProvider?.removeAnnotationFromPage(clickedAnnotation) - } - R.id.copyPdfHighlight -> { - val omnivoreHighlight = clickedAnnotation.customData?.get("omnivoreHighlight") as? JSONObject - val quote = omnivoreHighlight?.get("quote") as? String - quote?.let { - val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager - val clip = ClipData.newPlainText(it, it) - clipboard.setPrimaryClip(clip) - } - } - } - true - } - popupMenu.show() - } - private fun tintDrawable(drawable: Drawable, tint: Int): Drawable { val tintedDrawable = DrawableCompat.wrap(drawable) DrawableCompat.setTint(tintedDrawable, tint) @@ -381,6 +356,88 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan ) } + var actionMode: ActionMode? = 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 { + actionMode = mode + mode.menuInflater.inflate(R.menu.pdf_highlight_selection_menu, menu) + return true + } + + // Called each time the action mode is shown. Always called after onCreateActionMode, but + // may be called multiple times if the mode is invalidated. + override fun onPrepareActionMode(mode: ActionMode, menu: Menu): Boolean { + return false // Return false if nothing is done + } + + // Called when the user selects a contextual menu item + override fun onActionItemClicked(mode: ActionMode, item: MenuItem): Boolean { + return when (item.itemId) { + R.id.annotate -> { + Log.d("pdf", "annotate button tapped") + viewModel.annotationUnderNoteEdit = clickedHighlight + showAnnotationView("") // TODO: grab initial text + true + } + R.id.delete -> { + Log.d("pdf", "remove button tapped") + clickedHighlight?.let { + viewModel.deleteHighlight(it) + fragment.document?.annotationProvider?.removeAnnotationFromPage(it) + } + resetHighlightTap() + true + } + R.id.copyPdfHighlight -> { + Log.d("pdf", "copy button tapped") + + val omnivoreHighlight = clickedHighlight?.customData?.get("omnivoreHighlight") as? JSONObject + val quote = omnivoreHighlight?.get("quote") as? String + quote?.let { + val clipboard = getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = ClipData.newPlainText(it, it) + clipboard.setPrimaryClip(clip) + } + resetHighlightTap() + true + } + else -> { + Log.d("pdf", "unrecognized action") + resetHighlightTap() + false + } + } + } + + // Called when the user exits the action mode + override fun onDestroyActionMode(mode: ActionMode) { + clickedHighlight = null + clickedHighlightPosition = null + } + + override fun onGetContentRect(mode: ActionMode?, view: View?, outRect: Rect?) { + clickedHighlightPosition?.let { + val xValue = it.x.toInt() + val yValue = it.y.toInt() + val rect = Rect(xValue, yValue, xValue, yValue) + outRect?.set(rect) + } + } + } + + private fun resetHighlightTap() { + actionMode?.finish() + actionMode = null + clickedHighlight = null + clickedHighlightPosition = null + } + + override fun startActionMode(callback: ActionMode.Callback?, type: Int): ActionMode? { + return super.startActionMode(actionModeCallback, type) + } + private fun showAnnotationView(initialText: String) { val annotationDialog = Dialog(this) annotationDialog.setContentView(R.layout.annotation_edit) @@ -390,12 +447,16 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan val confirmButton = annotationDialog.findViewById(R.id.confirmAnnotation) as Button confirmButton.setOnClickListener { - val newNoteText = + val newNoteText = textField.text + // TODO: persist new note + Log.d("pdf", "new annotation text: $newNoteText") + resetHighlightTap() annotationDialog.dismiss() } val cancelBtn = annotationDialog.findViewById(R.id.cancel) as Button cancelBtn.setOnClickListener { + resetHighlightTap() annotationDialog.dismiss() } diff --git a/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml b/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml index bf2dfd89d..b3952a828 100644 --- a/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml +++ b/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml @@ -1,15 +1,21 @@ - - - + + + + + + + + + diff --git a/android/Omnivore/app/src/main/res/values/strings.xml b/android/Omnivore/app/src/main/res/values/strings.xml index 7ffa365b9..f47c7b85c 100644 --- a/android/Omnivore/app/src/main/res/values/strings.xml +++ b/android/Omnivore/app/src/main/res/values/strings.xml @@ -11,4 +11,5 @@ Copy Note Copy + Note From 5b2c58d9559c8d12542217d7c3595b8474a7fb02 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 7 Dec 2022 09:54:42 -0800 Subject: [PATCH 2/5] update note on pdf annotation when confirm is tapped on note modal --- .../omnivore/omnivore/ui/reader/PDFReader.kt | 14 ++++++--- .../omnivore/ui/reader/PDFReaderViewModel.kt | 31 ++++++++++++++++++- .../res/menu/pdf_highlight_selection_menu.xml | 10 +++--- 3 files changed, 45 insertions(+), 10 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt index 1a94846be..504481ace 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt @@ -377,8 +377,10 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan return when (item.itemId) { R.id.annotate -> { Log.d("pdf", "annotate button tapped") - viewModel.annotationUnderNoteEdit = clickedHighlight - showAnnotationView("") // TODO: grab initial text + clickedHighlight?.let { + viewModel.annotationUnderNoteEdit = it + showAnnotationView(viewModel.pluckExistingNote(it) ?: "") + } true } R.id.delete -> { @@ -432,6 +434,7 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan actionMode = null clickedHighlight = null clickedHighlightPosition = null + viewModel.annotationUnderNoteEdit = null } override fun startActionMode(callback: ActionMode.Callback?, type: Int): ActionMode? { @@ -448,8 +451,11 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan confirmButton.setOnClickListener { val newNoteText = textField.text - // TODO: persist new note - Log.d("pdf", "new annotation text: $newNoteText") + + clickedHighlight?.let { highlight -> + viewModel.updateHighlightNote(highlight, newNoteText.toString()) + } + resetHighlightTap() annotationDialog.dismiss() } diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt index 20affa1f0..04eb40d1a 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt @@ -115,7 +115,7 @@ class PDFReaderViewModel @Inject constructor( if (overlapIds.isNotEmpty()) { val input = MergeHighlightInput( - annotation = Optional.presentIfNotNull(newAnnotation.contents), + annotation = Optional.Absent, // TODO: make sure we preserve note locally articleId = itemID, id = highlightID, overlapHighlightIdList = overlapIds, @@ -143,6 +143,19 @@ class PDFReaderViewModel @Inject constructor( } } + fun updateHighlightNote(annotation: Annotation, note: String) { + // Save the updated note locally + val omnivoreHighlight = annotation.customData?.get("omnivoreHighlight") as? JSONObject + omnivoreHighlight?.put("editedNote", note) + omnivoreHighlight?.let { + Log.d("pdf", "setting custom data: $omnivoreHighlight") + annotation.customData = JSONObject().put("omnivoreHighlight", it) + } + + // TODO: Sync update with data service + + } + fun deleteHighlight(annotation: Annotation) { val highlightID = pluckHighlightID(annotation) ?: return viewModelScope.launch { @@ -168,6 +181,22 @@ class PDFReaderViewModel @Inject constructor( return omnivoreHighlight?.get("id") as? String } + fun pluckExistingNote(annotation: Annotation): String? { + val omnivoreHighlight = annotation.customData?.opt("omnivoreHighlight") as? JSONObject ?: return null + + val editedNote = omnivoreHighlight.opt("editedNote") as? String + if (editedNote != null) { return editedNote } + + val shortID = omnivoreHighlight.get("shortId") as? String ?: return null + + pdfReaderParamsLiveData.value?.articleContent?.highlights?.let { + val matchingHighlight = it.firstOrNull { highlight -> highlight.shortId == shortID } + return matchingHighlight?.annotation + } + + return null + } + private fun hasOverlaps(leftAnnotation: Annotation, rightAnnotation: Annotation): Boolean { for (leftRect in (leftAnnotation as? HighlightAnnotation)?.rects ?: listOf()) { for (rightRect in (rightAnnotation as? HighlightAnnotation)?.rects ?: listOf()) { diff --git a/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml b/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml index b3952a828..ee3533c0a 100644 --- a/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml +++ b/android/Omnivore/app/src/main/res/menu/pdf_highlight_selection_menu.xml @@ -7,11 +7,11 @@ app:showAsAction="always"> - - - - - + + Date: Wed, 7 Dec 2022 10:14:03 -0800 Subject: [PATCH 3/5] send note updates to server --- .../omnivore/networking/HighlightMutations.kt | 25 +++++++++++++++++++ .../omnivore/ui/reader/PDFReaderViewModel.kt | 13 ++++++++-- .../omnivore/ui/reader/WebReaderViewModel.kt | 4 +++ 3 files changed, 40 insertions(+), 2 deletions(-) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt index 5329392a1..46f988ec4 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/networking/HighlightMutations.kt @@ -4,8 +4,10 @@ import android.util.Log import app.omnivore.omnivore.graphql.generated.CreateHighlightMutation import app.omnivore.omnivore.graphql.generated.DeleteHighlightMutation import app.omnivore.omnivore.graphql.generated.MergeHighlightMutation +import app.omnivore.omnivore.graphql.generated.UpdateHighlightMutation import app.omnivore.omnivore.graphql.generated.type.CreateHighlightInput import app.omnivore.omnivore.graphql.generated.type.MergeHighlightInput +import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput import app.omnivore.omnivore.models.Highlight import com.apollographql.apollo3.api.Optional import com.google.gson.Gson @@ -29,6 +31,18 @@ data class CreateHighlightParams( ) } +data class UpdateHighlightParams( + val highlightId: String?, + val `annotation`: String?, + val sharedAt: String?, +) { + fun asUpdateHighlightInput() = UpdateHighlightInput( + annotation = Optional.presentIfNotNull(`annotation`), + highlightId = highlightId ?: "", + sharedAt = Optional.presentIfNotNull(sharedAt) + ) +} + data class MergeHighlightsParams( val shortId: String?, val id: String?, @@ -74,6 +88,17 @@ suspend fun Networker.deleteHighlights(highlightIDs: List): Boolean { return !hasFailure } +suspend fun Networker.updateWebHighlight(jsonString: String): Boolean { + val input = Gson().fromJson(jsonString, UpdateHighlightParams::class.java).asUpdateHighlightInput() + return updateHighlight(input) +} + +suspend fun Networker.updateHighlight(input: UpdateHighlightInput): Boolean { + val result = authenticatedApolloClient().mutation(UpdateHighlightMutation(input)).execute() + Log.d("Network", "update highlight result: $result") + return result.data?.updateHighlight?.onUpdateHighlightSuccess?.highlight != null +} + suspend fun Networker.mergeWebHighlights(jsonString: String): Boolean { val input = Gson().fromJson(jsonString, MergeHighlightsParams::class.java).asMergeHighlightInput() return mergeHighlights(input) diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt index 04eb40d1a..4f38ae3ca 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReaderViewModel.kt @@ -9,6 +9,7 @@ import androidx.lifecycle.viewModelScope import app.omnivore.omnivore.DatastoreRepository import app.omnivore.omnivore.graphql.generated.type.CreateHighlightInput import app.omnivore.omnivore.graphql.generated.type.MergeHighlightInput +import app.omnivore.omnivore.graphql.generated.type.UpdateHighlightInput import app.omnivore.omnivore.models.LinkedItem import app.omnivore.omnivore.networking.* import com.apollographql.apollo3.api.Optional @@ -152,8 +153,16 @@ class PDFReaderViewModel @Inject constructor( annotation.customData = JSONObject().put("omnivoreHighlight", it) } - // TODO: Sync update with data service - + // Sync update with data service + viewModelScope.launch { + val input = UpdateHighlightInput( + annotation = Optional.presentIfNotNull(note), + highlightId = pluckHighlightID(annotation) ?: "", + sharedAt = Optional.Absent + ) + networker.updateHighlight(input) + Log.d("network", "updated $annotation") + } } fun deleteHighlight(annotation: Annotation) { 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 e1e693d56..57e1b72d3 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 @@ -77,6 +77,10 @@ class WebReaderViewModel @Inject constructor( } "updateHighlight" -> { Log.d("Loggo", "receive update highlight action: $jsonString") + viewModelScope.launch { + val isHighlightUpdateSynced = networker.updateWebHighlight(jsonString) + Log.d("Network", "isHighlightUpdateSynced = $isHighlightUpdateSynced") + } } "articleReadingProgress" -> { viewModelScope.launch { From fde9528996049ac59ed4520c5d00a3ed33427e65 Mon Sep 17 00:00:00 2001 From: Satindar Dhillon Date: Wed, 7 Dec 2022 11:04:12 -0800 Subject: [PATCH 4/5] use co pose annotation edit view in pdf reader --- .../omnivore/ui/reader/AnnotationEditView.kt | 35 +++++++++++++--- .../omnivore/omnivore/ui/reader/PDFReader.kt | 40 +++++++------------ .../src/main/res/layout/annotation_edit.xml | 24 ----------- 3 files changed, 44 insertions(+), 55 deletions(-) delete mode 100644 android/Omnivore/app/src/main/res/layout/annotation_edit.xml diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/AnnotationEditView.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/AnnotationEditView.kt index 417396930..3bd3a875d 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/AnnotationEditView.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/AnnotationEditView.kt @@ -1,5 +1,6 @@ package app.omnivore.omnivore.ui.reader +import android.content.DialogInterface import android.os.Bundle import android.view.LayoutInflater import android.view.View @@ -20,10 +21,24 @@ import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.platform.ViewCompositionStrategy import androidx.compose.ui.unit.dp -import androidx.fragment.app.Fragment +import androidx.fragment.app.DialogFragment import app.omnivore.omnivore.ui.theme.OmnivoreTheme -class AnnotationEditFragment : Fragment() { +class AnnotationEditFragment : DialogFragment() { + private var onSave: (String) -> Unit = {} + private var onCancel: () -> Unit = {} + private var initialAnnotation: String = "" + + fun configure( + initialAnnotation: String, + onSave: (String) -> Unit, + onCancel: () -> Unit, + ) { + this.initialAnnotation = initialAnnotation + this.onSave = onSave + this.onCancel = onCancel + } + override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, @@ -36,23 +51,29 @@ class AnnotationEditFragment : Fragment() { setContent { OmnivoreTheme { AnnotationEditView( - initialAnnotation = "Initial Annotation", - onSave = {}, - onCancel = {} + initialAnnotation, + onSave, + onCancel, + dismissAction = { dismiss() } ) } } } } + + override fun onDismiss(dialog: DialogInterface) { + onCancel() + super.onDismiss(dialog) + } } -// TODO: better layout and styling for this view @OptIn(ExperimentalMaterial3Api::class) @Composable fun AnnotationEditView( initialAnnotation: String, onSave: (String) -> Unit, onCancel: () -> Unit, + dismissAction: () -> Unit = {} ) { val annotation = remember { mutableStateOf(initialAnnotation) } val focusRequester = FocusRequester() @@ -71,6 +92,7 @@ fun AnnotationEditView( TextButton( onClick = { onCancel() + dismissAction() } ) { Text("Cancel") @@ -85,6 +107,7 @@ fun AnnotationEditView( TextButton( onClick = { onSave(annotation.value) + dismissAction() } ) { Text("Save") diff --git a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt index 504481ace..fc18d5c89 100644 --- a/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt +++ b/android/Omnivore/app/src/main/java/app/omnivore/omnivore/ui/reader/PDFReader.kt @@ -86,6 +86,7 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan } override fun onDestroy() { + actionMode?.finish() resetHighlightTap() // TODO: remove listeners? super.onDestroy() @@ -442,30 +443,19 @@ class PDFReaderActivity: AppCompatActivity(), DocumentListener, TextSelectionMan } private fun showAnnotationView(initialText: String) { - val annotationDialog = Dialog(this) - annotationDialog.setContentView(R.layout.annotation_edit) - - val textField = annotationDialog.findViewById(R.id.highlightNoteTextField) as EditText - textField.setText(initialText) - val confirmButton = annotationDialog.findViewById(R.id.confirmAnnotation) as Button - - confirmButton.setOnClickListener { - val newNoteText = textField.text - - clickedHighlight?.let { highlight -> - viewModel.updateHighlightNote(highlight, newNoteText.toString()) - } - - resetHighlightTap() - annotationDialog.dismiss() - } - - val cancelBtn = annotationDialog.findViewById(R.id.cancel) as Button - cancelBtn.setOnClickListener { - resetHighlightTap() - annotationDialog.dismiss() - } - - annotationDialog.show() + val annotationEditFragment = AnnotationEditFragment() + annotationEditFragment.configure( + onSave = { newNote -> + clickedHighlight?.let { highlight -> + viewModel.updateHighlightNote(highlight, newNote) + } + resetHighlightTap() + }, + onCancel = { + resetHighlightTap() + }, + initialAnnotation = initialText + ) + annotationEditFragment.show(fragment.childFragmentManager, null) } } diff --git a/android/Omnivore/app/src/main/res/layout/annotation_edit.xml b/android/Omnivore/app/src/main/res/layout/annotation_edit.xml deleted file mode 100644 index 3b7a0de18..000000000 --- a/android/Omnivore/app/src/main/res/layout/annotation_edit.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - -