Skip to content

Commit

Permalink
Merge remote-tracking branch 'upstream/main' into wear-launcher-icon
Browse files Browse the repository at this point in the history
  • Loading branch information
ithinkihaveacat committed Apr 25, 2024
2 parents 5bf84a0 + ae41864 commit 03e1916
Show file tree
Hide file tree
Showing 19 changed files with 353 additions and 55 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -102,4 +102,14 @@ interface EpisodePlayer {
* Rewinds a currently played episode by a given time interval specified in [duration].
*/
fun rewindBy(duration: Duration)

/**
* Increases the speed of Player playback by a given time specified in [duration].
*/
fun increaseSpeed(speed: Duration = Duration.ofMillis(500))

/**
* Decreases the speed of Player playback by a given time specified in [duration].
*/
fun decreaseSpeed(speed: Duration = Duration.ofMillis(500))
}
Original file line number Diff line number Diff line change
Expand Up @@ -173,6 +173,14 @@ class MockEpisodePlayer(
}
}

override fun increaseSpeed(speed: Duration) {
_playerSpeed.value += speed
}

override fun decreaseSpeed(speed: Duration) {
_playerSpeed.value -= speed
}

override fun next() {
val q = queue.value
if (q.isEmpty()) {
Expand Down
2 changes: 1 addition & 1 deletion Jetcaster/gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ composeMaterial = "1.2.1"
composeFoundation = "1.2.1"
coreSplashscreen = "1.0.1"
horologistComposeTools = "0.4.8"
horologist = "0.6.6"
horologist = "0.6.9"
roborazzi = "1.11.0"
androidx-wear-compose = "1.3.0"
wear-compose-ui-tooling = "1.3.0"
Expand Down
9 changes: 9 additions & 0 deletions Jetcaster/wear/src/main/java/com/example/jetcaster/WearApp.kt
Original file line number Diff line number Diff line change
Expand Up @@ -28,10 +28,12 @@ import com.example.jetcaster.theme.WearAppTheme
import com.example.jetcaster.ui.Episode
import com.example.jetcaster.ui.JetcasterNavController.navigateToEpisode
import com.example.jetcaster.ui.JetcasterNavController.navigateToLatestEpisode
import com.example.jetcaster.ui.JetcasterNavController.navigateToPlaybackSpeed
import com.example.jetcaster.ui.JetcasterNavController.navigateToPodcastDetails
import com.example.jetcaster.ui.JetcasterNavController.navigateToUpNext
import com.example.jetcaster.ui.JetcasterNavController.navigateToYourPodcast
import com.example.jetcaster.ui.LatestEpisodes
import com.example.jetcaster.ui.PlaybackSpeed
import com.example.jetcaster.ui.PodcastDetails
import com.example.jetcaster.ui.UpNext
import com.example.jetcaster.ui.YourPodcasts
Expand All @@ -40,6 +42,7 @@ import com.example.jetcaster.ui.home.HomeScreen
import com.example.jetcaster.ui.library.LatestEpisodesScreen
import com.example.jetcaster.ui.library.PodcastsScreen
import com.example.jetcaster.ui.library.QueueScreen
import com.example.jetcaster.ui.player.PlaybackSpeedScreen
import com.example.jetcaster.ui.player.PlayerScreen
import com.example.jetcaster.ui.podcast.PodcastDetailsScreen
import com.google.android.horologist.audio.ui.VolumeViewModel
Expand Down Expand Up @@ -69,6 +72,9 @@ fun WearApp() {
onVolumeClick = {
navController.navigateToVolume()
},
onPlaybackSpeedChangeClick = {
navController.navigateToPlaybackSpeed()
},
)
},
libraryScreen = {
Expand Down Expand Up @@ -137,6 +143,9 @@ fun WearApp() {
}
)
}
composable(route = PlaybackSpeed.navRoute) {
PlaybackSpeedScreen()
}
},

)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,10 @@ public object JetcasterNavController {
public fun NavController.navigateToEpisode(episodeUri: String) {
navigate(Episode.destination(episodeUri))
}

public fun NavController.navigateToPlaybackSpeed() {
navigate(PlaybackSpeed.destination())
}
}

