From 983f3933c5f9276703f145dd01c12bdcf0d4027d Mon Sep 17 00:00:00 2001 From: Gustavo Pagani Date: Tue, 26 Jul 2022 16:21:27 +0100 Subject: [PATCH] Rename domain model MediaItem to Media (#438) --- media-data/api/current.api | 56 +-- .../media/data/mapper/CommandMapper.kt | 4 +- .../data/mapper/Media3MediaItemMapper.kt | 55 --- .../media/data/mapper/MediaItemMapper.kt | 46 ++- .../media/data/mapper/MediaMapper.kt | 41 ++ ...sitionMapper.kt => MediaPositionMapper.kt} | 12 +- .../data/repository/PlayerRepositoryImpl.kt | 67 +-- ...pperTest.kt => MediaPositionMapperTest.kt} | 12 +- .../PlayerRepositoryImplCloseTest.kt | 57 +-- .../PlayerRepositoryImplNotConnectedTest.kt | 61 +-- .../repository/PlayerRepositoryImplTest.kt | 390 +++++++++--------- .../mediasample/playback/PlaybackErrorTest.kt | 8 +- .../playback/PlaybackNotificationTest.kt | 4 +- .../mediasample/playback/TestMedia.kt | 12 +- .../data/api/model/MusicApiModel.kt | 4 +- .../{MediaItemMapper.kt => MediaMapper.kt} | 10 +- .../data/mapper/PlaylistDownloadMapper.kt | 6 +- .../mediasample/data/mapper/PlaylistMapper.kt | 2 +- .../PlaylistDownloadRepositoryImpl.kt | 2 +- .../mediasample/domain/model/Playlist.kt | 4 +- .../domain/model/PlaylistDownload.kt | 4 +- .../tile/MediaCollectionsTileService.kt | 6 +- .../ui/app/MediaPlayerAppViewModel.kt | 14 +- .../AnimatedPlayerScreenMediaDisplay.kt | 8 +- .../ui/debug/SamplesScreenViewModel.kt | 12 +- ...apper.kt => DownloadMediaUiModelMapper.kt} | 18 +- .../mediasample/ui/entity/UampEntityScreen.kt | 4 +- .../ui/entity/UampEntityScreenViewModel.kt | 4 +- .../ui/player/UampMediaPlayerScreen.kt | 6 +- ...iaItemMapperTest.kt => MediaMapperTest.kt} | 6 +- .../data/mapper/PlaylistMapperTest.kt | 18 +- media-ui/api/current.api | 74 ++-- .../media/ui/components/MediaChipTest.kt | 6 +- .../media/ui/screens/PlayerScreenTest.kt | 44 +- .../testdoubles/FakePlayerRepository.kt | 66 +-- .../components/DefaultMediaDisplayPreview.kt | 6 +- .../ui/components/MediaArtworkPreview.kt | 4 +- .../media/ui/components/MediaChipPreview.kt | 10 +- .../ui/screens/entity/EntityScreenPreview.kt | 28 +- .../ui/components/DefaultMediaDisplay.kt | 10 +- .../media/ui/components/MediaArtwork.kt | 8 +- .../media/ui/components/MediaChip.kt | 18 +- .../ui/navigation/MediaPlayerScaffold.kt | 2 +- .../media/ui/screens/PlayerScreen.kt | 10 +- .../media/ui/screens/browse/BrowseScreen.kt | 2 +- .../media/ui/screens/entity/EntityScreen.kt | 24 +- .../media/ui/state/PlayerUiState.kt | 6 +- .../media/ui/state/PlayerViewModel.kt | 24 +- ...UiModelMapper.kt => MediaUiModelMapper.kt} | 18 +- .../ui/state/mapper/PlayerUiStateMapper.kt | 16 +- .../mapper/TrackPositionUiModelMapper.kt | 12 +- ...ItemUiModel.kt => DownloadMediaUiModel.kt} | 12 +- .../{MediaItemUiModel.kt => MediaUiModel.kt} | 2 +- .../media/ui/FigmaPlayerScreenTest.kt | 4 +- .../media/ui/MediaPlayerScreenTest.kt | 4 +- .../media/ui/MediaPlayerStatesScreenTest.kt | 14 +- .../media/ui/MediaPlayerTestCase.kt | 2 +- .../media/ui/PodcastPlayerScreenTest.kt | 4 +- .../media/ui/components/MediaChipTest.kt | 4 +- .../screens/entity/EntityScreenStateTest.kt | 30 +- .../media/ui/state/PlayerViewModelTest.kt | 4 +- ...apperTest.kt => MediaUiModelMapperTest.kt} | 10 +- .../state/mapper/PlayerUiStateMapperTest.kt | 86 ++-- .../mapper/TrackPositionUiModelMapperTest.kt | 8 +- .../testdoubles/StubPlayerRepository.kt | 36 +- ...nMediaWithArtwork_thenDisplaysArtwork.png} | 0 ...thNOArtwork_thenDoesNOTDisplayArtwork.png} | 0 ...reenTest_mediaPlayerScreen[0]_nomedia.png} | 0 media/api/current.api | 62 +-- .../android/horologist/media/model/Command.kt | 4 +- .../media/model/{MediaItem.kt => Media.kt} | 4 +- ...{MediaItemPosition.kt => MediaPosition.kt} | 8 +- .../media/repository/PlayerRepository.kt | 84 ++-- ...emPositionTest.kt => MediaPositionTest.kt} | 10 +- 74 files changed, 868 insertions(+), 865 deletions(-) delete mode 100644 media-data/src/main/java/com/google/android/horologist/media/data/mapper/Media3MediaItemMapper.kt create mode 100644 media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaMapper.kt rename media-data/src/main/java/com/google/android/horologist/media/data/mapper/{MediaItemPositionMapper.kt => MediaPositionMapper.kt} (77%) rename media-data/src/test/java/com/google/android/horologist/media/data/mapper/{MediaItemPositionMapperTest.kt => MediaPositionMapperTest.kt} (82%) rename media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/{MediaItemMapper.kt => MediaMapper.kt} (76%) rename media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/{DownloadMediaItemUiModelMapper.kt => DownloadMediaUiModelMapper.kt} (70%) rename media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/{MediaItemMapperTest.kt => MediaMapperTest.kt} (96%) rename media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/{MediaItemUiModelMapper.kt => MediaUiModelMapper.kt} (65%) rename media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/{DownloadMediaItemUiModel.kt => DownloadMediaUiModel.kt} (71%) rename media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/{MediaItemUiModel.kt => MediaUiModel.kt} (96%) rename media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/{MediaItemUiModelMapperTest.kt => MediaUiModelMapperTest.kt} (86%) rename media-ui/src/test/snapshots/images/{com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaItemWithArtwork_thenDisplaysArtwork.png => com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaWithArtwork_thenDisplaysArtwork.png} (100%) rename media-ui/src/test/snapshots/images/{com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaItemWithNOArtwork_thenDoesNOTDisplayArtwork.png => com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaWithNOArtwork_thenDoesNOTDisplayArtwork.png} (100%) rename media-ui/src/test/snapshots/images/{com.google.android.horologist.media.ui_MediaPlayerStatesScreenTest_mediaPlayerScreen[0]_nomediaitem.png => com.google.android.horologist.media.ui_MediaPlayerStatesScreenTest_mediaPlayerScreen[0]_nomedia.png} (100%) rename media/src/main/java/com/google/android/horologist/media/model/{MediaItem.kt => Media.kt} (93%) rename media/src/main/java/com/google/android/horologist/media/model/{MediaItemPosition.kt => MediaPosition.kt} (90%) rename media/src/test/java/com/google/android/horologist/media/model/{MediaItemPositionTest.kt => MediaPositionTest.kt} (84%) diff --git a/media-data/api/current.api b/media-data/api/current.api index 74ec4d3048..6adb039774 100644 --- a/media-data/api/current.api +++ b/media-data/api/current.api @@ -13,20 +13,20 @@ package com.google.android.horologist.media.data.mapper { field public static final com.google.android.horologist.media.data.mapper.CommandMapper INSTANCE; } - public final class Media3MediaItemMapper { - method public androidx.media3.common.MediaItem map(com.google.android.horologist.media.model.MediaItem mediaItem); - method public java.util.List map(java.util.List mediaItems); - field public static final com.google.android.horologist.media.data.mapper.Media3MediaItemMapper INSTANCE; - } - public final class MediaItemMapper { - method public com.google.android.horologist.media.model.MediaItem map(androidx.media3.common.MediaItem media3MediaItem, optional String defaultArtist); + method public androidx.media3.common.MediaItem map(com.google.android.horologist.media.model.Media media); + method public java.util.List map(java.util.List media); field public static final com.google.android.horologist.media.data.mapper.MediaItemMapper INSTANCE; } - public final class MediaItemPositionMapper { - method public com.google.android.horologist.media.model.MediaItemPosition? map(androidx.media3.common.Player? player); - field public static final com.google.android.horologist.media.data.mapper.MediaItemPositionMapper INSTANCE; + public final class MediaMapper { + method public com.google.android.horologist.media.model.Media map(androidx.media3.common.MediaItem mediaItem, optional String defaultArtist); + field public static final com.google.android.horologist.media.data.mapper.MediaMapper INSTANCE; + } + + public final class MediaPositionMapper { + method public com.google.android.horologist.media.model.MediaPosition? map(androidx.media3.common.Player? player); + field public static final com.google.android.horologist.media.data.mapper.MediaPositionMapper INSTANCE; } public final class PlayerStateMapper { @@ -46,46 +46,46 @@ package com.google.android.horologist.media.data.repository { public final class PlayerRepositoryImpl implements java.io.Closeable com.google.android.horologist.media.repository.PlayerRepository { ctor public PlayerRepositoryImpl(); - method public void addMediaItem(com.google.android.horologist.media.model.MediaItem mediaItem); - method public void addMediaItem(int index, com.google.android.horologist.media.model.MediaItem mediaItem); - method public void clearMediaItems(); + method public void addMedia(com.google.android.horologist.media.model.Media media); + method public void addMedia(int index, com.google.android.horologist.media.model.Media media); + method public void clearMediaList(); method public void close(); method public void connect(androidx.media3.common.Player player, kotlin.jvm.functions.Function0 onClose); method public kotlinx.coroutines.flow.StateFlow> getAvailableCommands(); method public kotlinx.coroutines.flow.StateFlow getConnected(); - method public kotlinx.coroutines.flow.StateFlow getCurrentMediaItem(); - method public int getCurrentMediaItemIndex(); + method public kotlinx.coroutines.flow.StateFlow getCurrentMedia(); + method public int getCurrentMediaIndex(); method public kotlinx.coroutines.flow.StateFlow getCurrentState(); - method public com.google.android.horologist.media.model.MediaItem? getMediaItemAt(int index); - method public int getMediaItemCount(); - method public kotlinx.coroutines.flow.StateFlow getMediaItemPosition(); + method public com.google.android.horologist.media.model.Media? getMediaAt(int index); + method public int getMediaCount(); + method public kotlinx.coroutines.flow.StateFlow getMediaPosition(); method public kotlinx.coroutines.flow.StateFlow getPlaybackSpeed(); method public kotlinx.coroutines.flow.StateFlow getPlayer(); method public long getSeekBackIncrement(); method public long getSeekForwardIncrement(); method public kotlinx.coroutines.flow.StateFlow getShuffleModeEnabled(); - method public boolean hasNextMediaItem(); - method public boolean hasPreviousMediaItem(); + method public boolean hasNextMedia(); + method public boolean hasPreviousMedia(); method public void pause(); method public void play(); - method public void play(int mediaItemIndex); + method public void play(int mediaIndex); method public void prepare(); method public void release(); - method public void removeMediaItem(int index); + method public void removeMedia(int index); method public void seekBack(); method public void seekForward(); - method public void setMediaItem(com.google.android.horologist.media.model.MediaItem mediaItem); - method public void setMediaItems(java.util.List mediaItems); + method public void setMedia(com.google.android.horologist.media.model.Media media); + method public void setMediaList(java.util.List mediaList); method public void setPlaybackSpeed(float speed); method public void setShuffleModeEnabled(boolean shuffleModeEnabled); - method public void skipToNextMediaItem(); - method public void skipToPreviousMediaItem(); + method public void skipToNextMedia(); + method public void skipToPreviousMedia(); method public void updatePosition(); property public kotlinx.coroutines.flow.StateFlow> availableCommands; property public kotlinx.coroutines.flow.StateFlow connected; - property public kotlinx.coroutines.flow.StateFlow currentMediaItem; + property public kotlinx.coroutines.flow.StateFlow currentMedia; property public kotlinx.coroutines.flow.StateFlow currentState; - property public kotlinx.coroutines.flow.StateFlow mediaItemPosition; + property public kotlinx.coroutines.flow.StateFlow mediaPosition; property public final kotlinx.coroutines.flow.StateFlow playbackSpeed; property public final kotlinx.coroutines.flow.StateFlow player; property public kotlinx.coroutines.flow.StateFlow shuffleModeEnabled; diff --git a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/CommandMapper.kt b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/CommandMapper.kt index 1a5deb9971..547050840b 100644 --- a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/CommandMapper.kt +++ b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/CommandMapper.kt @@ -35,8 +35,8 @@ public object CommandMapper { COMMAND_PLAY_PAUSE -> Command.PlayPause COMMAND_SEEK_BACK -> Command.SeekBack COMMAND_SEEK_FORWARD -> Command.SeekForward - COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM -> Command.SkipToPreviousMediaItem - COMMAND_SEEK_TO_NEXT_MEDIA_ITEM -> Command.SkipToNextMediaItem + COMMAND_SEEK_TO_PREVIOUS_MEDIA_ITEM -> Command.SkipToPreviousMedia + COMMAND_SEEK_TO_NEXT_MEDIA_ITEM -> Command.SkipToNextMedia COMMAND_SET_SHUFFLE_MODE -> Command.SetShuffle else -> throw IllegalArgumentException("Invalid command: $command") } diff --git a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/Media3MediaItemMapper.kt b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/Media3MediaItemMapper.kt deleted file mode 100644 index e955cecacb..0000000000 --- a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/Media3MediaItemMapper.kt +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright 2022 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * https://www.apache.org/licenses/LICENSE-2.0 - * - * 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 com.google.android.horologist.media.data.mapper - -import android.net.Uri -import androidx.media3.common.MediaItem.RequestMetadata -import androidx.media3.common.MediaMetadata -import com.google.android.horologist.media.model.MediaItem -import androidx.media3.common.MediaItem as Media3MediaItem - -/** - * Maps a [MediaItem] into a [Media3.MediaItem][Media3MediaItem]. - */ -public object Media3MediaItemMapper { - - public fun map(mediaItem: MediaItem): Media3MediaItem { - val parsedUri = Uri.parse(mediaItem.uri) - val artworkUri = mediaItem.artworkUri?.let(Uri::parse) - - return Media3MediaItem.Builder() - .setMediaId(mediaItem.id) - .setUri(parsedUri) - .setRequestMetadata( - RequestMetadata.Builder() - .setMediaUri(parsedUri) - .build() - ) - .setMediaMetadata( - MediaMetadata.Builder() - .setDisplayTitle(mediaItem.title) - .setArtist(mediaItem.artist) - .setArtworkUri(artworkUri) - .build() - ) - .build() - } - - public fun map(mediaItems: List): List = mediaItems.map( - Media3MediaItemMapper::map - ) -} diff --git a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemMapper.kt b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemMapper.kt index 9033e5d5cb..5250d43a02 100644 --- a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemMapper.kt +++ b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemMapper.kt @@ -16,26 +16,40 @@ package com.google.android.horologist.media.data.mapper -import com.google.android.horologist.media.model.MediaItem -import androidx.media3.common.MediaItem as Media3MediaItem +import android.net.Uri +import androidx.media3.common.MediaItem +import androidx.media3.common.MediaItem.RequestMetadata +import androidx.media3.common.MediaMetadata +import com.google.android.horologist.media.model.Media /** - * Maps a [Media3.MediaItem][Media3MediaItem] into a [MediaItem]. + * Maps a [Media] into a [MediaItem]. */ public object MediaItemMapper { - /** - * @param media3MediaItem [Media3MediaItem] to be mapped. - * @param defaultArtist value for [MediaItem.artist]. - */ - public fun map( - media3MediaItem: Media3MediaItem, - defaultArtist: String = "" - ): MediaItem = MediaItem( - id = media3MediaItem.mediaId, - uri = media3MediaItem.requestMetadata.mediaUri?.toString() ?: "", - title = media3MediaItem.mediaMetadata.displayTitle?.toString() ?: "", - artist = media3MediaItem.mediaMetadata.artist?.toString() ?: defaultArtist, - artworkUri = media3MediaItem.mediaMetadata.artworkUri?.toString() + public fun map(media: Media): MediaItem { + val parsedUri = Uri.parse(media.uri) + val artworkUri = media.artworkUri?.let(Uri::parse) + + return MediaItem.Builder() + .setMediaId(media.id) + .setUri(parsedUri) + .setRequestMetadata( + RequestMetadata.Builder() + .setMediaUri(parsedUri) + .build() + ) + .setMediaMetadata( + MediaMetadata.Builder() + .setDisplayTitle(media.title) + .setArtist(media.artist) + .setArtworkUri(artworkUri) + .build() + ) + .build() + } + + public fun map(media: List): List = media.map( + MediaItemMapper::map ) } diff --git a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaMapper.kt b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaMapper.kt new file mode 100644 index 0000000000..c2f209341c --- /dev/null +++ b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaMapper.kt @@ -0,0 +1,41 @@ +/* + * Copyright 2022 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * 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 com.google.android.horologist.media.data.mapper + +import androidx.media3.common.MediaItem +import com.google.android.horologist.media.model.Media + +/** + * Maps a [MediaItem] into a [Media]. + */ +public object MediaMapper { + + /** + * @param mediaItem [MediaItem] to be mapped. + * @param defaultArtist value for [Media.artist]. + */ + public fun map( + mediaItem: MediaItem, + defaultArtist: String = "" + ): Media = Media( + id = mediaItem.mediaId, + uri = mediaItem.requestMetadata.mediaUri?.toString() ?: "", + title = mediaItem.mediaMetadata.displayTitle?.toString() ?: "", + artist = mediaItem.mediaMetadata.artist?.toString() ?: defaultArtist, + artworkUri = mediaItem.mediaMetadata.artworkUri?.toString() + ) +} diff --git a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemPositionMapper.kt b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaPositionMapper.kt similarity index 77% rename from media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemPositionMapper.kt rename to media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaPositionMapper.kt index d795ea8824..d35593a88f 100644 --- a/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaItemPositionMapper.kt +++ b/media-data/src/main/java/com/google/android/horologist/media/data/mapper/MediaPositionMapper.kt @@ -18,20 +18,20 @@ package com.google.android.horologist.media.data.mapper import androidx.media3.common.C import androidx.media3.common.Player -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.MediaPosition import kotlin.time.Duration.Companion.milliseconds /** - * Maps a [Media3 player][Player] position into a [MediaItemPosition]. + * Maps a [Media3 player][Player] position into a [MediaPosition]. */ -public object MediaItemPositionMapper { - public fun map(player: Player?): MediaItemPosition? { +public object MediaPositionMapper { + public fun map(player: Player?): MediaPosition? { return if (player == null || player.currentMediaItem == null) { null } else if (player.duration == C.TIME_UNSET) { - MediaItemPosition.UnknownDuration(player.currentPosition.milliseconds) + MediaPosition.UnknownDuration(player.currentPosition.milliseconds) } else { - MediaItemPosition.create( + MediaPosition.create( current = player.currentPosition.milliseconds, // Ensure progress is max 100%, even given faulty media metadata duration = (player.duration.coerceAtLeast(player.currentPosition)).milliseconds diff --git a/media-data/src/main/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImpl.kt b/media-data/src/main/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImpl.kt index 53693f2eb8..ec5fe338ed 100644 --- a/media-data/src/main/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImpl.kt +++ b/media-data/src/main/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImpl.kt @@ -17,15 +17,16 @@ package com.google.android.horologist.media.data.repository import android.util.Log +import androidx.media3.common.MediaItem import androidx.media3.common.Player -import com.google.android.horologist.media.data.mapper.Media3MediaItemMapper import com.google.android.horologist.media.data.mapper.MediaItemMapper -import com.google.android.horologist.media.data.mapper.MediaItemPositionMapper +import com.google.android.horologist.media.data.mapper.MediaMapper +import com.google.android.horologist.media.data.mapper.MediaPositionMapper import com.google.android.horologist.media.data.mapper.PlayerStateMapper import com.google.android.horologist.media.data.mapper.SetCommandMapper import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import com.google.android.horologist.media.repository.PlayerRepository import kotlinx.coroutines.flow.MutableStateFlow @@ -66,17 +67,17 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { override val currentState: StateFlow = _currentState - private var _currentMediaItem = MutableStateFlow(null) + private var _currentMedia = MutableStateFlow(null) /** - * The current media item playing, or that would play when user hit play. + * The current media playing, or that would play when user hit play. */ - override val currentMediaItem: StateFlow - get() = _currentMediaItem + override val currentMedia: StateFlow + get() = _currentMedia - private var _mediaItemPosition = MutableStateFlow(null) + private var _mediaPosition = MutableStateFlow(null) - override val mediaItemPosition: StateFlow = _mediaItemPosition + override val mediaPosition: StateFlow = _mediaPosition private var _shuffleModeEnabled = MutableStateFlow(false) @@ -130,7 +131,7 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { } private fun updateCurrentMediaItem(player: Player) { - _currentMediaItem.value = player.currentMediaItem?.let(MediaItemMapper::map) + _currentMedia.value = player.currentMediaItem?.let(MediaMapper::map) } /** @@ -201,11 +202,11 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { } } - override fun play(mediaItemIndex: Int) { + override fun play(mediaIndex: Int) { checkNotClosed() player.value?.let { - it.seekToDefaultPosition(mediaItemIndex) + it.seekToDefaultPosition(mediaIndex) it.play() updatePosition() } @@ -220,13 +221,13 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { } } - override fun hasPreviousMediaItem(): Boolean { + override fun hasPreviousMedia(): Boolean { checkNotClosed() return player.value?.hasPreviousMediaItem() ?: false } - override fun skipToPreviousMediaItem() { + override fun skipToPreviousMedia() { checkNotClosed() player.value?.let { @@ -235,13 +236,13 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { } } - override fun hasNextMediaItem(): Boolean { + override fun hasNextMedia(): Boolean { checkNotClosed() return player.value?.hasNextMediaItem() ?: false } - override fun skipToNextMediaItem() { + override fun skipToNextMedia() { checkNotClosed() player.value?.let { @@ -291,65 +292,65 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { * This operation will stop the current MediaItem that is playing, if there is one, as per * [Player.setMediaItem]. */ - override fun setMediaItem(mediaItem: MediaItem) { + override fun setMedia(media: Media) { checkNotClosed() player.value?.let { - it.setMediaItem(Media3MediaItemMapper.map(mediaItem)) + it.setMediaItem(MediaItemMapper.map(media)) updatePosition() } } /** - * This operation will stop the current MediaItem that is playing, if there is one, as per + * This operation will stop the current [MediaItem] that is playing, if there is one, as per * [Player.setMediaItems]. */ - override fun setMediaItems(mediaItems: List) { + override fun setMediaList(mediaList: List) { checkNotClosed() player.value?.let { - it.setMediaItems(Media3MediaItemMapper.map(mediaItems)) + it.setMediaItems(MediaItemMapper.map(mediaList)) updatePosition() } } - override fun addMediaItem(mediaItem: MediaItem) { + override fun addMedia(media: Media) { checkNotClosed() - player.value?.addMediaItem(Media3MediaItemMapper.map(mediaItem)) + player.value?.addMediaItem(MediaItemMapper.map(media)) } - override fun addMediaItem(index: Int, mediaItem: MediaItem) { + override fun addMedia(index: Int, media: Media) { checkNotClosed() - player.value?.addMediaItem(index, Media3MediaItemMapper.map(mediaItem)) + player.value?.addMediaItem(index, MediaItemMapper.map(media)) } - override fun removeMediaItem(index: Int) { + override fun removeMedia(index: Int) { checkNotClosed() player.value?.removeMediaItem(index) } - override fun clearMediaItems() { + override fun clearMediaList() { checkNotClosed() player.value?.clearMediaItems() } - override fun getMediaItemCount(): Int { + override fun getMediaCount(): Int { checkNotClosed() return player.value?.mediaItemCount ?: 0 } - override fun getMediaItemAt(index: Int): MediaItem? { + override fun getMediaAt(index: Int): Media? { checkNotClosed() - return player.value?.getMediaItemAt(index)?.let(MediaItemMapper::map) + return player.value?.getMediaItemAt(index)?.let(MediaMapper::map) } - override fun getCurrentMediaItemIndex(): Int { + override fun getCurrentMediaIndex(): Int { checkNotClosed() return player.value?.currentMediaItemIndex ?: 0 @@ -366,7 +367,7 @@ public class PlayerRepositoryImpl : PlayerRepository, Closeable { * Updating roughly once a second while activity is foregrounded is appropriate. */ public fun updatePosition() { - _mediaItemPosition.value = MediaItemPositionMapper.map(player.value) + _mediaPosition.value = MediaPositionMapper.map(player.value) } public fun setPlaybackSpeed(speed: Float) { diff --git a/media-data/src/test/java/com/google/android/horologist/media/data/mapper/MediaItemPositionMapperTest.kt b/media-data/src/test/java/com/google/android/horologist/media/data/mapper/MediaPositionMapperTest.kt similarity index 82% rename from media-data/src/test/java/com/google/android/horologist/media/data/mapper/MediaItemPositionMapperTest.kt rename to media-data/src/test/java/com/google/android/horologist/media/data/mapper/MediaPositionMapperTest.kt index 9e4497dbbb..8c38279308 100644 --- a/media-data/src/test/java/com/google/android/horologist/media/data/mapper/MediaItemPositionMapperTest.kt +++ b/media-data/src/test/java/com/google/android/horologist/media/data/mapper/MediaPositionMapperTest.kt @@ -17,18 +17,18 @@ package com.google.android.horologist.media.data.mapper import androidx.media3.common.C -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.test.toolbox.testdoubles.FakeStatePlayer import com.google.common.truth.Truth.assertThat import org.junit.Test import kotlin.time.Duration.Companion.milliseconds -class MediaItemPositionMapperTest { +class MediaPositionMapperTest { val fakeStatePlayer = FakeStatePlayer() @Test fun `check position calculations null`() { - val position = MediaItemPositionMapper.map(null) + val position = MediaPositionMapper.map(null) assertThat(position).isNull() } @@ -39,7 +39,7 @@ class MediaItemPositionMapperTest { duration = C.TIME_UNSET ) val position = - MediaItemPositionMapper.map(fakeStatePlayer) as MediaItemPosition.UnknownDuration + MediaPositionMapper.map(fakeStatePlayer) as MediaPosition.UnknownDuration assertThat(position.current).isEqualTo(10.milliseconds) } @@ -50,7 +50,7 @@ class MediaItemPositionMapperTest { duration = 99L ) val position = - MediaItemPositionMapper.map(fakeStatePlayer) as MediaItemPosition.KnownDuration + MediaPositionMapper.map(fakeStatePlayer) as MediaPosition.KnownDuration assertThat(position.current).isEqualTo(100.milliseconds) assertThat(position.duration).isEqualTo(100.milliseconds) } @@ -62,7 +62,7 @@ class MediaItemPositionMapperTest { duration = 1000L ) val position = - MediaItemPositionMapper.map(fakeStatePlayer) as MediaItemPosition.KnownDuration + MediaPositionMapper.map(fakeStatePlayer) as MediaPosition.KnownDuration assertThat(position.current).isEqualTo(100.milliseconds) assertThat(position.duration).isEqualTo(1000.milliseconds) } diff --git a/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplCloseTest.kt b/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplCloseTest.kt index bca4d3cea6..ece1f41df7 100644 --- a/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplCloseTest.kt +++ b/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplCloseTest.kt @@ -20,7 +20,7 @@ import android.content.Context import android.os.Looper.getMainLooper import androidx.media3.test.utils.TestExoPlayerBuilder import androidx.test.core.app.ApplicationProvider -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import org.junit.Assert.assertThrows import org.junit.Before import org.junit.Test @@ -32,6 +32,7 @@ import org.robolectric.annotation.Config @RunWith(ParameterizedRobolectricTestRunner::class) @Config(manifest = Config.NONE) class PlayerRepositoryImplCloseTest( + @Suppress("unused") // it's used by junit to display the test name private val description: String, private val whenBlock: (PlayerRepositoryImpl, Context) -> Unit ) { @@ -78,17 +79,17 @@ class PlayerRepositoryImplCloseTest( param("pause") { sut: PlayerRepositoryImpl, _: Context -> sut.pause() }, - param("hasPreviousMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.hasPreviousMediaItem() + param("hasPreviousMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.hasPreviousMedia() }, - param("skipToPreviousMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.skipToPreviousMediaItem() + param("skipToPreviousMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.skipToPreviousMedia() }, - param("hasNextMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.hasNextMediaItem() + param("hasNextMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.hasNextMedia() }, - param("skipToNextMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.skipToNextMediaItem() + param("skipToNextMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.skipToNextMedia() }, param("getSeekBackIncrement") { sut: PlayerRepositoryImpl, _: Context -> sut.getSeekBackIncrement() @@ -105,32 +106,32 @@ class PlayerRepositoryImplCloseTest( param("setShuffleModeEnabled") { sut: PlayerRepositoryImpl, _: Context -> sut.setShuffleModeEnabled(true) }, - param("setMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.setMediaItem(getDummyMediaItem()) + param("setMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.setMedia(getDummyMedia()) }, - param("setMediaItems") { sut: PlayerRepositoryImpl, _: Context -> - sut.setMediaItems(listOf(getDummyMediaItem())) + param("setMediaList") { sut: PlayerRepositoryImpl, _: Context -> + sut.setMediaList(listOf(getDummyMedia())) }, - param("addMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.addMediaItem(getDummyMediaItem()) + param("addMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.addMedia(getDummyMedia()) }, - param("addMediaItem with index") { sut: PlayerRepositoryImpl, _: Context -> - sut.addMediaItem(1, getDummyMediaItem()) + param("addMedia with index") { sut: PlayerRepositoryImpl, _: Context -> + sut.addMedia(1, getDummyMedia()) }, - param("removeMediaItem") { sut: PlayerRepositoryImpl, _: Context -> - sut.removeMediaItem(1) + param("removeMedia") { sut: PlayerRepositoryImpl, _: Context -> + sut.removeMedia(1) }, - param("clearMediaItems") { sut: PlayerRepositoryImpl, _: Context -> - sut.clearMediaItems() + param("clearMediaList") { sut: PlayerRepositoryImpl, _: Context -> + sut.clearMediaList() }, - param("getMediaItemCount") { sut: PlayerRepositoryImpl, _: Context -> - sut.getMediaItemCount() + param("getMediaCount") { sut: PlayerRepositoryImpl, _: Context -> + sut.getMediaCount() }, - param("getMediaItemAt") { sut: PlayerRepositoryImpl, _: Context -> - sut.getMediaItemAt(1) + param("getMediaAt") { sut: PlayerRepositoryImpl, _: Context -> + sut.getMediaAt(1) }, - param("getCurrentMediaItemIndex") { sut: PlayerRepositoryImpl, _: Context -> - sut.getCurrentMediaItemIndex() + param("getCurrentMediaIndex") { sut: PlayerRepositoryImpl, _: Context -> + sut.getCurrentMediaIndex() }, param("release") { sut: PlayerRepositoryImpl, _: Context -> sut.release() @@ -142,7 +143,7 @@ class PlayerRepositoryImplCloseTest( whenBlock: (PlayerRepositoryImpl, Context) -> Unit ) = arrayOf(description, whenBlock) - private fun getDummyMediaItem() = MediaItem( + private fun getDummyMedia() = Media( id = "id", uri = "uri", title = "title", diff --git a/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplNotConnectedTest.kt b/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplNotConnectedTest.kt index 6e82902d01..b35fbbcbd3 100644 --- a/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplNotConnectedTest.kt +++ b/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplNotConnectedTest.kt @@ -19,7 +19,7 @@ package com.google.android.horologist.media.data.repository import android.content.Context import android.os.Looper.getMainLooper import androidx.test.core.app.ApplicationProvider -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.media.model.PlayerState import com.google.common.truth.Truth.assertThat import org.junit.Before @@ -32,6 +32,7 @@ import org.robolectric.annotation.Config @RunWith(ParameterizedRobolectricTestRunner::class) @Config(manifest = Config.NONE) class PlayerRepositoryImplNotConnectedTest( + @Suppress("unused") // it's used by junit to display the test name private val description: String, private val whenBlock: (PlayerRepositoryImpl) -> Unit ) { @@ -56,11 +57,11 @@ class PlayerRepositoryImplNotConnectedTest( // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isNull() - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).isEmpty() } @@ -82,17 +83,17 @@ class PlayerRepositoryImplNotConnectedTest( param("pause") { sut: PlayerRepositoryImpl -> sut.pause() }, - param("hasPreviousMediaItem") { sut: PlayerRepositoryImpl -> - sut.hasPreviousMediaItem() + param("hasPreviousMedia") { sut: PlayerRepositoryImpl -> + sut.hasPreviousMedia() }, - param("skipToPreviousMediaItem") { sut: PlayerRepositoryImpl -> - sut.skipToPreviousMediaItem() + param("skipToPreviousMedia") { sut: PlayerRepositoryImpl -> + sut.skipToPreviousMedia() }, - param("hasNextMediaItem") { sut: PlayerRepositoryImpl -> - sut.hasNextMediaItem() + param("hasNextMedia") { sut: PlayerRepositoryImpl -> + sut.hasNextMedia() }, - param("skipToNextMediaItem") { sut: PlayerRepositoryImpl -> - sut.skipToNextMediaItem() + param("skipToNextMedia") { sut: PlayerRepositoryImpl -> + sut.skipToNextMedia() }, param("getSeekBackIncrement") { sut: PlayerRepositoryImpl -> sut.getSeekBackIncrement() @@ -109,32 +110,32 @@ class PlayerRepositoryImplNotConnectedTest( param("setShuffleModeEnabled") { sut: PlayerRepositoryImpl -> sut.setShuffleModeEnabled(true) }, - param("setMediaItem") { sut: PlayerRepositoryImpl -> - sut.setMediaItem(getDummyMediaItem()) + param("setMedia") { sut: PlayerRepositoryImpl -> + sut.setMedia(getDummyMedia()) }, - param("setMediaItems") { sut: PlayerRepositoryImpl -> - sut.setMediaItems(listOf(getDummyMediaItem())) + param("setMediaList") { sut: PlayerRepositoryImpl -> + sut.setMediaList(listOf(getDummyMedia())) }, - param("addMediaItem") { sut: PlayerRepositoryImpl -> - sut.addMediaItem(getDummyMediaItem()) + param("addMedia") { sut: PlayerRepositoryImpl -> + sut.addMedia(getDummyMedia()) }, - param("addMediaItem with index") { sut: PlayerRepositoryImpl -> - sut.addMediaItem(1, getDummyMediaItem()) + param("addMedia with index") { sut: PlayerRepositoryImpl -> + sut.addMedia(1, getDummyMedia()) }, - param("removeMediaItem") { sut: PlayerRepositoryImpl -> - sut.removeMediaItem(1) + param("removeMedia") { sut: PlayerRepositoryImpl -> + sut.removeMedia(1) }, - param("clearMediaItems") { sut: PlayerRepositoryImpl -> - sut.clearMediaItems() + param("clearMediaList") { sut: PlayerRepositoryImpl -> + sut.clearMediaList() }, - param("getMediaItemCount") { sut: PlayerRepositoryImpl -> - sut.getMediaItemCount() + param("getMediaCount") { sut: PlayerRepositoryImpl -> + sut.getMediaCount() }, - param("getMediaItemAt") { sut: PlayerRepositoryImpl -> - sut.getMediaItemAt(1) + param("getMediaAt") { sut: PlayerRepositoryImpl -> + sut.getMediaAt(1) }, - param("getCurrentMediaItemIndex") { sut: PlayerRepositoryImpl -> - sut.getCurrentMediaItemIndex() + param("getCurrentMediaIndex") { sut: PlayerRepositoryImpl -> + sut.getCurrentMediaIndex() }, param("updatePosition") { sut: PlayerRepositoryImpl -> sut.updatePosition() @@ -149,7 +150,7 @@ class PlayerRepositoryImplNotConnectedTest( whenBlock: (PlayerRepositoryImpl) -> Unit ) = arrayOf(description, whenBlock) - private fun getDummyMediaItem() = MediaItem( + private fun getDummyMedia() = Media( id = "id", uri = "uri", title = "title", diff --git a/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplTest.kt b/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplTest.kt index 30a1d7c8c7..e99cda8a80 100644 --- a/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplTest.kt +++ b/media-data/src/test/java/com/google/android/horologist/media/data/repository/PlayerRepositoryImplTest.kt @@ -24,10 +24,10 @@ import androidx.media3.test.utils.robolectric.TestPlayerRunHelper.playUntilPosit import androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPendingCommandsAreFullyHandled import androidx.media3.test.utils.robolectric.TestPlayerRunHelper.runUntilPlaybackState import androidx.test.core.app.ApplicationProvider -import com.google.android.horologist.media.data.mapper.Media3MediaItemMapper +import com.google.android.horologist.media.data.mapper.MediaItemMapper import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import com.google.common.truth.Truth.assertThat import org.junit.Assert.assertThrows @@ -69,11 +69,11 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) @@ -126,9 +126,9 @@ class PlayerRepositoryImplTest { val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") - sut.setMediaItem(mediaItem) + sut.setMedia(media) sut.prepare() // when @@ -138,12 +138,12 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Playing) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) // position is unknown because updatePosition function was not called - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SeekBack, Command.SeekForward, Command.SetShuffle) ) @@ -154,9 +154,9 @@ class PlayerRepositoryImplTest { // given val player = TestExoPlayerBuilder(context).build() - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") - player.setMediaItem(Media3MediaItemMapper.map(mediaItem)) + player.setMediaItem(MediaItemMapper.map(media)) player.prepare() // when @@ -168,7 +168,7 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Playing) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) @@ -183,9 +183,9 @@ class PlayerRepositoryImplTest { val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") - sut.setMediaItem(mediaItem) + sut.setMedia(media) sut.prepare() // when @@ -196,11 +196,11 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Ended) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SeekBack, Command.SeekForward, Command.SetShuffle) ) @@ -223,10 +223,10 @@ class PlayerRepositoryImplTest { assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) // given - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") // when - sut.setMediaItem(mediaItem) + sut.setMedia(media) runUntilPendingCommandsAreFullyHandled(player) // then @@ -281,37 +281,37 @@ class PlayerRepositoryImplTest { val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem1 = getStubMediaItem("id1") - val mediaItem2 = getStubMediaItem("id2") + val media1 = getStubMedia("id1") + val media2 = getStubMedia("id2") - sut.setMediaItems(listOf(mediaItem1, mediaItem2)) + sut.setMediaList(listOf(media1, media2)) sut.prepare() // when - sut.play(mediaItemIndex = 1) + sut.play(mediaIndex = 1) // then runUntilPendingCommandsAreFullyHandled(player) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem2) + assertThat(sut.currentMedia.value).isEqualTo(media2) // and when playUntilPosition(player, 1, 5.seconds.inWholeMilliseconds) // then - assertThat(sut.getMediaItemCount()).isEqualTo(2) - assertThat(sut.getMediaItemAt(1)).isEqualTo(mediaItem2) - assertThat(sut.getCurrentMediaItemIndex()).isEqualTo(1) + assertThat(sut.getMediaCount()).isEqualTo(2) + assertThat(sut.getMediaAt(1)).isEqualTo(media2) + assertThat(sut.getCurrentMediaIndex()).isEqualTo(1) assertThat(sut.currentState.value).isEqualTo(PlayerState.Playing) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem2) + assertThat(sut.currentMedia.value).isEqualTo(media2) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) // position is unknown because updatePosition function was not called - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf( Command.PlayPause, - Command.SkipToPreviousMediaItem, + Command.SkipToPreviousMedia, Command.SeekBack, Command.SeekForward, Command.SetShuffle @@ -325,8 +325,8 @@ class PlayerRepositoryImplTest { val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id") - sut.setMediaItem(mediaItem) + val media = getStubMedia("id") + sut.setMedia(media) sut.prepare() sut.play() playUntilPosition(player, 0, 510.milliseconds.inWholeMilliseconds) @@ -338,11 +338,11 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Ready) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value!!.current).isEqualTo(510.milliseconds) + assertThat(sut.mediaPosition.value!!.current).isEqualTo(510.milliseconds) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SeekBack, Command.SeekForward, Command.SetShuffle) ) @@ -390,469 +390,469 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isTrue() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given NO previous MediaItems is set when setMediaItem then state is correct`() { + fun `given NO previous Media is set when setMedia then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getDummyMediaItem() + val media = getDummyMedia() // when - sut.setMediaItem(mediaItem) + sut.setMedia(media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given previous MediaItem is set when setMediaItem then state is correct`() { + fun `given previous Media is set when setMedia then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - sut.setMediaItem(getStubMediaItem("id1")) + sut.setMedia(getStubMedia("id1")) - val mediaItem = getStubMediaItem("id2") + val media = getStubMedia("id2") // when - sut.setMediaItem(mediaItem) + sut.setMedia(media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given is playing when setMediaItem then state is correct`() { + fun `given is playing when setMedia then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem1 = getStubMediaItem("id1") - sut.setMediaItem(mediaItem1) + val media1 = getStubMedia("id1") + sut.setMedia(media1) sut.prepare() sut.play() playUntilPosition(player, 0, 510.milliseconds.inWholeMilliseconds) sut.updatePosition() // then - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem1) + assertThat(sut.getMediaAt(0)).isEqualTo(media1) assertThat(sut.currentState.value).isEqualTo(PlayerState.Playing) - assertThat(sut.mediaItemPosition.value!!.current).isEqualTo(500.milliseconds) + assertThat(sut.mediaPosition.value!!.current).isEqualTo(500.milliseconds) // given - val mediaItem2 = getDummyMediaItem() + val media2 = getDummyMedia() // when - sut.setMediaItem(mediaItem2) + sut.setMedia(media2) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem2) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media2) assertThat(sut.currentState.value).isEqualTo(PlayerState.Loading) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem2) + assertThat(sut.currentMedia.value).isEqualTo(media2) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given NO previous MediaItems is set when setMediaItems then state is correct`() { + fun `given NO previous MediaList is set when setMediaList then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem1 = getStubMediaItem("id1") - val mediaItem2 = getStubMediaItem("id2") - val mediaItems = listOf(mediaItem1, mediaItem2) + val media1 = getStubMedia("id1") + val media2 = getStubMedia("id2") + val mediaList = listOf(media1, media2) // when - sut.setMediaItems(mediaItems) + sut.setMediaList(mediaList) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(2) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem1) - assertThat(sut.getMediaItemAt(1)).isEqualTo(mediaItem2) + assertThat(sut.getMediaCount()).isEqualTo(2) + assertThat(sut.getMediaAt(0)).isEqualTo(media1) + assertThat(sut.getMediaAt(1)).isEqualTo(media2) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem1) + assertThat(sut.currentMedia.value).isEqualTo(media1) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( - listOf(Command.PlayPause, Command.SkipToNextMediaItem, Command.SetShuffle) + listOf(Command.PlayPause, Command.SkipToNextMedia, Command.SetShuffle) ) } @Test - fun `given previous MediaItems is set when setMediaItems then state is correct`() { + fun `given previous MediaList is set when setMediaList then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - sut.setMediaItems(listOf(getStubMediaItem("id1"), getStubMediaItem("id2"))) + sut.setMediaList(listOf(getStubMedia("id1"), getStubMedia("id2"))) - val mediaItem1 = getStubMediaItem("id3") - val mediaItem2 = getStubMediaItem("id4") - val mediaItems = listOf(mediaItem1, mediaItem2) + val media1 = getStubMedia("id3") + val media2 = getStubMedia("id4") + val mediaList = listOf(media1, media2) // when - sut.setMediaItems(mediaItems) + sut.setMediaList(mediaList) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(2) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem1) - assertThat(sut.getMediaItemAt(1)).isEqualTo(mediaItem2) + assertThat(sut.getMediaCount()).isEqualTo(2) + assertThat(sut.getMediaAt(0)).isEqualTo(media1) + assertThat(sut.getMediaAt(1)).isEqualTo(media2) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem1) + assertThat(sut.currentMedia.value).isEqualTo(media1) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( - listOf(Command.PlayPause, Command.SkipToNextMediaItem, Command.SetShuffle) + listOf(Command.PlayPause, Command.SkipToNextMedia, Command.SetShuffle) ) } @Test - fun `given NO previous MediaItems is set when addMediaItem then state is correct`() { + fun `given NO previous Media is set when addMedia then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") // when - sut.addMediaItem(mediaItem) + sut.addMedia(media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given previous MediaItem is set when addMediaItem then state is correct`() { + fun `given previous Media is set when addMedia then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val previousMediaItem = getStubMediaItem("id1") - sut.setMediaItem(previousMediaItem) + val previousMedia = getStubMedia("id1") + sut.setMedia(previousMedia) - val mediaItem = getStubMediaItem("id2") + val media = getStubMedia("id2") // when - sut.addMediaItem(mediaItem) + sut.addMedia(media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(2) - assertThat(sut.getMediaItemAt(0)).isEqualTo(previousMediaItem) - assertThat(sut.getMediaItemAt(1)).isEqualTo(mediaItem) + assertThat(sut.getMediaCount()).isEqualTo(2) + assertThat(sut.getMediaAt(0)).isEqualTo(previousMedia) + assertThat(sut.getMediaAt(1)).isEqualTo(media) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(previousMediaItem) + assertThat(sut.currentMedia.value).isEqualTo(previousMedia) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( - listOf(Command.PlayPause, Command.SkipToNextMediaItem, Command.SetShuffle) + listOf(Command.PlayPause, Command.SkipToNextMedia, Command.SetShuffle) ) } @Test - fun `given NO previous MediaItems is set when addMediaItem with valid index then state is correct`() { + fun `given NO previous Media is set when addMedia with valid index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") // when - sut.addMediaItem(0, mediaItem) + sut.addMedia(0, media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given previous MediaItem is set when addMediaItem with valid index then state is correct`() { + fun `given previous Media is set when addMedia with valid index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val previousMediaItem = getStubMediaItem("id1") - sut.setMediaItem(previousMediaItem) + val previousMedia = getStubMedia("id1") + sut.setMedia(previousMedia) - val mediaItem = getStubMediaItem("id2") + val media = getStubMedia("id2") // when - sut.addMediaItem(0, mediaItem) + sut.addMedia(0, media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(2) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem) - assertThat(sut.getMediaItemAt(1)).isEqualTo(previousMediaItem) + assertThat(sut.getMediaCount()).isEqualTo(2) + assertThat(sut.getMediaAt(0)).isEqualTo(media) + assertThat(sut.getMediaAt(1)).isEqualTo(previousMedia) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(previousMediaItem) + assertThat(sut.currentMedia.value).isEqualTo(previousMedia) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( - listOf(Command.PlayPause, Command.SkipToPreviousMediaItem, Command.SetShuffle) + listOf(Command.PlayPause, Command.SkipToPreviousMedia, Command.SetShuffle) ) } @Test - fun `given previous MediaItem is set when addMediaItem with index greater than size of playlist then state is correct`() { + fun `given previous Media is set when addMedia with index greater than size of playlist then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val previousMediaItem = getStubMediaItem("id1") - sut.setMediaItem(previousMediaItem) + val previousMedia = getStubMedia("id1") + sut.setMedia(previousMedia) - val mediaItem = getStubMediaItem("id2") + val media = getStubMedia("id2") // when - sut.addMediaItem(5, mediaItem) + sut.addMedia(5, media) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(2) - assertThat(sut.getMediaItemAt(0)).isEqualTo(previousMediaItem) - assertThat(sut.getMediaItemAt(1)).isEqualTo(mediaItem) + assertThat(sut.getMediaCount()).isEqualTo(2) + assertThat(sut.getMediaAt(0)).isEqualTo(previousMedia) + assertThat(sut.getMediaAt(1)).isEqualTo(media) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(previousMediaItem) + assertThat(sut.currentMedia.value).isEqualTo(previousMedia) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( - listOf(Command.PlayPause, Command.SkipToNextMediaItem, Command.SetShuffle) + listOf(Command.PlayPause, Command.SkipToNextMedia, Command.SetShuffle) ) } @Test - fun `given connected when addMediaItem with invalid index then state is correct`() { + fun `given connected when addMedia with invalid index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id1") + val media = getStubMedia("id1") // when - val whenBlock = { sut.addMediaItem(-1, mediaItem) } + val whenBlock = { sut.addMedia(-1, media) } // then assertThrows(IllegalArgumentException::class.java) { whenBlock() } } @Test - fun `given connected AND NO previous MediaItem is set when removeMediaItem with zero index then state is correct`() { + fun `given connected AND NO previous Media is set when removeMedia with zero index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} // when - sut.removeMediaItem(0) + sut.removeMedia(0) // then // I'd expect it to throw IllegalArgumentException as per test below, maybe a bug in Media3 - assertThat(sut.getMediaItemCount()).isEqualTo(0) + assertThat(sut.getMediaCount()).isEqualTo(0) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given connected AND NO previous MediaItem is set when removeMediaItem with index greater than zero then state is correct`() { + fun `given connected AND NO previous Media is set when removeMedia with index greater than zero then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} // when - val whenBlock = { sut.removeMediaItem(1) } + val whenBlock = { sut.removeMedia(1) } // then assertThrows(IllegalArgumentException::class.java) { whenBlock() } } @Test - fun `given previous MediaItem is set when removeMediaItem with invalid index then state is correct`() { + fun `given previous Media is set when removeMedia with invalid index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val previousMediaItem = getStubMediaItem("id1") - sut.setMediaItem(previousMediaItem) + val previousMedia = getStubMedia("id1") + sut.setMedia(previousMedia) // when - val whenBlock = { sut.removeMediaItem(-1) } + val whenBlock = { sut.removeMedia(-1) } // then assertThrows(IllegalArgumentException::class.java) { whenBlock() } } @Test - fun `given connected AND previous MediaItem is set when removeMediaItem with current item index then state is correct`() { + fun `given connected AND previous Media is set when removeMedia with current Media index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem1 = getStubMediaItem("id1") - val mediaItem2 = getStubMediaItem("id2") - val mediaItems = listOf(mediaItem1, mediaItem2) - sut.setMediaItems(mediaItems) + val media1 = getStubMedia("id1") + val media2 = getStubMedia("id2") + val mediaList = listOf(media1, media2) + sut.setMediaList(mediaList) // when - sut.removeMediaItem(0) + sut.removeMedia(0) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem2) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media2) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem2) + assertThat(sut.currentMedia.value).isEqualTo(media2) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given connected AND previous MediaItem is set when removeMediaItem with queued item index then state is correct`() { + fun `given connected AND previous Media is set when removeMedia with queued Media index then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem1 = getStubMediaItem("id1") - val mediaItem2 = getStubMediaItem("id2") - val mediaItems = listOf(mediaItem1, mediaItem2) - sut.setMediaItems(mediaItems) + val media1 = getStubMedia("id1") + val media2 = getStubMedia("id2") + val mediaList = listOf(media1, media2) + sut.setMediaList(mediaList) // when - sut.removeMediaItem(1) + sut.removeMedia(1) runUntilPendingCommandsAreFullyHandled(player) // then - assertThat(sut.getMediaItemCount()).isEqualTo(1) - assertThat(sut.getMediaItemAt(0)).isEqualTo(mediaItem1) + assertThat(sut.getMediaCount()).isEqualTo(1) + assertThat(sut.getMediaAt(0)).isEqualTo(media1) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem1) + assertThat(sut.currentMedia.value).isEqualTo(media1) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given connected AND NO previous MediaItem is set when clearMediaItems then state is correct`() { + fun `given connected AND NO previous Media is set when clearMediaList then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} // when - sut.clearMediaItems() + sut.clearMediaList() // then - assertThat(sut.getMediaItemCount()).isEqualTo(0) + assertThat(sut.getMediaCount()).isEqualTo(0) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } @Test - fun `given connected AND previous MediaItem is set when clearMediaItems then state is correct`() { + fun `given connected AND previous Media is set when clearMediaList then state is correct`() { // given val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - sut.setMediaItems(listOf(getStubMediaItem("id1"), getStubMediaItem("id2"))) + sut.setMediaList(listOf(getStubMedia("id1"), getStubMedia("id2"))) // when - sut.clearMediaItems() + sut.clearMediaList() // then - assertThat(sut.getMediaItemCount()).isEqualTo(0) + assertThat(sut.getMediaCount()).isEqualTo(0) assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isEqualTo(MediaItemPosition.UnknownDuration(0.seconds)) + assertThat(sut.mediaPosition.value).isEqualTo(MediaPosition.UnknownDuration(0.seconds)) assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) @@ -876,9 +876,9 @@ class PlayerRepositoryImplTest { val player = TestExoPlayerBuilder(context).build() sut.connect(player) {} - val mediaItem = getStubMediaItem("id") + val media = getStubMedia("id") - sut.setMediaItem(mediaItem) + sut.setMedia(media) sut.prepare() sut.play() playUntilPosition(player, 0, 5.seconds.inWholeMilliseconds) @@ -888,7 +888,7 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Playing) - assertThat(sut.currentMediaItem.value).isEqualTo(mediaItem) + assertThat(sut.currentMedia.value).isEqualTo(media) assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) @@ -896,14 +896,14 @@ class PlayerRepositoryImplTest { listOf(Command.PlayPause, Command.SeekBack, Command.SeekForward, Command.SetShuffle) ) - assertThat(sut.mediaItemPosition.value).isInstanceOf(MediaItemPosition.KnownDuration::class.java) - val expectedMediaItemPosition = - MediaItemPosition.create(current = 1020.milliseconds, duration = 1022.milliseconds) - val actualMediaItemPosition = sut.mediaItemPosition.value as MediaItemPosition.KnownDuration - // TODO these checks can be simplified to `assertThat().isEqualTo()` once horologist implements equals for MediaItemPosition.KnownDuration - assertThat(actualMediaItemPosition.current).isEqualTo(expectedMediaItemPosition.current) - assertThat(actualMediaItemPosition.duration).isEqualTo(expectedMediaItemPosition.duration) - assertThat(actualMediaItemPosition.percent).isEqualTo(expectedMediaItemPosition.percent) + assertThat(sut.mediaPosition.value).isInstanceOf(MediaPosition.KnownDuration::class.java) + val expectedMediaPosition = + MediaPosition.create(current = 1020.milliseconds, duration = 1022.milliseconds) + val actualMediaPosition = sut.mediaPosition.value as MediaPosition.KnownDuration + // TODO these checks can be simplified to `assertThat().isEqualTo()` once horologist implements equals for MediaPosition.KnownDuration + assertThat(actualMediaPosition.current).isEqualTo(expectedMediaPosition.current) + assertThat(actualMediaPosition.duration).isEqualTo(expectedMediaPosition.duration) + assertThat(actualMediaPosition.percent).isEqualTo(expectedMediaPosition.percent) } @Test @@ -919,11 +919,11 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) @@ -945,17 +945,17 @@ class PlayerRepositoryImplTest { // then assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(speed) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isSameInstanceAs(player) - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).containsExactlyElementsIn( listOf(Command.PlayPause, Command.SetShuffle) ) } - private fun getDummyMediaItem() = MediaItem( + private fun getDummyMedia() = Media( id = "id", uri = "uri", title = "title", @@ -963,7 +963,7 @@ class PlayerRepositoryImplTest { artworkUri = "artworkUri", ) - private fun getStubMediaItem(id: String) = MediaItem( + private fun getStubMedia(id: String) = Media( id = id, uri = "asset://android_asset/media/mp4/testvid_1022ms.mp4", title = "title", @@ -973,11 +973,11 @@ class PlayerRepositoryImplTest { private fun assertInitialState() { assertThat(sut.currentState.value).isEqualTo(PlayerState.Idle) - assertThat(sut.currentMediaItem.value).isNull() + assertThat(sut.currentMedia.value).isNull() assertThat(sut.playbackSpeed.value).isEqualTo(1f) assertThat(sut.shuffleModeEnabled.value).isFalse() assertThat(sut.player.value).isNull() - assertThat(sut.mediaItemPosition.value).isNull() + assertThat(sut.mediaPosition.value).isNull() assertThat(sut.availableCommands.value).isEmpty() } } diff --git a/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackErrorTest.kt b/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackErrorTest.kt index b6054331ce..0d8a8f5218 100644 --- a/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackErrorTest.kt +++ b/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackErrorTest.kt @@ -18,8 +18,8 @@ package com.google.android.horologist.mediasample.playback import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest -import com.google.android.horologist.media.data.mapper.Media3MediaItemMapper -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.data.mapper.MediaItemMapper +import com.google.android.horologist.media.model.Media import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest import kotlinx.coroutines.Dispatchers @@ -38,7 +38,7 @@ class PlaybackErrorTest : BasePlaybackTest() { withContext(Dispatchers.Main) { val browser = browser() - val badContent = MediaItem( + val badContent = Media( "1", "milkjawn", "milkjawn", @@ -47,7 +47,7 @@ class PlaybackErrorTest : BasePlaybackTest() { ) browser.setMediaItem( - Media3MediaItemMapper.map(badContent), + MediaItemMapper.map(badContent), ) browser.prepare() browser.play() diff --git a/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackNotificationTest.kt b/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackNotificationTest.kt index ca689af539..9ad744af39 100644 --- a/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackNotificationTest.kt +++ b/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/PlaybackNotificationTest.kt @@ -20,7 +20,7 @@ import android.app.Notification import androidx.core.app.NotificationCompat import androidx.test.ext.junit.runners.AndroidJUnit4 import androidx.test.filters.LargeTest -import com.google.android.horologist.media.data.mapper.Media3MediaItemMapper +import com.google.android.horologist.media.data.mapper.MediaItemMapper import com.google.android.horologist.media3.flows.waitForPlaying import com.google.common.truth.Truth.assertThat import dagger.hilt.android.testing.HiltAndroidTest @@ -43,7 +43,7 @@ class PlaybackNotificationTest : BasePlaybackTest() { withContext(Dispatchers.Main) { val browser = browser() - val mediaItem = Media3MediaItemMapper.map(TestMedia.songMp3) + val mediaItem = MediaItemMapper.map(TestMedia.songMp3) assertThat(mediaItem).isNotNull() browser.setMediaItem(mediaItem,) assertThat(browser.currentMediaItem).isNotNull() diff --git a/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/TestMedia.kt b/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/TestMedia.kt index c1f098ea0f..bb64eb2b07 100644 --- a/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/TestMedia.kt +++ b/media-sample/src/androidTest/java/com/google/android/horologist/mediasample/playback/TestMedia.kt @@ -16,10 +16,10 @@ package com.google.android.horologist.mediasample.playback -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media object TestMedia { - val songMp3 = MediaItem( + val songMp3 = Media( "1", "https://storage.googleapis.com/uamp/The_Kyoto_Connection_-_Wake_Up/01_-_Intro_-_The_Way_Of_Waking_Up_feat_Alan_Watts.mp3", "Intro - The Way Of Waking Up (feat. Alan Watts)", @@ -27,7 +27,7 @@ object TestMedia { "https://storage.googleapis.com/uamp/The_Kyoto_Connection_-_Wake_Up/art.jpg", ) // https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/audio-samples.html - val songAac = MediaItem( + val songAac = Media( "2", "https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.aac", "Espressif", @@ -36,7 +36,7 @@ object TestMedia { ) // https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/audio-samples.html - val songMp3_24bit = MediaItem( + val songMp3_24bit = Media( "3", "https://dl.espressif.com/dl/audio/ff-16b-2c-8000hz.mp3", "Espressif", @@ -45,7 +45,7 @@ object TestMedia { ) // https://docs.espressif.com/projects/esp-adf/en/latest/design-guide/audio-samples.html - val songOgg = MediaItem( + val songOgg = Media( "4", "https://dl.espressif.com/dl/audio/ff-16b-2c-44100hz.ogg", "Espressif", @@ -54,7 +54,7 @@ object TestMedia { ) // https://podnews.net/article/audio-quality-comparisons - val songMp3_192 = MediaItem( + val songMp3_192 = Media( "4", "https://podnews.net/audio/s-192-44100.mp3", "Espressif", diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/api/model/MusicApiModel.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/api/model/MusicApiModel.kt index b736a79937..d283d02ff3 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/api/model/MusicApiModel.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/api/model/MusicApiModel.kt @@ -16,7 +16,7 @@ package com.google.android.horologist.mediasample.data.api.model -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.squareup.moshi.JsonClass @JsonClass(generateAdapter = true) @@ -33,7 +33,7 @@ data class MusicApiModel( val totalTrackCount: Int, val trackNumber: Int ) { - fun toMediaItem() = MediaItem( + fun toMedia() = Media( id = id, uri = source, title = title, diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/MediaItemMapper.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/MediaMapper.kt similarity index 76% rename from media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/MediaItemMapper.kt rename to media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/MediaMapper.kt index e78cfb2bd0..e0f886f3c8 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/MediaItemMapper.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/MediaMapper.kt @@ -16,15 +16,15 @@ package com.google.android.horologist.mediasample.data.mapper -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.mediasample.data.api.model.MusicApiModel /** - * Maps a [MusicApiModel] into [MediaItem]. + * Maps a [MusicApiModel] into [Media]. */ -object MediaItemMapper { +object MediaMapper { - fun map(musicApiModel: MusicApiModel): MediaItem = MediaItem( + fun map(musicApiModel: MusicApiModel): Media = Media( id = musicApiModel.id, uri = musicApiModel.source, title = musicApiModel.title, @@ -32,5 +32,5 @@ object MediaItemMapper { artworkUri = musicApiModel.image ) - fun map(musicApiModels: List): List = musicApiModels.map(::map) + fun map(musicApiModels: List): List = musicApiModels.map(::map) } diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistDownloadMapper.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistDownloadMapper.kt index d6e33194c6..014ceeaacd 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistDownloadMapper.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistDownloadMapper.kt @@ -28,13 +28,13 @@ object PlaylistDownloadMapper { ): PlaylistDownload = PlaylistDownload( playlist = playlist, buildList { - playlist.mediaItems.forEach { mediaItem -> + playlist.mediaList.forEach { media -> val status = - playlistDownloadEntityList.firstOrNull { it.mediaItemId == mediaItem.id } + playlistDownloadEntityList.firstOrNull { it.mediaItemId == media.id } ?.let { PlaylistDownloadStatusMapper.map(it.status) } ?: PlaylistDownload.Status.Idle - add(Pair(mediaItem, status)) + add(Pair(media, status)) } } ) diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapper.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapper.kt index 1282a12719..8a52578bac 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapper.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapper.kt @@ -31,7 +31,7 @@ object PlaylistMapper { Playlist( id = sanitize(entry.key), name = entry.key, - mediaItems = MediaItemMapper.map(entry.value), + mediaList = MediaMapper.map(entry.value), artworkUri = entry.value.firstOrNull()?.image ) } diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/repository/PlaylistDownloadRepositoryImpl.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/repository/PlaylistDownloadRepositoryImpl.kt index 9c5dffdc33..42b0a1f70f 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/data/repository/PlaylistDownloadRepositoryImpl.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/data/repository/PlaylistDownloadRepositoryImpl.kt @@ -37,7 +37,7 @@ class PlaylistDownloadRepositoryImpl( override fun download(playlist: Playlist) { coroutineScope.launch { - playlist.mediaItems.forEach { + playlist.mediaList.forEach { playlistDownloadLocalDataSource.add( playlistId = playlist.id, mediaItemId = it.id, diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/Playlist.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/Playlist.kt index 7020ac4bc3..6fe03d00de 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/Playlist.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/Playlist.kt @@ -16,11 +16,11 @@ package com.google.android.horologist.mediasample.domain.model -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media data class Playlist( val id: String, val name: String, - val mediaItems: List, + val mediaList: List, val artworkUri: String? = null, ) diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/PlaylistDownload.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/PlaylistDownload.kt index efaca94202..479c66cdce 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/PlaylistDownload.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/domain/model/PlaylistDownload.kt @@ -16,11 +16,11 @@ package com.google.android.horologist.mediasample.domain.model -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media data class PlaylistDownload( val playlist: Playlist, - val mediaList: List> + val mediaList: List> ) { enum class Status { diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/tile/MediaCollectionsTileService.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/tile/MediaCollectionsTileService.kt index a412186eb4..c0c4cd97c8 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/tile/MediaCollectionsTileService.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/tile/MediaCollectionsTileService.kt @@ -32,7 +32,7 @@ import coil.ImageLoader import com.google.android.horologist.compose.tools.TileLayoutPreview import com.google.android.horologist.compose.tools.WearPreviewDevices import com.google.android.horologist.compose.tools.WearPreviewFontSizes -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.media.ui.tiles.MediaCollectionsTileRenderer import com.google.android.horologist.media.ui.tiles.toTileColors import com.google.android.horologist.mediasample.BuildConfig @@ -97,9 +97,9 @@ class MediaCollectionsTileService : CoroutinesTileService() { ) } - suspend fun loadItems(): Pair { + suspend fun loadItems(): Pair { val catalog = uampService.catalog().music.map { - it.toMediaItem() + it.toMedia() } return Pair(catalog.first(), catalog.last()) diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/app/MediaPlayerAppViewModel.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/app/MediaPlayerAppViewModel.kt index 37fefdf3a1..f1f8e3c3f3 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/app/MediaPlayerAppViewModel.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/app/MediaPlayerAppViewModel.kt @@ -112,13 +112,13 @@ class MediaPlayerAppViewModel @Inject constructor( ) suspend fun loadItems() { - if (playerRepository.currentMediaItem.value == null) { + if (playerRepository.currentMedia.value == null) { try { val mediaItems = uampService.catalog().music.map { - it.toMediaItem() + it.toMedia() } - playerRepository.setMediaItems(mediaItems) + playerRepository.setMediaList(mediaItems) playerRepository.prepare() } catch (ioe: IOException) { snackbarManager.showMessage( @@ -134,7 +134,7 @@ class MediaPlayerAppViewModel @Inject constructor( suspend fun startupSetup(navigateToLibrary: () -> Unit) { waitForConnection() - val currentMediaItem = playerRepository.currentMediaItem.value + val currentMediaItem = playerRepository.currentMedia.value if (currentMediaItem == null) { val loadAtStartup = @@ -150,7 +150,7 @@ class MediaPlayerAppViewModel @Inject constructor( suspend fun playItems(mediaId: String?, collectionId: String) { try { - val mediaItems = uampService.catalog().music.map { it.toMediaItem() }.filter { + val mediaItems = uampService.catalog().music.map { it.toMedia() }.filter { it.artist == collectionId } @@ -158,9 +158,9 @@ class MediaPlayerAppViewModel @Inject constructor( waitForConnection() - playerRepository.setMediaItems(mediaItems) + playerRepository.setMediaList(mediaItems) playerRepository.prepare() - playerRepository.play(mediaItemIndex = index) + playerRepository.play(mediaIndex = index) } catch (ioe: IOException) { snackbarManager.showMessage( UiMessage( diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/components/AnimatedPlayerScreenMediaDisplay.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/components/AnimatedPlayerScreenMediaDisplay.kt index 2c6fa1c1f3..c791d6489d 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/components/AnimatedPlayerScreenMediaDisplay.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/components/AnimatedPlayerScreenMediaDisplay.kt @@ -34,14 +34,14 @@ public fun AnimatedPlayerScreenMediaDisplay( playerUiState: PlayerUiState, modifier: Modifier = Modifier, ) { - val mediaItem = playerUiState.mediaItem + val media = playerUiState.media if (!playerUiState.connected) { LoadingMediaDisplay(modifier) - } else if (mediaItem != null) { + } else if (media != null) { MarqueeTextMediaDisplay( modifier = modifier, - title = mediaItem.title, - artist = mediaItem.artist, + title = media.title, + artist = media.artist, ) } else { InfoMediaDisplay( diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/debug/SamplesScreenViewModel.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/debug/SamplesScreenViewModel.kt index 6f4e9d76d9..cf6946592b 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/debug/SamplesScreenViewModel.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/debug/SamplesScreenViewModel.kt @@ -17,7 +17,7 @@ package com.google.android.horologist.mediasample.ui.debug import androidx.lifecycle.ViewModel -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.media.repository.PlayerRepository import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.coroutines.flow.MutableStateFlow @@ -44,7 +44,7 @@ class SamplesScreenViewModel @Inject constructor( }?.mediaItems if (mediaItems != null) { - playerRepository.setMediaItems(mediaItems) + playerRepository.setMediaList(mediaItems) playerRepository.prepare() playerRepository.play() return true @@ -56,7 +56,7 @@ class SamplesScreenViewModel @Inject constructor( data class Sample( val id: Int, val name: String, - val mediaItems: List + val mediaItems: List ) data class UiState( @@ -71,7 +71,7 @@ class SamplesScreenViewModel @Inject constructor( "https://www2.iis.fraunhofer.de/AAC/gapless-sweep_part1_iis.m4a?delay=1600&padding=106", "https://www2.iis.fraunhofer.de/AAC/gapless-sweep_part2_iis.m4a?delay=110&padding=1024" ).mapIndexed { i, it -> - MediaItem( + Media( id = i.toString(), uri = it, title = "Fraunhofer Gapless $i", @@ -88,7 +88,7 @@ class SamplesScreenViewModel @Inject constructor( "https://storage.googleapis.com/exoplayer-test-media-internal-63834241aced7884c2544af1a3452e01/m4a/gapless-asot-10.m4a", "https://storage.googleapis.com/exoplayer-test-media-internal-63834241aced7884c2544af1a3452e01/m4a/gapless-asot-11.m4a" ).mapIndexed { i, it -> - MediaItem( + Media( id = i.toString(), uri = it, title = "Gapless $i", @@ -104,7 +104,7 @@ class SamplesScreenViewModel @Inject constructor( "https://storage.googleapis.com/exoplayer-test-media-internal-63834241aced7884c2544af1a3452e01/m4a/gapless-asot-10-stripped.m4a", "https://storage.googleapis.com/exoplayer-test-media-internal-63834241aced7884c2544af1a3452e01/m4a/gapless-asot-11-stripped.m4a" ).mapIndexed { i, it -> - MediaItem( + Media( id = i.toString(), uri = it, title = "Gapless (stripped) $i", diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/DownloadMediaItemUiModelMapper.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/DownloadMediaUiModelMapper.kt similarity index 70% rename from media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/DownloadMediaItemUiModelMapper.kt rename to media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/DownloadMediaUiModelMapper.kt index d48734a1df..cfd560fdf4 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/DownloadMediaItemUiModelMapper.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/DownloadMediaUiModelMapper.kt @@ -16,26 +16,26 @@ package com.google.android.horologist.mediasample.ui.entity -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.ui.state.mapper.MediaItemUiModelMapper -import com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.ui.state.mapper.MediaUiModelMapper +import com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel import com.google.android.horologist.mediasample.domain.model.PlaylistDownload -object DownloadMediaItemUiModelMapper { +object DownloadMediaUiModelMapper { fun map( - mediaItem: MediaItem, + media: Media, status: PlaylistDownload.Status - ): DownloadMediaItemUiModel = when (status) { + ): DownloadMediaUiModel = when (status) { PlaylistDownload.Status.Idle, PlaylistDownload.Status.InProgress -> { - DownloadMediaItemUiModel.Unavailable(MediaItemUiModelMapper.map(mediaItem)) + DownloadMediaUiModel.Unavailable(MediaUiModelMapper.map(media)) } PlaylistDownload.Status.Completed -> { - DownloadMediaItemUiModel.Available(MediaItemUiModelMapper.map(mediaItem)) + DownloadMediaUiModel.Available(MediaUiModelMapper.map(media)) } } - fun map(list: List>): List = + fun map(list: List>): List = list.map { map(it.first, it.second) } } diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreen.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreen.kt index 4bbb1562be..9a20d19c99 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreen.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreen.kt @@ -22,13 +22,13 @@ import androidx.compose.ui.focus.FocusRequester import androidx.wear.compose.material.ScalingLazyListState import com.google.android.horologist.compose.layout.StateUtils import com.google.android.horologist.media.ui.screens.entity.EntityScreen -import com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel +import com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel import com.google.android.horologist.media.ui.state.model.PlaylistUiModel @Composable fun UampEntityScreen( uampEntityScreenViewModel: UampEntityScreenViewModel, - onDownloadItemClick: (DownloadMediaItemUiModel) -> Unit, + onDownloadItemClick: (DownloadMediaUiModel) -> Unit, onShuffleClick: (PlaylistUiModel) -> Unit, onPlayClick: (PlaylistUiModel) -> Unit, focusRequester: FocusRequester, diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreenViewModel.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreenViewModel.kt index 639b2431ad..810d7173b7 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreenViewModel.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/entity/UampEntityScreenViewModel.kt @@ -58,7 +58,7 @@ class UampEntityScreenViewModel @Inject constructor( .map { EntityScreenState.Loaded( playlistUiModel = PlaylistUiModelMapper.map(it.playlist), - downloadList = DownloadMediaItemUiModelMapper.map(it.mediaList), + downloadList = DownloadMediaUiModelMapper.map(it.mediaList), downloading = it.mediaList.any { (_, status) -> status == PlaylistDownload.Status.InProgress }, ) } @@ -83,7 +83,7 @@ class UampEntityScreenViewModel @Inject constructor( playlist.value?.let { playerRepository.setShuffleModeEnabled(shuffled) - playerRepository.setMediaItems(it.mediaItems) + playerRepository.setMediaList(it.mediaList) playerRepository.prepare() playerRepository.play() } diff --git a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/player/UampMediaPlayerScreen.kt b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/player/UampMediaPlayerScreen.kt index 61efb2d33d..4c0dbea7fd 100644 --- a/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/player/UampMediaPlayerScreen.kt +++ b/media-sample/src/main/java/com/google/android/horologist/mediasample/ui/player/UampMediaPlayerScreen.kt @@ -85,9 +85,9 @@ fun UampMediaPlayerScreen( onPauseButtonClick = { mediaPlayerScreenViewModel.pause() }, playPauseButtonEnabled = it.playPauseEnabled, playing = it.playing, - onSeekToPreviousButtonClick = { mediaPlayerScreenViewModel.skipToPreviousMediaItem() }, + onSeekToPreviousButtonClick = { mediaPlayerScreenViewModel.skipToPreviousMedia() }, seekToPreviousButtonEnabled = it.seekToPreviousEnabled, - onSeekToNextButtonClick = { mediaPlayerScreenViewModel.skipToNextMediaItem() }, + onSeekToNextButtonClick = { mediaPlayerScreenViewModel.skipToNextMedia() }, seekToNextButtonEnabled = it.seekToNextEnabled, percent = it.trackPosition?.percent ?: 0f, ) @@ -98,7 +98,7 @@ fun UampMediaPlayerScreen( }, background = { if (settingsState?.artworkGradient == true) { - val artworkUri = it.mediaItem?.artworkUri + val artworkUri = it.media?.artworkUri ArtworkColorBackground( artworkUri = artworkUri, defaultColor = MaterialTheme.colors.primary diff --git a/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/MediaItemMapperTest.kt b/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/MediaMapperTest.kt similarity index 96% rename from media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/MediaItemMapperTest.kt rename to media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/MediaMapperTest.kt index 03166d6423..d021f386a6 100644 --- a/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/MediaItemMapperTest.kt +++ b/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/MediaMapperTest.kt @@ -20,7 +20,7 @@ import com.google.android.horologist.mediasample.data.api.model.MusicApiModel import com.google.common.truth.Truth.assertThat import org.junit.Test -class MediaItemMapperTest { +class MediaMapperTest { @Test fun givenMusicApiModel_thenMapsCorrectly() { @@ -46,7 +46,7 @@ class MediaItemMapperTest { ) // when - val result = MediaItemMapper.map(musicApiModel) + val result = MediaMapper.map(musicApiModel) // then assertThat(result.id).isEqualTo(id) @@ -91,7 +91,7 @@ class MediaItemMapperTest { val list = listOf(musicApiModel1, musicApiModel2) // when - val result = MediaItemMapper.map(list) + val result = MediaMapper.map(list) // then assertThat(result).hasSize(2) diff --git a/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapperTest.kt b/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapperTest.kt index d3e8f6ae46..d469682c2a 100644 --- a/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapperTest.kt +++ b/media-sample/src/test/java/com/google/android/horologist/mediasample/data/mapper/PlaylistMapperTest.kt @@ -33,23 +33,23 @@ class PlaylistMapperTest { // then assertThat(result).hasSize(3) - assertThat(result[0].mediaItems).hasSize(1) + assertThat(result[0].mediaList).hasSize(1) assertThat(result[0].name).isEqualTo("genre1") assertThat(result[0].artworkUri).isEqualTo("image1_1") - assertThat(result[0].mediaItems[0].id).isEqualTo("id1_1") + assertThat(result[0].mediaList[0].id).isEqualTo("id1_1") - assertThat(result[1].mediaItems).hasSize(2) + assertThat(result[1].mediaList).hasSize(2) assertThat(result[1].name).isEqualTo("genre2") assertThat(result[1].artworkUri).isEqualTo("image2_1") - assertThat(result[1].mediaItems[0].id).isEqualTo("id2_1") - assertThat(result[1].mediaItems[1].id).isEqualTo("id2_2") + assertThat(result[1].mediaList[0].id).isEqualTo("id2_1") + assertThat(result[1].mediaList[1].id).isEqualTo("id2_2") - assertThat(result[2].mediaItems).hasSize(3) + assertThat(result[2].mediaList).hasSize(3) assertThat(result[2].name).isEqualTo("genre3") assertThat(result[2].artworkUri).isEqualTo("image3_1") - assertThat(result[2].mediaItems[0].id).isEqualTo("id3_1") - assertThat(result[2].mediaItems[1].id).isEqualTo("id3_2") - assertThat(result[2].mediaItems[2].id).isEqualTo("id3_3") + assertThat(result[2].mediaList[0].id).isEqualTo("id3_1") + assertThat(result[2].mediaList[1].id).isEqualTo("id3_2") + assertThat(result[2].mediaList[2].id).isEqualTo("id3_3") } private fun getCatalog(): CatalogApiModel { diff --git a/media-ui/api/current.api b/media-ui/api/current.api index 47c2a4bd33..953319da84 100644 --- a/media-ui/api/current.api +++ b/media-ui/api/current.api @@ -48,7 +48,7 @@ package com.google.android.horologist.media.ui.components { } public final class DefaultMediaDisplayKt { - method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void DefaultMediaDisplay(com.google.android.horologist.media.ui.state.model.MediaItemUiModel? mediaItem, optional androidx.compose.ui.Modifier modifier); + method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void DefaultMediaDisplay(com.google.android.horologist.media.ui.state.model.MediaUiModel? media, optional androidx.compose.ui.Modifier modifier); } public final class EntityButtonKt { @@ -64,12 +64,12 @@ package com.google.android.horologist.media.ui.components { } public final class MediaArtworkKt { - method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void MediaArtwork(com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItem, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter? placeholder); + method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void MediaArtwork(com.google.android.horologist.media.ui.state.model.MediaUiModel media, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter? placeholder); method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void MediaArtwork(Object? artworkUri, String? contentDescription, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter? placeholder); } public final class MediaChipKt { - method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void MediaChip(com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItem, kotlin.jvm.functions.Function0 onClick, optional androidx.compose.ui.Modifier modifier, optional String defaultTitle, optional androidx.compose.ui.graphics.painter.Painter? placeholder); + method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void MediaChip(com.google.android.horologist.media.ui.state.model.MediaUiModel media, kotlin.jvm.functions.Function0 onClick, optional androidx.compose.ui.Modifier modifier, optional String defaultTitle, optional androidx.compose.ui.graphics.painter.Painter? placeholder); method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void MediaChip(String title, Object? artworkUri, kotlin.jvm.functions.Function0 onClick, optional androidx.compose.ui.Modifier modifier, optional androidx.compose.ui.graphics.painter.Painter? placeholder); } @@ -343,22 +343,22 @@ package com.google.android.horologist.media.ui.screens.browse { package com.google.android.horologist.media.ui.screens.entity { public final class EntityScreenKt { - method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void EntityScreen(com.google.android.horologist.media.ui.screens.entity.EntityScreenState entityScreenState, kotlin.jvm.functions.Function1 onDownloadClick, kotlin.jvm.functions.Function1 onDownloadItemClick, kotlin.jvm.functions.Function1 onShuffleClick, kotlin.jvm.functions.Function1 onPlayClick, androidx.compose.ui.focus.FocusRequester focusRequester, androidx.wear.compose.material.ScalingLazyListState scalingLazyListState, optional androidx.compose.ui.Modifier modifier, optional String defaultMediaTitle, optional androidx.compose.ui.graphics.painter.Painter? downloadItemArtworkPlaceholder); + method @androidx.compose.runtime.Composable @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public static void EntityScreen(com.google.android.horologist.media.ui.screens.entity.EntityScreenState entityScreenState, kotlin.jvm.functions.Function1 onDownloadClick, kotlin.jvm.functions.Function1 onDownloadItemClick, kotlin.jvm.functions.Function1 onShuffleClick, kotlin.jvm.functions.Function1 onPlayClick, androidx.compose.ui.focus.FocusRequester focusRequester, androidx.wear.compose.material.ScalingLazyListState scalingLazyListState, optional androidx.compose.ui.Modifier modifier, optional String defaultMediaTitle, optional androidx.compose.ui.graphics.painter.Painter? downloadItemArtworkPlaceholder); } @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public abstract sealed class EntityScreenState { } public static final class EntityScreenState.Loaded extends com.google.android.horologist.media.ui.screens.entity.EntityScreenState { - ctor public EntityScreenState.Loaded(com.google.android.horologist.media.ui.state.model.PlaylistUiModel playlistUiModel, java.util.List downloadList, optional boolean downloading); + ctor public EntityScreenState.Loaded(com.google.android.horologist.media.ui.state.model.PlaylistUiModel playlistUiModel, java.util.List downloadList, optional boolean downloading); method public com.google.android.horologist.media.ui.state.model.PlaylistUiModel component1(); - method public java.util.List component2(); + method public java.util.List component2(); method public boolean component3(); - method public com.google.android.horologist.media.ui.screens.entity.EntityScreenState.Loaded copy(com.google.android.horologist.media.ui.state.model.PlaylistUiModel playlistUiModel, java.util.List downloadList, boolean downloading); - method public java.util.List getDownloadList(); + method public com.google.android.horologist.media.ui.screens.entity.EntityScreenState.Loaded copy(com.google.android.horologist.media.ui.state.model.PlaylistUiModel playlistUiModel, java.util.List downloadList, boolean downloading); + method public java.util.List getDownloadList(); method public boolean getDownloading(); method public com.google.android.horologist.media.ui.state.model.PlaylistUiModel getPlaylistUiModel(); - property public final java.util.List downloadList; + property public final java.util.List downloadList; property public final boolean downloading; property public final com.google.android.horologist.media.ui.state.model.PlaylistUiModel playlistUiModel; } @@ -461,10 +461,10 @@ package com.google.android.horologist.media.ui.snackbar { package com.google.android.horologist.media.ui.state { @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class PlayerUiState { - ctor public PlayerUiState(boolean playEnabled, boolean pauseEnabled, boolean seekBackEnabled, boolean seekForwardEnabled, boolean seekToPreviousEnabled, boolean seekToNextEnabled, boolean shuffleEnabled, boolean shuffleOn, boolean playPauseEnabled, boolean playing, com.google.android.horologist.media.ui.state.model.MediaItemUiModel? mediaItem, com.google.android.horologist.media.ui.state.model.TrackPositionUiModel? trackPosition, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekBackButtonIncrement, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekForwardButtonIncrement, boolean connected); + ctor public PlayerUiState(boolean playEnabled, boolean pauseEnabled, boolean seekBackEnabled, boolean seekForwardEnabled, boolean seekToPreviousEnabled, boolean seekToNextEnabled, boolean shuffleEnabled, boolean shuffleOn, boolean playPauseEnabled, boolean playing, com.google.android.horologist.media.ui.state.model.MediaUiModel? media, com.google.android.horologist.media.ui.state.model.TrackPositionUiModel? trackPosition, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekBackButtonIncrement, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekForwardButtonIncrement, boolean connected); method public boolean component1(); method public boolean component10(); - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel? component11(); + method public com.google.android.horologist.media.ui.state.model.MediaUiModel? component11(); method public com.google.android.horologist.media.ui.state.model.TrackPositionUiModel? component12(); method public com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement component13(); method public com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement component14(); @@ -477,9 +477,9 @@ package com.google.android.horologist.media.ui.state { method public boolean component7(); method public boolean component8(); method public boolean component9(); - method public com.google.android.horologist.media.ui.state.PlayerUiState copy(boolean playEnabled, boolean pauseEnabled, boolean seekBackEnabled, boolean seekForwardEnabled, boolean seekToPreviousEnabled, boolean seekToNextEnabled, boolean shuffleEnabled, boolean shuffleOn, boolean playPauseEnabled, boolean playing, com.google.android.horologist.media.ui.state.model.MediaItemUiModel? mediaItem, com.google.android.horologist.media.ui.state.model.TrackPositionUiModel? trackPosition, com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekBackButtonIncrement, com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekForwardButtonIncrement, boolean connected); + method public com.google.android.horologist.media.ui.state.PlayerUiState copy(boolean playEnabled, boolean pauseEnabled, boolean seekBackEnabled, boolean seekForwardEnabled, boolean seekToPreviousEnabled, boolean seekToNextEnabled, boolean shuffleEnabled, boolean shuffleOn, boolean playPauseEnabled, boolean playing, com.google.android.horologist.media.ui.state.model.MediaUiModel? media, com.google.android.horologist.media.ui.state.model.TrackPositionUiModel? trackPosition, com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekBackButtonIncrement, com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekForwardButtonIncrement, boolean connected); method public boolean getConnected(); - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel? getMediaItem(); + method public com.google.android.horologist.media.ui.state.model.MediaUiModel? getMedia(); method public boolean getPauseEnabled(); method public boolean getPlayEnabled(); method public boolean getPlayPauseEnabled(); @@ -494,7 +494,7 @@ package com.google.android.horologist.media.ui.state { method public boolean getShuffleOn(); method public com.google.android.horologist.media.ui.state.model.TrackPositionUiModel? getTrackPosition(); property public final boolean connected; - property public final com.google.android.horologist.media.ui.state.model.MediaItemUiModel? mediaItem; + property public final com.google.android.horologist.media.ui.state.model.MediaUiModel? media; property public final boolean pauseEnabled; property public final boolean playEnabled; property public final boolean playPauseEnabled; @@ -517,8 +517,8 @@ package com.google.android.horologist.media.ui.state { method public final void play(); method public final void seekBack(); method public final void seekForward(); - method public final void skipToNextMediaItem(); - method public final void skipToPreviousMediaItem(); + method public final void skipToNextMedia(); + method public final void skipToPreviousMedia(); property public final kotlinx.coroutines.flow.StateFlow playerUiState; field public static final com.google.android.horologist.media.ui.state.PlayerViewModel.Companion Companion; } @@ -530,18 +530,18 @@ package com.google.android.horologist.media.ui.state { package com.google.android.horologist.media.ui.state.mapper { - @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class MediaItemUiModelMapper { - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel map(com.google.android.horologist.media.model.MediaItem mediaItem); - field public static final com.google.android.horologist.media.ui.state.mapper.MediaItemUiModelMapper INSTANCE; + @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class MediaUiModelMapper { + method public com.google.android.horologist.media.ui.state.model.MediaUiModel map(com.google.android.horologist.media.model.Media media); + field public static final com.google.android.horologist.media.ui.state.mapper.MediaUiModelMapper INSTANCE; } @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class PlayerUiStateMapper { - method public com.google.android.horologist.media.ui.state.PlayerUiState map(com.google.android.horologist.media.model.PlayerState currentState, java.util.Set availableCommands, com.google.android.horologist.media.model.MediaItem? mediaItem, com.google.android.horologist.media.model.MediaItemPosition? mediaItemPosition, boolean shuffleModeEnabled, boolean connected, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekBackButtonIncrement, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekForwardButtonIncrement); + method public com.google.android.horologist.media.ui.state.PlayerUiState map(com.google.android.horologist.media.model.PlayerState currentState, java.util.Set availableCommands, com.google.android.horologist.media.model.Media? media, com.google.android.horologist.media.model.MediaPosition? mediaPosition, boolean shuffleModeEnabled, boolean connected, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekBackButtonIncrement, optional com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement seekForwardButtonIncrement); field public static final com.google.android.horologist.media.ui.state.mapper.PlayerUiStateMapper INSTANCE; } @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class TrackPositionUiModelMapper { - method public com.google.android.horologist.media.ui.state.model.TrackPositionUiModel map(com.google.android.horologist.media.model.MediaItemPosition mediaItemPosition); + method public com.google.android.horologist.media.ui.state.model.TrackPositionUiModel map(com.google.android.horologist.media.model.MediaPosition mediaPosition); field public static final com.google.android.horologist.media.ui.state.mapper.TrackPositionUiModelMapper INSTANCE; } @@ -549,23 +549,23 @@ package com.google.android.horologist.media.ui.state.mapper { package com.google.android.horologist.media.ui.state.model { - @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public abstract sealed class DownloadMediaItemUiModel { - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel getMediaItemUiModel(); - property public com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel; + @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public abstract sealed class DownloadMediaUiModel { + method public com.google.android.horologist.media.ui.state.model.MediaUiModel getMediaUiModel(); + property public com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel; } - public static final class DownloadMediaItemUiModel.Available extends com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel { - ctor public DownloadMediaItemUiModel.Available(com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel); - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel component1(); - method public com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel.Available copy(com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel); - property public com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel; + public static final class DownloadMediaUiModel.Available extends com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel { + ctor public DownloadMediaUiModel.Available(com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel); + method public com.google.android.horologist.media.ui.state.model.MediaUiModel component1(); + method public com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel.Available copy(com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel); + property public com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel; } - public static final class DownloadMediaItemUiModel.Unavailable extends com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel { - ctor public DownloadMediaItemUiModel.Unavailable(com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel); - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel component1(); - method public com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel.Unavailable copy(com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel); - property public com.google.android.horologist.media.ui.state.model.MediaItemUiModel mediaItemUiModel; + public static final class DownloadMediaUiModel.Unavailable extends com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel { + ctor public DownloadMediaUiModel.Unavailable(com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel); + method public com.google.android.horologist.media.ui.state.model.MediaUiModel component1(); + method public com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel.Unavailable copy(com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel); + property public com.google.android.horologist.media.ui.state.model.MediaUiModel mediaUiModel; } @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public abstract sealed class DownloadPlaylistUiModel { @@ -590,13 +590,13 @@ package com.google.android.horologist.media.ui.state.model { property public com.google.android.horologist.media.ui.state.model.PlaylistUiModel playlistUiModel; } - @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class MediaItemUiModel { - ctor public MediaItemUiModel(String id, optional String? title, optional String? artist, optional String? artworkUri); + @com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi public final class MediaUiModel { + ctor public MediaUiModel(String id, optional String? title, optional String? artist, optional String? artworkUri); method public String component1(); method public String? component2(); method public String? component3(); method public String? component4(); - method public com.google.android.horologist.media.ui.state.model.MediaItemUiModel copy(String id, String? title, String? artist, String? artworkUri); + method public com.google.android.horologist.media.ui.state.model.MediaUiModel copy(String id, String? title, String? artist, String? artworkUri); method public String? getArtist(); method public String? getArtworkUri(); method public String getId(); diff --git a/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt index e2c92be00e..d12385bca4 100644 --- a/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt +++ b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt @@ -21,7 +21,7 @@ package com.google.android.horologist.media.ui.components import androidx.compose.ui.test.junit4.createComposeRule import androidx.compose.ui.test.onNodeWithText import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import org.junit.Rule import org.junit.Test @@ -37,7 +37,7 @@ class MediaChipTest { composeTestRule.setContent { MediaChip( - mediaItem = MediaItemUiModel(id = "id", title = title), + media = MediaUiModel(id = "id", title = title), onClick = { }, ) } @@ -53,7 +53,7 @@ class MediaChipTest { composeTestRule.setContent { MediaChip( - mediaItem = MediaItemUiModel(id = "id"), + media = MediaUiModel(id = "id"), onClick = { }, defaultTitle = defaultTitle ) diff --git a/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/screens/PlayerScreenTest.kt b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/screens/PlayerScreenTest.kt index 0d9d5ac38c..e6229076dd 100644 --- a/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/screens/PlayerScreenTest.kt +++ b/media-ui/src/androidTest/java/com/google/android/horologist/media/ui/screens/PlayerScreenTest.kt @@ -31,7 +31,7 @@ import androidx.test.filters.FlakyTest import androidx.test.filters.LargeTest import androidx.wear.compose.material.Text import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.media.model.PlayerState import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.android.horologist.media.ui.state.PlayerViewModel @@ -133,18 +133,18 @@ class PlayerScreenTest { } @Test - fun givenMediaItemList_whenSeekToPreviousIsClicked_thenPreviousItemIsPlaying() { + fun givenMediaList_whenSeekToPreviousIsClicked_thenPreviousItemIsPlaying() { // given val playerRepository = FakePlayerRepository() - val mediaItem1 = MediaItem(id = "", uri = "", title = "", artist = "") - val mediaItem2 = MediaItem(id = "", uri = "", title = "", artist = "") - playerRepository.setMediaItems(listOf(mediaItem1, mediaItem2)) + val media1 = Media(id = "", uri = "", title = "", artist = "") + val media2 = Media(id = "", uri = "", title = "", artist = "") + playerRepository.setMediaList(listOf(media1, media2)) playerRepository.play(1) val playerViewModel = PlayerViewModel(playerRepository) - assertThat(playerRepository.currentMediaItem.value).isEqualTo(mediaItem2) + assertThat(playerRepository.currentMedia.value).isEqualTo(media2) composeTestRule.setContent { PlayerScreen(playerViewModel = playerViewModel) } @@ -154,23 +154,23 @@ class PlayerScreenTest { // then composeTestRule.waitUntil(timeoutMillis = 1_000) { - playerRepository.currentMediaItem.value == mediaItem1 + playerRepository.currentMedia.value == media1 } } @Test - fun givenMediaItemList_whenSeekToNextIsClicked_thenNextItemIsPlaying() { + fun givenMediaList_whenSeekToNextIsClicked_thenNextItemIsPlaying() { // given val playerRepository = FakePlayerRepository() - val mediaItem1 = MediaItem(id = "", uri = "", title = "", artist = "") - val mediaItem2 = MediaItem(id = "", uri = "", title = "", artist = "") - playerRepository.setMediaItems(listOf(mediaItem1, mediaItem2)) + val media1 = Media(id = "", uri = "", title = "", artist = "") + val media2 = Media(id = "", uri = "", title = "", artist = "") + playerRepository.setMediaList(listOf(media1, media2)) playerRepository.play(0) val playerViewModel = PlayerViewModel(playerRepository) - assertThat(playerRepository.currentMediaItem.value).isEqualTo(mediaItem1) + assertThat(playerRepository.currentMedia.value).isEqualTo(media1) composeTestRule.setContent { PlayerScreen(playerViewModel = playerViewModel) } @@ -180,7 +180,7 @@ class PlayerScreenTest { // then composeTestRule.waitUntil(timeoutMillis = 1_000) { - playerRepository.currentMediaItem.value == mediaItem2 + playerRepository.currentMedia.value == media2 } } @@ -230,7 +230,7 @@ class PlayerScreenTest { } @Test - fun whenSeekToPreviousMediaItemCommandBecomesAvailable_thenSeekToPreviousButtonGetsEnabled() { + fun whenSeekToPreviousMediaCommandBecomesAvailable_thenSeekToPreviousButtonGetsEnabled() { // given val playerRepository = FakePlayerRepository() val playerViewModel = PlayerViewModel(playerRepository) @@ -243,14 +243,14 @@ class PlayerScreenTest { button.assertIsNotEnabled() // when - playerRepository.addCommand(Command.SkipToPreviousMediaItem) + playerRepository.addCommand(Command.SkipToPreviousMedia) // then button.assertIsEnabled() } @Test - fun whenSeekToNextMediaItemCommandBecomesAvailable_thenSeekToNextButtonGetsEnabled() { + fun whenSeekToNextMediaCommandBecomesAvailable_thenSeekToNextButtonGetsEnabled() { // given val playerRepository = FakePlayerRepository() val playerViewModel = PlayerViewModel(playerRepository) @@ -263,20 +263,20 @@ class PlayerScreenTest { button.assertIsNotEnabled() // when - playerRepository.addCommand(Command.SkipToNextMediaItem) + playerRepository.addCommand(Command.SkipToNextMedia) // then button.assertIsEnabled() } @Test - fun givenMediaItem_thenCorrectTitleAndArtistAndIsDisplayed() { + fun givenMedia_thenCorrectTitleAndArtistAndIsDisplayed() { // given val playerRepository = FakePlayerRepository() val artist = "artist" val title = "title" - val mediaItem = MediaItem(id = "", uri = "", title = title, artist = artist) - playerRepository.setMediaItem(mediaItem) + val media = Media(id = "", uri = "", title = title, artist = artist) + playerRepository.setMedia(media) playerRepository.play() val playerViewModel = PlayerViewModel(playerRepository) @@ -294,8 +294,8 @@ class PlayerScreenTest { val playerRepository = FakePlayerRepository() val artist = "artist" val title = "title" - val mediaItem = MediaItem(id = "", uri = "", title = title, artist = artist) - playerRepository.setMediaItem(mediaItem) + val media = Media(id = "", uri = "", title = title, artist = artist) + playerRepository.setMedia(media) playerRepository.play() val playerViewModel = PlayerViewModel(playerRepository) diff --git a/media-ui/src/androidTest/java/com/google/android/horologist/test/toolbox/testdoubles/FakePlayerRepository.kt b/media-ui/src/androidTest/java/com/google/android/horologist/test/toolbox/testdoubles/FakePlayerRepository.kt index a4e38e951a..ff8c2cab93 100644 --- a/media-ui/src/androidTest/java/com/google/android/horologist/test/toolbox/testdoubles/FakePlayerRepository.kt +++ b/media-ui/src/androidTest/java/com/google/android/horologist/test/toolbox/testdoubles/FakePlayerRepository.kt @@ -20,8 +20,8 @@ package com.google.android.horologist.test.toolbox.testdoubles import com.google.android.horologist.media.ExperimentalHorologistMediaApi import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import com.google.android.horologist.media.repository.PlayerRepository import kotlinx.coroutines.flow.MutableStateFlow @@ -40,16 +40,16 @@ class FakePlayerRepository : PlayerRepository { private var _currentState = MutableStateFlow(PlayerState.Idle) override val currentState: StateFlow = _currentState - private var _currentMediaItem: MutableStateFlow = MutableStateFlow(null) - override val currentMediaItem: StateFlow = _currentMediaItem + private var _currentMedia: MutableStateFlow = MutableStateFlow(null) + override val currentMedia: StateFlow = _currentMedia - private var _mediaItemPosition: MutableStateFlow = MutableStateFlow(null) - override val mediaItemPosition: StateFlow = _mediaItemPosition + private var _mediaPosition: MutableStateFlow = MutableStateFlow(null) + override val mediaPosition: StateFlow = _mediaPosition private var _shuffleModeEnabled = MutableStateFlow(false) override val shuffleModeEnabled: StateFlow = _shuffleModeEnabled - private var _mediaItems: List? = null + private var _mediaList: List? = null private var currentItemIndex = -1 override fun prepare() { @@ -60,8 +60,8 @@ class FakePlayerRepository : PlayerRepository { _currentState.value = PlayerState.Playing } - override fun play(mediaItemIndex: Int) { - currentItemIndex = mediaItemIndex + override fun play(mediaIndex: Int) { + currentItemIndex = mediaIndex _currentState.value = PlayerState.Playing } @@ -69,21 +69,21 @@ class FakePlayerRepository : PlayerRepository { _currentState.value = PlayerState.Ready } - override fun hasPreviousMediaItem(): Boolean = currentItemIndex > 0 + override fun hasPreviousMedia(): Boolean = currentItemIndex > 0 - override fun skipToPreviousMediaItem() { + override fun skipToPreviousMedia() { currentItemIndex-- - _currentMediaItem.value = _mediaItems!![currentItemIndex] + _currentMedia.value = _mediaList!![currentItemIndex] } - override fun hasNextMediaItem(): Boolean = - _mediaItems?.let { + override fun hasNextMedia(): Boolean = + _mediaList?.let { currentItemIndex < it.size - 2 } ?: false - override fun skipToNextMediaItem() { + override fun skipToNextMedia() { currentItemIndex++ - _currentMediaItem.value = _mediaItems!![currentItemIndex] + _currentMedia.value = _mediaList!![currentItemIndex] } override fun getSeekBackIncrement(): Duration = 0.seconds // not implemented @@ -102,52 +102,52 @@ class FakePlayerRepository : PlayerRepository { // do nothing } - override fun setMediaItem(mediaItem: MediaItem) { - _currentMediaItem.value = mediaItem + override fun setMedia(media: Media) { + _currentMedia.value = media currentItemIndex = 0 } - override fun setMediaItems(mediaItems: List) { - _mediaItems = mediaItems + override fun setMediaList(mediaList: List) { + _mediaList = mediaList currentItemIndex = 0 - _currentMediaItem.value = mediaItems[currentItemIndex] + _currentMedia.value = mediaList[currentItemIndex] } - override fun addMediaItem(mediaItem: MediaItem) { + override fun addMedia(media: Media) { // do nothing } - override fun addMediaItem(index: Int, mediaItem: MediaItem) { + override fun addMedia(index: Int, media: Media) { // do nothing } - override fun removeMediaItem(index: Int) { + override fun removeMedia(index: Int) { // do nothing } - override fun clearMediaItems() { + override fun clearMediaList() { // do nothing } - override fun getMediaItemCount(): Int = _mediaItems?.size ?: 0 + override fun getMediaCount(): Int = _mediaList?.size ?: 0 - override fun getMediaItemAt(index: Int): MediaItem? = null // not implemented + override fun getMediaAt(index: Int): Media? = null // not implemented - override fun getCurrentMediaItemIndex(): Int = 0 // not implemented + override fun getCurrentMediaIndex(): Int = 0 // not implemented override fun release() { _connected.value = false } fun updatePosition() { - _mediaItemPosition.value = _mediaItemPosition.value?.let { + _mediaPosition.value = _mediaPosition.value?.let { val newCurrent = it.current + 1.seconds - if (it is MediaItemPosition.KnownDuration) { - MediaItemPosition.create(newCurrent, it.duration) + if (it is MediaPosition.KnownDuration) { + MediaPosition.create(newCurrent, it.duration) } else { - MediaItemPosition.UnknownDuration(newCurrent) + MediaPosition.UnknownDuration(newCurrent) } - } ?: MediaItemPosition.create(1.seconds, 10.seconds) + } ?: MediaPosition.create(1.seconds, 10.seconds) } fun addCommand(command: Command) { diff --git a/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplayPreview.kt b/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplayPreview.kt index 889a24d621..8756a9fa47 100644 --- a/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplayPreview.kt +++ b/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplayPreview.kt @@ -22,13 +22,13 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.tooling.preview.Preview import com.google.android.horologist.compose.tools.WearPreview import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel @WearPreview @Composable fun DefaultMediaDisplayPreview() { DefaultMediaDisplay( - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "id", title = "Song title", artist = "Artist name" @@ -44,7 +44,7 @@ fun DefaultMediaDisplayPreview() { @Composable fun DefaultMediaDisplayPreviewLongText() { DefaultMediaDisplay( - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "id", title = "I Predict That You Look Good In A Riot", artist = "Arctic Monkeys feat Kaiser Chiefs" diff --git a/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaArtworkPreview.kt b/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaArtworkPreview.kt index 69bf8c30bf..647c7e85af 100644 --- a/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaArtworkPreview.kt +++ b/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaArtworkPreview.kt @@ -24,7 +24,7 @@ import androidx.compose.runtime.Composable import androidx.compose.ui.graphics.vector.rememberVectorPainter import androidx.compose.ui.tooling.preview.Preview import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel @Preview( backgroundColor = 0x00000000, @@ -33,7 +33,7 @@ import com.google.android.horologist.media.ui.state.model.MediaItemUiModel @Composable fun MediaArtworkPreview() { MediaArtwork( - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "id", title = "title", artworkUri = "artworkUri", diff --git a/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaChipPreview.kt b/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaChipPreview.kt index 6d91c5a897..9cce276936 100644 --- a/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaChipPreview.kt +++ b/media-ui/src/debug/java/com/google/android/horologist/media/ui/components/MediaChipPreview.kt @@ -25,14 +25,14 @@ import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview import com.google.android.horologist.compose.tools.WearPreview import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.utils.rememberVectorPainter @WearPreview @Composable fun MediaChipPreview() { MediaChip( - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "id", title = "Red Hot Chilli Peppers", artworkUri = "artworkUri" @@ -53,7 +53,7 @@ fun MediaChipPreview() { @Composable fun MediaChipPreviewNoArtwork() { MediaChip( - mediaItem = MediaItemUiModel(id = "id", title = "Red Hot Chilli Peppers"), + media = MediaUiModel(id = "id", title = "Red Hot Chilli Peppers"), onClick = {}, placeholder = rememberVectorPainter( image = Icons.Default.Album, @@ -70,7 +70,7 @@ fun MediaChipPreviewNoArtwork() { @Composable fun MediaChipPreviewNoTitle() { MediaChip( - mediaItem = MediaItemUiModel(id = "id", artworkUri = "artworkUri"), + media = MediaUiModel(id = "id", artworkUri = "artworkUri"), onClick = {}, defaultTitle = "No title", placeholder = rememberVectorPainter( @@ -88,7 +88,7 @@ fun MediaChipPreviewNoTitle() { @Composable fun MediaChipPreviewVeryLongTitle() { MediaChip( - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "id", title = "Very very very very very very very very very very very very very very very very very very very long title", artworkUri = "artworkUri" diff --git a/media-ui/src/debug/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenPreview.kt b/media-ui/src/debug/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenPreview.kt index d1161b5d32..1ed57c7e79 100644 --- a/media-ui/src/debug/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenPreview.kt +++ b/media-ui/src/debug/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenPreview.kt @@ -26,8 +26,8 @@ import androidx.compose.ui.graphics.Color import androidx.wear.compose.material.rememberScalingLazyListState import com.google.android.horologist.compose.tools.WearPreviewDevices import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.PlaylistUiModel import com.google.android.horologist.media.ui.utils.rememberVectorPainter @@ -156,16 +156,16 @@ fun EntityScreenPreviewLoadedFullyDownloaded() { } private val unavailableDownloads = listOf( - DownloadMediaItemUiModel.Unavailable( - MediaItemUiModel( + DownloadMediaUiModel.Unavailable( + MediaUiModel( id = "id", title = "Song name", artist = "Artist name", artworkUri = "artworkUri", ) ), - DownloadMediaItemUiModel.Unavailable( - MediaItemUiModel( + DownloadMediaUiModel.Unavailable( + MediaUiModel( id = "id 2", title = "Song name 2", artist = "Artist name 2", @@ -180,16 +180,16 @@ private val playlistUiModel = PlaylistUiModel( ) private val mixedDownloads = listOf( - DownloadMediaItemUiModel.Available( - MediaItemUiModel( + DownloadMediaUiModel.Available( + MediaUiModel( id = "id", title = "Song name", artist = "Artist name", artworkUri = "artworkUri", ) ), - DownloadMediaItemUiModel.Unavailable( - MediaItemUiModel( + DownloadMediaUiModel.Unavailable( + MediaUiModel( id = "id 2", title = "Song name 2", artist = "Artist name 2", @@ -199,16 +199,16 @@ private val mixedDownloads = listOf( ) private val availableDownloads = listOf( - DownloadMediaItemUiModel.Available( - MediaItemUiModel( + DownloadMediaUiModel.Available( + MediaUiModel( id = "id", title = "Song name", artist = "Artist name", artworkUri = "artworkUri", ) ), - DownloadMediaItemUiModel.Available( - MediaItemUiModel( + DownloadMediaUiModel.Available( + MediaUiModel( id = "id 2", title = "Song name 2", artist = "Artist name 2", diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplay.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplay.kt index 725e378f39..78af69d796 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplay.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/components/DefaultMediaDisplay.kt @@ -19,20 +19,20 @@ package com.google.android.horologist.media.ui.components import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel /** - * A simple text only display of [MediaItemUiModel] showing artist and title in two separated rows. + * A simple text only display of [MediaUiModel] showing artist and title in two separated rows. */ @ExperimentalHorologistMediaUiApi @Composable public fun DefaultMediaDisplay( - mediaItem: MediaItemUiModel?, + media: MediaUiModel?, modifier: Modifier = Modifier, ) { TextMediaDisplay( modifier = modifier, - title = mediaItem?.title, - artist = mediaItem?.artist + title = media?.title, + artist = media?.artist ) } diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaArtwork.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaArtwork.kt index bd205ab889..b5878d3f1a 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaArtwork.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaArtwork.kt @@ -23,18 +23,18 @@ import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.ContentScale import coil.compose.rememberAsyncImagePainter import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel @ExperimentalHorologistMediaUiApi @Composable public fun MediaArtwork( - mediaItem: MediaItemUiModel, + media: MediaUiModel, modifier: Modifier = Modifier, placeholder: Painter? = null, ) { MediaArtwork( - artworkUri = mediaItem.artworkUri, - contentDescription = mediaItem.title, + artworkUri = media.artworkUri, + contentDescription = media.title, modifier = modifier, placeholder = placeholder ) diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaChip.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaChip.kt index 39ba38c521..4c9aabea32 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaChip.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/components/MediaChip.kt @@ -29,30 +29,30 @@ import androidx.wear.compose.material.Chip import androidx.wear.compose.material.ChipDefaults import androidx.wear.compose.material.Text import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel /** - * A rounded chip to show a single [MediaItemUiModel]. + * A rounded chip to show a single [MediaUiModel]. * - * @param mediaItem The [MediaItemUiModel] that the [title][MediaItemUiModel.title] and - * [artwork][MediaItemUiModel.artworkUri] will be used to display on the chip. + * @param media The [MediaUiModel] that the [title][MediaUiModel.title] and + * [artwork][MediaUiModel.artworkUri] will be used to display on the chip. * @param onClick Will be called when the user clicks the chip. * @param modifier The Modifier to be applied to the chip. - * @param defaultTitle A text to be used when [MediaItemUiModel.title] is null. + * @param defaultTitle A text to be used when [MediaUiModel.title] is null. * @param placeholder A placeholder image to be displayed while - * [artwork][MediaItemUiModel.artworkUri] is being loaded. + * [artwork][MediaUiModel.artworkUri] is being loaded. */ @ExperimentalHorologistMediaUiApi @Composable public fun MediaChip( - mediaItem: MediaItemUiModel, + media: MediaUiModel, onClick: () -> Unit, modifier: Modifier = Modifier, defaultTitle: String = "", placeholder: Painter? = null, ) { - val artworkUri = mediaItem.artworkUri - val title = mediaItem.title + val artworkUri = media.artworkUri + val title = media.title MediaChip( title = title ?: defaultTitle, diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/navigation/MediaPlayerScaffold.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/navigation/MediaPlayerScaffold.kt index b9eec63a94..beeba7cb82 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/navigation/MediaPlayerScaffold.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/navigation/MediaPlayerScaffold.kt @@ -49,7 +49,7 @@ import com.google.android.horologist.media.ui.snackbar.SnackbarViewModel * @param playerScreen the first screen with player controls. * @param libraryScreen the long scrolling library top screen. * @param categoryEntityScreen screen to show details about a particular category. - * @param mediaEntityScreen screen to show details about a particular media item. + * @param mediaEntityScreen screen to show details about a particular media. * @param playlistsScreen screen to show user playlists. * @param deepLinkPrefix the app specific prefix for external deeplinks * @param navController the media focused navigation controller. diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/PlayerScreen.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/PlayerScreen.kt index 5fdb526472..80f9475194 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/PlayerScreen.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/PlayerScreen.kt @@ -99,12 +99,12 @@ public fun DefaultPlayerScreenMediaDisplay( playerUiState: PlayerUiState, modifier: Modifier = Modifier, ) { - val mediaItem = playerUiState.mediaItem + val media = playerUiState.media if (!playerUiState.connected) { LoadingMediaDisplay(modifier) - } else if (mediaItem != null) { + } else if (media != null) { DefaultMediaDisplay( - mediaItem = mediaItem, + media = media, modifier = modifier ) } else { @@ -130,9 +130,9 @@ public fun DefaultPlayerScreenControlButtons( onPauseButtonClick = { playerViewModel.pause() }, playPauseButtonEnabled = playerUiState.playPauseEnabled, playing = playerUiState.playing, - onSeekToPreviousButtonClick = { playerViewModel.skipToPreviousMediaItem() }, + onSeekToPreviousButtonClick = { playerViewModel.skipToPreviousMedia() }, seekToPreviousButtonEnabled = playerUiState.seekToPreviousEnabled, - onSeekToNextButtonClick = { playerViewModel.skipToNextMediaItem() }, + onSeekToNextButtonClick = { playerViewModel.skipToNextMedia() }, seekToNextButtonEnabled = playerUiState.seekToNextEnabled, showProgress = showProgress, percent = playerUiState.trackPosition?.percent ?: 0f, diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/browse/BrowseScreen.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/browse/BrowseScreen.kt index 22326a8aad..31859fe62e 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/browse/BrowseScreen.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/browse/BrowseScreen.kt @@ -44,7 +44,7 @@ import com.google.android.horologist.media.ui.state.model.DownloadPlaylistUiMode /** * A screen to: - * - display user's [downloaded media items][DownloadPlaylistUiModel]; + * - display user's [downloaded media][DownloadPlaylistUiModel] list; * - provide access to libraries; * - provide access to settings; */ diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/entity/EntityScreen.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/entity/EntityScreen.kt index e70a8012cd..b5d28575d9 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/entity/EntityScreen.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/screens/entity/EntityScreen.kt @@ -44,7 +44,7 @@ import com.google.android.horologist.media.ui.components.base.StandardButtonType import com.google.android.horologist.media.ui.components.base.StandardChip import com.google.android.horologist.media.ui.components.base.StandardChipType import com.google.android.horologist.media.ui.components.base.Title -import com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel +import com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel import com.google.android.horologist.media.ui.state.model.PlaylistUiModel @ExperimentalHorologistMediaUiApi @@ -52,7 +52,7 @@ import com.google.android.horologist.media.ui.state.model.PlaylistUiModel public fun EntityScreen( entityScreenState: EntityScreenState, onDownloadClick: (PlaylistUiModel) -> Unit, - onDownloadItemClick: (DownloadMediaItemUiModel) -> Unit, + onDownloadItemClick: (DownloadMediaUiModel) -> Unit, onShuffleClick: (PlaylistUiModel) -> Unit, onPlayClick: (PlaylistUiModel) -> Unit, focusRequester: FocusRequester, @@ -160,18 +160,18 @@ public fun EntityScreen( } items(count = entityScreenState.downloadList.size) { index -> - val downloadMediaItemUiModel = entityScreenState.downloadList[index] - val mediaItemUiModel = downloadMediaItemUiModel.mediaItemUiModel + val downloadMediaUiModel = entityScreenState.downloadList[index] + val mediaUiModel = downloadMediaUiModel.mediaUiModel StandardChip( - label = mediaItemUiModel.title ?: defaultMediaTitle, - onClick = { onDownloadItemClick(downloadMediaItemUiModel) }, - secondaryLabel = mediaItemUiModel.artist, - icon = mediaItemUiModel.artworkUri, + label = mediaUiModel.title ?: defaultMediaTitle, + onClick = { onDownloadItemClick(downloadMediaUiModel) }, + secondaryLabel = mediaUiModel.artist, + icon = mediaUiModel.artworkUri, largeIcon = true, placeholder = downloadItemArtworkPlaceholder, chipType = StandardChipType.Secondary, - enabled = downloadMediaItemUiModel is DownloadMediaItemUiModel.Available, + enabled = downloadMediaUiModel is DownloadMediaUiModel.Available, ) } } @@ -234,7 +234,7 @@ public sealed class EntityScreenState { public data class Loaded( val playlistUiModel: PlaylistUiModel, - val downloadList: List, + val downloadList: List, val downloading: Boolean = false ) : EntityScreenState() { @@ -248,8 +248,8 @@ public sealed class EntityScreenState { var fully = true downloadList.forEach { - if (it is DownloadMediaItemUiModel.Available) none = false - if (it is DownloadMediaItemUiModel.Unavailable) fully = false + if (it is DownloadMediaUiModel.Available) none = false + if (it is DownloadMediaUiModel.Unavailable) fully = false } when { diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerUiState.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerUiState.kt index 611e74663a..88475e704a 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerUiState.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerUiState.kt @@ -26,7 +26,7 @@ import com.google.android.horologist.media.ui.components.controls.SeekForwardBut import com.google.android.horologist.media.ui.components.controls.SeekToNextButton import com.google.android.horologist.media.ui.components.controls.SeekToPreviousButton import com.google.android.horologist.media.ui.components.controls.ShuffleButton -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel /** @@ -42,7 +42,7 @@ import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel * @param shuffleOn whether [ShuffleButton] should display a shuffle on icon * @param playPauseEnabled whether [PlayPauseButton] is enabled * @param playing whether [PlayPauseButton] should display the play or pause button - * @param mediaItem current [MediaItemUiModel] + * @param media current [MediaUiModel] * @param seekBackButtonIncrement increment when seeking back. * @param seekForwardButtonIncrement increment when seeking forward. * @param connected is the player screen connected. @@ -59,7 +59,7 @@ public data class PlayerUiState( val shuffleOn: Boolean, val playPauseEnabled: Boolean, val playing: Boolean, - val mediaItem: MediaItemUiModel?, + val media: MediaUiModel?, val trackPosition: TrackPositionUiModel?, val seekBackButtonIncrement: SeekButtonIncrement = SeekButtonIncrement.Unknown, val seekForwardButtonIncrement: SeekButtonIncrement = SeekButtonIncrement.Unknown, diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerViewModel.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerViewModel.kt index d7cda6551c..d26cdf4b00 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerViewModel.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/PlayerViewModel.kt @@ -22,7 +22,7 @@ import com.google.android.horologist.media.repository.PlayerRepository import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement import com.google.android.horologist.media.ui.state.mapper.PlayerUiStateMapper -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel import kotlinx.coroutines.flow.SharingStarted import kotlinx.coroutines.flow.StateFlow @@ -58,15 +58,15 @@ public open class PlayerViewModel( public val playerUiState: StateFlow = combine( playerRepository.currentState, playerRepository.availableCommands, - playerRepository.currentMediaItem, - playerRepository.mediaItemPosition, + playerRepository.currentMedia, + playerRepository.mediaPosition, staticFlow - ) { currentState, availableCommands, mediaItem, mediaItemPosition, staticData -> + ) { currentState, availableCommands, media, mediaPosition, staticData -> PlayerUiStateMapper.map( currentState = currentState, availableCommands = availableCommands, - mediaItem = mediaItem, - mediaItemPosition = mediaItemPosition, + media = media, + mediaPosition = mediaPosition, shuffleModeEnabled = staticData.shuffleModeEnabled, connected = playerRepository.connected.value, seekBackButtonIncrement = staticData.seekBackButtonIncrement, @@ -88,12 +88,12 @@ public open class PlayerViewModel( playerRepository.pause() } - public fun skipToPreviousMediaItem() { - playerRepository.skipToPreviousMediaItem() + public fun skipToPreviousMedia() { + playerRepository.skipToPreviousMedia() } - public fun skipToNextMediaItem() { - playerRepository.skipToNextMediaItem() + public fun skipToNextMedia() { + playerRepository.skipToNextMedia() } public fun seekBack() { @@ -105,7 +105,7 @@ public open class PlayerViewModel( } public companion object { - private val INITIAL_MEDIA_ITEM = MediaItemUiModel(id = "", title = null, artist = null) + private val INITIAL_MEDIA = MediaUiModel(id = "", title = null, artist = null) private val INITIAL_TRACK_POSITION = TrackPositionUiModel( current = 0, duration = 0, percent = 0f @@ -122,7 +122,7 @@ public open class PlayerViewModel( shuffleOn = false, playPauseEnabled = false, playing = false, - mediaItem = INITIAL_MEDIA_ITEM, + media = INITIAL_MEDIA, trackPosition = INITIAL_TRACK_POSITION, connected = false ) diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/MediaItemUiModelMapper.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/MediaUiModelMapper.kt similarity index 65% rename from media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/MediaItemUiModelMapper.kt rename to media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/MediaUiModelMapper.kt index 1b2fc172fd..4cf4ba6cb7 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/MediaItemUiModelMapper.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/MediaUiModelMapper.kt @@ -16,20 +16,20 @@ package com.google.android.horologist.media.ui.state.mapper -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel /** - * Map a [MediaItem] into a [MediaItemUiModel] + * Map a [Media] into a [MediaUiModel] */ @ExperimentalHorologistMediaUiApi -public object MediaItemUiModelMapper { +public object MediaUiModelMapper { - public fun map(mediaItem: MediaItem): MediaItemUiModel = MediaItemUiModel( - id = mediaItem.id, - title = mediaItem.title, - artist = mediaItem.artist, - artworkUri = mediaItem.artworkUri + public fun map(media: Media): MediaUiModel = MediaUiModel( + id = media.id, + title = media.title, + artist = media.artist, + artworkUri = media.artworkUri ) } diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapper.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapper.kt index 42084a72eb..78588a631e 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapper.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapper.kt @@ -17,8 +17,8 @@ package com.google.android.horologist.media.ui.state.mapper import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement @@ -33,8 +33,8 @@ public object PlayerUiStateMapper { public fun map( currentState: PlayerState, availableCommands: Set, - mediaItem: MediaItem?, - mediaItemPosition: MediaItemPosition?, + media: Media?, + mediaPosition: MediaPosition?, shuffleModeEnabled: Boolean, connected: Boolean, seekBackButtonIncrement: SeekButtonIncrement = SeekButtonIncrement.Unknown, @@ -47,14 +47,14 @@ public object PlayerUiStateMapper { pauseEnabled = playPauseCommandAvailable, seekBackEnabled = availableCommands.contains(Command.SeekBack), seekForwardEnabled = availableCommands.contains(Command.SeekForward), - seekToPreviousEnabled = availableCommands.contains(Command.SkipToPreviousMediaItem), - seekToNextEnabled = availableCommands.contains(Command.SkipToNextMediaItem), + seekToPreviousEnabled = availableCommands.contains(Command.SkipToPreviousMedia), + seekToNextEnabled = availableCommands.contains(Command.SkipToNextMedia), shuffleEnabled = availableCommands.contains(Command.SetShuffle), shuffleOn = shuffleModeEnabled, playPauseEnabled = playPauseCommandAvailable, playing = currentState == PlayerState.Playing, - mediaItem = mediaItem?.let(MediaItemUiModelMapper::map), - trackPosition = mediaItemPosition?.let(TrackPositionUiModelMapper::map), + media = media?.let(MediaUiModelMapper::map), + trackPosition = mediaPosition?.let(TrackPositionUiModelMapper::map), connected = connected, seekBackButtonIncrement = seekBackButtonIncrement, seekForwardButtonIncrement = seekForwardButtonIncrement diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapper.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapper.kt index 5483660f01..1494c7581d 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapper.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapper.kt @@ -16,25 +16,25 @@ package com.google.android.horologist.media.ui.state.mapper -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel /** - * Map a [MediaItemPosition] into a [TrackPositionUiModel] + * Map a [MediaPosition] into a [TrackPositionUiModel] */ @ExperimentalHorologistMediaUiApi public object TrackPositionUiModelMapper { - public fun map(mediaItemPosition: MediaItemPosition): TrackPositionUiModel { - val (duration, percent) = if (mediaItemPosition is MediaItemPosition.KnownDuration) { - mediaItemPosition.duration.inWholeMilliseconds to mediaItemPosition.percent + public fun map(mediaPosition: MediaPosition): TrackPositionUiModel { + val (duration, percent) = if (mediaPosition is MediaPosition.KnownDuration) { + mediaPosition.duration.inWholeMilliseconds to mediaPosition.percent } else { 0L to 0F } return TrackPositionUiModel( - current = mediaItemPosition.current.inWholeMilliseconds, + current = mediaPosition.current.inWholeMilliseconds, duration = duration, percent = percent ) diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/DownloadMediaItemUiModel.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/DownloadMediaUiModel.kt similarity index 71% rename from media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/DownloadMediaItemUiModel.kt rename to media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/DownloadMediaUiModel.kt index 9547d68871..4f83b448ec 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/DownloadMediaItemUiModel.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/DownloadMediaUiModel.kt @@ -19,14 +19,14 @@ package com.google.android.horologist.media.ui.state.model import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi @ExperimentalHorologistMediaUiApi -public sealed class DownloadMediaItemUiModel( - public open val mediaItemUiModel: MediaItemUiModel +public sealed class DownloadMediaUiModel( + public open val mediaUiModel: MediaUiModel ) { public data class Available( - override val mediaItemUiModel: MediaItemUiModel - ) : DownloadMediaItemUiModel(mediaItemUiModel = mediaItemUiModel) + override val mediaUiModel: MediaUiModel + ) : DownloadMediaUiModel(mediaUiModel = mediaUiModel) public data class Unavailable( - override val mediaItemUiModel: MediaItemUiModel - ) : DownloadMediaItemUiModel(mediaItemUiModel = mediaItemUiModel) + override val mediaUiModel: MediaUiModel + ) : DownloadMediaUiModel(mediaUiModel = mediaUiModel) } diff --git a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/MediaItemUiModel.kt b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/MediaUiModel.kt similarity index 96% rename from media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/MediaItemUiModel.kt rename to media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/MediaUiModel.kt index 542307a122..5595db001f 100644 --- a/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/MediaItemUiModel.kt +++ b/media-ui/src/main/java/com/google/android/horologist/media/ui/state/model/MediaUiModel.kt @@ -19,7 +19,7 @@ package com.google.android.horologist.media.ui.state.model import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi @ExperimentalHorologistMediaUiApi -public data class MediaItemUiModel( +public data class MediaUiModel( val id: String, val title: String? = null, val artist: String? = null, diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/FigmaPlayerScreenTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/FigmaPlayerScreenTest.kt index 4a457ba4d6..e78b43e1d9 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/FigmaPlayerScreenTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/FigmaPlayerScreenTest.kt @@ -32,7 +32,7 @@ import com.google.android.horologist.audio.ui.components.SettingsButtonsDefaults import com.google.android.horologist.audio.ui.components.actions.SetVolumeButton import com.google.android.horologist.audio.ui.components.actions.SettingsButton import com.google.android.horologist.media.ui.state.PlayerUiState -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel import com.google.android.horologist.media.ui.uamp.UampColors import com.google.android.horologist.paparazzi.GALAXY_WATCH4_CLASSIC_LARGE @@ -78,7 +78,7 @@ class FigmaPlayerScreenTest( shuffleOn = false, playPauseEnabled = true, playing = false, - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "", title = "Bat Out of Hell", artist = "Meat Loaf" diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerScreenTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerScreenTest.kt index d1d336c4b1..6f7d9b8338 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerScreenTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerScreenTest.kt @@ -27,7 +27,7 @@ import com.google.android.horologist.compose.tools.ExperimentalHorologistCompose import com.google.android.horologist.compose.tools.ThemeValues import com.google.android.horologist.compose.tools.themeValues import com.google.android.horologist.media.ui.state.PlayerUiState -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel import com.google.android.horologist.paparazzi.GALAXY_WATCH4_CLASSIC_LARGE import com.google.android.horologist.paparazzi.WearSnapshotHandler @@ -64,7 +64,7 @@ class MediaPlayerScreenTest( shuffleOn = false, playPauseEnabled = true, playing = true, - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "", title = "Weather with You", artist = "Crowded House" diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerStatesScreenTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerStatesScreenTest.kt index cc0bc6f518..1c56187ef4 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerStatesScreenTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerStatesScreenTest.kt @@ -25,7 +25,7 @@ import androidx.compose.ui.graphics.Color import app.cash.paparazzi.Paparazzi import com.google.android.horologist.compose.tools.ExperimentalHorologistComposeToolsApi import com.google.android.horologist.media.ui.state.PlayerUiState -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel import com.google.android.horologist.paparazzi.GALAXY_WATCH4_CLASSIC_LARGE import com.google.android.horologist.paparazzi.WearSnapshotHandler @@ -62,15 +62,15 @@ class MediaPlayerStatesScreenTest( shuffleOn = false, playPauseEnabled = state.connected, playing = state.connected, - mediaItem = if (state.mediaItem) - MediaItemUiModel( + media = if (state.media) + MediaUiModel( id = "", title = "Weather with You", artist = "Crowded House" ) else null, - trackPosition = if (state.mediaItem) + trackPosition = if (state.media) TrackPositionUiModel( current = 30, duration = 225, @@ -90,7 +90,7 @@ class MediaPlayerStatesScreenTest( data class State( val connected: Boolean, - val mediaItem: Boolean, + val media: Boolean, val name: String, ) @@ -98,8 +98,8 @@ class MediaPlayerStatesScreenTest( @JvmStatic @Parameterized.Parameters fun states() = listOf( - State(connected = true, mediaItem = false, name = "NoMediaItem"), - State(connected = false, mediaItem = false, name = "NotConnected") + State(connected = true, media = false, name = "NoMedia"), + State(connected = false, media = false, name = "NotConnected") ) } } diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerTestCase.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerTestCase.kt index 51da2f4fb6..b8c2f36cc0 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerTestCase.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/MediaPlayerTestCase.kt @@ -80,7 +80,7 @@ fun MediaPlayerTestCase( }, colors: Colors = MaterialTheme.colors, background: @Composable BoxScope.() -> Unit = { - if (playerUiState.mediaItem != null) { + if (playerUiState.media != null) { RadialBackground(color = colors.primary) } }, diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/PodcastPlayerScreenTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/PodcastPlayerScreenTest.kt index 71223c371a..2079c632aa 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/PodcastPlayerScreenTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/PodcastPlayerScreenTest.kt @@ -30,7 +30,7 @@ import com.google.android.horologist.media.ui.components.controls.SeekButtonIncr import com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement.Thirty import com.google.android.horologist.media.ui.components.controls.SeekButtonIncrement.Unknown import com.google.android.horologist.media.ui.state.PlayerUiState -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel import com.google.android.horologist.paparazzi.GALAXY_WATCH4_CLASSIC_LARGE import com.google.android.horologist.paparazzi.WearSnapshotHandler @@ -67,7 +67,7 @@ class PodcastPlayerScreenTest( shuffleOn = false, playPauseEnabled = true, playing = true, - mediaItem = MediaItemUiModel( + media = MediaUiModel( id = "", title = "The power of types", artist = "Kotlinconf" diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt index 7f79faaa3e..5083a516f3 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/components/MediaChipTest.kt @@ -47,7 +47,7 @@ class MediaChipTest { ) @Test - fun givenMediaItemWithArtwork_thenDisplaysArtwork() { + fun givenMediaWithArtwork_thenDisplaysArtwork() { paparazzi.snapshot { Box(modifier = Modifier.background(Color.Black), contentAlignment = Alignment.Center) { MediaChip( @@ -61,7 +61,7 @@ class MediaChipTest { } @Test - fun givenMediaItemWithNOArtwork_thenDoesNOTDisplayArtwork() { + fun givenMediaWithNOArtwork_thenDoesNOTDisplayArtwork() { paparazzi.snapshot { Box(modifier = Modifier.background(Color.Black), contentAlignment = Alignment.Center) { MediaChip( diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenStateTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenStateTest.kt index 2a40c97667..2729f6671b 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenStateTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/screens/entity/EntityScreenStateTest.kt @@ -19,8 +19,8 @@ package com.google.android.horologist.media.ui.screens.entity import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.DownloadMediaItemUiModel -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.DownloadMediaUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.PlaylistUiModel import com.google.common.truth.Truth.assertThat import org.junit.Test @@ -31,16 +31,16 @@ class EntityScreenStateTest { fun givenUnavailableDownloads_thenDownloadStateIsNone() { // given val downloads = listOf( - DownloadMediaItemUiModel.Unavailable( - MediaItemUiModel( + DownloadMediaUiModel.Unavailable( + MediaUiModel( id = "id", title = "Song name", artist = "Artist name", artworkUri = "artworkUri", ) ), - DownloadMediaItemUiModel.Unavailable( - MediaItemUiModel( + DownloadMediaUiModel.Unavailable( + MediaUiModel( id = "id 2", title = "Song name 2", artist = "Artist name 2", @@ -67,16 +67,16 @@ class EntityScreenStateTest { fun givenMixedDownloads_thenDownloadStateIsPartially() { // given val downloads = listOf( - DownloadMediaItemUiModel.Available( - MediaItemUiModel( + DownloadMediaUiModel.Available( + MediaUiModel( id = "id", title = "Song name", artist = "Artist name", artworkUri = "artworkUri", ) ), - DownloadMediaItemUiModel.Unavailable( - MediaItemUiModel( + DownloadMediaUiModel.Unavailable( + MediaUiModel( id = "id 2", title = "Song name 2", artist = "Artist name 2", @@ -103,16 +103,16 @@ class EntityScreenStateTest { fun givenAvailableDownloads_thenDownloadStateIsFully() { // given val downloads = listOf( - DownloadMediaItemUiModel.Available( - MediaItemUiModel( + DownloadMediaUiModel.Available( + MediaUiModel( id = "id", title = "Song name", artist = "Artist name", artworkUri = "artworkUri", ) ), - DownloadMediaItemUiModel.Available( - MediaItemUiModel( + DownloadMediaUiModel.Available( + MediaUiModel( id = "id 2", title = "Song name 2", artist = "Artist name 2", @@ -138,7 +138,7 @@ class EntityScreenStateTest { @Test fun givenEmptyDownloads_thenDownloadStateIsFully() { // given - val downloads = emptyList() + val downloads = emptyList() // when val result = EntityScreenState.Loaded( diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/PlayerViewModelTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/PlayerViewModelTest.kt index 630e748fee..4414e97627 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/PlayerViewModelTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/PlayerViewModelTest.kt @@ -19,7 +19,7 @@ package com.google.android.horologist.media.ui.state import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi -import com.google.android.horologist.media.ui.state.model.MediaItemUiModel +import com.google.android.horologist.media.ui.state.model.MediaUiModel import com.google.android.horologist.media.ui.state.model.TrackPositionUiModel import com.google.android.horologist.test.toolbox.testdoubles.StubPlayerRepository import com.google.common.truth.Truth.assertThat @@ -55,7 +55,7 @@ class PlayerViewModelTest { shuffleOn = false, playPauseEnabled = false, playing = false, - mediaItem = MediaItemUiModel(id = "", title = null, artist = null), + media = MediaUiModel(id = "", title = null, artist = null), trackPosition = TrackPositionUiModel(current = 0, duration = 0, percent = 0f), connected = false ) diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/MediaItemUiModelMapperTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/MediaUiModelMapperTest.kt similarity index 86% rename from media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/MediaItemUiModelMapperTest.kt rename to media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/MediaUiModelMapperTest.kt index 5613c660e7..8d4f35b580 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/MediaItemUiModelMapperTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/MediaUiModelMapperTest.kt @@ -18,21 +18,21 @@ package com.google.android.horologist.media.ui.state.mapper -import com.google.android.horologist.media.model.MediaItem +import com.google.android.horologist.media.model.Media import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.common.truth.Truth.assertThat import org.junit.Test -class MediaItemUiModelMapperTest { +class MediaUiModelMapperTest { @Test - fun givenMediaItem_thenMapsCorrectly() { + fun givenMedia_thenMapsCorrectly() { // given val id = "id" val title = "title" val artist = "artist" val artworkUri = "artworkUri" - val mediaItem = MediaItem( + val media = Media( id = id, uri = "http://www.example.com", title = title, @@ -41,7 +41,7 @@ class MediaItemUiModelMapperTest { ) // when - val result = MediaItemUiModelMapper.map(mediaItem) + val result = MediaUiModelMapper.map(media) // then assertThat(result.id).isEqualTo(id) diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapperTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapperTest.kt index 0d12a3dbc8..0c7ea39f5b 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapperTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/PlayerUiStateMapperTest.kt @@ -20,8 +20,8 @@ package com.google.android.horologist.media.ui.state.mapper import androidx.test.ext.junit.runners.AndroidJUnit4 import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.android.horologist.media.ui.state.PlayerUiState @@ -45,8 +45,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = false ) @@ -64,7 +64,7 @@ class PlayerUiStateMapperTest { shuffleOn = false, playPauseEnabled = false, playing = false, - mediaItem = null, + media = null, trackPosition = null, connected = false ) @@ -80,8 +80,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -99,8 +99,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -118,8 +118,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -137,8 +137,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -148,16 +148,16 @@ class PlayerUiStateMapperTest { } @Test - fun givenSkipToPreviousMediaItemCommandIsAvailable_thenSeekToPreviousIsEnabled() { + fun givenSkipToPreviousMediaCommandIsAvailable_thenSeekToPreviousIsEnabled() { // given - val commands = setOf(Command.SkipToPreviousMediaItem) + val commands = setOf(Command.SkipToPreviousMedia) // when val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -167,16 +167,16 @@ class PlayerUiStateMapperTest { } @Test - fun givenSkipToNextMediaItemCommandIsAvailable_thenSeekToNextIsEnabled() { + fun givenSkipToNextMediaCommandIsAvailable_thenSeekToNextIsEnabled() { // given - val commands = setOf(Command.SkipToNextMediaItem) + val commands = setOf(Command.SkipToNextMedia) // when val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -194,8 +194,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -213,8 +213,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = emptySet(), - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = shuffleEnabled, connected = true ) @@ -232,8 +232,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = emptySet(), - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = shuffleEnabled, connected = true ) @@ -251,8 +251,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = commands, - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -270,8 +270,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = state, availableCommands = emptySet(), - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -289,8 +289,8 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = state, availableCommands = emptySet(), - mediaItem = null, - mediaItemPosition = null, + media = null, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) @@ -300,12 +300,12 @@ class PlayerUiStateMapperTest { } @Test - fun givenMediaItem_thenMediaItemIsMappedCorrectly() { + fun givenMedia_thenMediaItemIsMappedCorrectly() { // given val id = "id" val title = "title" val artist = "artist" - val mediaItem = MediaItem( + val media = Media( id = id, uri = "http://www.example.com", title = title, @@ -316,33 +316,33 @@ class PlayerUiStateMapperTest { val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = emptySet(), - mediaItem = mediaItem, - mediaItemPosition = null, + media = media, + mediaPosition = null, shuffleModeEnabled = false, connected = true ) // then - assertNotNull(result.mediaItem) - val expectedMediaItem = result.mediaItem!! + assertNotNull(result.media) + val expectedMediaItem = result.media!! assertThat(expectedMediaItem.id).isEqualTo(id) assertThat(expectedMediaItem.title).isEqualTo(title) assertThat(expectedMediaItem.artist).isEqualTo(artist) } @Test - fun givenMediaItemPosition_thenTrackPositionIsMappedCorrectly() { + fun givenMediaPosition_thenTrackPositionIsMappedCorrectly() { // given val current = 1.seconds val duration = 2.seconds - val mediaItemPosition = MediaItemPosition.create(current, duration) + val mediaPosition = MediaPosition.create(current, duration) // when val result = PlayerUiStateMapper.map( currentState = PlayerState.Ready, availableCommands = emptySet(), - mediaItem = null, - mediaItemPosition = mediaItemPosition, + media = null, + mediaPosition = mediaPosition, shuffleModeEnabled = false, connected = true ) diff --git a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapperTest.kt b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapperTest.kt index 3e68b4cbbd..652a33166c 100644 --- a/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapperTest.kt +++ b/media-ui/src/test/java/com/google/android/horologist/media/ui/state/mapper/TrackPositionUiModelMapperTest.kt @@ -18,7 +18,7 @@ package com.google.android.horologist.media.ui.state.mapper -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.ui.ExperimentalHorologistMediaUiApi import com.google.common.truth.Truth.assertThat import org.junit.Test @@ -27,14 +27,14 @@ import kotlin.time.Duration.Companion.seconds class TrackPositionUiModelMapperTest { @Test - fun givenMediaItemPosition_thenMapsCorrectly() { + fun givenMediaPosition_thenMapsCorrectly() { // given val current = 1.seconds val duration = 2.seconds - val mediaItemPosition = MediaItemPosition.create(current, duration) + val mediaPosition = MediaPosition.create(current, duration) // when - val result = TrackPositionUiModelMapper.map(mediaItemPosition) + val result = TrackPositionUiModelMapper.map(mediaPosition) // then assertThat(result.current).isEqualTo(current.inWholeMilliseconds) diff --git a/media-ui/src/test/java/com/google/android/horologist/test/toolbox/testdoubles/StubPlayerRepository.kt b/media-ui/src/test/java/com/google/android/horologist/test/toolbox/testdoubles/StubPlayerRepository.kt index 6489d7cc76..475a148201 100644 --- a/media-ui/src/test/java/com/google/android/horologist/test/toolbox/testdoubles/StubPlayerRepository.kt +++ b/media-ui/src/test/java/com/google/android/horologist/test/toolbox/testdoubles/StubPlayerRepository.kt @@ -18,8 +18,8 @@ package com.google.android.horologist.test.toolbox.testdoubles import com.google.android.horologist.media.ExperimentalHorologistMediaApi import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import com.google.android.horologist.media.repository.PlayerRepository import kotlinx.coroutines.flow.MutableStateFlow @@ -38,10 +38,10 @@ class StubPlayerRepository : PlayerRepository { override val currentState: StateFlow get() = MutableStateFlow(PlayerState.Idle) - override val currentMediaItem: StateFlow + override val currentMedia: StateFlow get() = MutableStateFlow(null) - override val mediaItemPosition: StateFlow + override val mediaPosition: StateFlow get() = MutableStateFlow(null) override val shuffleModeEnabled: StateFlow @@ -55,7 +55,7 @@ class StubPlayerRepository : PlayerRepository { // do nothing } - override fun play(mediaItemIndex: Int) { + override fun play(mediaIndex: Int) { // do nothing } @@ -63,15 +63,15 @@ class StubPlayerRepository : PlayerRepository { // do nothing } - override fun hasPreviousMediaItem(): Boolean = false + override fun hasPreviousMedia(): Boolean = false - override fun skipToPreviousMediaItem() { + override fun skipToPreviousMedia() { // do nothing } - override fun hasNextMediaItem(): Boolean = false + override fun hasNextMedia(): Boolean = false - override fun skipToNextMediaItem() { + override fun skipToNextMedia() { // do nothing } @@ -91,35 +91,35 @@ class StubPlayerRepository : PlayerRepository { // do nothing } - override fun setMediaItem(mediaItem: MediaItem) { + override fun setMedia(media: Media) { // do nothing } - override fun setMediaItems(mediaItems: List) { + override fun setMediaList(mediaList: List) { // do nothing } - override fun addMediaItem(mediaItem: MediaItem) { + override fun addMedia(media: Media) { // do nothing } - override fun addMediaItem(index: Int, mediaItem: MediaItem) { + override fun addMedia(index: Int, media: Media) { // do nothing } - override fun removeMediaItem(index: Int) { + override fun removeMedia(index: Int) { // do nothing } - override fun clearMediaItems() { + override fun clearMediaList() { // do nothing } - override fun getMediaItemCount(): Int = 0 + override fun getMediaCount(): Int = 0 - override fun getMediaItemAt(index: Int): MediaItem? = null + override fun getMediaAt(index: Int): Media? = null - override fun getCurrentMediaItemIndex(): Int = -1 + override fun getCurrentMediaIndex(): Int = -1 override fun release() { // do nothing diff --git a/media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaItemWithArtwork_thenDisplaysArtwork.png b/media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaWithArtwork_thenDisplaysArtwork.png similarity index 100% rename from media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaItemWithArtwork_thenDisplaysArtwork.png rename to media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaWithArtwork_thenDisplaysArtwork.png diff --git a/media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaItemWithNOArtwork_thenDoesNOTDisplayArtwork.png b/media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaWithNOArtwork_thenDoesNOTDisplayArtwork.png similarity index 100% rename from media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaItemWithNOArtwork_thenDoesNOTDisplayArtwork.png rename to media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui.components_MediaChipTest_givenMediaWithNOArtwork_thenDoesNOTDisplayArtwork.png diff --git a/media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui_MediaPlayerStatesScreenTest_mediaPlayerScreen[0]_nomediaitem.png b/media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui_MediaPlayerStatesScreenTest_mediaPlayerScreen[0]_nomedia.png similarity index 100% rename from media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui_MediaPlayerStatesScreenTest_mediaPlayerScreen[0]_nomediaitem.png rename to media-ui/src/test/snapshots/images/com.google.android.horologist.media.ui_MediaPlayerStatesScreenTest_mediaPlayerScreen[0]_nomedia.png diff --git a/media/api/current.api b/media/api/current.api index b1e5647cfa..6417c85875 100644 --- a/media/api/current.api +++ b/media/api/current.api @@ -13,19 +13,19 @@ package com.google.android.horologist.media.model { enum_constant public static final com.google.android.horologist.media.model.Command SeekBack; enum_constant public static final com.google.android.horologist.media.model.Command SeekForward; enum_constant public static final com.google.android.horologist.media.model.Command SetShuffle; - enum_constant public static final com.google.android.horologist.media.model.Command SkipToNextMediaItem; - enum_constant public static final com.google.android.horologist.media.model.Command SkipToPreviousMediaItem; + enum_constant public static final com.google.android.horologist.media.model.Command SkipToNextMedia; + enum_constant public static final com.google.android.horologist.media.model.Command SkipToPreviousMedia; } - @com.google.android.horologist.media.ExperimentalHorologistMediaApi public final class MediaItem { - ctor public MediaItem(String id, String uri, String title, String artist, optional String? artworkUri, optional java.util.Map extras); + @com.google.android.horologist.media.ExperimentalHorologistMediaApi public final class Media { + ctor public Media(String id, String uri, String title, String artist, optional String? artworkUri, optional java.util.Map extras); method public String component1(); method public String component2(); method public String component3(); method public String component4(); method public String? component5(); method public java.util.Map component6(); - method public com.google.android.horologist.media.model.MediaItem copy(String id, String uri, String title, String artist, String? artworkUri, java.util.Map extras); + method public com.google.android.horologist.media.model.Media copy(String id, String uri, String title, String artist, String? artworkUri, java.util.Map extras); method public boolean equals(Object? other); method public String getArtist(); method public String? getArtworkUri(); @@ -43,17 +43,17 @@ package com.google.android.horologist.media.model { property public final String uri; } - @com.google.android.horologist.media.ExperimentalHorologistMediaApi public abstract sealed class MediaItemPosition { + @com.google.android.horologist.media.ExperimentalHorologistMediaApi public abstract sealed class MediaPosition { method public long getCurrent(); property public long current; - field public static final com.google.android.horologist.media.model.MediaItemPosition.Companion Companion; + field public static final com.google.android.horologist.media.model.MediaPosition.Companion Companion; } - public static final class MediaItemPosition.Companion { - method public com.google.android.horologist.media.model.MediaItemPosition.KnownDuration create(long current, long duration); + public static final class MediaPosition.Companion { + method public com.google.android.horologist.media.model.MediaPosition.KnownDuration create(long current, long duration); } - public static final class MediaItemPosition.KnownDuration extends com.google.android.horologist.media.model.MediaItemPosition { + public static final class MediaPosition.KnownDuration extends com.google.android.horologist.media.model.MediaPosition { method public long getDuration(); method public float getPercent(); property public long current; @@ -61,10 +61,10 @@ package com.google.android.horologist.media.model { property public final float percent; } - public static final class MediaItemPosition.UnknownDuration extends com.google.android.horologist.media.model.MediaItemPosition { - ctor public MediaItemPosition.UnknownDuration(long current); + public static final class MediaPosition.UnknownDuration extends com.google.android.horologist.media.model.MediaPosition { + ctor public MediaPosition.UnknownDuration(long current); method public long component1-UwyO8pc(); - method public com.google.android.horologist.media.model.MediaItemPosition.UnknownDuration copy-LRDsOJo(long current); + method public com.google.android.horologist.media.model.MediaPosition.UnknownDuration copy-LRDsOJo(long current); method public boolean equals(Object? other); method public int hashCode(); method public String toString(); @@ -84,40 +84,40 @@ package com.google.android.horologist.media.model { package com.google.android.horologist.media.repository { @com.google.android.horologist.media.ExperimentalHorologistMediaApi public interface PlayerRepository { - method public void addMediaItem(com.google.android.horologist.media.model.MediaItem mediaItem); - method public void addMediaItem(int index, com.google.android.horologist.media.model.MediaItem mediaItem); - method public void clearMediaItems(); + method public void addMedia(com.google.android.horologist.media.model.Media media); + method public void addMedia(int index, com.google.android.horologist.media.model.Media media); + method public void clearMediaList(); method public kotlinx.coroutines.flow.StateFlow> getAvailableCommands(); method public kotlinx.coroutines.flow.StateFlow getConnected(); - method public kotlinx.coroutines.flow.StateFlow getCurrentMediaItem(); - method public int getCurrentMediaItemIndex(); + method public kotlinx.coroutines.flow.StateFlow getCurrentMedia(); + method public int getCurrentMediaIndex(); method public kotlinx.coroutines.flow.StateFlow getCurrentState(); - method public com.google.android.horologist.media.model.MediaItem? getMediaItemAt(int index); - method public int getMediaItemCount(); - method public kotlinx.coroutines.flow.StateFlow getMediaItemPosition(); + method public com.google.android.horologist.media.model.Media? getMediaAt(int index); + method public int getMediaCount(); + method public kotlinx.coroutines.flow.StateFlow getMediaPosition(); method public long getSeekBackIncrement(); method public long getSeekForwardIncrement(); method public kotlinx.coroutines.flow.StateFlow getShuffleModeEnabled(); - method public boolean hasNextMediaItem(); - method public boolean hasPreviousMediaItem(); + method public boolean hasNextMedia(); + method public boolean hasPreviousMedia(); method public void pause(); method public void play(); - method public void play(int mediaItemIndex); + method public void play(int mediaIndex); method public void prepare(); method public void release(); - method public void removeMediaItem(int index); + method public void removeMedia(int index); method public void seekBack(); method public void seekForward(); - method public void setMediaItem(com.google.android.horologist.media.model.MediaItem mediaItem); - method public void setMediaItems(java.util.List mediaItems); + method public void setMedia(com.google.android.horologist.media.model.Media media); + method public void setMediaList(java.util.List mediaList); method public void setShuffleModeEnabled(boolean shuffleModeEnabled); - method public void skipToNextMediaItem(); - method public void skipToPreviousMediaItem(); + method public void skipToNextMedia(); + method public void skipToPreviousMedia(); property public abstract kotlinx.coroutines.flow.StateFlow> availableCommands; property public abstract kotlinx.coroutines.flow.StateFlow connected; - property public abstract kotlinx.coroutines.flow.StateFlow currentMediaItem; + property public abstract kotlinx.coroutines.flow.StateFlow currentMedia; property public abstract kotlinx.coroutines.flow.StateFlow currentState; - property public abstract kotlinx.coroutines.flow.StateFlow mediaItemPosition; + property public abstract kotlinx.coroutines.flow.StateFlow mediaPosition; property public abstract kotlinx.coroutines.flow.StateFlow shuffleModeEnabled; } diff --git a/media/src/main/java/com/google/android/horologist/media/model/Command.kt b/media/src/main/java/com/google/android/horologist/media/model/Command.kt index d03e04a0f0..fb01203dbe 100644 --- a/media/src/main/java/com/google/android/horologist/media/model/Command.kt +++ b/media/src/main/java/com/google/android/horologist/media/model/Command.kt @@ -26,7 +26,7 @@ public enum class Command { PlayPause, SeekBack, SeekForward, - SkipToPreviousMediaItem, - SkipToNextMediaItem, + SkipToPreviousMedia, + SkipToNextMedia, SetShuffle } diff --git a/media/src/main/java/com/google/android/horologist/media/model/MediaItem.kt b/media/src/main/java/com/google/android/horologist/media/model/Media.kt similarity index 93% rename from media/src/main/java/com/google/android/horologist/media/model/MediaItem.kt rename to media/src/main/java/com/google/android/horologist/media/model/Media.kt index c8b973b042..eb0ee4e72c 100644 --- a/media/src/main/java/com/google/android/horologist/media/model/MediaItem.kt +++ b/media/src/main/java/com/google/android/horologist/media/model/Media.kt @@ -19,10 +19,10 @@ package com.google.android.horologist.media.model import com.google.android.horologist.media.ExperimentalHorologistMediaApi /** - * Representation of a media item. + * Representation of a media. */ @ExperimentalHorologistMediaApi -public data class MediaItem( +public data class Media( val id: String, val uri: String, val title: String, diff --git a/media/src/main/java/com/google/android/horologist/media/model/MediaItemPosition.kt b/media/src/main/java/com/google/android/horologist/media/model/MediaPosition.kt similarity index 90% rename from media/src/main/java/com/google/android/horologist/media/model/MediaItemPosition.kt rename to media/src/main/java/com/google/android/horologist/media/model/MediaPosition.kt index 7453d461de..cc2aa692a5 100644 --- a/media/src/main/java/com/google/android/horologist/media/model/MediaItemPosition.kt +++ b/media/src/main/java/com/google/android/horologist/media/model/MediaPosition.kt @@ -20,20 +20,20 @@ import com.google.android.horologist.media.ExperimentalHorologistMediaApi import kotlin.time.Duration /** - * Represents the current [media item][MediaItem] position, duration and percent progress. + * Represents the current [Media] position, duration and percent progress. * Current position and duration are measured in milliseconds. */ @ExperimentalHorologistMediaApi -public sealed class MediaItemPosition( +public sealed class MediaPosition( public open val current: Duration, ) { public class KnownDuration internal constructor( override val current: Duration, public val duration: Duration, public val percent: Float, - ) : MediaItemPosition(current) + ) : MediaPosition(current) - public data class UnknownDuration(override val current: Duration) : MediaItemPosition(current) + public data class UnknownDuration(override val current: Duration) : MediaPosition(current) public companion object { diff --git a/media/src/main/java/com/google/android/horologist/media/repository/PlayerRepository.kt b/media/src/main/java/com/google/android/horologist/media/repository/PlayerRepository.kt index f0d5815b6a..6037cab5c5 100644 --- a/media/src/main/java/com/google/android/horologist/media/repository/PlayerRepository.kt +++ b/media/src/main/java/com/google/android/horologist/media/repository/PlayerRepository.kt @@ -18,8 +18,8 @@ package com.google.android.horologist.media.repository import com.google.android.horologist.media.ExperimentalHorologistMediaApi import com.google.android.horologist.media.model.Command -import com.google.android.horologist.media.model.MediaItem -import com.google.android.horologist.media.model.MediaItemPosition +import com.google.android.horologist.media.model.Media +import com.google.android.horologist.media.model.MediaPosition import com.google.android.horologist.media.model.PlayerState import kotlinx.coroutines.flow.StateFlow import kotlin.time.Duration @@ -43,17 +43,17 @@ public interface PlayerRepository { public val currentState: StateFlow /** - * Returns the current [media item][MediaItem] playing, or that would play when player starts playing. + * Returns the current [Media] playing, or that would play when player starts playing. */ - public val currentMediaItem: StateFlow + public val currentMedia: StateFlow /** - * Returns the current [media item position][MediaItemPosition] of the player. + * Returns the current [media position][MediaPosition] of the player. */ - public val mediaItemPosition: StateFlow + public val mediaPosition: StateFlow /** - * Returns the current value for shuffling of [media items][MediaItem] mode. + * Returns the current value for shuffling of [Media] mode. */ public val shuffleModeEnabled: StateFlow @@ -68,9 +68,9 @@ public interface PlayerRepository { public fun play() /** - * Play [media item][MediaItem] at given index as soon as player is ready. + * Play [Media] at given index as soon as player is ready. */ - public fun play(mediaItemIndex: Int) + public fun play(mediaIndex: Int) /** * Pauses playback. @@ -78,24 +78,24 @@ public interface PlayerRepository { public fun pause() /** - * Returns whether a previous [media item][MediaItem] exists. + * Returns whether a previous [Media] exists. */ - public fun hasPreviousMediaItem(): Boolean + public fun hasPreviousMedia(): Boolean /** - * Skips to the default position of previous [media item][MediaItem]. + * Skips to the default position of previous [Media]. */ - public fun skipToPreviousMediaItem() + public fun skipToPreviousMedia() /** - * Returns whether a next [media item][MediaItem] exists. + * Returns whether a next [Media] exists. */ - public fun hasNextMediaItem(): Boolean + public fun hasNextMedia(): Boolean /** - * Skips to the default position of next [media item][MediaItem]. + * Skips to the default position of next [Media]. */ - public fun skipToNextMediaItem() + public fun skipToNextMedia() /** * Returns the [seekBack] increment. @@ -103,7 +103,7 @@ public interface PlayerRepository { public fun getSeekBackIncrement(): Duration /** - * Seeks back in the [current media item][currentMediaItem] by [seek back increment][getSeekBackIncrement]. + * Seeks back in the [current media][currentMedia] by [seek back increment][getSeekBackIncrement]. */ public fun seekBack() @@ -113,69 +113,69 @@ public interface PlayerRepository { public fun getSeekForwardIncrement(): Duration /** - * Seek forward in the [current media item][currentMediaItem] by [seek forward increment][getSeekForwardIncrement]. + * Seek forward in the [current media][currentMedia] by [seek forward increment][getSeekForwardIncrement]. */ public fun seekForward() /** - * Sets whether shuffling of [media items][MediaItem] is enabled. + * Sets whether shuffling of [Media] is enabled. */ public fun setShuffleModeEnabled(shuffleModeEnabled: Boolean) /** - * Clears the playlist, adds the specified [media item][MediaItem] and resets the position to + * Clears the playlist, adds the specified [Media] and resets the position to * the default position. */ - public fun setMediaItem(mediaItem: MediaItem) + public fun setMedia(media: Media) /** - * Clears the playlist, adds the specified [media items][MediaItem] and resets the position to + * Clears the playlist, adds the specified [Media] list and resets the position to * the default position. * - * @param mediaItems The new [media item][MediaItem]. + * @param mediaList The new [Media]. */ - public fun setMediaItems(mediaItems: List) + public fun setMediaList(mediaList: List) /** - * Adds a [media item][MediaItem] to the end of the playlist. + * Adds a [Media] to the end of the playlist. */ - public fun addMediaItem(mediaItem: MediaItem) + public fun addMedia(media: Media) /** - * Adds a [media item][MediaItem] at the given index of the playlist. + * Adds a [Media] at the given index of the playlist. * - * @param index The index at which to add the [media item][MediaItem]. If the index is larger than the size - * of the playlist, the media item is added to the end of the playlist. - * @param mediaItem The [media item][MediaItem] to add. + * @param index The index at which to add the [Media]. If the index is larger than the size + * of the playlist, the media is added to the end of the playlist. + * @param media The [Media] to add. */ - public fun addMediaItem(index: Int, mediaItem: MediaItem) + public fun addMedia(index: Int, media: Media) /** - * Removes the [media item][MediaItem] at the given index of the playlist. + * Removes the [Media] at the given index of the playlist. * - * @param index The index at which to remove the [media item][MediaItem]. + * @param index The index at which to remove the [Media]. */ - public fun removeMediaItem(index: Int) + public fun removeMedia(index: Int) /** * Clears the playlist. */ - public fun clearMediaItems() + public fun clearMediaList() /** - * Returns the number of [media items][MediaItem] in the playlist. + * Returns the number of [Media] in the playlist. * */ - public fun getMediaItemCount(): Int + public fun getMediaCount(): Int /** - * Returns the [media item][MediaItem] at the given index. + * Returns the [Media] at the given index. */ - public fun getMediaItemAt(index: Int): MediaItem? + public fun getMediaAt(index: Int): Media? /** - * Returns the index of the current [media item][MediaItem]. + * Returns the index of the current [Media]. */ - public fun getCurrentMediaItemIndex(): Int + public fun getCurrentMediaIndex(): Int /** * Releases the player. This method must be called when the player is no longer required. The diff --git a/media/src/test/java/com/google/android/horologist/media/model/MediaItemPositionTest.kt b/media/src/test/java/com/google/android/horologist/media/model/MediaPositionTest.kt similarity index 84% rename from media/src/test/java/com/google/android/horologist/media/model/MediaItemPositionTest.kt rename to media/src/test/java/com/google/android/horologist/media/model/MediaPositionTest.kt index 5b0c8b6915..8a22f5026b 100644 --- a/media/src/test/java/com/google/android/horologist/media/model/MediaItemPositionTest.kt +++ b/media/src/test/java/com/google/android/horologist/media/model/MediaPositionTest.kt @@ -25,7 +25,7 @@ import org.junit.Test import kotlin.time.Duration import kotlin.time.Duration.Companion.seconds -class MediaItemPositionTest { +class MediaPositionTest { @Test fun givenValidValues_whenCreateKnownPosition_thenCreateCorrectly() { @@ -34,7 +34,7 @@ class MediaItemPositionTest { val duration = 2.seconds // when - val result = MediaItemPosition.create(current = current, duration = duration) + val result = MediaPosition.create(current = current, duration = duration) // then assertThat(result.current).isEqualTo(current) @@ -48,7 +48,7 @@ class MediaItemPositionTest { val current = (-1).seconds // when - val whenBlock = { MediaItemPosition.create(current = current, duration = 10.seconds) } + val whenBlock = { MediaPosition.create(current = current, duration = 10.seconds) } // then assertThrows(IllegalStateException::class.java) { whenBlock() } @@ -60,7 +60,7 @@ class MediaItemPositionTest { val duration = Duration.ZERO // when - val whenBlock = { MediaItemPosition.create(current = Duration.ZERO, duration = duration) } + val whenBlock = { MediaPosition.create(current = Duration.ZERO, duration = duration) } // then assertThrows(IllegalStateException::class.java) { whenBlock() } @@ -73,7 +73,7 @@ class MediaItemPositionTest { val duration = 1.seconds // when - val whenBlock = { MediaItemPosition.create(current = current, duration = duration) } + val whenBlock = { MediaPosition.create(current = current, duration = duration) } // then assertThrows(IllegalStateException::class.java) { whenBlock() }