ReaderViewModel.kt 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702
  1. package com.kdanmobile.reader
  2. import android.arch.lifecycle.LiveData
  3. import android.arch.lifecycle.MutableLiveData
  4. import android.arch.lifecycle.ViewModel
  5. import android.content.Context
  6. import android.graphics.Bitmap
  7. import android.graphics.Color
  8. import android.graphics.RectF
  9. import android.net.Uri
  10. import com.kdanmobile.kmpdfkit.annotation.Annotation
  11. import com.kdanmobile.kmpdfkit.annotation.bean.*
  12. import com.kdanmobile.kmpdfkit.contextmenu.KMPDFMenuItem
  13. import com.kdanmobile.kmpdfkit.contextmenu.MenuItemCallback
  14. import com.kdanmobile.kmpdfkit.globaldata.AnnotConfig
  15. import com.kdanmobile.kmpdfkit.globaldata.Config
  16. import com.kdanmobile.kmpdfkit.globaldata.KMPDFAnnotEditMode
  17. import com.kdanmobile.kmpdfkit.manager.KMPDFFactory
  18. import com.kdanmobile.kmpdfkit.manager.controller.*
  19. import com.kdanmobile.kmpdfkit.manager.listener.KMPDFAddAnnotCallback
  20. import com.kdanmobile.kmpdfkit.manager.listener.KMPDFAnnotEditModeChangeListener
  21. import com.kdanmobile.kmpdfkit.manager.listener.KMPDFErrorMessageCallback
  22. import com.kdanmobile.kmpdfkit.pdfcommon.*
  23. import com.kdanmobile.reader.annotationattribute.AnnotationAttribute
  24. import com.kdanmobile.reader.annotationattribute.Brush
  25. import com.kdanmobile.reader.annotationattribute.InkAttribute
  26. import com.kdanmobile.reader.screen.contextmenu.TextBoxContextMenuActionListener
  27. import com.kdanmobile.reader.screen.data.ShapeAttribute
  28. import com.kdanmobile.reader.screen.data.SignatureAttribute
  29. import com.kdanmobile.reader.screen.data.StampAttribute
  30. import com.kdanmobile.reader.screen.data.TextBoxAttribute
  31. import com.kdanmobile.reader.screen.handler.*
  32. import java.io.File
  33. import java.util.*
  34. import kotlin.collections.ArrayList
  35. class ReaderViewModel(private val pdfSdkLicense: String, private val pdfSdkRsaMsg: String) : ViewModel() {
  36. enum class ViewDirection(val mode: Config.PDFViewMode) {
  37. VerticalSinglePageContinues(Config.PDFViewMode.VERTICAL_SINGLE_PAGE_CONTINUES),
  38. VerticalSinglePage(Config.PDFViewMode.VERTICAL_SINGLE_PAGE),
  39. HorizontalSinglePage(Config.PDFViewMode.HORIZONTAL_SINGLE_PAGE)
  40. }
  41. enum class ReadMode(val mode: Config.ReadMode) {
  42. READ_MODE_DAY(Config.ReadMode.READ_MODE_DAY),
  43. READ_MODE_NIGHT(Config.ReadMode.READ_MODE_NIGHT),
  44. READ_MODE_SOFT(Config.ReadMode.READ_MODE_SOFT),
  45. USER_DEFINED(Config.ReadMode.USER_DEFINED)
  46. }
  47. enum class AnnotationMode {
  48. None,
  49. Highlight,
  50. Strike,
  51. Underline,
  52. Ink,
  53. }
  54. companion object {
  55. val DEFAULT_HIGHLIGHT_ATTR = AnnotationAttribute(Color.parseColor("#ffdc1b"), 127)
  56. val DEFAULT_STRIKE_ATTR = AnnotationAttribute(Color.parseColor("#57d214"), 255)
  57. val DEFAULT_UNDERLINE_ATTR = AnnotationAttribute(Color.parseColor("#296dd2"), 255)
  58. val DEFAULT_INK_ATTR = InkAttribute(Color.parseColor("#dd0202"), 255, 1f, Brush.Fountain)
  59. }
  60. var file: File? = null
  61. private set
  62. val pdfInfo: PDFInfo?
  63. get() {
  64. return kmpdfDocumentController?.pdfInfo
  65. }
  66. val isPasswordProtected: Boolean
  67. get() {
  68. return kmpdfFactory?.needPassWord() ?: false
  69. }
  70. var viewDirection = ViewDirection.VerticalSinglePageContinues
  71. set(value) {
  72. field = value
  73. updateViewDirection()
  74. }
  75. var readMode = ReadMode.READ_MODE_DAY
  76. set(value) {
  77. field = value
  78. updateReadMode()
  79. }
  80. var isCrop = false
  81. set(value) {
  82. field = value
  83. updateCrop()
  84. }
  85. val highLightAttributeLiveData = MutableLiveData<AnnotationAttribute>().apply { value = DEFAULT_HIGHLIGHT_ATTR }
  86. val strikeAttributeLiveData = MutableLiveData<AnnotationAttribute>().apply { value = DEFAULT_STRIKE_ATTR }
  87. var underLineAttributeLiveData = MutableLiveData<AnnotationAttribute>().apply { value = DEFAULT_UNDERLINE_ATTR }
  88. var inkAttributeLiveData = MutableLiveData<InkAttribute>().apply { value = DEFAULT_INK_ATTR }
  89. private var isVerified = false
  90. private val kmpdfFactory: KMPDFFactory?
  91. get() = ReaderModel.kmpdfFactory
  92. private val kmpdfDocumentController: KMPDFDocumentController?
  93. get() = ReaderModel.kmpdfDocumentController
  94. val isOpenedFileLiveData = MutableLiveData<Boolean>().apply { value = false }
  95. val fileNameLiveData = MutableLiveData<String>()
  96. val annotationModeLiveData = MutableLiveData<AnnotationMode>().apply { value = AnnotationMode.None }
  97. val annotationEitModeLiveData = MutableLiveData<KMPDFAnnotEditMode.Mode>().apply { value = KMPDFAnnotEditMode.Mode.NULL }
  98. var isCopyModeLiveData = MutableLiveData<Boolean>().apply { value = false }
  99. val pageIndexLiveData: LiveData<Int>
  100. get() = mPageIndexLiveData
  101. val isPageInBookmarksLiveData: LiveData<Boolean>
  102. get() = mIsPageInBookmarksLiveData
  103. private val mPageIndexLiveData = MutableLiveData<Int>().apply { value = 0 }
  104. private val mIsPageInBookmarksLiveData = MutableLiveData<Boolean>().apply { value = false }
  105. enum class LeftToolbarType {
  106. NONE, THUMBNAIL, BOOKMARK, OUTLINE, SEARCH
  107. }
  108. val leftToolbarTypeLiveData: LiveData<LeftToolbarType>
  109. get() = mLeftToolbarTypeLiveData
  110. private val mLeftToolbarTypeLiveData = MutableLiveData<LeftToolbarType>().apply { value = LeftToolbarType.NONE }
  111. val isLeftToolbarOpenLiveData: LiveData<Boolean>
  112. get() = mIsLeftToolbarOpenLiveData
  113. private val mIsLeftToolbarOpenLiveData = MutableLiveData<Boolean>().apply { value = false }
  114. fun setLeftToolbarType(leftToolbarType: LeftToolbarType) {
  115. mLeftToolbarTypeLiveData.postValue(leftToolbarType)
  116. }
  117. fun setIsLeftToolbarOpen(open: Boolean) {
  118. mIsLeftToolbarOpenLiveData.postValue(open)
  119. }
  120. val password: String
  121. get() = ReaderModel.password
  122. @JvmOverloads
  123. fun openPdfFile(context: Context, uri: Uri, password: String, onRequestPassword: Runnable, type: String? = null): Boolean {
  124. if (!isVerified) {
  125. if (!verifyLicense(context)) {
  126. return false
  127. }
  128. isVerified = true
  129. }
  130. return openPdfFIleImp(context, uri, password, onRequestPassword, type).apply{
  131. isOpenedFileLiveData.postValue(this)
  132. }
  133. }
  134. private fun openPdfFIleImp(context: Context, uri: Uri, password: String, requestPassword: Runnable, type: String?): Boolean {
  135. file = File(uri.path)
  136. if (null == kmpdfFactory) {
  137. val factory = KMPDFFactory.open(context, uri, type) ?: return false
  138. factory.also {
  139. fileNameLiveData.postValue(it.fileName)
  140. if (it.needPassWord()) {
  141. if (!it.authenticatePassword(password)) {
  142. requestPassword.run()
  143. return false
  144. }
  145. }
  146. if (it.init()) {
  147. ReaderModel.initKMPDFFactory(factory, uri.path, password)
  148. return true
  149. }
  150. return false
  151. }
  152. }
  153. return true
  154. }
  155. override fun onCleared() {
  156. ReaderModel.onViewModelCleared(this)
  157. super.onCleared()
  158. }
  159. fun copySelection(): Boolean {
  160. return kmpdfDocumentController?.copySelection() ?: false
  161. }
  162. fun onClickCopyBtn() {
  163. if (annotationModeLiveData.value != AnnotationMode.None) stopAnnotationMode()
  164. if (isCopyModeLiveData.value == true) {
  165. stopCopyTextMode()
  166. } else {
  167. startCopyTextMode()
  168. }
  169. }
  170. fun onClickHighlightBtn() {
  171. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  172. if (annotationModeLiveData.value == AnnotationMode.Highlight) {
  173. stopAnnotationMode()
  174. } else {
  175. startHighLightEditMode()
  176. }
  177. }
  178. fun onLongClickHighlightBtn() {
  179. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  180. startHighLightEditMode()
  181. }
  182. fun onClickStrikeBtn() {
  183. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  184. if (annotationModeLiveData.value == AnnotationMode.Strike) {
  185. stopAnnotationMode()
  186. } else {
  187. startStrikeOutEditMode()
  188. }
  189. }
  190. fun onLongClickStrikeBtn() {
  191. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  192. startStrikeOutEditMode()
  193. }
  194. fun onClickUnderlineBtn() {
  195. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  196. if (annotationModeLiveData.value == AnnotationMode.Underline) {
  197. stopAnnotationMode()
  198. } else {
  199. startUnderLineEditMode()
  200. }
  201. }
  202. fun onLongClickUnderlineBtn() {
  203. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  204. startUnderLineEditMode()
  205. }
  206. fun onClickInkBtn() {
  207. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  208. if (annotationModeLiveData.value == AnnotationMode.Ink) {
  209. stopAnnotationMode()
  210. } else {
  211. startInkEditMode()
  212. }
  213. }
  214. fun onLongClickInkBtn() {
  215. if (isCopyModeLiveData.value == true) stopCopyTextMode()
  216. startInkEditMode()
  217. }
  218. private fun startCopyTextMode() {
  219. kmpdfDocumentController?.startCopyText()
  220. isCopyModeLiveData.postValue(true)
  221. }
  222. private fun stopCopyTextMode() {
  223. kmpdfDocumentController?.stopCopyText()
  224. isCopyModeLiveData.postValue(false)
  225. }
  226. fun setHighLightAttributes(annotationAttribute: AnnotationAttribute) {
  227. highLightAttributeLiveData.postValue(annotationAttribute)
  228. setHighLightAttributesImp(annotationAttribute)
  229. }
  230. private fun setHighLightAttributesImp(annotationAttribute: AnnotationAttribute) {
  231. kmpdfFactory?.setAnnotationAttribute(KMPDFHighlightAnnotationBean("", annotationAttribute.color, annotationAttribute.alpha))
  232. kmpdfFactory?.annotConfig?.apply {
  233. markerPenColor_hightlight = annotationAttribute.color
  234. markerPenAlpha_hightlight = annotationAttribute.alpha
  235. }
  236. }
  237. private fun startHighLightEditMode() {
  238. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.HIGH_LIGHT)
  239. annotationModeLiveData.postValue(AnnotationMode.Highlight)
  240. }
  241. fun setStrikeOutAttributes(annotationAttribute: AnnotationAttribute) {
  242. strikeAttributeLiveData.postValue(annotationAttribute)
  243. setStrikeOutAttributesImp(annotationAttribute)
  244. }
  245. private fun setStrikeOutAttributesImp(annotationAttribute: AnnotationAttribute) {
  246. kmpdfFactory?.setAnnotationAttribute(KMPDFStrikeoutAnnotationBean("",annotationAttribute.color, annotationAttribute.alpha))
  247. kmpdfFactory?.annotConfig?.apply {
  248. markerPenColor_strikeout = annotationAttribute.color
  249. markerPenAlpha_strikeout = annotationAttribute.alpha
  250. }
  251. }
  252. private fun startStrikeOutEditMode() {
  253. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.STRIKE_OUT)
  254. annotationModeLiveData.postValue(AnnotationMode.Strike)
  255. }
  256. fun setUnderLineAttributes(annotationAttribute: AnnotationAttribute) {
  257. underLineAttributeLiveData.postValue(annotationAttribute)
  258. setUnderLineAttributesImp(annotationAttribute)
  259. }
  260. private fun setUnderLineAttributesImp(annotationAttribute: AnnotationAttribute) {
  261. kmpdfFactory?.setAnnotationAttribute(KMPDFUnderlineAnnotationBean("", annotationAttribute.color, annotationAttribute.alpha))
  262. kmpdfFactory?.annotConfig?.apply {
  263. markerPenColor_underline = annotationAttribute.color
  264. markerPenAlpha_underline = annotationAttribute.alpha
  265. }
  266. }
  267. private fun startUnderLineEditMode() {
  268. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.UNDER_LINE)
  269. annotationModeLiveData.postValue(AnnotationMode.Underline)
  270. }
  271. fun setInkAttributes(inkAttribute: InkAttribute) {
  272. inkAttributeLiveData.postValue(inkAttribute)
  273. setInkAttributesImp(inkAttribute)
  274. }
  275. fun setInkAttributesImp(inkAttribute: InkAttribute) {
  276. kmpdfFactory?.apply {
  277. setAnnotationAttribute(KMPDFInkAnnotationBean("", inkAttribute.color, inkAttribute.width, inkAttribute.alpha))
  278. annotConfig?.apply {
  279. markerPenColor_ink = inkAttribute.color
  280. markerPenAlpha_ink = inkAttribute.alpha
  281. markerPenSize_ink = inkAttribute.width
  282. }
  283. }
  284. }
  285. private fun startInkEditMode() {
  286. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.INK)
  287. annotationModeLiveData.postValue(AnnotationMode.Ink)
  288. }
  289. fun stopAnnotationMode() {
  290. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.NULL)
  291. annotationModeLiveData.postValue(AnnotationMode.None)
  292. }
  293. fun setReaderView(readerView: KMPDFReaderView) {
  294. val isFirst = kmpdfFactory?.readerView == null
  295. kmpdfFactory?.readerView = readerView
  296. ReaderModel.initKMPDFDocumentController()
  297. /** init annotation color **/
  298. highLightAttributeLiveData.value?.also { setHighLightAttributesImp(it) }
  299. strikeAttributeLiveData.value?.also { setStrikeOutAttributesImp(it) }
  300. underLineAttributeLiveData.value?.also { setUnderLineAttributesImp(it) }
  301. inkAttributeLiveData.value?.also { setInkAttributesImp(it) }
  302. updateViewDirection()
  303. kmpdfFactory?.kmpdfAddAnnotCallback = object : KMPDFAddAnnotCallback {
  304. override fun onSaveAnnotFinished(type: Annotation.Type, result: Boolean, message: String) {
  305. println("KMPDFAddAnnotCallback::onSaveAnnotFinished")
  306. }
  307. override fun onAttachAnnotWidgetFinished(type: Annotation.Type) {
  308. println("KMPDFAddAnnotCallback::onAttachAnnotWidgetFinished")
  309. val mode = when (type) {
  310. Annotation.Type.FREETEXT -> KMPDFAnnotEditMode.Mode.FREETEXT_MODIFY
  311. Annotation.Type.STAMP -> KMPDFAnnotEditMode.Mode.STAMP_MODIFY
  312. Annotation.Type.CIRCLE, Annotation.Type.SQUARE, Annotation.Type.LINE -> KMPDFAnnotEditMode.Mode.SHAPE_MODIFY
  313. else -> KMPDFAnnotEditMode.Mode.NULL
  314. }
  315. if (mode != KMPDFAnnotEditMode.Mode.NULL) {
  316. kmpdfFactory?.kmpdfAnnotEditMode?.pdfAnnotEditMode = mode
  317. }
  318. }
  319. }
  320. kmpdfFactory?.kmpdfAnnotEditModeChangeListener = KMPDFAnnotEditModeChangeListener {
  321. annotationEitModeLiveData.postValue(it)
  322. }
  323. setLongPressContextMenuActions()
  324. setSignatureContextMenuActions()
  325. setStampContextMenuActions()
  326. setShapeContextMenuActions()
  327. setInkMenuActions()
  328. setMarkerUpMenuActions()
  329. if (!isFirst) {
  330. restoreStateBeforeDestroy()
  331. }
  332. }
  333. private fun setLongPressContextMenuActions() {
  334. val item = KMPDFMenuItem()
  335. item.annotType = KMPDFMenuItem.AnnotType.LONG_PRESS
  336. item.menu_resId = R.menu.context_menu_longpress
  337. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  338. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.LONGCLICK) as KMPDFLongPressCreateAnnotController).longPress_Paste()
  339. annotationEitModeLiveData.postValue(KMPDFAnnotEditMode.Mode.FREETEXT_MODIFY)
  340. return@MenuItemCallback true
  341. })
  342. kmpdfFactory?.setAnnotationContextMenu(item)
  343. }
  344. private fun setSignatureContextMenuActions() {
  345. val item = KMPDFMenuItem()
  346. item.annotType = KMPDFMenuItem.AnnotType.SIGNATURE
  347. item.menu_resId = R.menu.context_menu_signature
  348. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  349. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.SIGNATURE) as KMPDFSignatureController).deleteSignatureAnnotView()
  350. return@MenuItemCallback true
  351. })
  352. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  353. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.SIGNATURE) as KMPDFSignatureController).saveSignatureAnnot()
  354. return@MenuItemCallback true
  355. })
  356. kmpdfFactory?.setAnnotationContextMenu(item)
  357. }
  358. private fun setStampContextMenuActions() {
  359. val item = KMPDFMenuItem()
  360. item.annotType = KMPDFMenuItem.AnnotType.STAMP
  361. item.menu_resId = R.menu.context_menu_normal
  362. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  363. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.STAMP) as KMPDFStampController).deleteStampAnnotView()
  364. return@MenuItemCallback true
  365. })
  366. kmpdfFactory?.setAnnotationContextMenu(item)
  367. }
  368. private fun setShapeContextMenuActions() {
  369. val item = KMPDFMenuItem()
  370. item.annotType = KMPDFMenuItem.AnnotType.LINE
  371. item.menu_resId = R.menu.context_menu_normal
  372. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  373. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.SHAPE) as KMPDFShapeAnnotController).deleteShapeAnnotView()
  374. return@MenuItemCallback true
  375. })
  376. kmpdfFactory?.setAnnotationContextMenu(item)
  377. }
  378. private fun setInkMenuActions() {
  379. val item = KMPDFMenuItem()
  380. item.annotType = KMPDFMenuItem.AnnotType.INK
  381. item.menu_resId = R.menu.context_menu_normal
  382. item.menuCallbacks.add(MenuItemCallback { _, _ ->
  383. kmpdfFactory?.let {
  384. val controller = it.getController(KMPDFFactory.ControllerType.INK) as KMPDFInkController
  385. controller.deleteInkAnnotView()
  386. return@MenuItemCallback true
  387. }
  388. return@MenuItemCallback false
  389. })
  390. kmpdfFactory?.setAnnotationContextMenu(item)
  391. }
  392. private fun setMarkerUpMenuActions() {
  393. val item = KMPDFMenuItem()
  394. /** Just set HIGH_LIGHT then highlight, strike, underline will be triggered. **/
  395. /** WTF !!!!!!!!!!! **/
  396. item.annotType = KMPDFMenuItem.AnnotType.HIGH_LIGHT
  397. item.menu_resId = R.menu.context_menu_normal
  398. item.menuCallbacks.add(MenuItemCallback { _, _ ->
  399. kmpdfFactory?.let {
  400. val controller = it.getController(KMPDFFactory.ControllerType.MARKER_UP) as KMPDFMarkupController
  401. controller.deleteMarkupAnnotView()
  402. return@MenuItemCallback true
  403. }
  404. return@MenuItemCallback false
  405. })
  406. kmpdfFactory?.setAnnotationContextMenu(item)
  407. }
  408. fun setTextBoxContextMenuActions(listener: TextBoxContextMenuActionListener) {
  409. val item = KMPDFMenuItem()
  410. item.annotType = KMPDFMenuItem.AnnotType.FREETEXT
  411. item.menu_resId = R.menu.context_menu_textbox
  412. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  413. return@MenuItemCallback listener.onDelete()
  414. })
  415. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  416. return@MenuItemCallback listener.onEditStyle()
  417. })
  418. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  419. return@MenuItemCallback listener.onEditText()
  420. })
  421. item.menuCallbacks.add(MenuItemCallback { view, annotType ->
  422. return@MenuItemCallback listener.onCopy()
  423. })
  424. kmpdfFactory?.setAnnotationContextMenu(item)
  425. }
  426. private fun restoreStateBeforeDestroy() {
  427. if (isCopyModeLiveData.value == true) {
  428. startCopyTextMode()
  429. } else {
  430. annotationModeLiveData.value?.also {
  431. val annotationEditMode = when (it) {
  432. AnnotationMode.None -> KMPDFAnnotationBean.AnnotationType.NULL
  433. AnnotationMode.Highlight -> KMPDFAnnotationBean.AnnotationType.HIGH_LIGHT
  434. AnnotationMode.Strike -> KMPDFAnnotationBean.AnnotationType.STRIKE_OUT
  435. AnnotationMode.Underline -> KMPDFAnnotationBean.AnnotationType.UNDER_LINE
  436. AnnotationMode.Ink -> KMPDFAnnotationBean.AnnotationType.INK
  437. }
  438. kmpdfFactory?.setAnnotationEditMode(annotationEditMode)
  439. annotationModeLiveData.postValue(it)
  440. }
  441. }
  442. }
  443. fun saveModifyingAnnotation() {
  444. kmpdfDocumentController?.saveModifingAnnot()
  445. }
  446. fun clearSelection() {
  447. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.NULL)
  448. kmpdfFactory?.kmpdfAnnotEditMode?.pdfAnnotEditMode = KMPDFAnnotEditMode.Mode.NULL
  449. annotationEitModeLiveData.postValue(KMPDFAnnotEditMode.Mode.NULL)
  450. }
  451. fun deleteSelectedTextBox() {
  452. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.FREETEXT) as KMPDFFreeTextController).deleteFreeTextAnnotView()
  453. }
  454. fun editSelectedTextBoxStyle() {
  455. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.FREETEXT) as KMPDFFreeTextController).setCurrentFreeTextViewEditMode(0)
  456. }
  457. fun editSelectedTextBoxText() {
  458. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.FREETEXT) as KMPDFFreeTextController).setCurrentFreeTextViewEditMode(1)
  459. }
  460. fun copySelectedTextBox() {
  461. (kmpdfFactory?.getController(KMPDFFactory.ControllerType.FREETEXT) as KMPDFFreeTextController).copyFreeTextContent()
  462. }
  463. fun setPageIndex(pageIndex: Int){
  464. mPageIndexLiveData.value = pageIndex
  465. }
  466. fun addBookmark(title: String) {
  467. pageIndexLiveData.value?.let {
  468. kmpdfDocumentController?.addBookmark(title, it)
  469. setBookmarkDisplay(it)
  470. }
  471. }
  472. fun deleteBookmark() {
  473. pageIndexLiveData.value?.let {
  474. kmpdfDocumentController?.deleteBookmarks(it)
  475. setBookmarkDisplay(it)
  476. }
  477. }
  478. fun setBookmarkDisplay(pageIndex: Int) {
  479. kmpdfDocumentController?.let {
  480. var isPageInBookmarks = false
  481. it.bookmarks?.let {
  482. for (bookmark in it) {
  483. if (bookmark.pageNum == pageIndex) {
  484. isPageInBookmarks = true
  485. break
  486. }
  487. }
  488. }
  489. mIsPageInBookmarksLiveData.value = isPageInBookmarks
  490. }
  491. }
  492. fun temporarySave() {
  493. kmpdfDocumentController?.temporarySave()
  494. }
  495. private fun verifyLicense(context: Context): Boolean {
  496. val errorCode = KMPDFFactory.verifyLicense(context, pdfSdkLicense, pdfSdkRsaMsg)
  497. return errorCode == 0
  498. }
  499. private fun updateViewDirection() {
  500. kmpdfDocumentController?.pdfViewMode = viewDirection.mode
  501. kmpdfDocumentController?.refresh(false)
  502. }
  503. private fun updateReadMode() {
  504. kmpdfDocumentController?.readMode = readMode.mode
  505. kmpdfDocumentController?.refresh(false)
  506. }
  507. private fun updateCrop() {
  508. kmpdfDocumentController?.apply {
  509. cropMode = isCrop
  510. refresh(false)
  511. }
  512. }
  513. fun getPageText(pageIndex: Int): List<String> {
  514. val dc = kmpdfDocumentController ?: return Collections.emptyList()
  515. val lines = ArrayList<String>()
  516. dc.textLines(pageIndex).forEach {
  517. val s = StringBuilder()
  518. it.forEach { textWord ->
  519. s.append(textWord.w)
  520. s.append(" ")
  521. }
  522. lines.add(s.toString())
  523. }
  524. return lines
  525. }
  526. fun setTextBoxAttribute(attr: TextBoxAttribute, modify: Boolean = false) {
  527. val kmpdfFreetextAnnotationBean = KMPDFFreetextAnnotationBean("", attr.textColor, attr.textSize, 255, "Courier", attr.isBold, attr.isItalic)
  528. kmpdfFactory?.setAnnotationAttribute(kmpdfFreetextAnnotationBean)
  529. if (!modify) {
  530. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.FREETEXT)
  531. }
  532. }
  533. fun setSignatureAttribute(attr: SignatureAttribute) {
  534. val kmpdfSignatureAnnotationBean = KMPDFSignatureAnnotationBean("", attr.path, KMPDFSignatureController.OnSignImageCreateListener {
  535. println("onSignImageCreated")
  536. })
  537. kmpdfFactory?.setAnnotationAttribute(kmpdfSignatureAnnotationBean)
  538. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.SIGNATURE)
  539. }
  540. fun setStampAttribute(attr: StampAttribute) {
  541. val kmpdfStampAnnotationBean = when (attr.isStandardStamp()) {
  542. true -> KMPDFStampAnnotationBean("", KMPDFStampAnnotationBean.StampType.STANDARD, KMPDFStampAnnotationBean.StandardStamp(attr.resId))
  543. false -> KMPDFStampAnnotationBean("", KMPDFStampAnnotationBean.StampType.TEXT, KMPDFStampAnnotationBean.TextStamp(attr.config))
  544. }
  545. kmpdfFactory?.setAnnotationAttribute(kmpdfStampAnnotationBean)
  546. kmpdfFactory?.setAnnotationEditMode(KMPDFAnnotationBean.AnnotationType.STAMP)
  547. }
  548. fun setShapeAttribute(attr: ShapeAttribute) {
  549. val kmpdfShapeAnnotationBean = when (attr.shapeType) {
  550. AnnotConfig.ShapeAnnotationType.LINE -> KMPDFLineAnnotationBean("", attr.lineColor, attr.lineWidth, attr.lineAlpha)
  551. AnnotConfig.ShapeAnnotationType.ARROW -> KMPDFArrowAnnotationBean("", attr.lineColor, attr.lineWidth, attr.lineAlpha)
  552. AnnotConfig.ShapeAnnotationType.CIRCLE -> KMPDFCircleAnnotationBean("", attr.lineColor, attr.lineWidth, attr.lineAlpha, attr.fillColor, attr.fillAlpha)
  553. AnnotConfig.ShapeAnnotationType.SQUARE -> KMPDFSquareAnnotationBean("", attr.lineColor, attr.lineWidth, attr.lineAlpha, attr.fillColor, attr.fillAlpha)
  554. }
  555. kmpdfFactory?.setAnnotationAttribute(kmpdfShapeAnnotationBean)
  556. kmpdfFactory?.setAnnotationEditMode(kmpdfShapeAnnotationBean.type)
  557. }
  558. val pdfInfoHandler = object : PdfInfoHandler {
  559. override fun getOpenPdfFilename(): String {
  560. return kmpdfFactory?.fileName ?: ""
  561. }
  562. override fun getPdfPageCount(isNativeRefresh: Boolean): Int {
  563. return kmpdfDocumentController?.getDocumentPageCount(isNativeRefresh) ?: 0
  564. }
  565. override fun getCurrentPage(): Int {
  566. return kmpdfDocumentController?.currentPageNum ?: 0
  567. }
  568. override fun setCurrentPage(page: Int): Boolean {
  569. return kmpdfDocumentController?.gotoPage(page) ?: false
  570. }
  571. override fun textLines(page: Int): Array<Array<TextWord>> {
  572. return kmpdfDocumentController?.textLines(page) ?: arrayOf()
  573. }
  574. }
  575. val thumbnailHandler = object : ThumbnailHandler {
  576. override fun getPdfBitmap(position: Int, picWidth: Int, mode: Int, isDrawAnnot: Boolean): Bitmap {
  577. return kmpdfDocumentController?.covertPDFToBitmap(position, picWidth, mode, isDrawAnnot) ?: Bitmap.createBitmap(0, 0, Bitmap.Config.ARGB_4444)
  578. }
  579. }
  580. val bookmarkHandler = object : BookmarkHandler {
  581. override fun getBookmarks(): Array<Bookmark> {
  582. return kmpdfDocumentController?.bookmarks ?: arrayOf()
  583. }
  584. }
  585. val outlineHandler = object : OutlineHandler {
  586. override fun getOutline(): Array<OutlineItem> {
  587. return kmpdfDocumentController?.outline ?: arrayOf()
  588. }
  589. }
  590. val searchHandler = object : SearchHandler {
  591. override fun searchPage(page: Int, keyword: String): Array<RectF> {
  592. return kmpdfDocumentController?.searchPage(page, keyword) ?: arrayOf()
  593. }
  594. override fun cleanPreviousSearchResults(keyword: String): Boolean {
  595. return kmpdfDocumentController?.cleanPreviousSearchResults(keyword) ?: false
  596. }
  597. override fun setSearchResult(page: Int, keyword: String, rectArray: Array<RectF>): Boolean {
  598. return kmpdfDocumentController?.setSearchResult(keyword, page, rectArray) ?: false
  599. }
  600. override fun stopSearchKeyWord(): Boolean {
  601. return kmpdfDocumentController?.stopSearchKeyWord() ?: false
  602. }
  603. }
  604. }