@@ -5,9 +5,6 @@ import android.app.Activity
55import android.content.Context
66import android.content.Intent
77import android.content.pm.PackageManager
8- import android.graphics.Bitmap
9- import android.graphics.BitmapFactory
10- import android.net.Uri
118import android.provider.MediaStore
129import androidx.activity.compose.rememberLauncherForActivityResult
1310import androidx.activity.result.PickVisualMediaRequest
@@ -32,8 +29,6 @@ import androidx.compose.runtime.mutableStateOf
3229import androidx.compose.runtime.remember
3330import androidx.compose.runtime.rememberCoroutineScope
3431import androidx.compose.ui.Modifier
35- import androidx.compose.ui.graphics.ImageBitmap
36- import androidx.compose.ui.graphics.asImageBitmap
3732import androidx.compose.ui.platform.LocalContext
3833import androidx.compose.ui.unit.dp
3934import androidx.compose.ui.window.DialogProperties
@@ -57,32 +52,34 @@ import com.streamliners.pickers.media.util.saveBitmapToFile
5752import com.streamliners.utils.safeLet
5853import kotlinx.coroutines.CoroutineScope
5954import kotlinx.coroutines.launch
60- import java.io.File
6155
6256
6357@Composable
6458fun MediaPickerDialog (
6559 state : MutableState <MediaPickerDialogState >,
6660 authority : String
6761) {
68- val data = state.value as ? MediaPickerDialogState .Visible
6962 val imageCropper = rememberImageCropper()
63+ val scope = rememberCoroutineScope()
64+
65+ (state.value as ? MediaPickerDialogState .ShowImageCropper )?.let { data ->
7066
71- imageCropper.cropState?.let {
72-
73- ImageCropperDialog (
74- state = it,
75- style = CropperStyle (
76- autoZoom = false ,
77- guidelines = null
78- ),
79- showAspectRatioSelectionButton = (data?.cropParams as ? MediaPickerCropParams .Enabled )?.showAspectRatioSelectionButton ? : true ,
80- showShapeCropButton = (data?.cropParams as ? MediaPickerCropParams .Enabled )?.showAspectRatioSelectionButton ? : true ,
81- lockAspectRatio = (data?.cropParams as ? MediaPickerCropParams .Enabled )?.lockAspectRatio
82- )
67+ imageCropper.cropState?.let {
68+
69+ ImageCropperDialog (
70+ state = it,
71+ style = CropperStyle (
72+ autoZoom = false ,
73+ guidelines = null
74+ ),
75+ showAspectRatioSelectionButton = (data.cropParams as ? MediaPickerCropParams .Enabled )?.showAspectRatioSelectionButton ? : true ,
76+ showShapeCropButton = (data.cropParams as ? MediaPickerCropParams .Enabled )?.showAspectRatioSelectionButton ? : true ,
77+ lockAspectRatio = (data.cropParams as ? MediaPickerCropParams .Enabled )?.lockAspectRatio
78+ )
79+ }
8380 }
8481
85- if ( data == null ) return
82+ val data = state.value as ? MediaPickerDialogState . ShowMediaPicker ? : return
8683
8784 LaunchedEffect (key1 = Unit ) {
8885 if (data.cropParams is MediaPickerCropParams .Enabled ) {
@@ -128,7 +125,7 @@ fun MediaPickerDialog(
128125
129126 FromGalleryButton (
130127 modifier = Modifier .weight(1f ),
131- state, data, imageCropper, authority
128+ state, data, imageCropper, authority, scope
132129 )
133130 }
134131
@@ -149,7 +146,7 @@ fun MediaPickerDialog(
149146fun FromCameraButton (
150147 modifier : Modifier ,
151148 state : MutableState <MediaPickerDialogState >,
152- data : MediaPickerDialogState .Visible ,
149+ data : MediaPickerDialogState .ShowMediaPicker ,
153150 authority : String ,
154151 cameraPermissionIsGranted : () -> Boolean ,
155152 imageCropper : ImageCropper
@@ -169,6 +166,7 @@ fun FromCameraButton(
169166 when (data.type) {
170167 Image -> {
171168 showImageCropperIfRequired(
169+ state,
172170 data,
173171 PickedMedia .Image (uri, path),
174172 imageCropper,
@@ -185,10 +183,11 @@ fun FromCameraButton(
185183 processVideo(context, uri, path)
186184 )
187185 }
186+ state.dismiss()
188187 }
189188 }
190189 }
191- state.dismiss()
190+
192191 }
193192 }
194193 )
@@ -247,14 +246,13 @@ fun FromCameraButton(
247246fun FromGalleryButton (
248247 modifier : Modifier ,
249248 state : MutableState <MediaPickerDialogState >,
250- data : MediaPickerDialogState .Visible ,
249+ data : MediaPickerDialogState .ShowMediaPicker ,
251250 imageCropper : ImageCropper ,
252- authority : String
251+ authority : String ,
252+ scope : CoroutineScope
253253) {
254254 val context = LocalContext .current
255255
256- val scope = rememberCoroutineScope()
257-
258256 val documentPickerLauncher = rememberLauncherForActivityResult(
259257 contract = ActivityResultContracts .StartActivityForResult (),
260258 onResult = { result ->
@@ -280,8 +278,10 @@ fun FromGalleryButton(
280278 PickedMedia .Image (uri.toString())
281279 }
282280 }
281+ state.dismiss()
283282 } else {
284283 showImageCropperIfRequired(
284+ state,
285285 data,
286286 PickedMedia .Image (items.first().toString()),
287287 imageCropper,
@@ -299,10 +299,9 @@ fun FromGalleryButton(
299299 processVideo(context, uri.toString())
300300 }
301301 }
302+ state.dismiss()
302303 }
303304 }
304-
305- state.dismiss()
306305 }
307306 }
308307 )
@@ -319,6 +318,7 @@ fun FromGalleryButton(
319318 when (data.type) {
320319 Image -> {
321320 showImageCropperIfRequired(
321+ state,
322322 data,
323323 PickedMedia .Image (uri.toString()),
324324 imageCropper,
@@ -335,10 +335,10 @@ fun FromGalleryButton(
335335 processVideo(context, uri.toString())
336336 )
337337 }
338+ state.dismiss()
338339 }
339340 }
340341 }
341- state.dismiss()
342342 }
343343 )
344344
@@ -408,7 +408,8 @@ suspend fun processVideo(
408408}
409409
410410fun showImageCropperIfRequired (
411- data : MediaPickerDialogState .Visible ,
411+ state : MutableState <MediaPickerDialogState >,
412+ data : MediaPickerDialogState .ShowMediaPicker ,
412413 image : PickedMedia .Image ,
413414 imageCropper : ImageCropper ,
414415 context : Context ,
@@ -418,9 +419,12 @@ fun showImageCropperIfRequired(
418419) {
419420 data.cropParams as ? MediaPickerCropParams .Enabled ? : run {
420421 onReady(image)
422+ state.dismiss()
421423 return
422424 }
423425
426+ state.showImageCropper(data.cropParams)
427+
424428 scope.launch {
425429
426430// val bitmap = MediaStore.Images.Media.getBitmap(context.contentResolver, Uri.parse(image.uri))
0 commit comments