From 449c91e59f5d2d7a67d489a20cc129c2141021a8 Mon Sep 17 00:00:00 2001 From: Suhas Dissanayake Date: Mon, 8 Apr 2024 00:19:26 +0530 Subject: [PATCH] feat: support for recording internal audio in rooted devices --- app/src/main/AndroidManifest.xml | 6 ++- .../bnyro/recorder/enums/AudioDeviceSource.kt | 3 +- .../bnyro/recorder/ui/models/RecorderModel.kt | 44 +++++++++++++++++-- .../recorder/ui/screens/SettingsScreen.kt | 3 +- app/src/main/res/values/strings.xml | 2 + 5 files changed, 52 insertions(+), 6 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 5965fad0..ae006816 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -11,7 +11,11 @@ - + + + = Build.VERSION_CODES.O var recorderState by mutableStateOf(RecorderState.IDLE) @@ -73,7 +75,26 @@ class RecorderModel : ViewModel() { @SuppressLint("NewApi") fun startAudioRecorder(context: Context) { - if (!PermissionHelper.checkPermissions(context, audioPermission)) return + val audioPermission = mutableListOf(Manifest.permission.RECORD_AUDIO) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + audioPermission.add(Manifest.permission.POST_NOTIFICATIONS) + } + val internalAudio = Preferences.prefs.getInt( + Preferences.audioDeviceSourceKey, + 0 + ) == AudioDeviceSource.REMOTE_SUBMIX.value + if (internalAudio) { + audioPermission.add(Manifest.permission.CAPTURE_AUDIO_OUTPUT) + } + + if (!PermissionHelper.checkPermissions(context, audioPermission.toTypedArray())) { + Toast.makeText( + context, + context.getString(R.string.no_enough_permissions), Toast.LENGTH_SHORT + ) + .show() + return + } val serviceIntent = if (Preferences.prefs.getBoolean(Preferences.losslessRecorderKey, false)) { @@ -171,12 +192,29 @@ class RecorderModel : ViewModel() { Preferences.prefs.getInt(Preferences.audioSourceKey, 0) == AudioSource.MICROPHONE.value if (recordAudio) requiredPermissions.add(Manifest.permission.RECORD_AUDIO) + + val internalAudio = Preferences.prefs.getInt( + Preferences.audioDeviceSourceKey, + 0 + ) == AudioDeviceSource.REMOTE_SUBMIX.value + if (internalAudio) requiredPermissions.add(Manifest.permission.CAPTURE_AUDIO_OUTPUT) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { requiredPermissions.add(Manifest.permission.POST_NOTIFICATIONS) } if (requiredPermissions.isEmpty()) return true - return PermissionHelper.checkPermissions(context, requiredPermissions.toTypedArray()) + val granted = PermissionHelper.checkPermissions(context, requiredPermissions.toTypedArray()) + if (granted) { + return true + } else { + Toast.makeText( + context, + context.getString(R.string.no_enough_permissions), Toast.LENGTH_SHORT + ) + .show() + return false + } } } diff --git a/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt b/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt index 6bff0548..755a17b8 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/screens/SettingsScreen.kt @@ -173,7 +173,8 @@ fun SettingsScreen() { R.string.default_audio, R.string.microphone, R.string.camcorder, - R.string.unprocessed + R.string.unprocessed, + R.string.internal_audio ).map { stringResource(it) }, diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 73d9f267..fe3c4941 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -85,4 +85,6 @@ Can\'t access selected folder! Draw Mode Erase Mode + Internal Audio (Root) + No enough permissions to start recording \ No newline at end of file