]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/activity/MainActivity.java
when switching profiles, clear account list too
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / activity / MainActivity.java
index 88ab8090cfc4d86bc805c2270076d11d44362dff..dc4645bcafbeadb4d0f4c4695156e983ba931dbb 100644 (file)
@@ -25,9 +25,9 @@ import android.content.pm.ShortcutManager;
 import android.content.res.ColorStateList;
 import android.graphics.Color;
 import android.graphics.drawable.Icon;
-import android.os.AsyncTask;
 import android.os.Build;
 import android.os.Bundle;
+import android.text.format.DateUtils;
 import android.util.Log;
 import android.view.View;
 import android.view.animation.AnimationUtils;
@@ -43,6 +43,7 @@ import androidx.drawerlayout.widget.DrawerLayout;
 import androidx.fragment.app.Fragment;
 import androidx.fragment.app.FragmentManager;
 import androidx.fragment.app.FragmentPagerAdapter;
+import androidx.lifecycle.ViewModelProvider;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.viewpager.widget.ViewPager;
@@ -51,26 +52,25 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton;
 import com.google.android.material.snackbar.Snackbar;
 
 import net.ktnx.mobileledger.R;
-import net.ktnx.mobileledger.async.RefreshDescriptionsTask;
 import net.ktnx.mobileledger.async.RetrieveTransactionsTask;
 import net.ktnx.mobileledger.model.Data;
 import net.ktnx.mobileledger.model.MobileLedgerProfile;
+import net.ktnx.mobileledger.ui.MainModel;
 import net.ktnx.mobileledger.ui.account_summary.AccountSummaryFragment;
 import net.ktnx.mobileledger.ui.profiles.ProfileDetailFragment;
 import net.ktnx.mobileledger.ui.profiles.ProfilesRecyclerViewAdapter;
 import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment;
-import net.ktnx.mobileledger.ui.transaction_list.TransactionListViewModel;
 import net.ktnx.mobileledger.utils.Colors;
 import net.ktnx.mobileledger.utils.Logger;
 import net.ktnx.mobileledger.utils.MLDB;
 
 import org.jetbrains.annotations.NotNull;
 
-import java.text.DateFormat;
 import java.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Locale;
