X-Git-Url: https://git.ktnx.net/?a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Factivity%2FMainActivity.java;h=da86d3ae1402c2f503a8e8bdd78ba386053aa73c;hb=55f4f1b5f101d0f9874fe3d3406d53c6df931a40;hp=2fc09379873faa8d030c094c709a9451270f568e;hpb=b520c878635649cce634b9a0f133691a59d8290f;p=mobile-ledger.git 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 2fc09379..da86d3ae 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 @@ -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 @@ -17,6 +17,9 @@ package net.ktnx.mobileledger.ui.activity; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; +import android.animation.TimeInterpolator; import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.ShortcutInfo; @@ -29,6 +32,7 @@ import android.os.Bundle; import android.text.format.DateUtils; import android.util.Log; import android.view.View; +import android.view.ViewPropertyAnimator; import android.view.animation.AnimationUtils; import android.widget.TextView; @@ -54,7 +58,9 @@ 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.new_transaction.NewTransactionActivity; import net.ktnx.mobileledger.ui.profiles.ProfilesRecyclerViewAdapter; +import net.ktnx.mobileledger.ui.templates.TemplatesActivity; import net.ktnx.mobileledger.ui.transaction_list.TransactionListFragment; import net.ktnx.mobileledger.utils.Colors; import net.ktnx.mobileledger.utils.Logger; @@ -76,6 +82,8 @@ public class MainActivity extends ProfileThemedActivity { 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"; + private static final boolean FAB_HIDDEN = false; + private static final boolean FAB_SHOWN = true; private SectionsPagerAdapter mSectionsPagerAdapter; private ProfilesRecyclerViewAdapter mProfileListAdapter; private int mCurrentPage; @@ -86,6 +94,9 @@ public class MainActivity extends ProfileThemedActivity { private MobileLedgerProfile profile; private MainModel mainModel; private ActivityMainBinding b; + private int fabVerticalOffset; + private ViewPropertyAnimator fabSlideAnimator; + private boolean wantedFabState = FAB_SHOWN; @Override protected void onStart() { super.onStart(); @@ -293,7 +304,7 @@ public class MainActivity extends ProfileThemedActivity { if (error == null) return; - Snackbar.make(b.mainPager, error, Snackbar.LENGTH_LONG) + Snackbar.make(b.mainPager, error, Snackbar.LENGTH_INDEFINITE) .show(); mainModel.clearUpdateError(); }); @@ -301,6 +312,13 @@ public class MainActivity extends ProfileThemedActivity { Data.lastUpdateDate.observe(this, date -> refreshLastUpdateInfo()); Data.lastUpdateTransactionCount.observe(this, date -> refreshLastUpdateInfo()); Data.lastUpdateAccountCount.observe(this, date -> refreshLastUpdateInfo()); + b.navAccountSummary.setOnClickListener(this::onAccountSummaryClicked); + b.navLatestTransactions.setOnClickListener(this::onLatestTransactionsClicked); + b.navPatterns.setOnClickListener(this::onPatternsClick); + } + private void onPatternsClick(View view) { + Intent intent = new Intent(this, TemplatesActivity.class); + startActivity(intent); } private void scheduleDataRetrievalIfStale(long lastUpdate) { long now = new Date().getTime(); @@ -621,13 +639,58 @@ public class MainActivity extends ProfileThemedActivity { } } public void fabShouldShow() { - if ((profile != null) && profile.isPostingPermitted() && !b.drawerLayout.isOpen()) - b.btnAddTransaction.show(); + if (fabVerticalOffset <= 0) { + int top = b.btnAddTransaction.getTop(); + int parentHeight = b.mainAppLayout.getHeight(); + fabVerticalOffset = parentHeight - top; + } + if ((profile != null) && profile.isPostingPermitted() && !b.drawerLayout.isOpen()) { + fabShow(); + } else fabHide(); } + private void fabShow() { + if (wantedFabState == FAB_SHOWN) + return; + +// b.btnAddTransaction.show(); + if (this.fabSlideAnimator != null) { + this.fabSlideAnimator.cancel(); + b.btnAddTransaction.clearAnimation(); + } + + wantedFabState = FAB_SHOWN; + slideFabTo(b.btnAddTransaction, 0, 200L, + com.google.android.material.animation.AnimationUtils.LINEAR_OUT_SLOW_IN_INTERPOLATOR); + } public void fabHide() { - b.btnAddTransaction.hide(); + if (wantedFabState == FAB_HIDDEN) + return; + + if (fabVerticalOffset <= 0) + return; + +// b.btnAddTransaction.hide(); + if (this.fabSlideAnimator != null) { + this.fabSlideAnimator.cancel(); + b.btnAddTransaction.clearAnimation(); + } + + wantedFabState = FAB_HIDDEN; + slideFabTo(b.btnAddTransaction, fabVerticalOffset, 150L, + com.google.android.material.animation.AnimationUtils.FAST_OUT_LINEAR_IN_INTERPOLATOR); + } + private void slideFabTo(View view, int target, long duration, TimeInterpolator interpolator) { + fabSlideAnimator = view.animate() + .translationY((float) target) + .setInterpolator(interpolator) + .setDuration(duration) + .setListener(new AnimatorListenerAdapter() { + public void onAnimationEnd(Animator animation) { + fabSlideAnimator = null; + } + }); } public static class SectionsPagerAdapter extends FragmentStateAdapter {