فهرست منبع

Removed login logic from activity

Vadik Sirekanyan 7 سال پیش
والد
کامیت
2098bd2f23

+ 20 - 0
app/src/main/java/com/sirekanyan/knigopis/common/Permissions.kt

@@ -0,0 +1,20 @@
+package com.sirekanyan.knigopis.common
+
+import android.Manifest.permission.READ_PHONE_STATE
+import android.app.Activity
+import com.tbruyelle.rxpermissions2.Permission
+import com.tbruyelle.rxpermissions2.RxPermissions
+import io.reactivex.Single
+
+interface Permissions {
+
+    fun requestReadPhoneState(): Single<Permission>
+
+}
+
+class PermissionsImpl(private val activity: Activity) : Permissions {
+
+    override fun requestReadPhoneState(): Single<Permission> =
+        RxPermissions(activity).requestEach(READ_PHONE_STATE).firstOrError()
+
+}

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

@@ -1,12 +1,22 @@
 package com.sirekanyan.knigopis.common.functions
 
+import android.content.Context
 import android.content.Intent
+import android.net.Uri
+import android.provider.Settings
 
 private const val TEXT_MIME_TYPE = "text/plain"
+private const val PACKAGE_SCHEME = "package"
 
 fun createTextShareIntent(text: String, title: String): Intent {
     val sharingIntent = Intent(Intent.ACTION_SEND)
         .setType(TEXT_MIME_TYPE)
         .putExtra(Intent.EXTRA_TEXT, text)
     return Intent.createChooser(sharingIntent, title)
-}
+}
+
+fun Context.createAppSettingsIntent(): Intent =
+    Intent(
+        Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
+        Uri.fromParts(PACKAGE_SCHEME, packageName, null)
+    )

+ 14 - 6
app/src/main/java/com/sirekanyan/knigopis/dependency.kt

@@ -5,10 +5,7 @@ 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.*
 import com.sirekanyan.knigopis.common.extensions.getRootView
 import com.sirekanyan.knigopis.common.view.dialog.BottomSheetDialogFactory
 import com.sirekanyan.knigopis.common.view.dialog.DialogFactory
@@ -75,9 +72,20 @@ val appModule = applicationContext {
             .create()
     }
     factory { BottomSheetDialogFactory(it.getContext()) as DialogFactory }
+    factory { PermissionsImpl(it.getContext() as Activity) as Permissions }
     factory {
-        MainPresenterImpl(it.getRouter(), get(), get(), get(), get(), get(), get()).also { p ->
-            p.view = MainViewImpl(it.getRootView(), p, get(it.getContext().createParameters()))
+        val params = it.getContext().createParameters()
+        MainPresenterImpl(
+            it.getRouter(),
+            get(),
+            get(),
+            get(),
+            get(),
+            get(),
+            get(),
+            get(params)
+        ).also { p ->
+            p.view = MainViewImpl(it.getRootView(), p, get(params))
         } as MainPresenter
     }
     userModule()

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

@@ -1,17 +1,15 @@
 package com.sirekanyan.knigopis.feature
 
-import android.Manifest.permission.READ_PHONE_STATE
 import android.content.Intent
 import android.content.Intent.ACTION_VIEW
 import android.net.Uri
 import android.os.Bundle
-import android.provider.Settings
-import android.support.v7.app.AlertDialog
 import com.sirekanyan.knigopis.R
 import com.sirekanyan.knigopis.common.BaseActivity
 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.logError
 import com.sirekanyan.knigopis.createParameters
 import com.sirekanyan.knigopis.feature.book.createEditBookIntent
@@ -24,7 +22,6 @@ 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 com.tbruyelle.rxpermissions2.RxPermissions
 import org.koin.android.ext.android.inject
 
 private const val ULOGIN_REQUEST_CODE = 0
@@ -107,6 +104,14 @@ class MainActivity : BaseActivity(), MainPresenter.Router {
         }
     }
 
