Преглед на файлове

Merge branch 'add-event-hooks' into 'master'

Add event hooks

See merge request kdanandroid/pdf/pdfreaderreadermodule!34
Wayne Huang преди 5 години
родител
ревизия
ff3c558618
променени са 2 файла, в които са добавени 95 реда и са изтрити 7 реда
  1. 68 4
      src/main/java/com/kdanmobile/reader/ReaderActivity.kt
  2. 27 3
      src/main/java/com/kdanmobile/reader/ReaderViewModel.kt

+ 68 - 4
src/main/java/com/kdanmobile/reader/ReaderActivity.kt

@@ -72,6 +72,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
     open fun loadCurrentPageIndex(filename: String, defaultValue: Int): Int = 0
     open fun onOpenedFile() { /* do nothing */ }
     open fun onFilePathOrUriError(filePath: String?) { println("onFilePathOrUriError: $filePath") }
+    protected open fun onEvent(hookEvent: HookEvent) { /* do nothing */ }
 
     companion object {
         const val KEY_FILE_ABSOLUTE = "file_absolutepath"
@@ -208,6 +209,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
         viewModel.isPageInBookmarksLiveData.observe(this, Observer(this::onIsPageInBookmarksChanged))
         viewModel.isLeftToolbarOpenLiveData.observe(this, Observer(this::onLeftToolbarOpenStateChanged))
         viewModel.leftToolbarTypeLiveData.observe(this, Observer(this::onLeftToolbarTypeChanged))
+        viewModel.eventLiveData.observe(this , Observer(this::onEvent))
         isHidePdfPage = true
         applySetting()
 
@@ -677,6 +679,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
     }
 
     private fun onClickBookmark() {
+        onEvent(HookEvent.OnClickTopBookmarkBtn())
         viewModel.isPageInBookmarksLiveData.value?.let {
             if (!it) {
                 showAddBookmarkDialog()
@@ -871,17 +874,23 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
     }
 
     private fun setupBottomToolbar() {
-        ib_readerActivity_bottomToolbarMediaBox.setOnClickListener { mediaBoxView.show() }
+        ib_readerActivity_bottomToolbarMediaBox.setOnClickListener {
+            onEvent(HookEvent.OnClickBottomMediaBoxBtn())
+            mediaBoxView.show()
+        }
         ib_readerActivity_bottomToolbarViewAll.setOnClickListener {
+            onEvent(HookEvent.OnClickBottomThumbnailBtn())
             onClickBottomThumb1()
         }
         ib_readerActivity_bottomToolbarPrevious.setOnClickListener {
+            onEvent(HookEvent.OnClickBottomPreviousBtn())
             val handler = viewModel.pdfInfoHandler
             val pageIndex = handler.getCurrentPage()
             val previousPageIndex = Math.max(pageIndex - 1, 0)
             handler.goToCurrentPage(previousPageIndex)
         }
         ib_readerActivity_bottomToolbarNext.setOnClickListener {
+            onEvent(HookEvent.OnClickBottomNextBtn())
             val handler = viewModel.pdfInfoHandler
             val pageIndex = handler.getCurrentPage()
             val nextPageIndex = Math.min(pageIndex + 1, handler.getPdfPageCount() - 1)
@@ -967,8 +976,12 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
     private fun setupRightToolbar() {
         viewGroup_readerActivity_rightToolbar.setScroll(false)
         iv_readerActivity_highLight.apply {
-            setOnClickListener { viewModel.onClickHighlightBtn() }
+            setOnClickListener {
+                onEvent(HookEvent.OnClickHighlightBtn())
+                viewModel.onClickHighlightBtn()
+            }
             setOnLongClickListener { btn ->
+                onEvent(HookEvent.OnLongClickHighlightBtn())
                 viewModel.onLongClickHighlightBtn()
                 val context = this@ReaderActivity
                 AnnotationAttributeWindow(context, true).also { window ->
@@ -977,6 +990,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
                     }
                     window.annotationAttributeView.onChangeListener = object : AnnotationAttributeView.OnChangeListener {
                         override fun onChange(annotationAttributeView: AnnotationAttributeView) {
+                            onEvent(HookEvent.OnUserChangeHighlightPropertySuccess())
                             viewModel.setHighLightAttributes(annotationAttributeView.annotationAttribute)
                         }
                     }
@@ -994,8 +1008,12 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
             }
         }
         iv_readerActivity_strike.apply {
-            setOnClickListener { viewModel.onClickStrikeBtn() }
+            setOnClickListener {
+                onEvent(HookEvent.OnClickStrikeoutBtn())
+                viewModel.onClickStrikeBtn()
+            }
             setOnLongClickListener { btn ->
+                onEvent(HookEvent.OnLongClickStrikeoutBtn())
                 viewModel.onLongClickStrikeBtn()
                 val context = this@ReaderActivity
                 AnnotationAttributeWindow(context, true).also { window ->
@@ -1004,6 +1022,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
                     }
                     window.annotationAttributeView.onChangeListener = object : AnnotationAttributeView.OnChangeListener {
                         override fun onChange(annotationAttributeView: AnnotationAttributeView) {
+                            onEvent(HookEvent.OnUserChangeStrikeoutPropertySuccess())
                             viewModel.setStrikeOutAttributes(annotationAttributeView.annotationAttribute)
                         }
                     }
@@ -1021,8 +1040,12 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
             }
         }
         iv_readerActivity_underline.apply {
-            setOnClickListener { viewModel.onClickUnderlineBtn() }
+            setOnClickListener {
+                onEvent(HookEvent.OnClickUnderlineBtn())
+                viewModel.onClickUnderlineBtn()
+            }
             setOnLongClickListener { btn ->
+                onEvent(HookEvent.OnLongClickUnderlineBtn())
                 viewModel.onLongClickUnderlineBtn()
                 val context = this@ReaderActivity
                 AnnotationAttributeWindow(context, true).also { window ->
@@ -1031,6 +1054,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
                     }
                     window.annotationAttributeView.onChangeListener = object : AnnotationAttributeView.OnChangeListener {
                         override fun onChange(annotationAttributeView: AnnotationAttributeView) {
+                            onEvent(HookEvent.OnUserChangeUnderlinePropertySuccess())
                             viewModel.setUnderLineAttributes(annotationAttributeView.annotationAttribute)
                         }
                     }
@@ -1049,6 +1073,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
         }
         iv_readerActivity_ink.apply {
             setOnClickListener {
+                onEvent(HookEvent.OnClickInkBtn())
                 if (viewModel.annotationModeLiveData.value == ReaderViewModel.AnnotationMode.INK) {
                     AnimationUtil.hideViewAlpha(view_ink_menu)
                 } else {
@@ -1057,6 +1082,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
                 viewModel.onClickInkBtn()
             }
             setOnLongClickListener { btn ->
+                onEvent(HookEvent.OnLongClickInkBtn())
                 viewModel.onLongClickInkBtn()
                 val context = this@ReaderActivity
                 AnnotationAttributeWindow(context, false).also { window ->
@@ -1065,6 +1091,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
                     }
                     window.annotationAttributeView.onChangeListener = object : AnnotationAttributeView.OnChangeListener {
                         override fun onChange(annotationAttributeView: AnnotationAttributeView) {
+                            onEvent(HookEvent.OnUserChangeInkPropertySuccess())
                             viewModel.setInkAttributes(annotationAttributeView.inkAttribute)
                         }
                     }
@@ -1232,4 +1259,41 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
             }
         }
     }
+
+    private fun onEvent(event: ReaderViewModel.Event?) {
+        if (event == null) return
+        when (event) {
+            is ReaderViewModel.Event.OnFinishedHighlight -> HookEvent.OnFinishedHighlight()
+            is ReaderViewModel.Event.OnFinishedStrikeout -> HookEvent.OnFinishedStrikeout()
+            is ReaderViewModel.Event.OnFinishedUnderLine -> HookEvent.OnFinishedUnderline()
+            is ReaderViewModel.Event.OnFinishedInk -> HookEvent.OnFinishedInk()
+        }.also {
+            onEvent(it)
+        }
+        viewModel.onEventConsumed(event)
+    }
+
+    protected sealed class HookEvent {
+        class OnClickTopBookmarkBtn : HookEvent()
+        class OnClickBottomPreviousBtn : HookEvent()
+        class OnClickBottomNextBtn : HookEvent()
+        class OnClickBottomMediaBoxBtn : HookEvent()
+        class OnClickBottomThumbnailBtn : HookEvent()
+        class OnClickHighlightBtn : HookEvent()
+        class OnClickStrikeoutBtn : HookEvent()
+        class OnClickUnderlineBtn : HookEvent()
+        class OnClickInkBtn : HookEvent()
+        class OnLongClickHighlightBtn : HookEvent()
+        class OnLongClickStrikeoutBtn : HookEvent()
+        class OnLongClickUnderlineBtn : HookEvent()
+        class OnLongClickInkBtn : HookEvent()
+        class OnFinishedHighlight : HookEvent()
+        class OnFinishedStrikeout : HookEvent()
+        class OnFinishedUnderline : HookEvent()
+        class OnFinishedInk : HookEvent()
+        class OnUserChangeHighlightPropertySuccess : HookEvent()
+        class OnUserChangeStrikeoutPropertySuccess : HookEvent()
+        class OnUserChangeUnderlinePropertySuccess : HookEvent()
+        class OnUserChangeInkPropertySuccess : HookEvent()
+    }
 }

+ 27 - 3
src/main/java/com/kdanmobile/reader/ReaderViewModel.kt

@@ -18,10 +18,14 @@ import com.kdanmobile.kmpdfkit.manager.controller.*
 import com.kdanmobile.kmpdfkit.manager.listener.KMPDFAddAnnotCallback
 import com.kdanmobile.kmpdfkit.manager.listener.KMPDFAnnotEditModeChangeListener
 import com.kdanmobile.kmpdfkit.manager.listener.KMPDFClickLinkCallback
-import com.kdanmobile.kmpdfkit.pdfcommon.*
+import com.kdanmobile.kmpdfkit.pdfcommon.KMPDFReaderView
+import com.kdanmobile.kmpdfkit.pdfcommon.PDFInfo
+import com.kdanmobile.kmpdfkit.pdfcommon.ReaderView
 import com.kdanmobile.reader.annotationattribute.AnnotationAttribute
 import com.kdanmobile.reader.annotationattribute.Brush
 import com.kdanmobile.reader.annotationattribute.InkAttribute
+import com.kdanmobile.reader.event.EventBroadcaster
+import com.kdanmobile.reader.event.EventManager
 import com.kdanmobile.reader.screen.contextmenu.MyKMPDFContextMenuCallback
 import com.kdanmobile.reader.screen.contextmenu.TextBoxContextMenuActionListener
 import com.kdanmobile.reader.screen.data.ShapeAttribute
@@ -33,7 +37,12 @@ import java.io.File
 import java.util.*
 import kotlin.collections.ArrayList
 
-class ReaderViewModel(private val readerModelManager: ReaderModelManager, val uri: Uri, private val pdfSdkLicense: String, private val pdfSdkRsaMsg: String) : ViewModel() {
+class ReaderViewModel(
+        private val readerModelManager: ReaderModelManager, val uri: Uri,
+        private val pdfSdkLicense: String,
+        private val pdfSdkRsaMsg: String,
+        private val eventManager: EventManager<Event> = EventManager()
+) : ViewModel(), EventBroadcaster<ReaderViewModel.Event> by eventManager {
 
     interface OnClickLinkListener {
         fun onClickWebsiteLink(url: String): Boolean
@@ -41,6 +50,13 @@ class ReaderViewModel(private val readerModelManager: ReaderModelManager, val ur
         fun onClickEmailLink(url: String): Boolean
     }
 
+    sealed class Event {
+        class OnFinishedUnderLine : Event()
+        class OnFinishedHighlight : Event()
+        class OnFinishedStrikeout : Event()
+        class OnFinishedInk : Event()
+    }
+
     enum class ViewDirection(val mode: Config.PDFViewMode) {
         VERTICAL_SINGLE_PAGE_CONTINUES(Config.PDFViewMode.VERTICAL_SINGLE_PAGE_CONTINUES),
         VERTICAL_SINGLE_PAGE(Config.PDFViewMode.VERTICAL_SINGLE_PAGE),
@@ -428,7 +444,15 @@ class ReaderViewModel(private val readerModelManager: ReaderModelManager, val ur
         kmpdfFactory?.kmpdfAddAnnotCallback = object : KMPDFAddAnnotCallback {
 
             override fun onSaveAnnotFinished(type: Annotation.Type, result: Boolean, message: String) {
-                println("KMPDFAddAnnotCallback::onSaveAnnotFinished")
+                when (type) {
+                    Annotation.Type.INK -> Event.OnFinishedInk()
+                    Annotation.Type.HIGHLIGHT -> Event.OnFinishedHighlight()
+                    Annotation.Type.UNDERLINE -> Event.OnFinishedUnderLine()
+                    Annotation.Type.STRIKEOUT -> Event.OnFinishedStrikeout()
+                    else -> null
+                }?.also {
+                    eventManager.send(it)
+                }
             }
 
             override fun onAttachAnnotWidgetFinished(type: Annotation.Type) {