X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fmodel%2FData.java;h=3520711bff846952c7c2c6bc61b73cdb706fb730;hb=93545c6fbf1244fbd96ecfc50e1115dbdc25f9ae;hp=aaaf4991878d580a716b5f3cc3326e67e6cb58b9;hpb=f509116c89a72e6db0aa09c6893798fb41404cca;p=mobile-ledger.git diff --git a/app/src/main/java/net/ktnx/mobileledger/model/Data.java b/app/src/main/java/net/ktnx/mobileledger/model/Data.java index aaaf4991..3520711b 100644 --- a/app/src/main/java/net/ktnx/mobileledger/model/Data.java +++ b/app/src/main/java/net/ktnx/mobileledger/model/Data.java @@ -1,5 +1,5 @@ /* - * Copyright © 2020 Damyan Ivanov. + * Copyright © 2021 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 @@ -19,7 +19,6 @@ package net.ktnx.mobileledger.model; import android.database.Cursor; import android.database.sqlite.SQLiteDatabase; -import android.os.AsyncTask; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -29,16 +28,15 @@ import androidx.lifecycle.Observer; import net.ktnx.mobileledger.App; import net.ktnx.mobileledger.async.RetrieveTransactionsTask; -import net.ktnx.mobileledger.ui.activity.MainActivity; import net.ktnx.mobileledger.utils.LockHolder; import net.ktnx.mobileledger.utils.Locker; import net.ktnx.mobileledger.utils.Logger; import net.ktnx.mobileledger.utils.MLDB; -import net.ktnx.mobileledger.utils.ObservableList; -import net.ktnx.mobileledger.utils.SimpleDate; +import net.ktnx.mobileledger.utils.ObservableValue; -import java.lang.ref.WeakReference; import java.text.NumberFormat; +import java.text.ParseException; +import java.text.ParsePosition; import java.util.ArrayList; import java.util.Date; import java.util.List; @@ -49,31 +47,29 @@ import java.util.concurrent.atomic.AtomicInteger; import static net.ktnx.mobileledger.utils.Logger.debug; public final class Data { - public static final ObservableList transactions = - new ObservableList<>(new ArrayList<>()); - public static final MutableLiveData earliestTransactionDate = - new MutableLiveData<>(null); - public static final MutableLiveData latestTransactionDate = - new MutableLiveData<>(null); public static final MutableLiveData backgroundTasksRunning = new MutableLiveData<>(false); public static final MutableLiveData backgroundTaskProgress = new MutableLiveData<>(); - public static final MutableLiveData lastUpdateDate = new MutableLiveData<>(); public static final MutableLiveData> profiles = new MutableLiveData<>(null); - public static final MutableLiveData accountFilter = new MutableLiveData<>(); public static final MutableLiveData currencySymbolPosition = new MutableLiveData<>(); public static final MutableLiveData currencyGap = new MutableLiveData<>(true); public static final MutableLiveData locale = new MutableLiveData<>(); public static final MutableLiveData drawerOpen = new MutableLiveData<>(false); + public static final MutableLiveData lastUpdateDate = new MutableLiveData<>(null); + public static final MutableLiveData lastUpdateTransactionCount = + new MutableLiveData<>(0); + public static final MutableLiveData lastUpdateAccountCount = new MutableLiveData<>(0); + public static final ObservableValue lastTransactionsUpdateText = + new ObservableValue<>(); + public static final ObservableValue lastAccountsUpdateText = new ObservableValue<>(); private static final MutableLiveData profile = new InertMutableLiveData<>(); private static final AtomicInteger backgroundTaskCount = new AtomicInteger(0); private static final Locker profilesLocker = new Locker(); - public static MutableLiveData foundTransactionItemIndex = new MutableLiveData<>(null); - private static RetrieveTransactionsTask retrieveTransactionsTask; + private static NumberFormat numberFormatter; static { locale.setValue(Locale.getDefault()); @@ -98,10 +94,13 @@ public final class Data { backgroundTasksRunning.postValue(cnt > 0); } public static void setCurrentProfile(@NonNull MobileLedgerProfile newProfile) { - MLDB.setOption(MLDB.OPT_PROFILE_UUID, newProfile.getUuid()); - stopTransactionsRetrieval(); + MLDB.setLongOption(MLDB.OPT_PROFILE_ID, newProfile.getId()); profile.setValue(newProfile); } + public static void postCurrentProfile(@NonNull MobileLedgerProfile newProfile) { + MLDB.setLongOption(MLDB.OPT_PROFILE_ID, newProfile.getId()); + profile.postValue(newProfile); + } public static int getProfileIndex(MobileLedgerProfile profile) { try (LockHolder ignored = profilesLocker.lockForReading()) { List prList = profiles.getValue(); @@ -117,15 +116,14 @@ public final class Data { } } @SuppressWarnings("WeakerAccess") - public static int getProfileIndex(String profileUUID) { + public static int getProfileIndex(long profileId) { try (LockHolder ignored = profilesLocker.lockForReading()) { List prList = profiles.getValue(); if (prList == null) throw new AssertionError(); for (int i = 0; i < prList.size(); i++) { MobileLedgerProfile p = prList.get(i); - if (p.getUuid() - .equals(profileUUID)) + if (p.getId() == profileId) return i; } @@ -133,13 +131,13 @@ public final class Data { } } public static int retrieveCurrentThemeIdFromDb() { - String profileUUID = MLDB.getOption(MLDB.OPT_PROFILE_UUID, null); - if (profileUUID == null) + long profileId = MLDB.getLongOption(MLDB.OPT_PROFILE_ID, 0); + if (profileId == 0) return -1; SQLiteDatabase db = App.getDatabase(); try (Cursor c = db.rawQuery("SELECT theme from profiles where uuid=?", - new String[]{profileUUID})) + new String[]{String.valueOf(profileId)})) { if (c.moveToNext()) return c.getInt(0); @@ -148,18 +146,18 @@ public final class Data { return -1; } @Nullable - public static MobileLedgerProfile getProfile(String profileUUID) { + public static MobileLedgerProfile getProfile(long profileId) { MobileLedgerProfile profile; try (LockHolder readLock = profilesLocker.lockForReading()) { List prList = profiles.getValue(); if ((prList == null) || prList.isEmpty()) { readLock.close(); try (LockHolder ignored = profilesLocker.lockForWriting()) { - profile = MobileLedgerProfile.loadAllFromDB(profileUUID); + profile = MobileLedgerProfile.loadAllFromDB(profileId); } } else { - int i = getProfileIndex(profileUUID); + int i = getProfileIndex(profileId); if (i == -1) i = 0; profile = prList.get(i); @@ -167,30 +165,6 @@ public final class Data { } return profile; } - public synchronized static void scheduleTransactionListRetrieval(MainActivity activity) { - if (retrieveTransactionsTask != null) { - Logger.debug("db", "Ignoring request for transaction retrieval - already active"); - return; - } - MobileLedgerProfile pr = profile.getValue(); - if (pr == null) { - Logger.debug("ui", "Ignoring refresh -- no current profile"); - return; - } - - retrieveTransactionsTask = - new RetrieveTransactionsTask(new WeakReference<>(activity), profile.getValue()); - Logger.debug("db", "Created a background transaction retrieval task"); - - retrieveTransactionsTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); - } - public static synchronized void stopTransactionsRetrieval() { - if (retrieveTransactionsTask != null) - retrieveTransactionsTask.cancel(false); - } - public static void transactionRetrievalDone() { - retrieveTransactionsTask = null; - } public static void refreshCurrencyData(Locale locale) { NumberFormat formatter = NumberFormat.getCurrencyInstance(locale); java.util.Currency currency = formatter.getCurrency(); @@ -217,8 +191,23 @@ public final class Data { } else currencySymbolPosition.setValue(Currency.Position.none); - } + NumberFormat newNumberFormatter = NumberFormat.getNumberInstance(); + newNumberFormatter.setParseIntegerOnly(false); + newNumberFormatter.setGroupingUsed(true); + newNumberFormatter.setGroupingUsed(true); + newNumberFormatter.setMinimumIntegerDigits(1); + newNumberFormatter.setMinimumFractionDigits(2); + + numberFormatter = newNumberFormatter; + } + public static String formatCurrency(float number) { + NumberFormat formatter = NumberFormat.getCurrencyInstance(locale.getValue()); + return formatter.format(number); + } + public static String formatNumber(float number) { + return numberFormatter.format(number); + } public static void observeProfile(LifecycleOwner lifecycleOwner, Observer observer) { profile.observe(lifecycleOwner, observer); @@ -228,14 +217,23 @@ public final class Data { if (currentProfile != null) return currentProfile; - String profileUUID = MLDB.getOption(MLDB.OPT_PROFILE_UUID, null); - MobileLedgerProfile startupProfile = getProfile(profileUUID); + long profileId = MLDB.getLongOption(MLDB.OPT_PROFILE_ID, 0); + MobileLedgerProfile startupProfile = getProfile(profileId); if (startupProfile != null) setCurrentProfile(startupProfile); + Logger.debug("profile", "initProfile() returning " + startupProfile); return startupProfile; } public static void removeProfileObservers(LifecycleOwner owner) { profile.removeObservers(owner); } + public static float parseNumber(String str) throws ParseException { + ParsePosition pos = new ParsePosition(0); + Number parsed = numberFormatter.parse(str); + if (parsed == null || pos.getErrorIndex() > -1) + throw new ParseException("Error parsing '" + str + "'", pos.getErrorIndex()); + + return parsed.floatValue(); + } } \ No newline at end of file