From 5f0cefad1fb41a78f3359c363a5e882da243b7bb Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Sun, 6 Jan 2019 17:42:56 +0100
Subject: [PATCH] Clicking on avatar in user info now opens the avatar in
 browser

---
 .../ui/chat/info/user/UserInfoFragment.kt     | 45 ++++++++++++++++++-
 .../quasseldroid/util/helper/GlideHelper.kt   | 20 ++++++++-
 2 files changed, 63 insertions(+), 2 deletions(-)

diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt
index b1c428a72..8a0098226 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/user/UserInfoFragment.kt
@@ -19,6 +19,8 @@
 
 package de.kuschku.quasseldroid.ui.chat.info.user
 
+import android.content.Intent
+import android.net.Uri
 import android.os.Bundle
 import android.text.SpannableString
 import android.view.LayoutInflater
@@ -31,6 +33,7 @@ import android.widget.Toast
 import androidx.lifecycle.Observer
 import butterknife.BindView
 import butterknife.ButterKnife
+import com.google.gson.GsonBuilder
 import de.kuschku.libquassel.protocol.Buffer_Type
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.IrcUser
@@ -41,13 +44,18 @@ import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.settings.MessageSettings
 import de.kuschku.quasseldroid.ui.chat.ChatActivity
 import de.kuschku.quasseldroid.util.avatars.AvatarHelper
+import de.kuschku.quasseldroid.util.avatars.MatrixApi
+import de.kuschku.quasseldroid.util.avatars.MatrixAvatarInfo
 import de.kuschku.quasseldroid.util.helper.*
 import de.kuschku.quasseldroid.util.irc.format.ContentFormatter
 import de.kuschku.quasseldroid.util.irc.format.spans.IrcItalicSpan
 import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
 import de.kuschku.quasseldroid.util.ui.BetterLinkMovementMethod
 import de.kuschku.quasseldroid.util.ui.LinkLongClickMenuHelper
+import de.kuschku.quasseldroid.viewmodel.data.Avatar
 import io.reactivex.Observable
+import retrofit2.Retrofit
+import retrofit2.converter.gson.GsonConverterFactory
 import javax.inject.Inject
 
 class UserInfoFragment : ServiceBoundFragment() {
@@ -108,11 +116,19 @@ class UserInfoFragment : ServiceBoundFragment() {
   @Inject
   lateinit var messageSettings: MessageSettings
 
+  private var actualUrl: String? = null
+
   override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                             savedInstanceState: Bundle?): View? {
     val view = inflater.inflate(R.layout.fragment_info_user, container, false)
     ButterKnife.bind(this, view)
 
+    val matrixApi = Retrofit.Builder()
+      .baseUrl("https://matrix.org/")
+      .addConverterFactory(GsonConverterFactory.create(GsonBuilder().setLenient().create()))
+      .build()
+      .create(MatrixApi::class.java)
+
     val openBuffer = arguments?.getBoolean("openBuffer")
 
     val networkId2 = arguments?.getInt("networkId")
@@ -158,10 +174,31 @@ class UserInfoFragment : ServiceBoundFragment() {
     }.toLiveData().observe(this, Observer {
       val processUser = { user: IrcUserInfo ->
         avatar.post {
+          actualUrl = null
           avatar.loadAvatars(
             AvatarHelper.avatar(messageSettings, user, maxOf(avatar.width, avatar.height)),
             crop = false
-          )
+          ) { model ->
+            when (model) {
+              is String              -> {
+                actualUrl = model
+              }
+              is Avatar.MatrixAvatar -> {
+                runInBackground {
+                  matrixApi.avatarUrl(model.userId).execute().body()?.let {
+                    it.avatarUrl?.let {
+                      val avatarInfo = MatrixAvatarInfo(it, model.size)
+                      val url = Uri.parse(avatarInfo.avatarUrl)
+
+                      val imageUrl = matrixApi.avatarImage(server = url.host,
+                                                           id = url.pathSegments.first()).request().url()
+                      actualUrl = imageUrl.toString()
+                    }
+                  }
+                }
+              }
+            }
+          }
         }
 
         nick.text = user.nick
@@ -250,6 +287,12 @@ class UserInfoFragment : ServiceBoundFragment() {
       it?.orNull()?.let(processUser)
     })
 
+    avatar.setOnClickListener {
+      context?.startActivity(Intent(Intent.ACTION_VIEW).apply {
+        data = Uri.parse(actualUrl)
+      })
+    }
+
     actionMention.visibleIf(arguments?.getBoolean("openBuffer") == false)
 
     val movementMethod = BetterLinkMovementMethod.newInstance()
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/helper/GlideHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/helper/GlideHelper.kt
index baeb49f01..fbd02c16e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/helper/GlideHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/helper/GlideHelper.kt
@@ -22,7 +22,11 @@ package de.kuschku.quasseldroid.util.helper
 import android.graphics.drawable.Drawable
 import android.widget.ImageView
 import com.bumptech.glide.RequestBuilder
+import com.bumptech.glide.load.DataSource
+import com.bumptech.glide.load.engine.GlideException
 import com.bumptech.glide.load.resource.bitmap.RoundedCorners
+import com.bumptech.glide.request.RequestListener
+import com.bumptech.glide.request.target.Target
 import de.kuschku.quasseldroid.GlideApp
 import de.kuschku.quasseldroid.GlideRequest
 import de.kuschku.quasseldroid.GlideRequests
@@ -44,7 +48,8 @@ fun GlideRequests.loadWithFallbacks(urls: List<Avatar>): GlideRequest<Drawable>?
   return urls.foldRight(null, ::fold)
 }
 
-fun ImageView.loadAvatars(urls: List<Avatar>, fallback: Drawable? = null, crop: Boolean = true) {
+fun ImageView.loadAvatars(urls: List<Avatar>, fallback: Drawable? = null, crop: Boolean = true,
+                          listener: ((Any?) -> Unit)? = null) {
   if (urls.isNotEmpty()) {
     GlideApp.with(this)
       .loadWithFallbacks(urls)
@@ -56,6 +61,19 @@ fun ImageView.loadAvatars(urls: List<Avatar>, fallback: Drawable? = null, crop:
         }
       }
       ?.placeholder(fallback)
+      ?.letIf(listener != null) {
+        it.addListener(object : RequestListener<Drawable> {
+          override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?,
+                                    isFirstResource: Boolean) = false
+
+          override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?,
+                                       dataSource: DataSource?, isFirstResource: Boolean): Boolean {
+            listener?.invoke(model)
+
+            return false
+          }
+        })
+      }
       ?.into(this)
   } else {
     GlideApp.with(this).clear(this)
-- 
GitLab