ReaderModel.kt 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package com.kdanmobile.reader
  2. import android.annotation.SuppressLint
  3. import android.arch.lifecycle.ViewModel
  4. import android.os.Handler
  5. import android.os.Message
  6. import android.util.Log
  7. import com.kdanmobile.kmpdfkit.manager.KMPDFFactory
  8. import com.kdanmobile.kmpdfkit.manager.controller.KMPDFDocumentController
  9. import java.util.*
  10. object ReaderModel {
  11. private const val TAG = "ReaderModel"
  12. private var filename: String? = null
  13. var password: String = ""
  14. private set
  15. var kmpdfFactory: KMPDFFactory? = null
  16. private set
  17. @SuppressLint("StaticFieldLeak")
  18. var kmpdfDocumentController: KMPDFDocumentController? = null
  19. private set
  20. private var shouldDestroy = false
  21. @SuppressLint("HandlerLeak")
  22. private val handler = object : Handler() {
  23. override fun handleMessage(msg: Message) {
  24. super.handleMessage(msg)
  25. when (msg.what) {
  26. 10 -> if (shouldDestroy && set.isEmpty()) {
  27. destroy()
  28. }
  29. }
  30. }
  31. }
  32. private val set = HashSet<String>()
  33. var onPdfChangedListener: OnPdfChangedListener? = null
  34. @Synchronized
  35. fun initKMPDFFactory(kmpdfFactory: KMPDFFactory?, filename: String?, password: String = "") {
  36. Log.d(TAG, "initKMPDFFactory $filename $password")
  37. if (this.filename != filename || this.password != password) {
  38. val items = set.toList()
  39. destroy()
  40. set.addAll(items)
  41. }
  42. if (null == this.kmpdfFactory) {
  43. shouldDestroy = false
  44. this.kmpdfFactory = kmpdfFactory
  45. this.filename = filename
  46. this.password = password
  47. }
  48. }
  49. fun initKMPDFDocumentController() {
  50. Log.d(TAG, "initKMPDFDocumentController")
  51. kmpdfDocumentController = kmpdfFactory?.getController(KMPDFFactory.ControllerType.DOCUMENT) as KMPDFDocumentController
  52. }
  53. @Synchronized
  54. fun destroy() {
  55. Log.d(TAG, "destroy")
  56. filename = null
  57. password = ""
  58. kmpdfFactory?.destroy()
  59. kmpdfFactory = null
  60. kmpdfDocumentController = null
  61. shouldDestroy = false
  62. set.clear()
  63. }
  64. fun onViewModelCreate(viewModel: ViewModel) {
  65. Log.d(TAG, "onViewModelCreate ($viewModel)")
  66. set.add(viewModel.toString())
  67. printSet()
  68. }
  69. fun onViewModelCleared(viewModel: ViewModel) {
  70. Log.d(TAG, "onViewModelCleared ($viewModel)")
  71. set.remove(viewModel.toString())
  72. if (set.isEmpty()) {
  73. shouldDestroy = true
  74. handler.sendEmptyMessageDelayed(10, 2000)
  75. }
  76. printSet()
  77. }
  78. private fun printSet() {
  79. Log.d(TAG, "======================================================================")
  80. var count = 0
  81. set.forEach {
  82. Log.d(TAG, " [${count++}] $it")
  83. }
  84. }
  85. }