Prechádzať zdrojové kódy

Injected main presenter to activity

Vadik Sirekanyan 7 rokov pred
rodič
commit
e0fb40b340

+ 28 - 0
app/src/main/java/com/sirekanyan/knigopis/dependency.kt

@@ -1,14 +1,20 @@
 package com.sirekanyan.knigopis
 
+import android.app.Activity
 import android.content.Context
+import android.view.View
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
 import com.sirekanyan.knigopis.common.NetworkChecker
 import com.sirekanyan.knigopis.common.NetworkCheckerImpl
 import com.sirekanyan.knigopis.common.ResourceProvider
 import com.sirekanyan.knigopis.common.ResourceProviderImpl
+import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.common.view.dialog.BottomSheetDialogFactory
 import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
+import com.sirekanyan.knigopis.feature.MainPresenter
+import com.sirekanyan.knigopis.feature.MainPresenterImpl
+import com.sirekanyan.knigopis.feature.MainViewImpl
 import com.sirekanyan.knigopis.feature.user.UserInteractor
 import com.sirekanyan.knigopis.feature.user.UserInteractorImpl
 import com.sirekanyan.knigopis.model.BookDataModel
@@ -33,6 +39,8 @@ import org.koin.dsl.context.Context as KoinContext
 private const val MAIN_API_URL = "http://api.knigopis.com"
 private const val DATE_FORMAT = "yyyy-MM-dd HH:mm:ss"
 private const val CONTEXT_KEY = "context_key"
+private const val ROOT_VIEW_KEY = "root_view_key"
+private const val ROUTER_KEY = "router_key"
 
 val appModule = applicationContext {
     bean {
@@ -67,15 +75,35 @@ val appModule = applicationContext {
             .create()
     }
     factory { BottomSheetDialogFactory(it.getContext()) as DialogFactory }
+    factory {
+        MainPresenterImpl(it.getRouter(), get(), get(), get(), get(), get(), get()).also { p ->
+            p.view = MainViewImpl(it.getRootView(), p, get(it.getContext().createParameters()))
+        } as MainPresenter
+    }
     userModule()
 }
 
 fun Context.createParameters(): Parameters =
     { mapOf(CONTEXT_KEY to this) }
 
+fun Activity.createParameters(router: MainPresenter.Router): Parameters =
+    {
+        mapOf(
+            CONTEXT_KEY to this,
+            ROOT_VIEW_KEY to getRootView(),
+            ROUTER_KEY to router
+        )
+    }
+
 private fun ParameterProvider.getContext(): Context =
     this[CONTEXT_KEY]
 
+private fun ParameterProvider.getRootView(): View =
+    this[ROOT_VIEW_KEY]
+
+private fun ParameterProvider.getRouter(): MainPresenter.Router =
+    this[ROUTER_KEY]
+
 private fun KoinContext.userModule() {
     bean { UserInteractorImpl(get(), get(), get()) as UserInteractor }
 }

+ 9 - 32
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -10,62 +10,41 @@ import android.support.v7.app.AlertDialog
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.Router
 import com.sirekanyan.knigopis.common.BaseActivity
-import com.sirekanyan.knigopis.common.ResourceProvider
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.common.extensions.io2main
 import com.sirekanyan.knigopis.common.extensions.startActivityOrNull
 import com.sirekanyan.knigopis.common.extensions.toast
 import com.sirekanyan.knigopis.common.functions.logError
-import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
 import com.sirekanyan.knigopis.createParameters
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
 import com.sirekanyan.knigopis.feature.book.createNewBookIntent
 import com.sirekanyan.knigopis.feature.profile.createProfileIntent
 import com.sirekanyan.knigopis.feature.user.createUserIntent
-import com.sirekanyan.knigopis.feature.users.MainPresenterState
+import com.sirekanyan.knigopis.feature.users.getMainState
+import com.sirekanyan.knigopis.feature.users.saveMainState
 import com.sirekanyan.knigopis.model.BookDataModel
-import com.sirekanyan.knigopis.repository.*
+import com.sirekanyan.knigopis.repository.Configuration
+import com.sirekanyan.knigopis.repository.Endpoint
+import com.sirekanyan.knigopis.repository.KAuth
 import com.tbruyelle.rxpermissions2.RxPermissions
 import org.koin.android.ext.android.inject
 
 private const val ULOGIN_REQUEST_CODE = 0
 private const val BOOK_REQUEST_CODE = 1
-private const val CURRENT_TAB_KEY = "current_tab"
 
 class MainActivity : BaseActivity(), Router, MainPresenter.Router {
 
+    private val presenter by inject<MainPresenter>(parameters = createParameters(this))
     private val api by inject<Endpoint>()
     private val config by inject<Configuration>()
     private val auth by inject<KAuth>()
-    private val dialogs by inject<DialogFactory>(parameters = createParameters())
-    private val bookRepository by inject<BookRepository>()
-    private val userRepository by inject<UserRepository>()
-    private val noteRepository by inject<NoteRepository>()
-    private val resourceProvider by inject<ResourceProvider>()
     private var userLoggedIn = false
     private var booksChanged = false
-    private lateinit var presenter: MainPresenter
 
     override fun onCreate(savedInstanceState: Bundle?) {
         setTheme(if (config.isDarkTheme) R.style.DarkAppTheme else R.style.AppTheme)
         super.onCreate(savedInstanceState)
         setContentView(R.layout.activity_main)
-        presenter = MainPresenterImpl(
-            this,
-            config,
-            auth,
-            bookRepository,
-            userRepository,
-            noteRepository,
-            resourceProvider
-        ).also { presenter ->
-            presenter.view = MainViewImpl(getRootView(), presenter, dialogs)
-            presenter.init(
-                savedInstanceState?.let {
-                    MainPresenterState(it.getInt(CURRENT_TAB_KEY))
-                }
-            )
-        }
+        presenter.init(savedInstanceState?.getMainState())
         presenter.refreshNavigation()
     }
 
@@ -105,11 +84,9 @@ class MainActivity : BaseActivity(), Router, MainPresenter.Router {
         presenter.stop()
     }
 
-    override fun onSaveInstanceState(outState: Bundle?) {
+    override fun onSaveInstanceState(outState: Bundle) {
         super.onSaveInstanceState(outState)
-        presenter.state?.let { state ->
-            outState?.putInt(CURRENT_TAB_KEY, state.currentTab)
-        }
+        presenter.state?.let { outState.saveMainState(it) }
     }
 
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {

+ 3 - 1
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -51,7 +51,9 @@ class MainPresenterImpl(
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
     private var currentTab: CurrentTab? = null
-    override val state get() = currentTab?.let { MainPresenterState(it.itemId) }
+
+    override val state
+        get() = currentTab?.let { MainPresenterState(it.itemId) }
 
     override fun init(state: MainPresenterState?) {
         val currentTab = state?.currentTab?.let { CurrentTab.getByItemId(it) }

+ 11 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/users/MainPresenterState.kt

@@ -1,3 +1,14 @@
 package com.sirekanyan.knigopis.feature.users
 
+import android.os.Bundle
+
+private const val CURRENT_TAB_KEY = "current_tab"
+
+fun Bundle.getMainState(): MainPresenterState =
+    MainPresenterState(getInt(CURRENT_TAB_KEY))
+
+fun Bundle.saveMainState(state: MainPresenterState) {
+    putInt(CURRENT_TAB_KEY, state.currentTab)
+}
+
 class MainPresenterState(val currentTab: Int)