From d4a6009b92df9068bcffc6c590d2574220f2b2f1 Mon Sep 17 00:00:00 2001 From: Harsh Shandilya Date: Thu, 18 Jan 2024 04:07:30 +0530 Subject: [PATCH] feat(android): add libraries attribution page --- android/build.gradle.kts | 4 +- .../ui/datatransfer/DataTransferScreen.kt | 2 +- .../android/ui/navigation/Destinations.kt | 10 +++- .../android/ui/screens/LobstersPostsScreen.kt | 51 +++++++------------ .../claw/android/ui/screens/SettingsScreen.kt | 40 +++++++++++++++ gradle/libs.versions.toml | 3 ++ settings.gradle.kts | 5 ++ 7 files changed, 79 insertions(+), 36 deletions(-) create mode 100644 android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SettingsScreen.kt diff --git a/android/build.gradle.kts b/android/build.gradle.kts index d5ab668e..967c62cf 100644 --- a/android/build.gradle.kts +++ b/android/build.gradle.kts @@ -1,5 +1,5 @@ /* - * Copyright © 2021-2023 Harsh Shandilya. + * Copyright © 2021-2024 Harsh Shandilya. * Use of this source code is governed by an MIT-style * license that can be found in the LICENSE file or at * https://opensource.org/licenses/MIT. @@ -15,6 +15,7 @@ plugins { id("dev.msfjarvis.claw.kotlin-kapt") id("dev.msfjarvis.claw.sentry") id("dev.msfjarvis.claw.versioning-plugin") + alias(libs.plugins.aboutlibraries) alias(libs.plugins.anvil) alias(libs.plugins.modulegraphassert) alias(libs.plugins.whetstone) @@ -67,6 +68,7 @@ whetstone { dependencies { implementation(platform(libs.androidx.compose.bom)) implementation(platform(libs.okhttp.bom)) + implementation(libs.aboutLibraries.m3) implementation(libs.androidx.activity.compose) implementation(libs.androidx.compose.glance) implementation(libs.androidx.compose.glance.m3) diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt index d3b7635f..1210428a 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/datatransfer/DataTransferScreen.kt @@ -151,7 +151,7 @@ private fun GenericExportOption( } @Composable -private fun SettingsActionItem( +fun SettingsActionItem( title: String, modifier: Modifier = Modifier, description: String? = null, diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destinations.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destinations.kt index 487f027e..eae83002 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destinations.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/navigation/Destinations.kt @@ -1,5 +1,5 @@ /* - * Copyright © 2021-2023 Harsh Shandilya. + * Copyright © 2021-2024 Harsh Shandilya. * Use of this source code is governed by an MIT-style * license that can be found in the LICENSE file or at * https://opensource.org/licenses/MIT. @@ -39,6 +39,14 @@ sealed class Destinations { override val route = "search" } + data object Settings : Destinations() { + override val route = "settings" + } + + data object AboutLibraries : Destinations() { + override val route = "about_libraries" + } + companion object { val startDestination get() = Hottest diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt index 1d24181d..eb1ca0d6 100644 --- a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/LobstersPostsScreen.kt @@ -13,22 +13,20 @@ import androidx.compose.animation.fadeIn import androidx.compose.animation.fadeOut import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.material.icons.Icons import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.filled.Favorite -import androidx.compose.material.icons.filled.ImportExport -import androidx.compose.material.icons.filled.MoreVert import androidx.compose.material.icons.filled.NewReleases import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.Tune import androidx.compose.material.icons.filled.Whatshot import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material.icons.outlined.Whatshot -import androidx.compose.material3.DropdownMenu -import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.Icon import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme @@ -41,10 +39,8 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.Modifier @@ -65,6 +61,7 @@ import androidx.navigation.navArgument import androidx.navigation.navDeepLink import androidx.paging.compose.collectAsLazyPagingItems import com.deliveryhero.whetstone.compose.injectedViewModel +import com.mikepenz.aboutlibraries.ui.compose.m3.LibrariesContainer import dev.msfjarvis.claw.android.MainActivity import dev.msfjarvis.claw.android.R import dev.msfjarvis.claw.android.SearchActivity @@ -185,35 +182,14 @@ fun LobstersPostsScreen( } }, actions = { - var expanded by remember { mutableStateOf(false) } if (navItems.any { it.route == currentDestination }) { - IconButton(onClick = { expanded = true }) { - Icon(Icons.Default.MoreVert, contentDescription = "Extra options") + IconButton( + onClick = { context.startActivity(Intent(context, SearchActivity::class.java)) } + ) { + Icon(imageVector = Icons.Filled.Search, contentDescription = "Search posts") } - DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { - DropdownMenuItem( - text = { Text("Backup and restore") }, - onClick = { - navController.navigate(Destinations.DataTransfer.route) - expanded = false - }, - leadingIcon = { - Icon( - imageVector = Icons.Filled.ImportExport, - contentDescription = "Data transfer options", - ) - }, - ) - DropdownMenuItem( - text = { Text("Search posts") }, - onClick = { - context.startActivity(Intent(context, SearchActivity::class.java)) - expanded = false - }, - leadingIcon = { - Icon(imageVector = Icons.Filled.Search, contentDescription = "Search posts") - }, - ) + IconButton(onClick = { navController.navigate(Destinations.Settings.route) }) { + Icon(imageVector = Icons.Filled.Tune, contentDescription = "Settings") } } }, @@ -315,6 +291,15 @@ fun LobstersPostsScreen( snackbarHostState = snackbarHostState, ) } + composable(route = Destinations.Settings.route) { + SettingsScreen( + openLibrariesScreen = { navController.navigate(Destinations.AboutLibraries.route) }, + openDataTransferScreen = { navController.navigate(Destinations.DataTransfer.route) }, + ) + } + composable(route = Destinations.AboutLibraries.route) { + LibrariesContainer(modifier = Modifier.fillMaxSize()) + } } } } diff --git a/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SettingsScreen.kt b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SettingsScreen.kt new file mode 100644 index 00000000..dbbe67ad --- /dev/null +++ b/android/src/main/kotlin/dev/msfjarvis/claw/android/ui/screens/SettingsScreen.kt @@ -0,0 +1,40 @@ +/* + * Copyright © 2024 Harsh Shandilya. + * Use of this source code is governed by an MIT-style + * license that can be found in the LICENSE file or at + * https://opensource.org/licenses/MIT. + */ +package dev.msfjarvis.claw.android.ui.screens + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.LibraryBooks +import androidx.compose.material.icons.filled.ImportExport +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import dev.msfjarvis.claw.android.ui.datatransfer.SettingsActionItem + +@Composable +fun SettingsScreen( + openLibrariesScreen: () -> Unit, + openDataTransferScreen: () -> Unit, + modifier: Modifier = Modifier, +) { + Box(modifier = modifier.fillMaxSize()) { + Column { + SettingsActionItem( + title = "Data transfer", + description = "Export and import your saved posts", + icon = Icons.Filled.ImportExport, + onClick = openDataTransferScreen, + ) + SettingsActionItem( + title = "Libraries", + icon = Icons.AutoMirrored.Filled.LibraryBooks, + onClick = openLibrariesScreen, + ) + } + } +} diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 50bc6ff8..2df9ebac 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,4 +1,5 @@ [versions] +aboutLibraries = "10.10.0" agp = "8.3.0-beta02" benchmark = "1.2.2" coil = "2.5.0" @@ -21,6 +22,7 @@ whetstone = "0.8.0" workmanager = "2.9.0" [libraries] +aboutLibraries-m3 = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "aboutLibraries" } androidx-activity-compose = "androidx.activity:activity-compose:1.8.2" androidx-benchmark-macro-junit4 = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "benchmark" } androidx-browser = "androidx.browser:browser:1.7.0" @@ -106,6 +108,7 @@ truth = "com.google.truth:truth:1.2.0" unfurl = "me.saket.unfurl:unfurl:1.7.0" [plugins] +aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutLibraries" } android-test = { id = "com.android.test", version.ref = "agp" } anvil = "com.squareup.anvil:2.4.9" baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 431097a8..3e5aa533 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -21,6 +21,11 @@ pluginManagement { exclusiveContent { forRepository { gradlePluginPortal() } filter { + includeModule("com.mikepenz.aboutlibraries.plugin", "aboutlibraries-plugin") + includeModule( + "com.mikepenz.aboutlibraries.plugin", + "com.mikepenz.aboutlibraries.plugin.gradle.plugin", + ) includeModule("com.github.ben-manes", "gradle-versions-plugin") includeModule("org.gradle.android.cache-fix", "org.gradle.android.cache-fix.gradle.plugin") includeModule("gradle.plugin.org.gradle.android", "android-cache-fix-gradle-plugin")