Skip to content

Commit

Permalink
Merge pull request #43 from techmaved/feature/ui
Browse files Browse the repository at this point in the history
Redo authentication UX
  • Loading branch information
techmaved authored Jan 13, 2024
2 parents 5b04af6 + dd103d9 commit 2e9ba8a
Show file tree
Hide file tree
Showing 6 changed files with 144 additions and 68 deletions.
1 change: 1 addition & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -148,4 +148,5 @@ dependencies {
implementation("com.mikepenz:iconics-core:5.4.0")
implementation("com.mikepenz:iconics-compose:5.4.0")
implementation("com.mikepenz:fontawesome-typeface:5.9.0.2-kotlin@aar")
implementation("androidx.datastore:datastore-preferences:1.0.0")
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,14 @@ import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import de.techmaved.mediabrowserforspotify.components.Authentication
import de.techmaved.mediabrowserforspotify.components.AppBarWithContainer
import de.techmaved.mediabrowserforspotify.components.Database
import de.techmaved.mediabrowserforspotify.components.Info
import de.techmaved.mediabrowserforspotify.components.MediaItems
import de.techmaved.mediabrowserforspotify.components.SpotifyDesign
import de.techmaved.mediabrowserforspotify.models.Model
import de.techmaved.mediabrowserforspotify.ui.theme.MediaBrowserForSpotifyTheme


class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
Expand Down Expand Up @@ -60,17 +59,18 @@ class MainActivity : ComponentActivity() {
fun Ui(activity: MainActivity?, isAuthenticated: Boolean, isSpotifyInstalled: Boolean) {
val mediaItemCount = remember { mutableStateOf(0) }

Column(
modifier = Modifier.padding(start = 16.dp, end = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Authentication().SpotifyAuthSection(isAuthenticated, activity)
Database().MediaItemsInDatabase(mediaItemCount)
MediaItems().TextWithButtons(mediaItemCount, isAuthenticated)
MediaItems().MirrorSection(isAuthenticated)
SpotifyDesign().LinkToSpotify(isSpotifyInstalled, activity)
Info().getInfo()
AppBarWithContainer(activity, isAuthenticated) {
Column(
modifier = Modifier.padding(start = 16.dp, end = 16.dp),
horizontalAlignment = Alignment.CenterHorizontally,
verticalArrangement = Arrangement.spacedBy(16.dp)
) {
Database().MediaItemsInDatabase(mediaItemCount)
MediaItems().TextWithButtons(mediaItemCount, isAuthenticated)
MediaItems().MirrorSection(isAuthenticated)
SpotifyDesign().LinkToSpotify(isSpotifyInstalled, activity)
Info().getInfo()
}
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ import com.adamratzman.spotify.SpotifyScope
import de.techmaved.mediabrowserforspotify.BuildConfig
import de.techmaved.mediabrowserforspotify.MyApplication
import de.techmaved.mediabrowserforspotify.activities.MainActivity
import de.techmaved.mediabrowserforspotify.utils.Store
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch

internal var pkceClassBackTo: Class<out Activity>? = null

Expand All @@ -19,6 +23,12 @@ class SpotifyPkceLoginActivityImpl : AbstractSpotifyPkceLoginActivity() {
override fun onSuccess(api: SpotifyClientApi) {
val model = (application as MyApplication).model
model.credentialStore.setSpotifyApi(api)

CoroutineScope(Dispatchers.IO).launch {
val store = Store(applicationContext)
store.saveUsername(api.getUserId())
}

val classBackTo = pkceClassBackTo ?: MainActivity::class.java
startActivity(Intent(this, classBackTo))
}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package de.techmaved.mediabrowserforspotify.components

import androidx.compose.foundation.layout.Column
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.twotone.AccountCircle
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.Icon
import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Scaffold
import androidx.compose.material3.Surface
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.ui.Modifier
import androidx.compose.ui.input.nestedscroll.nestedScroll
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import com.adamratzman.spotify.auth.pkce.startSpotifyClientPkceLoginActivity
import de.techmaved.mediabrowserforspotify.R
import de.techmaved.mediabrowserforspotify.activities.MainActivity
import de.techmaved.mediabrowserforspotify.auth.SpotifyPkceLoginActivityImpl
import de.techmaved.mediabrowserforspotify.auth.pkceClassBackTo
import de.techmaved.mediabrowserforspotify.utils.Store

@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun AppBarWithContainer(
activity: MainActivity?,
isAuthenticated: Boolean,
content: @Composable () -> Unit
) {
val context = LocalContext.current
val store = Store(context)
val userName = store.getUserName.collectAsState(initial = "")
val scrollBehavior = TopAppBarDefaults.enterAlwaysScrollBehavior()

Surface(
modifier = Modifier.fillMaxSize(),
color = MaterialTheme.colorScheme.background
) {
Scaffold(
modifier = Modifier
.fillMaxSize()
.nestedScroll(scrollBehavior.nestedScrollConnection),
topBar = {
TopAppBar(
title = {
if (!isAuthenticated) {
Text(
text = stringResource(id = R.string.app_name)
)

return@TopAppBar
}

Text(
text = "Welcome ${userName.value}"
)
},
navigationIcon = {

},
actions = {
IconButton(onClick = {
pkceClassBackTo = MainActivity::class.java
activity?.startSpotifyClientPkceLoginActivity(
SpotifyPkceLoginActivityImpl::class.java)
}) {
Icon(
imageVector = Icons.TwoTone.AccountCircle,
contentDescription = "Login with Spotify"
)
}
},
scrollBehavior = scrollBehavior,
)
}
) { values ->
Column(
modifier = Modifier
.fillMaxSize()
.padding(values)
) {
content()
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package de.techmaved.mediabrowserforspotify.utils

import android.content.Context
import androidx.datastore.core.DataStore
import androidx.datastore.preferences.core.Preferences
import androidx.datastore.preferences.core.edit
import androidx.datastore.preferences.core.stringPreferencesKey
import androidx.datastore.preferences.preferencesDataStore
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map

class Store(private val context: Context) {
companion object {
private val Context.dataStore: DataStore<Preferences> by preferencesDataStore("store")
private val USER_NAME_KEY = stringPreferencesKey("userName")
}

val getUserName: Flow<String> = context.dataStore.data.map { preferences ->
preferences[USER_NAME_KEY] ?: ""
}

suspend fun saveUsername(userName: String) {
context.dataStore.edit { preferences ->
preferences[USER_NAME_KEY] = userName
}
}
}

0 comments on commit 2e9ba8a

Please sign in to comment.