Kaynağa Gözat

Added memory cache for user avatars

Vadik Sirekanyan 7 yıl önce
ebeveyn
işleme
48fae12456

+ 1 - 1
app/build.gradle

@@ -47,7 +47,7 @@ dependencies {
     implementation 'org.koin:koin-android:0.9.1'
 
     // etc
-    implementation 'com.github.bumptech.glide:glide:4.5.0'
+    implementation 'com.github.bumptech.glide:glide:4.7.1'
     implementation(name: 'ulogin-sdk-v1.1', ext: 'aar')
 
     // testing

+ 5 - 1
app/src/main/java/me/vadik/knigopis/MainActivity.kt

@@ -28,6 +28,8 @@ import me.vadik.knigopis.api.BookCoverSearch
 import me.vadik.knigopis.api.Endpoint
 import me.vadik.knigopis.auth.KAuth
 import me.vadik.knigopis.common.ResourceProvider
+import me.vadik.knigopis.data.AvatarCache
+import me.vadik.knigopis.data.AvatarCacheImpl
 import me.vadik.knigopis.dialog.DialogFactory
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.CurrentTab
@@ -63,7 +65,8 @@ class MainActivity : AppCompatActivity(), Router {
     private val booksAdapter by lazy { BooksAdapter(bookCoverSearch, api, auth, this, dialogs) }
     private val allBooksAdapter by lazy { booksAdapter.build(allBooks) }
     private val usersAdapter by lazy { UsersAdapter(allUsers, this, dialogs, resources) }
-    private val notesAdapter by lazy { NotesAdapter(allNotes, this) }
+    private val avatarCache by lazy { AvatarCacheImpl() as AvatarCache }
+    private val notesAdapter by lazy { NotesAdapter(allNotes, avatarCache, this) }
     private var userLoggedIn = false
     private var booksChanged = false
     private lateinit var loginOption: MenuItem
@@ -349,6 +352,7 @@ class MainActivity : AppCompatActivity(), Router {
             .io2main()
             .showProgressBar()
             .subscribe({ subscriptions ->
+                avatarCache.urls = subscriptions.map { it.subUser.id to it.subUser.avatar }.toMap()
                 usersPlaceholder.show(subscriptions.isEmpty())
                 usersErrorPlaceholder.hide()
                 allUsers.clear()

+ 5 - 0
app/src/main/java/me/vadik/knigopis/adapters/notes/NoteViewHolder.kt

@@ -4,6 +4,7 @@ import android.support.v7.widget.RecyclerView
 import android.text.format.DateUtils
 import android.view.View
 import kotlinx.android.synthetic.main.note.view.*
+import me.vadik.knigopis.common.setCircleImage
 
 class NoteViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
 
@@ -27,4 +28,8 @@ class NoteViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
         view.userNickname.text = nickname
     }
 
+    fun setAvatarUrl(url: String?) {
+        view.userSmallAvatar.setCircleImage(url)
+    }
+
 }

+ 3 - 0
app/src/main/java/me/vadik/knigopis/adapters/notes/NotesAdapter.kt

@@ -4,11 +4,13 @@ import android.support.v7.widget.RecyclerView
 import android.view.ViewGroup
 import me.vadik.knigopis.R
 import me.vadik.knigopis.Router
+import me.vadik.knigopis.data.AvatarCache
 import me.vadik.knigopis.inflate
 import me.vadik.knigopis.model.note.Note
 
 class NotesAdapter(
     private val notes: List<Note>,
+    private val avatarCache: AvatarCache,
     private val router: Router
 ) : RecyclerView.Adapter<NoteViewHolder>() {
 
@@ -31,6 +33,7 @@ class NotesAdapter(
         holder.view.setOnClickListener {
             router.openUserScreen(note.user)
         }
+        holder.setAvatarUrl(avatarCache.urls[note.user.id])
     }
 
 }

+ 4 - 12
app/src/main/java/me/vadik/knigopis/adapters/users/UserViewHolder.kt

@@ -2,11 +2,9 @@ package me.vadik.knigopis.adapters.users
 
 import android.support.v7.widget.RecyclerView
 import android.view.View
-import com.bumptech.glide.Glide
-import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
-import com.bumptech.glide.request.RequestOptions
 import kotlinx.android.synthetic.main.user.view.*
 import me.vadik.knigopis.R
+import me.vadik.knigopis.common.setCircleImage
 import me.vadik.knigopis.getHtmlString
 import me.vadik.knigopis.showNow
 
@@ -14,15 +12,9 @@ class UserViewHolder(val view: View) : RecyclerView.ViewHolder(view) {
 
     private val context = view.context.applicationContext
 
-    fun setAvatarUrl(url: String?) =
-        Glide.with(view.context)
-            .load(url)
-            .apply(
-                RequestOptions.circleCropTransform()
-                    .placeholder(R.drawable.oval_placeholder_background)
-            )
-            .transition(DrawableTransitionOptions.withCrossFade())
-            .into(view.userAvatar)
+    fun setAvatarUrl(url: String?) {
+        view.userAvatar.setCircleImage(url)
+    }
 
     fun setNickname(nickname: String) {
         view.userNickname.text = nickname

+ 18 - 0
app/src/main/java/me/vadik/knigopis/common/ImageView.kt

@@ -0,0 +1,18 @@
+package me.vadik.knigopis.common
+
+import android.widget.ImageView
+import com.bumptech.glide.Glide
+import com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions
+import com.bumptech.glide.request.RequestOptions
+import me.vadik.knigopis.R
+
+fun ImageView.setCircleImage(url: String?) {
+    Glide.with(context)
+        .load(url)
+        .apply(
+            RequestOptions.circleCropTransform()
+                .placeholder(R.drawable.oval_placeholder_background)
+        )
+        .transition(DrawableTransitionOptions.withCrossFade())
+        .into(this)
+}

+ 9 - 0
app/src/main/java/me/vadik/knigopis/data/AvatarCache.kt

@@ -0,0 +1,9 @@
+package me.vadik.knigopis.data
+
+interface AvatarCache {
+    var urls: Map<String, String?>
+}
+
+class AvatarCacheImpl : AvatarCache {
+    override var urls = mapOf<String, String?>()
+}

+ 8 - 14
app/src/main/java/me/vadik/knigopis/profile/ProfileActivity.kt

@@ -8,14 +8,12 @@ import android.support.v7.widget.Toolbar
 import android.view.MenuItem
 import android.view.animation.AccelerateInterpolator
 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 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.common.setCircleImage
 import me.vadik.knigopis.model.Book
 import me.vadik.knigopis.model.PlannedBook
 import me.vadik.knigopis.model.Profile
@@ -91,14 +89,7 @@ class ProfileActivity : AppCompatActivity() {
                 userId = user.id
                 profileUrl = user.fixedProfile
                 profileNickname.text = user.nickname.orEmpty()
-                Glide.with(this)
-                    .load(user.photo)
-                    .apply(
-                        RequestOptions.circleCropTransform()
-                            .placeholder(R.drawable.oval_placeholder_background)
-                    )
-                    .transition(DrawableTransitionOptions.withCrossFade())
-                    .into(profileAvatar)
+                profileAvatar.setCircleImage(user.photo)
                 editOption.isVisible = true
             }, {
                 logError("cannot get profile", it)
@@ -111,7 +102,8 @@ class ProfileActivity : AppCompatActivity() {
             .io2main()
             .subscribe({ finishedBooks ->
                 doneList.clearAndAddAll(finishedBooks)
-                profileDoneCount.text = getString(R.string.profile_caption_done, doneList.size as Int)
+                profileDoneCount.text =
+                        getString(R.string.profile_caption_done, doneList.size as Int)
             }, {
                 logError("cannot check finished books count", it)
             })
@@ -119,9 +111,11 @@ class ProfileActivity : AppCompatActivity() {
             .io2main()
             .subscribe({ plannedBooks ->
                 doingList.clearAndAddAll(plannedBooks.filter { it.priority > 0 })
-                profileDoingCount.text = getString(R.string.profile_caption_doing, doingList.size as Int)
+                profileDoingCount.text =
+                        getString(R.string.profile_caption_doing, doingList.size as Int)
                 todoList.clearAndAddAll(plannedBooks.filter { it.priority == 0 })
-                profileTodoCount.text = getString(R.string.profile_caption_todo, todoList.size as Int)
+                profileTodoCount.text =
+                        getString(R.string.profile_caption_todo, todoList.size as Int)
             }, {
                 logError("cannot check planned books count", it)
             })

+ 4 - 3
app/src/main/res/layout/note.xml

@@ -46,7 +46,7 @@
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
             android:layout_marginTop="4dp"
-            android:gravity="end|bottom">
+            android:gravity="end|center_vertical">
 
             <TextView
                 android:id="@+id/userDate"
@@ -74,8 +74,9 @@
                 tools:text="Павел Дуров" />
 
             <ImageView
-                android:layout_width="16sp"
-                android:layout_height="16sp"
+                android:id="@+id/userSmallAvatar"
+                android:layout_width="32dp"
+                android:layout_height="32dp"
                 android:layout_marginStart="8dp"
                 android:src="@drawable/oval_placeholder_background"
                 tools:ignore="ContentDescription" />