ReaderViewModel.kt 28 KB

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