Merge changes I72eaf3f2,Ibb3c8d9d into tm-dev

* changes:
  [Media] Allow output switcher chip to handle larger font sizes without cutting off the test.
  [Media Recs] Hide the title / subtitle views if none of the albums have titles / subtitles so that the album art is centered better.
This commit is contained in:
Caitlin Cassidy
2022-04-22 17:41:50 +00:00
committed by Android (Google) Code Review
6 changed files with 258 additions and 63 deletions

View File

@@ -80,7 +80,7 @@
android:background="@drawable/qs_media_light_source" android:background="@drawable/qs_media_light_source"
android:forceHasOverlappingRendering="false" android:forceHasOverlappingRendering="false"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="48dp" android:layout_height="@dimen/min_clickable_item_size"
android:layout_marginStart="@dimen/qs_center_guideline_padding" android:layout_marginStart="@dimen/qs_center_guideline_padding"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent" app:layout_constraintTop_toTopOf="parent"
@@ -92,8 +92,9 @@
<LinearLayout <LinearLayout
android:id="@+id/media_seamless_button" android:id="@+id/media_seamless_button"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="@dimen/qs_seamless_height" android:layout_height="wrap_content"
android:minHeight="@dimen/qs_seamless_height" android:minHeight="@dimen/qs_seamless_height"
android:maxHeight="@dimen/min_clickable_item_size"
android:theme="@style/MediaPlayer.SolidButton" android:theme="@style/MediaPlayer.SolidButton"
android:background="@drawable/qs_media_seamless_background" android:background="@drawable/qs_media_seamless_background"
android:orientation="horizontal" android:orientation="horizontal"

View File

@@ -16,6 +16,8 @@
--> -->
<!-- Layout for media recommendations inside QSPanel carousel --> <!-- Layout for media recommendations inside QSPanel carousel -->
<!-- See media_recommendation_expanded.xml and media_recommendation_collapsed.xml for the
constraints. -->
<com.android.systemui.util.animation.TransitionLayout <com.android.systemui.util.animation.TransitionLayout
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
@@ -46,14 +48,6 @@
<FrameLayout <FrameLayout
android:id="@+id/media_cover1_container" android:id="@+id/media_cover1_container"
style="@style/MediaPlayer.Recommendation.AlbumContainer" style="@style/MediaPlayer.Recommendation.AlbumContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/media_title1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/media_cover2_container"
android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintVertical_bias="0.5"
> >
<ImageView <ImageView
android:id="@+id/media_cover1" android:id="@+id/media_cover1"
@@ -71,31 +65,16 @@
<TextView <TextView
android:id="@+id/media_title1" android:id="@+id/media_title1"
style="@style/MediaPlayer.Recommendation.Text.Title" style="@style/MediaPlayer.Recommendation.Text.Title"
app:layout_constraintStart_toStartOf="@+id/media_cover1_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover1_container"
app:layout_constraintTop_toBottomOf="@+id/media_cover1_container"
app:layout_constraintBottom_toTopOf="@+id/media_subtitle1"
/> />
<TextView <TextView
android:id="@+id/media_subtitle1" android:id="@+id/media_subtitle1"
style="@style/MediaPlayer.Recommendation.Text.Subtitle" style="@style/MediaPlayer.Recommendation.Text.Subtitle"
app:layout_constraintStart_toStartOf="@+id/media_cover1_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover1_container"
app:layout_constraintTop_toBottomOf="@+id/media_title1"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/qs_media_padding"
/> />
<FrameLayout <FrameLayout
android:id="@+id/media_cover2_container" android:id="@+id/media_cover2_container"
style="@style/MediaPlayer.Recommendation.AlbumContainer" style="@style/MediaPlayer.Recommendation.AlbumContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/media_title2"
app:layout_constraintStart_toEndOf="@id/media_cover1_container"
app:layout_constraintEnd_toStartOf="@id/media_cover3_container"
android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin"
app:layout_constraintVertical_bias="0.5"
> >
<ImageView <ImageView
android:id="@+id/media_cover2" android:id="@+id/media_cover2"
@@ -111,31 +90,16 @@
<TextView <TextView
android:id="@+id/media_title2" android:id="@+id/media_title2"
style="@style/MediaPlayer.Recommendation.Text.Title" style="@style/MediaPlayer.Recommendation.Text.Title"
app:layout_constraintStart_toStartOf="@+id/media_cover2_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover2_container"
app:layout_constraintTop_toBottomOf="@+id/media_cover2_container"
app:layout_constraintBottom_toTopOf="@+id/media_subtitle2"
/> />
<TextView <TextView
android:id="@+id/media_subtitle2" android:id="@+id/media_subtitle2"
style="@style/MediaPlayer.Recommendation.Text.Subtitle" style="@style/MediaPlayer.Recommendation.Text.Subtitle"
app:layout_constraintStart_toStartOf="@+id/media_cover2_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover2_container"
app:layout_constraintTop_toBottomOf="@+id/media_title2"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/qs_media_padding"
/> />
<FrameLayout <FrameLayout
android:id="@+id/media_cover3_container" android:id="@+id/media_cover3_container"
style="@style/MediaPlayer.Recommendation.AlbumContainer" style="@style/MediaPlayer.Recommendation.AlbumContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/media_title3"
app:layout_constraintStart_toEndOf="@id/media_cover2_container"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/qs_media_padding"
app:layout_constraintVertical_bias="0.5"
> >
<ImageView <ImageView
android:id="@+id/media_cover3" android:id="@+id/media_cover3"
@@ -151,20 +115,11 @@
<TextView <TextView
android:id="@+id/media_title3" android:id="@+id/media_title3"
style="@style/MediaPlayer.Recommendation.Text.Title" style="@style/MediaPlayer.Recommendation.Text.Title"
app:layout_constraintStart_toStartOf="@+id/media_cover3_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover3_container"
app:layout_constraintTop_toBottomOf="@+id/media_cover3_container"
app:layout_constraintBottom_toTopOf="@+id/media_subtitle3"
/> />
<TextView <TextView
android:id="@+id/media_subtitle3" android:id="@+id/media_subtitle3"
style="@style/MediaPlayer.Recommendation.Text.Subtitle" style="@style/MediaPlayer.Recommendation.Text.Subtitle"
app:layout_constraintStart_toStartOf="@+id/media_cover3_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover3_container"
app:layout_constraintTop_toBottomOf="@+id/media_title3"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/qs_media_padding"
/> />
<include <include