+    override fun openLoginScreen() {
+        startActivityForResult(auth.getTokenRequest(), ULOGIN_REQUEST_CODE)
+    }
+
+    override fun openSettingsScreen() {
+        startActivity(createAppSettingsIntent())
+    }
+
     override fun openProfileScreen() {
         startActivity(createProfileIntent())
     }
@@ -131,49 +136,4 @@ class MainActivity : BaseActivity(), MainPresenter.Router {
         recreate()
     }
 
-    override fun login() {
-        RxPermissions(this).requestEach(READ_PHONE_STATE).bind({
-            when {
-                it.granted -> {
-                    if (auth.isAuthorized()) {
-                        auth.logout()
-                        presenter.refresh()
-                    } else {
-                        startActivityForResult(auth.getTokenRequest(), ULOGIN_REQUEST_CODE)
-                    }
-                    presenter.refreshOptionsMenu()
-                }
-                it.shouldShowRequestPermissionRationale -> {
-                    AlertDialog.Builder(this)
-                        .setTitle(R.string.permissions_title_no_access)
-                        .setMessage(R.string.permissions_message_no_access)
-                        .setPositiveButton(R.string.common_button_retry) { _, _ ->
-                            login()
-                        }
-                        .setNegativeButton(R.string.common_button_cancel, null)
-                        .setCancelable(false)
-                        .show()
-                }
-                else -> {
-                    AlertDialog.Builder(this)
-                        .setTitle(R.string.permissions_title_request)
-                        .setMessage(R.string.permissions_message_request)
-                        .setPositiveButton(R.string.permissions_button_settings) { _, _ ->
-                            startActivity(
-                                Intent(
-                                    Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
-                                    Uri.fromParts("package", packageName, null)
-                                )
-                            )
-                        }
-                        .setNegativeButton(R.string.common_button_cancel, null)
-                        .setCancelable(false)
-                        .show()
-                }
-            }
-        }, {
-            logError("cannot request permission", it)
-        })
-    }
-
 }

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

@@ -2,6 +2,7 @@ package com.sirekanyan.knigopis.feature
 
 import android.net.Uri
 import com.sirekanyan.knigopis.common.BasePresenter
+import com.sirekanyan.knigopis.common.Permissions
 import com.sirekanyan.knigopis.common.Presenter
 import com.sirekanyan.knigopis.common.ResourceProvider
 import com.sirekanyan.knigopis.common.extensions.io2main
@@ -28,13 +29,14 @@ interface MainPresenter : Presenter {
     fun showPage(tab: CurrentTab, isForce: Boolean)
 
     interface Router {
+        fun openLoginScreen()
+        fun openSettingsScreen()
         fun openProfileScreen()
         fun openNewBookScreen()
         fun openBookScreen(book: BookDataModel)
         fun openUserScreen(id: String, name: String, image: String?)
         fun openWebPage(uri: Uri)
         fun reopenScreen()
-        fun login()
     }
 }
 
@@ -45,7 +47,8 @@ class MainPresenterImpl(
     private val bookRepository: BookRepository,
     private val userRepository: UserRepository,
     private val noteRepository: NoteRepository,
-    private val resources: ResourceProvider
+    private val resources: ResourceProvider,
+    private val permissions: Permissions
 ) : BasePresenter<MainView>(), MainPresenter, MainView.Callbacks {
 
     private val loadedTabs = mutableSetOf<CurrentTab>()
@@ -105,6 +108,14 @@ class MainPresenterImpl(
         }
     }
 
