Skip to content

Commit

Permalink
icerockdev#34 add more common logic at PickerDelegate
Browse files Browse the repository at this point in the history
  • Loading branch information
Alexey Nesterov committed May 14, 2024
1 parent f36d66a commit d569f33
Show file tree
Hide file tree
Showing 6 changed files with 81 additions and 39 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
package dev.icerock.moko.media.picker

import android.content.Context
import android.graphics.Bitmap
import android.net.Uri
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.ActivityResultRegistry
import androidx.activity.result.contract.ActivityResultContracts

internal class CameraPickerDelegate :
ImagePickerDelegate<CameraPickerDelegate.CallbackData, Uri>() {
ImagePickerDelegate<CameraPickerDelegate.CameraPickerCallbackData, Uri, Bitmap>() {

override fun registerActivityResult(
context: Context,
Expand Down Expand Up @@ -40,14 +41,12 @@ internal class CameraPickerDelegate :
fun pick(
maxWidth: Int,
maxHeight: Int,
callback: (Result<android.graphics.Bitmap>) -> Unit,
callback: (Result<Bitmap>) -> Unit,
outputUri: Uri,
) {
this.callback?.let {
it.callback.invoke(Result.failure(IllegalStateException("Callback should be null")))
this.callback = null
}
this.callback = CallbackData(
super.pick(callback)

this.callback = CameraPickerCallbackData(
callback,
outputUri,
maxWidth,
Expand All @@ -59,12 +58,23 @@ internal class CameraPickerDelegate :
)
}

class CallbackData(
val callback: (Result<android.graphics.Bitmap>) -> Unit,
override fun createCallback(
callback: (Result<Bitmap>) -> Unit,
): CameraPickerCallbackData = CameraPickerCallbackData(
callback,
Uri.EMPTY,
0,
0,
)

override fun launchActivityResult() = Unit

class CameraPickerCallbackData(
override val callback: (Result<Bitmap>) -> Unit,
val outputUri: Uri,
val maxWidth: Int,
val maxHeight: Int,
)
) : CallbackData<Bitmap>()

companion object {
private const val PICK_CAMERA_IMAGE_KEY = "PickCameraImageKey"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import dev.icerock.moko.media.FileMedia
import java.io.File

internal class FilePickerDelegate :
PickerDelegate<FilePickerDelegate.CallbackData, Array<String>>() {
PickerDelegate<FilePickerDelegate.FilePickerCallbackData, Array<String>, FileMedia>() {

override fun registerActivityResult(
context: Context,
Expand Down Expand Up @@ -60,22 +60,21 @@ internal class FilePickerDelegate :
callback.invoke(result)
}

fun pick(callback: (Result<FileMedia>) -> Unit) {
this.callback?.let {
it.callback.invoke(Result.failure(IllegalStateException("Callback should be null")))
this.callback = null
}

this.callback = CallbackData(callback)
override fun createCallback(
callback: (Result<FileMedia>) -> Unit,
): FilePickerCallbackData = FilePickerCallbackData(callback)

override fun launchActivityResult() {
pickerLauncherHolder.value?.launch(
arrayOf(
"*/*",
)
)
}

class CallbackData(val callback: (Result<FileMedia>) -> Unit)
class FilePickerCallbackData(
override val callback: (Result<FileMedia>) -> Unit
) : CallbackData<FileMedia>()

companion object {
private const val PICK_FILE_KEY = "PickFileKey"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,14 @@
package dev.icerock.moko.media.picker

import android.content.Context
import android.graphics.Bitmap
import androidx.activity.result.ActivityResultLauncher
import androidx.activity.result.ActivityResultRegistry
import androidx.activity.result.PickVisualMediaRequest
import androidx.activity.result.contract.ActivityResultContracts

internal class GalleryPickerDelegate :
ImagePickerDelegate<GalleryPickerDelegate.CallbackData, PickVisualMediaRequest>() {
ImagePickerDelegate<GalleryPickerDelegate.GalleryPickerCallbackData, PickVisualMediaRequest, Bitmap>() {

override fun registerActivityResult(
context: Context,
Expand Down Expand Up @@ -40,14 +41,11 @@ internal class GalleryPickerDelegate :
fun pick(
maxWidth: Int,
maxHeight: Int,
callback: (Result<android.graphics.Bitmap>) -> Unit,
callback: (Result<Bitmap>) -> Unit,
) {
this.callback?.let {
it.callback.invoke(Result.failure(IllegalStateException("Callback should be null")))
this.callback = null
}
super.pick(callback)

this.callback = CallbackData(
this.callback = GalleryPickerCallbackData(
callback,
maxWidth,
maxHeight,
Expand All @@ -58,11 +56,21 @@ internal class GalleryPickerDelegate :
)
}

class CallbackData(
val callback: (Result<android.graphics.Bitmap>) -> Unit,
override fun createCallback(
callback: (Result<Bitmap>) -> Unit,
): GalleryPickerCallbackData = GalleryPickerCallbackData(
callback,
0,
0,
)

override fun launchActivityResult() = Unit

class GalleryPickerCallbackData(
override val callback: (Result<Bitmap>) -> Unit,
val maxWidth: Int,
val maxHeight: Int,
)
) : CallbackData<Bitmap>()

companion object {
private const val PICK_GALLERY_IMAGE_KEY = "PickGalleryImageKey"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
/*
* Copyright 2024 IceRock MAG Inc. Use of this source code is governed by the Apache 2.0 license.
*/

package dev.icerock.moko.media.picker

import android.content.Context
import android.net.Uri
import dev.icerock.moko.media.BitmapUtils

internal abstract class ImagePickerDelegate<C, I> : PickerDelegate<C, I>() {
internal abstract class ImagePickerDelegate<C : PickerDelegate.CallbackData<D>, I, D> : PickerDelegate<C, I, D>() {

@Suppress("ReturnCount")
protected fun processResult(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import dev.icerock.moko.media.Media
import dev.icerock.moko.media.MediaFactory

internal class MediaPickerDelegate :
PickerDelegate<MediaPickerDelegate.CallbackData, PickVisualMediaRequest>() {
PickerDelegate<MediaPickerDelegate.MediaPickerCallbackData, PickVisualMediaRequest, Media>() {

override fun registerActivityResult(
context: Context,
Expand All @@ -38,19 +38,19 @@ internal class MediaPickerDelegate :
callback.invoke(result)
}

fun pick(callback: (Result<Media>) -> Unit) {
this.callback?.let {
it.callback.invoke(Result.failure(IllegalStateException("Callback should be null")))
this.callback = null
}
this.callback = CallbackData(callback)
override fun createCallback(
callback: (Result<Media>) -> Unit,
): MediaPickerCallbackData = MediaPickerCallbackData(callback)

override fun launchActivityResult() {
pickerLauncherHolder.value?.launch(
PickVisualMediaRequest(ActivityResultContracts.PickVisualMedia.ImageAndVideo)
)
}

class CallbackData(val callback: (Result<Media>) -> Unit)
class MediaPickerCallbackData(
override val callback: (Result<Media>) -> Unit,
) : CallbackData<Media>()

companion object {
private const val PICK_MEDIA_KEY = "PickMediaKey"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ import kotlinx.coroutines.flow.MutableStateFlow
* @param <C> type of callback
* @param <I> type of the input required to launch
*/
internal abstract class PickerDelegate<C, I> {
internal abstract class PickerDelegate<C : PickerDelegate.CallbackData<D>, I, D> {

protected var callback: C? = null

Expand Down Expand Up @@ -49,4 +49,25 @@ internal abstract class PickerDelegate<C, I> {
context: Context,
activityResultRegistry: ActivityResultRegistry,
): ActivityResultLauncher<I>

fun pick(
callback: (Result<D>) -> Unit,
) {
this.callback?.let {
it.callback.invoke(Result.failure(IllegalStateException("Callback should be null")))
this.callback = null
}

this.callback = createCallback(callback)

launchActivityResult()
}

abstract fun createCallback(callback: (Result<D>) -> Unit): C

abstract fun launchActivityResult()

abstract class CallbackData<D> {
abstract val callback: (Result<D>) -> Unit
}
}

0 comments on commit d569f33

Please sign in to comment.