+import java.util.Objects;
 
 /*
  * TODO: reports
@@ -95,6 +95,7 @@ public class MainActivity extends ProfileThemedActivity {
     private ActionBarDrawerToggle barDrawerToggle;
     private ViewPager.SimpleOnPageChangeListener pageChangeListener;
     private MobileLedgerProfile profile;
+    private MainModel mainModel;
     @Override
     protected void onStart() {
         super.onStart();
@@ -107,8 +108,10 @@ public class MainActivity extends ProfileThemedActivity {
     protected void onSaveInstanceState(@NotNull Bundle outState) {
         super.onSaveInstanceState(outState);
         outState.putInt(STATE_CURRENT_PAGE, mViewPager.getCurrentItem());
-        if (Data.accountFilter.getValue() != null)
-            outState.putString(STATE_ACC_FILTER, Data.accountFilter.getValue());
+        if (mainModel.getAccountFilter()
+                     .getValue() != null)
+            outState.putString(STATE_ACC_FILTER, mainModel.getAccountFilter()
+                                                          .getValue());
     }
     @Override
     protected void onDestroy() {
@@ -149,6 +152,8 @@ public class MainActivity extends ProfileThemedActivity {
         Logger.debug("MainActivity", "onCreate()/after super");
         setContentView(R.layout.activity_main);
 
+        mainModel = new ViewModelProvider(this).get(MainModel.class);
+
         fab = findViewById(R.id.btn_add_transaction);
         profileListHeadMore = findViewById(R.id.nav_profiles_start_edit);
         profileListHeadCancel = findViewById(R.id.nav_profiles_cancel_edit);
@@ -226,11 +231,10 @@ public class MainActivity extends ProfileThemedActivity {
             if (currentPage != -1) {
                 mCurrentPage = currentPage;
             }
-            Data.accountFilter.setValue(savedInstanceState.getString(STATE_ACC_FILTER, null));
+            mainModel.getAccountFilter()
+                     .setValue(savedInstanceState.getString(STATE_ACC_FILTER, null));
         }
 
-        Data.lastUpdateDate.observe(this, this::updateLastUpdateDisplay);
-
         findViewById(R.id.btn_no_profiles_add).setOnClickListener(
                 v -> startEditProfileActivity(null));
 
@@ -319,23 +323,34 @@ public class MainActivity extends ProfileThemedActivity {
             else
                 drawer.close();
         });
+
+        mainModel.getUpdateError()
+                 .observe(this, (error) -> {
+                     if (error == null)
+                         return;
+
+                     Snackbar.make(mViewPager, error, Snackbar.LENGTH_LONG)
+                             .show();
+                     mainModel.clearUpdateError();
+                 });
+        Data.locale.observe(this, l -> refreshLastUpdateInfo());
+        Data.lastUpdateDate.observe(this, date -> refreshLastUpdateInfo());
+        Data.lastUpdateTransactionCount.observe(this, date -> refreshLastUpdateInfo());
+        Data.lastUpdateAccountCount.observe(this, date -> refreshLastUpdateInfo());
     }
-    private void scheduleDataRetrievalIfStale(Date lastUpdate) {
+    private void scheduleDataRetrievalIfStale(long lastUpdate) {
         long now = new Date().getTime();
-        if ((lastUpdate == null) || (now > (lastUpdate.getTime() + (24 * 3600 * 1000)))) {
-            if (lastUpdate == null)
+        if ((lastUpdate == 0) || (now > (lastUpdate + (24 * 3600 * 1000)))) {
+            if (lastUpdate == 0)
                 Logger.debug("db::", "WEB data never fetched. scheduling a fetch");
             else
                 Logger.debug("db", String.format(Locale.ENGLISH,
                         "WEB data last fetched at %1.3f and now is %1.3f. re-fetching",
-                        lastUpdate.getTime() / 1000f, now / 1000f));
+                        lastUpdate / 1000f, now / 1000f));
 
-            scheduleDataRetrieval();
+            mainModel.scheduleTransactionListRetrieval();
         }
     }
-    public void scheduleDataRetrieval() {
-        Data.scheduleTransactionListRetrieval();
-    }
     private void createShortcuts(List<MobileLedgerProfile> list) {
         if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N_MR1)
             return;
@@ -403,9 +418,7 @@ public class MainActivity extends ProfileThemedActivity {
         else
             setTitle(R.string.app_name);
 
-        if (this.profile != null)
-            this.profile.getDisplayedAccounts()
-                        .removeObservers(this);
+        mainModel.setProfile(profile);
 
         this.profile = profile;
 
@@ -426,12 +439,13 @@ public class MainActivity extends ProfileThemedActivity {
 
         mProfileListAdapter.notifyDataSetChanged();
 
-        Data.transactions.clear();
-        Logger.debug("transactions", "requesting list reload");
-        TransactionListViewModel.scheduleTransactionListReload();
+        mainModel.clearAccounts();
+        mainModel.clearTransactions();
 
         if (haveProfile) {
-            profile.scheduleAccountListReload();
+            mainModel.scheduleAccountListReload();
+            Logger.debug("transactions", "requesting list reload");
+            mainModel.scheduleTransactionListReload();
 
             if (profile.isPostingPermitted()) {
                 mToolbar.setSubtitle(null);
@@ -449,29 +463,14 @@ public class MainActivity extends ProfileThemedActivity {
 
         updateLastUpdateTextFromDB();
     }
-    private void updateLastUpdateDisplay(Date newValue) {
-        LinearLayout l = findViewById(R.id.transactions_last_update_layout);
-        TextView v = findViewById(R.id.transactions_last_update);
-        if (newValue == null) {
-            l.setVisibility(View.INVISIBLE);
-            Logger.debug("main", "no last update date :(");
-        }
-        else {
-            final String text = DateFormat.getDateTimeInstance()
-                                          .format(newValue);
-            v.setText(text);
-            l.setVisibility(View.VISIBLE);
-            Logger.debug("main", String.format("Date formatted: %s", text));
-        }
-
-        scheduleDataRetrievalIfStale(newValue);
-    }
     private void profileThemeChanged() {
         storeThemeIdInPrefs(profile.getThemeHue());
 
         // un-hook all observed LiveData
         Data.removeProfileObservers(this);
         Data.profiles.removeObservers(this);
+        Data.lastUpdateTransactionCount.removeObservers(this);
+        Data.lastUpdateAccountCount.removeObservers(this);
         Data.lastUpdateDate.removeObservers(this);
 
         recreate();
@@ -518,7 +517,8 @@ public class MainActivity extends ProfileThemedActivity {
     }
     private void showAccountSummaryFragment() {
         mViewPager.setCurrentItem(0, true);
-        Data.accountFilter.setValue(null);
+        mainModel.getAccountFilter()
+                 .setValue(null);
     }
     public void onLatestTransactionsClicked(View view) {
         drawer.closeDrawers();
@@ -526,7 +526,8 @@ public class MainActivity extends ProfileThemedActivity {
         showTransactionsFragment(null);
     }
     public void showTransactionsFragment(String accName) {
-        Data.accountFilter.setValue(accName);
+        mainModel.getAccountFilter()
+                 .setValue(accName);
         mViewPager.setCurrentItem(1, true);
     }
     public void showAccountTransactions(String accountName) {
@@ -541,7 +542,8 @@ public class MainActivity extends ProfileThemedActivity {
         }
         else {
             if (mBackMeansToAccountList && (mViewPager.getCurrentItem() == 1)) {
-                Data.accountFilter.setValue(null);
+                mainModel.getAccountFilter()
+                         .setValue(null);
                 showAccountSummaryFragment();
                 mBackMeansToAccountList = false;
             }
@@ -557,19 +559,47 @@ public class MainActivity extends ProfileThemedActivity {
         if (profile == null)
             return;
 
-        long last_update = profile.getLongOption(MLDB.OPT_LAST_SCRAPE, 0L);
+        long lastUpdate = profile.getLongOption(MLDB.OPT_LAST_SCRAPE, 0L);
 
-        Logger.debug("transactions", String.format(Locale.ENGLISH, "Last update = %d", last_update));
-        if (last_update == 0) {
+        Logger.debug("transactions", String.format(Locale.ENGLISH, "Last update = %d", lastUpdate));
+        if (lastUpdate == 0) {
             Data.lastUpdateDate.postValue(null);
         }
         else {
-            Data.lastUpdateDate.postValue(new Date(last_update));
+            Data.lastUpdateDate.postValue(new Date(lastUpdate));
+        }
+
+        scheduleDataRetrievalIfStale(lastUpdate);
+
+    }
+    private void refreshLastUpdateInfo() {
+        final int formatFlags = DateUtils.FORMAT_SHOW_DATE | DateUtils.FORMAT_SHOW_YEAR |
+                                DateUtils.FORMAT_SHOW_TIME | DateUtils.FORMAT_NUMERIC_DATE;
+        String templateForTransactions =
+                getResources().getString(R.string.transaction_count_summary);
+        String templateForAccounts = getResources().getString(R.string.account_count_summary);
+        Integer accountCount = Data.lastUpdateAccountCount.getValue();
+        Integer transactionCount = Data.lastUpdateTransactionCount.getValue();
+        Date lastUpdate = Data.lastUpdateDate.getValue();
+        if (lastUpdate == null) {
+            Data.lastTransactionsUpdateText.set("----");
+            Data.lastAccountsUpdateText.set("----");
+        }
+        else {
+            Data.lastTransactionsUpdateText.set(
+                    String.format(Objects.requireNonNull(Data.locale.getValue()),
+                            templateForTransactions,
+                            transactionCount == null ? 0 : transactionCount,
+                            DateUtils.formatDateTime(this, lastUpdate.getTime(), formatFlags)));
+            Data.lastAccountsUpdateText.set(
+                    String.format(Objects.requireNonNull(Data.locale.getValue()),
+                            templateForAccounts, accountCount == null ? 0 : accountCount,
+                            DateUtils.formatDateTime(this, lastUpdate.getTime(), formatFlags)));
         }
     }
     public void onStopTransactionRefreshClick(View view) {
         Logger.debug("interactive", "Cancelling transactions refresh");
-        Data.stopTransactionsRetrieval();
+        mainModel.stopTransactionsRetrieval();
         bTransactionListCancelDownload.setEnabled(false);
     }
     public void onRetrieveRunningChanged(Boolean running) {
@@ -600,7 +630,7 @@ public class MainActivity extends ProfileThemedActivity {
             Logger.debug("progress", "Done");
             findViewById(R.id.transaction_progress_layout).setVisibility(View.GONE);
 
-            Data.transactionRetrievalDone();
+            mainModel.transactionRetrievalDone();
 
             if (progress.getError() != null) {
                 Snackbar.make(mViewPager, progress.getError(), Snackbar.LENGTH_LONG)
@@ -608,11 +638,6 @@ public class MainActivity extends ProfileThemedActivity {
                 return;
             }
 
-            updateLastUpdateTextFromDB();
-
-            new RefreshDescriptionsTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
-            TransactionListViewModel.scheduleTransactionListReload();
-
             return;
         }
 
@@ -635,8 +660,9 @@ public class MainActivity extends ProfileThemedActivity {
             if (progressBar.isIndeterminate()) {
                 progressBar.setIndeterminate(false);
             }
-            Logger.debug("progress",
-                    String.format(Locale.US, "%d/%d", progress.getProgress(), progress.getTotal()));
+//            Logger.debug("progress",
+//                    String.format(Locale.US, "%d/%d", progress.getProgress(), progress.getTotal
+//                    ()));
             progressBar.setMax(progress.getTotal());
             // for some reason animation doesn't work - no progress is shown (stick at 0)
             // on lineageOS 14.1 (Nougat, 7.1.2)
@@ -665,7 +691,8 @@ public class MainActivity extends ProfileThemedActivity {
         @NotNull
         @Override
         public Fragment getItem(int position) {
-            Logger.debug("main", String.format(Locale.ENGLISH, "Switching to fragment %d", position));
+            Logger.debug("main",
+                    String.format(Locale.ENGLISH, "Switching to fragment %d", position));
             switch (position) {
                 case 0:
 //                    debug("flow", "Creating account summary fragment");