diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java index 62e1038f..91e38451 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/MainActivity.java @@ -1,6 +1,8 @@ package com.beemdevelopment.aegis.ui; import android.Manifest; +import android.animation.Animator; +import android.animation.AnimatorListenerAdapter; import android.content.ClipData; import android.content.ClipboardManager; import android.content.Context; @@ -12,6 +14,9 @@ import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.SubMenu; +import android.view.View; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; import android.widget.LinearLayout; import android.widget.Toast; @@ -31,6 +36,9 @@ import com.beemdevelopment.aegis.db.DatabaseManagerException; import com.beemdevelopment.aegis.db.DatabaseEntry; import com.beemdevelopment.aegis.db.DatabaseManager; +import androidx.coordinatorlayout.widget.CoordinatorLayout; +import androidx.interpolator.view.animation.FastOutSlowInInterpolator; + public class MainActivity extends AegisActivity implements EntryListView.Listener { // activity request codes private static final int CODE_SCAN = 0; @@ -499,4 +507,39 @@ public class MainActivity extends AegisActivity implements EntryListView.Listene public void onEntryChange(DatabaseEntry entry) { saveDatabase(); } + + private boolean isAnimating; + + @Override + public void onScroll(int dx, int dy) { + if (dy > 0 && _fabMenu.getVisibility() == View.VISIBLE && !isAnimating) { + isAnimating = true; + CoordinatorLayout.LayoutParams lp = (CoordinatorLayout.LayoutParams) _fabMenu.getLayoutParams(); + int fabBottomMargin = lp.bottomMargin; + _fabMenu.animate() + .translationY(_fabMenu.getHeight() + fabBottomMargin) + .setInterpolator(new AccelerateInterpolator(2)) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + isAnimating = false; + _fabMenu.setVisibility(View.INVISIBLE); + super.onAnimationEnd(animation); + } + }).start(); + } + else if (dy < 0 && _fabMenu.getVisibility() != View.VISIBLE && !isAnimating) { + _fabMenu.setVisibility(View.VISIBLE); + _fabMenu.animate() + .translationY(0) + .setInterpolator(new DecelerateInterpolator(2)) + .setListener(new AnimatorListenerAdapter() { + @Override + public void onAnimationEnd(Animator animation) { + isAnimating = false; + super.onAnimationEnd(animation); + } + }).start(); + } + } } diff --git a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java index bedc09d8..bd07a6b7 100644 --- a/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java +++ b/app/src/main/java/com/beemdevelopment/aegis/ui/views/EntryListView.java @@ -3,6 +3,8 @@ package com.beemdevelopment.aegis.ui.views; import android.content.Context; import android.graphics.PorterDuff; import android.os.Bundle; + +import androidx.annotation.NonNull; import androidx.fragment.app.Fragment; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; @@ -33,6 +35,8 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { private UiRefresher _refresher; + private RecyclerView.OnScrollChangeListener _onScrollListener; + @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -50,6 +54,14 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { // set up the recycler view _rvKeyProfiles = view.findViewById(R.id.rvKeyProfiles); + _rvKeyProfiles.addOnScrollListener(new RecyclerView.OnScrollListener() { + @Override + public void onScrolled(RecyclerView recyclerView, int dx, int dy) { + super.onScrolled(recyclerView, dx, dy); + _listener.onScroll(dx, dy); + } + }); + LinearLayoutManager mLayoutManager = new LinearLayoutManager(view.getContext()); _rvKeyProfiles.setLayoutManager(mLayoutManager); _touchCallback = new SimpleItemTouchHelperCallback(_adapter); @@ -199,5 +211,7 @@ public class EntryListView extends Fragment implements EntryAdapter.Listener { void onEntryMove(DatabaseEntry entry1, DatabaseEntry entry2); void onEntryDrop(DatabaseEntry entry); void onEntryChange(DatabaseEntry entry); + void onScroll(int dx, int dy); + } }