Skip to content

Commit 1b1f235

Browse files
authored
Merge pull request #590 from namehillsoftware/bugfix/ensure-browser-is-on-stack
[Bugfix] Ensure Browser is on Navigation Stack
2 parents 5023e07 + f1ccced commit 1b1f235

File tree

42 files changed

+422
-185
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+422
-185
lines changed

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/NavigateApplication.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.lasthopesoftware.bluewater
22

3-
import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile
43
import com.lasthopesoftware.bluewater.client.browsing.files.properties.FileProperty
54
import com.lasthopesoftware.bluewater.client.browsing.items.IItem
65
import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId
@@ -19,7 +18,9 @@ interface NavigateApplication {
1918

2019
fun viewServerSettings(libraryId: LibraryId) = Unit.toPromise()
2120

22-
fun viewFileDetails(libraryId: LibraryId, files: List<ServiceFile>, position: Int) = Unit.toPromise()
21+
fun viewFileDetails(libraryId: LibraryId, searchQuery: String, positionedFile: PositionedFile) = Unit.toPromise()
22+
23+
fun viewFileDetails(libraryId: LibraryId, item: IItem?, positionedFile: PositionedFile) = Unit.toPromise()
2324

2425
fun viewNowPlayingFileDetails(libraryId: LibraryId, positionedFile: PositionedFile) = Unit.toPromise()
2526

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/HandheldApplication.kt

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ import com.lasthopesoftware.bluewater.client.browsing.files.details.FileDetailsV
4343
import com.lasthopesoftware.bluewater.client.browsing.files.properties.LibraryFilePropertiesDependentsRegistry
4444
import com.lasthopesoftware.bluewater.client.browsing.navigation.ActiveLibraryDownloadsScreen
4545
import com.lasthopesoftware.bluewater.client.browsing.navigation.ApplicationSettingsScreen
46+
import com.lasthopesoftware.bluewater.client.browsing.navigation.BrowsedFileDetailsScreen
4647
import com.lasthopesoftware.bluewater.client.browsing.navigation.BrowserLibraryDestination
4748
import com.lasthopesoftware.bluewater.client.browsing.navigation.ConnectionSettingsScreen
4849
import com.lasthopesoftware.bluewater.client.browsing.navigation.Destination
@@ -51,11 +52,11 @@ import com.lasthopesoftware.bluewater.client.browsing.navigation.FileDetailsFrom
5152
import com.lasthopesoftware.bluewater.client.browsing.navigation.HiddenSettingsScreen
5253
import com.lasthopesoftware.bluewater.client.browsing.navigation.LibraryDestination
5354
import com.lasthopesoftware.bluewater.client.browsing.navigation.LibraryMenu
54-
import com.lasthopesoftware.bluewater.client.browsing.navigation.ListedFileDetailsScreen
5555
import com.lasthopesoftware.bluewater.client.browsing.navigation.NavigateToLibraryDestination
5656
import com.lasthopesoftware.bluewater.client.browsing.navigation.NewConnectionSettingsScreen
5757
import com.lasthopesoftware.bluewater.client.browsing.navigation.NowPlayingScreen
5858
import com.lasthopesoftware.bluewater.client.browsing.navigation.RoutedNavigationDependencies
59+
import com.lasthopesoftware.bluewater.client.browsing.navigation.SearchedFileDetailsScreen
5960
import com.lasthopesoftware.bluewater.client.browsing.navigation.SelectedLibraryReRouter
6061
import com.lasthopesoftware.bluewater.client.browsing.registerBackNav
6162
import com.lasthopesoftware.bluewater.client.connection.ConnectionLostExceptionFilter
@@ -213,8 +214,8 @@ fun LibraryDestination.Navigate(
213214
)
214215
}
215216

