From 9eaa4e40aec975a967c101e35b9a38805265a94d Mon Sep 17 00:00:00 2001 From: Atridad Lahiji Date: Sun, 17 Aug 2025 00:57:48 -0600 Subject: [PATCH] 0.4.2 - Fixed issue with photo upload streams --- app/build.gradle.kts | 4 +- .../com/atridad/openclimb/utils/ImageUtils.kt | 58 ++++++++----------- 2 files changed, 27 insertions(+), 35 deletions(-) diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 5f888d6..3818936 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -14,8 +14,8 @@ android { applicationId = "com.atridad.openclimb" minSdk = 31 targetSdk = 35 - versionCode = 8 - versionName = "0.4.1" + versionCode = 9 + versionName = "0.4.2" testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner" } diff --git a/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt b/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt index 08cead9..e3448ca 100644 --- a/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt +++ b/app/src/main/java/com/atridad/openclimb/utils/ImageUtils.kt @@ -35,40 +35,32 @@ object ImageUtils { */ fun saveImageFromUri(context: Context, imageUri: Uri): String? { return try { - val inputStream = context.contentResolver.openInputStream(imageUri) - inputStream?.use { input -> - // Decode with options to get EXIF data - val options = BitmapFactory.Options().apply { - inJustDecodeBounds = true - } - input.reset() - BitmapFactory.decodeStream(input, null, options) - - // Reset stream and decode with proper orientation - input.reset() - val originalBitmap = BitmapFactory.decodeStream(input) - val orientedBitmap = correctImageOrientation(context, imageUri, originalBitmap) - val compressedBitmap = compressImage(orientedBitmap) - - // Generate unique filename - val filename = "${UUID.randomUUID()}.jpg" - val imageFile = File(getImagesDirectory(context), filename) - - // Save compressed image - FileOutputStream(imageFile).use { output -> - compressedBitmap.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, output) - } - - // Clean up bitmaps - originalBitmap.recycle() - if (orientedBitmap != originalBitmap) { - orientedBitmap.recycle() - } - compressedBitmap.recycle() - - // Return relative path - "$IMAGES_DIR/$filename" + // Decode bitmap from a fresh stream to avoid mark/reset dependency + val originalBitmap = context.contentResolver.openInputStream(imageUri)?.use { input -> + BitmapFactory.decodeStream(input) + } ?: return null + + val orientedBitmap = correctImageOrientation(context, imageUri, originalBitmap) + val compressedBitmap = compressImage(orientedBitmap) + + // Generate unique filename + val filename = "${UUID.randomUUID()}.jpg" + val imageFile = File(getImagesDirectory(context), filename) + + // Save compressed image + FileOutputStream(imageFile).use { output -> + compressedBitmap.compress(Bitmap.CompressFormat.JPEG, IMAGE_QUALITY, output) } + + // Clean up bitmaps + originalBitmap.recycle() + if (orientedBitmap != originalBitmap) { + orientedBitmap.recycle() + } + compressedBitmap.recycle() + + // Return relative path + "$IMAGES_DIR/$filename" } catch (e: Exception) { e.printStackTrace() null