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 * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT. * https://opensource.org/licenses/MIT.
@ -15,6 +15,7 @@ plugins {
id("dev.msfjarvis.claw.kotlin-kapt") id("dev.msfjarvis.claw.kotlin-kapt")
id("dev.msfjarvis.claw.sentry") id("dev.msfjarvis.claw.sentry")
id("dev.msfjarvis.claw.versioning-plugin") id("dev.msfjarvis.claw.versioning-plugin")
alias(libs.plugins.aboutlibraries)
alias(libs.plugins.anvil) alias(libs.plugins.anvil)
alias(libs.plugins.modulegraphassert) alias(libs.plugins.modulegraphassert)
alias(libs.plugins.whetstone) alias(libs.plugins.whetstone)
@ -67,6 +68,7 @@ whetstone {
dependencies { dependencies {
implementation(platform(libs.androidx.compose.bom)) implementation(platform(libs.androidx.compose.bom))
implementation(platform(libs.okhttp.bom)) implementation(platform(libs.okhttp.bom))
implementation(libs.aboutLibraries.m3)
implementation(libs.androidx.activity.compose) implementation(libs.androidx.activity.compose)
implementation(libs.androidx.compose.glance) implementation(libs.androidx.compose.glance)
implementation(libs.androidx.compose.glance.m3) implementation(libs.androidx.compose.glance.m3)

View file

@ -151,7 +151,7 @@ private fun GenericExportOption(
} }
@Composable @Composable
private fun SettingsActionItem( fun SettingsActionItem(
title: String, title: String,
modifier: Modifier = Modifier, modifier: Modifier = Modifier,
description: String? = null, 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 * Use of this source code is governed by an MIT-style
* license that can be found in the LICENSE file or at * license that can be found in the LICENSE file or at
* https://opensource.org/licenses/MIT. * https://opensource.org/licenses/MIT.
@ -39,6 +39,14 @@ sealed class Destinations {
override val route = "search" override val route = "search"
} }
data object Settings : Destinations() {
override val route = "settings"
}
data object AboutLibraries : Destinations() {
override val route = "about_libraries"
}
companion object { companion object {
val startDestination val startDestination
get() = Hottest get() = Hottest

View file

@ -13,22 +13,20 @@ import androidx.compose.animation.fadeIn
import androidx.compose.animation.fadeOut import androidx.compose.animation.fadeOut
import androidx.compose.foundation.Image import androidx.compose.foundation.Image
import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size import androidx.compose.foundation.layout.size
import androidx.compose.foundation.lazy.rememberLazyListState import androidx.compose.foundation.lazy.rememberLazyListState
import androidx.compose.material.icons.Icons import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.automirrored.filled.ArrowBack import androidx.compose.material.icons.automirrored.filled.ArrowBack
import androidx.compose.material.icons.filled.Favorite 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.NewReleases
import androidx.compose.material.icons.filled.Search 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.filled.Whatshot
import androidx.compose.material.icons.outlined.FavoriteBorder import androidx.compose.material.icons.outlined.FavoriteBorder
import androidx.compose.material.icons.outlined.NewReleases import androidx.compose.material.icons.outlined.NewReleases
import androidx.compose.material.icons.outlined.Whatshot 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.Icon
import androidx.compose.material3.IconButton import androidx.compose.material3.IconButton
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
@ -41,10 +39,8 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.runtime.setValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.ExperimentalComposeUiApi import androidx.compose.ui.ExperimentalComposeUiApi
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -65,6 +61,7 @@ import androidx.navigation.navArgument
import androidx.navigation.navDeepLink import androidx.navigation.navDeepLink
import androidx.paging.compose.collectAsLazyPagingItems import androidx.paging.compose.collectAsLazyPagingItems
import com.deliveryhero.whetstone.compose.injectedViewModel 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.MainActivity
import dev.msfjarvis.claw.android.R import dev.msfjarvis.claw.android.R
import dev.msfjarvis.claw.android.SearchActivity import dev.msfjarvis.claw.android.SearchActivity
@ -185,35 +182,14 @@ fun LobstersPostsScreen(
} }
}, },
actions = { actions = {
var expanded by remember { mutableStateOf(false) }
if (navItems.any { it.route == currentDestination }) { if (navItems.any { it.route == currentDestination }) {
IconButton(onClick = { expanded = true }) { IconButton(
Icon(Icons.Default.MoreVert, contentDescription = "Extra options") onClick = { context.startActivity(Intent(context, SearchActivity::class.java)) }
) {
Icon(imageVector = Icons.Filled.Search, contentDescription = "Search posts")
} }
DropdownMenu(expanded = expanded, onDismissRequest = { expanded = false }) { IconButton(onClick = { navController.navigate(Destinations.Settings.route) }) {
DropdownMenuItem( Icon(imageVector = Icons.Filled.Tune, contentDescription = "Settings")
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")
},
)
} }
} }
}, },
@ -315,6 +291,15 @@ fun LobstersPostsScreen(
snackbarHostState = snackbarHostState, 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] [versions]
aboutLibraries = "10.10.0"
agp = "8.3.0-beta02" agp = "8.3.0-beta02"
benchmark = "1.2.2" benchmark = "1.2.2"
coil = "2.5.0" coil = "2.5.0"
@ -21,6 +22,7 @@ whetstone = "0.8.0"
workmanager = "2.9.0" workmanager = "2.9.0"
[libraries] [libraries]
aboutLibraries-m3 = { module = "com.mikepenz:aboutlibraries-compose-m3", version.ref = "aboutLibraries" }
androidx-activity-compose = "androidx.activity:activity-compose:1.8.2" androidx-activity-compose = "androidx.activity:activity-compose:1.8.2"
androidx-benchmark-macro-junit4 = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "benchmark" } androidx-benchmark-macro-junit4 = { module = "androidx.benchmark:benchmark-macro-junit4", version.ref = "benchmark" }
androidx-browser = "androidx.browser:browser:1.7.0" 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" unfurl = "me.saket.unfurl:unfurl:1.7.0"
[plugins] [plugins]
aboutlibraries = { id = "com.mikepenz.aboutlibraries.plugin", version.ref = "aboutLibraries" }
android-test = { id = "com.android.test", version.ref = "agp" } android-test = { id = "com.android.test", version.ref = "agp" }
anvil = "com.squareup.anvil:2.4.9" anvil = "com.squareup.anvil:2.4.9"
baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" } baselineprofile = { id = "androidx.baselineprofile", version.ref = "benchmark" }

View file

@ -21,6 +21,11 @@ pluginManagement {
exclusiveContent { exclusiveContent {
forRepository { gradlePluginPortal() } forRepository { gradlePluginPortal() }
filter { 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("com.github.ben-manes", "gradle-versions-plugin")
includeModule("org.gradle.android.cache-fix", "org.gradle.android.cache-fix.gradle.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") includeModule("gradle.plugin.org.gradle.android", "android-cache-fix-gradle-plugin")