1818package org.quantumbadger.redreader.compose.net
1919
2020import android.graphics.BitmapFactory
21+ import android.util.Log
2122import androidx.compose.runtime.Composable
2223import androidx.compose.runtime.DisposableEffect
2324import androidx.compose.runtime.Immutable
@@ -32,6 +33,7 @@ import androidx.compose.ui.graphics.ImageBitmap
3233import androidx.compose.ui.graphics.asImageBitmap
3334import androidx.compose.ui.platform.LocalContext
3435import androidx.compose.ui.res.stringResource
36+ import androidx.core.graphics.scale
3537import org.quantumbadger.redreader.R
3638import org.quantumbadger.redreader.account.RedditAccount
3739import org.quantumbadger.redreader.account.RedditAccountId
@@ -55,8 +57,11 @@ import org.quantumbadger.redreader.compose.ctx.GlobalNetworkRetry
5557import org.quantumbadger.redreader.compose.ctx.LocalRedditUser
5658import org.quantumbadger.redreader.image.AlbumInfo
5759import org.quantumbadger.redreader.image.GetAlbumInfoListener
60+ import org.quantumbadger.redreader.image.ImageSize
5861import java.io.IOException
5962import java.util.UUID
63+ import kotlin.math.max
64+ import kotlin.math.roundToInt
6065
6166@Immutable
6267sealed interface NetRequestStatus <out R > {
@@ -165,36 +170,60 @@ fun fetchAlbum(
165170fun 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,
0 commit comments