Explorar el Código

Added runtime permissions

sirekanyan hace 8 años
padre
commit
39d96d00c9

+ 2 - 1
app/build.gradle

@@ -20,9 +20,10 @@ dependencies {
     compile "com.android.support:design:$support_version"
     compile "com.android.support:support-vector-drawable:$support_version"
     compile 'com.android.support.constraint:constraint-layout:1.1.0-beta2'
-    compile "io.reactivex.rxjava2:rxjava:2.1.4"
+    compile 'io.reactivex.rxjava2:rxjava:2.1.4'
     compile 'io.reactivex.rxjava2:rxkotlin:2.1.0'
     compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
+    compile 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.4@aar'
     compile "com.squareup.retrofit2:retrofit:$retrofit_version"
     compile "com.squareup.retrofit2:adapter-rxjava2:$retrofit_version"
     compile "com.squareup.retrofit2:converter-gson:$retrofit_version"

+ 48 - 7
app/src/main/java/me/vadik/knigopis/MainActivity.kt

@@ -1,7 +1,10 @@
 package me.vadik.knigopis
 
+import android.Manifest.permission.READ_PHONE_STATE
 import android.content.Intent
+import android.net.Uri
 import android.os.Bundle
+import android.provider.Settings
 import android.support.design.widget.BottomNavigationView
 import android.support.design.widget.FloatingActionButton
 import android.support.v7.app.AlertDialog
@@ -12,6 +15,7 @@ import android.support.v7.widget.Toolbar
 import android.view.MenuItem
 import android.view.View
 import android.widget.TextView
+import com.tbruyelle.rxpermissions2.RxPermissions
 import io.reactivex.rxkotlin.Singles
 import me.vadik.knigopis.adapters.BooksAdapter
 import me.vadik.knigopis.api.BookCoverSearchImpl
@@ -116,13 +120,7 @@ class MainActivity : AppCompatActivity(), Router {
     toolbar.setOnMenuItemClickListener { item ->
       when (item.itemId) {
         R.id.option_login -> {
-          if (auth.isAuthorized()) {
-            auth.logout()
-            refresh()
-          } else {
-            startActivityForResult(auth.getTokenRequest(), ULOGIN_REQUEST_CODE)
-          }
-          refreshOptionsMenu()
+          login()
           true
         }
         R.id.option_about -> {
@@ -144,6 +142,49 @@ class MainActivity : AppCompatActivity(), Router {
     loginOption = toolbar.menu.findItem(R.id.option_login)
   }
 
+  private fun login() {
+    RxPermissions(this).requestEach(READ_PHONE_STATE).subscribe({
+      when {
+        it.granted -> {
+          if (auth.isAuthorized()) {
+            auth.logout()
+            refresh()
+          } else {
+            startActivityForResult(auth.getTokenRequest(), ULOGIN_REQUEST_CODE)
+          }
+          refreshOptionsMenu()
+        }
+        it.shouldShowRequestPermissionRationale -> {
+          AlertDialog.Builder(this)
+              .setTitle(R.string.no_access)
+              .setMessage(R.string.no_access_message)
+              .setPositiveButton(R.string.no_access_retry_button) { _, _ ->
+                login()
+              }
+              .setNegativeButton(R.string.dialog_cancel_button, null)
+              .setCancelable(false)
+              .show()
+        }
+        else -> {
+          AlertDialog.Builder(this)
+              .setTitle(R.string.no_permissions)
+              .setMessage(R.string.no_permissions_message)
+              .setPositiveButton(R.string.no_permissions_goto_settings_button) { _, _ ->
+                startActivity(Intent(
+                    Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
+                    Uri.fromParts("package", packageName, null)
+                ))
+              }
+              .setNegativeButton(R.string.dialog_cancel_button, null)
+              .setCancelable(false)
+              .show()
+        }
+      }
+    }, {
+      logError("cannot request permission", it)
+    })
+  }
+
   private fun refreshOptionsMenu() {
     loginOption.isVisible = true
     if (auth.isAuthorized()) {

+ 12 - 0
app/src/main/res/values-ru/strings.xml

@@ -51,4 +51,16 @@
     <string name="error_loading_books">Проверьте подключение к сети.</string>
     <string name="error_no_books">У вас пока нет книг.</string>
 
+    <!-- permissions -->
+    <string name="no_access">Нет доступа</string>
+    <string name="no_access_message">Данное разрешение необходимо для авторизации через ulogin</string>
+    <string name="no_access_retry_button">Повторить</string>
+    <string name="no_permissions">Разрешения</string>
+    <string name="no_permissions_message">Подтвердите разрешения в настройках, чтобы войти в приложение</string>
+    <string name="no_permissions_goto_settings_button">В настройки</string>
+    <string name="dialog_cancel_button">Отменить</string>
+
+    <!-- dev -->
+    <string name="dev_mode_message">НЕ ПЫТАЙТЕСБ ЧТОТ0 N3МЕНИТЬ!</string>
+
 </resources>

+ 10 - 1
app/src/main/res/values/strings.xml

@@ -51,7 +51,16 @@
     <string name="error_loading_books">Check your network connection.</string>
     <string name="error_no_books">You don\'t have any books.</string>
 
+    <!-- permissions -->
+    <string name="no_access">Permission denied</string>
+    <string name="no_access_message">This permission is necessary to authorize with ulogin, please try again</string>
+    <string name="no_access_retry_button">Retry</string>
+    <string name="no_permissions">Permissions</string>
+    <string name="no_permissions_message">Please allow permissions in order to login</string>
+    <string name="no_permissions_goto_settings_button">Goto settings</string>
+    <string name="dialog_cancel_button">Cancel</string>
+
     <!-- dev -->
-    <string name="dev_mode_message">НЕ ПЫТАЙТЕСБ ЧТОТ0 N3МЕНИТЬ!</string>
+    <string name="dev_mode_message">We Present A SPECIAL PRESENTATION</string>
 
 </resources>