Browse Source

Merge branch 'changeReaderViewModelConstructor' into 'master'

修改ReaderViewModel建構子,將Uri改為由KoinModule傳入

See merge request kdanandroid/pdf/pdfreaderreadermodule!18
Wayne Huang 5 years ago
parent
commit
ec648f8abf

+ 9 - 6
src/main/java/com/kdanmobile/reader/KoinModule.kt

@@ -3,6 +3,7 @@ package com.kdanmobile.reader
 import android.content.Context
 import android.content.Context
 import com.kdanmobile.reader.copyfile.CopyFileViewModel
 import com.kdanmobile.reader.copyfile.CopyFileViewModel
 import com.kdanmobile.reader.copyfile.CopyFileInfo
 import com.kdanmobile.reader.copyfile.CopyFileInfo
+import android.net.Uri
 import com.kdanmobile.reader.thumb.PdfThumbViewModel
 import com.kdanmobile.reader.thumb.PdfThumbViewModel
 import org.koin.android.viewmodel.ext.koin.viewModel
 import org.koin.android.viewmodel.ext.koin.viewModel
 import org.koin.dsl.module.module
 import org.koin.dsl.module.module
@@ -13,11 +14,13 @@ object KoinModule {
         viewModel { (applicationContext: Context, info: CopyFileInfo) ->
         viewModel { (applicationContext: Context, info: CopyFileInfo) ->
             CopyFileViewModel(applicationContext, info)
             CopyFileViewModel(applicationContext, info)
         }
         }
-        viewModel { ReaderViewModel(
-                get(),
-                Config.PDF_SDK_LICENSE,
-                Config.PDF_SDK_RSA_MSG
-        ) }
-        viewModel { (readerModel : ReaderModel) -> PdfThumbViewModel(readerModel) }
+        viewModel { (uri: Uri) ->
+            ReaderViewModel(
+                    get(),
+                    uri,
+                    Config.PDF_SDK_LICENSE,
+                    Config.PDF_SDK_RSA_MSG
+            ) }
+        viewModel { (readerModel: ReaderModel) -> PdfThumbViewModel(readerModel) }
     }
     }
 }
 }

+ 13 - 14
src/main/java/com/kdanmobile/reader/ReaderActivity.kt

@@ -46,6 +46,7 @@ import com.kdanmobile.reader.view.AnnotationAttributeView
 import com.kdanmobile.reader.view.AnnotationAttributeWindow
 import com.kdanmobile.reader.view.AnnotationAttributeWindow
 import kotlinx.android.synthetic.main.activity_reader.*
 import kotlinx.android.synthetic.main.activity_reader.*
 import org.koin.android.viewmodel.ext.android.viewModel
 import org.koin.android.viewmodel.ext.android.viewModel
+import org.koin.core.parameter.parametersOf
 import java.io.File
 import java.io.File
 import java.util.*
 import java.util.*
 import kotlin.properties.Delegates
 import kotlin.properties.Delegates
@@ -111,7 +112,16 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
             return viewModel.readerModel
             return viewModel.readerModel
         }
         }
 
 
-    private val viewModel: ReaderViewModel by viewModel()
+    private val viewModel: ReaderViewModel by viewModel {
+        val filePath = intent.getStringExtra(KEY_FILE_ABSOLUTE)
+        if (!filePath.isNullOrEmpty()) {
+            insertToRecentDocumentList(filePath as String)
+        }
+        val uri = if (!filePath.isNullOrEmpty()) Uri.parse(Uri.encode(filePath)) else null
+        // The URI may be null in some special case.
+        // Just use Uri.EMPTY and show an alert dialog in onCreate() when the uri is null.
+        parametersOf(uri ?: Uri.EMPTY)
+    }
     private var isShowPasswordActivity = false
     private var isShowPasswordActivity = false
 
 
     // For hide/show toolbars
     // For hide/show toolbars
@@ -150,6 +160,7 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
         setContentView(R.layout.activity_reader)
         setContentView(R.layout.activity_reader)
         setSupportActionBar(toolbar_readerActivity)
         setSupportActionBar(toolbar_readerActivity)
         isShowPasswordActivity = savedInstanceState?.getBoolean(KEY_IS_PASSWORD_ACTIVITY_SHOWING) ?: false
         isShowPasswordActivity = savedInstanceState?.getBoolean(KEY_IS_PASSWORD_ACTIVITY_SHOWING) ?: false
