Skip to content
Snippets Groups Projects
Verified Commit 5f0cefad authored by Janne Mareike Koschinski's avatar Janne Mareike Koschinski
Browse files

Clicking on avatar in user info now opens the avatar in browser

parent 08e09c3d
Branches
Tags
No related merge requests found
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
package de.kuschku.quasseldroid.ui.chat.info.user package de.kuschku.quasseldroid.ui.chat.info.user
import android.content.Intent
import android.net.Uri
import android.os.Bundle import android.os.Bundle
import android.text.SpannableString import android.text.SpannableString
import android.view.LayoutInflater import android.view.LayoutInflater
...@@ -31,6 +33,7 @@ import android.widget.Toast ...@@ -31,6 +33,7 @@ import android.widget.Toast
import androidx.lifecycle.Observer import androidx.lifecycle.Observer
import butterknife.BindView import butterknife.BindView
import butterknife.ButterKnife import butterknife.ButterKnife
import com.google.gson.GsonBuilder
import de.kuschku.libquassel.protocol.Buffer_Type import de.kuschku.libquassel.protocol.Buffer_Type
import de.kuschku.libquassel.quassel.BufferInfo import de.kuschku.libquassel.quassel.BufferInfo
import de.kuschku.libquassel.quassel.syncables.IrcUser import de.kuschku.libquassel.quassel.syncables.IrcUser
...@@ -41,13 +44,18 @@ import de.kuschku.quasseldroid.R ...@@ -41,13 +44,18 @@ import de.kuschku.quasseldroid.R
import de.kuschku.quasseldroid.settings.MessageSettings import de.kuschku.quasseldroid.settings.MessageSettings
import de.kuschku.quasseldroid.ui.chat.ChatActivity import de.kuschku.quasseldroid.ui.chat.ChatActivity
import de.kuschku.quasseldroid.util.avatars.AvatarHelper 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.helper.*
import de.kuschku.quasseldroid.util.irc.format.ContentFormatter import de.kuschku.quasseldroid.util.irc.format.ContentFormatter
import de.kuschku.quasseldroid.util.irc.format.spans.IrcItalicSpan import de.kuschku.quasseldroid.util.irc.format.spans.IrcItalicSpan
import de.kuschku.quasseldroid.util.service.ServiceBoundFragment import de.kuschku.quasseldroid.util.service.ServiceBoundFragment
import de.kuschku.quasseldroid.util.ui.BetterLinkMovementMethod import de.kuschku.quasseldroid.util.ui.BetterLinkMovementMethod
import de.kuschku.quasseldroid.util.ui.LinkLongClickMenuHelper import de.kuschku.quasseldroid.util.ui.LinkLongClickMenuHelper
import de.kuschku.quasseldroid.viewmodel.data.Avatar
import io.reactivex.Observable import io.reactivex.Observable
import retrofit2.Retrofit
import retrofit2.converter.gson.GsonConverterFactory
import javax.inject.Inject import javax.inject.Inject
class UserInfoFragment : ServiceBoundFragment() { class UserInfoFragment : ServiceBoundFragment() {
...@@ -108,11 +116,19 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -108,11 +116,19 @@ class UserInfoFragment : ServiceBoundFragment() {
@Inject @Inject
lateinit var messageSettings: MessageSettings lateinit var messageSettings: MessageSettings
private var actualUrl: String? = null
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?): View? { savedInstanceState: Bundle?): View? {
val view = inflater.inflate(R.layout.fragment_info_user, container, false) val view = inflater.inflate(R.layout.fragment_info_user, container, false)
ButterKnife.bind(this, view) 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 openBuffer = arguments?.getBoolean("openBuffer")
val networkId2 = arguments?.getInt("networkId") val networkId2 = arguments?.getInt("networkId")
...@@ -158,10 +174,31 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -158,10 +174,31 @@ class UserInfoFragment : ServiceBoundFragment() {
}.toLiveData().observe(this, Observer { }.toLiveData().observe(this, Observer {
val processUser = { user: IrcUserInfo -> val processUser = { user: IrcUserInfo ->
avatar.post { avatar.post {
actualUrl = null
avatar.loadAvatars( avatar.loadAvatars(
AvatarHelper.avatar(messageSettings, user, maxOf(avatar.width, avatar.height)), AvatarHelper.avatar(messageSettings, user, maxOf(avatar.width, avatar.height)),
crop = false 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 nick.text = user.nick
...@@ -250,6 +287,12 @@ class UserInfoFragment : ServiceBoundFragment() { ...@@ -250,6 +287,12 @@ class UserInfoFragment : ServiceBoundFragment() {
it?.orNull()?.let(processUser) it?.orNull()?.let(processUser)
}) })
avatar.setOnClickListener {
context?.startActivity(Intent(Intent.ACTION_VIEW).apply {
data = Uri.parse(actualUrl)
})
}
actionMention.visibleIf(arguments?.getBoolean("openBuffer") == false) actionMention.visibleIf(arguments?.getBoolean("openBuffer") == false)
val movementMethod = BetterLinkMovementMethod.newInstance() val movementMethod = BetterLinkMovementMethod.newInstance()
......
...@@ -22,7 +22,11 @@ package de.kuschku.quasseldroid.util.helper ...@@ -22,7 +22,11 @@ package de.kuschku.quasseldroid.util.helper
import android.graphics.drawable.Drawable import android.graphics.drawable.Drawable
import android.widget.ImageView import android.widget.ImageView
import com.bumptech.glide.RequestBuilder 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.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.GlideApp
import de.kuschku.quasseldroid.GlideRequest import de.kuschku.quasseldroid.GlideRequest
import de.kuschku.quasseldroid.GlideRequests import de.kuschku.quasseldroid.GlideRequests
...@@ -44,7 +48,8 @@ fun GlideRequests.loadWithFallbacks(urls: List<Avatar>): GlideRequest<Drawable>? ...@@ -44,7 +48,8 @@ fun GlideRequests.loadWithFallbacks(urls: List<Avatar>): GlideRequest<Drawable>?
return urls.foldRight(null, ::fold) 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()) { if (urls.isNotEmpty()) {
GlideApp.with(this) GlideApp.with(this)
.loadWithFallbacks(urls) .loadWithFallbacks(urls)
...@@ -56,6 +61,19 @@ fun ImageView.loadAvatars(urls: List<Avatar>, fallback: Drawable? = null, crop: ...@@ -56,6 +61,19 @@ fun ImageView.loadAvatars(urls: List<Avatar>, fallback: Drawable? = null, crop:
} }
} }
?.placeholder(fallback) ?.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) ?.into(this)
} else { } else {
GlideApp.with(this).clear(this) GlideApp.with(this).clear(this)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment