expo-image-picker 14.7.0 → 14.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/android/build.gradle +2 -2
- package/android/src/main/java/expo/modules/imagepicker/ImagePickerConstants.kt +3 -3
- package/android/src/main/java/expo/modules/imagepicker/ImagePickerModule.kt +5 -6
- package/android/src/main/java/expo/modules/imagepicker/ImagePickerOptions.kt +1 -1
- package/android/src/main/java/expo/modules/imagepicker/ImagePickerResponse.kt +1 -1
- package/android/src/main/java/expo/modules/imagepicker/ImagePickerUtils.kt +2 -2
- package/android/src/main/java/expo/modules/imagepicker/MediaHandler.kt +5 -5
- package/android/src/main/java/expo/modules/imagepicker/contracts/CameraContract.kt +2 -2
- package/android/src/main/java/expo/modules/imagepicker/contracts/CropImageContract.kt +2 -2
- package/android/src/main/java/expo/modules/imagepicker/contracts/ImageLibraryContract.kt +1 -1
- package/android/src/main/java/expo/modules/imagepicker/exporters/CompressionImageExporter.kt +1 -1
- package/android/src/main/java/expo/modules/imagepicker/exporters/ImageExporter.kt +1 -1
- package/android/src/main/java/expo/modules/imagepicker/exporters/RawImageExporter.kt +2 -2
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
package/android/build.gradle
CHANGED
|
@@ -3,7 +3,7 @@ apply plugin: 'kotlin-android'
|
|
|
3
3
|
apply plugin: 'maven-publish'
|
|
4
4
|
|
|
5
5
|
group = 'host.exp.exponent'
|
|
6
|
-
version = '14.7.
|
|
6
|
+
version = '14.7.1'
|
|
7
7
|
|
|
8
8
|
def expoModulesCorePlugin = new File(project(":expo-modules-core").projectDir.absolutePath, "ExpoModulesCorePlugin.gradle")
|
|
9
9
|
if (expoModulesCorePlugin.exists()) {
|
|
@@ -94,7 +94,7 @@ android {
|
|
|
94
94
|
namespace "expo.modules.imagepicker"
|
|
95
95
|
defaultConfig {
|
|
96
96
|
versionCode 22
|
|
97
|
-
versionName "14.7.
|
|
97
|
+
versionName "14.7.1"
|
|
98
98
|
}
|
|
99
99
|
}
|
|
100
100
|
|
|
@@ -66,7 +66,7 @@ object ImagePickerConstants {
|
|
|
66
66
|
ExifInterface.TAG_SUBSEC_TIME,
|
|
67
67
|
ExifInterface.TAG_SUBSEC_TIME_DIGITIZED,
|
|
68
68
|
ExifInterface.TAG_SUBSEC_TIME_ORIGINAL,
|
|
69
|
-
ExifInterface.TAG_USER_COMMENT
|
|
69
|
+
ExifInterface.TAG_USER_COMMENT
|
|
70
70
|
),
|
|
71
71
|
"double" to listOf(
|
|
72
72
|
ExifInterface.TAG_APERTURE_VALUE,
|
|
@@ -100,7 +100,7 @@ object ImagePickerConstants {
|
|
|
100
100
|
ExifInterface.TAG_WHITE_POINT,
|
|
101
101
|
ExifInterface.TAG_X_RESOLUTION,
|
|
102
102
|
ExifInterface.TAG_Y_CB_CR_COEFFICIENTS,
|
|
103
|
-
ExifInterface.TAG_Y_RESOLUTION
|
|
103
|
+
ExifInterface.TAG_Y_RESOLUTION
|
|
104
104
|
),
|
|
105
105
|
"int" to listOf(
|
|
106
106
|
ExifInterface.TAG_BITS_PER_SAMPLE,
|
|
@@ -157,7 +157,7 @@ object ImagePickerConstants {
|
|
|
157
157
|
ExifInterface.TAG_TRANSFER_FUNCTION,
|
|
158
158
|
ExifInterface.TAG_WHITE_BALANCE,
|
|
159
159
|
ExifInterface.TAG_Y_CB_CR_POSITIONING,
|
|
160
|
-
ExifInterface.TAG_Y_CB_CR_SUB_SAMPLING
|
|
160
|
+
ExifInterface.TAG_Y_CB_CR_SUB_SAMPLING
|
|
161
161
|
)
|
|
162
162
|
)
|
|
163
163
|
}
|
|
@@ -36,7 +36,6 @@ private const val moduleName = "ExponentImagePicker"
|
|
|
36
36
|
class ImagePickerModule : Module() {
|
|
37
37
|
|
|
38
38
|
override fun definition() = ModuleDefinition {
|
|
39
|
-
|
|
40
39
|
Name(moduleName)
|
|
41
40
|
|
|
42
41
|
// region JS API
|
|
@@ -85,15 +84,15 @@ class ImagePickerModule : Module() {
|
|
|
85
84
|
|
|
86
85
|
RegisterActivityContracts {
|
|
87
86
|
cameraLauncher = registerForActivityResult(
|
|
88
|
-
CameraContract(this@ImagePickerModule)
|
|
87
|
+
CameraContract(this@ImagePickerModule)
|
|
89
88
|
) { input, result -> handleResultUponActivityDestruction(result, input.options) }
|
|
90
89
|
|
|
91
90
|
imageLibraryLauncher = registerForActivityResult(
|
|
92
|
-
ImageLibraryContract(this@ImagePickerModule)
|
|
91
|
+
ImageLibraryContract(this@ImagePickerModule)
|
|
93
92
|
) { input, result -> handleResultUponActivityDestruction(result, input.options) }
|
|
94
93
|
|
|
95
94
|
cropImageLauncher = registerForActivityResult(
|
|
96
|
-
CropImageContract(this@ImagePickerModule)
|
|
95
|
+
CropImageContract(this@ImagePickerModule)
|
|
97
96
|
) { input, result -> handleResultUponActivityDestruction(result, input.options) }
|
|
98
97
|
}
|
|
99
98
|
}
|
|
@@ -127,7 +126,7 @@ class ImagePickerModule : Module() {
|
|
|
127
126
|
*/
|
|
128
127
|
private suspend fun launchContract(
|
|
129
128
|
pickerLauncher: suspend () -> ImagePickerContractResult,
|
|
130
|
-
options: ImagePickerOptions
|
|
129
|
+
options: ImagePickerOptions
|
|
131
130
|
): Any {
|
|
132
131
|
return try {
|
|
133
132
|
var result = launchPicker(pickerLauncher)
|
|
@@ -161,7 +160,7 @@ class ImagePickerModule : Module() {
|
|
|
161
160
|
* Launches picker (image library or camera)
|
|
162
161
|
*/
|
|
163
162
|
private suspend fun launchPicker(
|
|
164
|
-
pickerLauncher: suspend () -> ImagePickerContractResult
|
|
163
|
+
pickerLauncher: suspend () -> ImagePickerContractResult
|
|
165
164
|
): ImagePickerContractResult.Success = withContext(Dispatchers.IO) {
|
|
166
165
|
when (val pickingResult = pickerLauncher()) {
|
|
167
166
|
is ImagePickerContractResult.Success -> pickingResult
|
|
@@ -148,7 +148,7 @@ internal fun Intent.getAllDataUris(): List<Uri> {
|
|
|
148
148
|
internal suspend fun copyFile(
|
|
149
149
|
sourceUri: Uri,
|
|
150
150
|
targetFile: File,
|
|
151
|
-
contentResolver: ContentResolver
|
|
151
|
+
contentResolver: ContentResolver
|
|
152
152
|
) = runInterruptible {
|
|
153
153
|
val targetUri = Uri.fromFile(targetFile)
|
|
154
154
|
|
|
@@ -184,7 +184,7 @@ internal suspend fun copyExifData(
|
|
|
184
184
|
ExifInterface.TAG_IMAGE_WIDTH,
|
|
185
185
|
ExifInterface.TAG_PIXEL_X_DIMENSION,
|
|
186
186
|
ExifInterface.TAG_PIXEL_Y_DIMENSION,
|
|
187
|
-
ExifInterface.TAG_ORIENTATION
|
|
187
|
+
ExifInterface.TAG_ORIENTATION
|
|
188
188
|
)
|
|
189
189
|
|
|
190
190
|
try {
|
|
@@ -13,14 +13,14 @@ import expo.modules.kotlin.providers.AppContextProvider
|
|
|
13
13
|
import java.io.File
|
|
14
14
|
|
|
15
15
|
internal class MediaHandler(
|
|
16
|
-
private val appContextProvider: AppContextProvider
|
|
16
|
+
private val appContextProvider: AppContextProvider
|
|
17
17
|
) {
|
|
18
18
|
private val context: Context
|
|
19
19
|
get() = requireNotNull(appContextProvider.appContext.reactContext) { "React Application Context is null" }
|
|
20
20
|
|
|
21
21
|
internal suspend fun readExtras(
|
|
22
22
|
bareResult: List<Pair<MediaType, Uri>>,
|
|
23
|
-
options: ImagePickerOptions
|
|
23
|
+
options: ImagePickerOptions
|
|
24
24
|
): ImagePickerResponse {
|
|
25
25
|
val results = bareResult.map { (mediaType, uri) ->
|
|
26
26
|
when (mediaType) {
|
|
@@ -40,7 +40,7 @@ internal class MediaHandler(
|
|
|
40
40
|
|
|
41
41
|
private suspend fun handleImage(
|
|
42
42
|
sourceUri: Uri,
|
|
43
|
-
options: ImagePickerOptions
|
|
43
|
+
options: ImagePickerOptions
|
|
44
44
|
): ImagePickerAsset {
|
|
45
45
|
val exporter: ImageExporter = if (options.quality == ImagePickerConstants.MAXIMUM_QUALITY) {
|
|
46
46
|
RawImageExporter()
|
|
@@ -69,7 +69,7 @@ internal class MediaHandler(
|
|
|
69
69
|
mimeType = mimeType,
|
|
70
70
|
base64 = base64,
|
|
71
71
|
exif = exif,
|
|
72
|
-
assetId = sourceUri.getMediaStoreAssetId()
|
|
72
|
+
assetId = sourceUri.getMediaStoreAssetId()
|
|
73
73
|
)
|
|
74
74
|
}
|
|
75
75
|
|
|
@@ -87,7 +87,7 @@ internal class MediaHandler(
|
|
|
87
87
|
}
|
|
88
88
|
|
|
89
89
|
private suspend fun handleVideo(
|
|
90
|
-
sourceUri: Uri
|
|
90
|
+
sourceUri: Uri
|
|
91
91
|
): ImagePickerAsset {
|
|
92
92
|
val outputFile = createOutputFile(cacheDirectory, ".mp4")
|
|
93
93
|
copyFile(sourceUri, outputFile, context.contentResolver)
|
|
@@ -22,7 +22,7 @@ import java.io.Serializable
|
|
|
22
22
|
* @see [androidx.activity.result.contract.ActivityResultContracts.TakePicture] or [androidx.activity.result.contract.ActivityResultContracts.CaptureVideo]
|
|
23
23
|
*/
|
|
24
24
|
internal class CameraContract(
|
|
25
|
-
private val appContextProvider: AppContextProvider
|
|
25
|
+
private val appContextProvider: AppContextProvider
|
|
26
26
|
) : AppContextActivityResultContract<CameraContractOptions, ImagePickerContractResult> {
|
|
27
27
|
private val contentResolver: ContentResolver
|
|
28
28
|
get() = requireNotNull(appContextProvider.appContext.reactContext) {
|
|
@@ -62,5 +62,5 @@ internal data class CameraContractOptions(
|
|
|
62
62
|
* Destination file in a form of content-[Uri] to save results coming from camera to.
|
|
63
63
|
*/
|
|
64
64
|
val uri: String,
|
|
65
|
-
val options: ImagePickerOptions
|
|
65
|
+
val options: ImagePickerOptions
|
|
66
66
|
) : Serializable
|
|
@@ -22,7 +22,7 @@ import kotlinx.coroutines.runBlocking
|
|
|
22
22
|
import java.io.Serializable
|
|
23
23
|
|
|
24
24
|
internal class CropImageContract(
|
|
25
|
-
private val appContextProvider: AppContextProvider
|
|
25
|
+
private val appContextProvider: AppContextProvider
|
|
26
26
|
) : AppContextActivityResultContract<CropImageContractOptions, ImagePickerContractResult> {
|
|
27
27
|
override fun createIntent(context: Context, input: CropImageContractOptions) = Intent(context, CropImageActivity::class.java).apply {
|
|
28
28
|
val mediaType = expo.modules.imagepicker.getType(context.contentResolver, input.sourceUri.toUri())
|
|
@@ -69,5 +69,5 @@ internal class CropImageContract(
|
|
|
69
69
|
|
|
70
70
|
internal data class CropImageContractOptions(
|
|
71
71
|
val sourceUri: String,
|
|
72
|
-
val options: ImagePickerOptions
|
|
72
|
+
val options: ImagePickerOptions
|
|
73
73
|
) : Serializable
|
|
@@ -26,7 +26,7 @@ import java.io.Serializable
|
|
|
26
26
|
* @see [androidx.activity.result.contract.ActivityResultContracts.GetMultipleContents]
|
|
27
27
|
*/
|
|
28
28
|
internal class ImageLibraryContract(
|
|
29
|
-
private val appContextProvider: AppContextProvider
|
|
29
|
+
private val appContextProvider: AppContextProvider
|
|
30
30
|
) : AppContextActivityResultContract<ImageLibraryContractOptions, ImagePickerContractResult> {
|
|
31
31
|
private val contentResolver: ContentResolver
|
|
32
32
|
get() = appContextProvider.appContext.reactContext?.contentResolver
|
package/android/src/main/java/expo/modules/imagepicker/exporters/CompressionImageExporter.kt
CHANGED
|
@@ -22,7 +22,7 @@ import java.util.concurrent.ExecutionException
|
|
|
22
22
|
class CompressionImageExporter(
|
|
23
23
|
private val appContextProvider: AppContextProvider,
|
|
24
24
|
@FloatRange(from = 0.0, to = 1.0)
|
|
25
|
-
quality: Double
|
|
25
|
+
quality: Double
|
|
26
26
|
) : ImageExporter {
|
|
27
27
|
private val compressQuality = (quality * 100).toInt()
|
|
28
28
|
|
|
@@ -11,7 +11,7 @@ class RawImageExporter : ImageExporter {
|
|
|
11
11
|
override suspend fun exportAsync(
|
|
12
12
|
source: Uri,
|
|
13
13
|
output: File,
|
|
14
|
-
contentResolver: ContentResolver
|
|
14
|
+
contentResolver: ContentResolver
|
|
15
15
|
): ImageExportResult {
|
|
16
16
|
copyFile(source, output, contentResolver)
|
|
17
17
|
val exifInterface = ExifInterface(output.absolutePath)
|
|
@@ -29,7 +29,7 @@ class RawImageExporter : ImageExporter {
|
|
|
29
29
|
return ImageExportResult(
|
|
30
30
|
width,
|
|
31
31
|
height,
|
|
32
|
-
output
|
|
32
|
+
output
|
|
33
33
|
)
|
|
34
34
|
}
|
|
35
35
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-image-picker",
|
|
3
|
-
"version": "14.7.
|
|
3
|
+
"version": "14.7.1",
|
|
4
4
|
"description": "Provides access to the system's UI for selecting images and videos from the phone's library or taking a photo with the camera.",
|
|
5
5
|
"main": "build/ImagePicker.js",
|
|
6
6
|
"types": "build/ImagePicker.d.ts",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"peerDependencies": {
|
|
45
45
|
"expo": "*"
|
|
46
46
|
},
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "43f1b4f8a5a9bca649e4e7ca6e4155482a162431"
|
|
48
48
|
}
|