216-
is ListedFileDetailsScreen -> {
217-
val viewModel = listedFileDetailsViewModel
217+
is BrowsedFileDetailsScreen -> {
218+
val viewModel = browsedFileDetailsViewModel
218219

219220
FileDetailsView(
220221
viewModel = viewModel,
@@ -223,7 +224,20 @@ fun LibraryDestination.Navigate(
223224
playableFileDetailsState = viewModel,
224225
)
225226

226-
viewModel.load(libraryId, files, position)
227+
viewModel.load(libraryId, item, positionedFile)
228+
}
229+
230+
is SearchedFileDetailsScreen -> {
231+
val viewModel = searchedFileDetailsViewModel
232+
233+
FileDetailsView(
234+
viewModel = viewModel,
235+
navigateApplication = applicationNavigation,
236+
bitmapProducer = bitmapProducer,
237+
playableFileDetailsState = viewModel,
238+
)
239+
240+
viewModel.load(libraryId, query, positionedFile)
227241
}
228242

229243
is FileDetailsFromNowPlayingScreen -> {

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/ScopedViewModelDependencies.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
package com.lasthopesoftware.bluewater.client.browsing
22

3-
import com.lasthopesoftware.bluewater.client.browsing.files.details.FileDetailsFromItemViewModel
3+
import com.lasthopesoftware.bluewater.client.browsing.files.details.BrowsedFileDetailsViewModel
44
import com.lasthopesoftware.bluewater.client.browsing.files.details.FileDetailsViewModel
5-
import com.lasthopesoftware.bluewater.client.browsing.files.details.ListedFileDetailsViewModel
65
import com.lasthopesoftware.bluewater.client.browsing.files.details.NowPlayingFileDetailsViewModel
6+
import com.lasthopesoftware.bluewater.client.browsing.files.details.SearchedFileDetailsViewModel
77
import com.lasthopesoftware.bluewater.client.browsing.files.list.FileListViewModel
88
import com.lasthopesoftware.bluewater.client.browsing.files.list.search.SearchFilesViewModel
99
import com.lasthopesoftware.bluewater.client.browsing.items.LoadItemData
@@ -23,8 +23,8 @@ interface ScopedViewModelDependencies : ReusedViewModelDependencies {
2323
val searchFilesViewModel: SearchFilesViewModel
2424
val librarySettingsViewModel: LibrarySettingsViewModel
2525
val fileDetailsViewModel: FileDetailsViewModel
26-
val fileDetailsFromItemViewModel: FileDetailsFromItemViewModel
27-
val listedFileDetailsViewModel: ListedFileDetailsViewModel
26+
val browsedFileDetailsViewModel: BrowsedFileDetailsViewModel
27+
val searchedFileDetailsViewModel: SearchedFileDetailsViewModel
2828
val nowPlayingFileDetailsViewModel: NowPlayingFileDetailsViewModel
2929
val undoBackStackBuilder: UndoStack
3030
}

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/ScopedViewModelRegistry.kt

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.lasthopesoftware.bluewater.client.browsing
22

33
import androidx.lifecycle.ViewModelStoreOwner
4-
import com.lasthopesoftware.bluewater.client.browsing.files.details.FileDetailsFromItemViewModel
4+
import com.lasthopesoftware.bluewater.client.browsing.files.details.BrowsedFileDetailsViewModel
55
import com.lasthopesoftware.bluewater.client.browsing.files.details.FileDetailsViewModel
6-
import com.lasthopesoftware.bluewater.client.browsing.files.details.ListedFileDetailsViewModel
76
import com.lasthopesoftware.bluewater.client.browsing.files.details.NowPlayingFileDetailsViewModel
7+
import com.lasthopesoftware.bluewater.client.browsing.files.details.SearchedFileDetailsViewModel
88
import com.lasthopesoftware.bluewater.client.browsing.files.list.FileListViewModel
99
import com.lasthopesoftware.bluewater.client.browsing.files.list.search.SearchFilesViewModel
1010
import com.lasthopesoftware.bluewater.client.browsing.items.AggregateItemViewModel
@@ -81,19 +81,20 @@ class ScopedViewModelRegistry(
8181
)
8282
}
8383

84-
override val fileDetailsFromItemViewModel by viewModelStoreOwner.buildViewModelLazily {
85-
FileDetailsFromItemViewModel(
86-
playbackLibraryItems,
84+
override val browsedFileDetailsViewModel by viewModelStoreOwner.buildViewModelLazily {
85+
BrowsedFileDetailsViewModel(
86+
playbackServiceController,
8787
fileDetailsViewModel,
8888
fileDetailsViewModel,
89+
libraryFilesProvider,
8990
)
9091
}
91-
92-
override val listedFileDetailsViewModel by viewModelStoreOwner.buildViewModelLazily {
93-
ListedFileDetailsViewModel(
92+
override val searchedFileDetailsViewModel by viewModelStoreOwner.buildViewModelLazily {
93+
SearchedFileDetailsViewModel(
9494
playbackServiceController,
9595
fileDetailsViewModel,
9696
fileDetailsViewModel,
97+
libraryFilesProvider,
9798
)
9899
}
99100

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/files/access/LibraryFileProvider.kt

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,20 +14,20 @@ class LibraryFileProvider(private val libraryConnections: ProvideLibraryConnecti
1414
override fun promiseFiles(libraryId: LibraryId): Promise<List<ServiceFile>> =
1515
libraryConnections
1616
.promiseLibraryConnection(libraryId)
17-
.eventuallyFromDataAccess { it?.promiseFiles().keepPromise(emptyList()) }
17+
.eventuallyFromDataAccess { it?.promiseFiles().keepPromise { emptyList() } }
1818

1919
override fun promiseFiles(libraryId: LibraryId, itemId: ItemId): Promise<List<ServiceFile>> =
2020
libraryConnections
2121
.promiseLibraryConnection(libraryId)
22-
.eventuallyFromDataAccess { it?.promiseFiles(itemId).keepPromise(emptyList()) }
22+
.eventuallyFromDataAccess { it?.promiseFiles(itemId).keepPromise { emptyList() } }
2323

2424
override fun promiseFiles(libraryId: LibraryId, playlistId: PlaylistId): Promise<List<ServiceFile>> =
2525
libraryConnections
2626
.promiseLibraryConnection(libraryId)
27-
.eventuallyFromDataAccess { it?.promiseFiles(playlistId).keepPromise(emptyList()) }
27+
.eventuallyFromDataAccess { it?.promiseFiles(playlistId).keepPromise { emptyList() } }
2828

2929
override fun promiseAudioFiles(libraryId: LibraryId, query: String): Promise<List<ServiceFile>> =
3030
libraryConnections
3131
.promiseLibraryConnection(libraryId)
32-
.eventuallyFromDataAccess { it?.promiseFiles(query).keepPromise(emptyList()) }
32+
.eventuallyFromDataAccess { it?.promiseFiles(query).keepPromise { emptyList() } }
3333
}

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/files/cached/DiskFileCache.kt

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,10 @@ import com.lasthopesoftware.bluewater.repository.RepositoryAccessHelper
1414
import com.lasthopesoftware.bluewater.shared.lazyLogger
1515
import com.lasthopesoftware.promises.extensions.keepPromise
1616
import com.lasthopesoftware.promises.extensions.preparePromise
17+
import com.lasthopesoftware.resources.closables.eventuallyUse
1718
import com.lasthopesoftware.resources.executors.ThreadPools
1819
import com.lasthopesoftware.resources.executors.ThreadPools.promiseTableMessage
1920
import com.namehillsoftware.handoff.promises.Promise
20-
import com.namehillsoftware.handoff.promises.response.ImmediateAction
2121
import java.io.File
2222
import java.io.IOException
2323

@@ -35,7 +35,11 @@ class DiskFileCache(
3535
override fun put(libraryId: LibraryId, uniqueKey: String, fileData: ByteArray): Promise<CachedFile?> {
3636
val putPromise = cacheStreamSupplier
3737
.promiseCachedFileOutputStream(libraryId, uniqueKey)
38-
.eventually { cachedFileOutputStream -> writeCachedFileWithRetries(libraryId, uniqueKey, cachedFileOutputStream, fileData) }
38+
.eventually { cachedFileOutputStream ->
39+
cachedFileOutputStream.eventuallyUse {
40+
writeCachedFileWithRetries(libraryId, uniqueKey, cachedFileOutputStream, fileData)
41+
}
42+
}
3943

4044
putPromise.excuse { e ->
4145
logger.error("There was an error putting the cached file with the unique key $uniqueKey into the cache.", e)
@@ -72,7 +76,6 @@ class DiskFileCache(
7276
else -> Promise.empty()
7377
}
7478
})
75-
.must(ImmediateAction{ cachedFileOutputStream.close() })
7679
}
7780

7881
override fun promiseCachedFile(libraryId: LibraryId, uniqueKey: String): Promise<File?> {
@@ -126,7 +129,7 @@ class DiskFileCache(
126129
}
127130

128131
private fun deleteCachedFile(cachedFileId: Long): Promise<Long> =
129-
promiseTableMessage<Long> {
132+
promiseTableMessage {
130133
RepositoryAccessHelper(context).use { repositoryAccessHelper ->
131134
try {
132135
repositoryAccessHelper.beginTransaction().use { closeableTransaction ->

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/files/cached/stream/CacheOutputStream.kt

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,8 @@ import com.lasthopesoftware.bluewater.client.browsing.files.cached.repository.Ca
44
import com.lasthopesoftware.resources.io.PromisingOutputStream
55
import com.namehillsoftware.handoff.promises.Promise
66
import okio.BufferedSource
7-
import java.io.Closeable
87

9-
interface CacheOutputStream : PromisingOutputStream<CacheOutputStream>, Closeable {
8+
interface CacheOutputStream : PromisingOutputStream<CacheOutputStream> {
109
fun promiseTransfer(bufferedSource: BufferedSource): Promise<CacheOutputStream>
1110
fun commitToCache(): Promise<CachedFile?>
1211
}

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/files/cached/stream/CachedFileOutputStream.kt

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package com.lasthopesoftware.bluewater.client.browsing.files.cached.stream
33
import com.lasthopesoftware.bluewater.client.browsing.files.cached.persistence.IDiskFileCachePersistence
44
import com.lasthopesoftware.bluewater.client.browsing.files.cached.repository.CachedFile
55
import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId
6+
import com.lasthopesoftware.promises.extensions.guaranteedUnitResponse
67
import com.lasthopesoftware.promises.extensions.preparePromise
78
import com.lasthopesoftware.resources.executors.ThreadPools
89
import com.namehillsoftware.handoff.promises.Promise
@@ -54,8 +55,10 @@ class CachedFileOutputStream(
5455
if (!isClosed) diskFileCachePersistence.putIntoDatabase(libraryId, uniqueKey, file)
5556
else Promise.empty()
5657

57-
override fun close() {
58-
isClosed = true
59-
if (lazyFileOutputStream.isInitialized()) lazyFileOutputStream.value.close()
58+
override fun promiseClose(): Promise<Unit> {
59+
return flush().must { _ ->
60+
isClosed = true
61+
if (lazyFileOutputStream.isInitialized()) lazyFileOutputStream.value.close()
62+
}.guaranteedUnitResponse()
6063
}
6164
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.lasthopesoftware.bluewater.client.browsing.files.details
2+
3+
import com.lasthopesoftware.bluewater.client.browsing.files.ServiceFile
4+
import com.lasthopesoftware.bluewater.client.browsing.files.access.ProvideLibraryFiles
5+
import com.lasthopesoftware.bluewater.client.browsing.items.IItem
6+
import com.lasthopesoftware.bluewater.client.browsing.items.Item
7+
import com.lasthopesoftware.bluewater.client.browsing.items.ItemId
8+
import com.lasthopesoftware.bluewater.client.browsing.items.playlists.Playlist
9+
import com.lasthopesoftware.bluewater.client.browsing.library.repository.LibraryId
10+
import com.lasthopesoftware.bluewater.client.playback.service.ControlPlaybackService
11+
import com.namehillsoftware.handoff.promises.Promise
12+
13+
class BrowsedFileDetailsViewModel(
14+
playbackController: ControlPlaybackService,
15+
loadFileDetailsState: LoadFileDetailsState,
16+
fileDetailsState: FileDetailsState,
17+
private val itemFileProvider: ProvideLibraryFiles,
18+
) : ListedFileDetailsViewModel<IItem?>(
19+
playbackController,
20+
loadFileDetailsState,
21+
fileDetailsState,
22+
) {
23+
override fun promiseFiles(libraryId: LibraryId, item: IItem?): Promise<List<ServiceFile>> = when (item) {
24+
is Item -> itemFileProvider.promiseFiles(libraryId, ItemId(item.key))
25+
is Playlist -> itemFileProvider.promiseFiles(libraryId, item.itemId)
26+
else -> itemFileProvider.promiseFiles(libraryId)
27+
}
28+
}

projectBlueWater/src/main/java/com/lasthopesoftware/bluewater/client/browsing/files/details/FileDetailsFromItemViewModel.kt

Lines changed: 0 additions & 34 deletions
This file was deleted.

0 commit comments

Comments
 (0)