feat(android): add libraries attribution page

This commit is contained in:
Harsh Shandilya 2024-01-18 04:07:30 +05:30
parent a187752659
commit d4a6009b92
7 changed files with 79 additions and 36 deletions

View file

@ -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)

View file

@ -151,7 +151,7 @@ private fun GenericExportOption(
}
@Composable
private fun SettingsActionItem(
fun SettingsActionItem(
title: String,
modifier: Modifier = Modifier,
description: String? = null,

View file

@ -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

View file

@ -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")
}
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 = {
IconButton(
onClick = { context.startActivity(Intent(context, SearchActivity::class.java)) }
) {
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())
}
}
}
}

View file

@ -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,
)
}
}
}

View file

@ -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" }

View file

@ -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")