فهرست منبع

Added separate login presenter and view classes

Vadik Sirekanyan 7 سال پیش
والد
کامیت
3db13f7227

+ 2 - 1
app/src/main/java/com/sirekanyan/knigopis/common/BasePresenter.kt

@@ -6,7 +6,7 @@ import io.reactivex.Observable
 import io.reactivex.Single
 import io.reactivex.disposables.CompositeDisposable
 
-abstract class BasePresenter<V : Any> {
+abstract class BasePresenter<V : Any>(private vararg val nestedPresenters: Presenter) {
 
     lateinit var view: V
     private val disposables = CompositeDisposable()
@@ -28,6 +28,7 @@ abstract class BasePresenter<V : Any> {
     }
 
     fun stop() {
+        nestedPresenters.forEach(Presenter::stop)
         disposables.clear()
     }
 

+ 18 - 9
app/src/main/java/com/sirekanyan/knigopis/dependency.kt

@@ -6,12 +6,14 @@ import android.view.View
 import com.google.gson.Gson
 import com.google.gson.GsonBuilder
 import com.sirekanyan.knigopis.common.android.*
-import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.common.android.dialog.BottomSheetDialogFactory
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
+import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.feature.MainPresenter
 import com.sirekanyan.knigopis.feature.MainPresenterImpl
 import com.sirekanyan.knigopis.feature.MainViewImpl
+import com.sirekanyan.knigopis.feature.login.LoginPresenterImpl
+import com.sirekanyan.knigopis.feature.login.LoginViewImpl
 import com.sirekanyan.knigopis.feature.user.UserInteractor
 import com.sirekanyan.knigopis.feature.user.UserInteractorImpl
 import com.sirekanyan.knigopis.model.BookDataModel
@@ -73,22 +75,33 @@ val appModule = applicationContext {
     }
     factory { BottomSheetDialogFactory(it.getContext()) as DialogFactory }
     factory { PermissionsImpl(it.getContext() as Activity) as Permissions }
+    mainModule()
+    userModule()
+}
+
+private fun KoinContext.mainModule() {
     factory {
         val params = it.getContext().createParameters()
+        val loginPresenter = LoginPresenterImpl(it.getRouter(), get(params)).also { p ->
+            p.view = LoginViewImpl(it.getRootView(), p)
+        }
         MainPresenterImpl(
+            loginPresenter,
             it.getRouter(),
             get(),
             get(),
             get(),
             get(),
             get(),
-            get(),
-            get(params)
+            get()
         ).also { p ->
             p.view = MainViewImpl(it.getRootView(), p, get(params))
         } as MainPresenter
     }
-    userModule()
+}
+
+private fun KoinContext.userModule() {
+    bean { UserInteractorImpl(get(), get(), get()) as UserInteractor }
 }
 
 fun Context.createParameters(): Parameters =
@@ -109,13 +122,9 @@ private fun ParameterProvider.getContext(): Context =
 private fun ParameterProvider.getRootView(): View =
     this[ROOT_VIEW_KEY]
 
-private fun ParameterProvider.getRouter(): MainPresenter.Router =
+private fun <T> ParameterProvider.getRouter(): T =
     this[ROUTER_KEY]
 
-private fun KoinContext.userModule() {
-    bean { UserInteractorImpl(get(), get(), get()) as UserInteractor }
-}
-
 private fun createMainEndpoint(gson: Gson) =
     Retrofit.Builder()
         .baseUrl(MAIN_API_URL)

+ 2 - 1
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -15,6 +15,7 @@ import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.createParameters
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
 import com.sirekanyan.knigopis.feature.book.createNewBookIntent
+import com.sirekanyan.knigopis.feature.login.LoginPresenter
 import com.sirekanyan.knigopis.feature.profile.createProfileIntent
 import com.sirekanyan.knigopis.feature.user.createUserIntent
 import com.sirekanyan.knigopis.feature.users.getMainState
@@ -28,7 +29,7 @@ import ru.ulogin.sdk.UloginAuthActivity
 private const val LOGIN_REQUEST_CODE = 0
 private const val BOOK_REQUEST_CODE = 1
 
-class MainActivity : BaseActivity(), MainPresenter.Router {
+class MainActivity : BaseActivity(), MainPresenter.Router, LoginPresenter.Router {
 
     private val presenter by inject<MainPresenter>(parameters = createParameters(this))
     private val api by inject<Endpoint>()

+ 8 - 44
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -2,19 +2,15 @@ package com.sirekanyan.knigopis.feature
 
 import android.net.Uri
 import com.sirekanyan.knigopis.common.BasePresenter
-import com.sirekanyan.knigopis.common.android.Permissions
 import com.sirekanyan.knigopis.common.Presenter
 import com.sirekanyan.knigopis.common.android.ResourceProvider
 import com.sirekanyan.knigopis.common.extensions.io2main
 import com.sirekanyan.knigopis.common.extensions.toUriOrNull
 import com.sirekanyan.knigopis.common.functions.logError
+import com.sirekanyan.knigopis.feature.login.LoginPresenter
 import com.sirekanyan.knigopis.feature.users.MainPresenterState
-import com.sirekanyan.knigopis.model.ProfileItem
-import com.sirekanyan.knigopis.model.BookDataModel
-import com.sirekanyan.knigopis.model.CurrentTab
+import com.sirekanyan.knigopis.model.*
 import com.sirekanyan.knigopis.model.CurrentTab.*
-import com.sirekanyan.knigopis.model.NoteModel
-import com.sirekanyan.knigopis.model.UserModel
 import com.sirekanyan.knigopis.repository.*
 import io.reactivex.Flowable
 
@@ -29,8 +25,6 @@ interface MainPresenter : Presenter {
     fun onBookScreenResult()
 
     interface Router {
-        fun openLoginScreen()
-        fun openSettingsScreen()
         fun openProfileScreen()
         fun openNewBookScreen()
         fun openBookScreen(book: BookDataModel)
@@ -41,15 +35,17 @@ interface MainPresenter : Presenter {
 }
 
 class MainPresenterImpl(
+    private val loginPresenter: LoginPresenter,
     private val router: MainPresenter.Router,
     private val config: Configuration,
     private val auth: AuthRepository,
     private val bookRepository: BookRepository,
     private val userRepository: UserRepository,
     private val noteRepository: NoteRepository,
-    private val resources: ResourceProvider,
-    private val permissions: Permissions
-) : BasePresenter<MainView>(), MainPresenter, MainView.Callbacks {
+    private val resources: ResourceProvider
+) : BasePresenter<MainView>(loginPresenter),
+    MainPresenter,
+    MainView.Callbacks {
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
     private var currentTab: CurrentTab? = null
@@ -135,14 +131,6 @@ class MainPresenterImpl(
         booksChanged = true
     }
 
-    override fun onRetryLoginClicked() {
-        login()
-    }
-
-    override fun onGotoSettingsClicked() {
-        router.openSettingsScreen()
-    }
-
     override fun onNavigationClicked(itemId: Int) {
         CurrentTab.getByItemId(itemId).let { tab ->
             currentTab = tab
@@ -158,7 +146,7 @@ class MainPresenterImpl(
     }
 
     override fun onLoginOptionClicked() {
-        login()
+        loginPresenter.login()
     }
 
     override fun onProfileOptionClicked() {
@@ -278,28 +266,4 @@ class MainPresenterImpl(
             view.hideSwipeRefresh()
         }
 
-    private fun login() {
-        permissions.requestReadPhoneState().bind({
-            when {
-                it.granted -> {
-                    if (auth.isAuthorized()) {
-                        auth.logout()
-                        refresh()
-                    } else {
-                        router.openLoginScreen()
-                    }
-                    refreshButtons()
-                }
-                it.shouldShowRequestPermissionRationale -> {
-                    view.showPermissionsRetryDialog()
-                }
-                else -> {
-                    view.showPermissionsSettingsDialog()
-                }
-            }
-        }, {
-            logError("cannot request permission", it)
-        })
-    }
-
 }

+ 2 - 29
app/src/main/java/com/sirekanyan/knigopis/feature/MainView.kt

@@ -8,18 +8,16 @@ import android.view.View
 import android.widget.TextView
 import com.sirekanyan.knigopis.BuildConfig
 import com.sirekanyan.knigopis.R
-import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.common.android.dialog.DialogFactory
 import com.sirekanyan.knigopis.common.android.dialog.DialogItem
 import com.sirekanyan.knigopis.common.android.dialog.createDialogItem
 import com.sirekanyan.knigopis.common.android.header.HeaderItemDecoration
 import com.sirekanyan.knigopis.common.android.header.StickyHeaderImpl
+import com.sirekanyan.knigopis.common.extensions.*
 import com.sirekanyan.knigopis.feature.books.BooksAdapter
 import com.sirekanyan.knigopis.feature.books.BooksView
-import com.sirekanyan.knigopis.feature.login.LoginView
 import com.sirekanyan.knigopis.feature.notes.NotesAdapter
 import com.sirekanyan.knigopis.feature.notes.NotesView
-import com.sirekanyan.knigopis.model.ProfileItem
 import com.sirekanyan.knigopis.feature.users.UsersAdapter
 import com.sirekanyan.knigopis.feature.users.UsersView
 import com.sirekanyan.knigopis.model.*
@@ -33,7 +31,7 @@ import kotlinx.android.synthetic.main.notes_page.*
 import kotlinx.android.synthetic.main.users_page.*
 import retrofit2.HttpException
 
-interface MainView : LoginView, BooksView, UsersView, NotesView {
+interface MainView : BooksView, UsersView, NotesView {
 
     fun showAboutDialog()
     fun showPage(tab: CurrentTab)
@@ -47,7 +45,6 @@ interface MainView : LoginView, BooksView, UsersView, NotesView {
     fun setDarkThemeOptionChecked(isChecked: Boolean)
 
     interface Callbacks :
-        LoginView.Callbacks,
         BooksView.Callbacks,
         UsersView.Callbacks,
         NotesView.Callbacks {
@@ -134,30 +131,6 @@ class MainViewImpl(
         swipeRefresh.setOnRefreshListener(callbacks::onRefreshSwiped)
     }
 
-    override fun showPermissionsRetryDialog() {
-        AlertDialog.Builder(context)
-            .setTitle(R.string.permissions_title)
-            .setMessage(R.string.permissions_message_retry)
-            .setPositiveButton(R.string.common_button_retry) { _, _ ->
-                callbacks.onRetryLoginClicked()
-            }
-            .setNegativeButton(R.string.common_button_cancel, null)
-            .setCancelable(false)
-            .show()
-    }
-
-    override fun showPermissionsSettingsDialog() {
-        AlertDialog.Builder(context)
-            .setTitle(R.string.permissions_title)
-            .setMessage(R.string.permissions_message_settings)
-            .setPositiveButton(R.string.permissions_button_settings) { _, _ ->
-                callbacks.onGotoSettingsClicked()
-            }
-            .setNegativeButton(R.string.common_button_cancel, null)
-            .setCancelable(false)
-            .show()
-    }
-
     override fun showAboutDialog() {
         val dialogView = View.inflate(context, R.layout.about, null)
         dialogView.aboutAppVersion.text = BuildConfig.VERSION_NAME

+ 52 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/login/LoginPresenter.kt

@@ -0,0 +1,52 @@
+package com.sirekanyan.knigopis.feature.login
+
+import com.sirekanyan.knigopis.common.BasePresenter
+import com.sirekanyan.knigopis.common.Presenter
+import com.sirekanyan.knigopis.common.android.Permissions
+import com.sirekanyan.knigopis.common.functions.logError
+
+interface LoginPresenter : Presenter {
+
+    fun login()
+
+    interface Router {
+        fun openLoginScreen()
+        fun openSettingsScreen()
+    }
+
+}
+
+class LoginPresenterImpl(
+    private val router: LoginPresenter.Router,
+    private val permissions: Permissions
+) : BasePresenter<LoginView>(),
+    LoginPresenter,
+    LoginView.Callbacks {
+
+    override fun login() {
+        permissions.requestReadPhoneState().bind({
+            when {
+                it.granted -> {
+                    router.openLoginScreen()
+                }
+                it.shouldShowRequestPermissionRationale -> {
+                    view.showPermissionsRetryDialog()
+                }
+                else -> {
+                    view.showPermissionsSettingsDialog()
+                }
+            }
+        }, {
+            logError("cannot request permission", it)
+        })
+    }
+
+    override fun onRetryLoginClicked() {
+        login()
+    }
+
+    override fun onGotoSettingsClicked() {
+        router.openSettingsScreen()
+    }
+
+}

+ 39 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/login/LoginView.kt

@@ -1,5 +1,10 @@
 package com.sirekanyan.knigopis.feature.login
 
+import android.support.v7.app.AlertDialog
+import android.view.View
+import com.sirekanyan.knigopis.R
+import kotlinx.android.extensions.LayoutContainer
+
 interface LoginView {
 
     fun showPermissionsRetryDialog()
@@ -10,4 +15,38 @@ interface LoginView {
         fun onGotoSettingsClicked()
     }
 
+}
+
+class LoginViewImpl(
+    override val containerView: View,
+    private val callbacks: LoginView.Callbacks
+) : LoginView,
+    LayoutContainer {
+
+    private val context = containerView.context
+
+    override fun showPermissionsRetryDialog() {
+        AlertDialog.Builder(context)
+            .setTitle(R.string.permissions_title)
+            .setMessage(R.string.permissions_message_retry)
+            .setPositiveButton(R.string.common_button_retry) { _, _ ->
+                callbacks.onRetryLoginClicked()
+            }
+            .setNegativeButton(R.string.common_button_cancel, null)
+            .setCancelable(false)
+            .show()
+    }
+
+    override fun showPermissionsSettingsDialog() {
+        AlertDialog.Builder(context)
+            .setTitle(R.string.permissions_title)
+            .setMessage(R.string.permissions_message_settings)
+            .setPositiveButton(R.string.permissions_button_settings) { _, _ ->
+                callbacks.onGotoSettingsClicked()
+            }
+            .setNegativeButton(R.string.common_button_cancel, null)
+            .setCancelable(false)
+            .show()
+    }
+
 }