From ef10e9c732c80cb28347fb8934665729fc01ffcf Mon Sep 17 00:00:00 2001 From: Michael Totschnig Date: Mon, 27 Jan 2025 16:51:08 +0100 Subject: [PATCH] Update Alpine, Tailwind Fixes #761 --- .../preferences/MainPreferenceFragment.kt | 16 +- .../totschnig/myexpenses/util/AppDirHelper.kt | 20 +- .../myexpenses/viewmodel/SettingsViewModel.kt | 19 +- myExpenses/src/main/res/values/strings.xml | 1 + webui/src/main/assets/download.html | 71 + webui/src/main/assets/form.html | 3 +- webui/src/main/assets/styles.css | 2 +- .../org/totschnig/webui/WebInputService.kt | 47 +- webui_css_sources/package-lock.json | 3438 ++++++++--------- webui_css_sources/package.json | 8 +- 10 files changed, 1703 insertions(+), 1922 deletions(-) create mode 100644 webui/src/main/assets/download.html diff --git a/myExpenses/src/main/java/org/totschnig/myexpenses/fragment/preferences/MainPreferenceFragment.kt b/myExpenses/src/main/java/org/totschnig/myexpenses/fragment/preferences/MainPreferenceFragment.kt index 63fc53c0cc..9ab7a5e894 100644 --- a/myExpenses/src/main/java/org/totschnig/myexpenses/fragment/preferences/MainPreferenceFragment.kt +++ b/myExpenses/src/main/java/org/totschnig/myexpenses/fragment/preferences/MainPreferenceFragment.kt @@ -4,7 +4,6 @@ import android.content.ActivityNotFoundException import android.content.DialogInterface import android.content.Intent import android.os.Bundle -import android.text.format.Formatter import androidx.activity.result.contract.ActivityResultContracts import androidx.core.content.res.ResourcesCompat import androidx.preference.* @@ -18,7 +17,6 @@ import org.totschnig.myexpenses.preference.PopupMenuPreference import org.totschnig.myexpenses.preference.PrefKey import org.totschnig.myexpenses.util.AppDirHelper import org.totschnig.myexpenses.viewmodel.SettingsViewModel -import timber.log.Timber import java.util.Locale class MainPreferenceFragment : BasePreferenceFragment(), @@ -110,15 +108,8 @@ class MainPreferenceFragment : BasePreferenceFragment(), isVisible = false } else { isVisible = true - entries = it.map { - "${it.first} (${ - Formatter.formatFileSize( - requireContext(), - it.second - ) - })" - }.toTypedArray() - entryValues = it.map { it.first }.toTypedArray() + entries = it.map { it.format(requireContext()) }.toTypedArray() + entryValues = it.map { it.name }.toTypedArray() } } } @@ -164,7 +155,6 @@ class MainPreferenceFragment : BasePreferenceFragment(), AppDirHelper.ensureContentUri(it, requireContext()) } }) - Timber.d("ATTACHMENTS" + arrayList.joinToString()) putParcelableArrayListExtra( Intent.EXTRA_STREAM, arrayList @@ -253,7 +243,7 @@ class MainPreferenceFragment : BasePreferenceFragment(), private fun pickAppDir(appDirInfo: SettingsViewModel.AppDirInfo?) { try { pickFolder.launch(appDirInfo?.documentFile?.uri) - } catch (e: ActivityNotFoundException) { + } catch (_: ActivityNotFoundException) { preferenceActivity.showSnackBar( "No activity found for picking application directory." ) diff --git a/myExpenses/src/main/java/org/totschnig/myexpenses/util/AppDirHelper.kt b/myExpenses/src/main/java/org/totschnig/myexpenses/util/AppDirHelper.kt index 546d001fdb..c5c035c8c2 100644 --- a/myExpenses/src/main/java/org/totschnig/myexpenses/util/AppDirHelper.kt +++ b/myExpenses/src/main/java/org/totschnig/myexpenses/util/AppDirHelper.kt @@ -3,6 +3,8 @@ package org.totschnig.myexpenses.util import android.content.Context import android.net.Uri import android.os.Build +import android.text.format.Formatter +import androidx.annotation.WorkerThread import androidx.core.content.FileProvider import androidx.documentfile.provider.DocumentFile import org.totschnig.myexpenses.R @@ -16,18 +18,32 @@ import java.text.SimpleDateFormat import java.util.* import kotlin.Result +data class FileInfo(val name: String, val size: Long) { + fun format(context: Context) = "$name (${Formatter.formatFileSize(context, size)})" +} + object AppDirHelper { /** * @return the directory user has configured in the settings, if not configured yet * returns [android.content.ContextWrapper.getExternalFilesDir] with argument null */ - @JvmStatic fun getAppDir(context: Context): Result = getAppDirFromPref(context).mapCatching { it ?: getDefaultAppDir(context) }.onFailure { CrashHandler.report(it) } - fun getAppDirLegacy(context: Context) = getAppDir(context).getOrNull() + @WorkerThread + fun getAppDirFiles(context: Context): Result> = getAppDir(context).map { + it.listFiles() + .filter { (it.length() > 0) && !it.isDirectory } + .mapNotNull { file -> + file.name?.let { + Triple(it, file.length(), file.lastModified()) + } + } + .sortedByDescending { it.third } + .map { FileInfo(it.first, it.second) } + } fun getAppDirWithDefault(context: Context): Result> = getAppDirFromPref(context).mapCatching { diff --git a/myExpenses/src/main/java/org/totschnig/myexpenses/viewmodel/SettingsViewModel.kt b/myExpenses/src/main/java/org/totschnig/myexpenses/viewmodel/SettingsViewModel.kt index 3145665e0d..16135d22e9 100644 --- a/myExpenses/src/main/java/org/totschnig/myexpenses/viewmodel/SettingsViewModel.kt +++ b/myExpenses/src/main/java/org/totschnig/myexpenses/viewmodel/SettingsViewModel.kt @@ -33,6 +33,7 @@ import org.totschnig.myexpenses.provider.TransactionProvider import org.totschnig.myexpenses.provider.asSequence import org.totschnig.myexpenses.provider.filter.Operation import org.totschnig.myexpenses.util.AppDirHelper +import org.totschnig.myexpenses.util.FileInfo import org.totschnig.myexpenses.util.ICurrencyFormatter import org.totschnig.myexpenses.util.Utils import org.totschnig.myexpenses.util.convAmount @@ -59,8 +60,8 @@ class SettingsViewModel( private val _appDirInfo: MutableLiveData> = MutableLiveData() val appDirInfo: LiveData> = _appDirInfo - private val _appData: MutableLiveData>> = MutableLiveData() - val appData: LiveData>> = _appData + private val _appData: MutableLiveData> = MutableLiveData() + val appData: LiveData> = _appData val hasStaleImages: Flow get() = contentResolver.observeQuery( @@ -82,18 +83,8 @@ class SettingsViewModel( fun loadAppData() { viewModelScope.launch(coroutineContext()) { - AppDirHelper.getAppDir(getApplication()).onSuccess { dir -> - _appData.postValue( - dir.listFiles() - .filter { (it.length() > 0) && !it.isDirectory } - .mapNotNull { file -> - file.name?.let { - Triple(it, file.length(), file.lastModified()) - } - } - .sortedByDescending { it.third } - .map { it.first to it.second } - ) + AppDirHelper.getAppDirFiles(getApplication()).onSuccess { list -> + _appData.postValue(list) } } } diff --git a/myExpenses/src/main/res/values/strings.xml b/myExpenses/src/main/res/values/strings.xml index 4eba34f58b..358b2a0f43 100644 --- a/myExpenses/src/main/res/values/strings.xml +++ b/myExpenses/src/main/res/values/strings.xml @@ -1047,4 +1047,5 @@ The following budgets can be imported: The following budgets refer to accounts that are not synchronized: No budgets found. + After printing, exporting or creating backups in the app, files will be available from here for download. \ No newline at end of file diff --git a/webui/src/main/assets/download.html b/webui/src/main/assets/download.html new file mode 100644 index 0000000000..7e95a2985d --- /dev/null +++ b/webui/src/main/assets/download.html @@ -0,0 +1,71 @@ + + + + + + Download + + + +
+ + + + + + + + diff --git a/webui/src/main/assets/form.html b/webui/src/main/assets/form.html index 5623fa521b..3db2f3afe2 100644 --- a/webui/src/main/assets/form.html +++ b/webui/src/main/assets/form.html @@ -12,7 +12,7 @@ - + @@ -168,6 +168,7 @@
+ Download