Skip to content

Commit 78d2586

Browse files
committed
Implement EnsureAudioPermission
1 parent cc032e1 commit 78d2586

File tree

3 files changed

+35
-1
lines changed

3 files changed

+35
-1
lines changed

features/video/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ dependencies {
3939
implementation(project(":core:network"))
4040
implementation(project(":core:data"))
4141

42+
implementation(libs.accompanist.permissions)
43+
4244
implementation(libs.stream.video.compose)
4345
implementation(libs.stream.video.mock)
4446

features/video/src/main/kotlin/io/getstream/whatsappclone/video/WhatsAppVideoCall.kt

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616

1717
package io.getstream.whatsappclone.video
1818

19+
import android.Manifest
20+
import android.os.Build
1921
import androidx.compose.foundation.layout.Box
2022
import androidx.compose.foundation.layout.fillMaxSize
2123
import androidx.compose.foundation.layout.size
@@ -36,6 +38,8 @@ import androidx.compose.ui.unit.dp
3638
import androidx.compose.ui.unit.sp
3739
import androidx.hilt.navigation.compose.hiltViewModel
3840
import androidx.lifecycle.compose.collectAsStateWithLifecycle
41+
import com.google.accompanist.permissions.ExperimentalPermissionsApi
42+
import com.google.accompanist.permissions.rememberMultiplePermissionsState
3943
import io.getstream.video.android.compose.theme.VideoTheme
4044
import io.getstream.video.android.compose.ui.components.call.activecall.CallContent
4145
import io.getstream.video.android.compose.ui.components.call.controls.ControlActions
@@ -59,7 +63,7 @@ fun WhatsAppVideoCall(
5963
) {
6064
val uiState by viewModel.videoUiSate.collectAsStateWithLifecycle()
6165

62-
LaunchedEffect(key1 = id) {
66+
EnsureAudioPermission {
6367
viewModel.joinCall(type = "default", id = id.replace(":", ""))
6468
}
6569

@@ -210,3 +214,30 @@ private fun WhatsAppVideoCallContentPreview() {
210214
) {}
211215
}
212216
}
217+
218+
@OptIn(ExperimentalPermissionsApi::class)
219+
@Composable
220+
fun EnsureAudioPermission(onPermissionsGranted: () -> Unit) {
221+
// While the SDK will handle the microphone permission,
222+
// its not a bad idea to do it prior to entering any call UIs
223+
val permissionsState = rememberMultiplePermissionsState(
224+
permissions = buildList {
225+
// Access to microphone
226+
add(Manifest.permission.RECORD_AUDIO)
227+
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
228+
// Allow for foreground service for notification on API 26+
229+
add(Manifest.permission.FOREGROUND_SERVICE)
230+
}
231+
}
232+
)
233+
234+
LaunchedEffect(key1 = Unit) {
235+
permissionsState.launchMultiplePermissionRequest()
236+
}
237+
238+
LaunchedEffect(key1 = permissionsState.allPermissionsGranted) {
239+
if (permissionsState.allPermissionsGranted) {
240+
onPermissionsGranted()
241+
}
242+
}
243+
}

gradle/libs.versions.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ landscapist-animation = { group = "com.github.skydoves", name = "landscapist-ani
5858
landscapist-placeholder = { group = "com.github.skydoves", name = "landscapist-placeholder", version.ref = "landscapist" }
5959
accompanist-pager = { group = "com.google.accompanist", name = "accompanist-pager", version.ref = "accompanist" }
6060
accompanist-indicator = { group = "com.google.accompanist", name = "accompanist-pager-indicators", version.ref = "accompanist" }
61+
accompanist-permissions = { group = "com.google.accompanist", name = "accompanist-permissions", version.ref = "accompanist" }
6162
android-desugarJdkLibs = { group = "com.android.tools", name = "desugar_jdk_libs", version.ref = "androidDesugarJdkLibs" }
6263
androidx-activity-compose = { group = "androidx.activity", name = "activity-compose", version.ref = "androidxActivity" }
6364
androidx-appcompat = { group = "androidx.appcompat", name = "appcompat", version.ref = "androidxAppCompat" }

0 commit comments

Comments
 (0)