Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ androidxActivity = "1.9.2"
androidxDataStore = "1.1.1"
googleService = "4.4.2"

androidxComposeBom = "2024.11.00"
androidxComposeBom = "2025.08.01"
androidxComposeTracing = "1.0.0-beta01"
androidxHiltNavigation = "1.2.0"
androidxComposeNavigation = "2.8.4"
Expand Down Expand Up @@ -69,7 +69,7 @@ androidxUiAutomator = "2.4.0-alpha01"
androidxContraintLayout = "2.1.4"
androidxEspresso = "3.5.1"
androidxMedia = "1.7.0"
paparazzi = "1.3.4"
paparazzi = "1.3.5"
robolectric = "4.11.1"
junit = "4.13.2"
truth = "1.1.3"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import io.getstream.video.android.core.model.MediaTrack
import io.getstream.video.android.model.User
import io.getstream.webrtc.VideoTrack
import kotlinx.coroutines.flow.first
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import kotlinx.coroutines.withTimeout
import org.threeten.bp.OffsetDateTime
Expand Down Expand Up @@ -78,9 +79,13 @@ public val previewCall: Call = Call(
state.upsertParticipants(participants)
// The sorted participants state is filled asynchronously on the call scope. Wait for it so
// composables that read call.state.participants never render the transient empty state.
// The duration flow emits its first value after a one second delay. Keep it subscribed and
// wait for that value once, so compositions never race between "no duration" and "0s".
state.scope.launch { state.duration.collect {} }
runBlocking {
withTimeout(5_000) {
state.participants.first { it.size == participants.size }
state.duration.first { it != null }
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1619,7 +1619,7 @@ public final class io/getstream/video/android/compose/ui/components/call/diagnos
public final fun getLambda$-1813442361$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function3;
public final fun getLambda$-2145781751$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function3;
public final fun getLambda$-547082680$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function2;
public final fun getLambda$841979657$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function3;
public final fun getLambda$1939297546$stream_video_android_ui_compose_release ()Lkotlin/jvm/functions/Function3;
}

public final class io/getstream/video/android/compose/ui/components/call/lobby/CallLobbyKt {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -43,16 +43,6 @@ import io.getstream.video.android.compose.ui.components.avatar.LocalAvatarPrevie
import io.getstream.video.android.mock.StreamPreviewDataUtils
import org.junit.Rule

/**
* Goldens are recorded on developer machines (macOS) and verified on Linux CI. On the
* Paparazzi version this repo can use with Kotlin 1.9 (1.3.4), font antialiasing differs
* slightly between the two platforms: CI measured diffs of 0.10% to 0.30% on goldens that
* are pixel-identical intent-wise, against a default threshold of 0.1%. Real visual changes
* are far above 0.5%. Revisit after the Kotlin 2 / Paparazzi 1.3.5 upgrade (the chat repo
* runs that stack with the default threshold).
*/
internal const val MAX_PERCENT_DIFFERENCE = 0.5

/**
* [DeviceConfig.PIXEL_2] geometry (411x731dp) at hdpi. The dp layout is identical to the
* Pixel 2, but rendering at 1.5x keeps the golden files small, which speeds up comparisons.
Expand Down Expand Up @@ -99,7 +89,7 @@ internal interface PaparazziComposeTest {
Box(
modifier = Modifier
.background(
backgroundColor.takeOrElse { VideoTheme.colors.baseSheetPrimary },
backgroundColor.takeOrElse(VideoTheme.colors::baseSheetPrimary),
),
contentAlignment = contentAlignment,
) {
Expand All @@ -110,8 +100,13 @@ internal interface PaparazziComposeTest {
}
}

/**
* Renders [composable] twice, dark above light. For components only: a full-screen composable
* takes the whole height and hides the second half; snapshot those in two files with [snapshot].
*/
fun snapshotWithDarkMode(
contentAlignment: Alignment = Alignment.TopStart,
backgroundColor: Color = Color.Unspecified,
composable: @Composable () -> Unit,
) {
paparazzi.snapshot {
Expand All @@ -121,7 +116,9 @@ internal interface PaparazziComposeTest {
Box(
modifier = Modifier
.weight(weight = .5f, fill = false)
.background(VideoTheme.colors.baseSheetPrimary),
.background(
backgroundColor.takeOrElse(VideoTheme.colors::baseSheetPrimary),
),
contentAlignment = contentAlignment,
) {
composable()
Expand All @@ -131,7 +128,9 @@ internal interface PaparazziComposeTest {
Box(
modifier = Modifier
.weight(weight = .5f, fill = false)
.background(VideoTheme.colors.baseSheetPrimary),
.background(
backgroundColor.takeOrElse(VideoTheme.colors::baseSheetPrimary),
),
contentAlignment = contentAlignment,
) {
composable()
Expand All @@ -144,6 +143,7 @@ internal interface PaparazziComposeTest {

fun snapshotWithDarkModeRow(
contentAlignment: Alignment = Alignment.TopStart,
backgroundColor: Color = Color.Unspecified,
composable: @Composable () -> Unit,
) {
paparazzi.snapshot {
Expand All @@ -153,7 +153,9 @@ internal interface PaparazziComposeTest {
Box(
modifier = Modifier
.weight(weight = .5f, fill = false)
.background(VideoTheme.colors.baseSheetPrimary),
.background(
backgroundColor.takeOrElse(VideoTheme.colors::baseSheetPrimary),
),
contentAlignment = contentAlignment,
) {
composable()
Expand All @@ -163,7 +165,9 @@ internal interface PaparazziComposeTest {
Box(
modifier = Modifier
.weight(weight = .5f, fill = false)
.background(VideoTheme.colors.baseSheetPrimary),
.background(
backgroundColor.takeOrElse(VideoTheme.colors::baseSheetPrimary),
),
contentAlignment = contentAlignment,
) {
composable()
Expand Down
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Diff not rendered.
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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
Expand All @@ -34,7 +33,6 @@ internal class AudioCallContentTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
import io.getstream.video.android.compose.ui.PIXEL_2_LANDSCAPE_HDPI
import io.getstream.video.android.compose.ui.PaparazziComposeTest
import io.getstream.video.android.compose.ui.components.audio.AudioAppBarPreview
Expand All @@ -34,7 +33,6 @@ internal class AudioRoomTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_2_LANDSCAPE_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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.avatar.AvatarInitialsPreview
Expand All @@ -32,7 +31,6 @@ internal class AvatarTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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
Expand All @@ -40,7 +39,6 @@ internal class BaseComponentsTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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.CallAppBarPreview
Expand All @@ -31,7 +30,6 @@ internal class CallComponentsPortraitTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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.CallContentDeprecatedOverloadPreview
Expand All @@ -44,7 +43,6 @@ internal class CallContentTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down Expand Up @@ -173,6 +171,13 @@ internal class CallContentTest : PaparazziComposeTest {
}
}

@Test
fun `call content deprecated overload in dark mode`() {
snapshot(isInDarkMode = true) {
CallContentDeprecatedOverloadPreview()
}
}

@Test
fun `outgoing call content with minimum parameters and video type`() {
snapshot {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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.controls.CallControlActionsPreview
Expand All @@ -32,7 +31,6 @@ internal class CallControlsTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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.lobby.CallLobbyCameraDisabledPreview
Expand All @@ -33,7 +32,6 @@ internal class CallLobbyTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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.ParticipantLabelPreview
Expand All @@ -33,7 +32,6 @@ internal class IndicatorsTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,9 @@

package io.getstream.video.android.compose

import androidx.compose.ui.graphics.Color
import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
import io.getstream.video.android.compose.ui.PIXEL_2_LANDSCAPE_HDPI
import io.getstream.video.android.compose.ui.PaparazziComposeTest
import io.getstream.video.android.compose.ui.components.livestream.LivestreamPlayerOverlayPreview
Expand All @@ -32,12 +32,12 @@ internal class LivestreamTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_2_LANDSCAPE_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
fun `livestream player overlay`() {
snapshotWithDarkMode {
// The overlay is drawn over video, so a dark background stands in for it.
snapshotWithDarkMode(backgroundColor = Color.Black) {
LivestreamPlayerOverlayPreview()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
import io.getstream.video.android.compose.ui.PIXEL_2_LANDSCAPE_HDPI
import io.getstream.video.android.compose.ui.PaparazziComposeTest
import io.getstream.video.android.compose.ui.components.call.renderer.internal.ParticipantsRowPreview
Expand All @@ -31,7 +30,6 @@ internal class ParticipantLandscapeTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_2_LANDSCAPE_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
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
Expand All @@ -41,7 +40,6 @@ internal class ParticipantsPortraitTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_4A_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down Expand Up @@ -137,7 +135,14 @@ internal class ParticipantsPortraitTest : PaparazziComposeTest {

@Test
fun `call participants list`() {
snapshotWithDarkMode {
snapshot {
CallParticipantsListPreview()
}
}

@Test
fun `call participants list in dark mode`() {
snapshot(isInDarkMode = true) {
CallParticipantsListPreview()
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ package io.getstream.video.android.compose.theme

import app.cash.paparazzi.Paparazzi
import com.android.ide.common.rendering.api.SessionParams
import io.getstream.video.android.compose.ui.MAX_PERCENT_DIFFERENCE
import io.getstream.video.android.compose.ui.PIXEL_2_HDPI
import io.getstream.video.android.compose.ui.PaparazziComposeTest
import org.junit.Rule
Expand All @@ -30,7 +29,6 @@ internal class CompoundComponentFactoryTest : PaparazziComposeTest {
override val paparazzi = Paparazzi(
deviceConfig = PIXEL_2_HDPI,
renderingMode = SessionParams.RenderingMode.SHRINK,
maxPercentDifference = MAX_PERCENT_DIFFERENCE,
)

@Test
Expand Down
Loading
Loading