Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
227 changes: 227 additions & 0 deletions app/src/main/kotlin/org/stypox/dicio/ui/about/AboutScreen.kt
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I feel like this page could be simplified by creating a helper function for each category. Might be better?

Original file line number Diff line number Diff line change
@@ -0,0 +1,227 @@
package org.stypox.dicio.ui.about

import android.os.Build
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.BugReport
import androidx.compose.material.icons.filled.Code
import androidx.compose.material.icons.filled.Description
import androidx.compose.material.icons.filled.Gavel
import androidx.compose.material.icons.filled.Group
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.LibraryBooks
import androidx.compose.material.icons.filled.Policy
import androidx.compose.material3.ExperimentalMaterial3Api
import androidx.compose.material3.HorizontalDivider
import androidx.compose.material3.Scaffold
import androidx.compose.material3.SnackbarHost
import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalContext
import androidx.compose.ui.res.stringResource
import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp
import kotlinx.coroutines.launch
import org.stypox.dicio.BuildConfig
import org.stypox.dicio.R
import org.stypox.dicio.settings.ui.SettingsCategoryTitle
import org.stypox.dicio.settings.ui.SettingsItem
import org.stypox.dicio.ui.theme.AppTheme
import org.stypox.dicio.util.ShareUtils

@Composable
fun AboutScreen(
navigationIcon: @Composable () -> Unit,
) {
val context = LocalContext.current
val snackbarHostState = remember { SnackbarHostState() }
val scope = rememberCoroutineScope()

Scaffold(
topBar = {
@OptIn(ExperimentalMaterial3Api::class)
TopAppBar(
title = { Text(stringResource(R.string.about)) },
navigationIcon = navigationIcon,
)
},
snackbarHost = { SnackbarHost(hostState = snackbarHostState) },
) { paddingValues ->
LazyColumn(
modifier = Modifier
.fillMaxSize()
.padding(paddingValues)
) {
// App Information Section
item {
SettingsCategoryTitle(title = stringResource(R.string.about_app_info))
}

item {
SettingsItem(
title = stringResource(R.string.app_name),
description = stringResource(R.string.about_description),
)
}

item {
SettingsItem(
title = stringResource(R.string.about_version),
description = BuildConfig.VERSION_NAME,
)
}

item {
SettingsItem(
title = stringResource(R.string.about_application_id),
description = BuildConfig.APPLICATION_ID,
)
}

// Build Information Section
item {
SettingsCategoryTitle(title = stringResource(R.string.about_build_info))
}

item {
SettingsItem(
title = stringResource(R.string.about_version_code),
description = BuildConfig.VERSION_CODE.toString(),
)
}

item {
SettingsItem(
title = stringResource(R.string.about_copy_version_info),
icon = Icons.Default.Description,
modifier = Modifier.clickable {
val versionInfo = buildVersionInfo()
ShareUtils.copyToClipboard(context, versionInfo)
scope.launch {
snackbarHostState.showSnackbar(
context.getString(R.string.copied_to_clipboard)
)
}
},
)
}

// Links Section
item {
SettingsCategoryTitle(title = stringResource(R.string.about_links))
}

item {
SettingsItem(
title = stringResource(R.string.about_source_code),
icon = Icons.Default.Code,
description = "github.com/Stypox/dicio-android",
modifier = Modifier.clickable {
ShareUtils.openUrlInBrowser(
context,
"https://github.com/Stypox/dicio-android"
)
},
)
}

item {
SettingsItem(
title = stringResource(R.string.about_report_issue),
icon = Icons.Default.BugReport,
description = "Report bugs and request features",
modifier = Modifier.clickable {
ShareUtils.openUrlInBrowser(
context,
"https://github.com/Stypox/dicio-android/issues"
)
},
)
}

// Legal Section
item {
SettingsCategoryTitle(title = stringResource(R.string.about_legal))
}

item {
SettingsItem(
title = stringResource(R.string.about_license),
icon = Icons.Default.Gavel,
description = stringResource(R.string.about_license_gpl),
modifier = Modifier.clickable {
ShareUtils.openUrlInBrowser(
context,
"https://www.gnu.org/licenses/gpl-3.0.html"
)
},
)
}

item {
SettingsItem(
title = stringResource(R.string.about_privacy_policy),
icon = Icons.Default.Policy,
description = stringResource(R.string.privacy_intro),
modifier = Modifier.clickable {
ShareUtils.openUrlInBrowser(
context,
"https://github.com/Stypox/dicio-android/blob/master/PRIVACY.md"
)
},
)
}

// Credits Section
item {
SettingsCategoryTitle(title = stringResource(R.string.about_credits))
}

item {
SettingsItem(
title = stringResource(R.string.about_contributors),
icon = Icons.Default.Group,
description = stringResource(R.string.about_contributors_description),
modifier = Modifier.clickable {
ShareUtils.openUrlInBrowser(
context,
"https://github.com/Stypox/dicio-android/graphs/contributors"
)
},
)
}

item {
HorizontalDivider(modifier = Modifier.padding(vertical = 8.dp))
}
}
}
}

