@@ -12,17 +12,24 @@ import com.android.swingmusic.auth.domain.repository.AuthRepository
1212import com.android.swingmusic.core.data.util.Resource
1313import com.android.swingmusic.core.domain.util.SortBy
1414import com.android.swingmusic.core.domain.util.SortOrder
15+ import com.android.swingmusic.settings.domain.repository.AppSettingsRepository
1516import dagger.hilt.android.lifecycle.HiltViewModel
1617import kotlinx.coroutines.flow.MutableStateFlow
1718import kotlinx.coroutines.flow.StateFlow
19+ import kotlinx.coroutines.flow.asStateFlow
1820import kotlinx.coroutines.flow.collectLatest
21+ import kotlinx.coroutines.flow.combine
22+ import kotlinx.coroutines.flow.distinctUntilChanged
23+ import kotlinx.coroutines.flow.launchIn
24+ import kotlinx.coroutines.flow.onEach
1925import kotlinx.coroutines.launch
2026import javax.inject.Inject
2127
2228@HiltViewModel
2329class AllAlbumsViewModel @Inject constructor(
2430 private val artistRepository : AlbumRepository ,
25- private val authRepository : AuthRepository
31+ private val authRepository : AuthRepository ,
32+ private val settingsRepository : AppSettingsRepository
2633) : ViewModel() {
2734
2835 private val _baseUrl : MutableStateFlow <String ?> = MutableStateFlow (null )
@@ -43,6 +50,43 @@ class AllAlbumsViewModel @Inject constructor(
4350 Pair (SortBy .DURATION , " duration" ),
4451 )
4552
53+ // Settings
54+ init {
55+ settingsRepository.albumGridCount.onEach { gridCount ->
56+ _allAlbumsUiState .value = _allAlbumsUiState .value.copy(gridCount = gridCount)
57+ }.launchIn(viewModelScope)
58+
59+ combine(
60+ settingsRepository.albumSortOrder.distinctUntilChanged(),
61+ settingsRepository.albumSortBy.distinctUntilChanged()
62+ ) { sortOrder, sortBy ->
63+ val sortByPair = sortAlbumsByEntries.find { it.first == sortBy }
64+ ? : Pair (SortBy .LAST_PLAYED , " lastplayed" )
65+
66+ Pair (sortOrder, sortByPair)
67+ }.onEach { (sortOrder, sortByPair) ->
68+ _allAlbumsUiState .value = _allAlbumsUiState .value.copy(
69+ sortOrder = sortOrder,
70+ sortBy = sortByPair
71+ )
72+ getPagingAlbums(
73+ sortBy = sortByPair.second,
74+ sortOrder = sortOrder
75+ )
76+ }.launchIn(viewModelScope)
77+ }
78+
79+ init {
80+ getBaseUrl()
81+ getAlbumCount()
82+ }
83+
84+ private fun getBaseUrl () {
85+ viewModelScope.launch {
86+ _baseUrl .value = authRepository.getBaseUrl()
87+ }
88+ }
89+
4690 private fun getAlbumCount () {
4791 viewModelScope.launch {
4892 artistRepository.getAlbumCount().collectLatest {
@@ -66,64 +110,39 @@ class AllAlbumsViewModel @Inject constructor(
66110 }
67111 }
68112
69- init {
70- getBaseUrl()
71- }
72-
73-
74- private fun getBaseUrl () {
113+ private fun updateGridCount (count : Int ) {
75114 viewModelScope.launch {
76- _baseUrl .value = authRepository.getBaseUrl( )
115+ settingsRepository.setAlbumGridCount(count )
77116 }
78-
79117 }
80118
81- init {
82- getPagingAlbums(
83- sortBy = _allAlbumsUiState .value.sortBy.second,
84- sortOrder = _allAlbumsUiState .value.sortOrder
85- )
86- getAlbumCount()
87- }
88-
89-
90119 fun onAlbumsUiEvent (event : AlbumsUiEvent ) {
91120 when (event) {
92121 is AlbumsUiEvent .OnSortBy -> {
93- // Retry fetching artist count if the previous sorting resulted to Error
94- if (_allAlbumsUiState .value.totalAlbums is Resource .Error ) {
95- getAlbumCount()
96- }
97-
98- if (event.sortByPair == _allAlbumsUiState .value.sortBy) {
99- val newOrder = if (_allAlbumsUiState .value.sortOrder == SortOrder .ASCENDING )
100- SortOrder .DESCENDING else SortOrder .ASCENDING
101-
102- _allAlbumsUiState .value = _allAlbumsUiState .value.copy(sortOrder = newOrder)
103- getPagingAlbums(
104- sortBy = event.sortByPair.second,
105- sortOrder = newOrder
106- )
107- } else {
108- _allAlbumsUiState .value = _allAlbumsUiState .value.copy(
109- sortBy = event.sortByPair,
110- sortOrder = SortOrder .DESCENDING
111- )
112- getPagingAlbums(
113- sortBy = event.sortByPair.second,
114- sortOrder = SortOrder .DESCENDING
115- )
122+ viewModelScope.launch {
123+ // Retry fetching artist count if the previous sorting resulted to Error
124+ if (_allAlbumsUiState .value.totalAlbums is Resource .Error ) {
125+ getAlbumCount()
126+ }
127+
128+ if (event.sortByPair == _allAlbumsUiState .value.sortBy) {
129+ val newOrder = if (_allAlbumsUiState .value.sortOrder == SortOrder .ASCENDING )
130+ SortOrder .DESCENDING else SortOrder .ASCENDING
131+
132+ settingsRepository.setAlbumSortOrder(newOrder)
133+ } else {
134+ settingsRepository.setAlbumSortOrder(SortOrder .DESCENDING )
135+ settingsRepository.setAlbumSortBy(event.sortByPair.first)
136+ }
116137 }
117138 }
118139
119140 is AlbumsUiEvent .OnClickAlbum -> {
120- // TODO: Navigate from the UI (apparently not in the VM )
141+ // TODO: Navigate from the UI (handled by UI navigator )
121142 }
122143
123144 is AlbumsUiEvent .OnUpdateGridCount -> {
124- _allAlbumsUiState .value = _allAlbumsUiState .value.copy(
125- gridCount = event.newCount
126- )
145+ updateGridCount(event.newCount)
127146 }
128147
129148 is AlbumsUiEvent .OnRetry -> {
0 commit comments