继续操作前请注册或者登录。
davidliu

permissions toggle

@@ -72,6 +72,9 @@ class CallViewModel( @@ -72,6 +72,9 @@ class CallViewModel(
72 private val mutableDataReceived = MutableSharedFlow<String>() 72 private val mutableDataReceived = MutableSharedFlow<String>()
73 val dataReceived = mutableDataReceived 73 val dataReceived = mutableDataReceived
74 74
  75 + private val mutablePermissionAllowed = MutableStateFlow(true)
  76 + val permissionAllowed = mutablePermissionAllowed.hide()
  77 +
75 init { 78 init {
76 viewModelScope.launch { 79 viewModelScope.launch {
77 80
@@ -238,6 +241,11 @@ class CallViewModel( @@ -238,6 +241,11 @@ class CallViewModel(
238 room.value?.localParticipant?.publishData(message.toByteArray(Charsets.UTF_8)) 241 room.value?.localParticipant?.publishData(message.toByteArray(Charsets.UTF_8))
239 } 242 }
240 } 243 }
  244 +
  245 + fun toggleSubscriptionPermissions() {
  246 + mutablePermissionAllowed.value = !mutablePermissionAllowed.value
  247 + room.value?.localParticipant?.setTrackSubscriptionPermissions(mutablePermissionAllowed.value)
  248 + }
241 } 249 }
242 250
243 private fun <T> LiveData<T>.hide(): LiveData<T> = this 251 private fun <T> LiveData<T>.hide(): LiveData<T> = this
  1 +<!-- drawable/account_cancel.xml -->
  2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:height="24dp"
  4 + android:width="24dp"
  5 + android:viewportWidth="24"
  6 + android:viewportHeight="24">
  7 + <path android:fillColor="#000" android:pathData="M10 4A4 4 0 0 0 6 8A4 4 0 0 0 10 12A4 4 0 0 0 14 8A4 4 0 0 0 10 4M17.5 13C15 13 13 15 13 17.5C13 20 15 22 17.5 22C20 22 22 20 22 17.5C22 15 20 13 17.5 13M10 14C5.58 14 2 15.79 2 18V20H11.5A6.5 6.5 0 0 1 11 17.5A6.5 6.5 0 0 1 11.95 14.14C11.32 14.06 10.68 14 10 14M17.5 14.5C19.16 14.5 20.5 15.84 20.5 17.5C20.5 18.06 20.35 18.58 20.08 19L16 14.92C16.42 14.65 16.94 14.5 17.5 14.5M14.92 16L19 20.08C18.58 20.35 18.06 20.5 17.5 20.5C15.84 20.5 14.5 19.16 14.5 17.5C14.5 16.94 14.65 16.42 14.92 16Z" />
  8 +</vector>
  1 +<!-- drawable/account_cancel_outline.xml -->
  2 +<vector xmlns:android="http://schemas.android.com/apk/res/android"
  3 + android:height="24dp"
  4 + android:width="24dp"
  5 + android:viewportWidth="24"
  6 + android:viewportHeight="24">
  7 + <path android:fillColor="#000" android:pathData="M10 4A4 4 0 0 0 6 8A4 4 0 0 0 10 12A4 4 0 0 0 14 8A4 4 0 0 0 10 4M10 6A2 2 0 0 1 12 8A2 2 0 0 1 10 10A2 2 0 0 1 8 8A2 2 0 0 1 10 6M10 13C7.33 13 2 14.33 2 17V20H11.5A6.5 6.5 0 0 1 11.03 18.1H3.9V17C3.9 16.36 7.03 14.9 10 14.9C10.5 14.9 11 14.95 11.5 15.03A6.5 6.5 0 0 1 12.55 13.29C11.61 13.1 10.71 13 10 13M17.5 13C15 13 13 15 13 17.5C13 20 15 22 17.5 22C20 22 22 20 22 17.5C22 15 20 13 17.5 13M17.5 14.5C19.16 14.5 20.5 15.84 20.5 17.5C20.5 18.06 20.35 18.58 20.08 19L16 14.92C16.42 14.65 16.94 14.5 17.5 14.5M14.92 16L19 20.08C18.58 20.35 18.06 20.5 17.5 20.5C15.84 20.5 14.5 19.16 14.5 17.5C14.5 16.94 14.65 16.42 14.92 16Z" />
  8 +</vector>
@@ -96,6 +96,7 @@ class CallActivity : AppCompatActivity() { @@ -96,6 +96,7 @@ class CallActivity : AppCompatActivity() {
96 val videoEnabled by viewModel.cameraEnabled.observeAsState(true) 96 val videoEnabled by viewModel.cameraEnabled.observeAsState(true)
97 val flipButtonEnabled by viewModel.flipButtonVideoEnabled.observeAsState(true) 97 val flipButtonEnabled by viewModel.flipButtonVideoEnabled.observeAsState(true)
98 val screencastEnabled by viewModel.screenshareEnabled.observeAsState(false) 98 val screencastEnabled by viewModel.screenshareEnabled.observeAsState(false)
  99 + val permissionAllowed by viewModel.permissionAllowed.collectAsState()
99 Content( 100 Content(
100 room, 101 room,
101 participants, 102 participants,
@@ -105,6 +106,7 @@ class CallActivity : AppCompatActivity() { @@ -105,6 +106,7 @@ class CallActivity : AppCompatActivity() {
105 videoEnabled, 106 videoEnabled,
106 flipButtonEnabled, 107 flipButtonEnabled,
107 screencastEnabled, 108 screencastEnabled,
  109 + permissionAllowed = permissionAllowed,
108 onExitClick = { finish() }, 110 onExitClick = { finish() },
109 onSendMessage = { viewModel.sendData(it) } 111 onSendMessage = { viewModel.sendData(it) }
110 ) 112 )
@@ -149,6 +151,7 @@ class CallActivity : AppCompatActivity() { @@ -149,6 +151,7 @@ class CallActivity : AppCompatActivity() {
149 videoEnabled: Boolean = true, 151 videoEnabled: Boolean = true,
150 flipButtonEnabled: Boolean = true, 152 flipButtonEnabled: Boolean = true,
151 screencastEnabled: Boolean = false, 153 screencastEnabled: Boolean = false,
  154 + permissionAllowed: Boolean = true,
152 onExitClick: () -> Unit = {}, 155 onExitClick: () -> Unit = {},
153 error: Throwable? = null, 156 error: Throwable? = null,
154 onSnackbarDismiss: () -> Unit = {}, 157 onSnackbarDismiss: () -> Unit = {},
@@ -210,7 +213,7 @@ class CallActivity : AppCompatActivity() { @@ -210,7 +213,7 @@ class CallActivity : AppCompatActivity() {
210 } 213 }
211 214
212 // Control bar for any switches such as mic/camera enable/disable. 215 // Control bar for any switches such as mic/camera enable/disable.
213 - Row( 216 + Column(
214 modifier = Modifier 217 modifier = Modifier
215 .padding(top = 10.dp, bottom = 20.dp) 218 .padding(top = 10.dp, bottom = 20.dp)
216 .fillMaxWidth() 219 .fillMaxWidth()
@@ -219,11 +222,16 @@ class CallActivity : AppCompatActivity() { @@ -219,11 +222,16 @@ class CallActivity : AppCompatActivity() {
219 width = Dimension.fillToConstraints 222 width = Dimension.fillToConstraints
220 height = Dimension.wrapContent 223 height = Dimension.wrapContent
221 }, 224 },
222 - horizontalArrangement = Arrangement.SpaceEvenly,  
223 - verticalAlignment = Alignment.Bottom, 225 + verticalArrangement = Arrangement.SpaceEvenly,
  226 + horizontalAlignment = Alignment.CenterHorizontally
224 ) { 227 ) {
  228 +
225 val controlSize = 40.dp 229 val controlSize = 40.dp
226 val controlPadding = 4.dp 230 val controlPadding = 4.dp
  231 + Row(
  232 + horizontalArrangement = Arrangement.SpaceEvenly,
  233 + verticalAlignment = Alignment.Bottom,
  234 + ) {
227 Surface( 235 Surface(
228 onClick = { viewModel.setMicEnabled(!micEnabled) }, 236 onClick = { viewModel.setMicEnabled(!micEnabled) },
229 indication = rememberRipple(false), 237 indication = rememberRipple(false),
@@ -357,6 +365,30 @@ class CallActivity : AppCompatActivity() { @@ -357,6 +365,30 @@ class CallActivity : AppCompatActivity() {
357 } 365 }
358 } 366 }
359 367
  368 + Spacer(modifier = Modifier.height(10.dp))
  369 +
  370 + Row(
  371 + horizontalArrangement = Arrangement.SpaceEvenly,
  372 + verticalAlignment = Alignment.Bottom,
  373 + ) {
  374 + Surface(
  375 + onClick = { viewModel.toggleSubscriptionPermissions() },
  376 + indication = rememberRipple(false),
  377 + modifier = Modifier
  378 + .size(controlSize)
  379 + .padding(controlPadding)
  380 + ) {
  381 + val resource =
  382 + if (permissionAllowed) R.drawable.account_cancel_outline else R.drawable.account_cancel
  383 + Icon(
  384 + painterResource(id = resource),
  385 + contentDescription = "Permissions",
  386 + tint = Color.White,
  387 + )
  388 + }
  389 + }
  390 + }
  391 +
360 // Snack bar for errors 392 // Snack bar for errors
361 val scaffoldState = rememberScaffoldState() 393 val scaffoldState = rememberScaffoldState()
362 val scope = rememberCoroutineScope() 394 val scope = rememberCoroutineScope()