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