public object YourPodcasts : NavigationScreens("yourPodcasts") {
Expand Down Expand Up @@ -90,3 +94,7 @@ public object Episode : NavigationScreens("episode?episodeUri={episodeUri}") {
public object UpNext : NavigationScreens("upNext") {
public fun destination(): String = navRoute
}

public object PlaybackSpeed : NavigationScreens("playbackSpeed") {
public fun destination(): String = navRoute
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,13 +19,14 @@ package com.example.jetcaster.ui.components
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.PlaylistAdd
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.res.vectorResource
import com.example.jetcaster.R
import com.example.jetcaster.ui.player.PlayerUiState
import com.google.android.horologist.audio.ui.VolumeUiState
import com.google.android.horologist.audio.ui.components.SettingsButtonsDefaults
import com.google.android.horologist.audio.ui.components.actions.SetVolumeButton
Expand All @@ -40,7 +41,8 @@ import com.google.android.horologist.compose.material.IconRtlMode
fun SettingsButtons(
volumeUiState: VolumeUiState,
onVolumeClick: () -> Unit,
onAddToQueueClick: () -> Unit,
playerUiState: PlayerUiState,
onPlaybackSpeedChange: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
) {
Expand All @@ -49,8 +51,11 @@ fun SettingsButtons(
verticalAlignment = Alignment.CenterVertically,
horizontalArrangement = Arrangement.SpaceEvenly,
) {
AddToQueueButton(
onAddToQueueClick = onAddToQueueClick,
PlaybackSpeedButton(
currentPlayerSpeed = playerUiState.episodePlayerState
.playbackSpeed.toMillis().toFloat() / 1000,
onPlaybackSpeedChange = onPlaybackSpeedChange,
enabled = enabled
)

SettingsButtonsDefaults.BrandIcon(
Expand All @@ -61,22 +66,29 @@ fun SettingsButtons(
SetVolumeButton(
onVolumeClick = onVolumeClick,
volumeUiState = volumeUiState,
enabled = enabled
)
}
}

@Composable
fun AddToQueueButton(
onAddToQueueClick: () -> Unit,
fun PlaybackSpeedButton(
currentPlayerSpeed: Float,
onPlaybackSpeedChange: () -> Unit,
modifier: Modifier = Modifier,
enabled: Boolean = true,
) {
SettingsButton(
modifier = modifier,
onClick = onAddToQueueClick,
onClick = onPlaybackSpeedChange,
enabled = enabled,
imageVector = Icons.AutoMirrored.Filled.PlaylistAdd,
imageVector =
when (currentPlayerSpeed) {
1f -> ImageVector.vectorResource(R.drawable.speed_1x)
1.5f -> ImageVector.vectorResource(R.drawable.speed_15x)
else -> { ImageVector.vectorResource(R.drawable.speed_2x) }
},
iconRtlMode = IconRtlMode.Mirrored,
contentDescription = stringResource(R.string.add_to_queue_content_description),
contentDescription = stringResource(R.string.change_playback_speed_content_description),
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -121,12 +121,6 @@ class HomeViewModel @Inject constructor(
}
}

fun onPodcastUnfollowed(podcastUri: String) {
viewModelScope.launch {
podcastStore.unfollowPodcast(podcastUri)
}
}

fun onTogglePodcastFollowed(podcastUri: String) {
viewModelScope.launch {
podcastStore.togglePodcastFollowed(podcastUri)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,23 +68,23 @@ import com.google.android.horologist.media.ui.screens.entity.EntityScreen
QueueScreen(
uiState = uiState,
onPlayButtonClick = onPlayButtonClick,
onPlayEpisodes = queueViewModel::onPlayEpisodes,
modifier = modifier,
onEpisodeItemClick = onEpisodeItemClick,
onDeleteQueueEpisodes = queueViewModel::onDeleteQueueEpisodes,
onDismiss = onDismiss,
queueViewModel = queueViewModel
onDismiss = onDismiss
)
}

@Composable
fun QueueScreen(
uiState: QueueScreenState,
onPlayButtonClick: () -> Unit,
onPlayEpisodes: (List<PlayerEpisode>) -> Unit,
modifier: Modifier = Modifier,
onEpisodeItemClick: (EpisodeToPodcast) -> Unit,
onDeleteQueueEpisodes: () -> Unit,
onDismiss: () -> Unit,
queueViewModel: QueueViewModel
onDismiss: () -> Unit
) {
val columnState = rememberResponsiveColumnState(
contentPadding = padding(
Expand All @@ -109,11 +109,9 @@ fun QueueScreen(
},
buttonsContent = {
ButtonsContent(
onPlayButtonClick =
{
onPlayButtonClick
queueViewModel.onPlayEpisode(uiState.episodeList[0])
},
episodes = uiState.episodeList,
onPlayButtonClick = onPlayButtonClick,
onPlayEpisodes = onPlayEpisodes,
onDeleteQueueEpisodes = onDeleteQueueEpisodes
)
},
Expand Down Expand Up @@ -141,7 +139,9 @@ fun QueueScreen(
},
buttonsContent = {
ButtonsContent(
episodes = emptyList(),
onPlayButtonClick = {},
onPlayEpisodes = {},
onDeleteQueueEpisodes = { },
enabled = false
)
Expand All @@ -158,7 +158,7 @@ fun QueueScreen(
showDialog = true,
onDismiss = onDismiss,
title = stringResource(R.string.display_nothing_in_queue),
message = stringResource(R.string.failed_loading_episodes_from_queue)
message = stringResource(R.string.no_episodes_from_queue)
)
}
}
Expand All @@ -168,7 +168,9 @@ fun QueueScreen(
@OptIn(ExperimentalHorologistApi::class)
@Composable
fun ButtonsContent(
episodes: List<PlayerEpisode>,
onPlayButtonClick: () -> Unit,
onPlayEpisodes: (List<PlayerEpisode>) -> Unit,
onDeleteQueueEpisodes: () -> Unit,
enabled: Boolean = true
) {
Expand All @@ -183,7 +185,10 @@ fun ButtonsContent(
Button(
imageVector = Icons.Outlined.PlayArrow,
contentDescription = stringResource(id = R.string.button_play_content_description),
onClick = onPlayButtonClick,
onClick = {
onPlayButtonClick()
onPlayEpisodes(episodes)
},
modifier = Modifier
.weight(weight = 0.3F, fill = false),
enabled = enabled
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,11 @@ class QueueViewModel @Inject constructor(
episodePlayer.play()
}

fun onPlayEpisodes(episodes: List<PlayerEpisode>) {
episodePlayer.currentEpisode = episodes[0]
episodePlayer.play(episodes)
}

fun onDeleteQueueEpisodes() {
episodePlayer.removeAllFromQueue()
}
Expand Down
Loading

0 comments on commit 03e1916

Please sign in to comment.