11package com.streamliners.feature.pickers_sample.comp
22
3+ import android.content.Context
4+ import android.graphics.Bitmap
5+ import android.net.Uri
36import androidx.compose.foundation.layout.Arrangement
47import androidx.compose.foundation.layout.Column
5- import androidx.compose.foundation.layout.Spacer
68import androidx.compose.foundation.layout.fillMaxWidth
79import androidx.compose.foundation.layout.padding
8- import androidx.compose.foundation.layout.size
910import androidx.compose.material3.Button
10- import androidx.compose.material3.Card
1111import androidx.compose.material3.ElevatedCard
1212import androidx.compose.material3.HorizontalDivider
1313import androidx.compose.material3.MaterialTheme
@@ -18,7 +18,18 @@ import androidx.compose.runtime.mutableStateOf
1818import androidx.compose.runtime.remember
1919import androidx.compose.ui.Alignment.Companion.CenterHorizontally
2020import androidx.compose.ui.Modifier
21+ import androidx.compose.ui.graphics.ImageBitmap
22+ import androidx.compose.ui.graphics.asAndroidBitmap
23+ import androidx.compose.ui.platform.LocalContext
2124import androidx.compose.ui.unit.dp
25+ import androidx.core.net.toUri
26+ import com.mr0xf00.easycrop.AspectRatio
27+ import com.mr0xf00.easycrop.CropError
28+ import com.mr0xf00.easycrop.CropResult
29+ import com.mr0xf00.easycrop.CropperStyle
30+ import com.mr0xf00.easycrop.crop
31+ import com.mr0xf00.easycrop.rememberImageCropper
32+ import com.mr0xf00.easycrop.ui.ImageCropperDialog
2233import com.streamliners.compose.comp.select.LabelledCheckBox
2334import com.streamliners.compose.comp.select.RadioGroup
2435import com.streamliners.pickers.media.FromGalleryType
@@ -28,6 +39,9 @@ import com.streamliners.pickers.media.MediaType
2839import com.streamliners.pickers.media.PickedMedia
2940import com.streamliners.pickers.media.comp.PickedMediaPreviewList
3041import com.streamliners.pickers.media.rememberMediaPickerDialogState
42+ import com.streamliners.pickers.media.util.createFile
43+ import com.streamliners.pickers.media.util.getUri
44+ import java.io.FileOutputStream
3145
3246@Composable
3347fun MediaPickerSample (
@@ -36,6 +50,8 @@ fun MediaPickerSample(
3650
3751 val mediaPickerDialogState = rememberMediaPickerDialogState()
3852
53+ val imageCropper = rememberImageCropper()
54+
3955 ElevatedCard (
4056 modifier = Modifier .fillMaxWidth()
4157 ) {
@@ -80,6 +96,8 @@ fun MediaPickerSample(
8096 mutableStateListOf<PickedMedia >()
8197 }
8298
99+ val context = LocalContext .current
100+
83101 Button (
84102 modifier = Modifier .align(CenterHorizontally ),
85103 enabled = type.value != null && fromGalleryType.value != null ,
@@ -91,6 +109,25 @@ fun MediaPickerSample(
91109 callback = { getResult ->
92110 executeHandlingError {
93111 pickedMediaList.addAll(getResult())
112+
113+ val firstMedia = pickedMediaList.firstOrNull() ? : error(" no media picked" )
114+ if (firstMedia is PickedMedia .Image ) {
115+
116+ val result = imageCropper.crop(firstMedia.uri.toUri(), context)
117+ when (result) {
118+ CropResult .Cancelled -> {
119+
120+ }
121+ is CropError -> {
122+ error(" Crop error" )
123+ }
124+ is CropResult .Success -> {
125+ val croppedImageUri = saveBitmapToFile(context, result.bitmap)
126+ pickedMediaList.remove(firstMedia)
127+ pickedMediaList.add(firstMedia.copy(uri = croppedImageUri.toString()))
128+ }
129+ }
130+ }
94131 }
95132 }
96133 )
@@ -112,4 +149,27 @@ fun MediaPickerSample(
112149 state = mediaPickerDialogState,
113150 authority = " com.streamliners.fileprovider"
114151 )
115- }
152+
153+ imageCropper.cropState?.let {
154+
155+ ImageCropperDialog (
156+ state = it,
157+ style = CropperStyle (
158+ autoZoom = false ,
159+ guidelines = null
160+ ),
161+ showAspectRatioSelectionButton = false ,
162+ showShapeCropButton = false ,
163+ lockAspectRatio = AspectRatio (1 , 1 )
164+ )
165+ }
166+ }
167+
168+ fun saveBitmapToFile (context : Context , bitmap : ImageBitmap ): Uri {
169+ val file = createFile(context, " ${System .currentTimeMillis()} .png" , " capture" )
170+ val fileOutputStream = FileOutputStream (file)
171+ bitmap.asAndroidBitmap().compress(Bitmap .CompressFormat .PNG , 100 , fileOutputStream)
172+ fileOutputStream.flush()
173+ return file.getUri(context, " com.streamliners.fileprovider" )
174+ }
175+
0 commit comments