From 449c91e59f5d2d7a67d489a20cc129c2141021a8 Mon Sep 17 00:00:00 2001 From: Suhas Dissanayake Date: Mon, 8 Apr 2024 00:19:26 +0530 Subject: [PATCH 1/2] 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 From 70ce5eb976ed43b4523ea9c76945c9276e8c1397 Mon Sep 17 00:00:00 2001 From: Suhas Dissanayake Date: Wed, 10 Apr 2024 23:44:03 +0530 Subject: [PATCH 2/2] fixup! feat: support for recording internal audio in rooted devices --- .../com/bnyro/recorder/ui/models/RecorderModel.kt | 11 ++++------- app/src/main/res/values/strings.xml | 2 +- 2 files changed, 5 insertions(+), 8 deletions(-) diff --git a/app/src/main/java/com/bnyro/recorder/ui/models/RecorderModel.kt b/app/src/main/java/com/bnyro/recorder/ui/models/RecorderModel.kt index 53bbd951..c545a973 100644 --- a/app/src/main/java/com/bnyro/recorder/ui/models/RecorderModel.kt +++ b/app/src/main/java/com/bnyro/recorder/ui/models/RecorderModel.kt @@ -10,7 +10,6 @@ import android.os.Build import android.os.Handler import android.os.IBinder import android.os.Looper -import android.provider.Settings import android.widget.Toast import androidx.activity.result.ActivityResult import androidx.annotation.RequiresApi @@ -90,7 +89,7 @@ class RecorderModel : ViewModel() { if (!PermissionHelper.checkPermissions(context, audioPermission.toTypedArray())) { Toast.makeText( context, - context.getString(R.string.no_enough_permissions), Toast.LENGTH_SHORT + context.getString(R.string.no_sufficient_permissions), Toast.LENGTH_SHORT ) .show() return @@ -193,15 +192,13 @@ class RecorderModel : ViewModel() { if (requiredPermissions.isEmpty()) return true val granted = PermissionHelper.checkPermissions(context, requiredPermissions.toTypedArray()) - if (granted) { - return true - } else { + if (!granted) { Toast.makeText( context, - context.getString(R.string.no_enough_permissions), Toast.LENGTH_SHORT + context.getString(R.string.no_sufficient_permissions), Toast.LENGTH_SHORT ) .show() - return false } + return granted } } diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index fe3c4941..2f9d9d87 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -86,5 +86,5 @@ Draw Mode Erase Mode Internal Audio (Root) - No enough permissions to start recording + No sufficient permissions to start recording \ No newline at end of file