Skip to content
This repository was archived by the owner on Feb 16, 2025. It is now read-only.

Commit d068013

Browse files
committed
Default audio quality as High instead of Very High in non-premium users.
1 parent 914d47c commit d068013

File tree

8 files changed

+104
-49
lines changed

8 files changed

+104
-49
lines changed

app/src/main/java/bruhcollective/itaysonlab/jetispot/core/SpConfigurationManager.kt

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import androidx.datastore.core.CorruptionException
55
import androidx.datastore.core.DataStore
66
import androidx.datastore.core.DataStoreFactory
77
import androidx.datastore.core.Serializer
8+
import bruhcollective.itaysonlab.jetispot.SpApp
89
import bruhcollective.itaysonlab.jetispot.proto.AppConfig
910
import bruhcollective.itaysonlab.jetispot.proto.AudioNormalization
1011
import bruhcollective.itaysonlab.jetispot.proto.AudioQuality
@@ -23,9 +24,11 @@ import javax.inject.Singleton
2324

2425
@Singleton
2526
class SpConfigurationManager @Inject constructor(
26-
@ApplicationContext private val appContext: Context
27+
@ApplicationContext private val appContext: Context,
2728
) {
2829
companion object {
30+
//get spSessionManager session
31+
private val spSessionManager = SpSessionManager(SpApp.context)
2932
val EMPTY = object: DataStore<AppConfig> {
3033
override val data: Flow<AppConfig> get() = emptyFlow()
3134
override suspend fun updateData(transform: suspend (t: AppConfig) -> AppConfig) = TODO("This is an empty DataStore!")
@@ -35,7 +38,7 @@ class SpConfigurationManager @Inject constructor(
3538
setPlayerConfig(PlayerConfig.newBuilder().apply {
3639
autoplay = true
3740
normalization = true
38-
preferredQuality = AudioQuality.VERY_HIGH
41+
preferredQuality = AudioQuality.HIGH
3942
normalizationLevel = AudioNormalization.BALANCED
4043
crossfade = 0
4144
preload = true

app/src/main/java/bruhcollective/itaysonlab/jetispot/core/util/SpUtils.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,4 +26,6 @@ object SpUtils {
2626

2727
fun getScannableUrl(uri: String) = "https://scannables.scdn.co/uri/800/$uri"
2828
fun getImageUrl(bytes: ByteString?) = if (bytes != null) "https://i.scdn.co/image/${Utils.bytesToHex(bytes).lowercase()}" else null
29+
//check if it's premium account
30+
2931
}

app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/dac/components_plans/FallbackPlanComponentBinder.kt

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@ import androidx.compose.foundation.layout.padding
66
import androidx.compose.material3.*
77
import androidx.compose.runtime.Composable
88
import androidx.compose.ui.Modifier
9+
import androidx.compose.ui.res.stringResource
910
import androidx.compose.ui.unit.dp
1011
import bruhcollective.itaysonlab.jetispot.ui.ext.compositeSurfaceElevation
1112
import bruhcollective.itaysonlab.jetispot.ui.shared.MediumText
1213
import com.spotify.planoverview.v1.FallbackPlanComponent
14+
import bruhcollective.itaysonlab.jetispot.R
1315

1416
@Composable
1517
fun FallbackPlanComponentBinder(
@@ -28,12 +30,16 @@ fun FallbackPlanComponentBinder(
2830
.fillMaxWidth()
2931
) {
3032
Column(modifier = Modifier.padding(16.dp)) {
31-
MediumText(modifier = Modifier,
32-
text = item.name)
33-
Divider()
34-
MediumText(modifier = Modifier,
35-
text = item.description)
36-
Text("Seems like you don't have an Spotify Account")
33+
MediumText(
34+
modifier = Modifier,
35+
text = item.name
36+
)
37+
Divider(modifier = Modifier.padding(top = 6.dp, bottom = 6.dp))
38+
MediumText(
39+
modifier = Modifier,
40+
text = item.description
41+
)
42+
Text(stringResource(id = R.string.plan_overview_fallback_plan))
3743
}
3844
}
3945
}

app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/auth/AuthScreen.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ import androidx.compose.ui.unit.dp
4747
import androidx.compose.ui.unit.sp
4848
import androidx.hilt.navigation.compose.hiltViewModel
4949
import bruhcollective.itaysonlab.jetispot.R
50+
import bruhcollective.itaysonlab.jetispot.proto.AudioQuality
5051
import bruhcollective.itaysonlab.jetispot.ui.ext.compositeSurfaceElevation
5152
import bruhcollective.itaysonlab.jetispot.ui.navigation.LocalNavigationController
5253
import bruhcollective.itaysonlab.jetispot.ui.screens.Dialog
@@ -68,6 +69,11 @@ fun AuthScreen(
6869
}
6970
}
7071

72+
fun onLoginSuccess(){
73+
navController.navigateAndClearStack(Screen.Feed)
74+
viewModel.updateAudioQualityIfPremium(AudioQuality.VERY_HIGH)
75+
}
76+
7177
val autofill = LocalAutofill.current
7278
val focusManager = LocalFocusManager.current
7379

@@ -173,7 +179,7 @@ fun AuthScreen(
173179
viewModel.auth(
174180
username = username,
175181
password = password,
176-
onSuccess = { navController.navigateAndClearStack(Screen.Feed) },
182+
onSuccess = { onLoginSuccess() },
177183
onFailure = setSnackbarContent,
178184
)
179185
},

app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/auth/AuthScreenViewModel.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,38 @@ import androidx.lifecycle.ViewModel
88
import androidx.lifecycle.viewModelScope
99
import bruhcollective.itaysonlab.jetispot.R
1010
import bruhcollective.itaysonlab.jetispot.core.SpAuthManager
11+
import bruhcollective.itaysonlab.jetispot.core.SpConfigurationManager
12+
import bruhcollective.itaysonlab.jetispot.core.SpSessionManager
13+
import bruhcollective.itaysonlab.jetispot.proto.AppConfig
14+
import bruhcollective.itaysonlab.jetispot.proto.AudioQuality
15+
import bruhcollective.itaysonlab.jetispot.ui.screens.config.QualityConfigScreenViewModel
1116
import dagger.hilt.android.lifecycle.HiltViewModel
1217
import kotlinx.coroutines.launch
1318
import javax.inject.Inject
19+
import bruhcollective.itaysonlab.jetispot.proto.PlayerConfig as PlayerConfig
1420

1521
@Stable
1622
@HiltViewModel
1723
class AuthScreenViewModel @Inject constructor(
1824
private val authManager: SpAuthManager,
1925
private val resources: Resources,
26+
private val spSessionManager: SpSessionManager,
27+
private val spConfigurationManager: SpConfigurationManager
2028
) : ViewModel() {
2129

2230
private val _isAuthInProgress = mutableStateOf(false)
2331
val isAuthInProgress: State<Boolean> = _isAuthInProgress
2432

33+
fun updateAudioQualityIfPremium(audioQuality: AudioQuality) {
34+
viewModelScope.launch {
35+
if (spSessionManager.session?.getUserAttribute("player-license") == "premium") {
36+
modifyDatastore {
37+
playerConfig = playerConfig.toBuilder().setPreferredQuality(audioQuality).build()
38+
}
39+
}
40+
}
41+
}
42+
2543
fun auth(
2644
username: String,
2745
password: String,
@@ -53,4 +71,9 @@ class AuthScreenViewModel @Inject constructor(
5371
_isAuthInProgress.value = false
5472
}
5573
}
74+
suspend fun modifyDatastore(runOnBuilder: AppConfig.Builder.() -> Unit) {
75+
spConfigurationManager.dataStore.updateData {
76+
it.toBuilder().apply(runOnBuilder).build()
77+
}
78+
}
5679
}

app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/config/QualityConfigScreen.kt

Lines changed: 53 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -8,55 +8,69 @@ import bruhcollective.itaysonlab.jetispot.core.SpConfigurationManager
88
import bruhcollective.itaysonlab.jetispot.core.SpSessionManager
99
import bruhcollective.itaysonlab.jetispot.proto.AppConfig
1010
import bruhcollective.itaysonlab.jetispot.proto.AudioQuality
11+
import com.spotify.pamviewservice.v1.proto.PremiumPlanRow
1112
import dagger.hilt.android.lifecycle.HiltViewModel
1213
import javax.inject.Inject
1314

1415
@Composable
1516
fun QualityConfigScreen(
16-
viewModel: QualityConfigScreenViewModel = hiltViewModel()
17+
viewModel: QualityConfigScreenViewModel = hiltViewModel()
1718
) {
18-
BaseConfigScreen(viewModel)
19+
BaseConfigScreen(viewModel)
1920
}
2021

2122
@HiltViewModel
2223
class QualityConfigScreenViewModel @Inject constructor(
23-
private val spSessionManager: SpSessionManager,
24-
private val spConfigurationManager: SpConfigurationManager
24+
private val spSessionManager: SpSessionManager,
25+
private val spConfigurationManager: SpConfigurationManager
2526
) : ViewModel(), ConfigViewModel {
26-
private val configList = buildList {
27-
add(ConfigItem.Radio(R.string.quality_low, R.string.quality_low_desc, {
28-
it.playerConfig.preferredQuality == AudioQuality.LOW
29-
}, { true }, {
30-
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.LOW).build()
31-
}))
32-
33-
add(ConfigItem.Radio(R.string.quality_normal, R.string.quality_normal_desc, {
34-
it.playerConfig.preferredQuality == AudioQuality.NORMAL
35-
}, { true }, {
36-
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.NORMAL).build()
37-
}))
38-
39-
add(ConfigItem.Radio(R.string.quality_high, R.string.quality_high_desc, {
40-
it.playerConfig.preferredQuality == AudioQuality.HIGH
41-
}, { true }, {
42-
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.HIGH).build()
43-
}))
44-
45-
add(ConfigItem.Radio(R.string.quality_very_high, R.string.quality_very_high_desc, {
46-
it.playerConfig.preferredQuality == AudioQuality.VERY_HIGH
47-
}, { true }, {
48-
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.VERY_HIGH).build()
49-
}))
50-
51-
add(ConfigItem.Info(R.string.warn_quality))
52-
}
53-
54-
override fun provideTitle() = R.string.config_pbquality
55-
override fun provideDataStore() = spConfigurationManager.dataStore
56-
override fun provideConfigList() = configList
57-
override suspend fun modifyDatastore (runOnBuilder: AppConfig.Builder.() -> Unit) {
58-
spConfigurationManager.dataStore.updateData {
59-
it.toBuilder().apply(runOnBuilder).build()
27+
28+
suspend fun updateAudioQuality(audioQuality: AudioQuality) {
29+
kotlin.run {
30+
modifyDatastore {
31+
playerConfig = playerConfig.toBuilder().setPreferredQuality(audioQuality).build()
32+
}
33+
}
34+
}
35+
36+
private val configList = buildList {
37+
add(ConfigItem.Radio(R.string.quality_low, R.string.quality_low_desc, {
38+
it.playerConfig.preferredQuality == AudioQuality.LOW
39+
}, { true }, {
40+
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.LOW).build()
41+
}))
42+
43+
add(ConfigItem.Radio(R.string.quality_normal, R.string.quality_normal_desc, {
44+
it.playerConfig.preferredQuality == AudioQuality.NORMAL
45+
}, { true }, {
46+
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.NORMAL).build()
47+
}))
48+
49+
add(ConfigItem.Radio(R.string.quality_high, R.string.quality_high_desc, {
50+
it.playerConfig.preferredQuality == AudioQuality.HIGH
51+
}, { true }, {
52+
playerConfig = playerConfig.toBuilder().setPreferredQuality(AudioQuality.HIGH).build()
53+
}))
54+
55+
//if the user doesn't have premium, don't show the option to select very high quality
56+
if (spSessionManager.session?.getUserAttribute("player-license") == "premium") {
57+
add(ConfigItem.Radio(R.string.quality_very_high, R.string.quality_very_high_desc, {
58+
it.playerConfig.preferredQuality == AudioQuality.VERY_HIGH
59+
}, { true }, {
60+
playerConfig =
61+
playerConfig.toBuilder().setPreferredQuality(AudioQuality.VERY_HIGH).build()
62+
}))
63+
}
64+
65+
add(ConfigItem.Info(R.string.warn_quality))
66+
}
67+
68+
override fun provideTitle() = R.string.config_pbquality
69+
override fun provideDataStore() = spConfigurationManager.dataStore
70+
override fun provideConfigList() = configList
71+
override suspend fun modifyDatastore(runOnBuilder: AppConfig.Builder.() -> Unit) {
72+
spConfigurationManager.dataStore.updateData {
73+
it.toBuilder().apply(runOnBuilder).build()
74+
}
6075
}
61-
}
6276
}

app/src/main/java/bruhcollective/itaysonlab/jetispot/ui/screens/nowplaying/NowPlayingViewModel.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ class NowPlayingViewModel @Inject constructor(
121121

122122
fun getHeaderText(): String {
123123
return when {
124-
currentContextUri.value.contains("collection") -> SpApp.context.getString(R.string.liked_songs) // TODO: to R.string
124+
currentContextUri.value.contains("collection") -> SpApp.context.getString(R.string.liked_songs)
125125
else -> currentContext.value
126126
}
127127
}

app/src/main/res/values/strings.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -171,4 +171,5 @@
171171
<string name="likes_dot">"likes • "</string>
172172
<string name="no_lyrics">Ups, seems like this song have no lyrics…</string>
173173
<string name="language">Language</string>
174+
<string name="plan_overview_fallback_plan">Seems like you don\'t have an Spotify Account.</string>
174175
</resources>

0 commit comments

Comments
 (0)