View File

@@ -25,8 +25,10 @@
/> />
<!-- Only the constraintBottom and marginBottom are different. The rest of the constraints are <!-- Only the constraintBottom and marginBottom are different. The rest of the constraints are
the same as the constraints in media_smartspace_recommendations. But due to how the same as the constraints in media_recommendations_expanded.xml. But, due to how
ConstraintSets work, all the constraints need to be in the same place. ConstraintSets work, all the constraints need to be in the same place. So, the shared
constraints can't be put in the shared layout file media_smartspace_recommendations.xml and
the constraints are instead duplicated between here and media_recommendations_expanded.xml.
Ditto for the other cover containers. --> Ditto for the other cover containers. -->
<Constraint <Constraint
android:id="@+id/media_cover1_container" android:id="@+id/media_cover1_container"

View File

@@ -15,7 +15,9 @@
~ limitations under the License ~ limitations under the License
--> -->
<ConstraintSet <ConstraintSet
xmlns:android="http://schemas.android.com/apk/res/android" > xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
>
<Constraint <Constraint
android:id="@+id/sizing_view" android:id="@+id/sizing_view"
@@ -23,4 +25,99 @@
android:layout_height="@dimen/qs_media_session_height_expanded" android:layout_height="@dimen/qs_media_session_height_expanded"
/> />
<Constraint
android:id="@+id/media_cover1_container"
style="@style/MediaPlayer.Recommendation.AlbumContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@+id/media_title1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toStartOf="@id/media_cover2_container"
android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin"
app:layout_constraintHorizontal_chainStyle="packed"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintHorizontal_bias="1.0"
app:layout_constraintVertical_bias="0.4"
/>
<Constraint
android:id="@+id/media_title1"
style="@style/MediaPlayer.Recommendation.Text.Title"
app:layout_constraintStart_toStartOf="@+id/media_cover1_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover1_container"
app:layout_constraintTop_toBottomOf="@+id/media_cover1_container"
app:layout_constraintBottom_toTopOf="@+id/media_subtitle1"
/>
<Constraint
android:id="@+id/media_subtitle1"
style="@style/MediaPlayer.Recommendation.Text.Subtitle"
app:layout_constraintStart_toStartOf="@+id/media_cover1_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover1_container"
app:layout_constraintTop_toBottomOf="@+id/media_title1"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/qs_media_padding"
/>
<Constraint
android:id="@+id/media_cover2_container"
style="@style/MediaPlayer.Recommendation.AlbumContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/media_title2"
app:layout_constraintStart_toEndOf="@id/media_cover1_container"
app:layout_constraintEnd_toStartOf="@id/media_cover3_container"
android:layout_marginEnd="@dimen/qs_media_rec_album_side_margin"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintVertical_bias="0.4"
/>
<Constraint
android:id="@+id/media_title2"
style="@style/MediaPlayer.Recommendation.Text.Title"
app:layout_constraintStart_toStartOf="@+id/media_cover2_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover2_container"
app:layout_constraintTop_toBottomOf="@+id/media_cover2_container"
app:layout_constraintBottom_toTopOf="@+id/media_subtitle2"
/>
<Constraint
android:id="@+id/media_subtitle2"
style="@style/MediaPlayer.Recommendation.Text.Subtitle"
app:layout_constraintStart_toStartOf="@+id/media_cover2_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover2_container"
app:layout_constraintTop_toBottomOf="@+id/media_title2"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/qs_media_padding"
/>
<Constraint
android:id="@+id/media_cover3_container"
style="@style/MediaPlayer.Recommendation.AlbumContainer"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/media_title3"
app:layout_constraintStart_toEndOf="@id/media_cover2_container"
app:layout_constraintEnd_toEndOf="parent"
android:layout_marginEnd="@dimen/qs_media_padding"
app:layout_constraintVertical_chainStyle="packed"
app:layout_constraintVertical_bias="0.4"
/>
<Constraint
android:id="@+id/media_title3"
style="@style/MediaPlayer.Recommendation.Text.Title"
app:layout_constraintStart_toStartOf="@+id/media_cover3_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover3_container"
app:layout_constraintTop_toBottomOf="@+id/media_cover3_container"
app:layout_constraintBottom_toTopOf="@+id/media_subtitle3"
/>
<Constraint
android:id="@+id/media_subtitle3"
style="@style/MediaPlayer.Recommendation.Text.Subtitle"
app:layout_constraintStart_toStartOf="@+id/media_cover3_container"
app:layout_constraintEnd_toEndOf="@+id/media_cover3_container"
app:layout_constraintTop_toBottomOf="@+id/media_title3"
app:layout_constraintBottom_toBottomOf="parent"
android:layout_marginBottom="@dimen/qs_media_padding"
/>
</ConstraintSet> </ConstraintSet>