+        // Get file path to determine the opening file is pdf or not
         filePath = intent.getStringExtra(KEY_FILE_ABSOLUTE)
         filePath = intent.getStringExtra(KEY_FILE_ABSOLUTE)
 
 
         val displayMetrics = DisplayMetrics()
         val displayMetrics = DisplayMetrics()
@@ -176,23 +187,13 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
         viewModel.isOpenedFileLiveData.value?.also { isOpened ->
         viewModel.isOpenedFileLiveData.value?.also { isOpened ->
             if (isShowPasswordActivity) return@also
             if (isShowPasswordActivity) return@also
             if (isOpened) return@also
             if (isOpened) return@also
-            val hasOpened = null != viewModel.uri
-            if (!hasOpened) {
-                if (!filePath.isNullOrEmpty()) {
-                    insertToRecentDocumentList(filePath as String)
-                }
-            }
-
-            val uri = if (!filePath.isNullOrEmpty()) Uri.parse(Uri.encode(filePath)) else null
-            viewModel.init(uri ?: Uri.EMPTY)
 
 
-            if (null == uri) {
+            if (Uri.EMPTY == viewModel.uri) {
                 showFileCannotOpenDialog(getString(R.string.cannot_open_buffer))
                 showFileCannotOpenDialog(getString(R.string.cannot_open_buffer))
                 onFilePathOrUriError(filePath)
                 onFilePathOrUriError(filePath)
             } else {
             } else {
                 val result = viewModel.openPdfFile(
                 val result = viewModel.openPdfFile(
                         this@ReaderActivity,
                         this@ReaderActivity,
-                        uri,
                         password,
                         password,
                         Runnable { requestPassword() },
                         Runnable { requestPassword() },
                         intent.type
                         intent.type
@@ -1170,10 +1171,8 @@ abstract class ReaderActivity : KdanBaseActivity(), ReaderSettingListener, PdfTh
                     } else {
                     } else {
                         val isOpened = viewModel.isOpenedFileLiveData.value ?: return
                         val isOpened = viewModel.isOpenedFileLiveData.value ?: return
                         if (isOpened) return
                         if (isOpened) return
-                        val uri = viewModel.uri ?: return
                         val result = viewModel.openPdfFile(
                         val result = viewModel.openPdfFile(
                                 this@ReaderActivity,
                                 this@ReaderActivity,
-                                uri,
                                 password,
                                 password,
                                 Runnable { requestPassword(true) },
                                 Runnable { requestPassword(true) },
                                 intent.type
                                 intent.type

+ 12 - 20
src/main/java/com/kdanmobile/reader/ReaderViewModel.kt

@@ -32,7 +32,7 @@ import java.io.File
 import java.util.*
 import java.util.*
 import kotlin.collections.ArrayList
 import kotlin.collections.ArrayList
 
 
-class ReaderViewModel(private val readerModelManager: ReaderModelManager, 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) : ViewModel() {
 
 
     enum class ViewDirection(val mode: Config.PDFViewMode) {
     enum class ViewDirection(val mode: Config.PDFViewMode) {
         VERTICAL_SINGLE_PAGE_CONTINUES(Config.PDFViewMode.VERTICAL_SINGLE_PAGE_CONTINUES),
         VERTICAL_SINGLE_PAGE_CONTINUES(Config.PDFViewMode.VERTICAL_SINGLE_PAGE_CONTINUES),
@@ -127,9 +127,7 @@ class ReaderViewModel(private val readerModelManager: ReaderModelManager, privat
     var inkAttributeLiveData = MutableLiveData<InkAttribute>().apply { value = DEFAULT_INK_ATTR }
     var inkAttributeLiveData = MutableLiveData<InkAttribute>().apply { value = DEFAULT_INK_ATTR }
 
 
     private var isVerified = false
     private var isVerified = false
-    var uri: Uri? = null // Used to get ReaderModel from ReaderModelManager
-        private set
-    lateinit var readerModel: ReaderModel
+    val readerModel: ReaderModel = readerModelManager.get(uri)
     private val kmpdfFactory: KMPDFFactory?
     private val kmpdfFactory: KMPDFFactory?
         get() = readerModel.kmpdfFactory
         get() = readerModel.kmpdfFactory
     private val kmpdfDocumentController: KMPDFDocumentController?
     private val kmpdfDocumentController: KMPDFDocumentController?
@@ -169,32 +167,26 @@ class ReaderViewModel(private val readerModelManager: ReaderModelManager, privat
     }
     }
 
 
     val password: String
     val password: String
-        get() = readerModel.password ?: ""
+        get() = readerModel.password
 
 
     enum class OpenFileResult {
     enum class OpenFileResult {
         SUCCESS, FAILED, PASSWORD_PROTECTED
         SUCCESS, FAILED, PASSWORD_PROTECTED
     }
     }
 
 
-    fun init(uri: Uri) {
-        if (this.uri != null) return
-        this.uri = uri
-        readerModel = readerModelManager.get(uri)
-    }
-
     @JvmOverloads
     @JvmOverloads
-    fun openPdfFile(context: Context, uri: Uri, password: String, onRequestPassword: Runnable, type: String? = null): OpenFileResult {
+    fun openPdfFile(context: Context, password: String, onRequestPassword: Runnable, type: String? = null): OpenFileResult {
         if (!isVerified) {
         if (!isVerified) {
             if (!verifyLicense(context)) {
             if (!verifyLicense(context)) {
                 return OpenFileResult.FAILED
                 return OpenFileResult.FAILED
             }
             }
             isVerified = true
             isVerified = true
         }
         }
-        return openPdfFileImp(context, uri, password, onRequestPassword, type).apply{
+        return openPdfFileImp(context, password, onRequestPassword, type).apply{
             isOpenedFileLiveData.postValue(this == OpenFileResult.SUCCESS)
             isOpenedFileLiveData.postValue(this == OpenFileResult.SUCCESS)
         }
         }
     }
     }
 
 
-    private fun openPdfFileImp(context: Context, uri: Uri, password: String, requestPassword: Runnable, type: String?): OpenFileResult {
+    private fun openPdfFileImp(context: Context, password: String, requestPassword: Runnable, type: String?): OpenFileResult {
         file = File(uri.path)
         file = File(uri.path)
         val factory = KMPDFFactory.open(context, uri, type) ?: return OpenFileResult.FAILED
         val factory = KMPDFFactory.open(context, uri, type) ?: return OpenFileResult.FAILED
         readerModel.initKMPDFFactory(factory, uri.path, password)
         readerModel.initKMPDFFactory(factory, uri.path, password)
@@ -215,7 +207,7 @@ class ReaderViewModel(private val readerModelManager: ReaderModelManager, privat
     }
     }
 
 
     override fun onCleared() {
     override fun onCleared() {
-        uri?.also { readerModelManager.release(it) }
+        readerModelManager.release(uri)
         super.onCleared()
         super.onCleared()
     }
     }
 
 
@@ -713,13 +705,13 @@ class ReaderViewModel(private val readerModelManager: ReaderModelManager, privat
         kmpdfFactory?.setAnnotationEditMode(kmpdfShapeAnnotationBean.type)
         kmpdfFactory?.setAnnotationEditMode(kmpdfShapeAnnotationBean.type)
     }
     }
 
 
-    val pdfInfoHandler: PdfInfoHandler by lazy { readerModel.pdfInfoHandler }
+    val pdfInfoHandler: PdfInfoHandler = readerModel.pdfInfoHandler
 
 
-    val thumbnailHandler: ThumbnailHandler by lazy { readerModel.thumbnailHandler }
+    val thumbnailHandler: ThumbnailHandler = readerModel.thumbnailHandler
 
 
-    val bookmarkHandler: BookmarkHandler by lazy { readerModel.bookmarkHandler }
+    val bookmarkHandler: BookmarkHandler = readerModel.bookmarkHandler
 
 
-    val outlineHandler: OutlineHandler by lazy { readerModel.outlineHandler }
+    val outlineHandler: OutlineHandler = readerModel.outlineHandler
 
 
-    val searchHandler: SearchHandler by lazy { readerModel.searchHandler }
+    val searchHandler: SearchHandler = readerModel.searchHandler
 }
 }