From 2d9e3deecccb214595255cc34a2589ab3fd93e07 Mon Sep 17 00:00:00 2001 From: Ash Date: Tue, 20 Feb 2024 22:34:35 +0800 Subject: [PATCH] fix(opml): bump opml-parser to 3.1.0 and re-design OPML export dialog (#624) --- .../main/java/me/ash/reader/ui/ext/DateExt.kt | 1 + .../settings/accounts/AccountDetailsPage.kt | 105 ++++++++++++++---- app/src/main/res/values-zh-rCN/strings.xml | 1 + app/src/main/res/values/strings.xml | 1 + build.gradle | 2 +- 5 files changed, 87 insertions(+), 23 deletions(-) diff --git a/app/src/main/java/me/ash/reader/ui/ext/DateExt.kt b/app/src/main/java/me/ash/reader/ui/ext/DateExt.kt index 195890293..0717a280e 100644 --- a/app/src/main/java/me/ash/reader/ui/ext/DateExt.kt +++ b/app/src/main/java/me/ash/reader/ui/ext/DateExt.kt @@ -14,6 +14,7 @@ import java.util.Locale object DateFormat { val YYYY_MM_DD_HH_MM_SS = SimpleDateFormat("yyyy-MM-dd HH:mm:ss") val YYYY_MM_DD_DASH_HH_MM_SS = SimpleDateFormat("yyyy-MM-dd-HH:mm:ss") + val YYYY_MM_DD_DASH_HH_MM_SS_DASH = SimpleDateFormat("yyyy-MM-dd-HH-mm-ss") } fun Date.toString(format: SimpleDateFormat): String { diff --git a/app/src/main/java/me/ash/reader/ui/page/settings/accounts/AccountDetailsPage.kt b/app/src/main/java/me/ash/reader/ui/page/settings/accounts/AccountDetailsPage.kt index 6204b81e9..b299b6445 100644 --- a/app/src/main/java/me/ash/reader/ui/page/settings/accounts/AccountDetailsPage.kt +++ b/app/src/main/java/me/ash/reader/ui/page/settings/accounts/AccountDetailsPage.kt @@ -6,13 +6,18 @@ import androidx.activity.compose.ManagedActivityResultLauncher import androidx.activity.compose.rememberLauncherForActivityResult import androidx.activity.result.contract.ActivityResultContracts import androidx.compose.animation.ExperimentalAnimationApi +import androidx.compose.foundation.clickable +import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.navigationBars import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsBottomHeight import androidx.compose.foundation.lazy.LazyColumn +import androidx.compose.foundation.lazy.items +import androidx.compose.foundation.shape.CircleShape import androidx.compose.material.icons.Icons import androidx.compose.material.icons.outlined.DeleteSweep import androidx.compose.material.icons.outlined.PersonOff @@ -20,6 +25,7 @@ import androidx.compose.material.icons.rounded.ArrowBack import androidx.compose.material.icons.rounded.Close import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.RadioButton import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable @@ -28,9 +34,13 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.BaselineShift +import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.dp import androidx.hilt.navigation.compose.hiltViewModel import androidx.navigation.NavHostController @@ -415,37 +425,88 @@ fun AccountDetailsPage( }, ) - RadioDialog( + RYDialog( visible = exportOPMLModeDialogVisible, - title = stringResource(R.string.export_as_opml), - description = stringResource(R.string.additional_info_desc), - options = listOf( - RadioDialogOption( - text = stringResource(R.string.include_additional_info), - selected = uiState.exportOPMLMode == ExportOPMLMode.ATTACH_INFO, + title = { + Text( + text = stringResource(R.string.export_as_opml), + maxLines = 1, + overflow = TextOverflow.Ellipsis, + style = MaterialTheme.typography.titleLarge, + ) + }, + text = { + LazyColumn { + item { + Text(text = stringResource(R.string.additional_info_desc)) + Spacer(modifier = Modifier.height(16.dp)) + } + items(listOf( + RadioDialogOption( + text = context.getString(R.string.include_additional_info), + selected = uiState.exportOPMLMode == ExportOPMLMode.ATTACH_INFO, + ) { + viewModel.changeExportOPMLMode(ExportOPMLMode.ATTACH_INFO) + }, + RadioDialogOption( + text = context.getString(R.string.exclude), + selected = uiState.exportOPMLMode == ExportOPMLMode.NO_ATTACH, + ) { + viewModel.changeExportOPMLMode(ExportOPMLMode.NO_ATTACH) + } + )) { option -> + Row( + modifier = Modifier + .fillMaxWidth() + .clip(CircleShape) + .clickable { + option.onClick() + }, + verticalAlignment = Alignment.CenterVertically, + ) { + RadioButton(selected = option.selected, onClick = { + option.onClick() + }) + Text( + modifier = Modifier.padding(start = 6.dp), + text = option.text, + style = MaterialTheme.typography.bodyLarge.copy( + baselineShift = BaselineShift.None + ).merge(other = option.style), + color = MaterialTheme.colorScheme.onSurface, + ) + } + } + } + }, + confirmButton = { + TextButton( + onClick = { + exportOPMLModeDialogVisible = false + launcherOPMLFile(context, launcher) + } ) { - viewModel.changeExportOPMLMode(ExportOPMLMode.ATTACH_INFO) - launcherOPMLFile(context, launcher) - }, - RadioDialogOption( - text = stringResource(R.string.exclude), - selected = uiState.exportOPMLMode == ExportOPMLMode.NO_ATTACH, + Text(stringResource(R.string.export)) + } + }, + dismissButton = { + TextButton( + onClick = { exportOPMLModeDialogVisible = false } ) { - viewModel.changeExportOPMLMode(ExportOPMLMode.NO_ATTACH) - launcherOPMLFile(context, launcher) + Text(stringResource(R.string.cancel)) } - ) - ) { - exportOPMLModeDialogVisible = false - } + }, + onDismissRequest = { + exportOPMLModeDialogVisible = false + } + ) } private fun launcherOPMLFile( context: Context, launcher: ManagedActivityResultLauncher, ) { - launcher.launch("" + - "${context.getString(R.string.read_you)}-" + + launcher.launch("Read-You-" + "${context.getCurrentVersion()}-export-" + - "${Date().toString(DateFormat.YYYY_MM_DD_DASH_HH_MM_SS)}.opml") + "${Date().toString(DateFormat.YYYY_MM_DD_DASH_HH_MM_SS_DASH)}.opml") } diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index f1d067bdb..c9fe92b85 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -268,4 +268,5 @@ 所有已读项 已读项,但已加星标的除外 外部链接 + 导出 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index a473ce3de..f66aa1b21 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -419,4 +419,5 @@ None Toggle read Toggle starred + Export diff --git a/build.gradle b/build.gradle index 57aa38f9e..e302d825c 100644 --- a/build.gradle +++ b/build.gradle @@ -32,7 +32,7 @@ buildscript { // https://github.com/dankito/Readability4J readability4j = '1.0.8' // https://github.com/mdewilde/opml-parser - opmlParser = '2.2.0' + opmlParser = '3.1.0' // http://bigbadaboom.github.io/androidsvg/release_notes.html androidSVG = '1.4' }