View File

@@ -991,6 +991,9 @@ public class MediaControlPanel {
List<ViewGroup> mediaCoverContainers = mRecommendationViewHolder.getMediaCoverContainers(); List<ViewGroup> mediaCoverContainers = mRecommendationViewHolder.getMediaCoverContainers();
int mediaRecommendationNum = Math.min(mediaRecommendationList.size(), int mediaRecommendationNum = Math.min(mediaRecommendationList.size(),
MEDIA_RECOMMENDATION_MAX_NUM); MEDIA_RECOMMENDATION_MAX_NUM);
boolean hasTitle = false;
boolean hasSubtitle = false;
int uiComponentIndex = 0; int uiComponentIndex = 0;
for (int itemIndex = 0; for (int itemIndex = 0;
itemIndex < mediaRecommendationNum && uiComponentIndex < mediaRecommendationNum; itemIndex < mediaRecommendationNum && uiComponentIndex < mediaRecommendationNum;
@@ -1036,26 +1039,33 @@ public class MediaControlPanel {
// Set up title // Set up title
CharSequence title = recommendation.getTitle(); CharSequence title = recommendation.getTitle();
hasTitle |= !TextUtils.isEmpty(title);
TextView titleView = TextView titleView =
mRecommendationViewHolder.getMediaTitles().get(uiComponentIndex); mRecommendationViewHolder.getMediaTitles().get(uiComponentIndex);
titleView.setText(title); titleView.setText(title);
// TODO(b/223603970): If none of them have titles, should we then hide the views?
// Set up subtitle // Set up subtitle
CharSequence subtitle = recommendation.getSubtitle();
TextView subtitleView =
mRecommendationViewHolder.getMediaSubtitles().get(uiComponentIndex);
// It would look awkward to show a subtitle if we don't have a title. // It would look awkward to show a subtitle if we don't have a title.
boolean shouldShowSubtitleText = !TextUtils.isEmpty(title); boolean shouldShowSubtitleText = !TextUtils.isEmpty(title);
CharSequence subtitleText = shouldShowSubtitleText ? subtitle : ""; CharSequence subtitle = shouldShowSubtitleText ? recommendation.getSubtitle() : "";
subtitleView.setText(subtitleText); hasSubtitle |= !TextUtils.isEmpty(subtitle);
// TODO(b/223603970): If none of them have subtitles, should we then hide the views? TextView subtitleView =
mRecommendationViewHolder.getMediaSubtitles().get(uiComponentIndex);
subtitleView.setText(subtitle);
uiComponentIndex++; uiComponentIndex++;
} }
mSmartspaceMediaItemsCount = uiComponentIndex; mSmartspaceMediaItemsCount = uiComponentIndex;
// If there's no subtitles and/or titles for any of the albums, hide those views.
ConstraintSet expandedSet = mMediaViewController.getExpandedLayout();
final boolean titlesVisible = hasTitle;
final boolean subtitlesVisible = hasSubtitle;
mRecommendationViewHolder.getMediaTitles().forEach((titleView) ->
setVisibleAndAlpha(expandedSet, titleView.getId(), titlesVisible));
mRecommendationViewHolder.getMediaSubtitles().forEach((subtitleView) ->
setVisibleAndAlpha(expandedSet, subtitleView.getId(), subtitlesVisible));
// Guts // Guts
Runnable onDismissClickedRunnable = () -> { Runnable onDismissClickedRunnable = () -> {
closeGuts(); closeGuts();

View File

@@ -1401,22 +1401,23 @@ public class MediaControlPanelTest : SysuiTestCase() {
val subtitle1 = "Subtitle1" val subtitle1 = "Subtitle1"
val subtitle2 = "Subtitle2" val subtitle2 = "Subtitle2"
val subtitle3 = "Subtitle3" val subtitle3 = "Subtitle3"
val icon = Icon.createWithResource(context, R.drawable.ic_1x_mobiledata)
val data = smartspaceData.copy( val data = smartspaceData.copy(
recommendations = listOf( recommendations = listOf(
SmartspaceAction.Builder("id1", title1) SmartspaceAction.Builder("id1", title1)
.setSubtitle(subtitle1) .setSubtitle(subtitle1)
.setIcon(Icon.createWithResource(context, R.drawable.ic_1x_mobiledata)) .setIcon(icon)
.setExtras(Bundle.EMPTY) .setExtras(Bundle.EMPTY)
.build(), .build(),
SmartspaceAction.Builder("id2", title2) SmartspaceAction.Builder("id2", title2)
.setSubtitle(subtitle2) .setSubtitle(subtitle2)
.setIcon(Icon.createWithResource(context, R.drawable.ic_alarm)) .setIcon(icon)
.setExtras(Bundle.EMPTY) .setExtras(Bundle.EMPTY)
.build(), .build(),
SmartspaceAction.Builder("id3", title3) SmartspaceAction.Builder("id3", title3)
.setSubtitle(subtitle3) .setSubtitle(subtitle3)
.setIcon(Icon.createWithResource(context, R.drawable.ic_3g_mobiledata)) .setIcon(icon)
.setExtras(Bundle.EMPTY) .setExtras(Bundle.EMPTY)
.build() .build()
) )
@@ -1449,6 +1450,135 @@ public class MediaControlPanelTest : SysuiTestCase() {
assertThat(recSubtitle1.text).isEqualTo("") assertThat(recSubtitle1.text).isEqualTo("")
} }
@Test
fun bindRecommendation_someHaveTitles_allTitleViewsShown() {
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
val icon = Icon.createWithResource(context, R.drawable.ic_1x_mobiledata)
val data = smartspaceData.copy(
recommendations = listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("fake subtitle")
.setIcon(icon)
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "title2")
.setSubtitle("fake subtitle")
.setIcon(icon)
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id3", "")
.setSubtitle("fake subtitle")
.setIcon(icon)
.setExtras(Bundle.EMPTY)
.build()
)
)
player.bindRecommendation(data)
assertThat(expandedSet.getVisibility(recTitle1.id)).isEqualTo(ConstraintSet.VISIBLE)
assertThat(expandedSet.getVisibility(recTitle2.id)).isEqualTo(ConstraintSet.VISIBLE)
assertThat(expandedSet.getVisibility(recTitle3.id)).isEqualTo(ConstraintSet.VISIBLE)
}
@Test
fun bindRecommendation_someHaveSubtitles_allSubtitleViewsShown() {
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
val icon = Icon.createWithResource(context, R.drawable.ic_1x_mobiledata)
val data = smartspaceData.copy(
recommendations = listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("")
.setIcon(icon)
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "title2")
.setSubtitle("")
.setIcon(icon)
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id3", "title3")
.setSubtitle("subtitle3")
.setIcon(icon)
.setExtras(Bundle.EMPTY)
.build()
)
)
player.bindRecommendation(data)
assertThat(expandedSet.getVisibility(recSubtitle1.id)).isEqualTo(ConstraintSet.VISIBLE)
assertThat(expandedSet.getVisibility(recSubtitle2.id)).isEqualTo(ConstraintSet.VISIBLE)
assertThat(expandedSet.getVisibility(recSubtitle3.id)).isEqualTo(ConstraintSet.VISIBLE)
}
@Test
fun bindRecommendation_noneHaveSubtitles_subtitleViewsGone() {
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
val data = smartspaceData.copy(
recommendations = listOf(
SmartspaceAction.Builder("id1", "title1")
.setSubtitle("")
.setIcon(Icon.createWithResource(context, R.drawable.ic_1x_mobiledata))
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "title2")
.setSubtitle("")
.setIcon(Icon.createWithResource(context, R.drawable.ic_alarm))
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id3", "title3")
.setSubtitle("")
.setIcon(Icon.createWithResource(context, R.drawable.ic_3g_mobiledata))
.setExtras(Bundle.EMPTY)
.build()
)
)
player.bindRecommendation(data)
assertThat(expandedSet.getVisibility(recSubtitle1.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recSubtitle2.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recSubtitle3.id)).isEqualTo(ConstraintSet.GONE)
}
@Test
fun bindRecommendation_noneHaveTitles_titleAndSubtitleViewsGone() {
useRealConstraintSets()
player.attachRecommendation(recommendationViewHolder)
val data = smartspaceData.copy(
recommendations = listOf(
SmartspaceAction.Builder("id1", "")
.setSubtitle("subtitle1")
.setIcon(Icon.createWithResource(context, R.drawable.ic_1x_mobiledata))
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id2", "")
.setSubtitle("subtitle2")
.setIcon(Icon.createWithResource(context, R.drawable.ic_alarm))
.setExtras(Bundle.EMPTY)
.build(),
SmartspaceAction.Builder("id3", "")
.setSubtitle("subtitle3")
.setIcon(Icon.createWithResource(context, R.drawable.ic_3g_mobiledata))
.setExtras(Bundle.EMPTY)
.build()
)
)
player.bindRecommendation(data)
assertThat(expandedSet.getVisibility(recTitle1.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recTitle2.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recTitle3.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recSubtitle1.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recSubtitle2.id)).isEqualTo(ConstraintSet.GONE)
assertThat(expandedSet.getVisibility(recSubtitle3.id)).isEqualTo(ConstraintSet.GONE)
}
private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener = private fun getScrubbingChangeListener(): SeekBarViewModel.ScrubbingChangeListener =
withArgCaptor { verify(seekBarViewModel).setScrubbingChangeListener(capture()) } withArgCaptor { verify(seekBarViewModel).setScrubbingChangeListener(capture()) }