From 84c71fce16a3396374bc97a38c563082e136c61d Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 27 Sep 2018 09:47:08 -0700 Subject: [PATCH] Disable tab switching in media overview during multiselect. Multiselect only applies to items in the "media" tab, so people shouldn't be able to switch tabs during multiselect. --- res/layout/media_overview_activity.xml | 4 +- .../securesms/MediaOverviewActivity.java | 30 +++++++++++--- .../components/ControllableTabLayout.java | 41 +++++++++++++++++++ .../components/ControllableViewPager.java | 32 +++++++++++++++ 4 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 src/org/thoughtcrime/securesms/components/ControllableTabLayout.java create mode 100644 src/org/thoughtcrime/securesms/components/ControllableViewPager.java diff --git a/res/layout/media_overview_activity.xml b/res/layout/media_overview_activity.xml index 519bda28fb..2a24f4e760 100644 --- a/res/layout/media_overview_activity.xml +++ b/res/layout/media_overview_activity.xml @@ -18,7 +18,7 @@ android:titleTextColor="?attr/media_overview_toolbar_foreground" app:layout_scrollFlags="scroll|enterAlways"/> - - getSupportActionBar().setTitle(recipient.toShortString())); } + public void onEnterMultiSelect() { + tabLayout.setEnabled(false); + viewPager.setEnabled(false); + } + + public void onExitMultiSelect() { + tabLayout.setEnabled(true); + viewPager.setEnabled(true); + } + private class MediaOverviewPagerAdapter extends FragmentStatePagerAdapter { MediaOverviewPagerAdapter(FragmentManager fragmentManager) { @@ -270,8 +280,7 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity adapter.toggleSelection(mediaRecord); if (adapter.getSelectedMediaCount() == 0) { - actionMode.finish(); - actionMode = null; + exitMultiSelect(); } else { actionMode.setTitle(String.valueOf(adapter.getSelectedMediaCount())); } @@ -304,7 +313,7 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity ((MediaGalleryAdapter) recyclerView.getAdapter()).toggleSelection(mediaRecord); recyclerView.getAdapter().notifyDataSetChanged(); - actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback); + enterMultiSelect(); } } @@ -352,6 +361,17 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity return (MediaGalleryAdapter) recyclerView.getAdapter(); } + private void enterMultiSelect() { + actionMode = ((AppCompatActivity) getActivity()).startSupportActionMode(actionModeCallback); + ((MediaOverviewActivity) getActivity()).onEnterMultiSelect(); + } + + private void exitMultiSelect() { + actionMode.finish(); + actionMode = null; + ((MediaOverviewActivity) getActivity()).onExitMultiSelect(); + } + private class ActionModeCallback implements ActionMode.Callback { private int originalStatusBarColor; @@ -379,7 +399,7 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity switch (menuItem.getItemId()) { case R.id.delete: handleDeleteMedia(getListAdapter().getSelectedMedia()); - mode.finish(); + exitMultiSelect(); return true; } return false; diff --git a/src/org/thoughtcrime/securesms/components/ControllableTabLayout.java b/src/org/thoughtcrime/securesms/components/ControllableTabLayout.java new file mode 100644 index 0000000000..b15530eb36 --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/ControllableTabLayout.java @@ -0,0 +1,41 @@ +package org.thoughtcrime.securesms.components; + +import android.content.Context; +import android.support.design.widget.TabLayout; +import android.util.AttributeSet; +import android.view.View; + +import java.util.List; + +/** + * An implementation of {@link TabLayout} that disables taps when the view is disabled. + */ +public class ControllableTabLayout extends TabLayout { + + private List touchables; + + public ControllableTabLayout(Context context) { + super(context); + } + + public ControllableTabLayout(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public ControllableTabLayout(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + public void setEnabled(boolean enabled) { + if (isEnabled() && !enabled) { + touchables = getTouchables(); + } + + for (View touchable : touchables) { + touchable.setClickable(enabled); + } + + super.setEnabled(enabled); + } +} diff --git a/src/org/thoughtcrime/securesms/components/ControllableViewPager.java b/src/org/thoughtcrime/securesms/components/ControllableViewPager.java new file mode 100644 index 0000000000..5371219afc --- /dev/null +++ b/src/org/thoughtcrime/securesms/components/ControllableViewPager.java @@ -0,0 +1,32 @@ +package org.thoughtcrime.securesms.components; + +import android.content.Context; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.view.ViewPager; +import android.util.AttributeSet; +import android.view.MotionEvent; + +/** + * An implementation of {@link ViewPager} that disables swiping when the view is disabled. + */ +public class ControllableViewPager extends ViewPager { + + public ControllableViewPager(@NonNull Context context) { + super(context); + } + + public ControllableViewPager(@NonNull Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + @Override + public boolean onTouchEvent(MotionEvent ev) { + return isEnabled() && super.onTouchEvent(ev); + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent ev) { + return isEnabled() && super.onInterceptTouchEvent(ev); + } +}