Просмотр исходного кода

Moved flags to presenter and fixed refreshing list after book added (don't keep activities enabled)

Vadik Sirekanyan 7 лет назад
Родитель
Сommit
a5959e3434

+ 5 - 1
app/src/main/java/com/sirekanyan/knigopis/common/functions/IntentFactory.kt

@@ -4,6 +4,7 @@ import android.content.Context
 import android.content.Intent
 import android.net.Uri
 import android.provider.Settings
+import ru.ulogin.sdk.UloginAuthActivity
 
 private const val TEXT_MIME_TYPE = "text/plain"
 private const val PACKAGE_SCHEME = "package"
@@ -19,4 +20,7 @@ fun Context.createAppSettingsIntent(): Intent =
     Intent(
         Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
         Uri.fromParts(PACKAGE_SCHEME, packageName, null)
-    )
+    )
+
+fun Context.createLoginIntent() =
+    Intent(this, UloginAuthActivity::class.java)

+ 17 - 24
app/src/main/java/com/sirekanyan/knigopis/feature/MainActivity.kt

@@ -10,6 +10,7 @@ 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.createAppSettingsIntent
+import com.sirekanyan.knigopis.common.functions.createLoginIntent
 import com.sirekanyan.knigopis.common.functions.logError
 import com.sirekanyan.knigopis.createParameters
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
@@ -21,10 +22,10 @@ import com.sirekanyan.knigopis.feature.users.saveMainState
 import com.sirekanyan.knigopis.model.BookDataModel
 import com.sirekanyan.knigopis.repository.Configuration
 import com.sirekanyan.knigopis.repository.Endpoint
-import com.sirekanyan.knigopis.repository.KAuth
 import org.koin.android.ext.android.inject
+import ru.ulogin.sdk.UloginAuthActivity
 
