Skip to content

Commit 3f6a696

Browse files
authored
Merge pull request #96 from swingmx/settings
`settings:` Add Grid Count and Sort Settings
2 parents 80c665f + 290a5d0 commit 3f6a696

20 files changed

Lines changed: 521 additions & 97 deletions

File tree

app/src/main/AndroidManifest.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<uses-permission android:name="android.permission.INTERNET" />
66
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
77
<uses-permission android:name="android.permission.FOREGROUND_SERVICE_MEDIA_PLAYBACK" />
8-
<uses-permission android:name="android.permission.WAKE_LOCK"/>
8+
<uses-permission android:name="android.permission.WAKE_LOCK" tools:node="replace"/>
99
<uses-permission android:name="android.permission.VIBRATE" />
1010

1111
<application

auth/build.gradle.kts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ dependencies {
7171
implementation("com.squareup.retrofit2:converter-gson:2.9.0")
7272
implementation("com.squareup.okhttp3:logging-interceptor:4.5.0")
7373

74+
// Chucker
75+
debugImplementation("com.github.chuckerteam.chucker:library:4.0.0")
76+
releaseImplementation("com.github.chuckerteam.chucker:library-no-op:4.0.0")
77+
7478
// Hilt DI
7579
implementation("com.google.dagger:hilt-android:2.50")
7680
ksp("com.google.dagger:hilt-android-compiler:2.50")

auth/src/main/java/com/android/swingmusic/auth/data/di/AuthModule.kt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import android.content.Context
55
import com.android.swingmusic.auth.data.api.service.AuthApiService
66
import com.android.swingmusic.auth.data.datastore.AuthTokensDataStore
77
import com.android.swingmusic.database.data.dao.BaseUrlDao
8+
import com.chuckerteam.chucker.api.ChuckerInterceptor
89
import dagger.Module
910
import dagger.Provides
1011
import dagger.hilt.InstallIn
@@ -33,10 +34,13 @@ object AuthModule {
3334

3435
@Provides
3536
@Singleton
36-
fun providesOkHttpClient(): OkHttpClient {
37+
fun providesOkHttpClient(
38+
@ApplicationContext context: Context
39+
): OkHttpClient {
3740
val interceptor = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
3841
return OkHttpClient.Builder()
3942
.addInterceptor(interceptor)
43+
.addInterceptor(ChuckerInterceptor(context))
4044
.callTimeout(15, TimeUnit.SECONDS)
4145
.connectTimeout(15, TimeUnit.SECONDS)
4246
.writeTimeout(15, TimeUnit.SECONDS)

feature/album/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ dependencies {
4848
implementation(project(":uicomponent"))
4949
implementation(project(":feature:player"))
5050
implementation(project(":feature:artist"))
51+
implementation(project(":feature:settings"))
5152
// Common
5253
implementation(project(":feature:common"))
5354

feature/album/src/main/java/com/android/swingmusic/album/presentation/viewmodel/AllAlbumsViewModel.kt

Lines changed: 64 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,24 @@ import com.android.swingmusic.auth.domain.repository.AuthRepository
1212
import com.android.swingmusic.core.data.util.Resource
1313
import com.android.swingmusic.core.domain.util.SortBy
1414
import com.android.swingmusic.core.domain.util.SortOrder
15+
import com.android.swingmusic.settings.domain.repository.AppSettingsRepository
1516
import dagger.hilt.android.lifecycle.HiltViewModel
1617
import kotlinx.coroutines.flow.MutableStateFlow
1718
import kotlinx.coroutines.flow.StateFlow
19+
import kotlinx.coroutines.flow.asStateFlow
1820
import 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
1925
import kotlinx.coroutines.launch
2026
import javax.inject.Inject
2127

2228
@HiltViewModel
2329
class 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 -> {

feature/artist/build.gradle.kts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ dependencies {
4848
implementation(project(":network"))
4949
implementation(project(":uicomponent"))
5050
implementation(project(":feature:player"))
51+
implementation(project(":feature:settings"))
5152
// Common Feature
5253
implementation(project(":feature:common"))
5354

0 commit comments

Comments
 (0)