]> git.ktnx.net Git - mobile-ledger.git/commitdiff
use profiles for connection parameters
authorDamyan Ivanov <dam+mobileledger@ktnx.net>
Sun, 6 Jan 2019 08:14:13 +0000 (08:14 +0000)
committerDamyan Ivanov <dam+mobileledger@ktnx.net>
Sun, 6 Jan 2019 08:14:13 +0000 (08:14 +0000)
included migration from shared preferences

app/src/main/java/net/ktnx/mobileledger/async/RetrieveTransactionsTask.java
app/src/main/java/net/ktnx/mobileledger/async/SaveTransactionTask.java
app/src/main/java/net/ktnx/mobileledger/model/Data.java
app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java
app/src/main/java/net/ktnx/mobileledger/utils/MLDB.java
app/src/main/java/net/ktnx/mobileledger/utils/NetworkUtil.java

index ad0641216b68b28cbb98292d04b1a082df2cec7b..12e53cb6f180236059c7f1026e8eff4eeb258e1e 100644 (file)
@@ -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<RetrieveTransactionsTask.Params, RetrieveTransactionsTask.Progress, Void> {
+public class RetrieveTransactionsTask
+        extends AsyncTask<Void, RetrieveTransactionsTask.Progress, Void> {
     public static final int MATCHING_TRANSACTIONS_LIMIT = 50;
     private static final Pattern transactionStartPattern = Pattern.compile("<tr class=\"title\" " +
-                                                                           "id=\"transaction-(\\d+)\"><td class=\"date\"[^\\\"]*>([\\d.-]+)</td>");
+                                                                           "id=\"transaction-(\\d+)\"><td class=\"date\"[^\"]*>([\\d.-]+)</td>");
     private static final Pattern transactionDescriptionPattern =
             Pattern.compile("<tr class=\"posting\" title=\"(\\S+)\\s(.+)");
     private static final Pattern transactionDetailsPattern =
@@ -60,14 +60,13 @@ public class RetrieveTransactionsTask extends
     private static final Pattern endPattern = Pattern.compile("\\bid=\"addmodal\"");
     protected WeakReference<MainActivity> contextRef;
     protected int error;
-    // %3A is '='
-    private Pattern ledger_title_re = Pattern.compile("<h1>([^<]+)</h1>");
     Pattern account_name_re = Pattern.compile("/register\\?q=inacct%3A([a-zA-Z0-9%]+)\"");
     Pattern account_value_re = Pattern.compile(
             "<span class=\"[^\"]*\\bamount\\b[^\"]*\">\\s*([-+]?[\\d.,]+)(?:\\s+(\\S+))?</span>");
     Pattern tr_end_re = Pattern.compile("</tr>");
     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<MainActivity> 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;
index 9cd669e215fea61d98b5dfb5f1e2eda334d96977..5ccbaaca56922dda8c2925ac454b14ce2d7e363e 100644 (file)
@@ -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<LedgerTransaction, Void, Void
         task_callback = callback;
     }
     private boolean send_ok() throws IOException {
-        HttpURLConnection http = NetworkUtil.prepare_connection(pref, "add");
+        HttpURLConnection http = NetworkUtil.prepare_connection("add");
         http.setRequestMethod("POST");
         http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
         http.setRequestProperty("Accept", "*/*");
index beb8dd5438ba208511dede8ab7890ab7b88bffb6..3ab770b6ccb38116acc905348e45598562ff0e0f 100644 (file)
@@ -28,5 +28,5 @@ public final class Data {
     public static ObservableValue<List<String>> descriptions = new ObservableValue<>();
     public static ObservableAtomicInteger backgroundTaskCount = new ObservableAtomicInteger(0);
     public static ObservableValue<Date> lastUpdateDate = new ObservableValue<>();
-    public static ObservableValue<String> ledgerTitle = new ObservableValue<>();
+    public static ObservableValue<MobileLedgerProfile> profile = new ObservableValue<>();
 }
index e245a250ee47238958b7e774e86891df4410d6c2..2ec658592a238f3a5e67b1501d1c0da12f1bba01 100644 (file)
 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) {
index 47a5e965e89678aaef0e6cb716d2ae8512bb70f1..e0dc9f1ae771f738f02407206e333c3f433576ce 100644 (file)
@@ -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() {
index 44a7eb9db579a539388aaf83ad38c7da708d5857..864175104a2b6612fd9c9b31aa72cc3afabee502 100644 (file)
@@ -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
 
 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);
         }