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

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.list.SearchFilesView
import com.lasthopesoftware.bluewater.client.browsing.items.list.ItemListViewModel
import com.lasthopesoftware.bluewater.client.settings.LibrarySettingsViewModel
import com.lasthopesoftware.bluewater.client.stored.library.items.files.view.ActiveFileDownloadsViewModel
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack

/**
* View Models that work best when declared with a local ViewModelOwner
Expand All @@ -18,5 +18,5 @@ interface ScopedViewModelDependencies : ReusedViewModelDependencies {
val searchFilesViewModel: SearchFilesViewModel
val librarySettingsViewModel: LibrarySettingsViewModel
val fileDetailsViewModel: FileDetailsViewModel
val undoBackStackBuilder: BuildUndoBackStack
val undoBackStackBuilder: UndoStack
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import com.lasthopesoftware.bluewater.client.settings.LibrarySettingsViewModel
import com.lasthopesoftware.bluewater.client.settings.PermissionsDependencies
import com.lasthopesoftware.bluewater.client.stored.library.items.files.view.ActiveFileDownloadsViewModel
import com.lasthopesoftware.bluewater.shared.android.UndoStackApplicationNavigation
import com.lasthopesoftware.bluewater.shared.android.ViewModelUndoStack
import com.lasthopesoftware.bluewater.shared.android.viewmodels.buildViewModelLazily

class ScopedViewModelRegistry(
Expand Down Expand Up @@ -75,10 +76,9 @@ class ScopedViewModelRegistry(
)
}

override val undoBackStackBuilder by viewModelStoreOwner.buildViewModelLazily {
UndoStackApplicationNavigation(reusedViewModelDependencies.applicationNavigation)
}
override val undoBackStackBuilder by viewModelStoreOwner.buildViewModelLazily { ViewModelUndoStack() }

override val applicationNavigation
get() = undoBackStackBuilder
override val applicationNavigation by lazy {
UndoStackApplicationNavigation(undoBackStackBuilder, reusedViewModelDependencies.applicationNavigation)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ import com.lasthopesoftware.bluewater.client.browsing.items.list.menus.changes.h
import com.lasthopesoftware.bluewater.client.connection.ConnectionLostExceptionFilter
import com.lasthopesoftware.bluewater.client.playback.nowplaying.view.viewmodels.NowPlayingFilePropertiesViewModel
import com.lasthopesoftware.bluewater.client.playback.service.ControlPlaybackService
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack
import com.lasthopesoftware.bluewater.shared.android.ui.components.BackButton
import com.lasthopesoftware.bluewater.shared.android.ui.components.LabelledRefreshButton
import com.lasthopesoftware.bluewater.shared.android.ui.components.rememberCalculatedKnobHeight
Expand Down Expand Up @@ -159,7 +159,7 @@ fun SearchFilesView(
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
applicationNavigation: NavigateApplication,
playbackServiceController: ControlPlaybackService,
backStackBuilder: BuildUndoBackStack
backStackBuilder: UndoStack
) {
val files by searchFilesViewModel.files.subscribeAsState()
var isConnectionLost by remember { mutableStateOf(false) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ import com.lasthopesoftware.bluewater.client.connection.ConnectionLostExceptionF
import com.lasthopesoftware.bluewater.client.connection.session.initialization.ConnectionStatusViewModel
import com.lasthopesoftware.bluewater.client.playback.nowplaying.view.viewmodels.NowPlayingFilePropertiesViewModel
import com.lasthopesoftware.bluewater.client.playback.service.ControlPlaybackService
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack
import com.lasthopesoftware.bluewater.shared.android.viewmodels.PooledCloseablesViewModel
import com.lasthopesoftware.bluewater.shared.android.viewmodels.ViewModelInitAction
import com.lasthopesoftware.promises.extensions.suspend
Expand Down Expand Up @@ -50,19 +50,19 @@ fun LoadedItemListView(viewModelDependencies: ScopedViewModelDependencies, libra

@Composable
private fun LoadedItemListView(
libraryId: LibraryId,
item: IItem?,
itemListViewModel: ItemListViewModel,
fileListViewModel: FileListViewModel,
nowPlayingViewModel: NowPlayingFilePropertiesViewModel,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
reusablePlaylistFileItemViewModelProvider: ReusablePlaylistFileItemViewModelProvider,
childItemViewModelProvider: PooledCloseablesViewModel<ReusableChildItemViewModel>,
applicationNavigation: NavigateApplication,
playbackLibraryItems: PlaybackLibraryItems,
playbackServiceController: ControlPlaybackService,
connectionStatusViewModel: ConnectionStatusViewModel,
undoBackStack: BuildUndoBackStack,
libraryId: LibraryId,
item: IItem?,
itemListViewModel: ItemListViewModel,
fileListViewModel: FileListViewModel,
nowPlayingViewModel: NowPlayingFilePropertiesViewModel,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
reusablePlaylistFileItemViewModelProvider: ReusablePlaylistFileItemViewModelProvider,
childItemViewModelProvider: PooledCloseablesViewModel<ReusableChildItemViewModel>,
applicationNavigation: NavigateApplication,
playbackLibraryItems: PlaybackLibraryItems,
playbackServiceController: ControlPlaybackService,
connectionStatusViewModel: ConnectionStatusViewModel,
undoBackStack: UndoStack,
) {
var isConnectionLost by remember { mutableStateOf(false) }
var initializeConnection by remember { mutableStateOf(false) }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ import com.lasthopesoftware.bluewater.client.browsing.items.playlists.PlaylistId
import com.lasthopesoftware.bluewater.client.playback.nowplaying.view.viewmodels.NowPlayingFilePropertiesViewModel
import com.lasthopesoftware.bluewater.client.playback.service.ControlPlaybackService
import com.lasthopesoftware.bluewater.client.stored.library.sync.SyncIcon
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack
import com.lasthopesoftware.bluewater.shared.android.ui.components.BackButton
import com.lasthopesoftware.bluewater.shared.android.ui.components.GradientSide
import com.lasthopesoftware.bluewater.shared.android.ui.components.ListItemIcon
Expand Down Expand Up @@ -137,16 +137,16 @@ fun FilesCountHeader(filesCount: Int) {

@Composable
fun RenderTrackTitleItem(
position: Int,
serviceFile: ServiceFile,
trackHeadlineViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
itemListViewModel: ItemListViewModel,
nowPlayingViewModel: NowPlayingFilePropertiesViewModel,
applicationNavigation: NavigateApplication,
fileListViewModel: FileListViewModel,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
playbackServiceController: ControlPlaybackService,
undoBackStack: BuildUndoBackStack,
position: Int,
serviceFile: ServiceFile,
trackHeadlineViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
itemListViewModel: ItemListViewModel,
nowPlayingViewModel: NowPlayingFilePropertiesViewModel,
applicationNavigation: NavigateApplication,
fileListViewModel: FileListViewModel,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
playbackServiceController: ControlPlaybackService,
undoBackStack: UndoStack,
) {
val fileItemViewModel = remember(trackHeadlineViewModelProvider::getViewModel)

Expand Down Expand Up @@ -205,13 +205,13 @@ fun RenderTrackTitleItem(
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun ChildItem(
item: IItem,
itemListViewModel: ItemListViewModel,
applicationNavigation: NavigateApplication,
childItemViewModelProvider: PooledCloseablesViewModel<ReusableChildItemViewModel>,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
playbackLibraryItems: PlaybackLibraryItems,
backStack: BuildUndoBackStack,
item: IItem,
itemListViewModel: ItemListViewModel,
applicationNavigation: NavigateApplication,
childItemViewModelProvider: PooledCloseablesViewModel<ReusableChildItemViewModel>,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
playbackLibraryItems: PlaybackLibraryItems,
backStack: UndoStack,
) {
val rowHeight = Dimensions.standardRowHeight
val rowFontSize = LocalDensity.current.run { dimensionResource(id = R.dimen.row_font_size).toSp() }
Expand Down Expand Up @@ -337,7 +337,7 @@ fun ItemListView(
applicationNavigation: NavigateApplication,
playbackLibraryItems: PlaybackLibraryItems,
playbackServiceController: ControlPlaybackService,
undoBackStack: BuildUndoBackStack,
undoBackStack: UndoStack,
) {
val files by fileListViewModel.files.subscribeAsState()
val rowHeight = Dimensions.standardRowHeight
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ import com.lasthopesoftware.bluewater.client.playback.nowplaying.view.viewmodels
import com.lasthopesoftware.bluewater.client.playback.nowplaying.view.viewmodels.NowPlayingScreenViewModel
import com.lasthopesoftware.bluewater.client.playback.nowplaying.view.viewmodels.playlist.NowPlayingPlaylistViewModel
import com.lasthopesoftware.bluewater.client.playback.service.ControlPlaybackService
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack
import com.lasthopesoftware.bluewater.shared.android.messages.ViewModelMessageBus
import com.lasthopesoftware.bluewater.shared.android.ui.SlideOutState
import com.lasthopesoftware.bluewater.shared.android.ui.components.BackButton
Expand Down Expand Up @@ -214,10 +214,10 @@ fun NowPlayingHeadline(modifier: Modifier = Modifier, nowPlayingFilePropertiesVi
@OptIn(ExperimentalComposeUiApi::class)
@Composable
fun PlaylistControls(
modifier: Modifier = Modifier,
playlistViewModel: NowPlayingPlaylistViewModel,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: BuildUndoBackStack,
modifier: Modifier = Modifier,
playlistViewModel: NowPlayingPlaylistViewModel,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: UndoStack,
) {
Row(
modifier = modifier,
Expand Down Expand Up @@ -408,15 +408,15 @@ suspend fun LazyListState.scrollToFileIfNotScrolling(file: PositionedFile) {

@Composable
fun NowPlayingPlaylist(
childItemViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
nowPlayingFilePropertiesViewModel: NowPlayingFilePropertiesViewModel,
applicationNavigation: NavigateApplication,
playbackServiceController: ControlPlaybackService,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
playlistViewModel: NowPlayingPlaylistViewModel,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: BuildUndoBackStack,
modifier: Modifier = Modifier,
childItemViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
nowPlayingFilePropertiesViewModel: NowPlayingFilePropertiesViewModel,
applicationNavigation: NavigateApplication,
playbackServiceController: ControlPlaybackService,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
playlistViewModel: NowPlayingPlaylistViewModel,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: UndoStack,
modifier: Modifier = Modifier,
) {
val nowPlayingFiles by playlistViewModel.nowPlayingList.subscribeAsState()
val playlist by remember { derivedStateOf { nowPlayingFiles.map { p -> p.serviceFile } } }
Expand Down Expand Up @@ -542,15 +542,15 @@ private val expandedControlsHeight = controlRowHeight + collapsedControlsHeight
@Composable
@OptIn(ExperimentalFoundationApi::class, ExperimentalCoroutinesApi::class)
fun BoxWithConstraintsScope.NowPlayingNarrowView(
nowPlayingFilePropertiesViewModel: NowPlayingFilePropertiesViewModel,
nowPlayingScreenViewModel: NowPlayingScreenViewModel,
playbackServiceController: ControlPlaybackService,
playlistViewModel: NowPlayingPlaylistViewModel,
childItemViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
applicationNavigation: NavigateApplication,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: BuildUndoBackStack,
nowPlayingFilePropertiesViewModel: NowPlayingFilePropertiesViewModel,
nowPlayingScreenViewModel: NowPlayingScreenViewModel,
playbackServiceController: ControlPlaybackService,
playlistViewModel: NowPlayingPlaylistViewModel,
childItemViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
applicationNavigation: NavigateApplication,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: UndoStack,
) {
val isScreenControlsVisible by nowPlayingScreenViewModel.isScreenControlsVisible.subscribeAsState()

Expand Down Expand Up @@ -813,7 +813,7 @@ private fun ScreenDimensionsScope.NowPlayingWideView(
applicationNavigation: NavigateApplication,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
undoBackStack: BuildUndoBackStack
undoBackStack: UndoStack
) {
val playlistWidth = screenHeight.coerceIn(minimumMenuWidth, maxWidth / 2)
val playlistWidthPx = LocalDensity.current.run { playlistWidth.toPx() }
Expand Down Expand Up @@ -1007,18 +1007,18 @@ private fun ScreenDimensionsScope.NowPlayingWideView(
@ExperimentalFoundationApi
@Composable
fun NowPlayingView(
nowPlayingCoverArtViewModel: NowPlayingCoverArtViewModel,
nowPlayingFilePropertiesViewModel: NowPlayingFilePropertiesViewModel,
nowPlayingScreenViewModel: NowPlayingScreenViewModel,
playbackServiceController: ControlPlaybackService,
playlistViewModel: NowPlayingPlaylistViewModel,
childItemViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
applicationNavigation: NavigateApplication,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
connectionWatcherViewModel: ConnectionWatcherViewModel,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
bitmapProducer: ProduceBitmaps,
undoBackStack: BuildUndoBackStack,
nowPlayingCoverArtViewModel: NowPlayingCoverArtViewModel,
nowPlayingFilePropertiesViewModel: NowPlayingFilePropertiesViewModel,
nowPlayingScreenViewModel: NowPlayingScreenViewModel,
playbackServiceController: ControlPlaybackService,
playlistViewModel: NowPlayingPlaylistViewModel,
childItemViewModelProvider: PooledCloseablesViewModel<ViewPlaylistFileItem>,
applicationNavigation: NavigateApplication,
itemListMenuBackPressedHandler: ItemListMenuBackPressedHandler,
connectionWatcherViewModel: ConnectionWatcherViewModel,
viewModelMessageBus: ViewModelMessageBus<NowPlayingMessage>,
bitmapProducer: ProduceBitmaps,
undoBackStack: UndoStack,
) {
val systemUiController = rememberSystemUiController()
DisposableEffect(systemUiController) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ import com.lasthopesoftware.bluewater.NavigateApplication
import com.lasthopesoftware.bluewater.R
import com.lasthopesoftware.bluewater.client.browsing.library.repository.SyncedFileLocation
import com.lasthopesoftware.bluewater.client.connection.trust.ProvideUserSslCertificates
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack
import com.lasthopesoftware.bluewater.shared.android.ui.components.BackButton
import com.lasthopesoftware.bluewater.shared.android.ui.components.ColumnMenuIcon
import com.lasthopesoftware.bluewater.shared.android.ui.components.GradientSide
Expand Down Expand Up @@ -686,10 +686,10 @@ private fun LibrarySettingsList(

@Composable
fun ServerTypeSelection(
librarySettingsViewModel: LibrarySettingsViewModel,
undoBackStack: BuildUndoBackStack,
modifier: Modifier = Modifier,
onServerTypeSelectionFinished: () -> Unit = {},
librarySettingsViewModel: LibrarySettingsViewModel,
undoBackStack: UndoStack,
modifier: Modifier = Modifier,
onServerTypeSelectionFinished: () -> Unit = {},
) {
val backAction = { onServerTypeSelectionFinished(); true.toPromise() }
undoBackStack.addAction(backAction)
Expand Down Expand Up @@ -769,11 +769,11 @@ fun ServerTypeSelection(
@OptIn(ExperimentalCoroutinesApi::class)
@Composable
fun LibrarySettingsView(
librarySettingsViewModel: LibrarySettingsViewModel,
navigateApplication: NavigateApplication,
stringResources: GetStringResources,
userSslCertificates: ProvideUserSslCertificates,
undoBackStack: BuildUndoBackStack,
librarySettingsViewModel: LibrarySettingsViewModel,
navigateApplication: NavigateApplication,
stringResources: GetStringResources,
userSslCertificates: ProvideUserSslCertificates,
undoBackStack: UndoStack,
) {
ControlSurface {
RemoveServerConfirmationDialog(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.list.ViewFileItem
import com.lasthopesoftware.bluewater.client.browsing.items.list.ItemListContentType
import com.lasthopesoftware.bluewater.client.stored.library.items.files.repository.StoredFile
import com.lasthopesoftware.bluewater.client.stored.library.sync.SyncIcon
import com.lasthopesoftware.bluewater.shared.android.BuildUndoBackStack
import com.lasthopesoftware.bluewater.shared.android.UndoStack
import com.lasthopesoftware.bluewater.shared.android.ui.components.BackButton
import com.lasthopesoftware.bluewater.shared.android.ui.components.GradientSide
import com.lasthopesoftware.bluewater.shared.android.ui.components.MarqueeText
Expand All @@ -78,10 +78,10 @@ private val boxHeight = expandedTitleHeight + appBarHeight
@OptIn(ExperimentalCoroutinesApi::class)
@Composable
fun ActiveFileDownloadsView(
activeFileDownloadsViewModel: ActiveFileDownloadsViewModel,
trackHeadlineViewModelProvider: PooledCloseablesViewModel<ViewFileItem>,
applicationNavigation: NavigateApplication,
undoBackStack: BuildUndoBackStack,
activeFileDownloadsViewModel: ActiveFileDownloadsViewModel,
trackHeadlineViewModelProvider: PooledCloseablesViewModel<ViewFileItem>,
applicationNavigation: NavigateApplication,
undoBackStack: UndoStack,
) {
@Composable
fun RenderTrackHeaderItem(storedFile: StoredFile) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@ package com.lasthopesoftware.bluewater.shared.android

import com.namehillsoftware.handoff.promises.Promise

interface BuildUndoBackStack {
interface UndoStack {
fun addAction(action: () -> Promise<Boolean>)
fun removeAction(action: () -> Promise<*>)
fun pop(): (() -> Promise<Boolean>)?
}
Original file line number Diff line number Diff line change
@@ -1,25 +1,17 @@
package com.lasthopesoftware.bluewater.shared.android

import androidx.lifecycle.ViewModel
import com.lasthopesoftware.bluewater.NavigateApplication
import com.lasthopesoftware.promises.extensions.toPromise
import com.namehillsoftware.handoff.promises.Promise
import java.util.Stack

class UndoStackApplicationNavigation(
private val undoStack: UndoStack,
private val inner: NavigateApplication,
) : ViewModel(), NavigateApplication by inner, BuildUndoBackStack {
private val backStack = Stack<() -> Promise<Boolean>>()

override fun addAction(action: () -> Promise<Boolean>) {
backStack.push(action)
}

override fun removeAction(action: () -> Promise<*>) {
backStack.remove(action)
}

) : NavigateApplication by inner {
override fun backOut(): Promise<Boolean> =
if (backStack.isNotEmpty()) backStack.pop()().eventually { if (it) it.toPromise() else backOut() }
else inner.backOut()
undoStack
.pop()
?.invoke()
?.eventually { if (it) it.toPromise() else backOut() }
?: inner.backOut()
}
Loading