X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FMainActivity.java;h=f61ebb0ed30124b3daeffd2410e47f1d4f9b8865;hp=0f668cee32379af896fc0293dfa47c1826f431e8;hb=d28e54c3e91f3a65e8b4571dc94fe90e953d4c7a;hpb=83cac114e375728080194fb09758b49c50a8119b 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 0f668cee..f61ebb0e 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 @@ -44,12 +44,14 @@ 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.account_summary.AccountSummaryAdapter; 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.LockHolder; import net.ktnx.mobileledger.utils.MLDB; import java.lang.ref.WeakReference; @@ -71,8 +73,9 @@ import androidx.recyclerview.widget.RecyclerView; import androidx.viewpager.widget.ViewPager; public class MainActivity extends ProfileThemedActivity { - private static final String STATE_CURRENT_PAGE = "current_page"; - private static final String BUNDLE_SAVED_STATE = "bundle_savedState"; + public static final String STATE_CURRENT_PAGE = "current_page"; + public static final String BUNDLE_SAVED_STATE = "bundle_savedState"; + public static final String STATE_ACC_FILTER = "account_filter"; public AccountSummaryFragment mAccountSummaryFragment; DrawerLayout drawer; private LinearLayout profileListContainer; @@ -90,6 +93,9 @@ public class MainActivity extends ProfileThemedActivity { private boolean profileModificationEnabled = false; private boolean profileListExpanded = false; private ProfilesRecyclerViewAdapter mProfileListAdapter; + private int mCurrentPage; + private String mAccountFilter; + private boolean mBackMeansToAccountList = false; @Override protected void onStart() { super.onStart(); @@ -108,11 +114,17 @@ public class MainActivity extends ProfileThemedActivity { scheduleTransactionListRetrieval(); } + + mViewPager.setCurrentItem(mCurrentPage, false); + if (mAccountFilter != null) showTransactionsFragment(mAccountFilter); + } @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); outState.putInt(STATE_CURRENT_PAGE, mViewPager.getCurrentItem()); + if (TransactionListFragment.accountFilter.get() != null) + outState.putString(STATE_ACC_FILTER, TransactionListFragment.accountFilter.get()); } @Override protected void onCreate(Bundle savedInstanceState) { @@ -157,6 +169,20 @@ public class MainActivity extends ProfileThemedActivity { fab.hide(); } + int old_index = -1; + int new_index = -1; + if (arg != null) { + MobileLedgerProfile old = (MobileLedgerProfile) arg; + old_index = Data.getProfileIndex(old); + new_index = Data.getProfileIndex(profile); + } + + if ((old_index != -1) && (new_index != -1)) { + mProfileListAdapter.notifyItemChanged(old_index); + mProfileListAdapter.notifyItemChanged(new_index); + } + else mProfileListAdapter.notifyDataSetChanged(); + int newProfileTheme = profile.getThemeId(); if (newProfileTheme != Colors.profileThemeId) { Log.d("profiles", String.format("profile theme %d → %d", Colors.profileThemeId, @@ -216,11 +242,13 @@ public class MainActivity extends ProfileThemedActivity { } }); + mCurrentPage = 0; if (savedInstanceState != null) { int currentPage = savedInstanceState.getInt(STATE_CURRENT_PAGE, -1); if (currentPage != -1) { - mViewPager.setCurrentItem(currentPage, false); + mCurrentPage = currentPage; } + mAccountFilter = savedInstanceState.getString(STATE_ACC_FILTER, null); } Data.lastUpdateDate.addObserver((o, arg) -> { @@ -284,15 +312,17 @@ public class MainActivity extends ProfileThemedActivity { }); } private void updateLastUpdateDisplay() { + LinearLayout l = findViewById(R.id.transactions_last_update_layout); TextView v = findViewById(R.id.transactions_last_update); Date date = Data.lastUpdateDate.get(); if (date == null) { - v.setText(R.string.transaction_last_update_never); + l.setVisibility(View.INVISIBLE); Log.d("main", "no last update date :("); } else { final String text = DateFormat.getDateTimeInstance().format(date); v.setText(text); + l.setVisibility(View.VISIBLE); Log.d("main", String.format("Date formatted: %s", text)); } } @@ -377,14 +407,18 @@ public class MainActivity extends ProfileThemedActivity { public void onLatestTransactionsClicked(View view) { drawer.closeDrawers(); - showTransactionsFragment(null); + showTransactionsFragment((String) null); } private void resetFragmentBackStack() { // fragmentManager.popBackStack(0, FragmentManager.POP_BACK_STACK_INCLUSIVE); } - private void showTransactionsFragment(LedgerAccount account) { - if (account != null) TransactionListFragment.accountFilter.set(account.getName()); + private void showTransactionsFragment(String accName) { + TransactionListFragment.accountFilter.set(accName); + TransactionListFragment.accountFilter.notifyObservers(); mViewPager.setCurrentItem(1, true); + } + private void showTransactionsFragment(LedgerAccount account) { + showTransactionsFragment((account == null) ? (String) null : account.getName()); // FragmentTransaction ft = fragmentManager.beginTransaction(); // if (transactionListFragment == null) { // Log.d("flow", "MainActivity creating TransactionListFragment"); @@ -404,6 +438,7 @@ public class MainActivity extends ProfileThemedActivity { // currentFragment = transactionListFragment; } public void showAccountTransactions(LedgerAccount account) { + mBackMeansToAccountList = true; showTransactionsFragment(account); } @Override @@ -413,10 +448,16 @@ public class MainActivity extends ProfileThemedActivity { drawer.closeDrawer(GravityCompat.START); } else { - Log.d("fragments", - String.format("manager stack: %d", fragmentManager.getBackStackEntryCount())); + if (mBackMeansToAccountList && (mViewPager.getCurrentItem() == 1)) { + TransactionListFragment.accountFilter.set(null); + showAccountSummaryFragment(); + mBackMeansToAccountList = false; + } + else { + Log.d("fragments", String.format("manager stack: %d", fragmentManager.getBackStackEntryCount())); - super.onBackPressed(); + super.onBackPressed(); + } } } public void updateLastUpdateTextFromDB() { @@ -588,6 +629,7 @@ public class MainActivity extends ProfileThemedActivity { // removing all child accounts from the view int start = -1, count = 0; + try (LockHolder lh = Data.accounts.lockForWriting()) { for (int i = 0; i < Data.accounts.size(); i++) { if (acc.isParentOf(Data.accounts.get(i))) { // Log.d("accounts", String.format("Found a child '%s' at position %d", @@ -616,6 +658,7 @@ public class MainActivity extends ProfileThemedActivity { mAccountSummaryFragment.modelAdapter .notifyItemRangeRemoved(start, count); + } } } else { @@ -624,6 +667,7 @@ public class MainActivity extends ProfileThemedActivity { animator.rotationBy(-180); List children = Data.profile.get().loadVisibleChildAccountsOf(acc); + try (LockHolder lh = Data.accounts.lockForWriting()) { int parentPos = Data.accounts.indexOf(acc); if (parentPos != -1) { // may have disappeared in a concurrent refresh operation @@ -631,10 +675,19 @@ public class MainActivity extends ProfileThemedActivity { mAccountSummaryFragment.modelAdapter .notifyItemRangeInserted(parentPos + 1, children.size()); } + } } break; case R.id.account_row_acc_amounts: - showAccountTransactions(acc); + if (acc.getAmountCount() > AccountSummaryAdapter.AMOUNT_LIMIT) { + acc.toggleAmountsExpanded(); + DbOpQueue + .add("update accounts set amounts_expanded=? where name=? and profile=?", + new Object[]{acc.amountsExpanded(), acc.getName(), + Data.profile.get().getUuid() + }); + Data.accounts.triggerItemChangedNotification(acc); + } break; } }