From 87e526dbccb940f0442020e24724a63033951f0a Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 4 Sep 2022 07:16:04 +0000 Subject: [PATCH 01/16] prepare v0.21.45 (54) --- CHANGES.md | 5 +++++ app/build.gradle | 4 ++-- metadata/bg-BG/changelogs/54.txt | 2 ++ metadata/en-US/changelogs/54.txt | 2 ++ 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 metadata/bg-BG/changelogs/54.txt create mode 100644 metadata/en-US/changelogs/54.txt diff --git a/CHANGES.md b/CHANGES.md index 5bdb5031..6e3dcdd2 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Changes +## [0.21.5] - 2022-09-03 + +* FIXES + + fix cloud backup + ## [0.21.4] - 2022-06-18 * FIXES diff --git a/app/build.gradle b/app/build.gradle index 056bb631..dfd7f8f0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,8 +24,8 @@ android { minSdkVersion 22 targetSdkVersion 31 vectorDrawables.useSupportLibrary true - versionCode 53 - versionName '0.21.4' + versionCode 54 + versionName '0.21.5' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { diff --git a/metadata/bg-BG/changelogs/54.txt b/metadata/bg-BG/changelogs/54.txt new file mode 100644 index 00000000..2e1dace0 --- /dev/null +++ b/metadata/bg-BG/changelogs/54.txt @@ -0,0 +1,2 @@ +* ПОПРАВКИ + + отстранен проблем с централизираното резервно копие на настройките diff --git a/metadata/en-US/changelogs/54.txt b/metadata/en-US/changelogs/54.txt new file mode 100644 index 00000000..a2e3a20c --- /dev/null +++ b/metadata/en-US/changelogs/54.txt @@ -0,0 +1,2 @@ +* FIXES + + fix cloud backup -- 2.39.2 From c965804b97b8c0a25fcef50d939fc1981d2760bf Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 20 Jun 2023 22:28:04 +0300 Subject: [PATCH 02/16] switch off Jetfilter as advised IIRC this was enabled for some legacy libraries and apparently is no longer needed --- gradle.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle.properties b/gradle.properties index 048e816e..1cdcc0e8 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright © 2019 Damyan Ivanov. +# Copyright © 2023 Damyan Ivanov. # This file is part of MoLe. # MoLe is free software: you can distribute it and/or modify it # under the term of the GNU General Public License as published by @@ -30,4 +30,4 @@ org.gradle.jvmargs=-Xmx1536m # org.gradle.parallel=true android.debug.obsoleteApi=true android.useAndroidX=true -android.enableJetifier=true \ No newline at end of file +android.enableJetifier=false \ No newline at end of file -- 2.39.2 From c9aaf7609bda8ede8b9894a303a3a2a2bb94c13b Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 20 Jun 2023 22:29:19 +0300 Subject: [PATCH 03/16] fix sending transactions to hledger-web 1.23+ it was a simple omission in the sending code :/ --- .../java/net/ktnx/mobileledger/async/SendTransactionTask.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java index 79a58173..7c7e39e3 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2023 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -275,6 +275,7 @@ public class SendTransactionTask extends Thread { case v1_14: case v1_15: case v1_19_1: + case v1_23: sendOK(profileApiVersion); break; default: -- 2.39.2 From 9cd65aed1e1b01e35b1aa1d450cb2f13156571d2 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 20 Jun 2023 22:29:40 +0300 Subject: [PATCH 04/16] import sorting --- .../java/net/ktnx/mobileledger/async/SendTransactionTask.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java index 7c7e39e3..eb3a2e06 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java @@ -17,6 +17,8 @@ package net.ktnx.mobileledger.async; +import static net.ktnx.mobileledger.utils.Logger.debug; + import android.util.Log; import net.ktnx.mobileledger.db.Profile; @@ -45,8 +47,6 @@ import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; -import static net.ktnx.mobileledger.utils.Logger.debug; - /* TODO: get rid of the custom session/cookie and auth code? * (the last problem with the POST was the missing content-length header) * This will resolve itself when hledger-web 1.14+ is released with Debian/stable, -- 2.39.2 From 74f177009cd871ea56169543b6b25712fb32d1b8 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 20 Jun 2023 22:41:47 +0300 Subject: [PATCH 05/16] rearrange --- .../java/net/ktnx/mobileledger/async/SendTransactionTask.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java index eb3a2e06..0e700cca 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/SendTransactionTask.java @@ -287,9 +287,7 @@ public class SendTransactionTask extends Thread { error = e.getMessage(); } - Misc.onMainThread(()->{ - taskCallback.onTransactionSaveDone(error, transaction); - }); + Misc.onMainThread(() -> taskCallback.onTransactionSaveDone(error, transaction)); } private void legacySendOkWithRetry() throws IOException { int tried = 0; -- 2.39.2 From c356d5916ff4950a15d40f02ec6037e5765afd3c Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 20 Jun 2023 19:51:51 +0000 Subject: [PATCH 06/16] prepare v0.21.6 (55) --- CHANGES.md | 5 +++++ app/build.gradle | 6 +++--- metadata/bg-BG/changelogs/55.txt | 2 ++ metadata/en-US/changelogs/55.txt | 2 ++ 4 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 metadata/bg-BG/changelogs/55.txt create mode 100644 metadata/en-US/changelogs/55.txt diff --git a/CHANGES.md b/CHANGES.md index 6e3dcdd2..e8b5efc7 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,10 @@ # Changes +## [0.21.6] - 2023-06-20 + +* FIXES + + fix sending transations to hledger-web 1.23+ + ## [0.21.5] - 2022-09-03 * FIXES diff --git a/app/build.gradle b/app/build.gradle index dfd7f8f0..295c9ab4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -1,5 +1,5 @@ /* - * Copyright © 2022 Damyan Ivanov. + * Copyright © 2023 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -24,8 +24,8 @@ android { minSdkVersion 22 targetSdkVersion 31 vectorDrawables.useSupportLibrary true - versionCode 54 - versionName '0.21.5' + versionCode 55 + versionName '0.21.6' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { diff --git a/metadata/bg-BG/changelogs/55.txt b/metadata/bg-BG/changelogs/55.txt new file mode 100644 index 00000000..208db922 --- /dev/null +++ b/metadata/bg-BG/changelogs/55.txt @@ -0,0 +1,2 @@ +* ПОПРАВКИ + + отстранен проблем при изпращане на транзакции към hledger-web 1.23+ diff --git a/metadata/en-US/changelogs/55.txt b/metadata/en-US/changelogs/55.txt new file mode 100644 index 00000000..3697ab50 --- /dev/null +++ b/metadata/en-US/changelogs/55.txt @@ -0,0 +1,2 @@ +* FIXES: + + fixed sending of transactions to hledger-web 1.23+ -- 2.39.2 From fbaa629702d4fe68d4b412105c8ba42f641d02b5 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sat, 10 Feb 2024 07:57:02 +0000 Subject: [PATCH 07/16] add some things that would be nice to have --- TODO.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 TODO.txt diff --git a/TODO.txt b/TODO.txt new file mode 100644 index 00000000..e229e17d --- /dev/null +++ b/TODO.txt @@ -0,0 +1,7 @@ +* Easy way to add tag:value pairs to transactions and transaction accounts + +* Filter by tag:value pairs + +* Refresh button in account/transaction list + +* Top button in account/transaction list -- 2.39.2 From 10238730b9cf1230109706819da3fcc87d9379fe Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 17 Mar 2024 11:17:00 +0200 Subject: [PATCH 08/16] upgrade gradle to 8.0.2 --- app/build.gradle | 1 + app/src/main/AndroidManifest.xml | 5 ++--- build.gradle | 2 +- gradle.properties | 8 ++++++-- gradle/wrapper/gradle-wrapper.properties | 19 +++++++++++++++++-- 5 files changed, 27 insertions(+), 8 deletions(-) diff --git a/app/build.gradle b/app/build.gradle index 295c9ab4..7b29013a 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -62,6 +62,7 @@ android { } buildFeatures.viewBinding = true buildToolsVersion '30.0.3' + namespace 'net.ktnx.mobileledger' } dependencies { diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 6d4948bc..b17a1ecf 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ + xmlns:tools="http://schemas.android.com/tools"> diff --git a/build.gradle b/build.gradle index acc8190a..e9d71576 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:7.1.2' + classpath 'com.android.tools.build:gradle:8.0.2' // NOTE: Do not place your application dependencies here; they belong diff --git a/gradle.properties b/gradle.properties index 1cdcc0e8..d4873113 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ # -# Copyright © 2023 Damyan Ivanov. +# Copyright © 2024 Damyan Ivanov. # This file is part of MoLe. # MoLe is free software: you can distribute it and/or modify it # under the term of the GNU General Public License as published by @@ -30,4 +30,8 @@ org.gradle.jvmargs=-Xmx1536m # org.gradle.parallel=true android.debug.obsoleteApi=true android.useAndroidX=true -android.enableJetifier=false \ No newline at end of file +android.enableJetifier=false +android.enableR8.fullMode=false +android.defaults.buildfeatures.buildconfig=true +android.nonTransitiveRClass=false +android.nonFinalResIds=false diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 08b1a0c0..855f89cc 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,21 @@ -#Sat Nov 28 08:24:27 EET 2020 +# +# Copyright © 2024 Damyan Ivanov. +# This file is part of MoLe. +# MoLe is free software: you can distribute it and/or modify it +# under the term of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your opinion), any later version. +# +# MoLe is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License terms for details. +# +# You should have received a copy of the GNU General Public License +# along with MoLe. If not, see . +# distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.2-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.0-bin.zip -- 2.39.2 From 2590f76b3fa0dadba71f2d851442e6ff0b435c4d Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 17 Mar 2024 11:17:48 +0200 Subject: [PATCH 09/16] allow user certificates --- app/src/main/res/xml/network_security_config.xml | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/app/src/main/res/xml/network_security_config.xml b/app/src/main/res/xml/network_security_config.xml index 223e12e8..c1da3227 100644 --- a/app/src/main/res/xml/network_security_config.xml +++ b/app/src/main/res/xml/network_security_config.xml @@ -1,5 +1,5 @@ - + + + + + + \ No newline at end of file -- 2.39.2 From 8f07a6715eb45406651ce5afcb3253ee577d688a Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 17 Mar 2024 11:30:40 +0200 Subject: [PATCH 10/16] further suggested build changes --- gradle.properties | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/gradle.properties b/gradle.properties index d4873113..b4f3ea2a 100644 --- a/gradle.properties +++ b/gradle.properties @@ -15,23 +15,25 @@ # along with MoLe. If not, see . # -# Project-wide Gradle settings. -# IDE (e.g. Android Studio) users: -# Gradle settings configured through the IDE *will override* -# any settings specified in this file. -# For more details on how to configure your build environment visit +## For more details on how to configure your build environment visit # http://www.gradle.org/docs/current/userguide/build_environment.html +# # Specifies the JVM arguments used for the daemon process. # The setting is particularly useful for tweaking memory settings. -org.gradle.jvmargs=-Xmx1536m +# Default value: -Xmx1024m -XX:MaxPermSize=256m +# org.gradle.jvmargs=-Xmx2048m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 +# # When configured, Gradle will run in incubating parallel mode. # This option should only be used with decoupled projects. More details, visit # http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects # org.gradle.parallel=true +#Sun Mar 17 11:29:00 EET 2024 android.debug.obsoleteApi=true -android.useAndroidX=true +android.defaults.buildfeatures.buildconfig=true android.enableJetifier=false android.enableR8.fullMode=false -android.defaults.buildfeatures.buildconfig=true -android.nonTransitiveRClass=false android.nonFinalResIds=false +android.nonTransitiveRClass=false +android.useAndroidX=true +org.gradle.jvmargs=-Xmx1024M -Dkotlin.daemon.jvm.options\="-Xmx1536M" +org.gradle.unsafe.configuration-cache=true -- 2.39.2 From 18cc90fd341614bb30a321a7e790ff089828b76e Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Tue, 19 Mar 2024 04:45:23 +0000 Subject: [PATCH 11/16] release v0.21.7 (56) --- CHANGES.md | 7 +++++++ app/build.gradle | 4 ++-- metadata/bg-BG/changelogs/56.txt | 4 ++++ metadata/en-US/changelogs/56.txt | 4 ++++ 4 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 metadata/bg-BG/changelogs/56.txt create mode 100644 metadata/en-US/changelogs/56.txt diff --git a/CHANGES.md b/CHANGES.md index e8b5efc7..02f84284 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,5 +1,12 @@ # Changes +## [0.21.7] = 2024-03-19 + +* FIXES: + + allow user certificates in network security config +* OTHERS: + + bump gradle version + ## [0.21.6] - 2023-06-20 * FIXES diff --git a/app/build.gradle b/app/build.gradle index 7b29013a..71673f6e 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -24,8 +24,8 @@ android { minSdkVersion 22 targetSdkVersion 31 vectorDrawables.useSupportLibrary true - versionCode 55 - versionName '0.21.6' + versionCode 56 + versionName '0.21.7' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" javaCompileOptions { annotationProcessorOptions { diff --git a/metadata/bg-BG/changelogs/56.txt b/metadata/bg-BG/changelogs/56.txt new file mode 100644 index 00000000..218ba4a3 --- /dev/null +++ b/metadata/bg-BG/changelogs/56.txt @@ -0,0 +1,4 @@ +* ПОПРАВКИ + + Позволяване на потребителски сертификати в настройките за сигурността на мрежовите връзки +* ДРУГИ + + Обновена версия на gradle diff --git a/metadata/en-US/changelogs/56.txt b/metadata/en-US/changelogs/56.txt new file mode 100644 index 00000000..9b7d3ac4 --- /dev/null +++ b/metadata/en-US/changelogs/56.txt @@ -0,0 +1,4 @@ +* FIXES: + + allow user certificates in network security config +* OTHERS: + + bump gradle version -- 2.39.2 From e687d63b107a215ba3b28e7028b9235cdf645bc0 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 31 Mar 2024 10:17:32 +0300 Subject: [PATCH 12/16] add shortcut method for casting and drop the one accessing the underlying account object --- .../mobileledger/model/AccountListItem.java | 23 ++++++++++++++----- .../net/ktnx/mobileledger/ui/MainModel.java | 2 ++ .../AccountSummaryAdapter.java | 17 ++++++++++---- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java b/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java index dfd3d982..1efe1962 100644 --- a/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java +++ b/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java @@ -34,12 +34,19 @@ public abstract class AccountListItem { else throw new RuntimeException("Unsupported sub-class " + this); } - @NotNull - public LedgerAccount getAccount() { - if (this instanceof Account) - return ((Account) this).account; - - throw new IllegalStateException(String.format("Item type is not Account, but %s", this)); + public boolean isAccount() { + return this instanceof Account; + } + public Account toAccount() { + assert isAccount(); + return ((Account) this); + } + public boolean isHeader() { + return this instanceof Header; + } + public Header toHeader() { + assert isHeader(); + return ((Header) this); } public enum Type {ACCOUNT, HEADER} @@ -59,6 +66,10 @@ public abstract class AccountListItem { ((Account) other).account.getAmountsString() .equals(account.getAmountsString()); } + @NotNull + public LedgerAccount getAccount() { + return account; + } } public static class Header extends AccountListItem { diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java index 329109fd..dfa6b5c5 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java @@ -38,6 +38,7 @@ import java.util.Locale; public class MainModel extends ViewModel { public final MutableLiveData foundTransactionItemIndex = new MutableLiveData<>(null); private final MutableLiveData updatingFlag = new MutableLiveData<>(false); + private final MutableLiveData showZeroBalanceAccounts = new MutableLiveData<>(true); private final MutableLiveData accountFilter = new MutableLiveData<>(null); private final MutableLiveData> displayedTransactions = new MutableLiveData<>(new ArrayList<>()); @@ -66,6 +67,7 @@ public class MainModel extends ViewModel { public void setFirstTransactionDate(SimpleDate earliestDate) { this.firstTransactionDate = earliestDate; } + public MutableLiveData getShowZeroBalanceAccounts() {return showZeroBalanceAccounts;} public MutableLiveData getAccountFilter() { return accountFilter; } diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java index d7da335d..88970641 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java @@ -66,8 +66,10 @@ public class AccountSummaryAdapter extends RecyclerView.Adapter payloads) { - LedgerAccount acc = item.getAccount(); + LedgerAccount acc = item.toAccount() + .getAccount(); Change changes = new Change(); if (payloads != null) { -- 2.39.2 From 20b1574421ee368ca690d1e4de0f666ebfec6520 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 31 Mar 2024 10:26:18 +0300 Subject: [PATCH 13/16] add ability to hide all-zero accounts from the account list --- .../net/ktnx/mobileledger/dao/AccountDAO.java | 17 +++- .../mobileledger/model/AccountListItem.java | 5 +- .../mobileledger/model/LedgerAccount.java | 16 +++- .../net/ktnx/mobileledger/ui/MainModel.java | 4 +- .../AccountSummaryAdapter.java | 6 +- .../AccountSummaryFragment.java | 94 +++++++++++++++++-- app/src/main/res/menu/account_list.xml | 32 +++++++ app/src/main/res/values-bg/strings.xml | 4 +- app/src/main/res/values/strings.xml | 4 +- 9 files changed, 158 insertions(+), 24 deletions(-) create mode 100644 app/src/main/res/menu/account_list.xml diff --git a/app/src/main/java/net/ktnx/mobileledger/dao/AccountDAO.java b/app/src/main/java/net/ktnx/mobileledger/dao/AccountDAO.java index 0c581787..5ad4c90f 100644 --- a/app/src/main/java/net/ktnx/mobileledger/dao/AccountDAO.java +++ b/app/src/main/java/net/ktnx/mobileledger/dao/AccountDAO.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2024 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -78,12 +78,19 @@ public abstract class AccountDAO extends BaseDAO { @Query("DELETE FROM accounts") public abstract void deleteAllSync(); - @Query("SELECT * FROM accounts WHERE profile_id=:profileId ORDER BY name") - public abstract LiveData> getAll(long profileId); + @Query("SELECT * FROM accounts WHERE profile_id=:profileId AND IIF(:includeZeroBalances=1, 1," + + " (EXISTS(SELECT 1 FROM account_values av WHERE av.account_id=accounts.id AND av.value" + + " <> 0) OR EXISTS(SELECT 1 FROM accounts a WHERE a.parent_name = accounts.name))) " + + "ORDER BY name") + public abstract LiveData> getAll(long profileId, boolean includeZeroBalances); @Transaction - @Query("SELECT * FROM accounts WHERE profile_id = :profileId ORDER BY name") - public abstract LiveData> getAllWithAmounts(long profileId); + @Query("SELECT * FROM accounts WHERE profile_id = :profileId AND IIF(:includeZeroBalances=1, " + + "1, (EXISTS(SELECT 1 FROM account_values av WHERE av.account_id=accounts.id AND av" + + ".value <> 0) OR EXISTS(SELECT 1 FROM accounts a WHERE a.parent_name = accounts.name))" + + ") ORDER BY name") + public abstract LiveData> getAllWithAmounts(long profileId, + boolean includeZeroBalances); @Query("SELECT * FROM accounts WHERE id=:id") public abstract Account getByIdSync(long id); diff --git a/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java b/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java index 1efe1962..807e93d3 100644 --- a/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java +++ b/app/src/main/java/net/ktnx/mobileledger/model/AccountListItem.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2024 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -70,6 +70,9 @@ public abstract class AccountListItem { public LedgerAccount getAccount() { return account; } + public boolean allAmountsAreZero() { + return account.allAmountsAreZero(); + } } public static class Header extends AccountListItem { diff --git a/app/src/main/java/net/ktnx/mobileledger/model/LedgerAccount.java b/app/src/main/java/net/ktnx/mobileledger/model/LedgerAccount.java index 1be684cf..c2e62772 100644 --- a/app/src/main/java/net/ktnx/mobileledger/model/LedgerAccount.java +++ b/app/src/main/java/net/ktnx/mobileledger/model/LedgerAccount.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2024 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -201,13 +201,21 @@ public class LedgerAccount { if (amounts != null) amounts.clear(); } - public boolean amountsExpanded() { return amountsExpanded; } - public void setAmountsExpanded(boolean flag) { amountsExpanded = flag; } - public void toggleAmountsExpanded() { amountsExpanded = !amountsExpanded; } + public boolean amountsExpanded() {return amountsExpanded;} + public void setAmountsExpanded(boolean flag) {amountsExpanded = flag;} + public void toggleAmountsExpanded() {amountsExpanded = !amountsExpanded;} public void propagateAmountsTo(LedgerAccount acc) { for (LedgerAmount a : amounts) a.propagateToAccount(acc); } + public boolean allAmountsAreZero() { + for (LedgerAmount a : amounts) { + if (a.getAmount() != 0) + return false; + } + + return true; + } public List getAmounts() { return amounts; } diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java b/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java index dfa6b5c5..a8b957dc 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/MainModel.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2024 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -46,7 +46,6 @@ public class MainModel extends ViewModel { private SimpleDate firstTransactionDate; private SimpleDate lastTransactionDate; transient private RetrieveTransactionsTask retrieveTransactionsTask; - transient private Thread displayedAccountsUpdater; private TransactionsDisplayedFilter displayedTransactionsUpdater; public LiveData getUpdatingFlag() { return updatingFlag; @@ -83,6 +82,7 @@ public class MainModel extends ViewModel { return; } Profile profile = Data.getProfile(); + assert profile != null; retrieveTransactionsTask = new RetrieveTransactionsTask(profile); Logger.debug("db", "Created a background transaction retrieval task"); diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java index 88970641..dcc16f36 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryAdapter.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2024 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -17,6 +17,8 @@ package net.ktnx.mobileledger.ui.account_summary; +import static net.ktnx.mobileledger.utils.Logger.debug; + import android.content.res.Resources; import android.view.LayoutInflater; import android.view.View; @@ -48,8 +50,6 @@ import org.jetbrains.annotations.NotNull; import java.util.List; import java.util.Locale; -import static net.ktnx.mobileledger.utils.Logger.debug; - public class AccountSummaryAdapter extends RecyclerView.Adapter { public static final int AMOUNT_LIMIT = 3; private static final int ITEM_TYPE_HEADER = 1; diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryFragment.java b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryFragment.java index 35a9edb7..447e57e7 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryFragment.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/account_summary/AccountSummaryFragment.java @@ -1,5 +1,5 @@ /* - * Copyright © 2021 Damyan Ivanov. + * Copyright © 2024 Damyan Ivanov. * This file is part of MoLe. * MoLe is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -17,9 +17,14 @@ package net.ktnx.mobileledger.ui.account_summary; +import static net.ktnx.mobileledger.utils.Logger.debug; + import android.content.Context; import android.os.Bundle; import android.view.LayoutInflater; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; @@ -31,6 +36,7 @@ import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; import androidx.swiperefreshlayout.widget.SwipeRefreshLayout; +import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.GeneralBackgroundTasks; import net.ktnx.mobileledger.databinding.AccountSummaryFragmentBinding; import net.ktnx.mobileledger.db.AccountWithAmounts; @@ -51,11 +57,11 @@ import java.util.ArrayList; import java.util.HashMap; import java.util.List; -import static net.ktnx.mobileledger.utils.Logger.debug; - public class AccountSummaryFragment extends MobileLedgerListFragment { public AccountSummaryAdapter modelAdapter; private AccountSummaryFragmentBinding b; + private MenuItem menuShowZeroBalances; + private MainModel model; @Override public void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -82,7 +88,7 @@ public class AccountSummaryFragment extends MobileLedgerListFragment { debug("flow", "AccountSummaryFragment.onActivityCreated()"); super.onViewCreated(view, savedInstanceState); - MainModel model = new ViewModelProvider(requireActivity()).get(MainModel.class); + model = new ViewModelProvider(requireActivity()).get(MainModel.class); Data.backgroundTasksRunning.observe(this.getViewLifecycleOwner(), this::onBackgroundTaskRunningChanged); @@ -109,15 +115,40 @@ public class AccountSummaryFragment extends MobileLedgerListFragment { model.scheduleTransactionListRetrieval(); }); - Data.observeProfile(this, this::onProfileChanged); + Data.observeProfile(this, profile -> onProfileChanged(profile, Boolean.TRUE.equals( + model.getShowZeroBalanceAccounts() + .getValue()))); + } + @Override + public void onCreateOptionsMenu(@NotNull Menu menu, @NotNull MenuInflater inflater) { + inflater.inflate(R.menu.account_list, menu); + + menuShowZeroBalances = menu.findItem(R.id.menu_account_list_show_zero_balances); + if ((menuShowZeroBalances == null)) + throw new AssertionError(); + + menuShowZeroBalances.setOnMenuItemClickListener(menuItem -> { + model.getShowZeroBalanceAccounts() + .setValue(Boolean.FALSE.equals(model.getShowZeroBalanceAccounts() + .getValue())); + return true; + }); + + model.getShowZeroBalanceAccounts() + .observe(this, v -> { + menuShowZeroBalances.setChecked(v); + onProfileChanged(Data.getProfile(), v); + }); + + super.onCreateOptionsMenu(menu, inflater); } - private void onProfileChanged(Profile profile) { + private void onProfileChanged(Profile profile, boolean showZeroBalanceAccounts) { if (profile == null) return; DB.get() .getAccountDAO() - .getAllWithAmounts(profile.getId()) + .getAllWithAmounts(profile.getId(), showZeroBalanceAccounts) .observe(getViewLifecycleOwner(), list -> GeneralBackgroundTasks.run(() -> { List adapterList = new ArrayList<>(); adapterList.add(new AccountListItem.Header(Data.lastAccountsUpdateText)); @@ -134,8 +165,57 @@ public class AccountSummaryFragment extends MobileLedgerListFragment { adapterList.add(new AccountListItem.Account(account)); accMap.put(dbAcc.account.getName(), account); } + + if (!showZeroBalanceAccounts) { + removeZeroAccounts(adapterList); + } modelAdapter.setAccounts(adapterList); Data.lastUpdateAccountCount.postValue(adapterList.size() - 1); })); } + private void removeZeroAccounts(List list) { + boolean removed = true; + + while (removed) { + AccountListItem last = null; + removed = false; + List newList = new ArrayList<>(); + + for (AccountListItem item : list) { + if (last == null) { + last = item; + continue; + } + + if (!last.isAccount() || !last.toAccount() + .allAmountsAreZero() || last.toAccount() + .getAccount() + .isParentOf( + item.toAccount() + .getAccount())) + { + newList.add(last); + } + else { + removed = true; + } + + last = item; + } + + if (last != null) { + if (last.getType() != AccountListItem.Type.ACCOUNT || + !((AccountListItem.Account) last).allAmountsAreZero()) + { + newList.add(last); + } + else { + removed = true; + } + } + + list.clear(); + list.addAll(newList); + } + } } diff --git a/app/src/main/res/menu/account_list.xml b/app/src/main/res/menu/account_list.xml new file mode 100644 index 00000000..5a761610 --- /dev/null +++ b/app/src/main/res/menu/account_list.xml @@ -0,0 +1,32 @@ + + + + + + \ No newline at end of file diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index 4ba6fe38..ccb47516 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -1,6 +1,6 @@