-private const val ULOGIN_REQUEST_CODE = 0
+private const val LOGIN_REQUEST_CODE = 0
 private const val BOOK_REQUEST_CODE = 1
 
 class MainActivity : BaseActivity(), MainPresenter.Router {
@@ -32,9 +33,6 @@ class MainActivity : BaseActivity(), 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 var userLoggedIn = false
-    private var booksChanged = false
 
     override fun onCreate(savedInstanceState: Bundle?) {
         setTheme(if (config.isDarkTheme) R.style.DarkAppTheme else R.style.AppTheme)
@@ -45,20 +43,7 @@ class MainActivity : BaseActivity(), MainPresenter.Router {
 
     override fun onStart() {
         super.onStart()
-        presenter.refreshOptionsMenu()
-        auth.requestAccessToken().bind({
-            presenter.refreshOptionsMenu()
-            if (userLoggedIn) {
-                userLoggedIn = false
-                presenter.refresh()
-            }
-        }, {
-            logError("cannot check credentials", it)
-        })
-        if (booksChanged) {
-            booksChanged = false
-            presenter.refresh(isForce = true)
-        }
+        presenter.start()
         intent.data?.also { userUrl ->
             intent.data = null
             val normalizedUri = Uri.parse(userUrl.toString().replaceFirst("/#/", "/"))
@@ -74,6 +59,11 @@ class MainActivity : BaseActivity(), MainPresenter.Router {
         }
     }
 
+    override fun onResume() {
+        super.onResume()
+        presenter.resume()
+    }
+
     override fun onStop() {
         super.onStop()
         presenter.stop()
@@ -86,14 +76,17 @@ class MainActivity : BaseActivity(), MainPresenter.Router {
 
     override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
         when (requestCode) {
-            ULOGIN_REQUEST_CODE -> {
+            LOGIN_REQUEST_CODE -> {
                 if (resultCode == RESULT_OK && data != null) {
-                    auth.saveTokenResponse(data)
-                    userLoggedIn = true
+                    val userData = data.getSerializableExtra(UloginAuthActivity.USERDATA)
+                    val token = (userData as HashMap<*, *>)["token"].toString()
+                    presenter.onLoginScreenResult(token)
                 }
             }
             BOOK_REQUEST_CODE -> {
-                booksChanged = resultCode == RESULT_OK
+                if (resultCode == RESULT_OK) {
+                    presenter.onBookScreenResult()
+                }
             }
         }
     }
@@ -105,7 +98,7 @@ class MainActivity : BaseActivity(), MainPresenter.Router {
     }
 
     override fun openLoginScreen() {
-        startActivityForResult(auth.getTokenRequest(), ULOGIN_REQUEST_CODE)
+        startActivityForResult(createLoginIntent(), LOGIN_REQUEST_CODE)
     }
 
     override fun openSettingsScreen() {

+ 31 - 0
app/src/main/java/com/sirekanyan/knigopis/feature/MainPresenter.kt

@@ -23,10 +23,13 @@ interface MainPresenter : Presenter {
     val state: MainPresenterState?
     fun init(state: MainPresenterState?)
     fun start()
+    fun resume()
     fun back(): Boolean
     fun refresh(tab: CurrentTab? = null, isForce: Boolean = false)
     fun refreshOptionsMenu()
     fun showPage(tab: CurrentTab, isForce: Boolean)
+    fun onLoginScreenResult(token: String)
+    fun onBookScreenResult()
 
     interface Router {
         fun openLoginScreen()
@@ -53,6 +56,8 @@ class MainPresenterImpl(
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
     private var currentTab: CurrentTab? = null
+    private var booksChanged = false
+    private var userLoggedIn = false
 
     override val state
         get() = currentTab?.let { MainPresenterState(it.itemId) }
@@ -66,6 +71,23 @@ class MainPresenterImpl(
     }
 
     override fun start() {
+        refreshOptionsMenu()
+        auth.loadAccessToken().bind({
+            refreshOptionsMenu()
+            if (userLoggedIn) {
+                userLoggedIn = false
+                refresh()
+            }
+        }, {
+            logError("cannot check credentials", it)
+        })
+    }
+
+    override fun resume() {
+        if (booksChanged) {
+            booksChanged = false
+            refresh(isForce = true)
+        }
     }
 
     override fun back(): Boolean =
@@ -108,6 +130,15 @@ class MainPresenterImpl(
         }
     }
 
+    override fun onLoginScreenResult(token: String) {
+        auth.saveToken(token)
+        userLoggedIn = true
+    }
+
+    override fun onBookScreenResult() {
+        booksChanged = true
+    }
+
     override fun onRetryLoginClicked() {
         login()
     }

+ 12 - 18
app/src/main/java/com/sirekanyan/knigopis/repository/KAuth.kt

@@ -1,11 +1,8 @@
 package com.sirekanyan.knigopis.repository
 
 import android.content.Context
-import android.content.Intent
 import com.sirekanyan.knigopis.common.extensions.io2main
 import io.reactivex.Completable
-import ru.ulogin.sdk.UloginAuthActivity
-import java.util.*
 
 private const val PREFS_NAME = "knigopis"
 private const val TOKEN_KEY = "token"
@@ -14,37 +11,34 @@ private const val USER_PROFILE = "user_profile"
 
 interface KAuth {
     fun isAuthorized(): Boolean
+    fun loadAccessToken(): Completable
     fun getAccessToken(): String
-    fun getTokenRequest(): Intent
     fun getUserProfile(): String?
-    fun saveTokenResponse(data: Intent)
-    fun requestAccessToken(): Completable
+    fun saveToken(token: String)
     fun logout()
 }
 
 class KAuthImpl(
-    private val context: Context,
+    context: Context,
     private val api: Endpoint
 ) : KAuth {
 
     private val preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE)
 
-    override fun isAuthorized() = preferences.contains(ACCESS_TOKEN_KEY)
+    override fun isAuthorized(): Boolean =
+        preferences.contains(ACCESS_TOKEN_KEY)
 
-    override fun getAccessToken(): String = preferences.getString(ACCESS_TOKEN_KEY, "")
+    override fun getAccessToken(): String =
+        preferences.getString(ACCESS_TOKEN_KEY, "")
 
-    override fun getTokenRequest() = Intent(context, UloginAuthActivity::class.java)
+    override fun getUserProfile(): String? =
+        preferences.getString(USER_PROFILE, null)
 
-    override fun getUserProfile(): String? {
-        return preferences.getString(USER_PROFILE, null)
+    override fun saveToken(token: String) {
+        preferences.edit().putString(TOKEN_KEY, token).apply()
     }
 
-    override fun saveTokenResponse(data: Intent) {
-        val userData = data.getSerializableExtra(UloginAuthActivity.USERDATA) as HashMap<*, *>
-        preferences.edit().putString(TOKEN_KEY, userData[TOKEN_KEY].toString()).apply()
-    }
-
-    override fun requestAccessToken(): Completable {
+    override fun loadAccessToken(): Completable {
         val token = preferences.getString(TOKEN_KEY, null)
         return if (token != null && !isAuthorized()) {
             api.getCredentials(token)