Skip to content

Commit 4d186ef

Browse files
committed
Scale images before displaying in NetImage
1 parent 24e2620 commit 4d186ef

File tree

3 files changed

+65
-29
lines changed

3 files changed

+65
-29
lines changed

src/main/java/org/quantumbadger/redreader/compose/net/NetWrapper.kt

Lines changed: 46 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.quantumbadger.redreader.compose.net
1919

2020
import android.graphics.BitmapFactory
21+
import android.util.Log
2122
import androidx.compose.runtime.Composable
2223
import androidx.compose.runtime.DisposableEffect
2324
import androidx.compose.runtime.Immutable
@@ -32,6 +33,7 @@ import androidx.compose.ui.graphics.ImageBitmap
3233
import androidx.compose.ui.graphics.asImageBitmap
3334
import androidx.compose.ui.platform.LocalContext
3435
import androidx.compose.ui.res.stringResource
36+
import androidx.core.graphics.scale
3537
import org.quantumbadger.redreader.R
3638
import org.quantumbadger.redreader.account.RedditAccount
3739
import org.quantumbadger.redreader.account.RedditAccountId
@@ -55,8 +57,11 @@ import org.quantumbadger.redreader.compose.ctx.GlobalNetworkRetry
5557
import org.quantumbadger.redreader.compose.ctx.LocalRedditUser
5658
import org.quantumbadger.redreader.image.AlbumInfo
5759
import org.quantumbadger.redreader.image.GetAlbumInfoListener
60+
import org.quantumbadger.redreader.image.ImageSize
5861
import java.io.IOException
5962
import java.util.UUID
63+
import kotlin.math.max
64+
import kotlin.math.roundToInt
6065

6166
@Immutable
6267
sealed interface NetRequestStatus<out R> {
@@ -165,36 +170,60 @@ fun fetchAlbum(
165170
fun fetchImage(
166171
uri: UriString,
167172
user: RedditAccountId = LocalRedditUser.current,
173+
scaleToMaxAxis: Int = 2048
168174
): State<NetRequestStatus<FileRequestResult<ImageBitmap>>> {
169175

176+
val TAG = "NetWrapper:fetchImage"
177+
170178
val context = LocalContext.current.applicationContext
171179

172-
val filter: (FileRequestMetadata) -> NetRequestStatus<FileRequestResult<ImageBitmap>> = remember(uri, user) {
173-
{
174-
try {
175-
val result = BitmapFactory.decodeStream(it.streamFactory.create())?.asImageBitmap()
180+
val filter: (FileRequestMetadata) -> NetRequestStatus<FileRequestResult<ImageBitmap>> =
181+
remember(uri, user) {
182+
{
183+
try {
184+
val result = BitmapFactory.decodeStream(it.streamFactory.create())
185+
?: throw RuntimeException("Decoded bitmap was null")
186+
187+
val maxAxis = max(result.width, result.height)
188+
189+
val scaledResult = result.invokeIf(maxAxis > scaleToMaxAxis) {
190+
191+
val newSize = if (result.width > result.height) {
192+
val scale = scaleToMaxAxis / result.width.toFloat()
193+
ImageSize(
194+
scaleToMaxAxis,
195+
(result.height.toFloat() * scale).roundToInt()
196+
)
197+
} else {
198+
val scale = scaleToMaxAxis / result.height.toFloat()
199+
ImageSize((result.width.toFloat() * scale).roundToInt(), scaleToMaxAxis)
200+
}
201+
202+
Log.i(
203+
TAG,
204+
"Scaling image from ${result.width}x${result.height} to $newSize"
205+
)
206+
207+
scale(newSize.width, newSize.height)
208+
}
176209

177-
if (result == null) {
178-
throw RuntimeException("Decoded bitmap was null")
179-
} else {
180210
NetRequestStatus.Success(
181211
FileRequestResult(
182212
metadata = it,
183-
data = result
213+
data = scaledResult.asImageBitmap()
184214
)
185215
)
186-
}
187-
} catch (e: Exception) {
188-
NetRequestStatus.Failed(
189-
RRError(
190-
title = context.getString(R.string.error_image_decode_failed),
191-
url = uri,
192-
t = e
216+
} catch (e: Exception) {
217+
NetRequestStatus.Failed(
218+
RRError(
219+
title = context.getString(R.string.error_image_decode_failed),
220+
url = uri,
221+
t = e
222+
)
193223
)
194-
)
224+
}
195225
}
196226
}
197-
}
198227

199228
return fetchFile(
200229
uri = uri,

src/main/java/org/quantumbadger/redreader/compose/ui/NetImage.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ fun NetImage(
5050
modifier: Modifier,
5151
image: ImageUrlInfo,
5252
cropToAspect: Float? = null,
53-
showVideoPlayOverlay: Boolean = false
53+
showVideoPlayOverlay: Boolean = false,
54+
maxCanvasDimension: Int = 2048
5455
) {
5556
val theme = LocalComposeTheme.current
5657

@@ -60,7 +61,7 @@ fun NetImage(
6061

6162
val url = image.url
6263

63-
val data by fetchImage(url)
64+
val data by fetchImage(url, scaleToMaxAxis = maxCanvasDimension)
6465

6566
Box(
6667
modifier = modifier

src/main/java/org/quantumbadger/redreader/image/ImageInfo.kt

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ data class ImageSize(
5353
obj?.getLong(fieldHeight)
5454
)
5555
}
56+
57+
override fun toString() = "${width}x$height"
5658
}
5759

5860
@Immutable
@@ -184,11 +186,13 @@ data class ImageInfo(
184186

185187
val original = fileObj.getString("url")?.let { originalUrl ->
186188
ImageUrlInfo(
187-
url = UriString(if (originalUrl.startsWith("//")) {
188-
"https:$originalUrl"
189-
} else {
190-
originalUrl
191-
}),
189+
url = UriString(
190+
if (originalUrl.startsWith("//")) {
191+
"https:$originalUrl"
192+
} else {
193+
originalUrl
194+
}
195+
),
192196
size = ImageSize.fromJson(fileObj)
193197
)
194198
}
@@ -216,11 +220,13 @@ data class ImageInfo(
216220

217221
val original = links?.getString("original")?.let { originalUrl ->
218222
ImageUrlInfo(
219-
url = UriString(if (isAnimated) {
220-
originalUrl.replace(".gif", ".mp4")
221-
} else {
222-
originalUrl
223-
}),
223+
url = UriString(
224+
if (isAnimated) {
225+
originalUrl.replace(".gif", ".mp4")
226+
} else {
227+
originalUrl
228+
}
229+
),
224230
size = ImageSize.fromJson(image),
225231
sizeBytes = image?.getLong("size")
226232
)

0 commit comments

Comments
 (0)