From e3872d583f324e225580a6fd05568d36e4ba0db0 Mon Sep 17 00:00:00 2001 From: Damyan Ivanov Date: Sun, 6 Jan 2019 08:14:13 +0000 Subject: [PATCH] use profiles for connection parameters included migration from shared preferences --- .../async/RetrieveTransactionsTask.java | 35 +++--------- .../async/SaveTransactionTask.java | 4 +- .../net/ktnx/mobileledger/model/Data.java | 2 +- .../ui/activity/MainActivity.java | 54 +++++++++++++------ .../net/ktnx/mobileledger/utils/MLDB.java | 4 ++ .../ktnx/mobileledger/utils/NetworkUtil.java | 26 +++++---- 6 files changed, 68 insertions(+), 57 deletions(-) diff --git a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java index ad064121..12e53cb6 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java @@ -18,7 +18,6 @@ package net.ktnx.mobileledger.async; import android.annotation.SuppressLint; -import android.content.SharedPreferences; import android.database.sqlite.SQLiteDatabase; import android.os.AsyncTask; import android.os.OperationCanceledException; @@ -29,6 +28,7 @@ import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerAccount; import net.ktnx.mobileledger.model.LedgerTransaction; import net.ktnx.mobileledger.model.LedgerTransactionAccount; +import net.ktnx.mobileledger.model.MobileLedgerProfile; import net.ktnx.mobileledger.ui.activity.MainActivity; import net.ktnx.mobileledger.utils.MLDB; import net.ktnx.mobileledger.utils.NetworkUtil; @@ -48,11 +48,11 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -public class RetrieveTransactionsTask extends - AsyncTask { +public class RetrieveTransactionsTask + extends AsyncTask { public static final int MATCHING_TRANSACTIONS_LIMIT = 50; private static final Pattern transactionStartPattern = Pattern.compile("([\\d.-]+)"); + "id=\"transaction-(\\d+)\">([\\d.-]+)"); private static final Pattern transactionDescriptionPattern = Pattern.compile(" contextRef; protected int error; - // %3A is '=' - private Pattern ledger_title_re = Pattern.compile("

([^<]+)

"); Pattern account_name_re = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\""); Pattern account_value_re = Pattern.compile( "\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?"); Pattern tr_end_re = Pattern.compile(""); Pattern descriptions_line_re = Pattern.compile("\\bdescriptionsSuggester\\s*=\\s*new\\b"); Pattern description_items_re = Pattern.compile("\"value\":\"([^\"]+)\""); + // %3A is '=' private boolean success; public RetrieveTransactionsTask(WeakReference contextRef) { this.contextRef = contextRef; @@ -105,7 +104,8 @@ public class RetrieveTransactionsTask extends } @SuppressLint("DefaultLocale") @Override - protected Void doInBackground(Params... params) { + protected Void doInBackground(Void... params) { + MobileLedgerProfile profile = Data.profile.get(); Progress progress = new Progress(); int maxTransactionId = Progress.INDETERMINATE; success = false; @@ -114,8 +114,7 @@ public class RetrieveTransactionsTask extends LedgerAccount lastAccount = null; Data.backgroundTaskCount.incrementAndGet(); try { - HttpURLConnection http = - NetworkUtil.prepare_connection(params[0].getBackendPref(), "journal"); + HttpURLConnection http = NetworkUtil.prepare_connection("journal"); http.setAllowUserInteraction(false); publishProgress(progress); MainActivity ctx = getContext(); @@ -168,13 +167,6 @@ public class RetrieveTransactionsTask extends state = ParserState.EXPECTING_ACCOUNT_AMOUNT; L("→ expecting account amount"); } - else if (ledgerTitle == null) { - m = ledger_title_re.matcher(line); - if (m.find()) { - ledgerTitle = m.group(1); - Data.ledgerTitle.set(ledgerTitle); - } - } break; case EXPECTING_ACCOUNT_AMOUNT: @@ -378,17 +370,6 @@ public class RetrieveTransactionsTask extends EXPECTING_TRANSACTION_DESCRIPTION, EXPECTING_TRANSACTION_DETAILS } - public static class Params { - private SharedPreferences backendPref; - - public Params(SharedPreferences backendPref) { - this.backendPref = backendPref; - } - SharedPreferences getBackendPref() { - return backendPref; - } - } - public class Progress { public static final int INDETERMINATE = -1; private int progress; diff --git a/app/src/main/java/net/ktnx/mobileledger/async/SaveTransactionTask.java b/app/src/main/java/net/ktnx/mobileledger/async/SaveTransactionTask.java index 9cd669e2..5ccbaaca 100644 --- a/app/src/main/java/net/ktnx/mobileledger/async/SaveTransactionTask.java +++ b/app/src/main/java/net/ktnx/mobileledger/async/SaveTransactionTask.java @@ -1,5 +1,5 @@ /* - * Copyright © 2018 Damyan Ivanov. + * Copyright © 2019 Damyan Ivanov. * This file is part of Mobile-Ledger. * Mobile-Ledger is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -57,7 +57,7 @@ public class SaveTransactionTask extends AsyncTask> descriptions = new ObservableValue<>(); public static ObservableAtomicInteger backgroundTaskCount = new ObservableAtomicInteger(0); public static ObservableValue lastUpdateDate = new ObservableValue<>(); - public static ObservableValue ledgerTitle = new ObservableValue<>(); + public static ObservableValue profile = new ObservableValue<>(); } diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java index e245a250..2ec65859 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java @@ -18,10 +18,10 @@ package net.ktnx.mobileledger.ui.activity; import android.content.Intent; +import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.os.Build; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.annotation.ColorInt; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; @@ -44,6 +44,7 @@ import net.ktnx.mobileledger.R; import net.ktnx.mobileledger.async.RetrieveTransactionsTask; import net.ktnx.mobileledger.model.Data; import net.ktnx.mobileledger.model.LedgerAccount; +import net.ktnx.mobileledger.model.MobileLedgerProfile; import net.ktnx.mobileledger.ui.MobileLedgerListFragment; import net.ktnx.mobileledger.ui.account_summary.AccountSummaryFragment; import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment; @@ -55,6 +56,7 @@ import java.time.format.DateTimeFormatter; import java.util.Date; import java.util.Observable; import java.util.Observer; +import java.util.UUID; public class MainActivity extends AppCompatActivity { public MobileLedgerListFragment currentFragment = null; @@ -95,6 +97,40 @@ public class MainActivity extends AppCompatActivity { Toolbar toolbar = findViewById(R.id.toolbar); setSupportActionBar(toolbar); + Data.profile.addObserver(new Observer() { + @Override + public void update(Observable o, Object arg) { + MobileLedgerProfile profile = Data.profile.get(); + runOnUiThread(() -> { + if (profile == null) toolbar.setSubtitle(""); + else toolbar.setSubtitle(profile.getName()); + }); + } + }); + + String profileUUID = MLDB.get_option_value(MLDB.OPT_PROFILE_UUID, null); + if (profileUUID == null) { + SharedPreferences backend = getSharedPreferences("backend", MODE_PRIVATE); + Log.d("profiles", "Migrating from preferences to profiles"); + // migration to multiple profiles + profileUUID = UUID.randomUUID().toString(); + MobileLedgerProfile profile = new MobileLedgerProfile(profileUUID, "default", + backend.getString("backend_url", ""), + backend.getBoolean("backend_use_http_auth", false), + backend.getString("backend_auth_user", null), + backend.getString("backend_auth_password", null)); + profile.storeInDB(); + SharedPreferences.Editor editor = backend.edit(); + editor.clear(); + editor.apply(); + Data.profile.set(profile); + MLDB.set_option_value(MLDB.OPT_PROFILE_UUID, profileUUID); + } + else { + MobileLedgerProfile profile = MobileLedgerProfile.loadUUIDFromDB(profileUUID); + Data.profile.set(profile); + } + drawer = findViewById(R.id.drawer_layout); ActionBarDrawerToggle toggle = new ActionBarDrawerToggle(this, drawer, toolbar, R.string.navigation_drawer_open, @@ -167,17 +203,6 @@ public class MainActivity extends AppCompatActivity { }); } }); - - Data.ledgerTitle.addObserver(new Observer() { - @Override - public void update(Observable o, Object arg) { - runOnUiThread(() -> { - String title = Data.ledgerTitle.get(); - if (title == null) toolbar.setSubtitle(""); - else toolbar.setSubtitle(title); - }); - } - }); } public void fab_new_transaction_clicked(View view) { Intent intent = new Intent(this, NewTransactionActivity.class); @@ -321,10 +346,7 @@ public class MainActivity extends AppCompatActivity { public void scheduleTransactionListRetrieval() { retrieveTransactionsTask = new RetrieveTransactionsTask(new WeakReference<>(this)); - RetrieveTransactionsTask.Params params = new RetrieveTransactionsTask.Params( - PreferenceManager.getDefaultSharedPreferences(this)); - - retrieveTransactionsTask.execute(params); + retrieveTransactionsTask.execute(); bTransactionListCancelDownload.setEnabled(true); } public void onStopTransactionRefreshClick(View view) { diff --git a/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java b/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java index 47a5e965..e0dc9f1a 100644 --- a/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java +++ b/app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java @@ -33,6 +33,8 @@ import android.widget.AutoCompleteTextView; import android.widget.FilterQueryProvider; import android.widget.SimpleCursorAdapter; +import org.jetbrains.annotations.NonNls; + import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; @@ -47,6 +49,8 @@ public final class MLDB { public static final String DESCRIPTION_HISTORY_TABLE = "description_history"; public static final String OPT_TRANSACTION_LIST_STAMP = "transaction_list_last_update"; public static final String OPT_LAST_REFRESH = "last_refresh"; + @NonNls + public static final String OPT_PROFILE_UUID = "profile_uuid"; private static MobileLedgerDatabase helperForReading, helperForWriting; private static Application context; private static void checkState() { diff --git a/app/src/main/java/net/ktnx/mobileledger/utils/NetworkUtil.java b/app/src/main/java/net/ktnx/mobileledger/utils/NetworkUtil.java index 44a7eb9d..86417510 100644 --- a/app/src/main/java/net/ktnx/mobileledger/utils/NetworkUtil.java +++ b/app/src/main/java/net/ktnx/mobileledger/utils/NetworkUtil.java @@ -1,5 +1,5 @@ /* - * Copyright © 2018 Damyan Ivanov. + * Copyright © 2019 Damyan Ivanov. * This file is part of Mobile-Ledger. * Mobile-Ledger is free software: you can distribute it and/or modify it * under the term of the GNU General Public License as published by @@ -17,26 +17,30 @@ package net.ktnx.mobileledger.utils; -import android.content.SharedPreferences; import android.util.Base64; import android.util.Log; +import net.ktnx.mobileledger.model.Data; +import net.ktnx.mobileledger.model.MobileLedgerProfile; + import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; public final class NetworkUtil { private static final int thirtySeconds = 30000; - public static HttpURLConnection prepare_connection(SharedPreferences pref, String path) throws - IOException { - final String backend_url = pref.getString("backend_url", ""); - final boolean use_auth = pref.getBoolean("backend_use_http_auth", false); - Log.d("network", "Connecting to "+backend_url + "/" + path); - HttpURLConnection http = (HttpURLConnection) new URL(backend_url + "/" + path).openConnection(); + public static HttpURLConnection prepare_connection(String path) throws IOException { + MobileLedgerProfile profile = Data.profile.get(); + final String backend_url = profile.getUrl(); + final boolean use_auth = profile.isUseAuthentication(); + Log.d("network", "Connecting to " + backend_url + "/" + path); + HttpURLConnection http = + (HttpURLConnection) new URL(backend_url + "/" + path).openConnection(); if (use_auth) { - final String auth_user = pref.getString("backend_auth_user", ""); - final String auth_password = pref.getString("backend_auth_password", ""); - final byte[] bytes = (String.format("%s:%s", auth_user, auth_password)).getBytes("UTF-8"); + final String auth_user = profile.getAuthUserName(); + final String auth_password = profile.getAuthPassword(); + final byte[] bytes = + (String.format("%s:%s", auth_user, auth_password)).getBytes("UTF-8"); final String value = Base64.encodeToString(bytes, Base64.DEFAULT); http.setRequestProperty("Authorization", "Basic " + value); } -- 2.39.2