Skip to content

Commit

Permalink
//xplat/js/react-native-github/packages/react-native/ReactAndroid/src…
Browse files Browse the repository at this point in the history
…/main/java/com/facebook/react/modules/camera:cameraAndroid (#44101)

Summary:
Pull Request resolved: #44101

Changelog: [Internal]

Reviewed By: javache

Differential Revision: D56138400

fbshipit-source-id: 5c09e4d28c69bbf87236607d38afbfbddcd28a0c
  • Loading branch information
andrewdacenko authored and facebook-github-bot committed Apr 16, 2024
1 parent b1576e5 commit 8a343c6
Show file tree
Hide file tree
Showing 3 changed files with 104 additions and 103 deletions.
7 changes: 6 additions & 1 deletion packages/react-native/ReactAndroid/api/ReactAndroid.api
Original file line number Diff line number Diff line change
Expand Up @@ -3047,11 +3047,16 @@ public class com/facebook/react/modules/blob/FileReaderModule : com/facebook/fbr
public fun readAsText (Lcom/facebook/react/bridge/ReadableMap;Ljava/lang/String;Lcom/facebook/react/bridge/Promise;)V
}

public class com/facebook/react/modules/camera/ImageStoreManager : com/facebook/fbreact/specs/NativeImageStoreAndroidSpec {
public final class com/facebook/react/modules/camera/ImageStoreManager : com/facebook/fbreact/specs/NativeImageStoreAndroidSpec {
public static final field Companion Lcom/facebook/react/modules/camera/ImageStoreManager$Companion;
public static final field NAME Ljava/lang/String;
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun getBase64ForTag (Ljava/lang/String;Lcom/facebook/react/bridge/Callback;Lcom/facebook/react/bridge/Callback;)V
}

public final class com/facebook/react/modules/camera/ImageStoreManager$Companion {
}

public final class com/facebook/react/modules/clipboard/ClipboardModule : com/facebook/fbreact/specs/NativeClipboardSpec {
public fun <init> (Lcom/facebook/react/bridge/ReactApplicationContext;)V
public fun getString (Lcom/facebook/react/bridge/Promise;)V
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
/*
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/

// TODO T185922447 migrate from deprecated AsyncTask
@file:Suppress("DEPRECATION")

package com.facebook.react.modules.camera

import android.net.Uri
import android.os.AsyncTask
import android.util.Base64
import android.util.Base64OutputStream
import com.facebook.fbreact.specs.NativeImageStoreAndroidSpec
import com.facebook.react.bridge.Callback
import com.facebook.react.bridge.GuardedAsyncTask
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContext
import com.facebook.react.module.annotations.ReactModule
import java.io.ByteArrayOutputStream
import java.io.Closeable
import java.io.FileNotFoundException
import java.io.IOException
import java.io.InputStream

@ReactModule(name = NativeImageStoreAndroidSpec.NAME)
public class ImageStoreManager(reactContext: ReactApplicationContext) :
NativeImageStoreAndroidSpec(reactContext) {

/**
* Calculate the base64 representation for an image. The "tag" comes from iOS naming.
*
* @param uri the URI of the image, file:// or content://
* @param success callback to be invoked with the base64 string as the only argument
* @param error callback to be invoked on error (e.g. file not found, not readable etc.)
*/
override public fun getBase64ForTag(uri: String, success: Callback, error: Callback) {
GetBase64Task(getReactApplicationContext(), uri, success, error)
.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR)
}

private inner class GetBase64Task(
reactContext: ReactContext,
private val uri: String,
private val success: Callback,
private val error: Callback
) : GuardedAsyncTask<Void?, Void?>(reactContext) {
protected override fun doInBackgroundGuarded(vararg params: Void?) {
try {
val contentResolver = getReactApplicationContext().getContentResolver()
val uri = Uri.parse(uri)
val inputStream = contentResolver.openInputStream(uri) as InputStream
try {
success.invoke(convertInputStreamToBase64OutputStream(inputStream))
} catch (e: IOException) {
error.invoke(e.message)
} finally {
closeQuietly(inputStream)
}
} catch (e: FileNotFoundException) {
error.invoke(e.message)
}
}
}

@Throws(IOException::class)
internal fun convertInputStreamToBase64OutputStream(inputStream: InputStream): String {
val baos = ByteArrayOutputStream()
val b64os = Base64OutputStream(baos, Base64.NO_WRAP)
val buffer = ByteArray(BUFFER_SIZE)
var bytesRead: Int
try {
while (inputStream.read(buffer).also { bytesRead = it } > -1) {
b64os.write(buffer, 0, bytesRead)
}
} finally {
closeQuietly(b64os) // this also closes baos and flushes the final content to it
}
return baos.toString()
}

public companion object {
public const val NAME: String = NativeImageStoreAndroidSpec.NAME

private const val BUFFER_SIZE = 8_192

private fun closeQuietly(closeable: Closeable) {
try {
closeable.close()
} catch (e: IOException) {
// shhh
}
}
}
}

0 comments on commit 8a343c6

Please sign in to comment.