package com.kdanmobile.reader import android.annotation.SuppressLint import android.arch.lifecycle.ViewModel import android.os.Handler import android.os.Message import android.util.Log import com.kdanmobile.kmpdfkit.manager.KMPDFFactory import com.kdanmobile.kmpdfkit.manager.controller.KMPDFDocumentController import java.util.* object ReaderModel { private const val TAG = "ReaderModel" private var filename: String? = null var password: String = "" private set var kmpdfFactory: KMPDFFactory? = null private set @SuppressLint("StaticFieldLeak") var kmpdfDocumentController: KMPDFDocumentController? = null private set private var shouldDestroy = false @SuppressLint("HandlerLeak") private val handler = object : Handler() { override fun handleMessage(msg: Message) { super.handleMessage(msg) when (msg.what) { 10 -> if (shouldDestroy && set.isEmpty()) { destroy() } } } } private val set = HashSet() var onPdfChangedListener: OnPdfChangedListener? = null @Synchronized fun initKMPDFFactory(kmpdfFactory: KMPDFFactory?, filename: String?, password: String = "") { Log.d(TAG, "initKMPDFFactory $filename $password") if (this.filename != filename || this.password != password) { val items = set.toList() destroy() set.addAll(items) } if (null == this.kmpdfFactory) { shouldDestroy = false this.kmpdfFactory = kmpdfFactory this.filename = filename this.password = password } } fun initKMPDFDocumentController() { Log.d(TAG, "initKMPDFDocumentController") kmpdfDocumentController = kmpdfFactory?.getController(KMPDFFactory.ControllerType.DOCUMENT) as KMPDFDocumentController } @Synchronized fun destroy() { Log.d(TAG, "destroy") filename = null password = "" kmpdfFactory?.destroy() kmpdfFactory = null kmpdfDocumentController = null shouldDestroy = false set.clear() } fun onViewModelCreate(viewModel: ViewModel) { Log.d(TAG, "onViewModelCreate ($viewModel)") set.add(viewModel.toString()) printSet() } fun onViewModelCleared(viewModel: ViewModel) { Log.d(TAG, "onViewModelCleared ($viewModel)") set.remove(viewModel.toString()) if (set.isEmpty()) { shouldDestroy = true handler.sendEmptyMessageDelayed(10, 2000) } printSet() } private fun printSet() { Log.d(TAG, "======================================================================") var count = 0 set.forEach { Log.d(TAG, " [${count++}] $it") } } }