Преглед изворни кода

Added simple dialog for showing user profile info

Vadik Sirekanyan пре 7 година
родитељ
комит
6ffcbd3de2

+ 40 - 16
app/src/main/java/me/vadik/knigopis/MainActivity.kt

@@ -12,6 +12,7 @@ import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.LinearLayoutManager
 import android.support.v7.widget.RecyclerView
 import android.support.v7.widget.Toolbar
+import android.text.format.DateUtils
 import android.view.MenuItem
 import android.view.View
 import com.tbruyelle.rxpermissions2.RxPermissions
@@ -59,7 +60,7 @@ class MainActivity : AppCompatActivity(), Router {
     private var userLoggedIn = false
     private var booksChanged = false
     private lateinit var loginOption: MenuItem
-    private lateinit var shareOption: MenuItem
+    private lateinit var profileOption: MenuItem
     private lateinit var currentTab: CurrentTab
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -150,6 +151,18 @@ class MainActivity : AppCompatActivity(), Router {
         }
     }
 
+    override fun shareProfile(url: String) {
+        val sharingIntent = Intent(Intent.ACTION_SEND)
+            .setType("text/plain")
+            .putExtra(Intent.EXTRA_TEXT, url)
+        startActivity(
+            Intent.createChooser(
+                sharingIntent,
+                getString(R.string.option_share_title)
+            )
+        )
+    }
+
     private fun initNavigationView() {
         refresh(HOME_TAB)
         navigation.setOnNavigationItemSelectedListener { item ->
@@ -171,18 +184,29 @@ class MainActivity : AppCompatActivity(), Router {
                     login()
                     true
                 }
-                R.id.option_share -> {
-                    auth.getUserProfile()?.let { profile ->
-                        val sharingIntent = Intent(Intent.ACTION_SEND)
-                            .setType("text/plain")
-                            .putExtra(Intent.EXTRA_TEXT, profile)
-                        startActivity(
-                            Intent.createChooser(
-                                sharingIntent,
-                                getString(R.string.option_share_title)
-                            )
-                        )
-                    } ?: logWarn("Cannot share user profile: it's empty")
+                R.id.option_profile -> {
+                    api.getProfile(auth.getAccessToken())
+                        .io2main()
+                        .subscribe({ user ->
+                            AlertDialog.Builder(this)
+                                .setTitle("Мой профиль")
+                                .setMessage(
+                                    """
+                                        Имя: ${user.nickname ?: "(не задано)"}
+                                        Книг: ${user.booksCount}
+                                        Подписок: ${user.subscriptions?.size ?: 0}
+                                        Создан: ${DateUtils.getRelativeTimeSpanString(user.fixedCreatedAt.time)}
+                                        Обновлен: ${DateUtils.getRelativeTimeSpanString(user.fixedUpdatedAt.time)}
+                                    """.trimIndent()
+                                )
+                                .setPositiveButton("Поделиться") { _, _ ->
+                                    shareProfile(user.fixedProfile)
+                                }
+                                .setNegativeButton("Закрыть", null)
+                                .show()
+                        }, {
+                            logError("Cannot get profile", it)
+                        })
                     true
                 }
                 R.id.option_about -> {
@@ -218,7 +242,7 @@ class MainActivity : AppCompatActivity(), Router {
             }
         }
         loginOption = toolbar.menu.findItem(R.id.option_login)
-        shareOption = toolbar.menu.findItem(R.id.option_share)
+        profileOption = toolbar.menu.findItem(R.id.option_profile)
     }
 
     private fun login() {
@@ -268,13 +292,13 @@ class MainActivity : AppCompatActivity(), Router {
 
     private fun refreshOptionsMenu() {
         loginOption.isVisible = true
-        shareOption.isVisible = auth.isAuthorized()
+        profileOption.isVisible = auth.isAuthorized()
         if (auth.isAuthorized()) {
             loginOption.setTitle(R.string.option_logout)
             loginOption.setShowAsAction(MenuItem.SHOW_AS_ACTION_NEVER)
         } else {
             loginOption.setTitle(R.string.option_login)
-            loginOption.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS)
+            loginOption.setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM)
         }
     }
 

+ 1 - 0
app/src/main/java/me/vadik/knigopis/Router.kt

@@ -10,4 +10,5 @@ interface Router {
     fun openUserScreen(user: Subscription)
     fun openUserScreen(user: Identity)
     fun openBrowser(uri: Uri)
+    fun shareProfile(url: String)
 }

+ 5 - 0
app/src/main/java/me/vadik/knigopis/api/Endpoint.kt

@@ -65,6 +65,11 @@ interface Endpoint {
         @Query("access-token") accessToken: String
     ): Single<List<Subscription>>
 
+    @GET("users/current")
+    fun getProfile(
+        @Query("access-token") accessToken: String
+    ): Single<Credentials.UserFull>
+
     @GET("users/{id}/books")
     fun getUserBooks(@Path("id") userId: String): Single<List<UserBook>>
 

+ 1 - 1
app/src/main/java/me/vadik/knigopis/auth/KAuth.kt

@@ -58,7 +58,7 @@ class KAuthImpl(
                         .putString(ACCESS_TOKEN_KEY, it.accessToken)
                         .putString(
                             USER_PROFILE,
-                            "http://www.knigopis.com/#/user/books?u=${it.user.id}"
+                            it.user.fixedProfile
                         )
                         .apply()
                     onSuccess()

+ 11 - 5
app/src/main/java/me/vadik/knigopis/model/Credentials.kt

@@ -1,6 +1,7 @@
 package me.vadik.knigopis.model
 
 import com.google.gson.annotations.SerializedName
+import java.util.*
 
 class Credentials(
     @SerializedName("access-token")
@@ -11,13 +12,18 @@ class Credentials(
     class UserFull(
         val id: String,
         val lang: String,
-        val nickname: String,
+        val nickname: String?,
         val photo: String,
         val profile: String,
         val identity: String,
         val booksCount: Int,
-        val subscriptions: Map<String, Int>,
-        val createdAt: String,
-        val updatedAt: String
-    )
+        val subscriptions: Map<String, Int>?,
+        val createdAt: Date,
+        val updatedAt: Date
+    ) {
+        // TODO https://trello.com/c/UymHYoPK
+        val fixedCreatedAt get() = Date(createdAt.time + TimeZone.getDefault().rawOffset)
+        val fixedUpdatedAt get() = Date(updatedAt.time + TimeZone.getDefault().rawOffset)
+        val fixedProfile get() = "http://www.knigopis.com/#/user/books?u=$id"
+    }
 }

+ 0 - 9
app/src/main/res/drawable/ic_share.xml

@@ -1,9 +0,0 @@
-<vector xmlns:android="http://schemas.android.com/apk/res/android"
-        android:width="24dp"
-        android:height="24dp"
-        android:viewportWidth="24.0"
-        android:viewportHeight="24.0">
-    <path
-        android:fillColor="#FF000000"
-        android:pathData="M18,16.08c-0.76,0 -1.44,0.3 -1.96,0.77L8.91,12.7c0.05,-0.23 0.09,-0.46 0.09,-0.7s-0.04,-0.47 -0.09,-0.7l7.05,-4.11c0.54,0.5 1.25,0.81 2.04,0.81 1.66,0 3,-1.34 3,-3s-1.34,-3 -3,-3 -3,1.34 -3,3c0,0.24 0.04,0.47 0.09,0.7L8.04,9.81C7.5,9.31 6.79,9 6,9c-1.66,0 -3,1.34 -3,3s1.34,3 3,3c0.79,0 1.5,-0.31 2.04,-0.81l7.12,4.16c-0.05,0.21 -0.08,0.43 -0.08,0.65 0,1.61 1.31,2.92 2.92,2.92 1.61,0 2.92,-1.31 2.92,-2.92s-1.31,-2.92 -2.92,-2.92z"/>
-</vector>

+ 7 - 8
app/src/main/res/menu/options.xml

@@ -3,19 +3,18 @@
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
     <item
-        android:id="@+id/option_share"
-        android:icon="@drawable/ic_share"
-        android:title="@string/option_share"
+        android:id="@+id/option_profile"
+        android:title="@string/option_profile"
         android:visible="false"
-        app:showAsAction="ifRoom" />
-
-    <item
-        android:id="@+id/option_login"
-        android:visible="false" />
+        app:showAsAction="never" />
 
     <item
         android:id="@+id/option_about"
         android:title="@string/option_about"
         app:showAsAction="never" />
 
+    <item
+        android:id="@+id/option_login"
+        android:visible="false" />
+
 </menu>

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

@@ -12,7 +12,7 @@
     <!-- menu -->
     <string name="option_login">Войти</string>
     <string name="option_logout">Выйти</string>
-    <string name="option_share">Поделиться</string>
+    <string name="option_profile">Мой профиль</string>
     <string name="option_share_title">Отправить ссылку на профиль</string>
     <string name="option_about">О приложении</string>
 

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

@@ -12,7 +12,7 @@
     <!-- menu -->
     <string name="option_login">Login</string>
     <string name="option_logout">Logout</string>
-    <string name="option_share">Share</string>
+    <string name="option_profile">Profile</string>
     <string name="option_share_title">Share your profile</string>
     <string name="option_about">About</string>