From fb63ab0776af32935cf29ad21e47a8b14f20de19 Mon Sep 17 00:00:00 2001
From: Taras <tarassmakula@gmail.com>
Date: Sat, 26 Feb 2022 01:48:14 +0200
Subject: [PATCH] Calculate image aspect ratio

---
 .../circles/extensions/ImageViewExtensions.kt | 23 ++++++++-----------
 .../extensions/MatrixSessionExtensions.kt     | 15 +++++++-----
 .../com/futo/circles/model/PostContent.kt     |  4 +++-
 .../circles/ui/groups/list/GroupViewHolder.kt |  3 ++-
 .../timeline/list/GroupTimelineViewHolder.kt  |  5 +++-
 .../circles/ui/view/GroupPostHeaderView.kt    | 12 +++++++---
 6 files changed, 37 insertions(+), 25 deletions(-)

diff --git a/app/src/main/java/com/futo/circles/extensions/ImageViewExtensions.kt b/app/src/main/java/com/futo/circles/extensions/ImageViewExtensions.kt
index 8df8d7bff..e391a89e2 100644
--- a/app/src/main/java/com/futo/circles/extensions/ImageViewExtensions.kt
+++ b/app/src/main/java/com/futo/circles/extensions/ImageViewExtensions.kt
@@ -1,5 +1,6 @@
 package com.futo.circles.extensions
 
+import android.util.Size
 import android.widget.ImageView
 import com.bumptech.glide.Glide
 import com.bumptech.glide.request.target.Target
@@ -11,31 +12,27 @@ import com.futo.circles.provider.MatrixSessionProvider
 
 fun ImageView.loadImage(
     url: String?,
-    size: Int = Target.SIZE_ORIGINAL
+    size: Size? = null
 ) {
     val resolvedUrl = MatrixSessionProvider.currentSession?.resolveUrl(url, size)
     Glide.with(this)
         .load(resolvedUrl)
-        .override(size, size)
         .fitCenter()
         .into(this)
 }
 
 
-fun ImageView.loadEncryptedImage(content: ImageContent, size: Int = Target.SIZE_ORIGINAL) {
-    val request = content.elementToDecrypt?.let {
+fun ImageView.loadEncryptedImage(
+    content: ImageContent, size: Size? = null
+) {
+    content.elementToDecrypt?.let {
         GlideApp
             .with(context)
             .load(content)
-    } ?: run {
-        val resolvedUrl = MatrixSessionProvider.currentSession?.resolveUrl(content.fileUrl, size)
-        GlideApp
-            .with(context)
-            .load(resolvedUrl)
-    }
-    request.override(size, size)
-        .fitCenter()
-        .into(this)
+            .override(size?.width ?: Target.SIZE_ORIGINAL, size?.height ?: Target.SIZE_ORIGINAL)
+            .fitCenter()
+            .into(this)
+    } ?: loadImage(content.fileUrl, size)
 }
 
 
diff --git a/app/src/main/java/com/futo/circles/extensions/MatrixSessionExtensions.kt b/app/src/main/java/com/futo/circles/extensions/MatrixSessionExtensions.kt
index fcb049b5e..dab47c28f 100644
--- a/app/src/main/java/com/futo/circles/extensions/MatrixSessionExtensions.kt
+++ b/app/src/main/java/com/futo/circles/extensions/MatrixSessionExtensions.kt
@@ -1,6 +1,6 @@
 package com.futo.circles.extensions
 
-import com.bumptech.glide.request.target.Target
+import android.util.Size
 import com.futo.circles.provider.MatrixSessionProvider
 import kotlinx.coroutines.CoroutineScope
 import kotlinx.coroutines.Dispatchers
@@ -19,16 +19,19 @@ val Session.coroutineScope: CoroutineScope
         }
     }
 
