From fb774928c7e2bf41a1b14d4acf5100e47e0bfc82 Mon Sep 17 00:00:00 2001 From: MM20 <15646950+MM2-0@users.noreply.github.com> Date: Tue, 28 Sep 2021 15:59:30 +0200 Subject: [PATCH] Jetpack Compose accounts settings screen --- ui/build.gradle.kts | 4 + .../launcher2/ui/activity/ComposeActivity.kt | 3 + .../settings/SettingsAccountsScreen.kt | 173 ++++++++++++++++++ .../ui/screens/settings/SettingsMainScreen.kt | 5 +- 4 files changed, 184 insertions(+), 1 deletion(-) create mode 100644 ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAccountsScreen.kt diff --git a/ui/build.gradle.kts b/ui/build.gradle.kts index ac307b1b..345461a8 100644 --- a/ui/build.gradle.kts +++ b/ui/build.gradle.kts @@ -117,5 +117,9 @@ dependencies { implementation(project(":permissions")) implementation(project(":websites")) implementation(project(":unitconverter")) + implementation(project(":nextcloud")) + implementation(project(":g-services")) + implementation(project(":ms-services")) + implementation(project(":owncloud")) } \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt b/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt index 0d16ccf3..5e5b0f44 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/activity/ComposeActivity.kt @@ -96,6 +96,9 @@ class ComposeActivity : AppCompatActivity() { composable("settings/badges") { SettingsBadgesScreen() } + composable("settings/accounts") { + SettingsAccountScreen() + } composable("settings/appearance") { SettingsAppearanceScreen() } diff --git a/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAccountsScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAccountsScreen.kt new file mode 100644 index 00000000..de4f93f3 --- /dev/null +++ b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsAccountsScreen.kt @@ -0,0 +1,173 @@ +package de.mm20.launcher2.ui.screens.settings + +import android.app.Activity +import androidx.activity.compose.rememberLauncherForActivityResult +import androidx.activity.result.contract.ActivityResultContracts +import androidx.compose.runtime.* +import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.stringResource +import de.mm20.launcher2.gservices.GoogleAccount +import de.mm20.launcher2.gservices.GoogleApiHelper +import de.mm20.launcher2.msservices.MicrosoftGraphApiHelper +import de.mm20.launcher2.msservices.MsUser +import de.mm20.launcher2.nextcloud.NcUser +import de.mm20.launcher2.nextcloud.NextcloudApiHelper +import de.mm20.launcher2.owncloud.OcUser +import de.mm20.launcher2.owncloud.OwncloudClient +import de.mm20.launcher2.ui.R +import de.mm20.launcher2.ui.component.preferences.Preference +import de.mm20.launcher2.ui.component.preferences.PreferenceCategory +import de.mm20.launcher2.ui.component.preferences.PreferenceScreen +import kotlinx.coroutines.launch + +@Composable +fun SettingsAccountScreen() { + val context = LocalContext.current + val scope = rememberCoroutineScope() + PreferenceScreen(title = stringResource(id = R.string.preference_screen_services)) { + item { + PreferenceCategory(title = stringResource(id = R.string.preference_category_services_nextcloud)) { + val client = remember { NextcloudApiHelper(context) } + var account by remember { mutableStateOf(null) } + LaunchedEffect(null) { + account = client.getLoggedInUser() + } + + val launcher = + rememberLauncherForActivityResult(contract = ActivityResultContracts.StartActivityForResult()) { + scope.launch { + account = client.getLoggedInUser() + } + } + + Preference( + title = account?.let { + stringResource(id = R.string.preference_signin_logout) + } ?: stringResource(id = R.string.preference_nextcloud_signin), + summary = account?.let { + stringResource( + id = R.string.preference_signin_user, + it.displayName + ) + } ?: stringResource(id = R.string.preference_nextcloud_signin_summary), + onClick = { + if (account == null) { + launcher.launch(client.getLoginIntent()) + } else { + scope.launch { + client.logout() + account = null + } + } + } + ) + } + PreferenceCategory(title = stringResource(id = R.string.preference_category_services_owncloud)) { + val client = remember { OwncloudClient(context) } + var account by remember { mutableStateOf(null) } + LaunchedEffect(null) { + account = client.getLoggedInUser() + } + + val launcher = + rememberLauncherForActivityResult(contract = ActivityResultContracts.StartActivityForResult()) { + scope.launch { + account = client.getLoggedInUser() + } + } + + Preference( + title = account?.let { + stringResource(id = R.string.preference_signin_logout) + } ?: stringResource(id = R.string.preference_owncloud_signin), + summary = account?.let { + stringResource( + id = R.string.preference_signin_user, + it.displayName + ) + } ?: stringResource(id = R.string.preference_owncloud_signin_summary), + onClick = { + if (account == null) { + launcher.launch(client.getLoginIntent()) + } else { + scope.launch { + client.logout() + account = null + } + } + } + ) + } + PreferenceCategory(title = stringResource(id = R.string.preference_category_services_google)) { + val client = remember { GoogleApiHelper.getInstance(context) } + var account by remember { mutableStateOf(null) } + LaunchedEffect(null) { + account = client.getAccount() + } + Preference( + title = account?.let { + stringResource(id = R.string.preference_signin_logout) + } ?: stringResource(id = R.string.preference_google_signin), + summary = if (client.isAvailable()) { + account?.let { + stringResource( + id = R.string.preference_signin_user, + it.name + ) + } ?: stringResource(id = R.string.preference_google_signin_summary) + } else { + stringResource(id = R.string.feature_not_available, stringResource(R.string.app_name)) + }, + onClick = { + if (account == null) { + scope.launch { + client.login(context as Activity) + account = client.getAccount() + } + } else { + client.logout() + account = null + } + }, + enabled = client.isAvailable() + ) + } + PreferenceCategory(title = stringResource(id = R.string.preference_category_services_microsoft)) { + val client = remember { MicrosoftGraphApiHelper.getInstance(context) } + var account by remember { mutableStateOf(null) } + LaunchedEffect(null) { + account = client.getUser() + } + Preference( + title = account?.let { + stringResource(id = R.string.preference_signin_logout) + } ?: stringResource(id = R.string.preference_ms_signin), + summary = if (client.isAvailable()) { + account?.let { + stringResource( + id = R.string.preference_signin_user, + it.name + ) + } ?: stringResource(id = R.string.preference_ms_signin_summary) + } else { + stringResource(id = R.string.feature_not_available, stringResource(R.string.app_name)) + }, + onClick = { + if (account == null) { + scope.launch { + client.login(context as Activity) + account = client.getUser() + } + } else { + scope.launch { + client.logout() + account = null + } + } + }, + enabled = client.isAvailable() + ) + } + } + } +} \ No newline at end of file diff --git a/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsMainScreen.kt b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsMainScreen.kt index 47358a19..c83ae0eb 100644 --- a/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsMainScreen.kt +++ b/ui/src/main/java/de/mm20/launcher2/ui/screens/settings/SettingsMainScreen.kt @@ -53,7 +53,10 @@ fun SettingsMainScreen() { Preference( icon = Icons.Rounded.AccountBox, title = stringResource(id = R.string.preference_screen_services), - summary = stringResource(id = R.string.preference_screen_services_summary) + summary = stringResource(id = R.string.preference_screen_services_summary), + onClick = { + navController?.navigate("settings/accounts") + } ) Preference( icon = Icons.Rounded.Info,