From e7ec4db73feef9f87c1d13093c0f0c1550081a7f Mon Sep 17 00:00:00 2001 From: M66B Date: Sat, 2 Feb 2019 12:58:28 +0000 Subject: [PATCH] Added seek bar --- .../eu/faircode/email/FragmentMessages.java | 177 ++++++++++-------- .../eu/faircode/email/ViewModelMessages.java | 22 +-- app/src/main/res/layout/fragment_messages.xml | 14 +- 3 files changed, 116 insertions(+), 97 deletions(-) diff --git a/app/src/main/java/eu/faircode/email/FragmentMessages.java b/app/src/main/java/eu/faircode/email/FragmentMessages.java index 362c87cb4a..bbc1fdbbf6 100644 --- a/app/src/main/java/eu/faircode/email/FragmentMessages.java +++ b/app/src/main/java/eu/faircode/email/FragmentMessages.java @@ -51,6 +51,7 @@ import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.CheckBox; import android.widget.ImageButton; +import android.widget.SeekBar; import android.widget.TextView; import com.google.android.material.bottomnavigation.BottomNavigationView; @@ -100,6 +101,7 @@ public class FragmentMessages extends FragmentBase { private ImageButton ibHintSelect; private TextView tvNoEmail; private FixedRecyclerView rvMessage; + private SeekBar seekBar; private BottomNavigationView bottom_navigation; private ContentLoadingProgressBar pbWait; private Group grpSupport; @@ -218,6 +220,7 @@ public class FragmentMessages extends FragmentBase { ibHintSelect = view.findViewById(R.id.ibHintSelect); tvNoEmail = view.findViewById(R.id.tvNoEmail); rvMessage = view.findViewById(R.id.rvMessage); + seekBar = view.findViewById(R.id.seekBar); bottom_navigation = view.findViewById(R.id.bottom_navigation); pbWait = view.findViewById(R.id.pbWait); grpSupport = view.findViewById(R.id.grpSupport); @@ -291,86 +294,6 @@ public class FragmentMessages extends FragmentBase { rvMessage.setAdapter(adapter); - if (viewType == AdapterMessage.ViewType.THREAD) { - ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); - model.observePrevNext(getViewLifecycleOwner(), id, new ViewModelMessages.IPrevNext() { - @Override - public void onPrevious(boolean exists, Long id) { - previous = id; - bottom_navigation.getMenu().findItem(R.id.action_prev).setEnabled(id != null); - } - - @Override - public void onNext(boolean exists, Long id) { - next = id; - bottom_navigation.getMenu().findItem(R.id.action_next).setEnabled(id != null); - } - }); - - ActivityBase activity = (ActivityBase) getActivity(); - activity.setSwipeListener(new SwipeListener.ISwipeListener() { - @Override - public boolean onSwipeRight() { - if (previous != null) - navigate(previous, true); - return (previous != null); - } - - @Override - public boolean onSwipeLeft() { - if (next != null) - navigate(next, false); - return (next != null); - } - }); - - } else { - final SelectionPredicateMessage predicate = new SelectionPredicateMessage(rvMessage); - - selectionTracker = new SelectionTracker.Builder<>( - "messages-selection", - rvMessage, - new ItemKeyProviderMessage(rvMessage), - new ItemDetailsLookupMessage(rvMessage), - StorageStrategy.createLongStorage()) - .withSelectionPredicate(predicate) - .build(); - adapter.setSelectionTracker(selectionTracker); - - selectionTracker.addObserver(new SelectionTracker.SelectionObserver() { - @Override - public void onSelectionChanged() { - SelectionTracker tracker = selectionTracker; - if (tracker == null) - return; - - FragmentActivity activity = getActivity(); - if (activity != null) { - try { - ViewModelMessages modelMessages = ViewModelProviders.of(activity).get(ViewModelMessages.class); - if (tracker.hasSelection()) - modelMessages.removeObservers(viewType, getViewLifecycleOwner()); - else - modelMessages.observe(viewType, getViewLifecycleOwner(), observer); - } catch (IllegalStateException ex) { - // getViewLifecycleOwner - Log.w(ex); - } - - activity.invalidateOptionsMenu(); - } - - if (tracker.hasSelection()) { - swipeRefresh.setEnabled(false); - fabMore.show(); - } else { - fabMore.hide(); - swipeRefresh.setEnabled(pull); - } - } - }); - } - new ItemTouchHelper(touchHelper).attachToRecyclerView(rvMessage); bottom_navigation.setOnNavigationItemSelectedListener(new BottomNavigationView.OnNavigationItemSelectedListener() { @@ -438,6 +361,8 @@ public class FragmentMessages extends FragmentBase { // Initialize swipeRefresh.setEnabled(pull); tvNoEmail.setVisibility(View.GONE); + seekBar.setEnabled(false); + seekBar.setVisibility(View.GONE); bottom_navigation.getMenu().findItem(R.id.action_prev).setEnabled(false); bottom_navigation.getMenu().findItem(R.id.action_next).setEnabled(false); bottom_navigation.setVisibility(View.GONE); @@ -447,6 +372,93 @@ public class FragmentMessages extends FragmentBase { fab.hide(); fabMore.hide(); + if (viewType == AdapterMessage.ViewType.THREAD) { + ViewModelMessages model = ViewModelProviders.of(getActivity()).get(ViewModelMessages.class); + model.observePrevNext(getViewLifecycleOwner(), id, new ViewModelMessages.IPrevNext() { + @Override + public void onPrevious(boolean exists, Long id) { + previous = id; + bottom_navigation.getMenu().findItem(R.id.action_prev).setEnabled(id != null); + } + + @Override + public void onNext(boolean exists, Long id) { + next = id; + bottom_navigation.getMenu().findItem(R.id.action_next).setEnabled(id != null); + } + + @Override + public void onFound(int position, int size) { + seekBar.setProgress(position); + seekBar.setMax(size - 1); + seekBar.setVisibility(View.VISIBLE); + } + }); + + ActivityBase activity = (ActivityBase) getActivity(); + activity.setSwipeListener(new SwipeListener.ISwipeListener() { + @Override + public boolean onSwipeRight() { + if (previous != null) + navigate(previous, true); + return (previous != null); + } + + @Override + public boolean onSwipeLeft() { + if (next != null) + navigate(next, false); + return (next != null); + } + }); + + } else { + final SelectionPredicateMessage predicate = new SelectionPredicateMessage(rvMessage); + + selectionTracker = new SelectionTracker.Builder<>( + "messages-selection", + rvMessage, + new ItemKeyProviderMessage(rvMessage), + new ItemDetailsLookupMessage(rvMessage), + StorageStrategy.createLongStorage()) + .withSelectionPredicate(predicate) + .build(); + adapter.setSelectionTracker(selectionTracker); + + selectionTracker.addObserver(new SelectionTracker.SelectionObserver() { + @Override + public void onSelectionChanged() { + SelectionTracker tracker = selectionTracker; + if (tracker == null) + return; + + FragmentActivity activity = getActivity(); + if (activity != null) { + try { + ViewModelMessages modelMessages = ViewModelProviders.of(activity).get(ViewModelMessages.class); + if (tracker.hasSelection()) + modelMessages.removeObservers(viewType, getViewLifecycleOwner()); + else + modelMessages.observe(viewType, getViewLifecycleOwner(), observer); + } catch (IllegalStateException ex) { + // getViewLifecycleOwner + Log.w(ex); + } + + activity.invalidateOptionsMenu(); + } + + if (tracker.hasSelection()) { + swipeRefresh.setEnabled(false); + fabMore.show(); + } else { + fabMore.hide(); + swipeRefresh.setEnabled(pull); + } + } + }); + } + return view; } @@ -1799,6 +1811,11 @@ public class FragmentMessages extends FragmentBase { } } } + + @Override + public void onFound(int position, int size) { + // Do nothing + } }); } else loadMessagesNext(); diff --git a/app/src/main/java/eu/faircode/email/ViewModelMessages.java b/app/src/main/java/eu/faircode/email/ViewModelMessages.java index 4e2be9d925..44cef29fbd 100644 --- a/app/src/main/java/eu/faircode/email/ViewModelMessages.java +++ b/app/src/main/java/eu/faircode/email/ViewModelMessages.java @@ -99,17 +99,19 @@ public class ViewModelMessages extends ViewModel { TupleMessageEx next = messages.get(pos - 1); if (next == null) load = true; - reportNext(intf, true, next == null ? null : next.id); + intf.onNext(true, next == null ? null : next.id); } else - reportNext(intf, false, null); + intf.onNext(false, null); if (pos + 1 < messages.size()) { TupleMessageEx prev = messages.get(pos + 1); if (prev == null) load = true; - reportPrevious(intf, true, prev == null ? null : prev.id); + intf.onPrevious(true, prev == null ? null : prev.id); } else - reportPrevious(intf, false, null); + intf.onPrevious(false, null); + + intf.onFound(pos, messages.size()); if (load) messages.loadAround(pos); @@ -123,19 +125,11 @@ public class ViewModelMessages extends ViewModel { }); } - private void reportPrevious(IPrevNext intf, boolean exists, Long id) { - Log.i("Previous exists=" + exists + " id=" + id); - intf.onPrevious(exists, id); - } - - private void reportNext(IPrevNext intf, boolean exists, Long id) { - Log.i("Next exists=" + exists + " id=" + id); - intf.onNext(exists, id); - } - interface IPrevNext { void onPrevious(boolean exists, Long id); void onNext(boolean exists, Long id); + + void onFound(int position, int size); } } diff --git a/app/src/main/res/layout/fragment_messages.xml b/app/src/main/res/layout/fragment_messages.xml index ad80ae722c..02037498b3 100644 --- a/app/src/main/res/layout/fragment_messages.xml +++ b/app/src/main/res/layout/fragment_messages.xml @@ -135,7 +135,7 @@ android:layout_height="wrap_content" android:text="@string/title_no_messages" android:textAppearance="@style/TextAppearance.AppCompat.Medium" - app:layout_constraintBottom_toTopOf="@+id/bottom_navigation" + app:layout_constraintBottom_toTopOf="@+id/seekBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/vSeparatorHintSelect" /> @@ -146,7 +146,7 @@ android:layout_height="0dp" android:scrollbarStyle="outsideOverlay" android:scrollbars="vertical" - app:layout_constraintBottom_toTopOf="@+id/bottom_navigation" + app:layout_constraintBottom_toTopOf="@+id/seekBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/vSeparatorHintSelect" /> @@ -157,11 +157,19 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:indeterminate="true" - app:layout_constraintBottom_toTopOf="@+id/bottom_navigation" + app:layout_constraintBottom_toTopOf="@+id/seekBar" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toBottomOf="@id/vSeparatorHintSelect" /> + +