-fun Session.resolveUrl(url: String?, size: Int = Target.SIZE_ORIGINAL): String? {
+fun Session.resolveUrl(
+    url: String?,
+    size: Size? = null
+): String? {
     val resolver = MatrixSessionProvider.currentSession?.contentUrlResolver()
 
-    return if (size == Target.SIZE_ORIGINAL) {
-        resolver?.resolveFullSize(url)
-    } else {
+    return size?.let {
         resolver?.resolveThumbnail(
             url,
-            size, size,
+            size.width, size.height,
             ContentUrlResolver.ThumbnailMethod.SCALE
         )
+    } ?: run {
+        resolver?.resolveFullSize(url)
     }
 }
diff --git a/app/src/main/java/com/futo/circles/model/PostContent.kt b/app/src/main/java/com/futo/circles/model/PostContent.kt
index 58a06760b..c6671431e 100644
--- a/app/src/main/java/com/futo/circles/model/PostContent.kt
+++ b/app/src/main/java/com/futo/circles/model/PostContent.kt
@@ -21,4 +21,6 @@ data class ImageContent(
     val elementToDecrypt: ElementToDecrypt?,
     val width: Int,
     val height: Int
-) : PostContent(PostContentType.IMAGE_CONTENT)
\ No newline at end of file
+) : PostContent(PostContentType.IMAGE_CONTENT) {
+    val aspectRatio = width.toFloat() / height.toFloat()
+}
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/circles/ui/groups/list/GroupViewHolder.kt b/app/src/main/java/com/futo/circles/ui/groups/list/GroupViewHolder.kt
index 6c0d0bb9a..e0e77770b 100644
--- a/app/src/main/java/com/futo/circles/ui/groups/list/GroupViewHolder.kt
+++ b/app/src/main/java/com/futo/circles/ui/groups/list/GroupViewHolder.kt
@@ -1,6 +1,7 @@
 package com.futo.circles.ui.groups.list
 
 import android.text.format.DateUtils
+import android.util.Size
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
 import com.futo.circles.R
@@ -28,7 +29,7 @@ class GroupViewHolder(
 
     fun bind(data: GroupListItem) {
         with(binding) {
-            ivGroup.loadImage(data.avatarUrl, ivGroup.height)
+            ivGroup.loadImage(data.avatarUrl, Size(ivGroup.width, ivGroup.height))
 
             ivLock.setIsEncryptedIcon(data.isEncrypted)
 
diff --git a/app/src/main/java/com/futo/circles/ui/groups/timeline/list/GroupTimelineViewHolder.kt b/app/src/main/java/com/futo/circles/ui/groups/timeline/list/GroupTimelineViewHolder.kt
index 4bda5a906..36cf47c6c 100644
--- a/app/src/main/java/com/futo/circles/ui/groups/timeline/list/GroupTimelineViewHolder.kt
+++ b/app/src/main/java/com/futo/circles/ui/groups/timeline/list/GroupTimelineViewHolder.kt
@@ -1,5 +1,6 @@
 package com.futo.circles.ui.groups.timeline.list
 
+import android.util.Size
 import android.view.View
 import android.view.ViewGroup
 import androidx.recyclerview.widget.RecyclerView
@@ -69,7 +70,9 @@ class ImagePostViewHolder(
         super.bind(post)
 
         (post.content as? ImageContent)?.let {
-            binding.ivContent.loadEncryptedImage(it)
+            val imageWith = binding.ivContent.width
+            val size = Size(imageWith, (imageWith / it.aspectRatio).toInt())
+            binding.ivContent.loadEncryptedImage(it, size)
         }
     }
 }
\ No newline at end of file
diff --git a/app/src/main/java/com/futo/circles/ui/view/GroupPostHeaderView.kt b/app/src/main/java/com/futo/circles/ui/view/GroupPostHeaderView.kt
index df2ddfc4b..99c87416b 100644
--- a/app/src/main/java/com/futo/circles/ui/view/GroupPostHeaderView.kt
+++ b/app/src/main/java/com/futo/circles/ui/view/GroupPostHeaderView.kt
@@ -2,6 +2,7 @@ package com.futo.circles.ui.view
 
 import android.content.Context
 import android.util.AttributeSet
+import android.util.Size
 import android.view.LayoutInflater
 import androidx.constraintlayout.widget.ConstraintLayout
 import com.futo.circles.databinding.GroupPostHeaderViewBinding
@@ -17,9 +18,14 @@ class GroupPostHeaderView(
         GroupPostHeaderViewBinding.inflate(LayoutInflater.from(context), this)
 
     fun setData(sender: SenderInfo) {
-        binding.ivSenderImage.loadImage(sender.avatarUrl, binding.ivSenderImage.height)
-        binding.tvUserName.text = sender.disambiguatedDisplayName
-        binding.tvUserId.text = sender.userId
+        with(binding) {
+            ivSenderImage.loadImage(
+                sender.avatarUrl,
+                Size(ivSenderImage.width, ivSenderImage.height)
+            )
+            tvUserName.text = sender.disambiguatedDisplayName
+            tvUserId.text = sender.userId
+        }
     }
 
 }
\ No newline at end of file
-- 
GitLab