From 6663a6efb328187f072be86ec42eb0fabff9232e Mon Sep 17 00:00:00 2001 From: Suhas Dissanayake Date: Thu, 11 Apr 2024 09:21:54 +0530 Subject: [PATCH] feat: support for recording internal audio in rooted devices (#284) * feat: support for recording internal audio in rooted devices * fixup! feat: support for recording internal audio in rooted devices --- app/src/main/AndroidManifest.xml | 4 +++ .../bnyro/recorder/enums/AudioDeviceSource.kt | 3 +- .../bnyro/recorder/ui/models/RecorderModel.kt | 36 +++++++++++++++++-- .../recorder/ui/screens/SettingsScreen.kt | 3 +- app/src/main/res/values/strings.xml | 2 ++ 5 files changed, 44 insertions(+), 4 deletions(-) diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 79fda6e7..267de78b 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -12,6 +12,10 @@ + + = 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())) return + if (!PermissionHelper.checkPermissions(context, audioPermission.toTypedArray())) { + Toast.makeText( + context, + context.getString(R.string.no_sufficient_permissions), Toast.LENGTH_SHORT + ) + .show() + return + } val serviceIntent = if (Preferences.prefs.getBoolean(Preferences.losslessRecorderKey, false)) { @@ -161,12 +178,27 @@ 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) { + Toast.makeText( + context, + context.getString(R.string.no_sufficient_permissions), Toast.LENGTH_SHORT + ) + .show() + } + return granted } } 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..2f9d9d87 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 sufficient permissions to start recording \ No newline at end of file