Ver código fonte

Added ability to update user nickname

Vadik Sirekanyan 7 anos atrás
pai
commit
3a81265484

+ 6 - 0
app/src/main/java/me/vadik/knigopis/extensions.kt

@@ -128,6 +128,12 @@ fun ProgressBar.setProgressSmoothly(progress: Int) {
     ObjectAnimator.ofInt(this, "progress", progress).start()
 }
 
+fun Activity.showKeyboard() {
+    currentFocus?.let { view ->
+        systemInputMethodManager.showSoftInput(view, 0)
+    }
+}
+
 fun Activity.hideKeyboard() {
     currentFocus?.let { view ->
         systemInputMethodManager.hideSoftInputFromWindow(view.windowToken, 0)

+ 78 - 5
app/src/main/java/me/vadik/knigopis/profile/ProfileActivity.kt

@@ -5,22 +5,22 @@ import android.content.Intent
 import android.os.Bundle
 import android.support.v7.app.AppCompatActivity
 import android.support.v7.widget.Toolbar
+import android.view.inputmethod.EditorInfo
 import com.bumptech.glide.Glide
 import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
 import com.bumptech.glide.request.RequestOptions
 import kotlinx.android.synthetic.main.profile_activity.*
-import kotlinx.android.synthetic.main.profile_contact_item.*
-import me.vadik.knigopis.R
+import me.vadik.knigopis.*
 import me.vadik.knigopis.api.Endpoint
 import me.vadik.knigopis.auth.KAuth
 import me.vadik.knigopis.common.createTextShareIntent
-import me.vadik.knigopis.io2main
-import me.vadik.knigopis.logError
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.PlannedBook
+import me.vadik.knigopis.model.Profile
 import org.koin.android.ext.android.inject
 import java.util.*
 
+
 fun Context.createProfileIntent() = Intent(this, ProfileActivity::class.java)
 
 class ProfileActivity : AppCompatActivity() {
@@ -31,6 +31,7 @@ class ProfileActivity : AppCompatActivity() {
     private val todoList = mutableListOf<Book>()
     private val doingList = mutableListOf<Book>()
     private val doneList = mutableListOf<Book>()
+    private var userId: String? = null
     private var profileUrl: String? = null
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -49,6 +50,15 @@ class ProfileActivity : AppCompatActivity() {
         profileDoneCount.setOnClickListener {
             setRandomFooterBook(doneList)
         }
+        profileNicknameEditText.setOnEditorActionListener { _, actionId, _ ->
+            when (actionId) {
+                EditorInfo.IME_ACTION_DONE -> {
+                    updateNickname()
+                    true
+                }
+                else -> false
+            }
+        }
     }
 
     private fun setRandomFooterBook(books: List<Book>) {
@@ -62,12 +72,17 @@ class ProfileActivity : AppCompatActivity() {
 
     override fun onStart() {
         super.onStart()
+        refreshProfile()
+        refreshCounters()
+    }
+
+    private fun refreshProfile() {
         api.getProfile(auth.getAccessToken())
             .io2main()
             .subscribe({ user ->
+                userId = user.id
                 profileUrl = user.fixedProfile
                 profileNickname.text = user.nickname ?: "(не указано имя)"
-                profileContactTitle.text = user.identity
                 Glide.with(this)
                     .load(user.photo)
                     .apply(
@@ -79,6 +94,9 @@ class ProfileActivity : AppCompatActivity() {
             }, {
                 logError("cannot get profile", it)
             })
+    }
+
+    private fun refreshCounters() {
         api.getFinishedBooks(auth.getAccessToken())
             .io2main()
             .subscribe({ finishedBooks ->
@@ -99,12 +117,44 @@ class ProfileActivity : AppCompatActivity() {
             })
     }
 
+    private fun updateNickname() {
+        val id = userId ?: return
+        api.updateProfile(
+            id,
+            auth.getAccessToken(),
+            Profile(profileNicknameEditText.text.toString(), profileUrl.orEmpty())
+        ).io2main()
+            .subscribe({
+                profileNickname.text = profileNicknameEditText.text
+                quitEditMode()
+                refreshProfile()
+            }, {
+                toast("Не удалось обновить имя")
+                logError("cannot update profile", it)
+            })
+    }
+
     private fun initToolbar(toolbar: Toolbar) {
         toolbar.setNavigationIcon(R.drawable.ic_close)
         toolbar.setNavigationOnClickListener { finish() }
         toolbar.inflateMenu(R.menu.profile_menu)
         toolbar.setOnMenuItemClickListener {
             when (it.itemId) {
+                R.id.option_edit_profile -> {
+                    if (isEditMode) {
+                        if (profileNickname.text.toString() == profileNicknameEditText.text.toString()) {
+                            quitEditMode()
+                        } else {
+                            updateNickname()
+                        }
+                    } else {
+                        enterEditMode()
+                        val nickname = profileNickname.text
+                        profileNicknameEditText.setText(nickname)
+                        profileNicknameEditText.setSelection(nickname.length, nickname.length)
+                    }
+                    true
+                }
                 R.id.option_share_profile -> {
                     profileUrl?.let {
                         startActivity(
@@ -123,6 +173,29 @@ class ProfileActivity : AppCompatActivity() {
         }
     }
 
+    override fun onBackPressed() {
+        if (profileNickname.isVisible) {
+            super.onBackPressed()
+        } else {
+            quitEditMode()
+        }
+    }
+
+    private fun enterEditMode() {
+        topProfileSpace.hideNow()
+        profileNicknameSwitcher.displayedChild = 1
+        showKeyboard()
+    }
+
+    private fun quitEditMode() {
+        hideKeyboard()
+        topProfileSpace.showNow()
+        profileNicknameSwitcher.displayedChild = 0
+    }
+
+    private val isEditMode
+        get() = profileNicknameSwitcher.displayedChild == 1
+
     private fun <T> List<T>.random(): T? {
         if (size == 0) return null
         return get(random.nextInt(size))

+ 30 - 19
app/src/main/res/layout/profile_activity.xml

@@ -4,6 +4,7 @@
     xmlns:tools="http://schemas.android.com/tools"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
+    android:animateLayoutChanges="true"
     android:orientation="vertical"
     tools:background="@color/colorPrimaryDark"
     tools:ignore="ContentDescription">
@@ -16,9 +17,10 @@
         app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />
 
     <View
+        android:id="@+id/topProfileSpace"
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="5" />
+        android:layout_weight="1" />
 
     <ImageView
         android:id="@+id/profileAvatar"
@@ -27,31 +29,40 @@
         android:layout_gravity="center_horizontal"
         tools:src="@drawable/oval_placeholder_background" />
 
-    <TextView
-        android:id="@+id/profileNickname"
-        android:layout_width="wrap_content"
+    <ViewSwitcher
+        android:id="@+id/profileNicknameSwitcher"
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
         android:layout_gravity="center_horizontal"
-        android:gravity="center"
-        android:padding="16dp"
-        android:textColor="@color/white"
-        android:textSize="28sp"
-        tools:text="Павел Дуров" />
+        android:padding="16dp">
 
-    <View
-        android:layout_width="match_parent"
-        android:layout_height="0dp"
-        android:layout_weight="1" />
-
-    <!-- TODO: visible -->
-    <include
-        layout="@layout/profile_contact_item"
-        android:visibility="invisible" />
+        <TextView
+            android:id="@+id/profileNickname"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:ellipsize="end"
+            android:gravity="center"
+            android:maxLines="1"
+            android:textSize="28sp"
+            tools:text="Павел Дуров" />
+
+        <EditText
+            android:id="@+id/profileNicknameEditText"
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:gravity="center"
+            android:hint="@string/profile_hint_nickname"
+            android:inputType="text"
+            android:textSize="28sp" />
+
+    </ViewSwitcher>
 
     <View
         android:layout_width="match_parent"
         android:layout_height="0dp"
-        android:layout_weight="5" />
+        android:layout_weight="2" />
 
     <View
         android:layout_width="match_parent"

+ 0 - 32
app/src/main/res/layout/profile_contact_item.xml

@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
-    xmlns:app="http://schemas.android.com/apk/res-auto"
-    xmlns:tools="http://schemas.android.com/tools"
-    android:layout_width="wrap_content"
-    android:layout_height="48dp"
-    android:layout_gravity="center_horizontal"
-    android:paddingEnd="16dp"
-    android:paddingStart="16dp">
-
-    <ImageView
-        android:id="@+id/profileContactIcon"
-        android:layout_width="24dp"
-        android:layout_height="24dp"
-        android:layout_gravity="center_vertical"
-        android:tint="@color/white"
-        app:srcCompat="@drawable/ic_public"
-        tools:ignore="ContentDescription" />
-
-    <TextView
-        android:id="@+id/profileContactTitle"
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:layout_gravity="center_vertical"
-        android:layout_marginStart="40dp"
-        android:ellipsize="end"
-        android:maxLines="1"
-        android:textColor="@color/white"
-        android:textSize="16sp"
-        tools:text="Вконтакте" />
-
-</FrameLayout>

+ 6 - 7
app/src/main/res/menu/profile_menu.xml

@@ -2,13 +2,12 @@
 <menu xmlns:android="http://schemas.android.com/apk/res/android"
     xmlns:app="http://schemas.android.com/apk/res-auto">
 
-    <!-- TODO -->
-    <!--<item-->
-    <!--android:id="@+id/option_edit_profile"-->
-    <!--android:icon="@drawable/ic_edit"-->
-    <!--android:title="@string/profile_option_edit"-->
-    <!--app:iconTint="@color/white"-->
-    <!--app:showAsAction="ifRoom" />-->
+    <item
+        android:id="@+id/option_edit_profile"
+        android:icon="@drawable/ic_edit"
+        android:title="@string/profile_option_edit"
+        app:iconTint="@color/white"
+        app:showAsAction="ifRoom" />
 
     <item
         android:id="@+id/option_share_profile"