From f22d54f0c95b639ed0a4053b29d2914c4375fb4e Mon Sep 17 00:00:00 2001 From: Armin Burger Date: Sat, 13 Jan 2024 16:59:32 +0100 Subject: [PATCH 1/2] add data store for saving user name --- app/build.gradle.kts | 1 + .../auth/SpotifyPkceLoginActivityImpl.kt | 10 +++++++ .../mediabrowserforspotify/utils/Store.kt | 27 +++++++++++++++++++ 3 files changed, 38 insertions(+) create mode 100644 app/src/main/java/de/techmaved/mediabrowserforspotify/utils/Store.kt diff --git a/app/build.gradle.kts b/app/build.gradle.kts index ddb4a1a..d83b683 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -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") } \ No newline at end of file diff --git a/app/src/main/java/de/techmaved/mediabrowserforspotify/auth/SpotifyPkceLoginActivityImpl.kt b/app/src/main/java/de/techmaved/mediabrowserforspotify/auth/SpotifyPkceLoginActivityImpl.kt index f649f59..20fb130 100644 --- a/app/src/main/java/de/techmaved/mediabrowserforspotify/auth/SpotifyPkceLoginActivityImpl.kt +++ b/app/src/main/java/de/techmaved/mediabrowserforspotify/auth/SpotifyPkceLoginActivityImpl.kt @@ -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? = null @@ -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)) } diff --git a/app/src/main/java/de/techmaved/mediabrowserforspotify/utils/Store.kt b/app/src/main/java/de/techmaved/mediabrowserforspotify/utils/Store.kt new file mode 100644 index 0000000..6514f9b --- /dev/null +++ b/app/src/main/java/de/techmaved/mediabrowserforspotify/utils/Store.kt @@ -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 by preferencesDataStore("store") + private val USER_NAME_KEY = stringPreferencesKey("userName") + } + + val getUserName: Flow = context.dataStore.data.map { preferences -> + preferences[USER_NAME_KEY] ?: "" + } + + suspend fun saveUsername(userName: String) { + context.dataStore.edit { preferences -> + preferences[USER_NAME_KEY] = userName + } + } +} \ No newline at end of file From dd103d95f0af9b41c8cb67762c5bfd8b090fef7a Mon Sep 17 00:00:00 2001 From: Armin Burger Date: Sat, 13 Jan 2024 17:00:25 +0100 Subject: [PATCH 2/2] adds app bar to authenticate --- .../activities/MainActivity.kt | 26 +++--- .../components/Authentication.kt | 55 ----------- .../components/utilities.kt | 93 +++++++++++++++++++ 3 files changed, 106 insertions(+), 68 deletions(-) delete mode 100644 app/src/main/java/de/techmaved/mediabrowserforspotify/components/Authentication.kt create mode 100644 app/src/main/java/de/techmaved/mediabrowserforspotify/components/utilities.kt diff --git a/app/src/main/java/de/techmaved/mediabrowserforspotify/activities/MainActivity.kt b/app/src/main/java/de/techmaved/mediabrowserforspotify/activities/MainActivity.kt index 42c0fbe..57177bb 100644 --- a/app/src/main/java/de/techmaved/mediabrowserforspotify/activities/MainActivity.kt +++ b/app/src/main/java/de/techmaved/mediabrowserforspotify/activities/MainActivity.kt @@ -17,7 +17,7 @@ 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 @@ -25,7 +25,6 @@ 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) @@ -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() + } } } diff --git a/app/src/main/java/de/techmaved/mediabrowserforspotify/components/Authentication.kt b/app/src/main/java/de/techmaved/mediabrowserforspotify/components/Authentication.kt deleted file mode 100644 index 9c04e0b..0000000 --- a/app/src/main/java/de/techmaved/mediabrowserforspotify/components/Authentication.kt +++ /dev/null @@ -1,55 +0,0 @@ -package de.techmaved.mediabrowserforspotify.components - -import androidx.compose.foundation.layout.Arrangement -import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.Row -import androidx.compose.foundation.layout.padding -import androidx.compose.material3.Button -import androidx.compose.material3.Checkbox -import androidx.compose.material3.Divider -import androidx.compose.material3.Text -import androidx.compose.runtime.Composable -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.unit.dp -import com.adamratzman.spotify.auth.pkce.startSpotifyClientPkceLoginActivity -import de.techmaved.mediabrowserforspotify.activities.MainActivity -import de.techmaved.mediabrowserforspotify.auth.SpotifyPkceLoginActivityImpl -import de.techmaved.mediabrowserforspotify.auth.pkceClassBackTo - -class Authentication { - @Composable - fun SpotifyAuthSection(isAuthenticated: Boolean, activity: MainActivity?) { - Column( - modifier = Modifier.padding(start = 16.dp, end = 16.dp), - horizontalAlignment = Alignment.CenterHorizontally, - verticalArrangement = Arrangement.spacedBy(16.dp) - ) { - Row( - modifier = Modifier.padding(start = 16.dp, end = 16.dp), - horizontalArrangement = Arrangement.spacedBy(16.dp), - verticalAlignment = Alignment.CenterVertically - ) { - Text("Authenticated") - Checkbox( - checked = isAuthenticated, - onCheckedChange = { }, - enabled = false - ) - } - - Text( - text = "Click button down below to start spotify authentication for this app", - modifier = Modifier.padding(start = 16.dp, end = 16.dp) - ) - Button(onClick = { - pkceClassBackTo = MainActivity::class.java - activity?.startSpotifyClientPkceLoginActivity(SpotifyPkceLoginActivityImpl::class.java) - }) { - Text("Start Spotify Authentication") - } - Divider() - } - } - -} \ No newline at end of file diff --git a/app/src/main/java/de/techmaved/mediabrowserforspotify/components/utilities.kt b/app/src/main/java/de/techmaved/mediabrowserforspotify/components/utilities.kt new file mode 100644 index 0000000..ce69bff --- /dev/null +++ b/app/src/main/java/de/techmaved/mediabrowserforspotify/components/utilities.kt @@ -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() + } + } + } +} \ No newline at end of file