private fun buildVersionInfo(): String {
return """
${BuildConfig.APPLICATION_ID}
Version ${BuildConfig.VERSION_NAME} (${BuildConfig.VERSION_CODE})

Device: ${Build.MANUFACTURER} ${Build.MODEL}
Android: ${Build.VERSION.RELEASE} (API ${Build.VERSION.SDK_INT})
""".trimIndent()
}

@Preview
@Composable
private fun AboutScreenPreview() {
AppTheme {
AboutScreen(
navigationIcon = {},
)
}
}
14 changes: 13 additions & 1 deletion app/src/main/kotlin/org/stypox/dicio/ui/nav/Drawer.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ import androidx.compose.foundation.layout.padding
import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.widthIn
import androidx.compose.material.icons.Icons
import androidx.compose.material.icons.filled.Info
import androidx.compose.material.icons.filled.RecordVoiceOver
import androidx.compose.material.icons.filled.Settings
import androidx.compose.material3.Icon
Expand All @@ -34,6 +35,7 @@ import org.stypox.dicio.R
@Composable
fun DrawerContent(
onSettingsClick: () -> Unit,
onAboutClick: () -> Unit,
onSpeechToTextPopupClick: () -> Unit,
closeDrawer: () -> Unit,
) {
Expand Down Expand Up @@ -67,13 +69,23 @@ fun DrawerContent(
},
modifier = Modifier.padding(horizontal = 12.dp),
)

DrawerItem(
icon = Icons.Default.Info,
label = R.string.about,
onClick = {
onAboutClick()
closeDrawer()
},
modifier = Modifier.padding(horizontal = 12.dp),
)
}
}

@Preview
@Composable
private fun DrawerContentPreview() {
DrawerContent(onSettingsClick = {}, onSpeechToTextPopupClick = {}, closeDrawer = {})
DrawerContent(onSettingsClick = {}, onAboutClick = {}, onSpeechToTextPopupClick = {}, closeDrawer = {})
}

@Preview
Expand Down
8 changes: 8 additions & 0 deletions app/src/main/kotlin/org/stypox/dicio/ui/nav/Navigation.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ import org.stypox.dicio.R
import org.stypox.dicio.io.input.stt_popup.SttPopupActivity
import org.stypox.dicio.settings.MainSettingsScreen
import org.stypox.dicio.settings.SkillSettingsScreen
import org.stypox.dicio.ui.about.AboutScreen
import org.stypox.dicio.ui.home.HomeScreen

@Composable
Expand All @@ -41,6 +42,7 @@ fun Navigation() {
val context = LocalContext.current
ScreenWithDrawer(
onSettingsClick = { navController.navigate(MainSettings) },
onAboutClick = { navController.navigate(About) },
onSpeechToTextPopupClick = {
val intent = Intent(context, SttPopupActivity::class.java)
context.startActivity(intent)
Expand All @@ -60,12 +62,17 @@ fun Navigation() {
composable<SkillSettings> {
SkillSettingsScreen(navigationIcon = backIcon)
}

composable<About> {
AboutScreen(navigationIcon = backIcon)
}
}
}

@Composable
fun ScreenWithDrawer(
onSettingsClick: () -> Unit,
onAboutClick: () -> Unit,
onSpeechToTextPopupClick: () -> Unit,
screen: @Composable (navigationIcon: @Composable () -> Unit) -> Unit
) {
Expand All @@ -77,6 +84,7 @@ fun ScreenWithDrawer(
drawerContent = {
DrawerContent(
onSettingsClick = onSettingsClick,
onAboutClick = onAboutClick,
onSpeechToTextPopupClick = onSpeechToTextPopupClick,
closeDrawer = {
scope.launch {
Expand Down
3 changes: 3 additions & 0 deletions app/src/main/kotlin/org/stypox/dicio/ui/nav/Routes.kt
Original file line number Diff line number Diff line change
Expand Up @@ -10,3 +10,6 @@ object MainSettings

@Serializable
object SkillSettings

@Serializable
object About
21 changes: 21 additions & 0 deletions app/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -246,4 +246,25 @@
<string name="failed_to_copy">Failed to copy to clipboard</string>
<string name="skill_translation_auto">Auto</string>
<string name="skill_search_duckduckgo_recaptcha">DuckDuckGo did not provide results, asking for a Captcha to be solved</string>

<!-- About screen -->
<string name="about">About</string>
<string name="about_description">Free and open source voice assistant</string>
<string name="about_version">Version</string>
<string name="about_app_info">App information</string>
<string name="about_application_id">Application ID</string>
<string name="about_build_info">Build information</string>
<string name="about_version_code">Version code</string>
<string name="about_links">Links</string>
<string name="about_source_code">Source code</string>
<string name="about_report_issue">Report an issue</string>
<string name="about_github" translatable="false">GitHub</string>
<string name="about_legal">Legal</string>
<string name="about_license">License</string>
<string name="about_license_gpl" translatable="false">GNU General Public License v3.0</string>
<string name="about_privacy_policy">Privacy policy</string>
<string name="about_credits">Credits</string>
<string name="about_contributors">Contributors</string>
<string name="about_contributors_description">Dicio is made possible by contributors around the world</string>
<string name="about_copy_version_info">Copy version info</string>
</resources>