+    override fun onRetryLoginClicked() {
+        login()
+    }
+
+    override fun onGotoSettingsClicked() {
+        router.openSettingsScreen()
+    }
+
     override fun onNavigationClicked(itemId: Int) {
         CurrentTab.getByItemId(itemId).let { tab ->
             currentTab = tab
@@ -120,7 +131,7 @@ class MainPresenterImpl(
     }
 
     override fun onLoginOptionClicked() {
-        router.login()
+        login()
     }
 
     override fun onProfileOptionClicked() {
@@ -248,4 +259,28 @@ class MainPresenterImpl(
             view.hideSwipeRefresh()
         }
 
+    private fun login() {
+        permissions.requestReadPhoneState().bind({
+            when {
+                it.granted -> {
+                    if (auth.isAuthorized()) {
+                        auth.logout()
+                        refresh()
+                    } else {
+                        router.openLoginScreen()
+                    }
+                    refreshOptionsMenu()
+                }
+                it.shouldShowRequestPermissionRationale -> {
+                    view.showPermissionsRetryDialog()
+                }
+                else -> {
+                    view.showPermissionsSettingsDialog()
+                }
+            }
+        }, {
+            logError("cannot request permission", it)
+        })
+    }
+
 }

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

@@ -16,6 +16,7 @@ import com.sirekanyan.knigopis.common.view.header.HeaderItemDecoration
 import com.sirekanyan.knigopis.common.view.header.StickyHeaderImpl
 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.feature.users.UriItem
@@ -32,7 +33,7 @@ import kotlinx.android.synthetic.main.notes_page.*
 import kotlinx.android.synthetic.main.users_page.*
 import retrofit2.HttpException
 
-interface MainView : BooksView, UsersView, NotesView {
+interface MainView : LoginView, BooksView, UsersView, NotesView {
 
     fun showAboutDialog()
     fun showPage(tab: CurrentTab)
@@ -46,7 +47,12 @@ interface MainView : BooksView, UsersView, NotesView {
     fun showProfileOption(isVisible: Boolean)
     fun setDarkThemeOptionChecked(isChecked: Boolean)
 
-    interface Callbacks : BooksView.Callbacks, UsersView.Callbacks, NotesView.Callbacks {
+    interface Callbacks :
+        LoginView.Callbacks,
+        BooksView.Callbacks,
+        UsersView.Callbacks,
+        NotesView.Callbacks {
+
         fun onNavigationClicked(itemId: Int)
         fun onToolbarClicked()
         fun onLoginOptionClicked()
@@ -129,6 +135,30 @@ 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

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

@@ -0,0 +1,13 @@
+package com.sirekanyan.knigopis.feature.login
+
+interface LoginView {
+
+    fun showPermissionsRetryDialog()
+    fun showPermissionsSettingsDialog()
+
+    interface Callbacks {
+        fun onRetryLoginClicked()
+        fun onGotoSettingsClicked()
+    }
+
+}

+ 3 - 4
app/src/main/res/values-ru/strings.xml

@@ -94,10 +94,9 @@
     <string name="notes.error.empty">Нет новых комментариев</string>
 
     <!-- permissions -->
-    <string name="permissions.title.no_access">Нет доступа</string>
-    <string name="permissions.message.no_access">Данное разрешение необходимо для авторизации через ulogin</string>
-    <string name="permissions.title.request">Разрешения</string>
-    <string name="permissions.message.request">Подтвердите разрешения в настройках, чтобы войти в приложение</string>
+    <string name="permissions.title">Разрешения</string>
+    <string name="permissions.message.retry">Данное разрешение необходимо для авторизации через uLogin</string>
+    <string name="permissions.message.settings">Включите разрешение в настройках, чтобы авторизоваться с помощью uLogin</string>
     <string name="permissions.button.settings">В настройки</string>
 
     <!-- social networks -->

+ 3 - 4
app/src/main/res/values/strings.xml

@@ -93,10 +93,9 @@
     <string name="notes.error.empty">No one is posted yet</string>
 
     <!-- permissions -->
-    <string name="permissions.title.no_access">Permission denied</string>
-    <string name="permissions.message.no_access">This permission is necessary to authorize with ulogin, please try again</string>
-    <string name="permissions.title.request">Permissions</string>
-    <string name="permissions.message.request">Please allow permissions in order to login</string>
+    <string name="permissions.title">Permissions</string>
+    <string name="permissions.message.retry">The permission is necessary to authorize you by using uLogin library, please allow in order to continue</string>
+    <string name="permissions.message.settings">Please allow permission in settings to authorize with uLogin</string>
     <string name="permissions.button.settings">Goto settings</string>
 
     <!-- social networks -->