add yml file
RN APK Build / build (push) Failing after 23m47s

This commit is contained in:
2026-04-22 16:07:47 +05:30
commit 6fd0bee8a3
513 changed files with 251121 additions and 0 deletions
@@ -0,0 +1,516 @@
diff --git a/node_modules/react-native-audio-recorder-player/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties b/node_modules/react-native-audio-recorder-player/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
new file mode 100644
index 0000000..1211b1e
--- /dev/null
+++ b/node_modules/react-native-audio-recorder-player/android/build/intermediates/aar_metadata/debug/writeDebugAarMetadata/aar-metadata.properties
@@ -0,0 +1,6 @@
+aarFormatVersion=1.0
+aarMetadataVersion=1.0
+minCompileSdk=1
+minCompileSdkExtension=0
+minAndroidGradlePluginVersion=1.0.0
+coreLibraryDesugaringEnabled=false
diff --git a/node_modules/react-native-audio-recorder-player/android/src/main/java/com/dooboolab.audiorecorderplayer/RNAudioRecorderPlayerModule.kt b/node_modules/react-native-audio-recorder-player/android/src/main/java/com/dooboolab.audiorecorderplayer/RNAudioRecorderPlayerModule.kt
index 5cb9bbf..25090aa 100644
--- a/node_modules/react-native-audio-recorder-player/android/src/main/java/com/dooboolab.audiorecorderplayer/RNAudioRecorderPlayerModule.kt
+++ b/node_modules/react-native-audio-recorder-player/android/src/main/java/com/dooboolab.audiorecorderplayer/RNAudioRecorderPlayerModule.kt
@@ -18,7 +18,12 @@ import java.io.IOException
import java.util.*
import kotlin.math.log10
-class RNAudioRecorderPlayerModule(private val reactContext: ReactApplicationContext) : ReactContextBaseJavaModule(reactContext), PermissionListener {
+class RNAudioRecorderPlayerModule(
+ private val reactApplicationContext: ReactApplicationContext
+) : ReactContextBaseJavaModule(reactApplicationContext),
+ PermissionListener,
+ LifecycleEventListener {
+
private var audioFileURL = ""
private var subsDurationMillis = 500
private var _meteringEnabled = false
@@ -29,345 +34,206 @@ class RNAudioRecorderPlayerModule(private val reactContext: ReactApplicationCont
private var mTimer: Timer? = null
private var pausedRecordTime = 0L
private var totalPausedRecordTime = 0L
- var recordHandler: Handler? = Handler(Looper.getMainLooper())
- override fun getName(): String {
- return tag
- }
+ private var recordHandler: Handler? = Handler(Looper.getMainLooper())
+
+ private val activity
+ get() = reactApplicationContext.currentActivity
+
+ private val appContext
+ get() = reactApplicationContext.applicationContext
+
+ override fun getName(): String = tag
@ReactMethod
- fun startRecorder(path: String, audioSet: ReadableMap?, meteringEnabled: Boolean, promise: Promise) {
+ fun startRecorder(
+ path: String,
+ audioSet: ReadableMap?,
+ meteringEnabled: Boolean,
+ promise: Promise
+ ) {
+ if (activity == null) {
+ promise.reject("NO_ACTIVITY", "Activity not attached")
+ return
+ }
+
try {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
- // TIRAMISU (33)
- // https://github.com/hyochan/react-native-audio-recorder-player/issues/503
- if (Build.VERSION.SDK_INT < 33 &&
- (ActivityCompat.checkSelfPermission(reactContext, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED ||
- ActivityCompat.checkSelfPermission(reactContext, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED)) {
- ActivityCompat.requestPermissions((currentActivity)!!, arrayOf(
- Manifest.permission.RECORD_AUDIO,
- Manifest.permission.WRITE_EXTERNAL_STORAGE), 0)
- promise.reject("No permission granted.", "Try again after adding permission.")
- return
- } else if (ActivityCompat.checkSelfPermission(reactContext, Manifest.permission.RECORD_AUDIO) != PackageManager.PERMISSION_GRANTED) {
- ActivityCompat.requestPermissions((currentActivity)!!, arrayOf(Manifest.permission.RECORD_AUDIO), 0)
- promise.reject("No permission granted.", "Try again after adding permission.")
+ if (ActivityCompat.checkSelfPermission(
+ appContext,
+ Manifest.permission.RECORD_AUDIO
+ ) != PackageManager.PERMISSION_GRANTED
+ ) {
+ ActivityCompat.requestPermissions(
+ activity!!,
+ arrayOf(Manifest.permission.RECORD_AUDIO),
+ 0
+ )
+ promise.reject("PERMISSION_DENIED", "RECORD_AUDIO permission not granted")
return
}
}
- } catch (ne: NullPointerException) {
- Log.w(tag, ne.toString())
- promise.reject("No permission granted.", "Try again after adding permission.")
+ } catch (e: Exception) {
+ promise.reject("PERMISSION_ERROR", e.message)
return
}
- audioFileURL = if (((path == "DEFAULT"))) "${reactContext.cacheDir}/$defaultFileName" else path
+
+ val outputFormat =
+ if (audioSet?.hasKey("OutputFormatAndroid") == true)
+ audioSet.getInt("OutputFormatAndroid")
+ else
+ MediaRecorder.OutputFormat.MPEG_4
+
+ audioFileURL =
+ if (path == "DEFAULT")
+ "${reactApplicationContext.cacheDir}/sound.${defaultFileExtensions[outputFormat]}"
+ else path
+
_meteringEnabled = meteringEnabled
- if (mediaRecorder == null) {
- mediaRecorder = MediaRecorder()
+ if (mediaRecorder != null) {
+ promise.reject("InvalidState", "Recorder already running")
+ return
}
- if (audioSet != null) {
- mediaRecorder!!.setAudioSource(if (audioSet.hasKey("AudioSourceAndroid")) audioSet.getInt("AudioSourceAndroid") else MediaRecorder.AudioSource.MIC)
- mediaRecorder!!.setOutputFormat(if (audioSet.hasKey("OutputFormatAndroid")) audioSet.getInt("OutputFormatAndroid") else MediaRecorder.OutputFormat.MPEG_4)
- mediaRecorder!!.setAudioEncoder(if (audioSet.hasKey("AudioEncoderAndroid")) audioSet.getInt("AudioEncoderAndroid") else MediaRecorder.AudioEncoder.AAC)
- mediaRecorder!!.setAudioSamplingRate(if (audioSet.hasKey("AudioSamplingRateAndroid")) audioSet.getInt("AudioSamplingRateAndroid") else 48000)
- mediaRecorder!!.setAudioEncodingBitRate(if (audioSet.hasKey("AudioEncodingBitRateAndroid")) audioSet.getInt("AudioEncodingBitRateAndroid") else 128000)
- } else {
- mediaRecorder!!.setAudioSource(MediaRecorder.AudioSource.MIC)
- mediaRecorder!!.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4)
- mediaRecorder!!.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
- mediaRecorder!!.setAudioEncodingBitRate(128000)
- mediaRecorder!!.setAudioSamplingRate(48000)
- }
- mediaRecorder!!.setOutputFile(audioFileURL)
+ val recorder =
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S)
+ MediaRecorder(appContext)
+ else MediaRecorder()
try {
- mediaRecorder!!.prepare()
+ recorder.setAudioSource(MediaRecorder.AudioSource.MIC)
+ recorder.setOutputFormat(outputFormat)
+ recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AAC)
+ recorder.setOutputFile(audioFileURL)
+
+ recorder.prepare()
+ recorder.start()
+
+ mediaRecorder = recorder
totalPausedRecordTime = 0L
- mediaRecorder!!.start()
- val systemTime = SystemClock.elapsedRealtime()
+
+ val startTime = SystemClock.elapsedRealtime()
recorderRunnable = object : Runnable {
override fun run() {
- val time = SystemClock.elapsedRealtime() - systemTime - totalPausedRecordTime
- val obj = Arguments.createMap()
- obj.putDouble("currentPosition", time.toDouble())
+ val time =
+ SystemClock.elapsedRealtime() - startTime - totalPausedRecordTime
+ val map = Arguments.createMap()
+ map.putDouble("currentPosition", time.toDouble())
+
if (_meteringEnabled) {
- var maxAmplitude = 0
- if (mediaRecorder != null) {
- maxAmplitude = mediaRecorder!!.maxAmplitude
- }
- var dB = -160.0
- val maxAudioSize = 32767.0
- if (maxAmplitude > 0) {
- dB = 20 * log10(maxAmplitude / maxAudioSize)
- }
- obj.putInt("currentMetering", dB.toInt())
+ val amp = mediaRecorder?.maxAmplitude ?: 0
+ val dB =
+ if (amp > 0) (20 * log10(amp / 32767.0)).toInt() else -160
+ map.putInt("currentMetering", dB)
}
- sendEvent(reactContext, "rn-recordback", obj)
- recordHandler!!.postDelayed(this, subsDurationMillis.toLong())
+
+ sendEvent("rn-recordback", map)
+ recordHandler?.postDelayed(this, subsDurationMillis.toLong())
}
}
- (recorderRunnable as Runnable).run()
- promise.resolve("file:///$audioFileURL")
- } catch (e: Exception) {
- Log.e(tag, "Exception: ", e)
- promise.reject("startRecord", e.message)
- }
- }
- @ReactMethod
- fun resumeRecorder(promise: Promise) {
- if (mediaRecorder == null) {
- promise.reject("resumeReocrder", "Recorder is null.")
- return
- }
-
- try {
- mediaRecorder!!.resume()
- totalPausedRecordTime += SystemClock.elapsedRealtime() - pausedRecordTime;
- recorderRunnable?.let { recordHandler!!.postDelayed(it, subsDurationMillis.toLong()) }
- promise.resolve("Recorder resumed.")
- } catch (e: Exception) {
- Log.e(tag, "Recorder resume: " + e.message)
- promise.reject("resumeRecorder", e.message)
- }
- }
-
- @ReactMethod
- fun pauseRecorder(promise: Promise) {
- if (mediaRecorder == null) {
- promise.reject("pauseRecorder", "Recorder is null.")
- return
- }
+ recorderRunnable?.run()
+ promise.resolve("file:///$audioFileURL")
- try {
- mediaRecorder!!.pause()
- pausedRecordTime = SystemClock.elapsedRealtime();
- recorderRunnable?.let { recordHandler!!.removeCallbacks(it) };
- promise.resolve("Recorder paused.")
} catch (e: Exception) {
- Log.e(tag, "pauseRecorder exception: " + e.message)
- promise.reject("pauseRecorder", e.message)
+ recorder.release()
+ mediaRecorder = null
+ promise.reject("startRecorder", e.message)
}
}
@ReactMethod
fun stopRecorder(promise: Promise) {
- if (recordHandler != null) {
- recorderRunnable?.let { recordHandler!!.removeCallbacks(it) }
- }
-
- if (mediaRecorder == null) {
- promise.reject("stopRecord", "recorder is null.")
- return
- }
-
try {
- mediaRecorder!!.stop()
- } catch (stopException: RuntimeException) {
- stopException.message?.let { Log.d(tag,"" + it) }
- promise.reject("stopRecord", stopException.message)
- }
-
- mediaRecorder!!.release()
- mediaRecorder = null
- promise.resolve("file:///$audioFileURL")
- }
-
- @ReactMethod
- fun setVolume(volume: Double, promise: Promise) {
- if (mediaPlayer == null) {
- promise.reject("setVolume", "player is null.")
- return
+ recordHandler?.removeCallbacks(recorderRunnable!!)
+ mediaRecorder?.stop()
+ mediaRecorder?.release()
+ mediaRecorder = null
+ promise.resolve("file:///$audioFileURL")
+ } catch (e: Exception) {
+ promise.reject("stopRecorder", e.message)
}
-
- val mVolume = volume.toFloat()
- mediaPlayer!!.setVolume(mVolume, mVolume)
- promise.resolve("set volume")
}
@ReactMethod
- fun startPlayer(path: String, httpHeaders: ReadableMap?, promise: Promise) {
+ fun startPlayer(path: String, headers: ReadableMap?, promise: Promise) {
if (mediaPlayer != null) {
- val isPaused = !mediaPlayer!!.isPlaying && mediaPlayer!!.currentPosition > 1
-
- if (isPaused) {
- mediaPlayer!!.start()
- promise.resolve("player resumed.")
- return
- }
-
- Log.e(tag, "Player is already running. Stop it first.")
- promise.reject("startPlay", "Player is already running. Stop it first.")
+ promise.reject("PLAYER_RUNNING", "Player already running")
return
- } else {
- mediaPlayer = MediaPlayer()
}
+ mediaPlayer = MediaPlayer()
+
try {
- if ((path == "DEFAULT")) {
- mediaPlayer!!.setDataSource("${reactContext.cacheDir}/$defaultFileName")
- } else {
- if (httpHeaders != null) {
- val headers: MutableMap<String, String?> = HashMap<String, String?>()
- val iterator = httpHeaders.keySetIterator()
- while (iterator.hasNextKey()) {
- val key = iterator.nextKey()
- headers.put(key, httpHeaders.getString(key))
- }
- mediaPlayer!!.setDataSource(currentActivity!!.applicationContext, Uri.parse(path), headers)
- } else {
- mediaPlayer!!.setDataSource(path)
+ if (headers != null) {
+ val map = HashMap<String, String?>()
+ val it = headers.keySetIterator()
+ while (it.hasNextKey()) {
+ val k = it.nextKey()
+ map[k] = headers.getString(k)
}
+ mediaPlayer!!.setDataSource(appContext, Uri.parse(path), map)
+ } else {
+ mediaPlayer!!.setDataSource(path)
}
- mediaPlayer!!.setOnPreparedListener { mp ->
- Log.d(tag, "mediaplayer prepared and start")
- mp.start()
- /**
- * Set timer task to send event to RN.
- */
- mTask = object : TimerTask() {
- override fun run() {
- val obj = Arguments.createMap()
- obj.putInt("duration", mp.duration)
- obj.putInt("currentPosition", mp.currentPosition)
- sendEvent(reactContext, "rn-playback", obj)
- }
- }
-
- mTimer = Timer()
- mTimer!!.schedule(mTask, 0, subsDurationMillis.toLong())
- val resolvedPath = if (((path == "DEFAULT"))) "${reactContext.cacheDir}/$defaultFileName" else path
- promise.resolve(resolvedPath)
+ mediaPlayer!!.setOnPreparedListener {
+ it.start()
+ promise.resolve(path)
}
- /**
- * Detect when finish playing.
- */
- mediaPlayer!!.setOnCompletionListener { mp ->
- /**
- * Send last event
- */
- val obj = Arguments.createMap()
- obj.putInt("duration", mp.duration)
- obj.putInt("currentPosition", mp.duration)
- sendEvent(reactContext, "rn-playback", obj)
- /**
- * Reset player.
- */
- Log.d(tag, "Plays completed.")
- mTimer!!.cancel()
- mp.stop()
- mp.release()
+ mediaPlayer!!.setOnCompletionListener {
+ sendEvent("rn-playback", Arguments.createMap().apply {
+ putBoolean("isFinished", true)
+ })
+ it.release()
mediaPlayer = null
}
- mediaPlayer!!.prepare()
+ mediaPlayer!!.prepareAsync()
} catch (e: IOException) {
- Log.e(tag, "startPlay() io exception")
- promise.reject("startPlay", e.message)
- } catch (e: NullPointerException) {
- Log.e(tag, "startPlay() null exception")
+ promise.reject("startPlayer", e.message)
}
}
- @ReactMethod
- fun resumePlayer(promise: Promise) {
- if (mediaPlayer == null) {
- promise.reject("resume", "mediaPlayer is null on resume.")
- return
- }
-
- if (mediaPlayer!!.isPlaying) {
- promise.reject("resume", "mediaPlayer is already running.")
- return
- }
-
- try {
- mediaPlayer!!.seekTo(mediaPlayer!!.currentPosition)
- mediaPlayer!!.start()
- promise.resolve("resume player")
- } catch (e: Exception) {
- Log.e(tag, "mediaPlayer resume: " + e.message)
- promise.reject("resume", e.message)
- }
+ private fun sendEvent(event: String, params: WritableMap?) {
+ reactApplicationContext
+ .getJSModule(RCTDeviceEventEmitter::class.java)
+ .emit(event, params)
}
- @ReactMethod
- fun pausePlayer(promise: Promise) {
- if (mediaPlayer == null) {
- promise.reject("pausePlay", "mediaPlayer is null on pause.")
- return
- }
-
+ override fun onHostDestroy() {
try {
- mediaPlayer!!.pause()
- promise.resolve("pause player")
- } catch (e: Exception) {
- Log.e(tag, "pausePlay exception: " + e.message)
- promise.reject("pausePlay", e.message)
+ mediaRecorder?.release()
+ mediaPlayer?.release()
+ } catch (_: Exception) {
}
}
- @ReactMethod
- fun seekToPlayer(time: Double, promise: Promise) {
- if (mediaPlayer == null) {
- promise.reject("seekTo", "mediaPlayer is null on seek.")
- return
- }
-
- mediaPlayer!!.seekTo(time.toInt())
- promise.resolve("pause player")
- }
-
- private fun sendEvent(reactContext: ReactContext,
- eventName: String,
- params: WritableMap?) {
- reactContext
- .getJSModule<RCTDeviceEventEmitter>(RCTDeviceEventEmitter::class.java)
- .emit(eventName, params)
- }
-
- @ReactMethod
- fun stopPlayer(promise: Promise) {
- if (mTimer != null) {
- mTimer!!.cancel()
- }
-
- if (mediaPlayer == null) {
- promise.resolve("Already stopped player")
- return
- }
+ override fun onHostPause() {}
+ override fun onHostResume() {}
- try {
- mediaPlayer!!.release()
- mediaPlayer = null
- promise.resolve("stopped player")
- } catch (e: Exception) {
- Log.e(tag, "stopPlay exception: " + e.message)
- promise.reject("stopPlay", e.message)
- }
- }
-
- @ReactMethod
- fun setSubscriptionDuration(sec: Double, promise: Promise) {
- subsDurationMillis = (sec * 1000).toInt()
- promise.resolve("setSubscriptionDuration: $subsDurationMillis")
- }
-
- override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<String>, grantResults: IntArray): Boolean {
- var requestRecordAudioPermission: Int = 200
-
- when (requestCode) {
- requestRecordAudioPermission -> if (grantResults[0] == PackageManager.PERMISSION_GRANTED) return true
- }
-
- return false
- }
+ override fun onRequestPermissionsResult(
+ requestCode: Int,
+ permissions: Array<String>,
+ grantResults: IntArray
+ ): Boolean = true
companion object {
- private var tag = "RNAudioRecorderPlayer"
- private var defaultFileName = "sound.mp4"
+ private const val tag = "RNAudioRecorderPlayer"
+ private val defaultFileExtensions = listOf(
+ "mp4",
+ "3gp",
+ "mp4",
+ "amr",
+ "amr",
+ "aac",
+ "aac",
+ "rtp",
+ "ts",
+ "webm",
+ "xxx",
+ "ogg"
+ )
}
}