diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/DemoAudioCallContent.kt b/demo-app/src/main/kotlin/io/getstream/video/android/DemoAudioCallContent.kt index ddbe3fc95e2..e1c567d5b46 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/DemoAudioCallContent.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/DemoAudioCallContent.kt @@ -20,7 +20,6 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment @@ -28,8 +27,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize import io.getstream.video.android.compose.ui.components.call.activecall.AudioOnlyCallContent import io.getstream.video.android.compose.ui.components.call.controls.actions.LeaveCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleMicrophoneAction @@ -81,13 +79,8 @@ fun AudioOnlyCallControls( "Stream_MicrophoneToggle_Enabled_$isMicrophoneEnabled", ), isMicrophoneEnabled = isMicrophoneEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle( - 1.5f, - ), ) ToggleSpeakerphoneAction( @@ -95,29 +88,14 @@ fun AudioOnlyCallControls( "Stream_SpeakerToggle_Enabled_$isSpeakerEnabled", ), isSpeakerphoneEnabled = isSpeakerEnabled, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle( - 1.5f, - ), + size = StreamButtonSize.Large, onCallAction = onCallAction, ) LeaveCallAction( modifier = Modifier.testTag("Stream_HangUpButton"), onCallAction = onCallAction, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle().fillCircle( - 1.5f, - ), + size = StreamButtonSize.Large, ) } } - -internal fun StreamFixedSizeButtonStyle.fillCircle(fraction: Float): StreamFixedSizeButtonStyle { - return this.copyFixed( - width * fraction, - height * fraction, - shape = CircleShape, - ) -} diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/DemoOutgoingCallContent.kt b/demo-app/src/main/kotlin/io/getstream/video/android/DemoOutgoingCallContent.kt index 3dd37e014f0..97219f4d36b 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/DemoOutgoingCallContent.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/DemoOutgoingCallContent.kt @@ -29,7 +29,7 @@ import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize import io.getstream.video.android.compose.ui.components.call.controls.actions.CancelCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleCameraAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleMicrophoneAction @@ -97,13 +97,8 @@ private fun OutgoingCallControls( modifier = Modifier .testTag("Stream_MicrophoneToggle_Enabled_$isMicrophoneEnabled"), isMicrophoneEnabled = isMicrophoneEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle( - 1.5f, - ), ) ToggleSpeakerphoneAction( @@ -111,12 +106,7 @@ private fun OutgoingCallControls( "Stream_SpeakerToggle_Enabled_$isSpeakerEnabled", ), isSpeakerphoneEnabled = isSpeakerEnabled, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle( - 1.5f, - ), + size = StreamButtonSize.Large, onCallAction = onCallAction, ) @@ -124,13 +114,8 @@ private fun OutgoingCallControls( ToggleCameraAction( modifier = Modifier .testTag("Stream_CameraToggle_Enabled_$isCameraEnabled"), - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle( - 1.5f, - ), isCameraEnabled = isCameraEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, ) } @@ -138,9 +123,7 @@ private fun OutgoingCallControls( CancelCallAction( modifier = Modifier.testTag("Stream_DeclineCallButton"), onCallAction = onCallAction, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle().fillCircle( - 1.5f, - ), + size = StreamButtonSize.Large, ) } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/ui/ExceptionTraceScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/ui/ExceptionTraceScreen.kt index 6be01270b89..c953ca1d521 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/tooling/ui/ExceptionTraceScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/tooling/ui/ExceptionTraceScreen.kt @@ -48,7 +48,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.tooling.extensions.toast @Composable @@ -62,8 +63,8 @@ internal fun ExceptionTraceScreen(packageName: String, message: String) { .padding(16.dp), ) { val context: Context = LocalContext.current - StreamButton( - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + StreamTextButton( + style = StreamButtonStyleDefaults.primarySolid, text = stringResource(id = R.string.stream_video_tooling_restart_app), onClick = { val mainActivity = Class.forName(packageName) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/Dialog.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/Dialog.kt index 9fcd012668f..223d4fd9aa7 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/Dialog.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/Dialog.kt @@ -36,7 +36,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.compose.ui.window.Dialog import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton @Composable fun SingleButtonDialog( @@ -71,8 +72,8 @@ fun SingleButtonDialog( textAlign = TextAlign.Center, ) Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + StreamTextButton( + style = StreamButtonStyleDefaults.primarySolid, text = buttonText, onClick = onButtonClick, ) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt index 3a8d671555f..65f374257e8 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/CallScreen.kt @@ -61,7 +61,6 @@ import androidx.compose.runtime.mutableStateListOf import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment @@ -69,13 +68,12 @@ import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset @@ -91,8 +89,11 @@ import io.getstream.video.android.R import io.getstream.video.android.compose.pip.rememberIsInPipMode import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.base.StreamBadgeBox -import io.getstream.video.android.compose.ui.components.base.StreamDialogPositiveNegative -import io.getstream.video.android.compose.ui.components.base.StreamIconToggleButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamDialog +import io.getstream.video.android.compose.ui.components.base.StreamIconButton +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.CallAppBar import io.getstream.video.android.compose.ui.components.call.activecall.CallContent import io.getstream.video.android.compose.ui.components.call.controls.actions.ChatDialogAction @@ -337,13 +338,11 @@ fun CallScreen( modifier = Modifier.padding(horizontal = 8.dp), call = call, leadingContent = { - val iconOnOff = ImageVector.vectorResource( - R.drawable.ic_layout_grid, - ) + val iconOnOff = painterResource(R.drawable.ic_layout_grid) Row { ToggleAction( modifier = Modifier.testTag("Stream_CallViewButton"), - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), + offStyle = StreamButtonStyleDefaults.primarySolid, isActionActive = !isShowingLayoutChooseMenu, iconOnOff = Pair(iconOnOff, iconOnOff), ) { @@ -458,7 +457,9 @@ fun CallScreen( StreamBadgeBox( text = participantsSize.size.toString(), ) { - GenericAction(icon = Icons.Default.People) { + GenericAction( + icon = rememberVectorPainter(Icons.Default.People), + ) { showParticipants = !showParticipants } } @@ -534,25 +535,19 @@ fun CallScreen( }, ) if (orientation == Configuration.ORIENTATION_LANDSCAPE) { - StreamIconToggleButton( + StreamIconButton( + onClick = { showingLandscapeControls = !showingLandscapeControls }, + icon = rememberVectorPainter(Icons.Default.MoreVert), + contentDescription = null, modifier = Modifier .align(Alignment.TopEnd) .padding(16.dp), - toggleState = rememberUpdatedState( - newValue = ToggleableState( - showingLandscapeControls, - ), - ), - onIcon = Icons.Default.MoreVert, - onStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), - offStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle(), - ) { - showingLandscapeControls = when (it) { - ToggleableState.On -> false - ToggleableState.Off -> true - ToggleableState.Indeterminate -> false - } - } + style = if (showingLandscapeControls) { + StreamButtonStyleDefaults.primarySolid + } else { + StreamButtonStyleDefaults.secondaryGhost + }, + ) } } }, @@ -764,46 +759,61 @@ fun CallScreen( } // TODO: AAP, move recording and actions in separate composables. if (isRecording && !showRecordingWarning) { - StreamDialogPositiveNegative( + StreamDialog( + onDismissRequest = {}, title = "This call is being recorded", - contentText = "By staying in the call you’re consenting to being recorded.", - positiveButton = Triple( - "Continue", - VideoTheme.styles.buttonStyles.secondaryButtonStyle(), - ) { - showRecordingWarning = true - acceptedCallRecording = true - }, - negativeButton = Triple( - "Leave", - VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), - ) { - showRecordingWarning = false - acceptedCallRecording = false - call.leave() - }, - ) + message = "By staying in the call you’re consenting to being recorded.", + dismissOnBackPress = false, + dismissOnClickOutside = false, + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + showRecordingWarning = true + acceptedCallRecording = true + }, + text = "Continue", + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + showRecordingWarning = false + acceptedCallRecording = false + call.leave() + }, + text = "Leave", + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } } if (showEndRecordingDialog) { - StreamDialogPositiveNegative( + StreamDialog( + onDismissRequest = { showEndRecordingDialog = false }, title = "End recording", - contentText = "Are you sure you want to end the recording?", - positiveButton = Triple( - "End", - VideoTheme.styles.buttonStyles.alertButtonStyle(), - ) { - scope.launch { - call.stopRecording() - } - showEndRecordingDialog = false - }, - negativeButton = Triple( - "Cancel", - VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), - ) { - showEndRecordingDialog = false - }, - ) + message = "Are you sure you want to end the recording?", + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + scope.launch { + call.stopRecording() + } + showEndRecordingDialog = false + }, + text = "End", + style = StreamButtonStyleDefaults.destructiveSolid, + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { showEndRecordingDialog = false }, + text = "Cancel", + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } } } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/DemoComponentFactory.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/DemoComponentFactory.kt index 9e17e0f1247..8a9f7534d54 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/DemoComponentFactory.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/DemoComponentFactory.kt @@ -18,8 +18,6 @@ package io.getstream.video.android.ui.call import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.padding -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.GroupRemove import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -66,7 +64,7 @@ object DemoComponentFactory : VideoComponentFactory { .testTag("Stream_ParticipantActionsIcon"), actions = params.actions + listOf( ParticipantAction( - icon = Icons.Filled.GroupRemove, + icon = io.getstream.video.android.compose.R.drawable.stream_design_ic_user_remove_fill, label = "Kick", condition = { call, participantState -> call.hasCapability(OwnCapability.KickUser) && !participantState.isLocal diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/FeedbackDialog.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/FeedbackDialog.kt index ed64135f2ce..bfa1d32e62a 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/FeedbackDialog.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/FeedbackDialog.kt @@ -16,42 +16,23 @@ package io.getstream.video.android.ui.call -import androidx.compose.foundation.Image -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.size -import androidx.compose.material.Icon -import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ErrorOutline import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue -import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.compose.ui.components.base.StreamDialog -import io.getstream.video.android.compose.ui.components.base.StreamDialogPositiveNegative +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.base.StreamTextField -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamDialogStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamTextFieldStyles -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize import io.getstream.video.android.core.Call import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewCall @@ -67,134 +48,65 @@ fun FeedbackDialog(call: Call, onDismiss: () -> Unit) { val sender = remember { FeedbackSender() } if (feedbackFinished) { - StreamDialog(style = VideoTheme.styles.dialogStyles.defaultDialogStyle()) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Image( - painter = painterResource(id = R.drawable.feedback_artwork), - contentDescription = "artwork", - ) - if (feedbackError) { - Spacer(modifier = Modifier.size(8.dp)) - Icon( - imageVector = Icons.Default.ErrorOutline, - contentDescription = "alert", - tint = VideoTheme.colors.accentError, - ) - Spacer(modifier = Modifier.size(8.dp)) - } - Text( - text = "Your message was successfully sent", - style = TextStyle( - fontSize = 24.sp, - lineHeight = 28.sp, - fontWeight = FontWeight(500), - color = VideoTheme.colors.textPrimary, - textAlign = TextAlign.Center, - ), - ) - Spacer(modifier = Modifier.size(8.dp)) - Text( - text = - if (feedbackError) { - "Something happened and we could not process your request.\n Please try agian later." - } else { - "Thank you for letting us know how we can continue to improve our\n" + - "product and deliver the best calling experience possible. Hope you had\n" + - "a good call." - }, - style = TextStyle( - fontSize = 16.sp, - lineHeight = 18.5.sp, - fontWeight = FontWeight(400), - color = VideoTheme.colors.textSecondary, - textAlign = TextAlign.Center, - ), - ) - - Spacer(modifier = Modifier.size(24.dp)) - Box(modifier = Modifier.fillMaxWidth()) { - StreamButton( - modifier = Modifier.align(Alignment.BottomEnd), - text = "Close", - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), - ) { - onDismiss() - } - } - } + StreamDialog( + onDismissRequest = onDismiss, + title = if (feedbackError) "Something went wrong" else "Your message was successfully sent", + message = if (feedbackError) { + "Something happened and we could not process your request. Please try again later." + } else { + "Thank you for letting us know how we can continue to improve our product and " + + "deliver the best calling experience possible. Hope you had a good call." + }, + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onDismiss, + text = "Close", + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) } } else { - StreamDialogPositiveNegative( - onDismiss = onDismiss, - content = { - Image( - painter = painterResource(id = R.drawable.feedback_artwork), - contentDescription = "artwork", - ) - Text( - text = "How is your call Going?", - style = TextStyle( - fontSize = 24.sp, - lineHeight = 28.sp, - fontWeight = FontWeight(500), - color = VideoTheme.colors.textPrimary, - textAlign = TextAlign.Center, - ), - ) - Spacer(modifier = Modifier.size(8.dp)) - Text( - text = "All feedback is celebrated!", - style = TextStyle( - fontSize = 16.sp, - lineHeight = 18.5.sp, - fontWeight = FontWeight(400), - color = VideoTheme.colors.textSecondary, - textAlign = TextAlign.Center, - ), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamTextField( - value = email, - placeholder = "Email address (required)", - onValueChange = { - email = it - }, - error = isError, - style = StreamTextFieldStyles.defaultTextField(StyleSize.S), - ) - - Spacer(modifier = Modifier.size(16.dp)) - StreamTextField( - value = message, - placeholder = "Message", - onValueChange = { - message = it - }, - minLines = 7, - style = StreamTextFieldStyles.defaultTextField(StyleSize.S), - ) - }, - style = StreamDialogStyles.defaultDialogStyle(), - positiveButton = Triple( - "Submit", - ButtonStyles.secondaryButtonStyle(StyleSize.S), - ) { - if (email.text.isEmpty() || !sender.isValidEmail(email.text)) { - isError = true - } else { - sender.sendFeedback(email.text, message.text, call.cid) { - feedbackError = it - feedbackFinished = true + StreamDialog( + onDismissRequest = onDismiss, + title = "How is your call going?", + message = "All feedback is celebrated!", + ) { + StreamTextField( + value = email, + onValueChange = { email = it }, + placeholder = "Email address (required)", + errorText = if (isError) "Enter a valid email address." else null, + ) + StreamTextField( + value = message, + onValueChange = { message = it }, + placeholder = "Message", + minLines = 4, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + if (email.text.isEmpty() || !sender.isValidEmail(email.text)) { + isError = true + } else { + sender.sendFeedback(email.text, message.text, call.cid) { + feedbackError = it + feedbackFinished = true + } } - } - }, - negativeButton = Triple( - "Not now", - ButtonStyles.tertiaryButtonStyle(StyleSize.S), - ) { - onDismiss() - }, - ) + }, + text = "Submit", + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onDismiss, + text = "Not now", + style = StreamButtonStyleDefaults.secondaryGhost, + size = StreamButtonSize.Large, + ) + } } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LandscapeControls.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LandscapeControls.kt index d06ba7bc375..e1f05ecf015 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LandscapeControls.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LandscapeControls.kt @@ -38,6 +38,7 @@ import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset @@ -45,7 +46,8 @@ import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.controls.actions.ChatDialogAction import io.getstream.video.android.compose.ui.components.call.controls.actions.FlipCameraAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleCameraAction @@ -154,17 +156,17 @@ fun LandscapeControlsContent( ) } Spacer(modifier = Modifier.height(16.dp)) - StreamButton( + StreamTextButton( modifier = Modifier.fillMaxWidth(), - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(), - icon = Icons.Default.Settings, + style = StreamButtonStyleDefaults.secondarySolid, + leadingIcon = rememberVectorPainter(Icons.Default.Settings), text = "Settings", onClick = onSettings, ) - StreamButton( + StreamTextButton( modifier = Modifier.fillMaxWidth(), - style = VideoTheme.styles.buttonStyles.alertButtonStyle(), - icon = Icons.Default.CallEnd, + style = StreamButtonStyleDefaults.destructiveSolid, + leadingIcon = rememberVectorPainter(Icons.Default.CallEnd), text = "Leave call", onClick = onClick, ) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LayoutChooser.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LayoutChooser.kt index 215e62b6042..63a340105d0 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LayoutChooser.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/LayoutChooser.kt @@ -18,24 +18,24 @@ package io.getstream.video.android.ui.call import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AutoAwesome import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalContext -import androidx.compose.ui.res.vectorResource -import androidx.compose.ui.state.ToggleableState +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamToggleButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.renderer.LayoutType import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.tooling.extensions.toPx @@ -79,24 +79,19 @@ internal fun LayoutChooser( ) { layouts.forEach { layout -> - val state = ToggleableState(layout.which == current) + val selected = layout.which == current val icon = when (layout.which) { - LayoutType.DYNAMIC -> Icons.Default.AutoAwesome - LayoutType.SPOTLIGHT -> ImageVector.vectorResource( - R.drawable.ic_layout_spotlight, - ) - LayoutType.GRID -> ImageVector.vectorResource(R.drawable.ic_layout_grid) - } - StreamToggleButton( - onText = layout.text, - offText = layout.text, - toggleState = rememberUpdatedState(newValue = state), - onIcon = icon, - onStyle = VideoTheme.styles.buttonStyles.toggleButtonStyleOn(), - offStyle = VideoTheme.styles.buttonStyles.toggleButtonStyleOff(), - ) { - onLayoutChoice(layout.which) + LayoutType.DYNAMIC -> rememberVectorPainter(Icons.Default.AutoAwesome) + LayoutType.SPOTLIGHT -> painterResource(R.drawable.ic_layout_spotlight) + LayoutType.GRID -> painterResource(R.drawable.ic_layout_grid) } + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { onLayoutChoice(layout.which) }, + text = layout.text, + leadingIcon = icon, + style = if (selected) StreamButtonStyleDefaults.primarySolid else StreamButtonStyleDefaults.secondaryGhost, + ) } } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ReactionsMenu.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ReactionsMenu.kt index dc4df46ea6b..514fe56ece1 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ReactionsMenu.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ReactionsMenu.kt @@ -33,8 +33,9 @@ import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.core.Call import io.getstream.video.android.core.mapper.ReactionMapper import io.getstream.video.android.mock.StreamPreviewDataUtils @@ -131,9 +132,10 @@ private fun ReactionItem( .requiredWidth(44.dp) .requiredHeight(44.dp) } - StreamButton( + StreamTextButton( modifier = modifier, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(StyleSize.S), + style = StreamButtonStyleDefaults.secondarySolid, + size = StreamButtonSize.Small, text = text, onClick = { onEmojiSelected(reaction.emojiCode) }, ) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ShareCall.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ShareCall.kt index 4e82f26d2d2..188d04bd57f 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ShareCall.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/call/ShareCall.kt @@ -31,7 +31,6 @@ import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ButtonDefaults import androidx.compose.material.Text import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.CopyAll @@ -41,16 +40,17 @@ import androidx.compose.runtime.State import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.core.Call import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewCall @@ -119,30 +119,23 @@ public fun ShareSettingsBox( style = VideoTheme.typography.headingLarge.copy(fontSize = 20.sp), ) Spacer(modifier = Modifier.size(16.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .height(36.dp), text = "Add others", - icon = Icons.Default.PersonAddAlt1, - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + leadingIcon = rememberVectorPainter(Icons.Default.PersonAddAlt1), + style = StreamButtonStyleDefaults.primarySolid, onClick = { onShare(call.id) }, ) Spacer(modifier = Modifier.size(16.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .height(36.dp), text = "Call ID: ${call.id}", - textOverflow = TextOverflow.Ellipsis, - icon = Icons.Default.CopyAll, - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle().copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.backgroundCoreSurfaceDefault, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundCoreSurfaceDefault, - ), - ), + leadingIcon = rememberVectorPainter(Icons.Default.CopyAll), + style = StreamButtonStyleDefaults.secondarySolid, onClick = { val clipData = ClipData.newPlainText("Call ID", call.id) clipboardManager?.setPrimaryClip(clipData) @@ -191,30 +184,23 @@ public fun ShareSettingsBoxLandscape( style = VideoTheme.typography.headingLarge.copy(fontSize = 20.sp), ) Spacer(modifier = Modifier.size(16.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .height(36.dp), text = "Add others", - icon = Icons.Default.PersonAddAlt1, - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + leadingIcon = rememberVectorPainter(Icons.Default.PersonAddAlt1), + style = StreamButtonStyleDefaults.primarySolid, onClick = { onShare(call.id) }, ) Spacer(modifier = Modifier.size(16.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .height(36.dp), text = "Call ID: ${call.id}", - textOverflow = TextOverflow.Ellipsis, - icon = Icons.Default.CopyAll, - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle().copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.backgroundCoreSurfaceDefault, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundCoreSurfaceDefault, - ), - ), + leadingIcon = rememberVectorPainter(Icons.Default.CopyAll), + style = StreamButtonStyleDefaults.secondarySolid, onClick = { val clipData = ClipData.newPlainText("Call ID", call.id) clipboardManager?.setPrimaryClip(clipData) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt index cadcdbc3bc4..e885d300343 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/CallJoinScreen.kt @@ -57,12 +57,12 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.layout.boundsInParent import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.platform.LocalConfiguration @@ -73,7 +73,6 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId -import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -95,9 +94,11 @@ import io.getstream.video.android.R import io.getstream.video.android.app import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.avatar.UserAvatar -import io.getstream.video.android.compose.ui.components.base.StreamButton -import io.getstream.video.android.compose.ui.components.base.StreamDialogPositiveNegative -import io.getstream.video.android.compose.ui.components.base.StreamIconToggleButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamDialog +import io.getstream.video.android.compose.ui.components.base.StreamIconButton +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.base.StreamTextField import io.getstream.video.android.defaultCallId import io.getstream.video.android.mock.StreamPreviewDataUtils @@ -285,7 +286,10 @@ private fun CallJoinHeader( var popupPosition by remember { mutableStateOf(IntOffset(0, 0)) } var buttonSize by remember { mutableStateOf(IntSize(0, 0)) } - StreamIconToggleButton( + StreamIconButton( + onClick = { showMenu = !showMenu }, + icon = rememberVectorPainter(Icons.Default.Settings), + contentDescription = null, modifier = Modifier .onGloballyPositioned { coordinates -> val buttonBounds = coordinates.boundsInParent() @@ -296,17 +300,8 @@ private fun CallJoinHeader( buttonSize = coordinates.size } .testTag("Stream_SettingsIcon"), - toggleState = rememberUpdatedState(newValue = ToggleableState(showMenu)), - onIcon = Icons.Default.Settings, - onStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), - offStyle = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(), - ) { - showMenu = when (it) { - ToggleableState.On -> false - ToggleableState.Off -> true - ToggleableState.Indeterminate -> false - } - } + style = if (showMenu) StreamButtonStyleDefaults.primarySolid else StreamButtonStyleDefaults.secondarySolid, + ) if (showMenu) { Popup( @@ -325,13 +320,13 @@ private fun CallJoinHeader( .padding(16.dp), ) { if (showDirectCall) { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_DirectCallButton"), text = stringResource(id = R.string.direct_call), - icon = Icons.Default.Call, - style = VideoTheme.styles.buttonStyles.primaryButtonStyle(), + leadingIcon = rememberVectorPainter(Icons.Default.Call), + style = StreamButtonStyleDefaults.secondarySolid, onClick = { showMenu = false onDirectCallClick.invoke() @@ -340,12 +335,12 @@ private fun CallJoinHeader( } Spacer(modifier = Modifier.width(5.dp)) if (!isProduction) { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_CallSettingsButton"), - icon = Icons.Default.Settings, - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), + leadingIcon = rememberVectorPainter(Icons.Default.Settings), + style = StreamButtonStyleDefaults.secondaryGhost, text = stringResource(id = R.string.call_settings), onClick = { showMenu = false @@ -353,12 +348,14 @@ private fun CallJoinHeader( }, ) Spacer(modifier = Modifier.width(5.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_ExportLogsButton"), - icon = Icons.AutoMirrored.Default.DriveFileMove, - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), + leadingIcon = rememberVectorPainter( + Icons.AutoMirrored.Default.DriveFileMove, + ), + style = StreamButtonStyleDefaults.secondaryGhost, text = stringResource(id = R.string.logs), onClick = { showMenu = false @@ -366,12 +363,14 @@ private fun CallJoinHeader( }, ) Spacer(modifier = Modifier.width(5.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_SignOutButton"), - icon = Icons.AutoMirrored.Filled.Logout, - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), + leadingIcon = rememberVectorPainter( + Icons.AutoMirrored.Filled.Logout, + ), + style = StreamButtonStyleDefaults.secondaryGhost, text = stringResource(id = R.string.sign_out), onClick = { showMenu = false @@ -463,22 +462,22 @@ private fun CallActualContentPortrait( onJoinCall(it) } Spacer(modifier = Modifier.height(8.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_StartNewCallButton"), text = stringResource(id = R.string.start_a_new_call), - icon = Icons.Default.VideoCall, + leadingIcon = rememberVectorPainter(Icons.Default.VideoCall), onClick = { onNewCall() }, ) Spacer(modifier = Modifier.height(8.dp)) - StreamButton( - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), + StreamTextButton( + style = StreamButtonStyleDefaults.secondaryGhost, modifier = Modifier .fillMaxWidth() .testTag("Stream_ScanQrCodeButton"), text = stringResource(id = R.string.scan_qr_code), - icon = Icons.Default.QrCodeScanner, + leadingIcon = rememberVectorPainter(Icons.Default.QrCodeScanner), onClick = { gotoQR() }, ) } @@ -518,22 +517,22 @@ private fun CallActualContentLandscape( onJoinCall(it) } Spacer(modifier = Modifier.height(8.dp)) - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_StartNewCallButton"), text = stringResource(id = R.string.start_a_new_call), - icon = Icons.Default.VideoCall, + leadingIcon = rememberVectorPainter(Icons.Default.VideoCall), onClick = { onNewCall() }, ) Spacer(modifier = Modifier.height(8.dp)) - StreamButton( - style = VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), + StreamTextButton( + style = StreamButtonStyleDefaults.secondaryGhost, modifier = Modifier .fillMaxWidth() .testTag("Stream_ScanQrCodeButton"), text = stringResource(id = R.string.scan_qr_code), - icon = Icons.Default.QrCodeScanner, + leadingIcon = rememberVectorPainter(Icons.Default.QrCodeScanner), onClick = { gotoQR() }, ) } @@ -621,7 +620,6 @@ private fun JoinCallForm( keyboardOptions = KeyboardOptions.Default.copy( keyboardType = KeyboardType.Email, ), - style = VideoTheme.styles.textFieldStyles.defaultTextField(), value = callId, placeholder = stringResource(id = R.string.join_call_call_id_hint), keyboardActions = KeyboardActions( @@ -631,9 +629,9 @@ private fun JoinCallForm( ), ) - StreamButton( - icon = Icons.AutoMirrored.Filled.Login, - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + StreamTextButton( + leadingIcon = rememberVectorPainter(Icons.AutoMirrored.Filled.Login), + style = StreamButtonStyleDefaults.primarySolid, modifier = Modifier .padding(start = 16.dp) .fillMaxHeight() @@ -651,23 +649,25 @@ private fun SignOutDialog( onConfirmation: () -> Unit, onDismissRequest: () -> Unit, ) { - StreamDialogPositiveNegative( - style = VideoTheme.styles.dialogStyles.defaultDialogStyle(), - positiveButton = Triple( - stringResource(id = R.string.sign_out), - VideoTheme.styles.buttonStyles.secondaryButtonStyle(), - ) { - onConfirmation() - }, - negativeButton = Triple( - stringResource(R.string.cancel), - VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), - ) { - onDismissRequest() - }, + StreamDialog( + onDismissRequest = onDismissRequest, title = stringResource(id = R.string.sign_out), - contentText = stringResource(R.string.are_you_sure_sign_out), - ) + message = stringResource(R.string.are_you_sure_sign_out), + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onConfirmation, + text = stringResource(id = R.string.sign_out), + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onDismissRequest, + text = stringResource(R.string.cancel), + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } } class BelowElementPositionProvider( diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/barcode/BardcodeScanner.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/barcode/BardcodeScanner.kt index fdf6e5c8588..782f3932c7b 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/barcode/BardcodeScanner.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/join/barcode/BardcodeScanner.kt @@ -70,7 +70,7 @@ import io.getstream.video.android.DeeplinkingActivity import io.getstream.video.android.R import io.getstream.video.android.analytics.FirebaseEvents import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import java.util.concurrent.Executor import java.util.concurrent.Executors @@ -143,7 +143,7 @@ internal fun BarcodeScanner(navigateBack: () -> Unit = {}) { id = io.getstream.video.android.ui.common.R.string.stream_video_permissions_title, ), ) - StreamButton( + StreamTextButton( modifier = Modifier.align(Alignment.CenterHorizontally), text = "Request permission", onClick = { cameraPermissionState.launchPermissionRequest() }, diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/lobby/CallLobbyScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/lobby/CallLobbyScreen.kt index add183f9238..ad876c530dc 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/lobby/CallLobbyScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/lobby/CallLobbyScreen.kt @@ -69,7 +69,8 @@ import io.getstream.video.android.CallActivity import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.avatar.UserAvatar -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.controls.ControlActions import io.getstream.video.android.compose.ui.components.call.lobby.CallLobby import io.getstream.video.android.compose.ui.components.call.lobby.buildDefaultLobbyControlActions @@ -494,8 +495,8 @@ private fun LobbyDescriptionContent(participantCounts: ParticipantCount?, onClic ) } Spacer(modifier = Modifier.size(16.dp)) - StreamButton( - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + StreamTextButton( + style = StreamButtonStyleDefaults.primarySolid, modifier = Modifier .fillMaxWidth() .testTag("Stream_JoinCallButton"), diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt index 538fba8a3b8..97228f4ca07 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/login/LoginScreen.kt @@ -33,6 +33,7 @@ import androidx.compose.foundation.layout.fillMaxHeight import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width @@ -58,22 +59,19 @@ import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.LocalConfiguration import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.res.vectorResource import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId -import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.text.AnnotatedString import androidx.compose.ui.text.SpanStyle import androidx.compose.ui.text.buildAnnotatedString @@ -93,12 +91,12 @@ import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.compose.ui.components.base.StreamButton -import io.getstream.video.android.compose.ui.components.base.StreamDialogPositiveNegative -import io.getstream.video.android.compose.ui.components.base.StreamIconToggleButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamDialog +import io.getstream.video.android.compose.ui.components.base.StreamIconButton +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.base.StreamTextField -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.IconStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamDialogStyles import io.getstream.video.android.model.User import io.getstream.video.android.models.builtInUsers import io.getstream.video.android.tooling.extensions.toPx @@ -386,47 +384,53 @@ private fun LoginButtons( when (availableLogins[index]) { "built-in" -> { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_BuiltInUserSignIn"), - icon = Icons.Outlined.Adb, + leadingIcon = rememberVectorPainter(Icons.Outlined.Adb), enabled = !isLoading, text = stringResource(id = R.string.builtin_user_sign_in), - style = ButtonStyles.secondaryButtonStyle(), + style = StreamButtonStyleDefaults.primarySolid, onClick = showBuiltInUserDialog, ) } "google" -> { StreamButton( - icon = ImageVector.vectorResource(R.drawable.google_button_logo), + onClick = { + login(false, LoginEvent.GoogleSignIn()) + }, modifier = Modifier .fillMaxWidth() .testTag("Stream_GoogleSignIn"), enabled = !isLoading, - text = stringResource(id = R.string.sign_in_google), - style = ButtonStyles.primaryButtonStyle() - .copy( - iconStyle = IconStyles.customColorIconStyle( - color = Color.Unspecified, - ), - ), - onClick = { - login(false, LoginEvent.GoogleSignIn()) - }, - ) + style = StreamButtonStyleDefaults.secondarySolid, + ) { + Row( + modifier = Modifier.padding(horizontal = 16.dp), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(8.dp), + ) { + Image( + painter = painterResource(R.drawable.google_button_logo), + contentDescription = null, + modifier = Modifier.size(20.dp), + ) + Text(text = stringResource(id = R.string.sign_in_google)) + } + } } "email" -> { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_EmailSignIn"), - icon = Icons.Default.Email, + leadingIcon = rememberVectorPainter(Icons.Default.Email), enabled = !isLoading, text = stringResource(id = R.string.sign_in_email), - style = ButtonStyles.primaryButtonStyle(), + style = StreamButtonStyleDefaults.secondarySolid, onClick = { showEmailLoginDialog.invoke() }, @@ -434,14 +438,14 @@ private fun LoginButtons( } "anonymous" -> { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_RandomUserSignIn"), - icon = Icons.Outlined.GroupAdd, + leadingIcon = rememberVectorPainter(Icons.Outlined.GroupAdd), enabled = !isLoading, text = stringResource(id = R.string.random_user_sign_in), - style = ButtonStyles.tertiaryButtonStyle(), + style = StreamButtonStyleDefaults.secondaryGhost, onClick = { login(true, null) }, @@ -449,14 +453,14 @@ private fun LoginButtons( } "guest_user" -> { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .testTag("Stream_GuestSignIn"), - icon = Icons.Outlined.Person, + leadingIcon = rememberVectorPainter(Icons.Outlined.Person), enabled = !isLoading, text = stringResource(id = R.string.guest_user_sign_in), - style = ButtonStyles.secondaryButtonStyle(), + style = StreamButtonStyleDefaults.primarySolid, onClick = { login(false, LoginEvent.SignInAsGuest) }, @@ -469,13 +473,13 @@ private fun LoginButtons( } if (BuildConfig.BUILD_TYPE == "benchmark") { - StreamButton( + StreamTextButton( modifier = Modifier .fillMaxWidth() .padding(horizontal = 55.dp) .testTag("authenticate"), text = "Login for Benchmark", - style = ButtonStyles.secondaryButtonStyle(), + style = StreamButtonStyleDefaults.primarySolid, onClick = { login(null, LoginEvent.SignInSuccess("benchmark.test@getstream.io")) }, @@ -537,28 +541,28 @@ private fun EmailLoginDialog( ) { var email by remember { mutableStateOf(TextFieldValue("")) } - StreamDialogPositiveNegative( - style = StreamDialogStyles.defaultDialogStyle(), - onDismiss = { onDismissRequest.invoke() }, - icon = Icons.Default.Email, + StreamDialog( + onDismissRequest = onDismissRequest, + icon = rememberVectorPainter(Icons.Default.Email), title = stringResource(R.string.enter_your_email_address), - content = { - StreamTextField( - modifier = Modifier - .fillMaxWidth() - .padding(16.dp), - value = email, - onValueChange = { email = it }, - keyboardOptions = KeyboardOptions.Default.copy( - keyboardType = KeyboardType.Email, - ), - ) - }, - positiveButton = Triple("Login", ButtonStyles.secondaryButtonStyle()) { - val userId = UserHelper.getUserIdFromEmail(email.text) - login(true, LoginEvent.SignInSuccess(userId)) - }, - ) + ) { + StreamTextField( + value = email, + onValueChange = { email = it }, + keyboardOptions = KeyboardOptions.Default.copy( + keyboardType = KeyboardType.Email, + ), + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + val userId = UserHelper.getUserIdFromEmail(email.text) + login(true, LoginEvent.SignInSuccess(userId)) + }, + text = "Login", + size = StreamButtonSize.Large, + ) + } } @Composable @@ -567,53 +571,57 @@ private fun BuiltInUsersLoginDialog( login: (Boolean?, LoginEvent?) -> Unit = { _, _ -> }, ) { val users = User.builtInUsers() - StreamDialogPositiveNegative( - style = StreamDialogStyles.defaultDialogStyle(), - onDismiss = onDismissRequest, - icon = Icons.Default.Email, + StreamDialog( + onDismissRequest = onDismissRequest, + icon = rememberVectorPainter(Icons.Default.Email), title = stringResource(R.string.select_user), - content = { - LazyColumn( - modifier = Modifier - .fillMaxWidth() - .padding(top = 16.dp), - ) { - items(users) { user -> - Row( + ) { + LazyColumn( + modifier = Modifier + .fillMaxWidth() + .heightIn(max = 320.dp), + ) { + items(users) { user -> + Row( + modifier = Modifier + .height(64.dp) + .fillMaxWidth() + .clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(bounded = true), + onClick = { + login(true, LoginEvent.SignIn(user)) + onDismissRequest() + }, + ), + ) { + Spacer(modifier = Modifier.width(16.dp)) + UserAvatar( modifier = Modifier - .height(64.dp) - .fillMaxWidth() - .clickable( - interactionSource = remember { MutableInteractionSource() }, - indication = ripple(bounded = true), - onClick = { - login(true, LoginEvent.SignIn(user)) - onDismissRequest() - }, - ), - ) { - Spacer(modifier = Modifier.width(16.dp)) - UserAvatar( - modifier = Modifier - .size(40.dp) - .align(Alignment.CenterVertically), - userImage = user.image, - userName = user.userNameOrId, - ) - Spacer(modifier = Modifier.width(16.dp)) - Text( - modifier = Modifier.align(Alignment.CenterVertically), - text = user.name.orEmpty(), - color = VideoTheme.colors.textPrimary, - style = VideoTheme.typography.bodyDefault, - ) - Spacer(modifier = Modifier.width(16.dp)) - } + .size(40.dp) + .align(Alignment.CenterVertically), + userImage = user.image, + userName = user.userNameOrId, + ) + Spacer(modifier = Modifier.width(16.dp)) + Text( + modifier = Modifier.align(Alignment.CenterVertically), + text = user.name.orEmpty(), + color = VideoTheme.colors.textPrimary, + style = VideoTheme.typography.bodyDefault, + ) + Spacer(modifier = Modifier.width(16.dp)) } } - }, - negativeButton = Triple("Cancel", ButtonStyles.secondaryButtonStyle(), onDismissRequest), - ) + } + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onDismissRequest, + text = "Cancel", + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } } @Composable @@ -632,14 +640,12 @@ fun SelectableDialog( color = Color.White, ) if (items.size > 1) { - StreamIconToggleButton( - toggleState = rememberUpdatedState(newValue = ToggleableState(showDialog)), + StreamIconButton( onClick = { showDialog = !showDialog }, - onIcon = Icons.Default.Settings, - offIcon = Icons.Default.Settings, - onStyle = ButtonStyles.secondaryIconButtonStyle(), - offStyle = ButtonStyles.primaryIconButtonStyle(), + icon = rememberVectorPainter(Icons.Default.Settings), + contentDescription = null, modifier = Modifier.padding(16.dp), + style = if (showDialog) StreamButtonStyleDefaults.primarySolid else StreamButtonStyleDefaults.secondarySolid, ) if (showDialog) { Popup( @@ -660,14 +666,14 @@ fun SelectableDialog( .width(180.dp), ) { items.forEach { item -> - StreamButton( + StreamTextButton( text = item.displayName, onClick = { onItemSelected(item) selectedText = item.displayName showDialog = !showDialog }, - style = ButtonStyles.tertiaryButtonStyle(), + style = StreamButtonStyleDefaults.secondaryGhost, modifier = Modifier .padding(horizontal = 8.dp) .fillMaxWidth(), diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/VideoFiltersMenu.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/VideoFiltersMenu.kt index 3d3d9e25000..2975a8de7d3 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/VideoFiltersMenu.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/VideoFiltersMenu.kt @@ -17,29 +17,35 @@ package io.getstream.video.android.ui.menu import androidx.annotation.DrawableRes +import androidx.compose.foundation.Image import androidx.compose.foundation.horizontalScroll import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.filled.AccountCircle import androidx.compose.material.icons.filled.BlurOn import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.vector.rememberVectorPainter +import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource import androidx.compose.ui.state.ToggleableState import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamDrawableToggleButton -import io.getstream.video.android.compose.ui.components.base.StreamIconToggleButton -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles +import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamIconButton import io.getstream.video.android.mock.StreamPreviewDataUtils @Composable @@ -97,13 +103,16 @@ private fun BlurredBackgroundToggleItem( toggleState: ToggleableState, onClick: () -> Unit = {}, ) { - StreamIconToggleButton( + StreamIconButton( + onClick = onClick, + icon = rememberVectorPainter(icon), + contentDescription = null, modifier = Modifier.testTag("Stream_Background_${icon.name}_${toggleState.name}"), - toggleState = rememberUpdatedState(newValue = toggleState), - onIcon = icon, - onStyle = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(), - offStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle(), - onClick = { onClick() }, + style = if (toggleState == ToggleableState.On) { + StreamButtonStyleDefaults.primarySolid + } else { + StreamButtonStyleDefaults.secondarySolid + }, ) } @@ -113,14 +122,24 @@ private fun VirtualBackgroundToggleItem( toggleState: ToggleableState, onClick: () -> Unit = {}, ) { - StreamDrawableToggleButton( + StreamButton( + onClick = onClick, modifier = Modifier.testTag("Stream_Background_Image_${toggleState.name}"), - toggleState = rememberUpdatedState(newValue = toggleState), - onDrawable = drawable, - onStyle = ButtonStyles.drawableToggleButtonStyleOn(), - offStyle = ButtonStyles.drawableToggleButtonStyleOff(), - onClick = { onClick() }, - ) + style = if (toggleState == ToggleableState.On) { + StreamButtonStyleDefaults.primaryOutline + } else { + StreamButtonStyleDefaults.secondaryGhost + }, + ) { + Image( + painter = painterResource(drawable), + contentDescription = null, + modifier = Modifier + .size(40.dp) + .clip(CircleShape), + contentScale = ContentScale.Crop, + ) + } } @Preview(showBackground = true) diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/base/DynamicMenu.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/base/DynamicMenu.kt index e21ade3265d..ec3625c636f 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/base/DynamicMenu.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/menu/base/DynamicMenu.kt @@ -40,14 +40,15 @@ import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.semantics.semantics import androidx.compose.ui.semantics.testTagsAsResourceId import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamToggleButton -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.ui.closedcaptions.ClosedCaptionUiState import io.getstream.video.android.ui.menu.AudioUsageVoiceCommunicationUiState import io.getstream.video.android.ui.menu.TranscriptionAvailableUiState @@ -243,15 +244,8 @@ private fun LazyListScope.menuItems( items(items.size) { index -> val item = items[index] val highlight = item.highlight - StreamToggleButton( - onText = item.title, - offText = item.title, - onIcon = item.icon, - onStyle = VideoTheme.styles.buttonStyles.toggleButtonStyleOn(StyleSize.XS).copy( - iconStyle = VideoTheme.styles.iconStyles.customColorIconStyle( - color = if (highlight) VideoTheme.colors.accentPrimary else VideoTheme.colors.textPrimary, - ), - ), + StreamTextButton( + modifier = Modifier.fillMaxWidth(), onClick = { val actionItem = item as? ActionMenuItem actionItem?.action?.invoke() @@ -260,6 +254,9 @@ private fun LazyListScope.menuItems( onNewSubmenu(it) } }, + text = item.title, + leadingIcon = rememberVectorPainter(item.icon), + style = if (highlight) StreamButtonStyleDefaults.primaryGhost else StreamButtonStyleDefaults.secondaryGhost, ) } } diff --git a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinScreen.kt b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinScreen.kt index ce48f849174..2707c804cbc 100644 --- a/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinScreen.kt +++ b/demo-app/src/main/kotlin/io/getstream/video/android/ui/outgoing/DirectCallJoinScreen.kt @@ -57,6 +57,7 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.style.TextAlign @@ -68,7 +69,8 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.getstream.video.android.R import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.avatar.UserAvatar -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.mock.previewUsers import io.getstream.video.android.model.StreamCallId import io.getstream.video.android.model.User @@ -349,16 +351,16 @@ private fun Body( .padding(bottom = 10.dp), horizontalArrangement = Arrangement.SpaceEvenly, ) { - StreamButton( + StreamTextButton( // Floating button modifier = Modifier .align(Alignment.CenterVertically) .padding(bottom = 10.dp) .testTag("Stream_AudioCallButton"), enabled = users.any { it.isSelected }, - icon = Icons.Default.Call, + leadingIcon = rememberVectorPainter(Icons.Default.Call), text = "Audio call", - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + style = StreamButtonStyleDefaults.primarySolid, onClick = { onStartCallClick( StreamCallId("audio_call", UUID.randomUUID().toString()), @@ -371,16 +373,16 @@ private fun Body( }, ) - StreamButton( + StreamTextButton( // Floating button modifier = Modifier .align(Alignment.CenterVertically) .padding(bottom = 10.dp) .testTag("Stream_VideoCallButton"), enabled = users.any { it.isSelected }, - icon = Icons.Default.VideoCall, + leadingIcon = rememberVectorPainter(Icons.Default.VideoCall), text = "Video call", - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + style = StreamButtonStyleDefaults.primarySolid, onClick = { onStartCallClick( StreamCallId("default", UUID.randomUUID().toString()), diff --git a/stream-video-android-ui-compose/ICONS.md b/stream-video-android-ui-compose/ICONS.md new file mode 100644 index 00000000000..9154fd80152 --- /dev/null +++ b/stream-video-android-ui-compose/ICONS.md @@ -0,0 +1,70 @@ +# Icon System + +This document describes the icon naming conventions, placement rules, and update workflow for the design system icons used by the Compose Video SDK. + +## Source + +The icons come from the shared Stream design system. The SVG source lives in the +[design-system-tokens](https://github.com/GetStream/design-system-tokens) repository under +`assets/icons//line/`. The namespaces tell shared icons from product icons: + +| Namespace | Used by the Video SDK | +|---|---| +| `core` | Yes, the full set | +| `video` | Yes, the full set | +| `chat` | Only `message-bubbles-fill` (the in-call chat action) | + +## Naming Convention + +Icons use the `stream_design_ic_` prefix with the **Figma component name** converted from kebab-case to snake_case: + +``` +Figma: arrow-down-circle -> stream_design_ic_arrow_down_circle.xml +Figma: phone-down-fill -> stream_design_ic_phone_down_fill.xml +``` + +The prefix is the same one the Chat SDK uses. Both SDKs ship the same design system art under the same +names, so an app that includes both gets one copy after resource merging. The plan is to move the shared +set into a common UI module later. + +### Prefixes by module + +| Module | Prefix | Purpose | +|---|---|---| +| `stream-video-android-ui-compose` | `stream_design_ic_*` | Design system icons (Compose SDK) | +| `stream-video-android-ui-core` | `stream_video_ic_*` | Legacy icons still read by the XML SDK and by the core notifications | + +## Icon Variants + +The design system provides two categories: + +- **Line**: stroke-based SVGs. Stroke width can be adjusted programmatically. +- **Flat**: flattened vector shapes with baked-in strokes, exported at 12, 16, 20 and 32. Used mainly by Flutter. + +**Android uses the Line variant** for all icons. + +## Size Convention + +All `stream_design_ic_*` icons use **20dp** as the intrinsic size with a 20x20 viewport. When a different +size is needed at the call site, set it explicitly with `Modifier.size()`. + +## Colors + +Icons are monochrome and use the literal color `#FF000000`. The color is applied at the call site with +`Icon(tint = VideoTheme.colors...)`. Do not use `?attr` or `@color` references inside the drawables. + +Directional icons (arrows, chevrons, leave, speaker, camera) carry `android:autoMirrored="true"` so they +flip in right-to-left layouts. + +## How to Update Icons + +1. Fetch the `assets/icons/core/line` and `assets/icons/video/line` folders from the design-system-tokens repository (plus `chat/line/message-bubbles-fill.svg`). +2. Replace the named colors in the SVGs: `"black"` with `"#000000"` and `"white"` with `"#FFFFFF"`. The converter mishandles named colors. +3. Convert the SVGs to Android vector drawables: + ```bash + npx svg2vectordrawable@2.9.1 -f -o + ``` +4. Add the license header used by the other XML resources in this module. +5. Add `android:autoMirrored="true"` to the directional icons: `arrow_left`, `arrow_right`, `arrow_up_right`, `audio`, `chevron_left`, `chevron_right`, `leave`, `message_bubbles_fill`, `mute`, `sidebar`, `video_fill`, `video_off_fill`. +6. Name each file `stream_design_ic_{figma_name_snake_case}.xml` and place it in `stream-video-android-ui-compose/src/main/res/drawable/`. +7. Record the source commit of the design-system-tokens repository in the pull request description. diff --git a/stream-video-android-ui-compose/api/stream-video-android-ui-compose.api b/stream-video-android-ui-compose/api/stream-video-android-ui-compose.api index d8a9bf7848b..2fc5c46cd05 100644 --- a/stream-video-android-ui-compose/api/stream-video-android-ui-compose.api +++ b/stream-video-android-ui-compose/api/stream-video-android-ui-compose.api @@ -658,6 +658,25 @@ public abstract interface class io/getstream/video/android/compose/theme/StreamT public fun getTypography (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/theme/design/StreamDesign$Typography; } +public final class io/getstream/video/android/compose/theme/UserAvatarParams { + public static final field $stable I + public fun (Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/Modifier;Z)V + public synthetic fun (Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/Modifier;ZILkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1 ()Ljava/lang/String; + public final fun component2 ()Ljava/lang/String; + public final fun component3 ()Landroidx/compose/ui/Modifier; + public final fun component4 ()Z + public final fun copy (Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/Modifier;Z)Lio/getstream/video/android/compose/theme/UserAvatarParams; + public static synthetic fun copy$default (Lio/getstream/video/android/compose/theme/UserAvatarParams;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/Modifier;ZILjava/lang/Object;)Lio/getstream/video/android/compose/theme/UserAvatarParams; + public fun equals (Ljava/lang/Object;)Z + public final fun getModifier ()Landroidx/compose/ui/Modifier; + public final fun getUserImage ()Ljava/lang/String; + public final fun getUserName ()Ljava/lang/String; + public fun hashCode ()I + public final fun isShowingOnlineIndicator ()Z + public fun toString ()Ljava/lang/String; +} + public abstract interface class io/getstream/video/android/compose/theme/VideoComponentFactory { public fun AudioOnlyCallControlsContent (Landroidx/compose/foundation/layout/BoxScope;Lio/getstream/video/android/compose/theme/AudioOnlyCallControlsContentParams;Landroidx/compose/runtime/Composer;I)V public fun AudioOnlyCallDetailsContent (Landroidx/compose/foundation/layout/ColumnScope;Lio/getstream/video/android/compose/theme/AudioOnlyCallDetailsContentParams;Landroidx/compose/runtime/Composer;I)V @@ -693,6 +712,7 @@ public abstract interface class io/getstream/video/android/compose/theme/VideoCo public fun ParticipantVideoLabelContent (Landroidx/compose/foundation/layout/BoxScope;Lio/getstream/video/android/compose/theme/ParticipantVideoLabelContentParams;Landroidx/compose/runtime/Composer;I)V public fun ParticipantVideoReactionContent (Landroidx/compose/foundation/layout/BoxScope;Lio/getstream/video/android/compose/theme/ParticipantVideoReactionContentParams;Landroidx/compose/runtime/Composer;I)V public fun ScreenSharingFallbackContent (Lio/getstream/video/android/compose/theme/ScreenSharingFallbackContentParams;Landroidx/compose/runtime/Composer;I)V + public fun UserAvatar (Lio/getstream/video/android/compose/theme/UserAvatarParams;Landroidx/compose/runtime/Composer;I)V } public final class io/getstream/video/android/compose/theme/VideoTheme : io/getstream/video/android/compose/theme/StreamTheme { @@ -999,7 +1019,6 @@ public final class io/getstream/video/android/compose/ui/ComposableSingletons$St public static final field INSTANCE Lio/getstream/video/android/compose/ui/ComposableSingletons$StreamCallActivityComposeDelegateKt; public fun ()V public final fun getLambda$-116630321$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function3; - public final fun getLambda$1997978543$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function2; public final fun getLambda$641355412$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function3; } @@ -1146,11 +1165,11 @@ public final class io/getstream/video/android/compose/ui/components/avatar/Onlin } public final class io/getstream/video/android/compose/ui/components/avatar/UserAvatarBackgroundKt { - public static final fun UserAvatarBackground-1UyhGxE (Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/Shape;FLandroidx/compose/ui/layout/ContentScale;Ljava/lang/String;JLjava/lang/Integer;ILandroidx/compose/ui/text/TextStyle;JLandroidx/compose/runtime/Composer;III)V + public static final fun UserAvatarBackground-lgKX8Dc (Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/Shape;FLandroidx/compose/ui/layout/ContentScale;Ljava/lang/String;JLjava/lang/Integer;ILandroidx/compose/ui/text/TextStyle;Landroidx/compose/runtime/Composer;III)V } public final class io/getstream/video/android/compose/ui/components/avatar/UserAvatarKt { - public static final fun UserAvatar-S9GcbaY (Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/String;JLjava/lang/Integer;ILandroidx/compose/ui/text/TextStyle;JZLio/getstream/video/android/compose/ui/components/avatar/OnlineIndicatorAlignment;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;III)V + public static final fun UserAvatar-UPVI-Cw (Landroidx/compose/ui/Modifier;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/layout/ContentScale;Ljava/lang/String;JLjava/lang/Integer;ILandroidx/compose/ui/text/TextStyle;ZLio/getstream/video/android/compose/ui/components/avatar/OnlineIndicatorAlignment;Lkotlin/jvm/functions/Function3;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;III)V } public final class io/getstream/video/android/compose/ui/components/background/CallBackgroundKt { @@ -1158,154 +1177,87 @@ public final class io/getstream/video/android/compose/ui/components/background/C } public final class io/getstream/video/android/compose/ui/components/base/BadgeKt { - public static final fun StreamBadgeBox (Landroidx/compose/ui/Modifier;Ljava/lang/String;ZLio/getstream/video/android/compose/ui/components/base/styling/BadgeStyle;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V -} - -public final class io/getstream/video/android/compose/ui/components/base/ContainerKt { - public static final fun GenericContainer-sW7UJKQ (Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/shape/CornerSize;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V + public static final fun StreamBadgeBox (Landroidx/compose/ui/Modifier;Ljava/lang/String;ZLkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V } -public final class io/getstream/video/android/compose/ui/components/base/DialogsKt { - public static final fun StreamDialog (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyle;Landroidx/compose/ui/window/DialogProperties;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamDialogPositiveNegative (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/window/DialogProperties;Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyle;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;Lkotlin/Triple;Lkotlin/Triple;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V +public final class io/getstream/video/android/compose/ui/components/base/ComposableSingletons$StreamBottomSheetKt { + public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/ComposableSingletons$StreamBottomSheetKt; + public fun ()V + public final fun getLambda$-1113075726$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function2; } -public final class io/getstream/video/android/compose/ui/components/base/InputFieldsKt { - public static final fun StreamOutlinedTextField (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/input/TextFieldValue;Lkotlin/jvm/functions/Function1;ZZLio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle;Lkotlin/jvm/functions/Function2;ZLandroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/text/KeyboardOptions;Landroidx/compose/foundation/text/KeyboardActions;ZIILkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function2;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;III)V - public static final fun StreamTextField (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/text/input/TextFieldValue;Lkotlin/jvm/functions/Function1;ZZLio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle;Ljava/lang/String;ZIILandroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/text/KeyboardOptions;Landroidx/compose/foundation/text/KeyboardActions;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;III)V +public final class io/getstream/video/android/compose/ui/components/base/ContainerKt { + public static final fun GenericContainer-sW7UJKQ (Landroidx/compose/ui/Modifier;JLandroidx/compose/foundation/shape/CornerSize;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/base/StreamButtonKt { - public static final fun GenericStreamButton (Landroidx/compose/ui/Modifier;Lkotlin/jvm/functions/Function0;ZLio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V - public static final fun GenericToggleButton (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/State;Lkotlin/jvm/functions/Function1;Lkotlin/jvm/functions/Function4;Lkotlin/jvm/functions/Function4;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamButton-Qomo1sA (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;IIZZLio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle;Landroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamDrawableButton (Landroidx/compose/ui/Modifier;ILio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamDrawableToggleButton (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/State;IILio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamIconButton (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/vector/ImageVector;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function0;ZZLandroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamIconToggleButton (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/State;Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/vector/ImageVector;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;ZLio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V - public static final fun StreamToggleButton (Landroidx/compose/ui/Modifier;Landroidx/compose/runtime/State;Ljava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/vector/ImageVector;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle;ZLandroidx/compose/foundation/interaction/MutableInteractionSource;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V -} - -public final class io/getstream/video/android/compose/ui/components/base/styling/BadgeStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStyle { - public static final field $stable I - public synthetic fun (FJLandroidx/compose/ui/text/TextStyle;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1-D9Ej5fM ()F - public final fun component2-0d7_KjU ()J - public final fun component3 ()Landroidx/compose/ui/text/TextStyle; - public final fun component4 ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun copy-1jbw_BE (FJLandroidx/compose/ui/text/TextStyle;Landroidx/compose/foundation/layout/PaddingValues;)Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyle; - public static synthetic fun copy-1jbw_BE$default (Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyle;FJLandroidx/compose/ui/text/TextStyle;Landroidx/compose/foundation/layout/PaddingValues;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyle; - public fun equals (Ljava/lang/Object;)Z - public final fun getColor-0d7_KjU ()J - public final fun getContentPaddings ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun getSize-D9Ej5fM ()F - public final fun getTextStyle ()Landroidx/compose/ui/text/TextStyle; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; + public static final fun StreamButton (Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/Modifier;ZLjava/lang/String;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function2;Landroidx/compose/runtime/Composer;II)V + public static final fun StreamIconButton (Lkotlin/jvm/functions/Function0;Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;Landroidx/compose/ui/Modifier;ZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Landroidx/compose/runtime/Composer;II)V + public static final fun StreamTextButton (Lkotlin/jvm/functions/Function0;Ljava/lang/String;Landroidx/compose/ui/Modifier;ZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/runtime/Composer;II)V } -public class io/getstream/video/android/compose/ui/components/base/styling/BadgeStyleProvider { - public static final field $stable I - public fun ()V - public final fun defaultBadgeStyle (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyle; +public final class io/getstream/video/android/compose/ui/components/base/StreamButtonSize : java/lang/Enum { + public static final field Large Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize; + public static final field Medium Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize; + public static final field Small Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize; + public static fun getEntries ()Lkotlin/enums/EnumEntries; + public static fun valueOf (Ljava/lang/String;)Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize; + public static fun values ()[Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize; } -public final class io/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStyle { +public final class io/getstream/video/android/compose/ui/components/base/StreamButtonStyle { public static final field $stable I - public fun (Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/foundation/layout/PaddingValues;)V - public final fun component1 ()Landroidx/compose/ui/layout/ContentScale; - public final fun component2 ()F - public final fun component3 ()Landroidx/compose/ui/graphics/ColorFilter; - public final fun component4 ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun copy (Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/foundation/layout/PaddingValues;)Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public static synthetic fun copy$default (Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Landroidx/compose/ui/layout/ContentScale;FLandroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/foundation/layout/PaddingValues;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; + public synthetic fun (Landroidx/compose/ui/graphics/Color;JLandroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;JLandroidx/compose/ui/graphics/Color;Lkotlin/jvm/internal/DefaultConstructorMarker;)V + public final fun component1-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun component2-0d7_KjU ()J + public final fun component3-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun component4-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun component5-0d7_KjU ()J + public final fun component6-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun copy-SUZZAkY (Landroidx/compose/ui/graphics/Color;JLandroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;JLandroidx/compose/ui/graphics/Color;)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public static synthetic fun copy-SUZZAkY$default (Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Landroidx/compose/ui/graphics/Color;JLandroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;JLandroidx/compose/ui/graphics/Color;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; public fun equals (Ljava/lang/Object;)Z - public final fun getAlpha ()F - public final fun getColorFilter ()Landroidx/compose/ui/graphics/ColorFilter; - public final fun getPadding ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun getScale ()Landroidx/compose/ui/layout/ContentScale; + public final fun getBorderColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun getContainerColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun getContentColor-0d7_KjU ()J + public final fun getDisabledBorderColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun getDisabledContainerColor-QN2ZGVo ()Landroidx/compose/ui/graphics/Color; + public final fun getDisabledContentColor-0d7_KjU ()J public fun hashCode ()I public fun toString ()Ljava/lang/String; } -public class io/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyleProvider { - public static final field $stable I - public fun ()V - public final fun customColorFilterButtonDrawableStyle (Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle; - public final fun defaultButtonDrawableStyle (Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/ui/layout/ContentScale;FFFLandroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/ui/graphics/ColorFilter;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle; -} - -public final class io/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyles : io/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyleProvider { +public final class io/getstream/video/android/compose/ui/components/base/StreamButtonStyleDefaults { public static final field $stable I - public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyles; + public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyleDefaults; + public final fun getDestructiveGhost (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getDestructiveOutline (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getDestructiveSolid (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getPrimaryGhost (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getPrimaryOutline (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getPrimarySolid (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getSecondaryGhost (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getSecondaryOutline (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; + public final fun getSecondarySolid (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle; } -public class io/getstream/video/android/compose/ui/components/base/styling/ButtonStyleProvider { - public static final field $stable I - public fun ()V - public final fun alertButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun alertIconButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun drawableToggleButtonStyleOff (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun drawableToggleButtonStyleOn (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun genericButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun onlyIconIconButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun primaryButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun primaryDrawableButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun primaryIconButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun secondaryButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun secondaryIconButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun tertiaryButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun tertiaryIconButtonStyle (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun toggleButtonStyleOff (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun toggleButtonStyleOn (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; +public final class io/getstream/video/android/compose/ui/components/base/StreamDialogKt { + public static final fun StreamDialog (Lkotlin/jvm/functions/Function0;Ljava/lang/String;Landroidx/compose/ui/Modifier;Ljava/lang/String;Landroidx/compose/ui/graphics/painter/Painter;ZZLkotlin/jvm/functions/Function3;Landroidx/compose/runtime/Composer;II)V } -public final class io/getstream/video/android/compose/ui/components/base/styling/ButtonStyles : io/getstream/video/android/compose/ui/components/base/styling/ButtonStyleProvider { - public static final field $stable I - public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/styling/ButtonStyles; +public final class io/getstream/video/android/compose/ui/components/base/StreamTextFieldKt { + public static final fun StreamTextField (Landroidx/compose/ui/text/input/TextFieldValue;Lkotlin/jvm/functions/Function1;Landroidx/compose/ui/Modifier;ZZLjava/lang/String;Ljava/lang/String;Landroidx/compose/ui/graphics/painter/Painter;Landroidx/compose/ui/graphics/painter/Painter;IILandroidx/compose/ui/text/input/VisualTransformation;Landroidx/compose/foundation/text/KeyboardOptions;Landroidx/compose/foundation/text/KeyboardActions;Landroidx/compose/foundation/interaction/MutableInteractionSource;Landroidx/compose/runtime/Composer;III)V } public class io/getstream/video/android/compose/ui/components/base/styling/CompositeStyleProvider { public static final field $stable I public fun ()V - public fun (Lio/getstream/video/android/compose/ui/components/base/styling/IconStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyleProvider;)V - public synthetic fun (Lio/getstream/video/android/compose/ui/components/base/styling/IconStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyleProvider;ILkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun getBadgeStyles ()Lio/getstream/video/android/compose/ui/components/base/styling/BadgeStyleProvider; - public final fun getButtonStyles ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonStyleProvider; - public final fun getDialogStyles ()Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyleProvider; + public fun (Lio/getstream/video/android/compose/ui/components/base/styling/IconStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleProvider;)V + public synthetic fun (Lio/getstream/video/android/compose/ui/components/base/styling/IconStyleProvider;Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleProvider;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getIconStyles ()Lio/getstream/video/android/compose/ui/components/base/styling/IconStyleProvider; - public final fun getTextFieldStyles ()Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyleProvider; public final fun getTextStyles ()Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleProvider; } -public final class io/getstream/video/android/compose/ui/components/base/styling/DialogStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStyle { - public static final field $stable I - public synthetic fun (Landroidx/compose/ui/graphics/Shape;JLandroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle;Landroidx/compose/foundation/layout/PaddingValues;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun component1 ()Landroidx/compose/ui/graphics/Shape; - public final fun component2-0d7_KjU ()J - public final fun component3 ()Landroidx/compose/ui/text/TextStyle; - public final fun component4 ()Landroidx/compose/ui/text/TextStyle; - public final fun component5 ()Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle; - public final fun component6 ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun copy-3IgeMak (Landroidx/compose/ui/graphics/Shape;JLandroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle;Landroidx/compose/foundation/layout/PaddingValues;)Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyle; - public static synthetic fun copy-3IgeMak$default (Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyle;Landroidx/compose/ui/graphics/Shape;JLandroidx/compose/ui/text/TextStyle;Landroidx/compose/ui/text/TextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle;Landroidx/compose/foundation/layout/PaddingValues;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyle; - public fun equals (Ljava/lang/Object;)Z - public final fun getBackgroundColor-0d7_KjU ()J - public final fun getContentPaddings ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun getContentTextStyle ()Landroidx/compose/ui/text/TextStyle; - public final fun getIconStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle; - public final fun getShape ()Landroidx/compose/ui/graphics/Shape; - public final fun getTitleStyle ()Landroidx/compose/ui/text/TextStyle; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public class io/getstream/video/android/compose/ui/components/base/styling/DialogStyleProvider { - public static final field $stable I - public fun ()V - public final fun defaultDialogStyle (Landroidx/compose/runtime/Composer;I)Lio/getstream/video/android/compose/ui/components/base/styling/DialogStyle; -} - public final class io/getstream/video/android/compose/ui/components/base/styling/IconStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStyle { public static final field $stable I public synthetic fun (JLandroidx/compose/foundation/layout/PaddingValues;ILkotlin/jvm/internal/DefaultConstructorMarker;)V @@ -1333,64 +1285,6 @@ public final class io/getstream/video/android/compose/ui/components/base/styling public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/styling/IconStyles; } -public final class io/getstream/video/android/compose/ui/components/base/styling/StreamBadgeStyles : io/getstream/video/android/compose/ui/components/base/styling/BadgeStyleProvider { - public static final field $stable I - public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/styling/StreamBadgeStyles; -} - -public final class io/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStateStyle { - public static final field $stable I - public fun (Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;)V - public final fun component1 ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public final fun component2 ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public final fun component3 ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public final fun copy (Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle; - public static synthetic fun copy$default (Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle; - public fun equals (Ljava/lang/Object;)Z - public fun getDefault ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public synthetic fun getDefault ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamStyle; - public fun getDisabled ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public synthetic fun getDisabled ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamStyle; - public fun getPressed ()Lio/getstream/video/android/compose/ui/components/base/styling/ButtonDrawableStyle; - public synthetic fun getPressed ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamStyle; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public class io/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle { - public static final field $stable I - public fun (Landroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;)V - public final fun copy (Landroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public static synthetic fun copy$default (Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle;Landroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle; - public final fun getBorder ()Landroidx/compose/foundation/BorderStroke; - public final fun getColors ()Landroidx/compose/material/ButtonColors; - public final fun getContentPadding ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun getDrawableStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle; - public final fun getElevation ()Landroidx/compose/material/ButtonElevation; - public final fun getIconStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle; - public final fun getShape ()Landroidx/compose/ui/graphics/Shape; - public final fun getTextStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle; -} - -public final class io/getstream/video/android/compose/ui/components/base/styling/StreamDialogStyles : io/getstream/video/android/compose/ui/components/base/styling/DialogStyleProvider { - public static final field $stable I - public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/styling/StreamDialogStyles; -} - -public class io/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle { - public static final field $stable I - public static final field Companion Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle$Companion; - public synthetic fun (FFLandroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;Lkotlin/jvm/internal/DefaultConstructorMarker;)V - public final fun copyFixed-QPHvnyU (FFLandroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public static synthetic fun copyFixed-QPHvnyU$default (Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;FFLandroidx/compose/material/ButtonElevation;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/material/ButtonColors;Landroidx/compose/foundation/layout/PaddingValues;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; - public final fun getHeight-D9Ej5fM ()F - public final fun getWidth-D9Ej5fM ()F -} - -public final class io/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle$Companion { - public final fun of-Md-fbLM (FFLio/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle;)Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle; -} - public final class io/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStateStyle { public static final field $stable I public fun (Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle;Lio/getstream/video/android/compose/ui/components/base/styling/IconStyle;)V @@ -1420,11 +1314,6 @@ public abstract interface class io/getstream/video/android/compose/ui/components public abstract interface class io/getstream/video/android/compose/ui/components/base/styling/StreamStyle { } -public final class io/getstream/video/android/compose/ui/components/base/styling/StreamTextFieldStyles : io/getstream/video/android/compose/ui/components/base/styling/TextFieldStyleProvider { - public static final field $stable I - public static final field INSTANCE Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextFieldStyles; -} - public final class io/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStateStyle { public static final field $stable I public fun (Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleWrapper;Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleWrapper;Lio/getstream/video/android/compose/ui/components/base/styling/TextStyleWrapper;)V @@ -1470,36 +1359,6 @@ public final class io/getstream/video/android/compose/ui/components/base/styling public static fun values ()[Lio/getstream/video/android/compose/ui/components/base/styling/StyleState; } -public final class io/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle : io/getstream/video/android/compose/ui/components/base/styling/StreamStyle { - public static final field $stable I - public fun (Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Landroidx/compose/material/TextFieldColors;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;)V - public final fun component1 ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle; - public final fun component2 ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle; - public final fun component3 ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle; - public final fun component4 ()Landroidx/compose/material/TextFieldColors; - public final fun component5 ()Landroidx/compose/ui/graphics/Shape; - public final fun component6 ()Landroidx/compose/foundation/BorderStroke; - public final fun component7 ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun copy (Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Landroidx/compose/material/TextFieldColors;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;)Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle; - public static synthetic fun copy$default (Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Landroidx/compose/material/TextFieldColors;Landroidx/compose/ui/graphics/Shape;Landroidx/compose/foundation/BorderStroke;Landroidx/compose/foundation/layout/PaddingValues;ILjava/lang/Object;)Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle; - public fun equals (Ljava/lang/Object;)Z - public final fun getBorderStroke ()Landroidx/compose/foundation/BorderStroke; - public final fun getColors ()Landroidx/compose/material/TextFieldColors; - public final fun getIconStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle; - public final fun getPaddings ()Landroidx/compose/foundation/layout/PaddingValues; - public final fun getPlaceholderStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle; - public final fun getShape ()Landroidx/compose/ui/graphics/Shape; - public final fun getTextStyle ()Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle; - public fun hashCode ()I - public fun toString ()Ljava/lang/String; -} - -public class io/getstream/video/android/compose/ui/components/base/styling/TextFieldStyleProvider { - public static final field $stable I - public fun ()V - public final fun defaultTextField (Lio/getstream/video/android/compose/ui/components/base/styling/StyleSize;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamTextStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamIconStyle;Landroidx/compose/runtime/Composer;II)Lio/getstream/video/android/compose/ui/components/base/styling/TextFieldStyle; -} - public class io/getstream/video/android/compose/ui/components/base/styling/TextStyleProvider { public static final field $stable I public fun ()V @@ -1560,19 +1419,19 @@ public final class io/getstream/video/android/compose/ui/components/call/control } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/AcceptCallActionKt { - public static final fun AcceptCallAction-VVa3G6Q (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun AcceptCallAction (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/painter/Painter;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallActionKt { - public static final fun CancelCallAction-VVa3G6Q (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun CancelCallAction (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/painter/Painter;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ChatDialogActionKt { - public static final fun ChatDialogAction-_8q-z2c (Landroidx/compose/ui/Modifier;ZLjava/lang/Integer;Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun ChatDialogAction (Landroidx/compose/ui/Modifier;ZLjava/lang/Integer;Landroidx/compose/ui/graphics/painter/Painter;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ClosedCaptionsToggleActionKt { - public static final fun ClosedCaptionsToggleAction-PBJxc4c (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun ClosedCaptionsToggleAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ControlActionsBuilderKt { @@ -1581,7 +1440,7 @@ public final class io/getstream/video/android/compose/ui/components/call/control } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/DeclineCallActionKt { - public static final fun DeclineCallAction-PBJxc4c (Landroidx/compose/ui/Modifier;ZLkotlin/jvm/functions/Function1;Landroidx/compose/ui/graphics/vector/ImageVector;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Landroidx/compose/runtime/Composer;II)V + public static final fun DeclineCallAction (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/painter/Painter;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/DefaultOnCallActionHandler { @@ -1591,40 +1450,40 @@ public final class io/getstream/video/android/compose/ui/components/call/control } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/FlipCameraActionKt { - public static final fun FlipCameraAction-3tXnx4A (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun FlipCameraAction (Landroidx/compose/ui/Modifier;ZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActionsKt { - public static final fun GenericAction-Pz9yvRs (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/vector/ImageVector;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V - public static final fun ToggleAction-X9YjGh4 (Landroidx/compose/ui/Modifier;ZLkotlin/Pair;ZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;ZLio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;III)V + public static final fun GenericAction (Landroidx/compose/ui/Modifier;Landroidx/compose/ui/graphics/painter/Painter;Ljava/lang/String;ZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V + public static final fun ToggleAction (Landroidx/compose/ui/Modifier;ZLkotlin/Pair;Ljava/lang/String;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function0;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/LeaveCallActionKt { - public static final fun LeaveCallAction (Landroidx/compose/ui/Modifier;ZLio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun LeaveCallAction (Landroidx/compose/ui/Modifier;ZLandroidx/compose/ui/graphics/painter/Painter;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleActionKt { - public static final fun ScreenShareToggleAction-PBJxc4c (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun ScreenShareToggleAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/SettingsActionKt { - public static final fun ToggleSettingsAction-PBJxc4c (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V + public static final fun ToggleSettingsAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleCameraActionKt { - public static final fun ToggleCameraAction-m_EyDiA (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V + public static final fun ToggleCameraAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleHifiAudioActionKt { - public static final fun ToggleHifiAudioAction-m_EyDiA (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V + public static final fun ToggleHifiAudioAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleMicrophoneActionKt { - public static final fun ToggleMicrophoneAction-m_EyDiA (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V + public static final fun ToggleMicrophoneAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleSpeakerphoneActionKt { - public static final fun ToggleSpeakerphoneAction-m_EyDiA (Landroidx/compose/ui/Modifier;ZZLandroidx/compose/ui/graphics/Shape;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Landroidx/compose/ui/graphics/Color;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lio/getstream/video/android/compose/ui/components/base/styling/StreamFixedSizeButtonStyle;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;III)V + public static final fun ToggleSpeakerphoneAction (Landroidx/compose/ui/Modifier;ZZLio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonStyle;Lio/getstream/video/android/compose/ui/components/base/StreamButtonSize;Lkotlin/jvm/functions/Function1;Landroidx/compose/runtime/Composer;II)V } public final class io/getstream/video/android/compose/ui/components/call/diagnostics/CallDiagnosticsContentKt { @@ -1664,12 +1523,12 @@ public final class io/getstream/video/android/compose/ui/components/call/pinning public final class io/getstream/video/android/compose/ui/components/call/pinning/ParticipantAction { public static final field $stable I - public fun (Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V - public synthetic fun (Landroidx/compose/ui/graphics/vector/ImageVector;Ljava/lang/String;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V + public fun (ILjava/lang/String;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;)V + public synthetic fun (ILjava/lang/String;ZLkotlin/jvm/functions/Function2;Lkotlin/jvm/functions/Function3;ILkotlin/jvm/internal/DefaultConstructorMarker;)V public final fun getAction ()Lkotlin/jvm/functions/Function3; public final fun getCondition ()Lkotlin/jvm/functions/Function2; public final fun getFirstToggleAction ()Z - public final fun getIcon ()Landroidx/compose/ui/graphics/vector/ImageVector; + public final fun getIcon ()I public final fun getLabel ()Ljava/lang/String; } diff --git a/stream-video-android-ui-compose/build.gradle.kts b/stream-video-android-ui-compose/build.gradle.kts index 2b71cd58ce6..9b81414aa46 100644 --- a/stream-video-android-ui-compose/build.gradle.kts +++ b/stream-video-android-ui-compose/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation(libs.androidx.compose.runtime) implementation(libs.androidx.compose.foundation) implementation(libs.androidx.compose.material) - implementation(libs.androidx.compose.material.iconsExtended) + implementation(libs.androidx.compose.material3) implementation(libs.androidx.lifecycle.runtime.compose) implementation(libs.accompanist.permission) diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/BadgePreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/BadgePreview.kt index e70b9a3e075..d35d33f335f 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/BadgePreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/BadgePreview.kt @@ -16,20 +16,16 @@ package io.getstream.video.android.compose.ui.components.base -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.AddAlert -import androidx.compose.material.icons.filled.Info -import androidx.compose.material.icons.filled.QuestionAnswer +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp +import io.getstream.video.android.compose.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamBadgeStyles +import io.getstream.video.android.compose.theme.design.StreamTokens @Preview @Composable @@ -39,48 +35,20 @@ private fun BadgesWithButtonsRootPreview() { } } +/** + * Count badges over icon buttons: one digit, two digits, a plus label, and no badge. + */ @Composable internal fun BadgesWithButtonsPreview() { - Column { - StreamBadgeBox( - text = "!", - style = StreamBadgeStyles.defaultBadgeStyle(), - ) { - StreamIconButton( - icon = Icons.Default.AddAlert, - style = ButtonStyles.secondaryIconButtonStyle(), - ) - } - Spacer(modifier = Modifier.size(16.dp)) - StreamBadgeBox( - text = "10", - style = StreamBadgeStyles.defaultBadgeStyle(), - ) { - StreamButton( - icon = Icons.Default.Info, - text = "Secondary Button", - style = ButtonStyles.secondaryButtonStyle(), - ) - } - Spacer(modifier = Modifier.size(16.dp)) - StreamBadgeBox( - text = "10+", - style = StreamBadgeStyles.defaultBadgeStyle(), - ) { - StreamIconButton( - icon = Icons.Default.QuestionAnswer, - style = ButtonStyles.primaryIconButtonStyle(), - ) - } - Spacer(modifier = Modifier.size(16.dp)) - StreamBadgeBox( - showWithoutValue = false, - style = StreamBadgeStyles.defaultBadgeStyle(), - ) { - StreamIconButton( - icon = Icons.Default.QuestionAnswer, - style = ButtonStyles.primaryIconButtonStyle(), - ) + val icon = painterResource(R.drawable.stream_design_ic_message_bubbles_fill) + Row( + modifier = Modifier.padding(StreamTokens.spacingMd), + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingMd), + ) { + listOf("1", "10", "99+", null).forEach { count -> + StreamBadgeBox(text = count, showWithoutValue = false) { + StreamIconButton(onClick = {}, icon = icon, contentDescription = null) + } } } } diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsPreview.kt deleted file mode 100644 index 2d40d98f9bd..00000000000 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsPreview.kt +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base - -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.size -import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.StopCircle -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.style.TextAlign -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamDialogStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamTextFieldStyles -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize - -@Preview -@Composable -private fun StreamDialogRootPreview() { - VideoTheme { - StreamDialogPreview() - } -} - -@Composable -internal fun StreamDialogPreview() { - StreamDialogPositiveNegative( - icon = Icons.Default.StopCircle, - title = "This Call is Being Recorded", - // Color is for preview only - style = StreamDialogStyles.defaultDialogStyle().copy( - backgroundColor = VideoTheme.colors.backgroundCoreSurfaceDefault, - ), - contentText = "By staying in the call you’re consenting to being recorded.", - positiveButton = Triple( - "Continue", - ButtonStyles.secondaryButtonStyle(StyleSize.S), - ) { - // Do nothing - }, - negativeButton = Triple( - "Leave call", - ButtonStyles.tertiaryButtonStyle(StyleSize.S), - ) { - // Do nothing - }, - ) -} - -@Preview -@Composable -private fun StreamDialogWithInputRootPreview() { - VideoTheme { - StreamDialogWithInputPreview() - } -} - -@Composable -internal fun StreamDialogWithInputPreview() { - StreamDialogPositiveNegative( - content = { - Text( - text = "How is your call Going?", - style = TextStyle( - fontSize = 24.sp, - lineHeight = 28.sp, - fontWeight = FontWeight(500), - color = VideoTheme.colors.textPrimary, - textAlign = TextAlign.Center, - ), - ) - Spacer(modifier = Modifier.size(8.dp)) - Text( - text = "All feedback is celebrated!", - style = TextStyle( - fontSize = 16.sp, - lineHeight = 18.5.sp, - fontWeight = FontWeight(400), - color = VideoTheme.colors.textSecondary, - textAlign = TextAlign.Center, - ), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamTextField( - value = TextFieldValue(""), - placeholder = "Email address (required)", - onValueChange = {}, - style = StreamTextFieldStyles.defaultTextField(StyleSize.S), - ) - - Spacer(modifier = Modifier.size(16.dp)) - StreamTextField( - value = TextFieldValue(""), - placeholder = "Message", - onValueChange = {}, - minLines = 7, - style = StreamTextFieldStyles.defaultTextField(StyleSize.S), - ) - }, - // Color is for preview only - style = StreamDialogStyles.defaultDialogStyle().copy( - backgroundColor = VideoTheme.colors.backgroundCoreSurfaceDefault, - ), - positiveButton = Triple( - "Submit", - ButtonStyles.secondaryButtonStyle(StyleSize.S), - ) { - // Do nothing - }, - negativeButton = Triple( - "Not now", - ButtonStyles.tertiaryButtonStyle(StyleSize.S), - ) { - // Do nothing - }, - ) -} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/InputFieldsPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/InputFieldsPreview.kt deleted file mode 100644 index 2677f695df6..00000000000 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/InputFieldsPreview.kt +++ /dev/null @@ -1,113 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base - -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.outlined.Phone -import androidx.compose.runtime.Composable -import androidx.compose.ui.Modifier -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamTextFieldStyles - -@Preview -@Composable -private fun InputFieldsRootPreview() { - VideoTheme { - InputFieldsPreview() - } -} - -@Composable -internal fun InputFieldsPreview() { - Column { - // Empty - StreamTextField( - value = TextFieldValue(""), - placeholder = "Call ID", - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamTextField( - value = TextFieldValue(""), - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - - StreamTextField( - icon = Icons.Outlined.Phone, - value = TextFieldValue(""), - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - - // Not empty - StreamTextField( - value = TextFieldValue("Some value"), - placeholder = "Call ID", - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - - StreamTextField( - icon = Icons.Outlined.Phone, - value = TextFieldValue("+ 123 456 789"), - placeholder = "Call ID", - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - - // Disabled - StreamTextField( - enabled = false, - value = TextFieldValue(""), - placeholder = "Call ID", - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - - // Error - StreamTextField( - error = true, - value = TextFieldValue("Wrong data"), - placeholder = "Call ID", - onValueChange = { }, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - - StreamTextField( - value = TextFieldValue(""), - placeholder = "Message", - onValueChange = { }, - minLines = 8, - style = StreamTextFieldStyles.defaultTextField(), - ) - Spacer(modifier = Modifier.size(16.dp)) - } -} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamBottomSheetPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamBottomSheetPreview.kt new file mode 100644 index 00000000000..ed8e2b92ed9 --- /dev/null +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamBottomSheetPreview.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +@Preview +@Composable +private fun StreamBottomSheetRootPreview() { + VideoTheme { + StreamBottomSheetPreview() + } +} + +/** + * A bottom sheet with a title and a menu, shown over an empty screen. + */ +@Composable +internal fun StreamBottomSheetPreview() { + Box(modifier = Modifier.fillMaxSize()) { + StreamBottomSheet(onDismissRequest = {}, title = "More options") { + StreamListItemsPreview() + Box(modifier = Modifier.padding(bottom = StreamTokens.spacing3xl)) + } + } +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonPreview.kt index 0c420917c79..b868f84af9e 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonPreview.kt @@ -16,132 +16,72 @@ package io.getstream.video.android.compose.ui.components.base +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.ExitToApp -import androidx.compose.material.icons.automirrored.filled.PhoneMissed -import androidx.compose.material.icons.filled.AccessAlarm -import androidx.compose.material.icons.filled.Camera -import androidx.compose.material.icons.filled.GridView -import androidx.compose.material.icons.filled.GroupAdd -import androidx.compose.material.icons.filled.Settings -import androidx.compose.material.icons.filled.Videocam -import androidx.compose.material.icons.filled.VideocamOff +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Icon import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.state.ToggleableState +import androidx.compose.ui.res.painterResource import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import io.getstream.video.android.compose.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamBadgeStyles -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize +import io.getstream.video.android.compose.theme.design.StreamTokens @Preview @Composable -private fun RegularIconButtonsRootPreview() { +private fun StreamButtonStylesEnabledRootPreview() { VideoTheme { - RegularIconButtonsPreview() + StreamButtonStylesPreview(enabled = true) } } +@Preview @Composable -internal fun RegularIconButtonsPreview() { - Column { - Row { - StreamIconButton( - icon = Icons.Default.GroupAdd, - style = ButtonStyles.primaryIconButtonStyle(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - icon = Icons.AutoMirrored.Filled.ExitToApp, - style = ButtonStyles.secondaryIconButtonStyle(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - icon = Icons.Default.Settings, - style = ButtonStyles.tertiaryIconButtonStyle(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - icon = Icons.AutoMirrored.Filled.PhoneMissed, - style = ButtonStyles.alertIconButtonStyle(), - ) - } - - Spacer(modifier = Modifier.size(48.dp)) - Row { - StreamIconButton( - enabled = false, - icon = Icons.Default.GroupAdd, - style = ButtonStyles.primaryIconButtonStyle(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - enabled = false, - icon = Icons.AutoMirrored.Filled.ExitToApp, - style = ButtonStyles.secondaryIconButtonStyle(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - enabled = false, - icon = Icons.Default.Settings, - style = ButtonStyles.tertiaryIconButtonStyle(), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - enabled = false, - icon = Icons.AutoMirrored.Filled.PhoneMissed, - style = ButtonStyles.alertIconButtonStyle(), - ) - } - - Spacer(modifier = Modifier.size(48.dp)) - Row { - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - icon = Icons.AutoMirrored.Filled.PhoneMissed, - style = ButtonStyles.alertIconButtonStyle(size = StyleSize.L), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - icon = Icons.AutoMirrored.Filled.PhoneMissed, - style = ButtonStyles.alertIconButtonStyle(size = StyleSize.M), - ) - Spacer(modifier = Modifier.size(16.dp)) - StreamIconButton( - icon = Icons.AutoMirrored.Filled.PhoneMissed, - style = ButtonStyles.alertIconButtonStyle(size = StyleSize.S), - ) - } +private fun StreamButtonStylesDisabledRootPreview() { + VideoTheme { + StreamButtonStylesPreview(enabled = false) } } -@Preview +/** + * Every [StreamButtonStyleDefaults] variant as an icon button and as a text button with both icons. + */ @Composable -private fun StreamDrawableButtonPreview() { - VideoTheme { - Column { - Row { - StreamDrawableButton( - drawable = R.drawable.example, - style = ButtonStyles.primaryDrawableButtonStyle(), +internal fun StreamButtonStylesPreview(enabled: Boolean) { + val styles = listOf( + StreamButtonStyleDefaults.primarySolid, + StreamButtonStyleDefaults.primaryOutline, + StreamButtonStyleDefaults.primaryGhost, + StreamButtonStyleDefaults.secondarySolid, + StreamButtonStyleDefaults.secondaryOutline, + StreamButtonStyleDefaults.secondaryGhost, + StreamButtonStyleDefaults.destructiveSolid, + StreamButtonStyleDefaults.destructiveOutline, + StreamButtonStyleDefaults.destructiveGhost, + ) + val icon = painterResource(R.drawable.stream_design_ic_checkmark) + Column( + modifier = Modifier.padding(StreamTokens.spacingMd), + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), + ) { + styles.forEach { style -> + Row(horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs)) { + StreamIconButton( + onClick = {}, + icon = icon, + contentDescription = null, + enabled = enabled, + style = style, ) - Spacer(modifier = Modifier.size(16.dp)) - StreamDrawableButton( - drawable = R.drawable.example, - style = ButtonStyles.primaryDrawableButtonStyle(), - enabled = false, + StreamTextButton( + onClick = {}, + text = "Label", + enabled = enabled, + style = style, + leadingIcon = icon, + trailingIcon = icon, ) } } @@ -150,255 +90,34 @@ private fun StreamDrawableButtonPreview() { @Preview @Composable -private fun RegularButtonsRootPreview() { - VideoTheme { - RegularButtonsPreview() - } -} - -@Composable -internal fun RegularButtonsPreview() { - Column { - // Default - StreamButton( - text = "Primary Button", - style = ButtonStyles.primaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - text = "Secondary Button", - style = ButtonStyles.secondaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - text = "Tertiary Button", - style = ButtonStyles.tertiaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(48.dp)) - StreamButton( - text = "Alert Button", - style = ButtonStyles.alertButtonStyle(), - ) - Spacer(modifier = Modifier.height(48.dp)) - - // Disabled - StreamButton( - enabled = false, - text = "Primary Button", - style = ButtonStyles.primaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - enabled = false, - text = "Secondary Button", - style = ButtonStyles.secondaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - enabled = false, - text = "Tertiary Button", - style = ButtonStyles.tertiaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - enabled = false, - text = "Alert Button", - style = ButtonStyles.alertButtonStyle(), - ) - Spacer(modifier = Modifier.height(48.dp)) - } -} - -@Preview -@Composable -private fun ButtonWithIconsRootPreview() { - VideoTheme { - ButtonWithIconsPreview() - } -} - -@Composable -internal fun ButtonWithIconsPreview() { - Column { - // With icon - StreamButton( - icon = Icons.Filled.AccessAlarm, - text = "Primary Button", - style = ButtonStyles.primaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - icon = Icons.Filled.AccessAlarm, - text = "Secondary Button", - style = ButtonStyles.secondaryButtonStyle(), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - icon = Icons.Filled.AccessAlarm, - text = "Tertiary Button", - style = ButtonStyles.tertiaryButtonStyle(), - ) - } -} - -@Preview -@Composable -private fun DifferentSizeButtonsRootPreview() { +private fun StreamButtonSizesRootPreview() { VideoTheme { - DifferentSizeButtonsPreview() + StreamButtonSizesPreview() } } +/** + * Every [StreamButtonSize] as an icon button and as a text button. + */ @Composable -internal fun DifferentSizeButtonsPreview() { - Column { - // Size - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - text = "Small Button", - style = ButtonStyles.secondaryButtonStyle(size = StyleSize.S), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - text = "Medium Button", - style = ButtonStyles.secondaryButtonStyle(size = StyleSize.M), - ) - Spacer(modifier = Modifier.height(24.dp)) - StreamButton( - text = "Large Button", - style = ButtonStyles.secondaryButtonStyle(size = StyleSize.L), - ) - } -} - -@Preview -@Composable -private fun ToggleIconButtonsRootPreview() { - VideoTheme { - ToggleIconButtonsPreview() - } -} - -@Composable -internal fun ToggleIconButtonsPreview() { - Row { - // Size - StreamIconToggleButton( - onStyle = ButtonStyles.primaryIconButtonStyle(), - offStyle = ButtonStyles.alertIconButtonStyle(), - onIcon = Icons.Default.Videocam, - offIcon = Icons.Default.VideocamOff, - ) - Spacer(modifier = Modifier.width(24.dp)) - StreamIconToggleButton( - toggleState = rememberUpdatedState(newValue = ToggleableState.On), - onStyle = ButtonStyles.primaryIconButtonStyle(), - offStyle = ButtonStyles.alertIconButtonStyle(), - onIcon = Icons.Default.Videocam, - offIcon = Icons.Default.VideocamOff, - ) - - Spacer(modifier = Modifier.width(24.dp)) - StreamBadgeBox( - style = StreamBadgeStyles.defaultBadgeStyle().copy( - color = VideoTheme.colors.accentWarning, - textStyle = VideoTheme.typography.metadataEmphasis.copy(color = Color.Black), - ), - text = "!", - ) { - StreamIconToggleButton( - enabled = false, - toggleState = rememberUpdatedState(newValue = ToggleableState.Off), - onStyle = ButtonStyles.secondaryIconButtonStyle(), - offStyle = ButtonStyles.alertIconButtonStyle(), - onIcon = Icons.Default.Videocam, - offIcon = Icons.Default.VideocamOff, - ) - } - } -} - -@Preview -@Composable -private fun StreamDrawableToggleButtonPreview() { - VideoTheme { - Row { - StreamDrawableToggleButton( - toggleState = rememberUpdatedState(newValue = ToggleableState.On), // On - onDrawable = R.drawable.example, - onStyle = ButtonStyles.drawableToggleButtonStyleOn(), // On - ) - Spacer(modifier = Modifier.width(8.dp)) - StreamDrawableToggleButton( - toggleState = rememberUpdatedState(newValue = ToggleableState.Off), // Off - onDrawable = R.drawable.example, - onStyle = ButtonStyles.drawableToggleButtonStyleOn(), - offStyle = ButtonStyles.drawableToggleButtonStyleOff(), - ) - Spacer(modifier = Modifier.width(8.dp)) - StreamDrawableToggleButton( - toggleState = rememberUpdatedState(newValue = ToggleableState.On), - onDrawable = R.drawable.example, - onStyle = ButtonStyles.drawableToggleButtonStyleOn(), - offStyle = ButtonStyles.drawableToggleButtonStyleOff(), - enabled = false, // Disabled - ) +internal fun StreamButtonSizesPreview() { + val icon = painterResource(R.drawable.stream_design_ic_voice_fill) + Column( + modifier = Modifier.padding(StreamTokens.spacingMd), + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), + ) { + StreamButtonSize.entries.forEach { size -> + Row(horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs)) { + StreamIconButton(onClick = {}, icon = icon, contentDescription = null, size = size) + StreamTextButton(onClick = {}, text = "Button $size", size = size) + StreamButton( + onClick = {}, + size = size, + style = StreamButtonStyleDefaults.secondaryOutline, + ) { + Icon(painter = icon, contentDescription = null) + } + } } } } - -@Preview -@Composable -private fun ToggleButtonsRootPreview() { - VideoTheme { - ToggleButtonsPreview() - } -} - -@Composable -internal fun ToggleButtonsPreview() { - Column { - // Size - StreamToggleButton( - modifier = Modifier.fillMaxWidth(), - toggleState = rememberUpdatedState(newValue = ToggleableState.On), - onText = "Grid", - offText = "Grid", - onStyle = ButtonStyles.toggleButtonStyleOn(), - offStyle = ButtonStyles.toggleButtonStyleOff(), - onIcon = Icons.Filled.GridView, - offIcon = Icons.Filled.GridView, - ) - Spacer(modifier = Modifier.width(24.dp)) - StreamToggleButton( - modifier = Modifier.fillMaxWidth(), - toggleState = rememberUpdatedState(newValue = ToggleableState.Off), - onText = "Grid (On)", - offText = "Grid (Off)", - onStyle = ButtonStyles.toggleButtonStyleOn(), - offStyle = ButtonStyles.toggleButtonStyleOff(), - onIcon = Icons.Filled.GridView, - offIcon = Icons.Filled.GridView, - ) - } -} - -@Preview -@Composable -private fun ShowProgressIntoIconButtonsRootPreview() { - VideoTheme { - ShowProgressIntoIconButtonsPreview() - } -} - -@Composable -internal fun ShowProgressIntoIconButtonsPreview() { - Column { - StreamButton(text = "Progress", showProgress = true) - StreamIconButton( - icon = Icons.Default.Camera, - style = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), - showProgress = true, - ) - } -} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamDialogPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamDialogPreview.kt new file mode 100644 index 00000000000..6a8d7d8bb5a --- /dev/null +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamDialogPreview.kt @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.tooling.preview.Preview +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.theme.VideoTheme + +@Preview +@Composable +private fun StreamDialogRootPreview() { + VideoTheme { + StreamDialogPreview() + } +} + +/** + * The recording consent dialog: icon, title, message and two stacked actions. + */ +@Composable +internal fun StreamDialogPreview() { + StreamDialog( + onDismissRequest = {}, + icon = painterResource(R.drawable.stream_design_ic_recording_fill), + title = "This Call is Being Recorded", + message = "By staying in the call you’re consenting to being recorded.", + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = {}, + text = "Continue", + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = {}, + text = "Leave Call", + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } +} + +@Preview +@Composable +private fun StreamDialogWithInputRootPreview() { + VideoTheme { + StreamDialogWithInputPreview() + } +} + +/** + * A dialog with custom content: two text fields above the actions. + */ +@Composable +internal fun StreamDialogWithInputPreview() { + StreamDialog( + onDismissRequest = {}, + title = "How is your call going?", + message = "All feedback is celebrated!", + ) { + StreamTextField( + value = TextFieldValue(""), + onValueChange = {}, + placeholder = "Email address (required)", + ) + StreamTextField( + value = TextFieldValue(""), + onValueChange = {}, + placeholder = "Message", + minLines = 4, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = {}, + text = "Submit", + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = {}, + text = "Not now", + style = StreamButtonStyleDefaults.secondaryGhost, + size = StreamButtonSize.Large, + ) + } +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamListItemPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamListItemPreview.kt new file mode 100644 index 00000000000..d7512361b8b --- /dev/null +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamListItemPreview.kt @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size +import androidx.compose.material.Icon +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +@Preview +@Composable +private fun StreamListItemsRootPreview() { + VideoTheme { + StreamListItemsPreview() + } +} + +/** + * A menu made of headings, list items with leading icons, trailing chevrons and separators. + */ +@Composable +internal fun StreamListItemsPreview() { + Column { + StreamMenuHeading(text = "Layout") + StreamListItem(title = "Grid", onClick = { + }, leadingContent = { MenuIcon(R.drawable.stream_design_ic_grid_fill) }) + StreamListItem( + title = "Spotlight", + onClick = {}, + leadingContent = { MenuIcon(R.drawable.stream_design_ic_speaker_top_fill) }, + trailingContent = { MenuIcon(R.drawable.stream_design_ic_chevron_right) }, + ) + StreamMenuSeparator() + StreamListItem( + title = "Record Library", + subtitle = "3 recordings", + onClick = {}, + leadingContent = { MenuIcon(R.drawable.stream_design_ic_record_library_fill) }, + ) + StreamListItem(title = "Stats", onClick = { + }, enabled = false, leadingContent = { + MenuIcon( + R.drawable.stream_design_ic_stats_fill, + ) + }) + StreamListItem(title = "A very long title that does not fit on a single line of the sheet") + } +} + +@Composable +private fun MenuIcon(id: Int) { + Icon( + painter = painterResource(id), + contentDescription = null, + modifier = Modifier.size(StreamTokens.iconSizeMd), + ) +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamScrimPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamScrimPreview.kt new file mode 100644 index 00000000000..2a4e9cecc68 --- /dev/null +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamScrimPreview.kt @@ -0,0 +1,47 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +@Preview +@Composable +private fun StreamScrimRootPreview() { + VideoTheme { + StreamScrimPreview() + } +} + +/** + * The scrim over a menu, to show how much it dims the content behind it. + */ +@Composable +internal fun StreamScrimPreview() { + Box(modifier = Modifier.fillMaxSize()) { + Box(modifier = Modifier.padding(StreamTokens.spacingMd)) { + StreamListItemsPreview() + } + StreamScrim(onClick = {}) + } +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamTextFieldPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamTextFieldPreview.kt new file mode 100644 index 00000000000..f7895c69f66 --- /dev/null +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/base/StreamTextFieldPreview.kt @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.tooling.preview.Preview +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +@Preview +@Composable +private fun StreamTextFieldRootPreview() { + VideoTheme { + StreamTextFieldPreview() + } +} + +/** + * The text field states: empty with placeholder, with icons, filled, disabled, error and multi line. + */ +@Composable +internal fun StreamTextFieldPreview() { + val icon = painterResource(R.drawable.stream_design_ic_search) + Column( + modifier = Modifier.padding(StreamTokens.spacingMd), + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingMd), + ) { + StreamTextField(value = TextFieldValue(""), onValueChange = {}, placeholder = "Call ID") + StreamTextField(value = TextFieldValue(""), onValueChange = { + }, placeholder = "Call ID", leadingIcon = icon) + StreamTextField( + value = TextFieldValue("xStream-sync"), + onValueChange = {}, + trailingIcon = icon, + ) + StreamTextField(value = TextFieldValue(""), onValueChange = { + }, placeholder = "Call ID", enabled = false) + StreamTextField( + value = TextFieldValue("xStream-sync"), + onValueChange = {}, + errorText = "Incorrect Call ID. Try again.", + ) + StreamTextField(value = TextFieldValue(""), onValueChange = { + }, placeholder = "Message", minLines = 4) + } +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContentPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContentPreview.kt index c0a44e2f90b..5208eb2c23e 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContentPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContentPreview.kt @@ -32,15 +32,6 @@ private fun AudioCallContentRootPreview() { } } -@Preview -@Composable -private fun AudioCallContentWithoutHeaderRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - AudioCallContentWithoutHeaderPreview() - } -} - @Preview @Composable private fun AudioOnlyCallContentRootPreview() { @@ -50,15 +41,6 @@ private fun AudioOnlyCallContentRootPreview() { } } -@Preview -@Composable -private fun AudioOnlyCallContentWithoutHeaderRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - AudioOnlyCallContentWithoutHeaderPreview() - } -} - @Composable internal fun AudioCallContentPreview() { AudioCallContent( @@ -68,15 +50,6 @@ internal fun AudioCallContentPreview() { ) } -@Composable -internal fun AudioCallContentWithoutHeaderPreview() { - AudioCallContent( - call = previewCall, - isMicrophoneEnabled = false, - isShowingHeader = false, - ) -} - @Composable internal fun AudioOnlyCallContentPreview() { AudioOnlyCallContent( @@ -85,12 +58,3 @@ internal fun AudioOnlyCallContentPreview() { durationPlaceholder = "11:45", ) } - -@Composable -internal fun AudioOnlyCallContentWithoutHeaderPreview() { - AudioOnlyCallContent( - call = previewCall, - isMicrophoneEnabled = false, - isShowingHeader = false, - ) -} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActionsPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActionsPreview.kt new file mode 100644 index 00000000000..914bbece822 --- /dev/null +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActionsPreview.kt @@ -0,0 +1,58 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.call.controls.actions + +import androidx.compose.foundation.layout.Row +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize + +@Preview +@Composable +private fun ToggleActionInProgressRootPreview() { + VideoTheme { + ToggleActionInProgressPreview() + } +} + +/** + * A pending toggle in both states next to a plain action, in every button size. + */ +@Composable +internal fun ToggleActionInProgressPreview() { + val icon = painterResource(R.drawable.stream_design_ic_caption_fill) + Row { + StreamButtonSize.entries.forEach { size -> + ToggleAction( + isActionActive = true, + iconOnOff = Pair(icon, icon), + progress = true, + size = size, + ) {} + ToggleAction( + isActionActive = false, + iconOnOff = Pair(icon, icon), + progress = true, + size = size, + ) {} + GenericAction(icon = icon, size = size) {} + } + } +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallActionPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleActionPreview.kt similarity index 74% rename from stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallActionPreview.kt rename to stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleActionPreview.kt index 3408e20c79f..680dc2342a0 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallActionPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleActionPreview.kt @@ -16,19 +16,25 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions +import androidx.compose.foundation.layout.Row import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import io.getstream.video.android.compose.theme.VideoTheme @Preview @Composable -private fun CancelCallActionRootPreview() { +private fun ScreenShareToggleActionRootPreview() { VideoTheme { - CancelCallActionPreview() + ScreenShareToggleActionPreview() } } @Composable -internal fun CancelCallActionPreview() { - CancelCallAction(onCallAction = {}) +internal fun ScreenShareToggleActionPreview() { + Row { + ScreenShareToggleAction(active = false) { + } + ScreenShareToggleAction(active = true) { + } + } } diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideoPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideoPreview.kt index 95e0616a7a9..be6e8694ce9 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideoPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideoPreview.kt @@ -33,15 +33,6 @@ import io.getstream.video.android.mock.previewCall import io.getstream.video.android.mock.previewParticipant import io.getstream.video.android.mock.previewParticipantsList -@Preview -@Composable -private fun CallParticipantLocalRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - CallParticipantLocalPreview() - } -} - @Preview @Composable private fun CallParticipantRemoteRootPreview() { @@ -51,15 +42,6 @@ private fun CallParticipantRemoteRootPreview() { } } -@Composable -internal fun CallParticipantLocalPreview() { - ParticipantVideo( - call = previewCall, - participant = previewParticipantsList[0], - style = RegularVideoRendererStyle(isFocused = true), - ) -} - @Composable internal fun CallParticipantRemotePreview() { ParticipantVideo( diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeScreenSharingVideoRendererPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeScreenSharingVideoRendererPreview.kt index 6bf7b68a6bd..d91341e508c 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeScreenSharingVideoRendererPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeScreenSharingVideoRendererPreview.kt @@ -44,14 +44,6 @@ private fun LandscapeScreenSharingContentRootPreview() { widthDp = 1440, heightDp = 720, ) -@Composable -private fun LandscapeScreenSharingMyContentRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - LandscapeScreenSharingMyContentPreview() - } -} - @Composable internal fun LandscapeScreenSharingContentPreview() { LandscapeScreenSharingVideoRenderer( @@ -63,6 +55,14 @@ internal fun LandscapeScreenSharingContentPreview() { ) } +@Composable +private fun LandscapeScreenSharingMyContentRootPreview() { + StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) + VideoTheme { + LandscapeScreenSharingMyContentPreview() + } +} + @Composable internal fun LandscapeScreenSharingMyContentPreview() { LandscapeScreenSharingVideoRenderer( diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererPreview.kt index 62bd4f814f7..4205850e0da 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererPreview.kt @@ -76,21 +76,17 @@ private fun LandscapeParticipantsRootPreview5() { } } -@Preview(device = Devices.AUTOMOTIVE_1024p, widthDp = 1440, heightDp = 720) @Composable -private fun LandscapeParticipantsRootPreview6() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - LandscapeParticipantsPreview6() - } +internal fun LandscapeParticipantsPreview5() { + LandscapeParticipants(participantCount = 5) } @Preview(device = Devices.AUTOMOTIVE_1024p, widthDp = 1440, heightDp = 720) @Composable -private fun LandscapeParticipantsRootPreview7() { +private fun LandscapeParticipantsRootPreview6() { StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) VideoTheme { - LandscapeParticipantsPreview7() + LandscapeParticipantsPreview6() } } @@ -114,21 +110,11 @@ internal fun LandscapeParticipantsPreview4() { LandscapeParticipants(participantCount = 4) } -@Composable -internal fun LandscapeParticipantsPreview5() { - LandscapeParticipants(participantCount = 5) -} - @Composable internal fun LandscapeParticipantsPreview6() { LandscapeParticipants(participantCount = 6) } -@Composable -internal fun LandscapeParticipantsPreview7() { - LandscapeParticipants(participantCount = 7) -} - @Composable private fun LandscapeParticipants(participantCount: Int) { val gridCall = remember(participantCount) { previewGridCall(participantCount) } @@ -148,3 +134,17 @@ private fun LandscapeParticipants(participantCount: Int) { ) } } + +@Preview(device = Devices.AUTOMOTIVE_1024p, widthDp = 1440, heightDp = 720) +@Composable +private fun LandscapeParticipantsRootPreview7() { + StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) + VideoTheme { + LandscapeParticipantsPreview7() + } +} + +@Composable +internal fun LandscapeParticipantsPreview7() { + LandscapeParticipants(participantCount = 7) +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitScreenSharingVideoRendererPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitScreenSharingVideoRendererPreview.kt index 6d7ae5d0520..acadb90e293 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitScreenSharingVideoRendererPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitScreenSharingVideoRendererPreview.kt @@ -36,15 +36,6 @@ private fun PortraitScreenSharingContentRootPreview() { } } -@Preview -@Composable -private fun PortraitScreenSharingMyContentRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - PortraitScreenSharingMyContentPreview() - } -} - @Composable internal fun PortraitScreenSharingContentPreview() { PortraitScreenSharingVideoRenderer( @@ -56,6 +47,15 @@ internal fun PortraitScreenSharingContentPreview() { ) } +@Preview +@Composable +private fun PortraitScreenSharingMyContentRootPreview() { + StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) + VideoTheme { + PortraitScreenSharingMyContentPreview() + } +} + @Composable internal fun PortraitScreenSharingMyContentPreview() { PortraitScreenSharingVideoRenderer( diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererPreview.kt index 03538674b53..8f554cde218 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererPreview.kt @@ -75,21 +75,17 @@ private fun PortraitParticipantsRootPreview5() { } } -@Preview @Composable -private fun PortraitParticipantsRootPreview6() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - PortraitParticipantsPreview6() - } +internal fun PortraitParticipantsPreview5() { + PortraitParticipants(participantCount = 5) } @Preview @Composable -private fun PortraitParticipantsRootPreview7() { +private fun PortraitParticipantsRootPreview6() { StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) VideoTheme { - PortraitParticipantsPreview7() + PortraitParticipantsPreview6() } } @@ -113,21 +109,11 @@ internal fun PortraitParticipantsPreview4() { PortraitParticipants(participantCount = 4) } -@Composable -internal fun PortraitParticipantsPreview5() { - PortraitParticipants(participantCount = 5) -} - @Composable internal fun PortraitParticipantsPreview6() { PortraitParticipants(participantCount = 6) } -@Composable -internal fun PortraitParticipantsPreview7() { - PortraitParticipants(participantCount = 7) -} - @Composable private fun PortraitParticipants(participantCount: Int) { val gridCall = remember(participantCount) { previewGridCall(participantCount) } @@ -147,3 +133,17 @@ private fun PortraitParticipants(participantCount: Int) { ) } } + +@Preview +@Composable +private fun PortraitParticipantsRootPreview7() { + StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) + VideoTheme { + PortraitParticipantsPreview7() + } +} + +@Composable +internal fun PortraitParticipantsPreview7() { + PortraitParticipants(participantCount = 7) +} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallDetailsPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallDetailsPreview.kt index 097563d1567..6be0460f9c1 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallDetailsPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallDetailsPreview.kt @@ -23,20 +23,6 @@ import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewMemberListState -@Preview -@Composable -private fun IncomingCallDetailsVideoRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - IncomingCallDetailsVideoPreview() - } -} - -@Composable -internal fun IncomingCallDetailsVideoPreview() { - IncomingCallDetails(participants = previewMemberListState) -} - @Preview @Composable private fun IncomingCallDetailsAudioRootPreview() { diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallContentPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallContentPreview.kt index 5c7393aaf02..4c6ba23d51c 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallContentPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallContentPreview.kt @@ -80,20 +80,3 @@ internal fun OutgoingCallContentMinimumVideoPreview() { isVideoType = true, ) } - -@Preview -@Composable -private fun OutgoingCallContentMinimumAudioRootPreview() { - StreamPreviewDataUtils.initializeStreamVideo(LocalContext.current) - VideoTheme { - OutgoingCallContentMinimumAudioPreview() - } -} - -@Composable -internal fun OutgoingCallContentMinimumAudioPreview() { - OutgoingCallContent( - call = previewCall, - isVideoType = false, - ) -} diff --git a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatarsPreview.kt b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatarsPreview.kt index 1205ee05cdc..7b2411f4797 100644 --- a/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatarsPreview.kt +++ b/stream-video-android-ui-compose/src/debug/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatarsPreview.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.tooling.preview.Preview import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.mock.StreamPreviewDataUtils import io.getstream.video.android.mock.previewMemberListState +import io.getstream.video.android.mock.previewTwoMembers @Preview @Composable @@ -36,3 +37,19 @@ private fun ParticipantAvatarsRootPreview() { internal fun ParticipantAvatarsPreview() { ParticipantAvatars(members = previewMemberListState) } + +@Composable +internal fun ParticipantAvatarsOneMemberPreview() { + ParticipantAvatars(members = previewMemberListState.take(1)) +} + +@Composable +internal fun ParticipantAvatarsTwoMembersPreview() { + ParticipantAvatars(members = previewTwoMembers) +} + +@Suppress("DEPRECATION") +@Composable +internal fun ParticipantAvatarsDeprecatedOverloadPreview() { + ParticipantAvatars(participants = previewMemberListState) +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactory.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactory.kt index e43a76a526b..1496cad6432 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactory.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactory.kt @@ -31,6 +31,7 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.getstream.video.android.compose.theme.design.StreamTokens +import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.compose.ui.components.avatar.UserAvatarBackground import io.getstream.video.android.compose.ui.components.call.DefaultCallAppBarCenterContent import io.getstream.video.android.compose.ui.components.call.DefaultCallAppBarLeadingContent @@ -325,6 +326,21 @@ public interface VideoComponentFactory { ) } + /** + * The avatar of a user, shown in participant lists, ringing screens and video fallbacks. + * + * @param params Parameters for this component. + */ + @Composable + public fun UserAvatar(params: UserAvatarParams) { + UserAvatar( + modifier = params.modifier, + userImage = params.userImage, + userName = params.userName, + isShowingOnlineIndicator = params.isShowingOnlineIndicator, + ) + } + /** * Content shown when the participant video track fails to load or is not available. * The default implementation renders the participant's avatar. diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactoryParams.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactoryParams.kt index 9418a3e167f..a8ff2e5eca7 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactoryParams.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/theme/VideoComponentFactoryParams.kt @@ -242,6 +242,21 @@ public data class ParticipantVideoConnectionIndicatorContentParams( val networkQuality: NetworkQuality, ) +/** + * Parameters for [VideoComponentFactory.UserAvatar]. + * + * @param userImage The URL of the user image, or null to show the initials of [userName]. + * @param userName The name whose initials are the fallback, or null for no fallback. + * @param modifier The modifier applied to the avatar. The avatar fills the size the modifier gives it. + * @param isShowingOnlineIndicator Whether the online indicator is drawn over the avatar. + */ +public data class UserAvatarParams( + val userImage: String?, + val userName: String?, + val modifier: Modifier = Modifier, + val isShowingOnlineIndicator: Boolean = false, +) + /** * Parameters for [VideoComponentFactory.ParticipantVideoFallbackContent]. * diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/StreamCallActivityComposeDelegate.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/StreamCallActivityComposeDelegate.kt index 36d9f08dfb0..ab172dbc5ad 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/StreamCallActivityComposeDelegate.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/StreamCallActivityComposeDelegate.kt @@ -27,16 +27,14 @@ import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope -import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.systemBarsPadding import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Icon import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.SignalWifiBad import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue @@ -47,13 +45,10 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterHorizontally import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle import io.getstream.android.video.generated.models.OwnCapability import io.getstream.log.taggedLogger @@ -62,10 +57,10 @@ import io.getstream.video.android.compose.permission.LaunchPermissionRequest import io.getstream.video.android.compose.theme.DefaultVideoComponentFactory import io.getstream.video.android.compose.theme.VideoComponentFactory import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamDialogPositiveNegative -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamDialogStyles -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamDialog +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.CallAppBar import io.getstream.video.android.compose.ui.components.call.activecall.CallContent import io.getstream.video.android.compose.ui.components.call.ringing.RingingCallContent @@ -219,7 +214,7 @@ public open class StreamCallActivityComposeDelegate : StreamCallActivityComposeU ) { Icon( tint = VideoTheme.colors.textPrimary, - imageVector = Icons.Default.SignalWifiBad, + painter = painterResource(R.drawable.stream_design_ic_exclamation_triangle_fill), contentDescription = null, ) Text( @@ -605,53 +600,38 @@ public open class StreamCallActivityComposeDelegate : StreamCallActivityComposeU .background(VideoTheme.colors.backgroundCoreElevation1), ) { // Proceed as normal - StreamDialogPositiveNegative( - content = { - Text( - text = stringResource( - id = R.string.stream_default_call_ui_permissions_rationale_title, - ), - style = TextStyle( - fontSize = 24.sp, - lineHeight = 28.sp, - fontWeight = FontWeight(500), - color = VideoTheme.colors.textPrimary, - textAlign = TextAlign.Center, - ), - ) - Spacer(modifier = Modifier.size(8.dp)) - Text( - text = stringResource( - id = R.string.stream_default_call_ui_permission_rationale, - ), - style = TextStyle( - fontSize = 16.sp, - lineHeight = 18.5.sp, - fontWeight = FontWeight(400), - color = VideoTheme.colors.textSecondary, - textAlign = TextAlign.Center, - ), - ) - }, - style = StreamDialogStyles.defaultDialogStyle(), - positiveButton = Triple( - stringResource(id = R.string.stream_default_call_ui_settings_button), - ButtonStyles.secondaryButtonStyle(StyleSize.S), - ) { - val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { - data = Uri.fromParts("package", packageName, null) - } - startActivity(intent) - }, - negativeButton = Triple( - stringResource(id = R.string.stream_default_call_ui_not_now_button), - ButtonStyles.tertiaryButtonStyle(StyleSize.S), - ) { - // No permissions, leave the call - updateRenderPermissionUi(false) - onCallAction(call, LeaveCall) - }, - ) + StreamDialog( + onDismissRequest = {}, + title = stringResource( + id = R.string.stream_default_call_ui_permissions_rationale_title, + ), + message = stringResource(id = R.string.stream_default_call_ui_permission_rationale), + dismissOnBackPress = false, + dismissOnClickOutside = false, + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + val intent = Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS).apply { + data = Uri.fromParts("package", packageName, null) + } + startActivity(intent) + }, + text = stringResource(id = R.string.stream_default_call_ui_settings_button), + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { + // No permissions, leave the call + updateRenderPermissionUi(false) + onCallAction(call, LeaveCall) + }, + text = stringResource(id = R.string.stream_default_call_ui_not_now_button), + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } } } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/AudioControlActions.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/AudioControlActions.kt index 417335f623e..b1d202359b4 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/AudioControlActions.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/AudioControlActions.kt @@ -19,8 +19,6 @@ package io.getstream.video.android.compose.ui.components.audio import androidx.activity.ComponentActivity import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ExitToApp import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -29,11 +27,13 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleMicrophoneAction import io.getstream.video.android.core.Call import io.getstream.video.android.core.CallLeaveReason @@ -59,12 +59,12 @@ public fun AudioControlActions( call.microphone.isEnabled.collectAsStateWithLifecycle() } val activity = LocalContext.current as? ComponentActivity - StreamButton( + StreamTextButton( text = stringResource( id = io.getstream.video.android.ui.common.R.string.stream_video_audio_leave, ), - icon = Icons.Default.ExitToApp, - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), + leadingIcon = painterResource(R.drawable.stream_design_ic_leave), + style = StreamButtonStyleDefaults.secondarySolid, onClick = { onLeaveRoom?.invoke() ?: let { call.leave( diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/ParticipantAudio.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/ParticipantAudio.kt index 71140f6679d..ee78c4bd45b 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/ParticipantAudio.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/audio/ParticipantAudio.kt @@ -33,22 +33,22 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Icon import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.MicOff import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.theme.UserAvatarParams import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.core.ParticipantState /** @@ -82,12 +82,14 @@ public fun ParticipantAudio( verticalArrangement = Arrangement.Center, ) { Box(modifier = Modifier.fillMaxSize()) { - UserAvatar( - modifier = Modifier - .fillMaxSize() - .padding(StreamTokens.spacingMd), - userImage = userImage, - userName = nameOrId, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = userImage, + userName = nameOrId, + modifier = Modifier + .fillMaxSize() + .padding(StreamTokens.spacingMd), + ), ) if (isSpeaking && style.isShowingSpeakingBorder) { @@ -157,7 +159,7 @@ private fun BoxScope.DefaultMicrophoneIndicator( Icon( modifier = Modifier.align(alignment).fillMaxSize().padding(StreamTokens.spacingXs), - imageVector = Icons.Default.MicOff, + painter = painterResource(R.drawable.stream_design_ic_voice_off_fill), tint = VideoTheme.colors.accentError, contentDescription = null, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/Avatar.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/Avatar.kt index 531b2ab1da8..673f3475018 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/Avatar.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/Avatar.kt @@ -18,6 +18,7 @@ package io.getstream.video.android.compose.ui.components.avatar import androidx.annotation.DrawableRes import androidx.compose.foundation.Image +import androidx.compose.foundation.border import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource import androidx.compose.foundation.layout.fillMaxSize @@ -33,34 +34,20 @@ import androidx.compose.ui.platform.LocalInspectionMode import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.IntSize -import androidx.compose.ui.unit.dp import com.skydoves.landscapist.ImageOptions import com.skydoves.landscapist.animation.crossfade.CrossfadePlugin import com.skydoves.landscapist.coil.CoilImage import com.skydoves.landscapist.components.rememberImageComponent import com.skydoves.landscapist.placeholder.placeholder.PlaceholderPlugin import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens /** - * An avatar that renders an image or a fallback text. In case the image URL - * is empty or there was an error loading the image, it falls back to showing initials. - * If needed, the initials font size is gradually decreased automatically until the text fits within the avatar boundaries. + * Loads the [imageUrl] into a clipped image with a subtle border, and falls back to an + * [InitialsAvatar] built from [fallbackText] when there is no image or loading fails. * - * @param modifier Modifier used for styling. - * @param imageUrl The URL of the image to be displayed. - * @param fallbackText The fallback text to be used for the initials avatar. - * @param shape The shape of the avatar. - * @param imageScale The scale rule used for the image. - * @param imageDescription Accessibility description for the image. - * @param imageRequestSize The image size to be requested. - * @param loadingPlaceholder Placeholder image to be displayed while loading the remote image. - * @param previewModePlaceholder Placeholder image to be displayed in Compose previews (IDE). - * @param textStyle The text style of the [fallbackText] text. The `fontSize`, `fontFamily` and `fontWeight` properties are used. - * If the font size is too large, it will be gradually decreased automatically. - * @param textOffset Offset to be applied to the initials text. - * @param onClick Handler to be called when the user clicks on the avatar. + * In inspection mode the image is replaced with [previewModePlaceholder]. */ @Composable internal fun Avatar( @@ -73,15 +60,15 @@ internal fun Avatar( imageRequestSize: IntSize = IntSize(DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE), @DrawableRes loadingPlaceholder: Int? = LocalAvatarPreviewProvider.getLocalAvatarLoadingPlaceholder(), @DrawableRes previewModePlaceholder: Int = LocalAvatarPreviewProvider.getLocalAvatarPreviewPlaceholder(), - textStyle: TextStyle = VideoTheme.typography.headingLarge, - textOffset: DpOffset = DpOffset(0.dp, 0.dp), + textStyle: TextStyle? = null, onClick: (() -> Unit)? = null, ) { if (LocalInspectionMode.current && !imageUrl.isNullOrEmpty()) { Image( modifier = modifier .fillMaxSize() - .clip(CircleShape) + .avatarBorder(shape) + .clip(shape) .testTag("avatar"), painter = painterResource(id = previewModePlaceholder), contentScale = ContentScale.Crop, @@ -95,7 +82,6 @@ internal fun Avatar( modifier = modifier, text = fallbackText, textStyle = textStyle, - textOffset = textOffset, shape = shape, ) return @@ -112,7 +98,7 @@ internal fun Avatar( } CoilImage( - modifier = clickableModifier.clip(shape), + modifier = clickableModifier.avatarBorder(shape).clip(shape), imageModel = { imageUrl }, imageOptions = ImageOptions( contentDescription = imageDescription, @@ -131,11 +117,14 @@ internal fun Avatar( modifier = modifier, text = fallbackText.orEmpty(), textStyle = textStyle, - textOffset = textOffset, shape = shape, ) }, ) } +@Composable +private fun Modifier.avatarBorder(shape: Shape): Modifier = + border(StreamTokens.strokeW100, VideoTheme.colors.borderCoreOpacitySubtle, shape) + internal const val DEFAULT_IMAGE_SIZE = -1 diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/InitialsAvatar.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/InitialsAvatar.kt index 0af081abf3e..733130575ea 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/InitialsAvatar.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/InitialsAvatar.kt @@ -16,79 +16,68 @@ package io.getstream.video.android.compose.ui.components.avatar -import android.util.Log import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.BoxWithConstraints import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.offset -import androidx.compose.foundation.layout.widthIn import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue +import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip -import androidx.compose.ui.draw.drawWithContent import androidx.compose.ui.graphics.Shape import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.unit.DpOffset -import androidx.compose.ui.unit.dp +import androidx.compose.ui.unit.Dp import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.utils.initialsColors import io.getstream.video.android.core.utils.initials /** - * Represents a special avatar case when we need to show the initials instead of an image. Usually happens when there - * are no images to show in the avatar. + * An avatar showing the initials of [text] on the avatar background color. * - * @param text The initials to show. - * @param modifier Modifier for styling. - * @param shape The shape of the avatar. - * @param textStyle The [TextStyle] that will be used for the initials. - * @param textOffset The initials offset to apply to the avatar. - * @param initialsTransformer A custom transformer to tweak initials. + * @param modifier The modifier applied to the avatar. The avatar is square, so one dimension is enough. + * @param text The text the initials are taken from, usually the user name. + * @param textStyle The typography of the initials, or null to pick one from the avatar size. + * @param shape The shape the avatar is clipped to. + * @param initialsTransformer Maps [text] to the initials that are drawn. */ @Composable internal fun InitialsAvatar( modifier: Modifier = Modifier, text: String, - textStyle: TextStyle = VideoTheme.typography.headingLarge, - textOffset: DpOffset = DpOffset(0.dp, 0.dp), + textStyle: TextStyle? = null, shape: Shape = CircleShape, initialsTransformer: (String) -> String = { it.initials() }, ) { - val colors = initialsColors(text = text) - var fontSize by remember { mutableStateOf(textStyle.fontSize) } - var readyToDrawText by remember { mutableStateOf(false) } - - Box( + BoxWithConstraints( modifier = modifier - .widthIn(StreamTokens.size8, 100.dp) .aspectRatio(1f) .clip(shape) - .background(color = colors.second), + .background(color = VideoTheme.colors.avatarBgDefault), + contentAlignment = Alignment.Center, ) { Text( - modifier = Modifier - .align(Alignment.Center) - .offset(textOffset.x, textOffset.y) - .drawWithContent { if (readyToDrawText) drawContent() }, - text = initialsTransformer.invoke(text), - fontSize = fontSize, - style = textStyle.copy(color = colors.first), - onTextLayout = { layoutResult -> - Log.d("InitialsAvatar", "fontSize: $fontSize") - if (layoutResult.didOverflowWidth || layoutResult.didOverflowHeight) { - fontSize *= 0.37 - } else { - readyToDrawText = true - } - }, + text = initialsTransformer(text), + style = textStyle ?: maxWidth.toAvatarTextStyle(), + color = VideoTheme.colors.avatarTextDefault, + maxLines = 1, ) } } + +/** + * Picks the initials typography for an avatar of this size. + */ +@Composable +@ReadOnlyComposable +internal fun Dp.toAvatarTextStyle(): TextStyle { + val typography = VideoTheme.typography + return when { + this < StreamTokens.size24 -> typography.metadataEmphasis + this < StreamTokens.size32 -> typography.captionEmphasis + this < StreamTokens.size48 -> typography.bodyEmphasis + this < StreamTokens.size80 -> typography.headingLarge + else -> typography.numericExtraLarge + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/OnlineIndicator.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/OnlineIndicator.kt index fd6619dcf76..3b5cf92a9cd 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/OnlineIndicator.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/OnlineIndicator.kt @@ -23,22 +23,21 @@ import androidx.compose.foundation.layout.size import androidx.compose.foundation.shape.CircleShape import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens /** - * Component that represents an online indicator to be used with - * [UserAvatar]. + * A small dot that marks a user as online, drawn over an avatar. * - * @param modifier Modifier for styling. + * @param modifier The modifier applied to the indicator. */ @Composable public fun OnlineIndicator(modifier: Modifier = Modifier) { Box( modifier = modifier - .size(12.dp) - .background(VideoTheme.colors.backgroundCoreApp, CircleShape) - .padding(2.dp) - .background(VideoTheme.colors.accentSuccess, CircleShape), + .size(StreamTokens.size12) + .background(VideoTheme.colors.avatarPresenceBorder, CircleShape) + .padding(StreamTokens.strokeW200) + .background(VideoTheme.colors.avatarPresenceBgOnline, CircleShape), ) } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatar.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatar.kt index 88e6ebe55c5..5faf022a03a 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatar.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatar.kt @@ -27,17 +27,13 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.platform.testTag import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.IntSize -import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.components.participants.ParticipantAvatars import io.getstream.video.android.model.User /** * Component that renders an image or a name as an avatar. If the image is `null` or unavailable, it uses the name initials. * Can also show an "is online" indicator. - * If needed, the initials font size is gradually decreased automatically until the text fits within the avatar boundaries. * * @param modifier Modifier used for styling. * @param userImage The URL of the image to be displayed. Usually [User.image]. @@ -48,9 +44,7 @@ import io.getstream.video.android.model.User * @param imageRequestSize The image size to be requested. Original size by default. * @param loadingPlaceholder Placeholder image to be displayed while loading the remote image. * @param previewModePlaceholder Placeholder image to be displayed in Compose previews (IDE). - * @param textStyle The [TextStyle] to be used for the initials text. The `fontSize`, `fontFamily` and `fontWeight` properties are used. - * If the font size is too large, it will be gradually decreased automatically. - * @param textOffset Offset to be applied to the initials text. + * @param textStyle The typography of the initials fallback, or null to pick one from the avatar size. * @param isShowingOnlineIndicator Flag used to display/hide the "is online" indicator. `False` by default. * @param onlineIndicatorAlignment Alignment of the "is online" indicator. `TopEnd` by default. * @param onlineIndicator A custom composable to represent the "is online" indicator. [DefaultOnlineIndicator] by default. @@ -70,8 +64,7 @@ public fun UserAvatar( imageRequestSize: IntSize = IntSize(DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE), @DrawableRes loadingPlaceholder: Int? = LocalAvatarPreviewProvider.getLocalAvatarLoadingPlaceholder(), @DrawableRes previewModePlaceholder: Int = LocalAvatarPreviewProvider.getLocalAvatarPreviewPlaceholder(), - textStyle: TextStyle = VideoTheme.typography.headingLarge, - textOffset: DpOffset = DpOffset(0.dp, 0.dp), + textStyle: TextStyle? = null, isShowingOnlineIndicator: Boolean = false, onlineIndicatorAlignment: OnlineIndicatorAlignment = OnlineIndicatorAlignment.TopEnd, onlineIndicator: @Composable BoxScope.() -> Unit = { @@ -93,7 +86,6 @@ public fun UserAvatar( loadingPlaceholder = loadingPlaceholder, previewModePlaceholder = previewModePlaceholder, textStyle = textStyle, - textOffset = textOffset, onClick = onClick, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatarBackground.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatarBackground.kt index 0a3c5a6ea94..57d9b0fa02a 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatarBackground.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/avatar/UserAvatarBackground.kt @@ -28,10 +28,8 @@ import androidx.compose.ui.graphics.Shape import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.text.TextStyle import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.DpOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.model.User /** @@ -47,9 +45,7 @@ import io.getstream.video.android.model.User * @param imageRequestSize The image size to be requested. Original size by default. * @param loadingPlaceholder Placeholder image to be displayed while loading the remote image. * @param previewModePlaceholder Placeholder image to be displayed in Compose previews (IDE). - * @param textStyle The [TextStyle] to be used for the initials text fallback. The `fontSize`, `fontFamily` and `fontWeight` properties are used. - * If the font size is too large, it will be gradually decreased automatically. - * @param textOffset Offset to be applied to the initials text. + * @param textStyle The typography of the initials fallback, or null to pick one from the avatar size. * * @see [UserAvatar] */ @@ -65,8 +61,7 @@ public fun UserAvatarBackground( imageRequestSize: IntSize = IntSize(DEFAULT_IMAGE_SIZE, DEFAULT_IMAGE_SIZE), @DrawableRes loadingPlaceholder: Int? = LocalAvatarPreviewProvider.getLocalAvatarLoadingPlaceholder(), @DrawableRes previewModePlaceholder: Int = LocalAvatarPreviewProvider.getLocalAvatarPreviewPlaceholder(), - textStyle: TextStyle = VideoTheme.typography.headingLarge, - textOffset: DpOffset = DpOffset(0.dp, 0.dp), + textStyle: TextStyle? = null, ) { Box(modifier = modifier.fillMaxSize()) { Box( @@ -84,7 +79,6 @@ public fun UserAvatarBackground( loadingPlaceholder = loadingPlaceholder, previewModePlaceholder = previewModePlaceholder, textStyle = textStyle, - textOffset = textOffset, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Badge.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Badge.kt index 538f9904628..89642cfa8a9 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Badge.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Badge.kt @@ -19,54 +19,57 @@ package io.getstream.video.android.compose.ui.components.base import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.requiredWidthIn -import androidx.compose.foundation.layout.wrapContentSize import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag -import androidx.compose.ui.unit.dp import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.BadgeStyle +import io.getstream.video.android.compose.theme.design.StreamTokens +/** + * Overlays a count badge on the top end corner of [content]. + * + * @param modifier The modifier applied to the box that holds the content and the badge. + * @param text The badge label, usually a count, or null for a badge without a label. + * @param showWithoutValue Whether an empty badge is shown when [text] is null. + * @param content The content decorated by the badge. It receives the modifier to apply to its root. + */ @Composable public fun StreamBadgeBox( modifier: Modifier = Modifier, text: String? = null, showWithoutValue: Boolean = true, - style: BadgeStyle = VideoTheme.styles.badgeStyles.defaultBadgeStyle(), content: @Composable BoxScope.(Modifier) -> Unit, ) { Box(modifier = modifier) { content(modifier.testTag("Stream_ParticipantsMenuIcon")) - // Badge content if (text != null || showWithoutValue) { - BadgeContent(style = style, text = text) + Badge(text = text, modifier = Modifier.align(Alignment.TopEnd)) } } } @Composable -private fun BoxScope.BadgeContent(style: BadgeStyle, text: String? = null) { +private fun Badge(text: String?, modifier: Modifier = Modifier) { Box( - modifier = Modifier - .height(style.size) - .requiredWidthIn(min = style.size) - .align(Alignment.TopEnd) - .background(style.color, CircleShape), + modifier = modifier + .height(StreamTokens.size16) + .defaultMinSize(minWidth = StreamTokens.size16) + .background(VideoTheme.colors.badgeBgPrimary, CircleShape) + .padding(horizontal = StreamTokens.spacingXxs), + contentAlignment = Alignment.Center, ) { Text( - modifier = Modifier - .align(Alignment.Center) - .wrapContentSize() - .padding(horizontal = 4.dp) - .testTag("Stream_ParticipantsCountBadge"), - text = text ?: "", - style = style.textStyle, + modifier = Modifier.testTag("Stream_ParticipantsCountBadge"), + text = text.orEmpty(), + style = VideoTheme.typography.metadataEmphasis, + color = VideoTheme.colors.badgeTextOnAccent, + maxLines = 1, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Dialogs.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Dialogs.kt deleted file mode 100644 index 0f11d683aff..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/Dialogs.kt +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base - -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.size -import androidx.compose.foundation.layout.width -import androidx.compose.material.Icon -import androidx.compose.material.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.unit.dp -import androidx.compose.ui.window.Dialog -import androidx.compose.ui.window.DialogProperties -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.DialogStyle -import io.getstream.video.android.compose.ui.components.base.styling.StreamButtonStyle - -@Composable -public fun StreamDialog( - modifier: Modifier = Modifier, - onDismiss: () -> Unit = {}, - style: DialogStyle, - dialogProperties: DialogProperties = DialogProperties(), - content: @Composable BoxScope.() -> Unit, -): Unit = Dialog(onDismissRequest = onDismiss, dialogProperties) { - Box( - modifier = modifier - .clip(style.shape) - .background(color = style.backgroundColor, shape = style.shape) - .padding(style.contentPaddings), - contentAlignment = Alignment.Center, - ) { - content() - } -} - -@Composable -public fun StreamDialogPositiveNegative( - modifier: Modifier = Modifier, - onDismiss: () -> Unit = {}, - dialogProperties: DialogProperties = DialogProperties(), - style: DialogStyle = VideoTheme.styles.dialogStyles.defaultDialogStyle(), - title: String? = null, - icon: ImageVector? = null, - contentText: String? = null, - positiveButton: Triple Unit>? = null, - negativeButton: Triple Unit>? = null, - content: (@Composable () -> Unit)? = null, -): Unit = StreamDialog( - modifier = modifier, - style = style, - onDismiss = onDismiss, - dialogProperties = dialogProperties, -) { - Column(horizontalAlignment = Alignment.CenterHorizontally) { - Row( - modifier = Modifier.fillMaxWidth(), - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.Start, - ) { - icon?.let { - val iconStyle = style.iconStyle - Icon( - imageVector = icon, - contentDescription = "", - tint = iconStyle.color, - ) - Spacer(modifier = Modifier.width(iconStyle.padding.calculateTopPadding())) - } - title?.let { - Text(text = it, style = style.titleStyle) - } - } - Spacer(modifier = Modifier.size(8.dp)) - contentText?.let { - Text(text = it, style = style.contentTextStyle) - Spacer(modifier = Modifier.size(32.dp)) - } - content?.let { - content() - Spacer(modifier = Modifier.size(32.dp)) - } - val horizontalArr = if (negativeButton == null) { - Arrangement.End - } else { - Arrangement.SpaceBetween - } - Spacer(modifier = Modifier.size(8.dp)) - Row(modifier = Modifier.fillMaxWidth(), horizontalArrangement = horizontalArr) { - negativeButton?.let { - StreamButton( - modifier = Modifier.weight(1f), - text = it.first, - style = it.second, - onClick = it.third, - ) - Spacer(modifier = Modifier.size(16.dp)) - } - positiveButton?.let { - StreamButton( - modifier = Modifier.weight(1f), - text = it.first, - style = it.second, - onClick = it.third, - ) - } - } - } -} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/InputFields.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/InputFields.kt deleted file mode 100644 index afa338dcd2d..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/InputFields.kt +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base - -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.text.KeyboardActions -import androidx.compose.foundation.text.KeyboardOptions -import androidx.compose.material.Icon -import androidx.compose.material.OutlinedTextField -import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ErrorOutline -import androidx.compose.runtime.Composable -import androidx.compose.runtime.remember -import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.text.input.TextFieldValue -import androidx.compose.ui.text.input.VisualTransformation -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.TextFieldStyle -import io.getstream.video.android.compose.ui.components.base.styling.styleState - -@Composable -public fun StreamOutlinedTextField( - modifier: Modifier = Modifier, - value: TextFieldValue, - onValueChange: (TextFieldValue) -> Unit, - enabled: Boolean = true, - readOnly: Boolean = false, - style: TextFieldStyle, - placeholder: @Composable (() -> Unit)? = null, - isError: Boolean = false, - visualTransformation: VisualTransformation = VisualTransformation.None, - keyboardOptions: KeyboardOptions = KeyboardOptions.Default, - keyboardActions: KeyboardActions = KeyboardActions(), - singleLine: Boolean = false, - maxLines: Int = if (singleLine) 1 else Int.MAX_VALUE, - minLines: Int = 1, - leadingIcon: (@Composable () -> Unit)? = null, - trailingIcon: (@Composable () -> Unit)? = null, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, -): Unit = OutlinedTextField( - leadingIcon = leadingIcon, - trailingIcon = trailingIcon, - modifier = modifier, - enabled = enabled, - readOnly = readOnly, - placeholder = placeholder, - isError = isError, - visualTransformation = visualTransformation, - keyboardActions = keyboardActions, - keyboardOptions = keyboardOptions, - maxLines = maxLines, - minLines = minLines, - interactionSource = interactionSource, - shape = style.shape, - value = value, - colors = style.colors, - onValueChange = onValueChange, -) - -@Composable -public fun StreamTextField( - modifier: Modifier = Modifier, - value: TextFieldValue, - onValueChange: (TextFieldValue) -> Unit, - enabled: Boolean = true, - readOnly: Boolean = false, - style: TextFieldStyle = VideoTheme.styles.textFieldStyles.defaultTextField(), - placeholder: String? = null, - error: Boolean = false, - maxLines: Int = 1, - minLines: Int = 1, - icon: ImageVector? = null, - visualTransformation: VisualTransformation = VisualTransformation.None, - keyboardOptions: KeyboardOptions = KeyboardOptions.Default, - keyboardActions: KeyboardActions = KeyboardActions(), - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, -): Unit = StreamOutlinedTextField( - modifier = modifier, - enabled = enabled, - readOnly = readOnly, - placeholder = @Composable { - val textStyle = style.placeholderStyle.of( - state = styleState( - interactionSource = interactionSource, - enabled = enabled, - ), - ) - Text( - text = placeholder ?: "", - style = textStyle.value.platform, - ) - }, - leadingIcon = icon?.let { - @Composable { - val iconStyle = style.iconStyle.of( - state = styleState( - interactionSource = interactionSource, - enabled = enabled, - ), - ) - Icon(imageVector = it, contentDescription = it.name, tint = iconStyle.value.color) - } - }, - trailingIcon = error.takeIf { it }?.let { - @Composable { - Icon( - tint = style.colors.trailingIconColor(enabled = enabled, isError = true).value, - imageVector = Icons.Default.ErrorOutline, - contentDescription = Icons.Default.ErrorOutline.name, - ) - } - }, - style = style, - isError = error, - visualTransformation = visualTransformation, - keyboardActions = keyboardActions, - keyboardOptions = keyboardOptions, - singleLine = maxLines == 1, - maxLines = Math.max(minLines, maxLines), - minLines = minLines, - interactionSource = interactionSource, - value = value, - onValueChange = onValueChange, -) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamBottomSheet.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamBottomSheet.kt new file mode 100644 index 00000000000..2ca85c59472 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamBottomSheet.kt @@ -0,0 +1,150 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CornerSize +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Text +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ModalBottomSheet +import androidx.compose.material3.SheetState +import androidx.compose.material3.SheetValue +import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.runtime.Composable +import androidx.compose.runtime.saveable.rememberSaveable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.platform.LocalInspectionMode +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.semantics.testTagsAsResourceId +import androidx.compose.ui.text.style.TextAlign +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +/** + * A modal bottom sheet with rounded top corners, a drag handle and an optional centered title. + * + * @param onDismissRequest Called when the user dismisses the sheet by swiping, tapping the scrim or pressing back. + * @param modifier The modifier applied to the sheet. + * @param title The heading shown below the drag handle, or null for none. + * @param content The sheet content, laid out as a column below the header. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +internal fun StreamBottomSheet( + onDismissRequest: () -> Unit, + modifier: Modifier = Modifier, + title: String? = null, + content: @Composable ColumnScope.() -> Unit, +) { + ModalBottomSheet( + onDismissRequest = onDismissRequest, + // The sheet renders in its own window, so the app-level testTagsAsResourceId does not + // reach it; re-enable it here for UiAutomator access to the content tags. + modifier = modifier.semantics { testTagsAsResourceId = true }, + sheetState = rememberStreamSheetState(), + shape = SheetShape, + containerColor = VideoTheme.colors.backgroundCoreElevation1, + scrimColor = VideoTheme.colors.backgroundCoreScrim, + dragHandle = { SheetDragHandle() }, + ) { + title?.let { SheetTitle(text = it) } + content() + } +} + +@Composable +private fun SheetDragHandle() { + Box( + modifier = Modifier + .fillMaxWidth() + .padding(StreamTokens.spacingMd), + contentAlignment = Alignment.Center, + ) { + Box( + modifier = Modifier + .size(width = StreamTokens.size32, height = StreamTokens.size4) + .background( + color = VideoTheme.colors.accentNeutral, + shape = RoundedCornerShape(percent = 50), + ), + ) + } +} + +@Composable +private fun SheetTitle(text: String) { + Text( + text = text, + modifier = Modifier + .fillMaxWidth() + .padding( + start = StreamTokens.spacingSm, + end = StreamTokens.spacingSm, + bottom = StreamTokens.spacingSm, + ), + style = VideoTheme.typography.headingSmall, + color = VideoTheme.colors.textPrimary, + textAlign = TextAlign.Center, + ) +} + +/** + * Remembers a sheet state that starts expanded in inspection mode. + * + * A sheet that starts hidden animates in and snapshots blank, so previews and screenshot tests + * get a state that is already at its resting position. + */ +@OptIn(ExperimentalMaterial3Api::class) +@Composable +private fun rememberStreamSheetState(): SheetState { + if (!LocalInspectionMode.current) { + return rememberModalBottomSheetState() + } + val density = LocalDensity.current + val confirmValueChange: (SheetValue) -> Boolean = { true } + return rememberSaveable( + saver = SheetState.Saver( + skipPartiallyExpanded = false, + confirmValueChange = confirmValueChange, + density = density, + skipHiddenState = true, + ), + ) { + SheetState( + skipPartiallyExpanded = false, + density = density, + initialValue = SheetValue.PartiallyExpanded, + confirmValueChange = confirmValueChange, + skipHiddenState = true, + ) + } +} + +private val SheetShape = RoundedCornerShape( + topStart = StreamTokens.radius4xl, + topEnd = StreamTokens.radius4xl, + bottomStart = CornerSize(0), + bottomEnd = CornerSize(0), +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButton.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButton.kt index 13332b677b8..1b165bb36e0 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButton.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButton.kt @@ -16,350 +16,181 @@ package io.getstream.video.android.compose.ui.components.base -import androidx.annotation.DrawableRes -import androidx.compose.foundation.Image +import androidx.compose.foundation.background import androidx.compose.foundation.border +import androidx.compose.foundation.clickable import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.BoxScope -import androidx.compose.foundation.layout.RowScope -import androidx.compose.foundation.layout.Spacer -import androidx.compose.foundation.layout.aspectRatio -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.height -import androidx.compose.foundation.layout.requiredHeight -import androidx.compose.foundation.layout.requiredWidth -import androidx.compose.foundation.layout.width -import androidx.compose.material.Button -import androidx.compose.material.CircularProgressIndicator +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.Icon +import androidx.compose.material.LocalContentColor +import androidx.compose.material.LocalTextStyle import androidx.compose.material.Text +import androidx.compose.material.minimumInteractiveComponentSize +import androidx.compose.material.ripple import androidx.compose.runtime.Composable -import androidx.compose.runtime.State +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.state.ToggleableState +import androidx.compose.ui.draw.clip +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.semantics.Role import androidx.compose.ui.text.style.TextOverflow import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StreamButtonStyle -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.compose.ui.components.base.styling.styleState - -@Composable -public fun GenericStreamButton( - modifier: Modifier = Modifier, - onClick: () -> Unit, - enabled: Boolean = true, - style: StreamButtonStyle = ButtonStyles.primaryButtonStyle(), - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - content: @Composable RowScope.() -> Unit, -): Unit = Button( - interactionSource = interactionSource, - enabled = enabled, - modifier = modifier, - elevation = style.elevation, - shape = style.shape, - colors = style.colors, - border = style.border, - contentPadding = style.contentPadding, - onClick = onClick, - content = content, -) +/** + * A pill shaped button that hosts any content. + * + * The button reserves a 48dp touch target around its visual size, provides [LocalContentColor] + * with the [style] content color and [LocalTextStyle] with the body emphasis typography. + * + * @param onClick Called when the button is clicked. + * @param modifier The modifier applied to the touch target of the button. + * @param enabled Whether the button accepts clicks. Disabled buttons use the disabled colors of [style]. + * @param onClickLabel The accessibility label describing the click action. + * @param style The colors of the button. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param content The content of the button, centered inside the visual bounds. + */ @Composable public fun StreamButton( + onClick: () -> Unit, modifier: Modifier = Modifier, - icon: ImageVector? = null, - text: String, - textOverflow: TextOverflow = TextOverflow.Clip, - textMaxLines: Int = 1, enabled: Boolean = true, - showProgress: Boolean = false, - style: StreamButtonStyle = VideoTheme.styles.buttonStyles.primaryButtonStyle(), - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - onClick: () -> Unit = { }, -): Unit = GenericStreamButton( - modifier = modifier, - style = style, - onClick = onClick, - interactionSource = interactionSource, - enabled = enabled, + onClickLabel: String? = null, + style: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, + content: @Composable () -> Unit, ) { - val state = styleState(interactionSource, enabled) - icon?.let { - val iconStyle = style.iconStyle.of(state = state).value - Icon( - imageVector = icon, - contentDescription = "", - tint = iconStyle.color, - ) - Spacer(modifier = Modifier.width(iconStyle.padding.calculateTopPadding())) - } - val textStyle = style.textStyle.of(state = state) - Text( - text = text, - style = textStyle.value.platform, - maxLines = textMaxLines, - overflow = textOverflow, - ) - if (showProgress) { - CircularProgressIndicator( - color = textStyle.value.platform.color, - modifier = Modifier.height(StreamTokens.size8), + val containerColor = style.containerColor(enabled) + val borderColor = style.borderColor(enabled) + Box( + modifier = modifier + .minimumInteractiveComponentSize() + .defaultMinSize(minWidth = size.minimumSize, minHeight = size.minimumSize) + .clip(CircleShape) + .then(if (containerColor != null) Modifier.background(containerColor) else Modifier) + .then( + if (borderColor != null) { + Modifier.border(StreamTokens.strokeW100, borderColor, CircleShape) + } else { + Modifier + }, + ) + .clickable( + onClick = onClick, + onClickLabel = onClickLabel, + enabled = enabled, + role = Role.Button, + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(), + ), + contentAlignment = Alignment.Center, + ) { + CompositionLocalProvider( + LocalContentColor provides style.contentColor(enabled), + LocalTextStyle provides VideoTheme.typography.bodyEmphasis, + content = content, ) } } +/** + * A [StreamButton] with a single icon and no label. + * + * @param onClick Called when the button is clicked. + * @param icon The icon painted at the icon size of [size], tinted with the content color of [style]. + * @param contentDescription The accessibility description of the icon, or null when a parent describes it. + * @param modifier The modifier applied to the touch target of the button. + * @param enabled Whether the button accepts clicks. + * @param style The colors of the button. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + */ @Composable public fun StreamIconButton( + onClick: () -> Unit, + icon: Painter, + contentDescription: String?, modifier: Modifier = Modifier, - icon: ImageVector, - style: StreamFixedSizeButtonStyle, - onClick: () -> Unit = {}, enabled: Boolean = true, - showProgress: Boolean = false, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, + style: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, ) { - val state = styleState(interactionSource = interactionSource, enabled = enabled) - val iconStyle = style.iconStyle.of(state = state).value - - Button( - interactionSource = interactionSource, - enabled = enabled, - modifier = modifier - .requiredWidth(style.width) - .requiredHeight(style.height) - .aspectRatio(style.height / style.width), - elevation = style.elevation, - shape = style.shape, - colors = style.colors, - border = style.border, - contentPadding = iconStyle.padding, + StreamButton( onClick = onClick, + modifier = modifier, + enabled = enabled, + style = style, + size = size, ) { - if (showProgress) { - CircularProgressIndicator( - color = iconStyle.color, - ) - } else { - Icon( - tint = iconStyle.color, - imageVector = icon, - contentDescription = icon.name, - ) - } + Icon( + painter = icon, + contentDescription = contentDescription, + modifier = Modifier.size(size.iconSize), + ) } } +/** + * A [StreamButton] with a label and optional leading and trailing icons. + * + * @param onClick Called when the button is clicked. + * @param text The label of the button, kept on a single line. + * @param modifier The modifier applied to the touch target of the button. + * @param enabled Whether the button accepts clicks. + * @param style The colors of the button. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param leadingIcon The icon shown before the label, or null for none. + * @param trailingIcon The icon shown after the label, or null for none. + */ @Composable -public fun StreamDrawableButton( +public fun StreamTextButton( + onClick: () -> Unit, + text: String, modifier: Modifier = Modifier, - @DrawableRes drawable: Int, - style: StreamFixedSizeButtonStyle, enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - onClick: () -> Unit = {}, + style: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, + leadingIcon: Painter? = null, + trailingIcon: Painter? = null, ) { - val state = styleState(interactionSource = interactionSource, enabled = enabled) - val drawableStyle = style.drawableStyle.of(state = state).value - - Button( - interactionSource = interactionSource, - enabled = enabled, - modifier = modifier - .requiredWidth(style.width) - .requiredHeight(style.height) - .aspectRatio(style.height / style.width), - elevation = style.elevation, - shape = style.shape, - colors = style.colors, - border = style.border, - contentPadding = drawableStyle.padding, + StreamButton( onClick = onClick, + modifier = modifier, + enabled = enabled, + style = style, + size = size, ) { - Image( - painterResource(id = drawable), - contentDescription = null, - modifier = Modifier.fillMaxSize(), - contentScale = drawableStyle.scale, - alpha = drawableStyle.alpha, - colorFilter = drawableStyle.colorFilter, - ) - } -} - -@Composable -public fun GenericToggleButton( - modifier: Modifier = Modifier, - toggleState: State = rememberUpdatedState(newValue = ToggleableState(false)), - onClick: (ToggleableState) -> Unit = {}, - onContent: @Composable BoxScope.(onClick: (ToggleableState) -> Unit) -> Unit, - offContent: @Composable BoxScope.(onClick: (ToggleableState) -> Unit) -> Unit, -): Unit = Box(modifier = modifier) { - if (toggleState.value == ToggleableState.On) { - onContent(onClick) - } else { - offContent(onClick) - } -} - -@Composable -public fun StreamIconToggleButton( - modifier: Modifier = Modifier, - toggleState: State = rememberUpdatedState(newValue = ToggleableState(false)), - onIcon: ImageVector, - offIcon: ImageVector = onIcon, - onStyle: StreamFixedSizeButtonStyle, - showProgress: Boolean = false, - offStyle: StreamFixedSizeButtonStyle = onStyle, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - onClick: (ToggleableState) -> Unit = {}, -): Unit = GenericToggleButton( - modifier = modifier, - toggleState = toggleState, - onClick = onClick, - onContent = { - StreamIconButton( - showProgress = showProgress, - interactionSource = interactionSource, - enabled = enabled, - icon = onIcon, - style = onStyle, - onClick = { - it(toggleState.value) - }, - ) - }, - offContent = { - StreamIconButton( - showProgress = showProgress, - interactionSource = interactionSource, - enabled = enabled, - icon = offIcon, - style = offStyle, - onClick = { - it(toggleState.value) - }, - ) - }, -) - -@Composable -public fun StreamToggleButton( - modifier: Modifier = Modifier, - toggleState: State = rememberUpdatedState(newValue = ToggleableState(false)), - onText: String, - offText: String, - onIcon: ImageVector? = null, - offIcon: ImageVector? = onIcon, - onStyle: StreamButtonStyle, - offStyle: StreamButtonStyle = onStyle, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - onClick: (ToggleableState) -> Unit = {}, -): Unit = GenericToggleButton( - modifier = modifier, - toggleState = toggleState, - onClick = onClick, - onContent = { - GenericStreamButton( - modifier = Modifier.align(Alignment.CenterStart), - interactionSource = interactionSource, - enabled = enabled, - style = onStyle, - onClick = { - it(toggleState.value) - }, + Row( + modifier = Modifier.padding(horizontal = size.labelPadding), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy( + StreamTokens.spacingXs, + Alignment.CenterHorizontally, + ), ) { - val state = styleState(interactionSource, enabled) - onIcon?.let { - val iconStyle = onStyle.iconStyle.of(state = state).value + leadingIcon?.let { Icon( - imageVector = it, - contentDescription = "", - tint = iconStyle.color, + painter = it, + contentDescription = null, + modifier = Modifier.size(size.iconSize), ) - Spacer(modifier = Modifier.width(iconStyle.padding.calculateTopPadding())) } - val textStyle = onStyle.textStyle.of(state = state) - Text( - modifier = Modifier.fillMaxWidth(), - style = textStyle.value.platform, - text = onText, - ) - } - }, - offContent = { - GenericStreamButton( - modifier = Modifier.align(Alignment.CenterStart), - interactionSource = interactionSource, - enabled = enabled, - style = offStyle, - onClick = { - it(toggleState.value) - }, - ) { - val state = styleState(interactionSource, enabled) - offIcon?.let { - val iconStyle = offStyle.iconStyle.of(state = state).value + Text(text = text, maxLines = 1, overflow = TextOverflow.Ellipsis) + trailingIcon?.let { Icon( - imageVector = it, - contentDescription = "", - tint = iconStyle.color, + painter = it, + contentDescription = null, + modifier = Modifier.size(size.iconSize), ) - Spacer(modifier = Modifier.width(iconStyle.padding.calculateTopPadding())) } - val textStyle = offStyle.textStyle.of(state = state) - Text( - modifier = Modifier.fillMaxWidth(), - style = textStyle.value.platform, - text = offText, - ) } - }, -) - -@Composable -public fun StreamDrawableToggleButton( - modifier: Modifier = Modifier, - toggleState: State = rememberUpdatedState(newValue = ToggleableState(false)), - @DrawableRes onDrawable: Int, - @DrawableRes offDrawable: Int = onDrawable, - onStyle: StreamFixedSizeButtonStyle, - offStyle: StreamFixedSizeButtonStyle = onStyle, - enabled: Boolean = true, - interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, - onClick: (ToggleableState) -> Unit = {}, -) { - GenericToggleButton( - modifier = modifier, - toggleState = toggleState, - onClick = onClick, - onContent = { - StreamDrawableButton( - drawable = onDrawable, - style = onStyle, - enabled = enabled, - interactionSource = interactionSource, - onClick = { it(toggleState.value) }, - ) - }, - offContent = { - StreamDrawableButton( - drawable = offDrawable, - style = offStyle, - enabled = enabled, - interactionSource = interactionSource, - onClick = { it(toggleState.value) }, - ) - }, - ) + } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonSize.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonSize.kt new file mode 100644 index 00000000000..5d8b0e20371 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonSize.kt @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.ui.unit.Dp +import io.getstream.video.android.compose.theme.design.StreamTokens + +/** + * The size of a [StreamButton]. + * + * The size sets the visual height of the button. The touch target is always at least 48dp. + */ +public enum class StreamButtonSize( + internal val minimumSize: Dp, + internal val iconSize: Dp, + internal val labelPadding: Dp, +) { + /** 32dp tall, 16dp icons. */ + Small( + minimumSize = StreamTokens.buttonVisualHeightSm, + iconSize = StreamTokens.iconSizeSm, + labelPadding = StreamTokens.buttonPaddingXWithLabelSm, + ), + + /** 40dp tall, 20dp icons. The size of the call control buttons. */ + Medium( + minimumSize = StreamTokens.buttonVisualHeightMd, + iconSize = StreamTokens.iconSizeMd, + labelPadding = StreamTokens.buttonPaddingXWithLabelMd, + ), + + /** 48dp tall, 20dp icons. The size of full-width actions such as "Start Call". */ + Large( + minimumSize = StreamTokens.buttonVisualHeightLg, + iconSize = StreamTokens.iconSizeMd, + labelPadding = StreamTokens.buttonPaddingXWithLabelLg, + ), +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonStyle.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonStyle.kt new file mode 100644 index 00000000000..6e6a947e423 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamButtonStyle.kt @@ -0,0 +1,201 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.Immutable +import androidx.compose.runtime.Stable +import androidx.compose.ui.graphics.Color +import io.getstream.video.android.compose.theme.VideoTheme + +/** + * Colors of a [StreamButton] in its enabled and disabled states. + * + * A null container or border color means that part is not drawn, which is how the outline + * and ghost variants are expressed. + * + * @param containerColor The background color when enabled, or null for no background. + * @param contentColor The icon and label color when enabled. + * @param borderColor The outline color when enabled, or null for no outline. + * @param disabledContainerColor The background color when disabled, or null for no background. + * @param disabledContentColor The icon and label color when disabled. + * @param disabledBorderColor The outline color when disabled, or null for no outline. + */ +@Immutable +public data class StreamButtonStyle( + val containerColor: Color?, + val contentColor: Color, + val borderColor: Color?, + val disabledContainerColor: Color?, + val disabledContentColor: Color, + val disabledBorderColor: Color?, +) + +@Stable +internal fun StreamButtonStyle.contentColor(enabled: Boolean): Color = + if (enabled) contentColor else disabledContentColor + +@Stable +internal fun StreamButtonStyle.containerColor(enabled: Boolean): Color? = + if (enabled) containerColor else disabledContainerColor + +@Stable +internal fun StreamButtonStyle.borderColor(enabled: Boolean): Color? = + if (enabled) borderColor else disabledBorderColor + +/** + * The [StreamButtonStyle] variants of the design system, resolved from [VideoTheme.colors]. + * + * Each intent (primary, secondary, destructive) comes in a solid, an outline and a ghost variant. + */ +public object StreamButtonStyleDefaults { + + /** Filled button with the brand color. The default call to action. */ + public val primarySolid: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = colors.buttonPrimaryBg, + contentColor = colors.buttonPrimaryTextOnAccent, + borderColor = null, + disabledContainerColor = colors.backgroundUtilityDisabled, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) + } + + /** Outlined button with the brand color. */ + public val primaryOutline: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = null, + contentColor = colors.buttonPrimaryText, + borderColor = colors.buttonPrimaryBorder, + disabledContainerColor = null, + disabledContentColor = colors.textDisabled, + disabledBorderColor = colors.borderUtilityDisabled, + ) + } + + /** Text-only button with the brand color. */ + public val primaryGhost: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = null, + contentColor = colors.buttonPrimaryText, + borderColor = null, + disabledContainerColor = null, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) + } + + /** Filled button on a neutral surface. The default style of the call controls. */ + public val secondarySolid: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = colors.buttonSecondaryBg, + contentColor = colors.buttonSecondaryText, + borderColor = null, + disabledContainerColor = colors.backgroundUtilityDisabled, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) + } + + /** Outlined neutral button. */ + public val secondaryOutline: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = null, + contentColor = colors.buttonSecondaryText, + borderColor = colors.buttonSecondaryBorder, + disabledContainerColor = null, + disabledContentColor = colors.textDisabled, + disabledBorderColor = colors.borderUtilityDisabled, + ) + } + + /** Text-only neutral button. */ + public val secondaryGhost: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = null, + contentColor = colors.buttonSecondaryText, + borderColor = null, + disabledContainerColor = null, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) + } + + /** Filled button with the error color, for leaving or ending a call. */ + public val destructiveSolid: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = colors.buttonDestructiveBg, + contentColor = colors.buttonDestructiveTextOnAccent, + borderColor = null, + disabledContainerColor = colors.backgroundUtilityDisabled, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) + } + + /** Outlined button with the error color. */ + public val destructiveOutline: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = null, + contentColor = colors.buttonDestructiveText, + borderColor = colors.buttonDestructiveBorder, + disabledContainerColor = null, + disabledContentColor = colors.textDisabled, + disabledBorderColor = colors.borderUtilityDisabled, + ) + } + + /** Text-only button with the error color. */ + public val destructiveGhost: StreamButtonStyle + @Composable + get() { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = null, + contentColor = colors.buttonDestructiveText, + borderColor = null, + disabledContainerColor = null, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamDialog.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamDialog.kt new file mode 100644 index 00000000000..087e16342f7 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamDialog.kt @@ -0,0 +1,136 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.layout.widthIn +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.window.Dialog +import androidx.compose.ui.window.DialogProperties +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +/** + * A modal dialog with a centered title, an optional icon and message, and a stacked action area. + * + * The dialog is a platform dialog window, so it moves above the keyboard and dims the content + * behind it. Actions are usually full width [StreamTextButton]s of size [StreamButtonSize.Large]; the + * [content] column spaces them by 8dp. + * + * @param onDismissRequest Called when the user taps outside the dialog or presses back. + * @param title The title shown in the heading typography. + * @param modifier The modifier applied to the dialog card. + * @param message The supporting text shown below the title, or null for none. + * @param icon The icon shown above the title, or null for none. + * @param dismissOnBackPress Whether pressing back calls [onDismissRequest]. + * @param dismissOnClickOutside Whether tapping outside the dialog calls [onDismissRequest]. + * @param content The action area of the dialog, laid out as a column below the texts. + */ +@Composable +public fun StreamDialog( + onDismissRequest: () -> Unit, + title: String, + modifier: Modifier = Modifier, + message: String? = null, + icon: Painter? = null, + dismissOnBackPress: Boolean = true, + dismissOnClickOutside: Boolean = true, + content: @Composable ColumnScope.() -> Unit, +) { + Dialog( + onDismissRequest = onDismissRequest, + properties = DialogProperties( + dismissOnBackPress = dismissOnBackPress, + dismissOnClickOutside = dismissOnClickOutside, + ), + ) { + Column( + modifier = modifier + .widthIn(max = StreamTokens.size320) + .background( + color = VideoTheme.colors.backgroundCoreElevation1, + shape = RoundedCornerShape(StreamTokens.radius4xl), + ) + .padding( + start = StreamTokens.spacingXl, + top = StreamTokens.spacing2xl, + end = StreamTokens.spacingXl, + bottom = StreamTokens.spacingXl, + ), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacing2xl), + ) { + DialogHeader(title = title, message = message, icon = icon) + Column( + modifier = Modifier.fillMaxWidth(), + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), + content = content, + ) + } + } +} + +@Composable +private fun DialogHeader(title: String, message: String?, icon: Painter?) { + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingMd), + ) { + icon?.let { + Icon( + painter = it, + contentDescription = null, + modifier = Modifier.size(StreamTokens.iconSizeLg), + tint = VideoTheme.colors.accentNeutral, + ) + } + Column( + modifier = Modifier.fillMaxWidth(), + horizontalAlignment = Alignment.CenterHorizontally, + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), + ) { + Text( + text = title, + style = VideoTheme.typography.headingSmall, + color = VideoTheme.colors.textPrimary, + textAlign = TextAlign.Center, + ) + message?.let { + Text( + text = it, + style = VideoTheme.typography.captionDefault, + color = VideoTheme.colors.textSecondary, + textAlign = TextAlign.Center, + ) + } + } + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamListItem.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamListItem.kt new file mode 100644 index 00000000000..94fc0f645fd --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamListItem.kt @@ -0,0 +1,116 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.LocalContentColor +import androidx.compose.material.Text +import androidx.compose.material.ripple +import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip +import androidx.compose.ui.semantics.Role +import androidx.compose.ui.text.style.TextOverflow +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +/** + * A row of a menu or a sheet with a title, an optional subtitle, and leading and trailing slots. + * + * The slots receive [LocalContentColor] matching the title color, so plain icons inherit it. + * + * @param title The main text, kept on a single line. + * @param modifier The modifier applied to the row. + * @param onClick Called when the row is tapped, or null for a static row. + * @param enabled Whether the row accepts taps. Disabled rows use the disabled text color. + * @param subtitle The secondary text below the title, or null for none. + * @param leadingContent The content before the texts, usually a 20dp icon, or null for none. + * @param trailingContent The content after the texts, such as a chevron or a switch, or null for none. + */ +@Composable +internal fun StreamListItem( + title: String, + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, + enabled: Boolean = true, + subtitle: String? = null, + leadingContent: (@Composable () -> Unit)? = null, + trailingContent: (@Composable () -> Unit)? = null, +) { + val colors = VideoTheme.colors + val titleColor = if (enabled) colors.textPrimary else colors.textDisabled + Row( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = StreamTokens.spacingXxs) + .defaultMinSize(minHeight = StreamTokens.size48) + .clip(RoundedCornerShape(StreamTokens.radiusMd)) + .then( + if (onClick != null) { + Modifier.clickable( + onClick = onClick, + enabled = enabled, + role = Role.Button, + interactionSource = remember { MutableInteractionSource() }, + indication = ripple(), + ) + } else { + Modifier + }, + ) + .padding(horizontal = StreamTokens.spacingSm, vertical = StreamTokens.spacingXs), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingSm), + ) { + CompositionLocalProvider(LocalContentColor provides titleColor) { + leadingContent?.invoke() + Column( + modifier = Modifier.weight(1f), + verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXxxs), + ) { + Text( + text = title, + style = VideoTheme.typography.bodyDefault, + color = titleColor, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + subtitle?.let { + Text( + text = it, + style = VideoTheme.typography.captionDefault, + color = if (enabled) colors.textSecondary else colors.textDisabled, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } + } + trailingContent?.invoke() + } + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamMenuHeading.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamMenuHeading.kt new file mode 100644 index 00000000000..58ed0eec32e --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamMenuHeading.kt @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.material.Divider +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.text.style.TextOverflow +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +/** + * The heading of a group of [StreamListItem]s. + * + * @param text The heading, kept on a single line. + * @param modifier The modifier applied to the heading row. + */ +@Composable +internal fun StreamMenuHeading( + text: String, + modifier: Modifier = Modifier, +) { + Box( + modifier = modifier + .fillMaxWidth() + .padding(horizontal = StreamTokens.spacingXxs) + .defaultMinSize(minHeight = StreamTokens.size40) + .padding(StreamTokens.spacingSm), + contentAlignment = Alignment.CenterStart, + ) { + Text( + text = text, + style = VideoTheme.typography.bodyEmphasis, + color = VideoTheme.colors.textTertiary, + maxLines = 1, + overflow = TextOverflow.Ellipsis, + ) + } +} + +/** + * A thin line with vertical breathing room that separates groups of [StreamListItem]s. + * + * @param modifier The modifier applied to the separator. + */ +@Composable +internal fun StreamMenuSeparator(modifier: Modifier = Modifier) { + Box( + modifier = modifier + .fillMaxWidth() + .height(StreamTokens.size8), + contentAlignment = Alignment.Center, + ) { + Divider( + modifier = Modifier.padding(horizontal = StreamTokens.spacingMd), + color = VideoTheme.colors.borderCoreSubtle, + thickness = StreamTokens.strokeW100, + ) + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamScrim.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamScrim.kt new file mode 100644 index 00000000000..59f302b3024 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamScrim.kt @@ -0,0 +1,56 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.background +import androidx.compose.foundation.clickable +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import io.getstream.video.android.compose.theme.VideoTheme + +/** + * A full size translucent layer drawn behind dialogs and sheets. + * + * @param modifier The modifier applied to the layer. + * @param onClick Called when the layer is tapped, or null to let taps pass through. + */ +@Composable +internal fun StreamScrim( + modifier: Modifier = Modifier, + onClick: (() -> Unit)? = null, +) { + Box( + modifier = modifier + .fillMaxSize() + .background(VideoTheme.colors.backgroundCoreScrim) + .then( + if (onClick != null) { + Modifier.clickable( + interactionSource = remember { MutableInteractionSource() }, + indication = null, + onClick = onClick, + ) + } else { + Modifier + }, + ), + ) +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamTextField.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamTextField.kt new file mode 100644 index 00000000000..c734a50d9b1 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/StreamTextField.kt @@ -0,0 +1,182 @@ +/* + * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. + * + * Licensed under the Stream License; + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://github.com/GetStream/stream-video-android/blob/main/LICENSE + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package io.getstream.video.android.compose.ui.components.base + +import androidx.compose.foundation.border +import androidx.compose.foundation.interaction.MutableInteractionSource +import androidx.compose.foundation.interaction.collectIsFocusedAsState +import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.defaultMinSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.foundation.text.BasicTextField +import androidx.compose.foundation.text.KeyboardActions +import androidx.compose.foundation.text.KeyboardOptions +import androidx.compose.material.Icon +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color +import androidx.compose.ui.graphics.SolidColor +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.semantics.error +import androidx.compose.ui.semantics.semantics +import androidx.compose.ui.text.input.TextFieldValue +import androidx.compose.ui.text.input.VisualTransformation +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.theme.VideoTheme +import io.getstream.video.android.compose.theme.design.StreamTokens + +/** + * A single or multi line text input with an outlined field and an optional error message below it. + * + * @param value The current text and selection. + * @param onValueChange Called with the new value when the user edits the text. + * @param modifier The modifier applied to the text field node, which also holds the error message. + * @param enabled Whether the field accepts input. Disabled fields use the disabled text color. + * @param readOnly Whether the text can be selected but not edited. + * @param placeholder The hint shown while [value] is empty, or null for none. + * @param errorText The error shown below the field, or null when the input is valid. + * @param leadingIcon The icon shown before the text, or null for none. + * @param trailingIcon The icon shown after the text, or null for none. + * @param maxLines The maximum number of visible lines. One line makes the field single line. + * @param minLines The minimum number of visible lines. + * @param visualTransformation The transformation applied to the displayed text, such as password masking. + * @param keyboardOptions The software keyboard options. + * @param keyboardActions The callbacks for the keyboard IME actions. + * @param interactionSource The interaction source that reports the focus state of the field. + */ +@Composable +public fun StreamTextField( + value: TextFieldValue, + onValueChange: (TextFieldValue) -> Unit, + modifier: Modifier = Modifier, + enabled: Boolean = true, + readOnly: Boolean = false, + placeholder: String? = null, + errorText: String? = null, + leadingIcon: Painter? = null, + trailingIcon: Painter? = null, + maxLines: Int = 1, + minLines: Int = 1, + visualTransformation: VisualTransformation = VisualTransformation.None, + keyboardOptions: KeyboardOptions = KeyboardOptions.Default, + keyboardActions: KeyboardActions = KeyboardActions.Default, + interactionSource: MutableInteractionSource = remember { MutableInteractionSource() }, +) { + val colors = VideoTheme.colors + val focused by interactionSource.collectIsFocusedAsState() + val borderColor = when { + errorText != null -> colors.borderUtilityError + focused -> colors.borderUtilityFocused + else -> colors.borderCoreDefault + } + val textColor = if (enabled) colors.inputTextDefault else colors.inputTextDisabled + val iconColor = if (focused) colors.inputTextIconActive else colors.inputTextIcon + // The text field is the root node so that a test tag or a weight passed in [modifier] lands + // on the editable node; the error message is part of the decoration below the field. + BasicTextField( + value = value, + onValueChange = onValueChange, + modifier = modifier.semantics { errorText?.let { error(it) } }, + enabled = enabled, + readOnly = readOnly, + textStyle = VideoTheme.typography.bodyDefault.copy(color = textColor), + keyboardOptions = keyboardOptions, + keyboardActions = keyboardActions, + singleLine = maxLines == 1 && minLines == 1, + maxLines = maxOf(minLines, maxLines), + minLines = minLines, + visualTransformation = visualTransformation, + interactionSource = interactionSource, + cursorBrush = SolidColor(colors.accentPrimary), + ) { innerTextField -> + Column(verticalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs)) { + Row( + modifier = Modifier + .fillMaxWidth() + .defaultMinSize(minHeight = StreamTokens.size48) + .border( + width = StreamTokens.strokeW100, + color = borderColor, + shape = RoundedCornerShape(StreamTokens.inputRadiusTextInput), + ) + .padding( + horizontal = StreamTokens.spacingMd, + vertical = StreamTokens.spacingSm, + ), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), + ) { + leadingIcon?.let { FieldIcon(icon = it, tint = iconColor) } + Box(modifier = Modifier.weight(1f)) { + if (value.text.isEmpty() && placeholder != null) { + Text( + text = placeholder, + style = VideoTheme.typography.bodyDefault, + color = colors.inputTextPlaceholder, + maxLines = 1, + ) + } + innerTextField() + } + trailingIcon?.let { FieldIcon(icon = it, tint = iconColor) } + } + errorText?.let { ErrorMessage(text = it) } + } + } +} + +@Composable +private fun FieldIcon(icon: Painter, tint: Color) { + Icon( + painter = icon, + contentDescription = null, + modifier = Modifier.size(StreamTokens.iconSizeMd), + tint = tint, + ) +} + +@Composable +private fun ErrorMessage(text: String) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(StreamTokens.spacingXs), + ) { + Icon( + painter = painterResource(R.drawable.stream_design_ic_exclamation_circle), + contentDescription = null, + modifier = Modifier.size(StreamTokens.iconSizeMd), + tint = VideoTheme.colors.accentError, + ) + Text( + text = text, + style = VideoTheme.typography.captionDefault, + color = VideoTheme.colors.accentError, + ) + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/Badge.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/Badge.kt deleted file mode 100644 index 902ca6d9ab5..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/Badge.kt +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base.styling - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.text.TextStyle -import androidx.compose.ui.text.font.FontWeight -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import androidx.compose.ui.unit.sp -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.theme.design.StreamTokens - -public data class BadgeStyle( - public val size: Dp, - public val color: Color, - public val textStyle: TextStyle, - public val contentPaddings: PaddingValues, -) : StreamStyle - -public open class BadgeStyleProvider { - @Composable - public fun defaultBadgeStyle(): BadgeStyle = BadgeStyle( - color = VideoTheme.colors.accentSuccess, - size = 16.dp, - textStyle = TextStyle( - fontSize = 8.sp, - lineHeight = 10.sp, - fontWeight = FontWeight.W600, - color = VideoTheme.colors.textTertiary, - ), - contentPaddings = PaddingValues(StreamTokens.size4, 0.dp), - ) -} - -public object StreamBadgeStyles : BadgeStyleProvider() diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/CompositeStyleProvider.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/CompositeStyleProvider.kt index 77b5ad1e6f2..cf538de0f36 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/CompositeStyleProvider.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/CompositeStyleProvider.kt @@ -21,9 +21,5 @@ package io.getstream.video.android.compose.ui.components.base.styling */ public open class CompositeStyleProvider( public val iconStyles: IconStyleProvider = IconStyles, - public val textFieldStyles: TextFieldStyleProvider = StreamTextFieldStyles, public val textStyles: TextStyleProvider = StreamTextStyles, - public val buttonStyles: ButtonStyleProvider = ButtonStyles, - public val dialogStyles: DialogStyleProvider = StreamDialogStyles, - public val badgeStyles: BadgeStyleProvider = StreamBadgeStyles, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/DialogStyle.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/DialogStyle.kt deleted file mode 100644 index c4365f92f2f..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/DialogStyle.kt +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base.styling - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.text.TextStyle -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.theme.design.StreamTokens - -public data class DialogStyle( - public val shape: Shape, - public val backgroundColor: Color, - public val titleStyle: TextStyle, - public val contentTextStyle: TextStyle, - public val iconStyle: IconStyle, - public val contentPaddings: PaddingValues, -) : StreamStyle - -public open class DialogStyleProvider { - @Composable - public fun defaultDialogStyle(): DialogStyle = DialogStyle( - shape = RoundedCornerShape(StreamTokens.radius3xl), - backgroundColor = VideoTheme.colors.backgroundCoreElevation1, - titleStyle = StreamTextStyles.defaultTitle(StyleSize.S).default.platform, - contentTextStyle = StreamTextStyles.defaultBody(StyleSize.S).default.platform, - iconStyle = IconStyles.defaultIconStyle().default, - contentPaddings = PaddingValues(StreamTokens.spacingXl), - ) -} - -public object StreamDialogStyles : DialogStyleProvider() diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle.kt deleted file mode 100644 index 1dfb1bcd009..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamButtonDrawableStyle.kt +++ /dev/null @@ -1,103 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base.styling - -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.ColorMatrix -import androidx.compose.ui.graphics.DefaultAlpha -import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.unit.dp - -/** - * Represents a style for drawables used on buttons. Consists of scale and padding. - * - * @param scale The aspect ratio scale of the drawable. - * @param padding The padding applied to the drawable. - */ -public data class ButtonDrawableStyle( - val scale: ContentScale, - val alpha: Float, - val colorFilter: ColorFilter?, - val padding: PaddingValues, -) : StreamStyle - -/** - * Contains state styles for the button drawable. - */ -public data class StreamButtonDrawableStyle( - override val default: ButtonDrawableStyle, - override val pressed: ButtonDrawableStyle, - override val disabled: ButtonDrawableStyle, -) : StreamStateStyle - -/** - * Provides default button drawable style. - */ -public open class ButtonDrawableStyleProvider { - - /** - * Composable that provides the default button drawable style. - * - * @param padding The padding applied to the drawable. - * @param scale The aspect ratio scale of the drawable. - * @param defaultAlpha The alpha value of the drawable when in default state. - * @param pressedAlpha The alpha value of the drawable when in pressed state. - * @param disabledAlpha The alpha value of the drawable when in disabled state. - * @param defaultColorFilter The color filter applied on the drawable when in default state. - * @param pressedColorFilter The color filter applied on the drawable when in pressed state. - * @param disabledColorFilter The color filter applied on the drawable when in disabled state. - * @return [StreamButtonDrawableStyle] - * - * @see [StreamButtonDrawableStyle] - */ - @Composable - public fun defaultButtonDrawableStyle( - padding: PaddingValues = PaddingValues(0.dp), - scale: ContentScale = ContentScale.Crop, - defaultAlpha: Float = DefaultAlpha, - pressedAlpha: Float = DefaultAlpha, - disabledAlpha: Float = 0.6f, - defaultColorFilter: ColorFilter? = null, - pressedColorFilter: ColorFilter? = null, - disabledColorFilter: ColorFilter? = ColorFilter.colorMatrix( - ColorMatrix().apply { - setToSaturation(0f) - }, - ), - ): StreamButtonDrawableStyle = StreamButtonDrawableStyle( - default = ButtonDrawableStyle(scale, defaultAlpha, defaultColorFilter, padding), - pressed = ButtonDrawableStyle(scale, pressedAlpha, pressedColorFilter, padding), - disabled = ButtonDrawableStyle(scale, disabledAlpha, disabledColorFilter, padding), - ) - - @Composable - public fun customColorFilterButtonDrawableStyle( - colorFilter: ColorFilter, - ): StreamButtonDrawableStyle = - defaultButtonDrawableStyle( - defaultColorFilter = colorFilter, - pressedColorFilter = colorFilter, - disabledColorFilter = colorFilter, - ) -} - -/** - * Object accessor for a default [ButtonDrawableStyleProvider] - */ -public object ButtonDrawableStyles : ButtonDrawableStyleProvider() diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle.kt deleted file mode 100644 index 8fdc9e6b680..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamButtonStyle.kt +++ /dev/null @@ -1,425 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base.styling - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.shape.CircleShape -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.ButtonColors -import androidx.compose.material.ButtonDefaults -import androidx.compose.material.ButtonElevation -import androidx.compose.runtime.Composable -import androidx.compose.runtime.Immutable -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.ColorFilter -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.unit.Dp -import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.theme.design.StreamTokens - -public object ButtonStyles : ButtonStyleProvider() - -@Immutable -public open class StreamButtonStyle( - public val elevation: ButtonElevation?, - public val shape: Shape, - public val border: BorderStroke?, - public val colors: ButtonColors, - public val contentPadding: PaddingValues, - public val textStyle: StreamTextStyle, - public val iconStyle: StreamIconStyle, - public val drawableStyle: StreamButtonDrawableStyle, -) { - - /** - * Standard copy function, to utilize as much as possible from the companion object. - */ - public fun copy( - elevation: ButtonElevation? = this.elevation, - shape: Shape = this.shape, - border: BorderStroke? = this.border, - colors: ButtonColors = this.colors, - contentPadding: PaddingValues = this.contentPadding, - textStyle: StreamTextStyle = this.textStyle, - iconStyle: StreamIconStyle = this.iconStyle, - drawableStyle: StreamButtonDrawableStyle = this.drawableStyle, - ): StreamButtonStyle { - return StreamButtonStyle( - elevation, - shape, - border, - colors, - contentPadding, - textStyle, - iconStyle, - drawableStyle, - ) - } -} - -/** - * A style that also suggest a fixed size. Size is not guaranteed and depends on the implementing composable. - */ -public open class StreamFixedSizeButtonStyle( - public val width: Dp, - public val height: Dp, - elevation: ButtonElevation?, - shape: Shape, - border: BorderStroke?, - colors: ButtonColors, - contentPadding: PaddingValues, - textStyle: StreamTextStyle, - iconStyle: StreamIconStyle, - drawableStyle: StreamButtonDrawableStyle, -) : StreamButtonStyle( - elevation, - shape, - border, - colors, - contentPadding, - textStyle, - iconStyle, - drawableStyle, -) { - - public fun copyFixed( - width: Dp = this.width, - height: Dp = this.height, - elevation: ButtonElevation? = this.elevation, - shape: Shape = this.shape, - border: BorderStroke? = this.border, - colors: ButtonColors = this.colors, - contentPadding: PaddingValues = this.contentPadding, - textStyle: StreamTextStyle = this.textStyle, - iconStyle: StreamIconStyle = this.iconStyle, - drawableStyle: StreamButtonDrawableStyle = this.drawableStyle, - ): StreamFixedSizeButtonStyle = StreamFixedSizeButtonStyle( - width, - height, - elevation, - shape, - border, - colors, - contentPadding, - textStyle, - iconStyle, - drawableStyle, - ) - public companion object { - public fun of( - width: Dp, - height: Dp, - origin: StreamButtonStyle, - ): StreamFixedSizeButtonStyle = StreamFixedSizeButtonStyle( - width, - height, - origin.elevation, - origin.shape, - origin.border, - origin.colors, - origin.contentPadding, - origin.textStyle, - origin.iconStyle, - origin.drawableStyle, - ) - } -} - -@Immutable -public open class ButtonStyleProvider { - - /** - * You can create any style with the [StreamButtonStyle]. - * Use it with the [StreamButton] composable - * - * @param elevation button elevation - * @param shape the shape of the button - * @param border the button border - * @param - */ - @Composable - public fun genericButtonStyle( - size: StyleSize = StyleSize.L, - elevation: ButtonElevation? = null, - shape: Shape = RoundedCornerShape(StreamTokens.radiusMax), - border: BorderStroke? = null, - colors: ButtonColors = ButtonDefaults.buttonColors(), - contentPadding: PaddingValues = ButtonDefaults.ContentPadding, - ): StreamButtonStyle = StreamButtonStyle( - elevation, - shape, - border, - colors, - contentPadding, - StreamTextStyles.defaultButtonLabel(size), - IconStyles.defaultIconStyle(), - ButtonDrawableStyles.defaultButtonDrawableStyle(), - ) - - @Composable - public fun primaryButtonStyle(size: StyleSize = StyleSize.L): StreamButtonStyle = - genericButtonStyle( - size = size, - shape = RoundedCornerShape(StreamTokens.radiusMax), - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.buttonSecondaryBg, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundUtilityDisabled, - ), - contentPadding = PaddingValues( - start = StreamTokens.spacingMd, - end = StreamTokens.spacingMd, - top = StreamTokens.spacingXs, - bottom = StreamTokens.spacingXs, - ), - ) - - @Composable - public fun secondaryButtonStyle(size: StyleSize = StyleSize.L): StreamButtonStyle = - genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.buttonPrimaryBg, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundUtilityDisabled, - ), - ) - - @Composable - public fun tertiaryButtonStyle(size: StyleSize = StyleSize.L): StreamButtonStyle = - genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.backgroundCoreApp, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundCoreApp, - ), - border = BorderStroke(1.dp, VideoTheme.colors.borderCoreDefault), - ) - - @Composable - public fun toggleButtonStyleOn(size: StyleSize = StyleSize.L): StreamButtonStyle = - genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.buttonSecondaryBg, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundUtilityDisabled, - ), - iconStyle = IconStyles.customColorIconStyle( - color = VideoTheme.colors.accentPrimary, - ), - ) - - @Composable - public fun toggleButtonStyleOff(size: StyleSize = StyleSize.L): StreamButtonStyle = - genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.backgroundCoreApp, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundCoreApp, - ), - ) - - @Composable - public fun alertButtonStyle(size: StyleSize = StyleSize.L): StreamButtonStyle = - genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.buttonDestructiveBg, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundUtilityDisabled, - ), - ) - - @Composable - public fun primaryIconButtonStyle(size: StyleSize = StyleSize.L): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = primaryButtonStyle(size = size).copy( - iconStyle = IconStyles.defaultIconStyle( - padding = PaddingValues(StreamTokens.spacingXxs), - ), - ), - ) - - @Composable - public fun secondaryIconButtonStyle(size: StyleSize = StyleSize.L): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = secondaryButtonStyle(size = size).copy( - iconStyle = IconStyles.defaultIconStyle( - padding = PaddingValues(StreamTokens.spacingXxs), - ), - ), - ) - - @Composable - public fun tertiaryIconButtonStyle(size: StyleSize = StyleSize.L): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = tertiaryButtonStyle(size = size).copy( - iconStyle = IconStyles.defaultIconStyle( - padding = PaddingValues(StreamTokens.spacingXxs), - ), - ), - ) - - @Composable - public fun onlyIconIconButtonStyle(size: StyleSize = StyleSize.L): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = tertiaryButtonStyle(size = size).copy( - iconStyle = IconStyles.defaultIconStyle( - padding = PaddingValues(StreamTokens.spacingXxs), - ), - border = null, - ), - ) - - @Composable - public fun alertIconButtonStyle(size: StyleSize = StyleSize.L): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = alertButtonStyle(size = size).copy( - iconStyle = IconStyles.defaultIconStyle( - padding = PaddingValues(StreamTokens.spacingXxs), - ), - ), - ) - - @Composable - public fun primaryDrawableButtonStyle( - size: StyleSize = StyleSize.L, - ): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = genericButtonStyle(size = size), - ) - - @Composable - public fun drawableToggleButtonStyleOn( - size: StyleSize = StyleSize.L, - ): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.buttonSecondaryBg, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundUtilityDisabled, - ), - drawableStyle = ButtonDrawableStyles.defaultButtonDrawableStyle(), - ), - ) - - @Composable - public fun drawableToggleButtonStyleOff( - size: StyleSize = StyleSize.L, - ): StreamFixedSizeButtonStyle = - StreamFixedSizeButtonStyle.of( - width = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - height = when (size) { - StyleSize.XS, StyleSize.S -> StreamTokens.size24 - StyleSize.M -> StreamTokens.size32 - else -> StreamTokens.size48 - }, - origin = genericButtonStyle(size = size).copy( - colors = ButtonDefaults.buttonColors( - backgroundColor = VideoTheme.colors.backgroundCoreApp, - contentColor = VideoTheme.colors.textPrimary, - disabledBackgroundColor = VideoTheme.colors.backgroundCoreApp, - ), - drawableStyle = ButtonDrawableStyles.customColorFilterButtonDrawableStyle( - colorFilter = ColorFilter.lighting(Color.Gray, Color.Transparent), - ), - ), - ) -} - -internal fun StreamFixedSizeButtonStyle.fillCircle(fraction: Float): StreamFixedSizeButtonStyle { - return this.copyFixed( - width * fraction, - height * fraction, - shape = CircleShape, - ) -} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamTextFieldStyle.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamTextFieldStyle.kt deleted file mode 100644 index 5420ce74233..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/StreamTextFieldStyle.kt +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base.styling - -import androidx.compose.foundation.BorderStroke -import androidx.compose.foundation.layout.PaddingValues -import androidx.compose.foundation.shape.RoundedCornerShape -import androidx.compose.material.TextFieldColors -import androidx.compose.material.TextFieldDefaults -import androidx.compose.runtime.Composable -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.theme.design.StreamTokens - -public data class TextFieldStyle( - val textStyle: StreamTextStyle, - val placeholderStyle: StreamTextStyle, - val iconStyle: StreamIconStyle, - val colors: TextFieldColors, - val shape: Shape, - val borderStroke: BorderStroke?, - val paddings: PaddingValues, -) : StreamStyle - -public open class TextFieldStyleProvider { - - @Composable - public fun defaultTextField( - styleSize: StyleSize = StyleSize.S, - textStyle: StreamTextStyle = StreamTextStyles.defaultTextField(styleSize), - placeholderStyle: StreamTextStyle = StreamTextStyles.defaultSubtitle(styleSize), - iconStyle: StreamIconStyle = IconStyles.defaultIconStyle(), - ): TextFieldStyle = - TextFieldStyle( - textStyle = textStyle, - colors = TextFieldDefaults.outlinedTextFieldColors( - // Background - backgroundColor = VideoTheme.colors.backgroundCoreApp, - // Border - focusedBorderColor = VideoTheme.colors.accentPrimary, - unfocusedBorderColor = VideoTheme.colors.borderCoreDefault, - disabledBorderColor = VideoTheme.colors.borderCoreDefault.copy(alpha = 0.16f), - errorBorderColor = VideoTheme.colors.accentError, - // Cursor - cursorColor = VideoTheme.colors.textPrimary, - errorCursorColor = VideoTheme.colors.accentError, - // Text - textColor = VideoTheme.colors.textPrimary, - disabledTextColor = VideoTheme.colors.textTertiary.copy(alpha = 0.16f), - errorLabelColor = VideoTheme.colors.accentError, - focusedLabelColor = VideoTheme.colors.textPrimary, - unfocusedLabelColor = VideoTheme.colors.textPrimary, - placeholderColor = VideoTheme.colors.textTertiary, - disabledPlaceholderColor = VideoTheme.colors.textTertiary.copy(alpha = 0.16f), - ), - borderStroke = BorderStroke(2.dp, VideoTheme.colors.borderCoreDefault), - shape = RoundedCornerShape(StreamTokens.inputRadiusTextInput), - placeholderStyle = placeholderStyle, - paddings = PaddingValues(StreamTokens.spacingXs), - iconStyle = iconStyle, - ) -} - -public object StreamTextFieldStyles : TextFieldStyleProvider() diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/Utils.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/Utils.kt deleted file mode 100644 index e4ae61ed871..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/base/styling/Utils.kt +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.ui.components.base.styling - -import androidx.compose.foundation.interaction.MutableInteractionSource -import androidx.compose.foundation.interaction.collectIsPressedAsState -import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue - -@Composable -internal fun styleState( - interactionSource: MutableInteractionSource, - enabled: Boolean, -): StyleState { - val pressed by interactionSource.collectIsPressedAsState() - val state = if (enabled) { - StyleState.ENABLED - } else if (pressed) { - StyleState.PRESSED - } else { - StyleState.DISABLED - } - return state -} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/CallAppBar.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/CallAppBar.kt index 20e36a77591..0423d5dbf04 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/CallAppBar.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/CallAppBar.kt @@ -130,7 +130,9 @@ internal fun DefaultCallAppBarLeadingContent( onClick = onBackButtonClicked, ) { Icon( - painter = painterResource(id = R.drawable.stream_video_ic_arrow_back), + painter = painterResource( + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_arrow_left, + ), contentDescription = stringResource( id = R.string.stream_video_back_button_content_description, ), diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContent.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContent.kt index c33cf1fa569..4886ae46487 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContent.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/AudioCallContent.kt @@ -43,7 +43,7 @@ import io.getstream.video.android.compose.theme.AudioOnlyCallDetailsContentParam import io.getstream.video.android.compose.theme.AudioOnlyCallHeaderContentParams import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.base.styling.fillCircle +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize import io.getstream.video.android.compose.ui.components.call.activecall.internal.DefaultPermissionHandler import io.getstream.video.android.compose.ui.components.call.controls.actions.DefaultOnCallActionHandler import io.getstream.video.android.compose.ui.components.call.controls.actions.LeaveCallAction @@ -280,15 +280,14 @@ public fun AudioOnlyCallControls( ToggleMicrophoneAction( modifier = Modifier.testTag("Stream_MicrophoneToggle_Enabled_$isMicrophoneEnabled"), isMicrophoneEnabled = isMicrophoneEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle(1.5f), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle(1.5f), ) LeaveCallAction( modifier = Modifier.testTag("Stream_HangUpButton"), onCallAction = onCallAction, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle().fillCircle(1.5f), + size = StreamButtonSize.Large, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/internal/InviteUsersDialog.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/internal/InviteUsersDialog.kt index 93981ae7b80..66ba542013e 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/internal/InviteUsersDialog.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/activecall/internal/InviteUsersDialog.kt @@ -16,12 +16,15 @@ package io.getstream.video.android.compose.ui.components.call.activecall.internal -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.GroupAdd +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamDialogPositiveNegative +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamDialog +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.model.User import io.getstream.video.android.ui.common.R @@ -39,22 +42,26 @@ internal fun InviteUsersDialog( onDismiss: () -> Unit, onInviteUsers: (List) -> Unit, ) { - StreamDialogPositiveNegative( - icon = Icons.Default.GroupAdd, + StreamDialog( + onDismissRequest = onDismiss, + icon = painterResource( + io.getstream.video.android.compose.R.drawable.stream_design_ic_user_add_fill, + ), title = stringResource(R.string.stream_video_invite_users_title), - positiveButton = Triple( - stringResource(R.string.stream_video_invite_users_accept), - VideoTheme.styles.buttonStyles.secondaryButtonStyle(), - ) { - onInviteUsers(users) - }, - negativeButton = Triple( - stringResource(R.string.stream_video_invite_users_cancel), - VideoTheme.styles.buttonStyles.tertiaryButtonStyle(), - ) { - onDismiss() - }, - contentText = stringResource(R.string.stream_video_invite_users_message, users.size), - style = VideoTheme.styles.dialogStyles.defaultDialogStyle(), - ) + message = stringResource(R.string.stream_video_invite_users_message, users.size), + ) { + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = { onInviteUsers(users) }, + text = stringResource(R.string.stream_video_invite_users_accept), + size = StreamButtonSize.Large, + ) + StreamTextButton( + modifier = Modifier.fillMaxWidth(), + onClick = onDismiss, + text = stringResource(R.string.stream_video_invite_users_cancel), + style = StreamButtonStyleDefaults.secondaryOutline, + size = StreamButtonSize.Large, + ) + } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/AcceptCallAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/AcceptCallAction.kt index 0c25066ff8c..da43ed55470 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/AcceptCallAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/AcceptCallAction.kt @@ -16,39 +16,58 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Call import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle +import io.getstream.video.android.compose.theme.controlAcceptCallButtonBg +import io.getstream.video.android.compose.theme.controlAcceptCallButtonText +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle import io.getstream.video.android.core.call.state.AcceptCall -import io.getstream.video.android.core.call.state.CallAction /** - * A call action button represents accepting a call. + * Accepts an incoming call. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param enabled Whether the action accepts clicks. + * @param icon The icon of the action, or null for the default one. + * @param style The colors of the button, or null for the default style. + * @param size The visual size of the button. + * @param onCallAction Called with [AcceptCall] when the action is clicked. */ @Composable public fun AcceptCallAction( modifier: Modifier = Modifier, enabled: Boolean = true, - icon: ImageVector? = null, - bgColor: Color? = null, - iconTint: Color? = null, - style: StreamFixedSizeButtonStyle? = null, + icon: Painter? = null, + style: StreamButtonStyle? = null, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (AcceptCall) -> Unit, ): Unit = GenericAction( modifier = modifier, + icon = icon ?: painterResource(R.drawable.stream_design_ic_phone_fill), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_accept_call, + ), enabled = enabled, - style = style, + style = style ?: acceptCallStyle(), + size = size, onAction = { onCallAction(AcceptCall) }, - icon = icon ?: Icons.Default.Call, - color = bgColor ?: VideoTheme.colors.accentSuccess, - iconTint = iconTint ?: VideoTheme.colors.textPrimary, ) + +@Composable +private fun acceptCallStyle(): StreamButtonStyle { + val colors = VideoTheme.colors + return StreamButtonStyle( + containerColor = colors.controlAcceptCallButtonBg, + contentColor = colors.controlAcceptCallButtonText, + borderColor = null, + disabledContainerColor = colors.backgroundUtilityDisabled, + disabledContentColor = colors.textDisabled, + disabledBorderColor = null, + ) +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallAction.kt index 31f62c7293c..d65f7c59f21 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/CancelCallAction.kt @@ -16,39 +16,43 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Call import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.CancelCall /** - * A call action button represents canceling a call. + * Cancels an outgoing call. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param enabled Whether the action accepts clicks. + * @param icon The icon of the action, or null for the default one. + * @param style The colors of the button, or null for the default style. + * @param size The visual size of the button. + * @param onCallAction Called with [CancelCall] when the action is clicked. */ @Composable public fun CancelCallAction( modifier: Modifier = Modifier, enabled: Boolean = true, - icon: ImageVector? = null, - bgColor: Color? = null, - iconTint: Color? = null, - style: StreamFixedSizeButtonStyle? = null, + icon: Painter? = null, + style: StreamButtonStyle? = null, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (CancelCall) -> Unit, ): Unit = GenericAction( modifier = modifier, + icon = icon ?: painterResource(R.drawable.stream_design_ic_phone_down_fill), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_cancel_call, + ), enabled = enabled, - style = style, + style = style ?: StreamButtonStyleDefaults.destructiveSolid, + size = size, onAction = { onCallAction(CancelCall) }, - icon = icon ?: Icons.Default.Call, - color = bgColor ?: VideoTheme.colors.accentError, - iconTint = iconTint ?: VideoTheme.colors.textPrimary, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ChatDialogAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ChatDialogAction.kt index 3d336ebb097..bfc1063bfcb 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ChatDialogAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ChatDialogAction.kt @@ -16,47 +16,47 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.QuestionAnswer import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import io.getstream.video.android.compose.theme.VideoTheme +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import io.getstream.video.android.compose.R import io.getstream.video.android.compose.ui.components.base.StreamBadgeBox -import io.getstream.video.android.core.call.state.CallAction -import io.getstream.video.android.core.call.state.CancelCall +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.core.call.state.ChatDialog /** - * A call action button represents displaying a chat dialog. + * Opens the in-call chat, with an unread count badge. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param enabled Whether the action accepts clicks. + * @param messageCount The unread message count shown in the badge, or null to hide the badge. + * @param icon The icon of the action, or null for the default one. + * @param style The colors of the button. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ChatDialog] when the action is clicked. */ @Composable public fun ChatDialogAction( modifier: Modifier = Modifier, enabled: Boolean = true, messageCount: Int? = null, - icon: ImageVector? = null, - bgColor: Color? = null, - iconTint: Color? = null, - badgeColor: Color? = null, - onCallAction: (CancelCall) -> Unit, + icon: Painter? = null, + style: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, + onCallAction: (ChatDialog) -> Unit, ): Unit = StreamBadgeBox( showWithoutValue = false, - style = VideoTheme.styles.badgeStyles.defaultBadgeStyle().copy( - color = badgeColor ?: VideoTheme.colors.accentSuccess, - ), text = messageCount?.toString(), ) { GenericAction( modifier = modifier, + icon = icon ?: painterResource(R.drawable.stream_design_ic_message_bubbles_fill), enabled = enabled, - onAction = { onCallAction(CancelCall) }, - icon = icon ?: Icons.Default.QuestionAnswer, - color = bgColor, - iconTint = iconTint, + style = style, + size = size, + onAction = { onCallAction(ChatDialog) }, ) } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ClosedCaptionsToggleAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ClosedCaptionsToggleAction.kt index 057c24ce993..245f7d8e718 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ClosedCaptionsToggleAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ClosedCaptionsToggleAction.kt @@ -16,42 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.ClosedCaption -import androidx.compose.material.icons.filled.ClosedCaptionOff import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.ClosedCaptionsAction /** - * A call action button represents displaying the call captions. + * Turns closed captions on and off. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param active Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ClosedCaptionsAction] when the action is clicked. */ @Composable public fun ClosedCaptionsToggleAction( modifier: Modifier = Modifier, active: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (ClosedCaptionsAction) -> Unit, ): Unit = ToggleAction( - isActionActive = active, - iconOnOff = - Pair(Icons.Default.ClosedCaption, Icons.Default.ClosedCaptionOff), modifier = modifier, - enabled = enabled, shape = shape, - enabledColor = enabledColor, disabledColor = disabledColor, - offStyle = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(), - onStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), -) { - onCallAction(ClosedCaptionsAction(!active)) -} + isActionActive = active, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_caption_fill), + painterResource(R.drawable.stream_design_ic_caption_fill), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_toggle_closed_captions, + ), + enabled = enabled, + onStyle = onStyle, + offStyle = offStyle, + size = size, + onAction = { onCallAction(ClosedCaptionsAction(!active)) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/DeclineCallAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/DeclineCallAction.kt index 5323b55c37f..33504897896 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/DeclineCallAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/DeclineCallAction.kt @@ -16,39 +16,43 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Call import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.DeclineCall /** - * A call action button represents canceling a call. + * Declines an incoming call. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param enabled Whether the action accepts clicks. + * @param icon The icon of the action, or null for the default one. + * @param style The colors of the button, or null for the default style. + * @param size The visual size of the button. + * @param onCallAction Called with [DeclineCall] when the action is clicked. */ @Composable public fun DeclineCallAction( modifier: Modifier = Modifier, enabled: Boolean = true, + icon: Painter? = null, + style: StreamButtonStyle? = null, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (DeclineCall) -> Unit, - icon: ImageVector? = null, - bgColor: Color? = null, - iconTint: Color? = null, - style: StreamFixedSizeButtonStyle? = null, ): Unit = GenericAction( modifier = modifier, + icon = icon ?: painterResource(R.drawable.stream_design_ic_phone_down_fill), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_decline_call, + ), enabled = enabled, - style = style, + style = style ?: StreamButtonStyleDefaults.destructiveSolid, + size = size, onAction = { onCallAction(DeclineCall) }, - icon = icon ?: Icons.Default.Call, - color = bgColor ?: VideoTheme.colors.accentError, - iconTint = iconTint ?: VideoTheme.colors.textPrimary, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/FlipCameraAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/FlipCameraAction.kt index 49a042a06fa..ed12da3e190 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/FlipCameraAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/FlipCameraAction.kt @@ -16,34 +16,40 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.FlipCameraIos import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.FlipCamera /** - * A call action button represents flipping a camera. + * Flips between the front and the back camera. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param enabled Whether the action accepts clicks. + * @param style The colors of the button. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [FlipCamera] when the action is clicked. */ @Composable public fun FlipCameraAction( modifier: Modifier = Modifier, enabled: Boolean = true, - color: Color? = null, - iconTint: Color? = null, + style: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (FlipCamera) -> Unit, ): Unit = GenericAction( modifier = modifier, + icon = painterResource(R.drawable.stream_design_ic_camera_flip_fill), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_flip_camera, + ), enabled = enabled, - color = color, - iconTint = iconTint, - icon = Icons.Default.FlipCameraIos, -) { - onCallAction(FlipCamera) -} + style = style, + size = size, + onAction = { onCallAction(FlipCamera) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActions.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActions.kt index 118b8ad9a00..978a7824a9f 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActions.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/GenericActions.kt @@ -16,134 +16,94 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.ButtonDefaults +import androidx.compose.foundation.layout.size +import androidx.compose.material.CircularProgressIndicator +import androidx.compose.material.Icon +import androidx.compose.material.LocalContentColor import androidx.compose.runtime.Composable -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.graphics.vector.ImageVector -import androidx.compose.ui.state.ToggleableState -import io.getstream.video.android.compose.theme.VideoTheme +import androidx.compose.ui.graphics.painter.Painter +import io.getstream.video.android.compose.theme.design.StreamTokens +import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.compose.ui.components.base.StreamIconButton -import io.getstream.video.android.compose.ui.components.base.StreamIconToggleButton -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +/** + * A round icon button used for one-shot call actions such as leaving the call. + * + * @param modifier The modifier applied to the button. + * @param icon The icon of the action. + * @param contentDescription The accessibility description of the action, or null when a parent describes it. + * @param enabled Whether the action accepts clicks. + * @param style The colors of the button. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onAction Called when the action is clicked. + */ @Composable public fun GenericAction( modifier: Modifier = Modifier, - icon: ImageVector, + icon: Painter, + contentDescription: String? = null, enabled: Boolean = true, - shape: Shape? = null, - color: Color? = null, - iconTint: Color? = null, - style: StreamFixedSizeButtonStyle? = null, + style: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, onAction: () -> Unit, ): Unit = StreamIconButton( + onClick = onAction, + icon = icon, + contentDescription = contentDescription, modifier = modifier, enabled = enabled, - icon = icon, - style = style?.let { - it.copyFixed( - shape = shape ?: it.shape, - colors = color?.let { - ButtonDefaults.buttonColors( - backgroundColor = color, - disabledBackgroundColor = color.copy(alpha = 0.16f), - ) - } - ?: it.colors, - iconStyle = it.iconStyle.copy( - default = it.iconStyle.default.copy( - color = iconTint ?: it.iconStyle.default.color, - ), - ), - ) - } ?: VideoTheme.styles.buttonStyles.primaryIconButtonStyle() - .let { - it.copyFixed( - shape = shape ?: it.shape, - colors = color?.let { - ButtonDefaults.buttonColors( - backgroundColor = color, - disabledBackgroundColor = color.copy(alpha = 0.16f), - ) - } - ?: it.colors, - iconStyle = it.iconStyle.copy( - default = it.iconStyle.default.copy( - color = iconTint ?: it.iconStyle.default.color, - ), - ), - ) - }, - onClick = { - onAction() - }, + style = style, + size = size, ) /** - * A call action button represents toggling a microphone. + * A round icon button used for call actions with an active and an inactive state, such as the microphone. * - * @param modifier Optional Modifier for this action button. - * @param isMicrophoneEnabled Represent is camera enabled. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param isActionActive Whether the action is in its active state, which selects the first icon and [onStyle]. + * @param iconOnOff The icons of the active and the inactive state. + * @param contentDescription The accessibility description of the action, or null when a parent describes it. + * @param enabled Whether the action accepts clicks. + * @param progress Whether a progress indicator replaces the icon while the action is pending. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onAction Called when the action is clicked. */ @Composable public fun ToggleAction( modifier: Modifier = Modifier, isActionActive: Boolean, - iconOnOff: Pair, + iconOnOff: Pair, + contentDescription: String? = null, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, - enabledIconTint: Color? = null, - disabledIconTint: Color? = null, progress: Boolean = false, - onStyle: StreamFixedSizeButtonStyle? = null, - offStyle: StreamFixedSizeButtonStyle? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.destructiveSolid, + size: StreamButtonSize = StreamButtonSize.Medium, onAction: () -> Unit, -): Unit = StreamIconToggleButton( +): Unit = StreamButton( + onClick = onAction, modifier = modifier, enabled = enabled, - showProgress = progress, - toggleState = rememberUpdatedState(newValue = ToggleableState(isActionActive)), - onIcon = iconOnOff.first, - offIcon = iconOnOff.second, - onStyle = onStyle ?: VideoTheme.styles.buttonStyles.primaryIconButtonStyle() - .let { - it.copyFixed( - shape = shape ?: it.shape, - colors = enabledColor?.let { ButtonDefaults.buttonColors(backgroundColor = enabledColor) } - ?: it.colors, - iconStyle = it.iconStyle.copy( - default = it.iconStyle.default.copy( - color = enabledIconTint ?: it.iconStyle.default.color, - ), - ), - ) - }, - offStyle = offStyle ?: VideoTheme.styles.buttonStyles.alertIconButtonStyle().let { - it.copyFixed( - shape = shape ?: it.shape, - colors = disabledColor?.let { - ButtonDefaults.buttonColors( - backgroundColor = disabledColor, - disabledBackgroundColor = disabledColor, - ) - } - ?: it.colors, - iconStyle = it.iconStyle.copy( - default = it.iconStyle.default.copy( - color = disabledIconTint ?: it.iconStyle.default.color, - ), - ), + style = if (isActionActive) onStyle else offStyle, + size = size, +) { + if (progress) { + CircularProgressIndicator( + modifier = Modifier.size(size.iconSize), + color = LocalContentColor.current, + strokeWidth = StreamTokens.strokeW200, ) - }, - onClick = { - onAction() - }, -) + } else { + Icon( + painter = if (isActionActive) iconOnOff.first else iconOnOff.second, + contentDescription = contentDescription, + modifier = Modifier.size(size.iconSize), + ) + } +} diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/LeaveCallAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/LeaveCallAction.kt index 338b759b694..0df0dfdc6cf 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/LeaveCallAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/LeaveCallAction.kt @@ -16,34 +16,43 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.CallEnd import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.LeaveCall /** - * A call action button represents leaving a call. + * Leaves the call. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param enabled Whether the action accepts clicks. + * @param icon The icon of the action, or null for the default one. + * @param style The colors of the button, or null for the default style. + * @param size The visual size of the button. + * @param onCallAction Called with [LeaveCall] when the action is clicked. */ @Composable public fun LeaveCallAction( modifier: Modifier = Modifier, enabled: Boolean = true, - style: StreamFixedSizeButtonStyle? = null, + icon: Painter? = null, + style: StreamButtonStyle? = null, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (LeaveCall) -> Unit, ): Unit = GenericAction( modifier = modifier, + icon = icon ?: painterResource(R.drawable.stream_design_ic_phone_down_fill), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_leave_call, + ), enabled = enabled, - style = style, + style = style ?: StreamButtonStyleDefaults.destructiveSolid, + size = size, onAction = { onCallAction(LeaveCall) }, - icon = Icons.Default.CallEnd, - color = VideoTheme.colors.accentError, - iconTint = VideoTheme.colors.textPrimary, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleAction.kt index d23fffe4307..5ba9bebafb3 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ScreenShareToggleAction.kt @@ -16,36 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.MobileScreenShare import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.theme.VideoTheme +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.ClosedCaptionsAction /** - * A call action button for screen sharing. + * Starts and stops sharing the screen. + * + * @param modifier The modifier applied to the button. + * @param active Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ClosedCaptionsAction] when the action is clicked. */ @Composable public fun ScreenShareToggleAction( modifier: Modifier = Modifier, active: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (ClosedCaptionsAction) -> Unit, ): Unit = ToggleAction( - isActionActive = active, - iconOnOff = - Pair(Icons.AutoMirrored.Filled.MobileScreenShare, Icons.AutoMirrored.Filled.MobileScreenShare), modifier = modifier, - enabled = enabled, shape = shape, - enabledColor = enabledColor, disabledColor = disabledColor, - offStyle = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(), - onStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), -) { - onCallAction(ClosedCaptionsAction(!active)) -} + isActionActive = active, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_present_mobile_fill), + painterResource(R.drawable.stream_design_ic_present_mobile_fill), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_toggle_screen_share, + ), + enabled = enabled, + onStyle = onStyle, + offStyle = offStyle, + size = size, + onAction = { onCallAction(ClosedCaptionsAction(!active)) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/SettingsAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/SettingsAction.kt index 0285b3b09a3..8341b1776a2 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/SettingsAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/SettingsAction.kt @@ -16,41 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.MoreVert import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.Settings /** - * A call action button represents displaying a chat dialog. + * Opens and closes the settings menu. * - * @param modifier Optional Modifier for this action button. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param isShowingSettings Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [Settings] when the action is clicked. */ @Composable public fun ToggleSettingsAction( modifier: Modifier = Modifier, isShowingSettings: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (Settings) -> Unit, ): Unit = ToggleAction( - isActionActive = isShowingSettings, - iconOnOff = - Pair(Icons.Default.MoreVert, Icons.Default.MoreVert), modifier = modifier, - enabled = enabled, shape = shape, - enabledColor = enabledColor, disabledColor = disabledColor, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), - onStyle = VideoTheme.styles.buttonStyles.primaryIconButtonStyle(), -) { - onCallAction(Settings(!isShowingSettings)) -} + isActionActive = isShowingSettings, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_more_vertical_fill), + painterResource(R.drawable.stream_design_ic_more_vertical_fill), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_settings, + ), + enabled = enabled, + onStyle = onStyle, + offStyle = offStyle, + size = size, + onAction = { onCallAction(Settings(!isShowingSettings)) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleCameraAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleCameraAction.kt index 7a16995f23e..fb3df93680a 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleCameraAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleCameraAction.kt @@ -16,50 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Videocam -import androidx.compose.material.icons.filled.VideocamOff import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.ToggleCamera /** - * A call action button represents toggling a camera. + * Turns the camera on and off. * - * @param modifier Optional Modifier for this action button. - * @param isCameraEnabled Represent is camera enabled. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param isCameraEnabled Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ToggleCamera] when the action is clicked. */ @Composable public fun ToggleCameraAction( modifier: Modifier = Modifier, isCameraEnabled: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, - enabledIconTint: Color? = null, - disabledIconTint: Color? = null, - onStyle: StreamFixedSizeButtonStyle? = null, - offStyle: StreamFixedSizeButtonStyle? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.destructiveSolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (ToggleCamera) -> Unit, ): Unit = ToggleAction( modifier = modifier, - enabled = enabled, - shape = shape, - enabledColor = enabledColor, - disabledColor = disabledColor, - enabledIconTint = enabledIconTint, - disabledIconTint = disabledIconTint, isActionActive = isCameraEnabled, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_video_fill), + painterResource(R.drawable.stream_design_ic_video_off_fill), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_toggle_camera, + ), + enabled = enabled, onStyle = onStyle, offStyle = offStyle, - iconOnOff = Pair(Icons.Default.Videocam, Icons.Default.VideocamOff), -) { - onCallAction(ToggleCamera(isCameraEnabled.not())) -} + size = size, + onAction = { onCallAction(ToggleCamera(isCameraEnabled.not())) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleHifiAudioAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleHifiAudioAction.kt index 66725dfb950..5371aa9e921 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleHifiAudioAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleHifiAudioAction.kt @@ -16,52 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.MusicNote -import androidx.compose.material.icons.filled.MusicOff import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.ToggleHifiAudio /** - * A call action button represents toggling audio bitrate profile between - * VOICE_STANDARD_UNSPECIFIED and MUSIC_HIGH_QUALITY. + * Switches between the high quality music profile and the standard voice profile. * - * @param modifier Optional Modifier for this action button. - * @param isMusicHighQuality Represent if music high quality is selected. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param isMusicHighQuality Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ToggleHifiAudio] when the action is clicked. */ @Composable public fun ToggleHifiAudioAction( modifier: Modifier = Modifier, isMusicHighQuality: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, - enabledIconTint: Color? = null, - disabledIconTint: Color? = null, - onStyle: StreamFixedSizeButtonStyle? = null, - offStyle: StreamFixedSizeButtonStyle? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.primarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (ToggleHifiAudio) -> Unit, ): Unit = ToggleAction( modifier = modifier, - enabled = enabled, - shape = shape, - enabledColor = enabledColor, - disabledColor = disabledColor, - enabledIconTint = enabledIconTint, - disabledIconTint = disabledIconTint, isActionActive = isMusicHighQuality, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_sliders_fill), + painterResource(R.drawable.stream_design_ic_sliders_fill), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_toggle_hifi_audio, + ), + enabled = enabled, onStyle = onStyle, - offStyle = offStyle ?: VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle(), - iconOnOff = Pair(Icons.Default.MusicNote, Icons.Default.MusicOff), -) { - onCallAction(ToggleHifiAudio(isHifiAudioEnabled = isMusicHighQuality.not())) -} + offStyle = offStyle, + size = size, + onAction = { onCallAction(ToggleHifiAudio(isHifiAudioEnabled = isMusicHighQuality.not())) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleMicrophoneAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleMicrophoneAction.kt index 1ac49b97076..dd1bc40072d 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleMicrophoneAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleMicrophoneAction.kt @@ -16,50 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Mic -import androidx.compose.material.icons.filled.MicOff import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.ToggleMicrophone /** - * A call action button represents toggling a microphone. + * Mutes and unmutes the microphone. * - * @param modifier Optional Modifier for this action button. - * @param isMicrophoneEnabled Represent is camera enabled. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param isMicrophoneEnabled Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ToggleMicrophone] when the action is clicked. */ @Composable public fun ToggleMicrophoneAction( modifier: Modifier = Modifier, isMicrophoneEnabled: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, - enabledIconTint: Color? = null, - disabledIconTint: Color? = null, - onStyle: StreamFixedSizeButtonStyle? = null, - offStyle: StreamFixedSizeButtonStyle? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.destructiveSolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (ToggleMicrophone) -> Unit, ): Unit = ToggleAction( modifier = modifier, - enabled = enabled, - shape = shape, - enabledColor = enabledColor, - disabledColor = disabledColor, - enabledIconTint = enabledIconTint, - disabledIconTint = disabledIconTint, isActionActive = isMicrophoneEnabled, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_voice_fill), + painterResource(R.drawable.stream_design_ic_voice_off_fill), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_toggle_microphone, + ), + enabled = enabled, onStyle = onStyle, offStyle = offStyle, - iconOnOff = Pair(Icons.Default.Mic, Icons.Default.MicOff), -) { - onCallAction(ToggleMicrophone(isMicrophoneEnabled.not())) -} + size = size, + onAction = { onCallAction(ToggleMicrophone(isMicrophoneEnabled.not())) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleSpeakerphoneAction.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleSpeakerphoneAction.kt index 98fe3fef9b3..14b74d856e9 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleSpeakerphoneAction.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ToggleSpeakerphoneAction.kt @@ -16,51 +16,49 @@ package io.getstream.video.android.compose.ui.components.call.controls.actions -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.automirrored.filled.VolumeUp -import androidx.compose.material.icons.filled.VolumeOff -import androidx.compose.material.icons.filled.VolumeUp import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.Shape -import io.getstream.video.android.compose.ui.components.base.styling.StreamFixedSizeButtonStyle -import io.getstream.video.android.core.call.state.CallAction +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.core.call.state.ToggleSpeakerphone /** - * A call action button represents toggling a speakerphone. + * Switches the audio output between the speakerphone and the earpiece. * - * @param modifier Optional Modifier for this action button. - * @param isSpeakerphoneEnabled Represent is speaker enabled. - * @param enabled Whether or not this action button will handle input events. - * @param onCallAction A [CallAction] event that will be fired. + * @param modifier The modifier applied to the button. + * @param isSpeakerphoneEnabled Whether the action is in its active state. + * @param enabled Whether the action accepts clicks. + * @param onStyle The colors of the active state. See [StreamButtonStyleDefaults]. + * @param offStyle The colors of the inactive state. See [StreamButtonStyleDefaults]. + * @param size The visual size of the button. + * @param onCallAction Called with [ToggleSpeakerphone] when the action is clicked. */ @Composable public fun ToggleSpeakerphoneAction( modifier: Modifier = Modifier, isSpeakerphoneEnabled: Boolean, enabled: Boolean = true, - shape: Shape? = null, - enabledColor: Color? = null, - disabledColor: Color? = null, - enabledIconTint: Color? = null, - disabledIconTint: Color? = null, - onStyle: StreamFixedSizeButtonStyle? = null, - offStyle: StreamFixedSizeButtonStyle? = null, + onStyle: StreamButtonStyle = StreamButtonStyleDefaults.secondarySolid, + offStyle: StreamButtonStyle = StreamButtonStyleDefaults.destructiveSolid, + size: StreamButtonSize = StreamButtonSize.Medium, onCallAction: (ToggleSpeakerphone) -> Unit, ): Unit = ToggleAction( modifier = modifier, - enabled = enabled, - shape = shape, - enabledColor = enabledColor, - disabledColor = disabledColor, - enabledIconTint = enabledIconTint, - disabledIconTint = disabledIconTint, isActionActive = isSpeakerphoneEnabled, + iconOnOff = Pair( + painterResource(R.drawable.stream_design_ic_audio), + painterResource(R.drawable.stream_design_ic_mute), + ), + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_controls_toggle_speakerphone, + ), + enabled = enabled, onStyle = onStyle, offStyle = offStyle, - iconOnOff = Pair(Icons.AutoMirrored.Filled.VolumeUp, Icons.Default.VolumeOff), -) { - onCallAction(ToggleSpeakerphone(isSpeakerphoneEnabled.not())) -} + size = size, + onAction = { onCallAction(ToggleSpeakerphone(isSpeakerphoneEnabled.not())) }, +) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/diagnostics/CallDiagnosticsContent.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/diagnostics/CallDiagnosticsContent.kt index d2d83727823..43b9f73479e 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/diagnostics/CallDiagnosticsContent.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/diagnostics/CallDiagnosticsContent.kt @@ -30,16 +30,16 @@ import androidx.compose.foundation.lazy.LazyListScope import androidx.compose.material.Icon import androidx.compose.material.IconButton import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.painterResource import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.getstream.video.android.compose.R import io.getstream.video.android.core.Call import io.getstream.video.android.core.call.stats.model.RtcAudioSourceStats import io.getstream.video.android.core.call.stats.model.RtcCodecStats @@ -73,7 +73,10 @@ public fun CallDiagnosticsContent( if (configuration.orientation == ORIENTATION_PORTRAIT) { Column { IconButton(onClick = onCloseClick) { - Icon(Icons.Filled.Close, contentDescription = null) + Icon( + painterResource(R.drawable.stream_design_ic_xmark), + contentDescription = null, + ) } LazyColumn { call.state.participants.value.forEach { @@ -104,7 +107,10 @@ public fun CallDiagnosticsContent( } else { Row { IconButton(onClick = onCloseClick) { - Icon(Icons.Filled.Close, contentDescription = null) + Icon( + painterResource(R.drawable.stream_design_ic_xmark), + contentDescription = null, + ) } LazyColumn(modifier = Modifier.weight(1f)) { PublisherDiagnosticsContent( diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/lobby/CallLobby.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/lobby/CallLobby.kt index a4d3d95c0a0..9a51fbbb691 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/lobby/CallLobby.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/lobby/CallLobby.kt @@ -50,9 +50,9 @@ import io.getstream.video.android.compose.theme.CallLobbyControlsContentParams import io.getstream.video.android.compose.theme.CallLobbyOnDisabledContentParams import io.getstream.video.android.compose.theme.CallLobbyOnRenderedContentParams import io.getstream.video.android.compose.theme.CallLobbyParticipantLabelContentParams +import io.getstream.video.android.compose.theme.UserAvatarParams import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.compose.ui.components.call.controls.actions.DefaultOnCallActionHandler import io.getstream.video.android.compose.ui.components.call.renderer.ParticipantLabel import io.getstream.video.android.compose.ui.components.indicator.MicrophoneIndicator @@ -381,12 +381,14 @@ internal fun OnDisabledContent(user: User) { .background(VideoTheme.colors.backgroundCoreSurfaceDefault) .testTag("on_disabled_content"), ) { - UserAvatar( - modifier = Modifier - .size(100.dp) - .align(Alignment.Center), - userImage = user.image, - userName = user.name.takeUnless { it.isNullOrBlank() } ?: user.id, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = user.image, + userName = user.name.takeUnless { it.isNullOrBlank() } ?: user.id, + modifier = Modifier + .size(100.dp) + .align(Alignment.Center), + ), ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/pinning/ParticipantActions.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/pinning/ParticipantActions.kt index 2cc1216e868..65063f8f942 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/pinning/ParticipantActions.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/pinning/ParticipantActions.kt @@ -16,42 +16,39 @@ package io.getstream.video.android.compose.ui.components.call.pinning +import androidx.annotation.DrawableRes import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.BoxScope import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.width import androidx.compose.foundation.shape.CircleShape import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Icon -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.PushPin -import androidx.compose.material.icons.outlined.MoreHoriz -import androidx.compose.material.icons.outlined.PushPin import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberUpdatedState import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment.Companion.Center import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.geometry.Offset -import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.onGloballyPositioned import androidx.compose.ui.layout.positionInParent import androidx.compose.ui.platform.LocalLifecycleOwner -import androidx.compose.ui.state.ToggleableState +import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize import androidx.compose.ui.unit.dp import androidx.compose.ui.window.Popup import androidx.lifecycle.lifecycleScope import io.getstream.android.video.generated.models.OwnCapability +import io.getstream.video.android.compose.R import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.base.StreamToggleButton +import io.getstream.video.android.compose.ui.components.base.StreamListItem import io.getstream.video.android.compose.ui.components.indicator.GenericIndicator import io.getstream.video.android.core.Call import io.getstream.video.android.core.ParticipantState @@ -69,7 +66,7 @@ import kotlinx.coroutines.launch * @param action the action (i.e. callable) */ public class ParticipantAction( - public val icon: ImageVector, + @DrawableRes public val icon: Int, public val label: String, public val firstToggleAction: Boolean = true, public val condition: (Call, ParticipantState) -> Boolean = { _, _ -> true }, @@ -81,7 +78,7 @@ public class ParticipantAction( */ internal val participantActions: List = listOf( ParticipantAction( - icon = Icons.Outlined.PushPin, + icon = R.drawable.stream_design_ic_pin, label = "Pin", condition = { call, participantState -> !call.isLocalPin(participantState.sessionId) @@ -93,7 +90,7 @@ internal val participantActions: List = listOf( }, ), ParticipantAction( - icon = Icons.Filled.PushPin, + icon = R.drawable.stream_design_ic_pin_fill, label = "Unpin", firstToggleAction = false, condition = { call, participantState -> @@ -106,7 +103,7 @@ internal val participantActions: List = listOf( }, ), ParticipantAction( - icon = Icons.Outlined.PushPin, + icon = R.drawable.stream_design_ic_pin, label = "Pin for everyone", condition = { call, participantState -> call.hasCapability(OwnCapability.PinForEveryone) && !call.isServerPin(participantState.sessionId) @@ -118,7 +115,7 @@ internal val participantActions: List = listOf( }, ), ParticipantAction( - icon = Icons.Filled.PushPin, + icon = R.drawable.stream_design_ic_pin_fill, label = "Unpin for everyone", firstToggleAction = false, condition = { call, participantState -> @@ -182,7 +179,7 @@ internal fun BoxScope.ParticipantActionsWithoutState( }.clip(CircleShape), ) { Icon( - imageVector = Icons.Outlined.MoreHoriz, + painter = painterResource(R.drawable.stream_design_ic_more_horizontal), contentDescription = "Call actions", tint = VideoTheme.colors.textPrimary, ) @@ -237,28 +234,28 @@ internal fun BoxScope.ParticipantActionsDialogContent( Column( Modifier .background( - VideoTheme.colors.backgroundCoreApp, - shape = RoundedCornerShape(StreamTokens.radius3xl), + VideoTheme.colors.backgroundCoreElevation1, + shape = RoundedCornerShape(StreamTokens.radiusLg), ) .align(Center) .width(220.dp), ) { actions.forEach { if (it.condition(call, participant)) { - StreamToggleButton( - modifier = Modifier.width(220.dp), - toggleState = rememberUpdatedState( - newValue = ToggleableState(!it.firstToggleAction), - ), - onIcon = it.icon, - onText = it.label, - offText = it.label, - onStyle = VideoTheme.styles.buttonStyles.toggleButtonStyleOn(), - offStyle = VideoTheme.styles.buttonStyles.toggleButtonStyleOff(), - ) { _ -> - it.action.invoke(coroutineScope, call, participant) - onDismiss() - } + StreamListItem( + title = it.label, + onClick = { + it.action.invoke(coroutineScope, call, participant) + onDismiss() + }, + leadingContent = { + Icon( + painter = painterResource(it.icon), + contentDescription = null, + modifier = Modifier.size(StreamTokens.iconSizeMd), + ) + }, + ) } } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideo.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideo.kt index 2e3dab17ad2..3411953f9f0 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideo.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/ParticipantVideo.kt @@ -40,9 +40,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.shape.ZeroCornerSize import androidx.compose.material.Icon import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.PushPin -import androidx.compose.material.icons.filled.SignalWifiBad import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect @@ -442,7 +439,9 @@ public fun BoxScope.ParticipantLabel( modifier = Modifier .padding(horizontal = 4.dp) .size(StreamTokens.size16), - imageVector = Icons.Filled.PushPin, + painter = painterResource( + io.getstream.video.android.compose.R.drawable.stream_design_ic_pin_fill, + ), contentDescription = "Pin", tint = VideoTheme.colors.textOnAccent, ) @@ -456,7 +455,9 @@ public fun BoxScope.ParticipantLabel( modifier = Modifier .padding(horizontal = 4.dp) .size(StreamTokens.size16), - imageVector = Icons.Filled.SignalWifiBad, + painter = painterResource( + io.getstream.video.android.compose.R.drawable.stream_design_ic_exclamation_triangle_fill, + ), contentDescription = "Pause", tint = VideoTheme.colors.textOnAccent, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/ScreenShareTooltip.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/ScreenShareTooltip.kt index ba83cd4c83b..dbb5ace85ee 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/ScreenShareTooltip.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/ScreenShareTooltip.kt @@ -63,7 +63,9 @@ internal fun ScreenShareTooltip( start = StreamTokens.spacingXxs, end = StreamTokens.spacingXxs, ), - painter = painterResource(id = R.drawable.stream_video_ic_screensharing), + painter = painterResource( + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_present_mobile_fill, + ), tint = VideoTheme.colors.textOnAccent, contentDescription = "Presenting", ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallControls.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallControls.kt index e26872ed072..e456a4bd4d0 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallControls.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/incomingcall/IncomingCallControls.kt @@ -23,8 +23,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.fillCircle +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize import io.getstream.video.android.compose.ui.components.call.controls.actions.AcceptCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.DeclineCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleCameraAction @@ -55,18 +54,15 @@ public fun IncomingCallControls( DeclineCallAction( modifier = Modifier.testTag("Stream_DeclineCallButton"), onCallAction = onCallAction, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle().fillCircle(1.5f), + size = StreamButtonSize.Large, ) if (isMicrophoneEnabled != null) { ToggleMicrophoneAction( modifier = Modifier.testTag("Stream_MicrophoneToggle_Enabled_$isMicrophoneEnabled"), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle(1.5f), - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), isMicrophoneEnabled = isMicrophoneEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, ) } @@ -74,11 +70,8 @@ public fun IncomingCallControls( if (isVideoCall) { ToggleCameraAction( modifier = Modifier.testTag("Stream_CameraToggle_Enabled_$isCameraEnabled"), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle(1.5f), - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), isCameraEnabled = isCameraEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, ) } @@ -86,7 +79,7 @@ public fun IncomingCallControls( AcceptCallAction( modifier = Modifier.testTag("Stream_AcceptCallButton"), onCallAction = onCallAction, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle().fillCircle(1.5f), + size = StreamButtonSize.Large, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallControls.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallControls.kt index 49bb07baf26..7417e62989b 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallControls.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/call/ringing/outgoingcall/OutgoingCallControls.kt @@ -23,8 +23,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag -import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.styling.fillCircle +import io.getstream.video.android.compose.ui.components.base.StreamButtonSize import io.getstream.video.android.compose.ui.components.call.controls.actions.CancelCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleCameraAction import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleMicrophoneAction @@ -55,20 +54,16 @@ public fun OutgoingCallControls( modifier = Modifier .testTag("Stream_MicrophoneToggle_Enabled_$isMicrophoneEnabled"), isMicrophoneEnabled = isMicrophoneEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle(1.5f), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle(1.5f), ) if (isVideoCall) { ToggleCameraAction( modifier = Modifier .testTag("Stream_CameraToggle_Enabled_$isCameraEnabled"), - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle().fillCircle( - 1.5f, - ), - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle().fillCircle(1.5f), isCameraEnabled = isCameraEnabled, + size = StreamButtonSize.Large, onCallAction = onCallAction, ) } @@ -76,7 +71,7 @@ public fun OutgoingCallControls( CancelCallAction( modifier = Modifier.testTag("Stream_DeclineCallButton"), onCallAction = onCallAction, - style = VideoTheme.styles.buttonStyles.primaryIconButtonStyle().fillCircle(1.5f), + size = StreamButtonSize.Large, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/MicrophoneIndicator.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/MicrophoneIndicator.kt index 5b945db4376..19dab9c6805 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/MicrophoneIndicator.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/MicrophoneIndicator.kt @@ -19,12 +19,12 @@ package io.getstream.video.android.compose.ui.components.indicator import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.size import androidx.compose.material.Icon -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Mic -import androidx.compose.material.icons.filled.MicOff import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import io.getstream.video.android.compose.R import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens @@ -46,16 +46,20 @@ public fun MicrophoneIndicator( if (isMicrophoneEnabled) { Icon( modifier = Modifier.align(Alignment.Center), - imageVector = Icons.Default.Mic, - tint = VideoTheme.colors.textPrimary, - contentDescription = Icons.Default.Mic.name, + painter = painterResource(R.drawable.stream_design_ic_voice_fill), + tint = VideoTheme.colors.textOnAccent, + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_participants_info_options_mute, + ), ) } else { Icon( modifier = Modifier.align(Alignment.Center), - imageVector = Icons.Default.MicOff, - tint = VideoTheme.colors.textPrimary, - contentDescription = Icons.Default.MicOff.name, + painter = painterResource(R.drawable.stream_design_ic_voice_off_fill), + tint = VideoTheme.colors.textOnAccent, + contentDescription = stringResource( + io.getstream.video.android.ui.common.R.string.stream_video_call_participants_info_options_unmute, + ), ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/NetworkQualityIndicator.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/NetworkQualityIndicator.kt index 533ee8e0de3..b8aba6dc9bd 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/NetworkQualityIndicator.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/indicator/NetworkQualityIndicator.kt @@ -70,17 +70,17 @@ internal fun barColorsFromQuality( is NetworkQuality.Good -> Triple( VideoTheme.colors.accentWarning, VideoTheme.colors.accentWarning, - VideoTheme.colors.textPrimary, + VideoTheme.colors.textOnAccent, ) is NetworkQuality.Poor -> Triple( VideoTheme.colors.accentError, - VideoTheme.colors.textPrimary, - VideoTheme.colors.textPrimary, + VideoTheme.colors.textOnAccent, + VideoTheme.colors.textOnAccent, ) is NetworkQuality.UnSpecified -> Triple( - VideoTheme.colors.textPrimary, - VideoTheme.colors.textPrimary, - VideoTheme.colors.textPrimary, + VideoTheme.colors.textOnAccent, + VideoTheme.colors.textOnAccent, + VideoTheme.colors.textOnAccent, ) } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamError.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamError.kt index 798f0816d28..19cd790d0ba 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamError.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamError.kt @@ -33,9 +33,8 @@ import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import io.getstream.video.android.compose.theme.VideoTheme -import io.getstream.video.android.compose.ui.components.base.StreamButton -import io.getstream.video.android.compose.ui.components.base.styling.ButtonStyles -import io.getstream.video.android.compose.ui.components.base.styling.StyleSize +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.core.Call import io.getstream.video.android.ui.common.R @@ -62,10 +61,10 @@ internal fun LivestreamErrorUi(call: Call, onRetryJoin: () -> Unit) { textAlign = TextAlign.Center, ) Spacer(Modifier.height(12.dp)) - StreamButton( - text = "Retry", + StreamTextButton( onClick = onRetryJoin, - style = ButtonStyles.secondaryButtonStyle(size = StyleSize.M), + text = "Retry", + style = StreamButtonStyleDefaults.secondarySolid, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamPlayerOverlay.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamPlayerOverlay.kt index cfe42592783..c120a7fc13e 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamPlayerOverlay.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamPlayerOverlay.kt @@ -93,7 +93,7 @@ private fun BoxScope.LiveBadge(call: Call) { Image( modifier = Modifier.size(22.dp), painter = painterResource( - id = io.getstream.video.android.ui.common.R.drawable.stream_video_ic_live, + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_livestream_fill, ), contentDescription = stringResource( id = io.getstream.video.android.ui.common.R.string.stream_video_live, diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamRenderer.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamRenderer.kt index 221ad42d555..d1676f8a71c 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamRenderer.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/livestream/LivestreamRenderer.kt @@ -96,7 +96,7 @@ internal fun LivestreamRenderer( Image( modifier = Modifier.alpha(0.75f), painter = painterResource( - id = io.getstream.video.android.ui.common.R.drawable.stream_video_ic_play, + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_play_fill, ), contentDescription = null, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatars.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatars.kt index 3623a7fbf6a..2571ef70b45 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatars.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/ParticipantAvatars.kt @@ -36,8 +36,9 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag import androidx.compose.ui.unit.dp +import io.getstream.video.android.compose.theme.UserAvatarParams +import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.core.MemberState import io.getstream.video.android.core.ParticipantState import io.getstream.video.android.core.model.userNameOrId @@ -66,28 +67,34 @@ public fun ParticipantAvatars( if (participants.size == 1) { val participant = participants.first() - UserAvatar( - modifier = Modifier.size(100.dp), - userName = participant.user.userNameOrId, - userImage = participant.user.image, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = participant.user.image, + userName = participant.user.userNameOrId, + modifier = Modifier.size(100.dp), + ), ) } else { Column(horizontalAlignment = Alignment.CenterHorizontally) { LazyRow(horizontalArrangement = Arrangement.spacedBy(20.dp)) { items(participants.take(2)) { participant -> - UserAvatar( - modifier = Modifier.size(StreamTokens.size24), - userName = participant.user.userNameOrId, - userImage = participant.user.image, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = participant.user.image, + userName = participant.user.userNameOrId, + modifier = Modifier.size(StreamTokens.size24), + ), ) } } if (participants.size >= 3) { - UserAvatar( - modifier = Modifier.size(StreamTokens.size16), - userName = participants[2].user.userNameOrId, - userImage = participants[2].user.image, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = participants[2].user.image, + userName = participants[2].user.userNameOrId, + modifier = Modifier.size(StreamTokens.size16), + ), ) } } @@ -125,58 +132,70 @@ public fun ParticipantAvatars( if (callUsers.isNotEmpty()) { if (callUsers.size == 1) { val user = callUsers.first() - UserAvatar( - modifier = Modifier - .size(100.dp * 2) - .testTag("Stream_ParticipantAvatar"), - userName = user.name ?: user.id, - userImage = user.imageUrl, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = user.imageUrl, + userName = user.name ?: user.id, + modifier = Modifier + .size(100.dp * 2) + .testTag("Stream_ParticipantAvatar"), + ), ) } else if (callUsers.size == 2) { val firstThree = callUsers.take(2) Row { - UserAvatar( - modifier = Modifier - .size(100.dp) - .testTag("Stream_ParticipantAvatar"), - userName = firstThree[0].userNameOrId, - userImage = firstThree[0].imageUrl, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = firstThree[0].imageUrl, + userName = firstThree[0].userNameOrId, + modifier = Modifier + .size(100.dp) + .testTag("Stream_ParticipantAvatar"), + ), ) Spacer(modifier = Modifier.width(StreamTokens.spacingXl)) - UserAvatar( - modifier = Modifier - .size(100.dp) - .testTag("Stream_ParticipantAvatar"), - userName = firstThree[1].userNameOrId, - userImage = firstThree[1].imageUrl, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = firstThree[1].imageUrl, + userName = firstThree[1].userNameOrId, + modifier = Modifier + .size(100.dp) + .testTag("Stream_ParticipantAvatar"), + ), ) } } else { Column(horizontalAlignment = Alignment.CenterHorizontally) { val firstThree = callUsers.take(if (callUsers.size >= 3) 3 else 2) - UserAvatar( - modifier = Modifier - .size(160.dp) - .padding(16.dp) - .testTag("Stream_ParticipantAvatar"), - userName = firstThree[0].userNameOrId, - userImage = firstThree[0].imageUrl, - ) - Row { - UserAvatar( + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = firstThree[0].imageUrl, + userName = firstThree[0].userNameOrId, modifier = Modifier - .size(100.dp) + .size(160.dp) + .padding(16.dp) .testTag("Stream_ParticipantAvatar"), - userName = firstThree[1].userNameOrId, - userImage = firstThree[1].imageUrl, + ), + ) + Row { + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = firstThree[1].imageUrl, + userName = firstThree[1].userNameOrId, + modifier = Modifier + .size(100.dp) + .testTag("Stream_ParticipantAvatar"), + ), ) Spacer(modifier = Modifier.width(StreamTokens.spacingXl)) - UserAvatar( - modifier = Modifier - .size(100.dp) - .testTag("Stream_ParticipantAvatar"), - userName = firstThree[2].userNameOrId, - userImage = firstThree[2].imageUrl, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = firstThree[2].imageUrl, + userName = firstThree[2].userNameOrId, + modifier = Modifier + .size(100.dp) + .testTag("Stream_ParticipantAvatar"), + ), ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantListAppBar.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantListAppBar.kt index d6f5c787324..6befa186a4c 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantListAppBar.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantListAppBar.kt @@ -22,14 +22,15 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Close import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.compose.ui.components.base.StreamIconButton import io.getstream.video.android.ui.common.R @@ -71,8 +72,13 @@ internal fun CallParticipantListAppBar( StreamIconButton( onClick = onBackPressed, - icon = Icons.Default.Close, - style = VideoTheme.styles.buttonStyles.onlyIconIconButtonStyle(), + icon = painterResource( + io.getstream.video.android.compose.R.drawable.stream_design_ic_xmark, + ), + contentDescription = stringResource( + R.string.stream_video_back_button_content_description, + ), + style = StreamButtonStyleDefaults.secondaryGhost, ) } } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsInfoActions.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsInfoActions.kt index 056bfa7cab3..ad5eac14854 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsInfoActions.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsInfoActions.kt @@ -26,9 +26,8 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.base.StreamButton +import io.getstream.video.android.compose.ui.components.base.StreamTextButton import io.getstream.video.android.compose.ui.components.call.controls.actions.ToggleMicrophoneAction import io.getstream.video.android.ui.common.R @@ -53,12 +52,10 @@ internal fun CallParticipantsInfoActions( verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.Center, ) { - StreamButton( - modifier = Modifier - .weight(1f), - onClick = { onInviteUser.invoke() }, + StreamTextButton( + modifier = Modifier.weight(1f), + onClick = onInviteUser, text = stringResource(id = R.string.stream_video_call_participants_info_options_invite), - style = VideoTheme.styles.buttonStyles.secondaryButtonStyle(), ) Spacer(modifier = Modifier.size(StreamTokens.spacingMd)) ToggleMicrophoneAction( diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsList.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsList.kt index ef2dd302bd1..284fd50e648 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsList.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/CallParticipantsList.kt @@ -41,9 +41,9 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.sp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.getstream.video.android.compose.theme.UserAvatarParams import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.core.ParticipantState import io.getstream.video.android.ui.common.R @@ -118,11 +118,13 @@ private fun CallParticipantInfoItem( val userName by participant.userNameOrId.collectAsStateWithLifecycle() val userImage by participant.image.collectAsStateWithLifecycle() - UserAvatar( - modifier = Modifier.size(StreamTokens.size24), - userImage = userImage, - userName = userName, - isShowingOnlineIndicator = true, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = userImage, + userName = userName, + modifier = Modifier.size(StreamTokens.size24), + isShowingOnlineIndicator = true, + ), ) Text( @@ -140,7 +142,9 @@ private fun CallParticipantInfoItem( val audioEnabled by participant.audioEnabled.collectAsStateWithLifecycle() if (!audioEnabled) { Icon( - painter = painterResource(id = R.drawable.stream_video_ic_mic_off), + painter = painterResource( + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_voice_off_fill, + ), tint = VideoTheme.colors.accentError, contentDescription = null, ) @@ -151,7 +155,9 @@ private fun CallParticipantInfoItem( val videoEnabled by participant.videoEnabled.collectAsStateWithLifecycle() if (!videoEnabled) { Icon( - painter = painterResource(id = R.drawable.stream_video_ic_videocam_off), + painter = painterResource( + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_video_off_fill, + ), tint = VideoTheme.colors.accentError, contentDescription = null, ) @@ -162,7 +168,9 @@ private fun CallParticipantInfoItem( onUserOptionsSelected?.let { Icon( modifier = Modifier.clickable { onUserOptionsSelected(participant) }, - painter = painterResource(id = R.drawable.stream_video_ic_options), + painter = painterResource( + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_more_vertical_fill, + ), tint = VideoTheme.colors.textPrimary, contentDescription = null, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/InviteUserList.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/InviteUserList.kt index 0da87edc80c..751aec92d5d 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/InviteUserList.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/participants/internal/InviteUserList.kt @@ -34,9 +34,9 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.res.painterResource import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle +import io.getstream.video.android.compose.theme.UserAvatarParams import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.theme.design.StreamTokens -import io.getstream.video.android.compose.ui.components.avatar.UserAvatar import io.getstream.video.android.core.ParticipantState import io.getstream.video.android.ui.common.R @@ -100,11 +100,13 @@ internal fun InviteUserItem( val userName by user.userNameOrId.collectAsStateWithLifecycle() val userImage by user.image.collectAsStateWithLifecycle() - UserAvatar( - modifier = Modifier.size(StreamTokens.size48), - userImage = userImage, - userName = userName, - isShowingOnlineIndicator = true, + VideoTheme.componentFactory.UserAvatar( + UserAvatarParams( + userImage = userImage, + userName = userName, + modifier = Modifier.size(StreamTokens.size48), + isShowingOnlineIndicator = true, + ), ) Spacer(modifier = Modifier.width(8.dp)) @@ -121,7 +123,9 @@ internal fun InviteUserItem( if (isSelected) { Image( modifier = Modifier.size(24.dp), - painter = painterResource(id = R.drawable.stream_video_ic_selected), + painter = painterResource( + id = io.getstream.video.android.compose.R.drawable.stream_design_ic_checkmark, + ), contentDescription = null, ) } diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/video/VideoRenderer.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/video/VideoRenderer.kt index c1f31dd42e8..9a722a1bca0 100644 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/video/VideoRenderer.kt +++ b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/ui/components/video/VideoRenderer.kt @@ -30,8 +30,6 @@ import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.CircularProgressIndicator import androidx.compose.material.Icon import androidx.compose.material.Text -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.SignalWifiBad import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.getValue @@ -306,9 +304,11 @@ internal fun DefaultBadNetworkFallbackContent( modifier = Modifier .padding(12.dp) .align(CenterVertically), - imageVector = Icons.Default.SignalWifiBad, + painter = painterResource( + io.getstream.video.android.compose.R.drawable.stream_design_ic_exclamation_triangle_fill, + ), contentDescription = null, - tint = VideoTheme.colors.textPrimary, + tint = VideoTheme.colors.textOnAccent, ) Text( modifier = Modifier.padding(12.dp), @@ -316,7 +316,7 @@ internal fun DefaultBadNetworkFallbackContent( id = io.getstream.video.android.ui.common.R.string.stream_video_call_bad_network, call.sessionId, ), - color = VideoTheme.colors.textPrimary, + color = VideoTheme.colors.textOnAccent, textAlign = TextAlign.Center, fontSize = 14.sp, ) diff --git a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/utils/ImageUtils.kt b/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/utils/ImageUtils.kt deleted file mode 100644 index c461bb37c55..00000000000 --- a/stream-video-android-ui-compose/src/main/kotlin/io/getstream/video/android/compose/utils/ImageUtils.kt +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2014-2026 Stream.io Inc. All rights reserved. - * - * Licensed under the Stream License; - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://github.com/GetStream/stream-video-android/blob/main/LICENSE - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package io.getstream.video.android.compose.utils - -import androidx.compose.runtime.Composable -import androidx.compose.runtime.ReadOnlyComposable -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.platform.LocalContext -import io.getstream.video.android.ui.common.R -import kotlin.math.abs - -@Composable -@ReadOnlyComposable -internal fun initialsColors(text: String): Pair { - val gradientBaseColors = - LocalContext.current.resources.getIntArray(R.array.stream_video_avatar_gradient_colors) - - val baseColorIndex = abs(text.hashCode()) % gradientBaseColors.size - val baseColor = Color(gradientBaseColors[baseColorIndex]) - return Pair(baseColor, baseColor.copy(alpha = 0.16f)) -} diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_account.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_account.xml new file mode 100644 index 00000000000..dd3d6cbb4e4 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_account.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_archive.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_archive.xml new file mode 100644 index 00000000000..26e7bb3fdf4 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_archive.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_down.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_down.xml new file mode 100644 index 00000000000..b145c10b322 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_down.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_down_circle.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_down_circle.xml new file mode 100644 index 00000000000..804d19d2e69 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_down_circle.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_left.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_left.xml new file mode 100644 index 00000000000..3310fe28fcd --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_left.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_right.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_right.xml new file mode 100644 index 00000000000..cfd5c94dabf --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_right.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_up.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_up.xml new file mode 100644 index 00000000000..fe345181907 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_up.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_up_right.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_up_right.xml new file mode 100644 index 00000000000..b47cefc67da --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_arrow_up_right.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_attachment.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_attachment.xml new file mode 100644 index 00000000000..8cc3ef1ba24 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_attachment.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_audio.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_audio.xml new file mode 100644 index 00000000000..c3bb38b7f51 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_audio.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bell.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bell.xml new file mode 100644 index 00000000000..df680fe2ad9 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bell.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bell_off.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bell_off.xml new file mode 100644 index 00000000000..4e340550943 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bell_off.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_blur_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_blur_fill.xml new file mode 100644 index 00000000000..821d30dc4c9 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_blur_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bolt.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bolt.xml new file mode 100644 index 00000000000..3a8e6027907 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bolt.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bolt_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bolt_fill.xml new file mode 100644 index 00000000000..1ae6d42e622 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_bolt_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_camera_flip_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_camera_flip_fill.xml new file mode 100644 index 00000000000..cb965888ee4 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_camera_flip_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caption_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caption_fill.xml new file mode 100644 index 00000000000..014d91dd7b9 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caption_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caret_down.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caret_down.xml new file mode 100644 index 00000000000..d13f466f70c --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caret_down.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caret_up.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caret_up.xml new file mode 100644 index 00000000000..abcc9a52d45 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_caret_up.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_checkmark.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_checkmark.xml new file mode 100644 index 00000000000..ff3d03521a6 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_checkmark.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_down.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_down.xml new file mode 100644 index 00000000000..3aece63c04b --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_down.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_left.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_left.xml new file mode 100644 index 00000000000..07863b07924 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_left.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_right.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_right.xml new file mode 100644 index 00000000000..4aa096cd302 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_right.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_up.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_up.xml new file mode 100644 index 00000000000..372ffce3d00 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_chevron_up.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_clock.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_clock.xml new file mode 100644 index 00000000000..b0d4320037f --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_clock.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_code.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_code.xml new file mode 100644 index 00000000000..e12fe9ce51c --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_code.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_command.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_command.xml new file mode 100644 index 00000000000..a103887fead --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_command.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_copy.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_copy.xml new file mode 100644 index 00000000000..6ac41b95b1c --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_copy.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_copy_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_copy_fill.xml new file mode 100644 index 00000000000..51f666b3a62 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_copy_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_dark_mode.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_dark_mode.xml new file mode 100644 index 00000000000..10ad736523a --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_dark_mode.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_delete.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_delete.xml new file mode 100644 index 00000000000..36700591ac9 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_delete.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_download.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_download.xml new file mode 100644 index 00000000000..c787687e802 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_download.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_edit.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_edit.xml new file mode 100644 index 00000000000..52300bd8abb --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_edit.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_effects_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_effects_fill.xml new file mode 100644 index 00000000000..28f45a81d8a --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_effects_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji.xml new file mode 100644 index 00000000000..edaf7546e24 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji.xml @@ -0,0 +1,34 @@ + + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji_add.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji_add.xml new file mode 100644 index 00000000000..d42f83c32e8 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji_add.xml @@ -0,0 +1,37 @@ + + + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji_add_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji_add_fill.xml new file mode 100644 index 00000000000..2fc6a7209ce --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_emoji_add_fill.xml @@ -0,0 +1,31 @@ + + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_circle.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_circle.xml new file mode 100644 index 00000000000..1f4c6018a60 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_circle.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_circle_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_circle_fill.xml new file mode 100644 index 00000000000..93679a08231 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_circle_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_mark_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_mark_fill.xml new file mode 100644 index 00000000000..354e83cf830 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_mark_fill.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_triangle_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_triangle_fill.xml new file mode 100644 index 00000000000..ad8a5f98097 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_exclamation_triangle_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_export.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_export.xml new file mode 100644 index 00000000000..7d844ebabaf --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_export.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_eye_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_eye_fill.xml new file mode 100644 index 00000000000..9fc669a9bda --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_eye_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_feedback.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_feedback.xml new file mode 100644 index 00000000000..51b6892c9ac --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_feedback.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_file.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_file.xml new file mode 100644 index 00000000000..89eaac365a0 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_file.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_flag.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_flag.xml new file mode 100644 index 00000000000..056962a0120 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_flag.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_folder.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_folder.xml new file mode 100644 index 00000000000..d8c35dca270 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_folder.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_full_blur_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_full_blur_fill.xml new file mode 100644 index 00000000000..d3c21f04652 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_full_blur_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_fullscreen_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_fullscreen_fill.xml new file mode 100644 index 00000000000..c6672026508 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_fullscreen_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_gallery.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_gallery.xml new file mode 100644 index 00000000000..f137c9cabcf --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_gallery.xml @@ -0,0 +1,46 @@ + + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_default_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_default_fill.xml new file mode 100644 index 00000000000..99f96f47fb8 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_default_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_fill.xml new file mode 100644 index 00000000000..b92d31683bc --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_pixel_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_pixel_fill.xml new file mode 100644 index 00000000000..14816ab2375 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_grid_pixel_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_image.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_image.xml new file mode 100644 index 00000000000..d196aff8067 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_image.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_info.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_info.xml new file mode 100644 index 00000000000..ea70cf1fe23 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_info.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_language.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_language.xml new file mode 100644 index 00000000000..3f008868977 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_language.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_language_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_language_fill.xml new file mode 100644 index 00000000000..6f65b347652 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_language_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_leave.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_leave.xml new file mode 100644 index 00000000000..5a150c46b0d --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_leave.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_left_to_right.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_left_to_right.xml new file mode 100644 index 00000000000..502fcfd8592 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_left_to_right.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_light_mode.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_light_mode.xml new file mode 100644 index 00000000000..94c1e1c6b0b --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_light_mode.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_link.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_link.xml new file mode 100644 index 00000000000..edc11a87b3d --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_link.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_livestream_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_livestream_fill.xml new file mode 100644 index 00000000000..9e636c279f3 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_livestream_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_loading.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_loading.xml new file mode 100644 index 00000000000..dfe80b9256c --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_loading.xml @@ -0,0 +1,31 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_location.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_location.xml new file mode 100644 index 00000000000..c4a065b1acd --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_location.xml @@ -0,0 +1,34 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_lock.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_lock.xml new file mode 100644 index 00000000000..3af15e1ca22 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_lock.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_menu.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_menu.xml new file mode 100644 index 00000000000..4d26c096d86 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_menu.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_message_bubbles_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_message_bubbles_fill.xml new file mode 100644 index 00000000000..2953bfd5a9e --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_message_bubbles_fill.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_minus.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_minus.xml new file mode 100644 index 00000000000..40586de1e3f --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_minus.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_minus_circle.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_minus_circle.xml new file mode 100644 index 00000000000..a71e888f7ce --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_minus_circle.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_more_horizontal.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_more_horizontal.xml new file mode 100644 index 00000000000..cf30defa93b --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_more_horizontal.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_more_vertical_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_more_vertical_fill.xml new file mode 100644 index 00000000000..7762f5de7d5 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_more_vertical_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_mute.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_mute.xml new file mode 100644 index 00000000000..c4b6aeee501 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_mute.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_no_sign.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_no_sign.xml new file mode 100644 index 00000000000..e1d932a45a6 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_no_sign.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_no_sign_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_no_sign_fill.xml new file mode 100644 index 00000000000..abcac2dc7bc --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_no_sign_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_notification.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_notification.xml new file mode 100644 index 00000000000..b97d9e624b1 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_notification.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pause_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pause_fill.xml new file mode 100644 index 00000000000..797c0083752 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pause_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_phone_down_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_phone_down_fill.xml new file mode 100644 index 00000000000..d7d807d3411 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_phone_down_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_phone_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_phone_fill.xml new file mode 100644 index 00000000000..d89ba42c75f --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_phone_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pin.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pin.xml new file mode 100644 index 00000000000..cad8d11f486 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pin.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pin_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pin_fill.xml new file mode 100644 index 00000000000..f9302873051 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pin_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pip_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pip_fill.xml new file mode 100644 index 00000000000..71e2ab96092 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_pip_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_play_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_play_fill.xml new file mode 100644 index 00000000000..e8ef591d08e --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_play_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_plus.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_plus.xml new file mode 100644 index 00000000000..b7e22d1b225 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_plus.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_present_desktop_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_present_desktop_fill.xml new file mode 100644 index 00000000000..b47df776322 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_present_desktop_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_present_mobile_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_present_mobile_fill.xml new file mode 100644 index 00000000000..85a3d1147e3 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_present_mobile_fill.xml @@ -0,0 +1,26 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_presentation.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_presentation.xml new file mode 100644 index 00000000000..0ac38fa94be --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_presentation.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_question_circle_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_question_circle_fill.xml new file mode 100644 index 00000000000..056721e2f5d --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_question_circle_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_raise_hand_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_raise_hand_fill.xml new file mode 100644 index 00000000000..e95535e271c --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_raise_hand_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_record_library_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_record_library_fill.xml new file mode 100644 index 00000000000..e0cca02f282 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_record_library_fill.xml @@ -0,0 +1,29 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_recording_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_recording_fill.xml new file mode 100644 index 00000000000..12d10ff4e1f --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_recording_fill.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_recording_stop_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_recording_stop_fill.xml new file mode 100644 index 00000000000..688c4a391ca --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_recording_stop_fill.xml @@ -0,0 +1,28 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_refresh.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_refresh.xml new file mode 100644 index 00000000000..9417a1d1f10 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_refresh.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_reorder.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_reorder.xml new file mode 100644 index 00000000000..7bd1fb3aba9 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_reorder.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_retry.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_retry.xml new file mode 100644 index 00000000000..c99b698c712 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_retry.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_save.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_save.xml new file mode 100644 index 00000000000..8ef280085b3 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_save.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_search.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_search.xml new file mode 100644 index 00000000000..b137085ce78 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_search.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_settings.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_settings.xml new file mode 100644 index 00000000000..ae090c1ec36 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_settings.xml @@ -0,0 +1,34 @@ + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_settings_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_settings_fill.xml new file mode 100644 index 00000000000..9c42ae1cdfb --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_settings_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_share.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_share.xml new file mode 100644 index 00000000000..73a4bb36022 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_share.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_shield.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_shield.xml new file mode 100644 index 00000000000..b87ddfa3440 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_shield.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_sidebar.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_sidebar.xml new file mode 100644 index 00000000000..cac729360ef --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_sidebar.xml @@ -0,0 +1,29 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_sliders_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_sliders_fill.xml new file mode 100644 index 00000000000..2dbb98cde94 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_sliders_fill.xml @@ -0,0 +1,40 @@ + + + + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_bottom_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_bottom_fill.xml new file mode 100644 index 00000000000..c11dd83c89f --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_bottom_fill.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_left_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_left_fill.xml new file mode 100644 index 00000000000..95d15db5f04 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_left_fill.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_right_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_right_fill.xml new file mode 100644 index 00000000000..d7158a68dde --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_right_fill.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_top_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_top_fill.xml new file mode 100644 index 00000000000..1988f1cd653 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_speaker_top_fill.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_spreadsheet.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_spreadsheet.xml new file mode 100644 index 00000000000..38dd0324794 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_spreadsheet.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_star_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_star_fill.xml new file mode 100644 index 00000000000..56cdb01a177 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_star_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_stats_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_stats_fill.xml new file mode 100644 index 00000000000..ade87cb118b --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_stats_fill.xml @@ -0,0 +1,33 @@ + + + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_stop_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_stop_fill.xml new file mode 100644 index 00000000000..1ccc62d2714 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_stop_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_translate.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_translate.xml new file mode 100644 index 00000000000..a6ceffa9b10 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_translate.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_trophy.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_trophy.xml new file mode 100644 index 00000000000..5f891dec6a7 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_trophy.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unflag.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unflag.xml new file mode 100644 index 00000000000..c0815fb522c --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unflag.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unlock.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unlock.xml new file mode 100644 index 00000000000..d9f281d6d9a --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unlock.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unpin.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unpin.xml new file mode 100644 index 00000000000..641a3ee9b32 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unpin.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unpin_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unpin_fill.xml new file mode 100644 index 00000000000..a53df935e95 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unpin_fill.xml @@ -0,0 +1,31 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unsave.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unsave.xml new file mode 100644 index 00000000000..1f6f8a6699a --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_unsave.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_upload.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_upload.xml new file mode 100644 index 00000000000..23cb842686e --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_upload.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user.xml new file mode 100644 index 00000000000..e039237c0de --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_add.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_add.xml new file mode 100644 index 00000000000..4b1d143b9cb --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_add.xml @@ -0,0 +1,30 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_add_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_add_fill.xml new file mode 100644 index 00000000000..2ce7e20fe45 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_add_fill.xml @@ -0,0 +1,27 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_check.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_check.xml new file mode 100644 index 00000000000..d02a23b3f94 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_check.xml @@ -0,0 +1,30 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_remove.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_remove.xml new file mode 100644 index 00000000000..ef06f869458 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_remove.xml @@ -0,0 +1,30 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_remove_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_remove_fill.xml new file mode 100644 index 00000000000..516e1f8d542 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_user_remove_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_users.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_users.xml new file mode 100644 index 00000000000..a57b6c9a873 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_users.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_users_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_users_fill.xml new file mode 100644 index 00000000000..14395da3cff --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_users_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_verified_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_verified_fill.xml new file mode 100644 index 00000000000..5632b0e3fc1 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_verified_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_video_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_video_fill.xml new file mode 100644 index 00000000000..6b0b00b1385 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_video_fill.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_video_off_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_video_off_fill.xml new file mode 100644 index 00000000000..d74eb9e6400 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_video_off_fill.xml @@ -0,0 +1,28 @@ + + + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_voice_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_voice_fill.xml new file mode 100644 index 00000000000..8d8457b5b32 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_voice_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_voice_off_fill.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_voice_off_fill.xml new file mode 100644 index 00000000000..529b00b2d37 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_voice_off_fill.xml @@ -0,0 +1,25 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_x_circle.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_x_circle.xml new file mode 100644 index 00000000000..78912e66a79 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_x_circle.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_xmark.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_xmark.xml new file mode 100644 index 00000000000..e983560477b --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_xmark.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_xmark_small.xml b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_xmark_small.xml new file mode 100644 index 00000000000..301aa6dc584 --- /dev/null +++ b/stream-video-android-ui-compose/src/main/res/drawable/stream_design_ic_xmark_small.xml @@ -0,0 +1,28 @@ + + + + + diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_CompoundComponentFactoryTest_compound_component_factory_overrides_a_single_component.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_CompoundComponentFactoryTest_compound_component_factory_overrides_a_single_component.png index d50c73635e5..478d4dd969e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_CompoundComponentFactoryTest_compound_component_factory_overrides_a_single_component.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_CompoundComponentFactoryTest_compound_component_factory_overrides_a_single_component.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_app_bar_with_default_title.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_app_bar_with_default_title.png index f0fb298736e..e3393da4381 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_app_bar_with_default_title.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_app_bar_with_default_title.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_lobby_controls.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_lobby_controls.png index 7b2126be0b9..279853a6d33 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_lobby_controls.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_call_lobby_controls.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_control_actions_with_default_handler.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_control_actions_with_default_handler.png index dc824fc6e0b..e99ab379d67 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_control_actions_with_default_handler.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_control_actions_with_default_handler.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content.png index 1c682bf366f..9f4e3c82361 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content_in_dark_mode.png index f56b0355808..09957b90c13 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_incoming_call_content_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content.png index 0618c416bd8..8f0f01e8a1a 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content_in_dark_mode.png index 4c3badf6ed9..07b4092bbe2 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_outgoing_call_content_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_participant_video_fallback.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_participant_video_fallback.png index 14d91831945..bed844b8557 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_participant_video_fallback.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_participant_video_fallback.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_picture_in_picture_content.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_picture_in_picture_content.png index 5bb8c3d723f..d7d26c5d09d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_picture_in_picture_content.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_picture_in_picture_content.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_screen_sharing_fallback.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_screen_sharing_fallback.png index 14d91831945..bed844b8557 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_screen_sharing_fallback.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.theme_VideoComponentFactoryTest_factory_screen_sharing_fallback.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_bottom_sheet.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_bottom_sheet.png new file mode 100644 index 00000000000..0e24d716843 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_bottom_sheet.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_bottom_sheet_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_bottom_sheet_in_dark_mode.png new file mode 100644 index 00000000000..d8947230576 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_bottom_sheet_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog.png index 4eba5fb0635..cc36294782b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_in_dark_mode.png index 73d083cf9c2..67c4b142f19 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input.png index f3cc79e66ea..dceb0da9489 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input_in_dark_mode.png index c0fb2901eb7..0c1d9c93f6d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.base_DialogsTest_stream_dialog_with_input_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog.png index 89871e43832..ea5c77ecf0c 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog_in_dark_mode.png index 97368e57278..35d8e331aba 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.activecall.internal_InviteUsersDialogTest_invite_users_dialog_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_accept_call_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_accept_call_action.png index 4c3fcda8a4b..96c4b0eea1e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_accept_call_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_accept_call_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_cancel_call_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_cancel_call_action.png deleted file mode 100644 index 7a915ae95c7..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_cancel_call_action.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_chat_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_chat_action.png index 6cfa048c1c5..e8105a4ff9d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_chat_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_chat_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_closed_captions_toggle_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_closed_captions_toggle_action.png index 9e7fe14b416..9c6709ae258 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_closed_captions_toggle_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_closed_captions_toggle_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_decline_call_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_decline_call_action.png index 7a915ae95c7..db25d26b0d7 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_decline_call_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_decline_call_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_flip_camera_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_flip_camera_action.png index c77d96a1b8d..fbfecd5766b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_flip_camera_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_flip_camera_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_leave_call_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_leave_call_action.png index 09e48052226..b9e78a5800c 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_leave_call_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_leave_call_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_screen_share_toggle_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_screen_share_toggle_action.png new file mode 100644 index 00000000000..f5d4816d4e4 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_screen_share_toggle_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_settings_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_settings_action.png index e4830237c0f..9eea1c09d9e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_settings_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_settings_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_action_in_progress.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_action_in_progress.png new file mode 100644 index 00000000000..341e5903eb8 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_action_in_progress.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_camera_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_camera_action.png index cc55716ff37..49bbe1c981c 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_camera_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_camera_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_hifi_audio_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_hifi_audio_action.png index 54610f2649e..a4f85c8e6d4 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_hifi_audio_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_hifi_audio_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_microphone_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_microphone_action.png index 4d27e4a7122..e9684cf43c0 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_microphone_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_microphone_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_speakerphone_action.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_speakerphone_action.png index 25819c70cd3..2a71f7d7bd5 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_speakerphone_action.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.controls.actions_ControlActionsTest_toggle_speakerphone_action.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions.png index d6a9ad370bb..fd8e6e60746 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions_dialog.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions_dialog.png index a63ff655a88..0d0fb8f7d43 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions_dialog.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.pinning_ParticipantActionsTest_participant_actions_dialog.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1.png index fa3b5f1d7f8..8e4da56ab60 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1_in_dark_mode.png index ba5f9753875..38073c74438 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_1_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2.png index a4abf1c1bf7..0911717433d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2_in_dark_mode.png index a9d93a5adfe..c3e3bf10a61 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_2_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3.png index 8f37dc21a24..8fc64bb74ec 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3_in_dark_mode.png index 94a4b96fbc3..6cace1c1977 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_3_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4.png index 6b179921978..4cb1da5826e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4_in_dark_mode.png index 90bebbf9878..ab24f3774da 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_4_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5.png index 120a0eb3ec2..4586519fb89 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5_in_dark_mode.png index c186903180f..2687fb8c453 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_5_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6.png index 2e59d0995a1..e17cd6446c3 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6_in_dark_mode.png index 37f62ab39ca..2d9bd147c7c 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_6_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7.png index ef24c0f17b0..f0ab2dc395a 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7_in_dark_mode.png index 1b4b044b84a..da6eadd6cf9 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_participants_7_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself.png index b9ce57aad1f..5bf92c81525 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself_in_dark_mode.png index 77dc3ded201..a01fe6d31e7 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_myself_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant.png index 905936f87c7..38a677fe1a6 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant_in_dark_mode.png index 82636d5ba71..7983e08291d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_LandscapeVideoRendererTest_landscape_screen_sharing_content_for_other_participant_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1.png index 1040fc3da09..358f085eac0 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1_in_dark_mode.png index 07e16b1e649..4f1366479d7 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_1_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2.png index 789845d70d7..23f922bb62b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2_in_dark_mode.png index 51b39088ad7..c8ec1157130 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_2_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3.png index d371a3e5968..6337128885d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3_in_dark_mode.png index 08ac1508372..f7f3239dd0d 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_3_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4.png index 5ba68e3e851..e84675c7236 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4_in_dark_mode.png index cc5bc231917..bd772e5c0e0 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_4_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5.png index c160a4e1410..54d3925a3f4 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5_in_dark_mode.png index 143f2ad849b..e6120f43c7b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_5_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6.png index a0958e0d757..9e3b24fcf54 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6_in_dark_mode.png index 399dedbcc40..41b67413eb0 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_6_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7.png index 044f47c7248..686b9e24b4a 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7_in_dark_mode.png index 5ed9fee5cf1..f105e264cea 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_participants_7_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself.png index ecba1901938..bc603fb74fd 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself_in_dark_mode.png index 8d72f36195c..613d76cdb9b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_myself_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant.png index 538fea0339e..044f4da3b25 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant_in_dark_mode.png index ade0be5bfb1..ad60632d18b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_PortraitVideoRendererTest_portrait_screen_sharing_content_for_other_participant_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape.png index 22243ec42bc..3a017125781 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape_in_dark_mode.png index eac41069634..e96af202c82 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_participants_landscape_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape.png index f80d67541b1..e01f0648a2f 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape_in_dark_mode.png index 54aa1be0038..b9de30c8def 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererLandscapeTest_spotlight_three_participants_landscape_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants.png index eb1894c6ebc..d91a1deef8e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants_in_dark_mode.png index b52e17d336a..69e218cf8a1 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_participants_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants.png index 5b185bfd6ca..9d30875d866 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants_in_dark_mode.png index 6aa68aa576b..f0eb11ddf07 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose.ui.components.call.renderer.internal_SpotlightVideoRendererTest_spotlight_two_participants_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content.png index 3cedcd375d5..bbd39311af7 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_in_dark_mode.png index d477bce1a88..aac62c74868 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_without_header.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_without_header.png deleted file mode 100644 index 3cedcd375d5..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_without_header.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_without_header_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_without_header_in_dark_mode.png deleted file mode 100644 index d477bce1a88..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_call_content_without_header_in_dark_mode.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content.png index 40f0ac459de..3deeef91538 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_in_dark_mode.png index ffe9e64c489..172f984b379 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_without_header.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_without_header.png deleted file mode 100644 index 40f0ac459de..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_without_header.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_without_header_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_without_header_in_dark_mode.png deleted file mode 100644 index ffe9e64c489..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioCallContentTest_audio_only_call_content_without_header_in_dark_mode.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions.png index 848fed4a928..534dfdf8177 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions_in_dark_mode.png index 44b69a9b6d3..e4317544196 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_control_actions_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid.png index a919196d1b3..66a115a6b98 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid_in_dark_mode.png index c68dd7f8689..3c9053d3c55 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_participants_grid_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room.png index cc33127548c..4e779fe54e5 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room_in_dark_mode.png index 559ea50aceb..bd7f739d763 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AudioRoomTest_audio_room_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_avatar_initials.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_avatar_initials.png index 31c4cb06d44..4858f787f74 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_avatar_initials.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_avatar_initials.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_user_avatar.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_user_avatar.png index bcb9025dc26..a4038426d04 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_user_avatar.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_AvatarTest_user_avatar.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_badges_with_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_badges_with_buttons.png index 969b4040b7d..75aa84018aa 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_badges_with_buttons.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_badges_with_buttons.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_sizes.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_sizes.png new file mode 100644 index 00000000000..9cfbf8619d6 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_sizes.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_styles_disabled.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_styles_disabled.png new file mode 100644 index 00000000000..0d67e09bb81 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_styles_disabled.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_styles_enabled.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_styles_enabled.png new file mode 100644 index 00000000000..4967704838b Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_styles_enabled.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_with_icons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_with_icons.png deleted file mode 100644 index 7f17f5528b1..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_button_with_icons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_different_size_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_different_size_buttons.png deleted file mode 100644 index 234cce56911..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_different_size_buttons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_input_fields.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_input_fields.png deleted file mode 100644 index 30a975f371a..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_input_fields.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_input_fields_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_input_fields_in_dark_mode.png deleted file mode 100644 index a95bba06871..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_input_fields_in_dark_mode.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_list_items.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_list_items.png new file mode 100644 index 00000000000..b7066242823 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_list_items.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_buttons.png deleted file mode 100644 index c15f50348e3..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_buttons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_buttons_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_buttons_in_dark_mode.png deleted file mode 100644 index 72762f50c3a..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_buttons_in_dark_mode.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_icon_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_icon_buttons.png deleted file mode 100644 index d26562896c1..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_regular_icon_buttons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_scrim.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_scrim.png new file mode 100644 index 00000000000..bc959558044 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_scrim.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_show_progress_into_icon_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_show_progress_into_icon_buttons.png deleted file mode 100644 index 24ce564a2b0..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_show_progress_into_icon_buttons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_text_fields.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_text_fields.png new file mode 100644 index 00000000000..a765a7291dc Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_text_fields.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_text_fields_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_text_fields_in_dark_mode.png new file mode 100644 index 00000000000..4a71e66f0a8 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_text_fields_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_toggle_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_toggle_buttons.png deleted file mode 100644 index 9de1967492c..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_toggle_buttons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_toggle_icon_buttons.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_toggle_icon_buttons.png deleted file mode 100644 index 3060c211b3b..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_BaseComponentsTest_toggle_icon_buttons.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallComponentsPortraitTest_call_app_bar.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallComponentsPortraitTest_call_app_bar.png index f0fb298736e..e3393da4381 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallComponentsPortraitTest_call_app_bar.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallComponentsPortraitTest_call_app_bar.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload.png index 8d550b3c66f..e2e6d7c3c9b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload_in_dark_mode.png index 065560a20ad..9ada0821796 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_deprecated_overload_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants.png index 8d550b3c66f..e2e6d7c3c9b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants_in_dark_mode.png index 065560a20ad..9ada0821796 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_call_content_with_multiple_participants_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters.png index 1c682bf366f..9f4e3c82361 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters_in_dark_mode.png index f56b0355808..09957b90c13 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_minimum_parameters_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants.png index 742abfe05ef..75a796f34ed 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants_in_dark_mode.png index 65844091a97..ea6b0fcab28 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_multiple_participants_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant.png index a9dd1452183..0e55228ac9b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant_in_dark_mode.png index 10c231df13c..b21691789e9 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_content_with_one_participant_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_audio.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_audio.png index 9a48352f2ef..c1303adce69 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_audio.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_audio.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_video.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_video.png deleted file mode 100644 index 99418855a0c..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_details_video.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_options.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_options.png index db774898a7e..00c29165bb2 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_options.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_incoming_call_options.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_audio_type.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_audio_type.png deleted file mode 100644 index 8fdbd084173..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_audio_type.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_audio_type_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_audio_type_in_dark_mode.png deleted file mode 100644 index a51427bf0f2..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_audio_type_in_dark_mode.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type.png index 0618c416bd8..8f0f01e8a1a 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type_in_dark_mode.png index 4c3badf6ed9..07b4092bbe2 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_minimum_parameters_and_video_type_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants.png index 913f34dbef6..5f0ee033e30 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants_in_dark_mode.png index 3e233e05ff6..4f51b4c34f5 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_multiple_participants_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant.png index 0a2b3552706..e26c389e03b 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant_in_dark_mode.png index 68e55e2a3bc..fea4b4b72ae 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_content_with_one_participant_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_details_video.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_details_video.png index b94d24e0e9c..1774fe49667 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_details_video.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_details_video.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_options.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_options.png index 6388c11b949..3064f094bfd 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_options.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallContentTest_outgoing_call_options.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_control_actions.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_control_actions.png index 6b6da7d6615..9592faeba55 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_control_actions.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_control_actions.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_controls.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_controls.png index dc824fc6e0b..e99ab379d67 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_controls.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallControlsTest_call_controls.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby.png index c096f67d0b6..fe288cef973 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_deprecated_overload.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_deprecated_overload.png index c096f67d0b6..fe288cef973 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_deprecated_overload.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_deprecated_overload.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_with_camera_disabled.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_with_camera_disabled.png index 32a60704b7a..a870d425381 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_with_camera_disabled.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_CallLobbyTest_call_lobby_with_camera_disabled.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_connection_quality_indicator.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_connection_quality_indicator.png index aeba6302126..64bedf8e6d5 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_connection_quality_indicator.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_connection_quality_indicator.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_participant_label.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_participant_label.png index 6c8423a62d8..e9aa7cf9009 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_participant_label.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_participant_label.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_sound_indicator.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_sound_indicator.png index 0869f3cad7a..2067880850a 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_sound_indicator.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_IndicatorsTest_sound_indicator.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player.png index d2497ab4e76..d7437dc3c68 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_in_dark_mode.png index 2eab4693552..ce43737adc9 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_overlay.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_overlay.png index 6ce57ffa1ac..5f58684cdfd 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_overlay.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_LivestreamTest_livestream_player_overlay.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantLandscapeTest_participants_row.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantLandscapeTest_participants_row.png index 8e058abc08a..ce7f9cb81f1 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantLandscapeTest_participants_row.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantLandscapeTest_participants_row.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_local.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_local.png deleted file mode 100644 index f6e2662faed..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_local.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_local_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_local_in_dark_mode.png deleted file mode 100644 index 1df3deeac84..00000000000 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_local_in_dark_mode.png and /dev/null differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote.png index 33db42b4191..e30dee1e6dd 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote_in_dark_mode.png index 5cd16f8d416..ce33289b762 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participant_remote_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_app_bar.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_app_bar.png index d1b91e5b00b..e2905242544 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_app_bar.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_app_bar.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_options.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_options.png index 05f90839dc1..795e49a464e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_options.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_info_options.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list.png index d4b39561341..0bda6427ead 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list_in_dark_mode.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list_in_dark_mode.png index abd2a04aee0..afdda95afca 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list_in_dark_mode.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_call_participants_list_in_dark_mode.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_invite_user_list.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_invite_user_list.png index afebd521cc1..49c38e1bf4c 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_invite_user_list.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_invite_user_list.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars.png index 9a50aa83c71..7bd6302cf7e 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_deprecated_overload.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_deprecated_overload.png new file mode 100644 index 00000000000..e974dda3c32 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_deprecated_overload.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_with_one_member.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_with_one_member.png new file mode 100644 index 00000000000..6869b1ed44e Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_with_one_member.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_with_two_members.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_with_two_members.png new file mode 100644 index 00000000000..1ed2a468550 Binary files /dev/null and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participant_avatars_with_two_members.png differ diff --git a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participants_column.png b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participants_column.png index dc79bbe4673..cf71082db4f 100644 Binary files a/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participants_column.png and b/stream-video-android-ui-compose/src/test/snapshots/images/io.getstream.video.android.compose_ParticipantsPortraitTest_participants_column.png differ diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/AudioCallContentTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/AudioCallContentTest.kt index 00fb921525f..8844fe96a76 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/AudioCallContentTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/AudioCallContentTest.kt @@ -21,9 +21,7 @@ import com.android.ide.common.rendering.api.SessionParams import io.getstream.video.android.compose.ui.PIXEL_4A_HDPI import io.getstream.video.android.compose.ui.PaparazziComposeTest import io.getstream.video.android.compose.ui.components.call.activecall.AudioCallContentPreview -import io.getstream.video.android.compose.ui.components.call.activecall.AudioCallContentWithoutHeaderPreview import io.getstream.video.android.compose.ui.components.call.activecall.AudioOnlyCallContentPreview -import io.getstream.video.android.compose.ui.components.call.activecall.AudioOnlyCallContentWithoutHeaderPreview import org.junit.Rule import org.junit.Test @@ -49,20 +47,6 @@ internal class AudioCallContentTest : PaparazziComposeTest { } } - @Test - fun `audio call content without header`() { - snapshot { - AudioCallContentWithoutHeaderPreview() - } - } - - @Test - fun `audio call content without header in dark mode`() { - snapshot(isInDarkMode = true) { - AudioCallContentWithoutHeaderPreview() - } - } - @Test fun `audio only call content`() { snapshot { @@ -76,18 +60,4 @@ internal class AudioCallContentTest : PaparazziComposeTest { AudioOnlyCallContentPreview() } } - - @Test - fun `audio only call content without header`() { - snapshot { - AudioOnlyCallContentWithoutHeaderPreview() - } - } - - @Test - fun `audio only call content without header in dark mode`() { - snapshot(isInDarkMode = true) { - AudioOnlyCallContentWithoutHeaderPreview() - } - } } diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/BaseComponentsTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/BaseComponentsTest.kt index 984147822ef..26638b3b447 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/BaseComponentsTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/BaseComponentsTest.kt @@ -21,15 +21,12 @@ import com.android.ide.common.rendering.api.SessionParams import io.getstream.video.android.compose.ui.PIXEL_4A_HDPI import io.getstream.video.android.compose.ui.PaparazziComposeTest import io.getstream.video.android.compose.ui.components.base.BadgesWithButtonsPreview -import io.getstream.video.android.compose.ui.components.base.ButtonWithIconsPreview -import io.getstream.video.android.compose.ui.components.base.DifferentSizeButtonsPreview import io.getstream.video.android.compose.ui.components.base.GenericContainerPreview -import io.getstream.video.android.compose.ui.components.base.InputFieldsPreview -import io.getstream.video.android.compose.ui.components.base.RegularButtonsPreview -import io.getstream.video.android.compose.ui.components.base.RegularIconButtonsPreview -import io.getstream.video.android.compose.ui.components.base.ShowProgressIntoIconButtonsPreview -import io.getstream.video.android.compose.ui.components.base.ToggleButtonsPreview -import io.getstream.video.android.compose.ui.components.base.ToggleIconButtonsPreview +import io.getstream.video.android.compose.ui.components.base.StreamButtonSizesPreview +import io.getstream.video.android.compose.ui.components.base.StreamButtonStylesPreview +import io.getstream.video.android.compose.ui.components.base.StreamListItemsPreview +import io.getstream.video.android.compose.ui.components.base.StreamScrimPreview +import io.getstream.video.android.compose.ui.components.base.StreamTextFieldPreview import org.junit.Rule import org.junit.Test @@ -42,86 +39,65 @@ internal class BaseComponentsTest : PaparazziComposeTest { ) @Test - fun `regular icon buttons`() { + fun `button styles enabled`() { snapshotWithDarkMode { - RegularIconButtonsPreview() + StreamButtonStylesPreview(enabled = true) } } @Test - fun `regular buttons`() { - snapshot { - RegularButtonsPreview() - } - } - - @Test - fun `regular buttons in dark mode`() { - snapshot(isInDarkMode = true) { - RegularButtonsPreview() - } - } - - @Test - fun `button with icons`() { + fun `button styles disabled`() { snapshotWithDarkMode { - ButtonWithIconsPreview() + StreamButtonStylesPreview(enabled = false) } } @Test - fun `different size buttons`() { + fun `button sizes`() { snapshotWithDarkMode { - DifferentSizeButtonsPreview() + StreamButtonSizesPreview() } } @Test - fun `toggle icon buttons`() { - snapshotWithDarkMode { - ToggleIconButtonsPreview() + fun `text fields`() { + snapshot { + StreamTextFieldPreview() } } @Test - fun `toggle buttons`() { - snapshotWithDarkMode { - ToggleButtonsPreview() + fun `text fields in dark mode`() { + snapshot(isInDarkMode = true) { + StreamTextFieldPreview() } } @Test - fun `show progress into icon buttons`() { + fun `generic container`() { snapshotWithDarkMode { - ShowProgressIntoIconButtonsPreview() - } - } - - @Test - fun `input fields`() { - snapshot { - InputFieldsPreview() + GenericContainerPreview() } } @Test - fun `input fields in dark mode`() { - snapshot(isInDarkMode = true) { - InputFieldsPreview() + fun `badges with buttons`() { + snapshotWithDarkMode { + BadgesWithButtonsPreview() } } @Test - fun `generic container`() { + fun `list items`() { snapshotWithDarkMode { - GenericContainerPreview() + StreamListItemsPreview() } } @Test - fun `badges with buttons`() { + fun `scrim`() { snapshotWithDarkMode { - BadgesWithButtonsPreview() + StreamScrimPreview() } } } diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/CallContentTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/CallContentTest.kt index 2aafc2ea7c5..48f5ce1a5aa 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/CallContentTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/CallContentTest.kt @@ -27,8 +27,6 @@ import io.getstream.video.android.compose.ui.components.call.ringing.incomingcal import io.getstream.video.android.compose.ui.components.call.ringing.incomingcall.IncomingCallContentOneParticipantPreview import io.getstream.video.android.compose.ui.components.call.ringing.incomingcall.IncomingCallControlsPreview import io.getstream.video.android.compose.ui.components.call.ringing.incomingcall.IncomingCallDetailsAudioPreview -import io.getstream.video.android.compose.ui.components.call.ringing.incomingcall.IncomingCallDetailsVideoPreview -import io.getstream.video.android.compose.ui.components.call.ringing.outgoingcall.OutgoingCallContentMinimumAudioPreview import io.getstream.video.android.compose.ui.components.call.ringing.outgoingcall.OutgoingCallContentMinimumVideoPreview import io.getstream.video.android.compose.ui.components.call.ringing.outgoingcall.OutgoingCallContentMultipleParticipantsPreview import io.getstream.video.android.compose.ui.components.call.ringing.outgoingcall.OutgoingCallContentOneParticipantPreview @@ -45,13 +43,6 @@ internal class CallContentTest : PaparazziComposeTest { renderingMode = SessionParams.RenderingMode.SHRINK, ) - @Test - fun `incoming call details video`() { - snapshotWithDarkMode { - IncomingCallDetailsVideoPreview() - } - } - @Test fun `incoming call details audio`() { snapshotWithDarkMode { @@ -191,18 +182,4 @@ internal class CallContentTest : PaparazziComposeTest { OutgoingCallContentMinimumVideoPreview() } } - - @Test - fun `outgoing call content with minimum parameters and audio type`() { - snapshot { - OutgoingCallContentMinimumAudioPreview() - } - } - - @Test - fun `outgoing call content with minimum parameters and audio type in dark mode`() { - snapshot(isInDarkMode = true) { - OutgoingCallContentMinimumAudioPreview() - } - } } diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ParticipantsPortraitTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ParticipantsPortraitTest.kt index 6db2b84c06d..0ae6ec5730c 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ParticipantsPortraitTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ParticipantsPortraitTest.kt @@ -20,12 +20,14 @@ import app.cash.paparazzi.Paparazzi import com.android.ide.common.rendering.api.SessionParams import io.getstream.video.android.compose.ui.PIXEL_4A_HDPI import io.getstream.video.android.compose.ui.PaparazziComposeTest -import io.getstream.video.android.compose.ui.components.call.renderer.CallParticipantLocalPreview import io.getstream.video.android.compose.ui.components.call.renderer.CallParticipantRemotePreview import io.getstream.video.android.compose.ui.components.call.renderer.LocalVideoContentPreview import io.getstream.video.android.compose.ui.components.call.renderer.ParticipantVideoPreview import io.getstream.video.android.compose.ui.components.call.renderer.internal.ParticipantsColumnPreview +import io.getstream.video.android.compose.ui.components.participants.ParticipantAvatarsDeprecatedOverloadPreview +import io.getstream.video.android.compose.ui.components.participants.ParticipantAvatarsOneMemberPreview import io.getstream.video.android.compose.ui.components.participants.ParticipantAvatarsPreview +import io.getstream.video.android.compose.ui.components.participants.ParticipantAvatarsTwoMembersPreview import io.getstream.video.android.compose.ui.components.participants.internal.CallParticipantListAppBarPreview import io.getstream.video.android.compose.ui.components.participants.internal.CallParticipantsInfoActionsPreview import io.getstream.video.android.compose.ui.components.participants.internal.CallParticipantsListPreview @@ -50,44 +52,51 @@ internal class ParticipantsPortraitTest : PaparazziComposeTest { } @Test - fun `participant information`() { + fun `participant avatars with one member`() { snapshotWithDarkMode { - ParticipantInformationPreview() + ParticipantAvatarsOneMemberPreview() } } @Test - fun `invite user list`() { + fun `participant avatars with two members`() { snapshotWithDarkMode { - InviteUserListPreview() + ParticipantAvatarsTwoMembersPreview() } } @Test - fun `call participants info options`() { + fun `participant avatars deprecated overload`() { snapshotWithDarkMode { - CallParticipantsInfoActionsPreview() + ParticipantAvatarsDeprecatedOverloadPreview() } } @Test - fun `call participants info app bar`() { + fun `participant information`() { snapshotWithDarkMode { - CallParticipantListAppBarPreview() + ParticipantInformationPreview() } } @Test - fun `call participant local`() { - snapshot { - CallParticipantLocalPreview() + fun `invite user list`() { + snapshotWithDarkMode { + InviteUserListPreview() } } @Test - fun `call participant local in dark mode`() { - snapshot(isInDarkMode = true) { - CallParticipantLocalPreview() + fun `call participants info options`() { + snapshotWithDarkMode { + CallParticipantsInfoActionsPreview() + } + } + + @Test + fun `call participants info app bar`() { + snapshotWithDarkMode { + CallParticipantListAppBarPreview() } } diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsTest.kt index e0aadfc26a2..ada0c7e692c 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/base/DialogsTest.kt @@ -22,6 +22,9 @@ import io.getstream.video.android.compose.ui.PaparazziComposeTest import org.junit.Rule import org.junit.Test +/** + * Dialogs and sheets open their own window, so each palette gets its own full screen snapshot. + */ internal class DialogsTest : PaparazziComposeTest { @get:Rule @@ -56,4 +59,18 @@ internal class DialogsTest : PaparazziComposeTest { StreamDialogWithInputPreview() } } + + @Test + fun `stream bottom sheet`() { + snapshot { + StreamBottomSheetPreview() + } + } + + @Test + fun `stream bottom sheet in dark mode`() { + snapshot(isInDarkMode = true) { + StreamBottomSheetPreview() + } + } } diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ControlActionsTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ControlActionsTest.kt index 07e7e2a5920..c2a485994c6 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ControlActionsTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/controls/actions/ControlActionsTest.kt @@ -38,13 +38,6 @@ internal class ControlActionsTest : PaparazziComposeTest { } } - @Test - fun `cancel call action`() { - snapshotWithDarkModeRow { - CancelCallActionPreview() - } - } - @Test fun `chat action`() { snapshotWithDarkModeRow { @@ -80,6 +73,20 @@ internal class ControlActionsTest : PaparazziComposeTest { } } + @Test + fun `screen share toggle action`() { + snapshotWithDarkModeRow { + ScreenShareToggleActionPreview() + } + } + + @Test + fun `toggle action in progress`() { + snapshotWithDarkMode { + ToggleActionInProgressPreview() + } + } + @Test fun `settings action`() { snapshotWithDarkModeRow { diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererTest.kt index b0fbdd751e4..6453d90afae 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/LandscapeVideoRendererTest.kt @@ -114,30 +114,30 @@ internal class LandscapeVideoRendererTest : PaparazziComposeTest { } @Test - fun `landscape participants 7`() { + fun `landscape screen sharing content for other participant`() { snapshot { - LandscapeParticipantsPreview7() + LandscapeScreenSharingContentPreview() } } @Test - fun `landscape participants 7 in dark mode`() { + fun `landscape screen sharing content for other participant in dark mode`() { snapshot(isInDarkMode = true) { - LandscapeParticipantsPreview7() + LandscapeScreenSharingContentPreview() } } @Test - fun `landscape screen sharing content for other participant`() { + fun `landscape participants 7`() { snapshot { - LandscapeScreenSharingContentPreview() + LandscapeParticipantsPreview7() } } @Test - fun `landscape screen sharing content for other participant in dark mode`() { + fun `landscape participants 7 in dark mode`() { snapshot(isInDarkMode = true) { - LandscapeScreenSharingContentPreview() + LandscapeParticipantsPreview7() } } diff --git a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererTest.kt b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererTest.kt index 0f28980f703..758e22f8192 100644 --- a/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererTest.kt +++ b/stream-video-android-ui-compose/src/testDebug/kotlin/io/getstream/video/android/compose/ui/components/call/renderer/internal/PortraitVideoRendererTest.kt @@ -114,30 +114,30 @@ internal class PortraitVideoRendererTest : PaparazziComposeTest { } @Test - fun `portrait participants 7`() { + fun `portrait screen sharing content for other participant`() { snapshot { - PortraitParticipantsPreview7() + PortraitScreenSharingContentPreview() } } @Test - fun `portrait participants 7 in dark mode`() { + fun `portrait screen sharing content for other participant in dark mode`() { snapshot(isInDarkMode = true) { - PortraitParticipantsPreview7() + PortraitScreenSharingContentPreview() } } @Test - fun `portrait screen sharing content for other participant`() { + fun `portrait participants 7`() { snapshot { - PortraitScreenSharingContentPreview() + PortraitParticipantsPreview7() } } @Test - fun `portrait screen sharing content for other participant in dark mode`() { + fun `portrait participants 7 in dark mode`() { snapshot(isInDarkMode = true) { - PortraitScreenSharingContentPreview() + PortraitParticipantsPreview7() } } diff --git a/stream-video-android-ui-core/src/main/res/values/strings.xml b/stream-video-android-ui-core/src/main/res/values/strings.xml index 994d8d67a70..4e724189e51 100644 --- a/stream-video-android-ui-core/src/main/res/values/strings.xml +++ b/stream-video-android-ui-core/src/main/res/values/strings.xml @@ -30,6 +30,10 @@ Toggle microphone Toggle camera Toggle Speakerphone + Decline call + Toggle high quality audio + Toggle closed captions + Toggle screen sharing Invite Unmute Me Mute Me diff --git a/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/ui/LiveButton.kt b/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/ui/LiveButton.kt index 5fc464b04fa..1f1f27f0b04 100644 --- a/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/ui/LiveButton.kt +++ b/tutorials/tutorial-livestream/src/main/kotlin/io/getstream/video/android/tutorial/livestream/ui/LiveButton.kt @@ -21,7 +21,6 @@ import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size -import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.material.Button import androidx.compose.material.ButtonDefaults import androidx.compose.material.Icon @@ -93,7 +92,6 @@ fun LiveButton( ToggleCameraAction( modifier = Modifier.size(45.dp), isCameraEnabled = isCameraEnabled, - shape = RoundedCornerShape(8.dp), onCallAction = { callAction -> call.camera.setEnabled(callAction.isEnabled) }, ) @@ -102,7 +100,6 @@ fun LiveButton( .padding(horizontal = 12.dp) .size(45.dp), isMicrophoneEnabled = isMicrophoneEnabled, - shape = RoundedCornerShape(8.dp), onCallAction = { callAction -> call.microphone.setEnabled(callAction.isEnabled) }, ) } diff --git a/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/BusyCallActivity.kt b/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/BusyCallActivity.kt index 3eeb78e5e58..6e01ea794f9 100644 --- a/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/BusyCallActivity.kt +++ b/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/BusyCallActivity.kt @@ -28,14 +28,15 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import androidx.lifecycle.compose.collectAsStateWithLifecycle -import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.ComposeStreamCallActivity import io.getstream.video.android.compose.ui.StreamCallActivityComposeDelegate +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.compose.ui.components.call.controls.actions.AcceptCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.DeclineCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.GenericAction @@ -115,8 +116,7 @@ class BusyCallActivity : ComposeStreamCallActivity() { if (isVideoType) { ToggleCameraAction( - onStyle = VideoTheme.styles.buttonStyles.tertiaryIconButtonStyle(), - offStyle = VideoTheme.styles.buttonStyles.secondaryIconButtonStyle(), + onStyle = StreamButtonStyleDefaults.secondaryGhost, isCameraEnabled = isCameraEnabled, onCallAction = onCallAction, ) @@ -139,16 +139,14 @@ fun BusyCallAction( modifier: Modifier = Modifier, enabled: Boolean = true, onCallAction: (BusyCall) -> Unit, - icon: ImageVector? = null, - bgColor: Color? = null, - iconTint: Color? = null, + icon: Painter? = null, + style: StreamButtonStyle = StreamButtonStyleDefaults.destructiveSolid, ): Unit = GenericAction( modifier = modifier, + icon = icon ?: rememberVectorPainter(Icons.Default.Close), enabled = enabled, + style = style, onAction = { onCallAction(BusyCall) }, - icon = icon ?: Icons.Default.Close, - color = bgColor ?: VideoTheme.colors.accentError, - iconTint = iconTint ?: VideoTheme.colors.textPrimary, ) data object BusyCall : CustomAction(tag = "busy") diff --git a/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/CustomCallActivity.kt b/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/CustomCallActivity.kt index 1c3e84bed67..85291517cdb 100644 --- a/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/CustomCallActivity.kt +++ b/tutorials/tutorial-ringing/src/main/kotlin/io/getstream/video/android/tutorial/ringing/CustomCallActivity.kt @@ -27,13 +27,14 @@ import androidx.compose.material.icons.filled.Call import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.graphics.Color -import androidx.compose.ui.graphics.vector.ImageVector +import androidx.compose.ui.graphics.painter.Painter +import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp -import io.getstream.video.android.compose.theme.VideoTheme import io.getstream.video.android.compose.ui.ComposeStreamCallActivity import io.getstream.video.android.compose.ui.StreamCallActivityComposeDelegate +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyle +import io.getstream.video.android.compose.ui.components.base.StreamButtonStyleDefaults import io.getstream.video.android.compose.ui.components.call.controls.actions.AcceptCallAction import io.getstream.video.android.compose.ui.components.call.controls.actions.GenericAction import io.getstream.video.android.core.Call @@ -169,16 +170,14 @@ public fun CustomRejectAction( reason: String, enabled: Boolean = true, onCallAction: (CustomAction) -> Unit, - icon: ImageVector? = null, - bgColor: Color? = null, - iconTint: Color? = null, + icon: Painter? = null, + style: StreamButtonStyle = StreamButtonStyleDefaults.destructiveSolid, ): Unit = GenericAction( modifier = modifier, + icon = icon ?: rememberVectorPainter(Icons.Default.Call), enabled = enabled, + style = style, onAction = { onCallAction(CustomRejectCall(reason)) }, - icon = icon ?: Icons.Default.Call, - color = bgColor ?: VideoTheme.colors.accentError, - iconTint = iconTint ?: VideoTheme.colors.textPrimary, ) data class CustomRejectCall(val reason: String) : CustomAction(tag = "custom-reject")