diff --git a/res/drawable-v12/recycler_view_fast_scroller_bubble.xml b/res/drawable-v12/recycler_view_fast_scroller_bubble.xml deleted file mode 100644 index f135c5c6d..000000000 --- a/res/drawable-v12/recycler_view_fast_scroller_bubble.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/res/drawable/recycler_view_fast_scroller_bubble.xml b/res/drawable/recycler_view_fast_scroller_bubble.xml deleted file mode 100644 index 417f6e4bc..000000000 --- a/res/drawable/recycler_view_fast_scroller_bubble.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/res/drawable/recycler_view_fast_scroller_handle.xml b/res/drawable/recycler_view_fast_scroller_handle.xml deleted file mode 100644 index fa2ca8a58..000000000 --- a/res/drawable/recycler_view_fast_scroller_handle.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/res/layout/contact_selection_list_fragment.xml b/res/layout/contact_selection_list_fragment.xml index 0ed121989..01bbf06ba 100644 --- a/res/layout/contact_selection_list_fragment.xml +++ b/res/layout/contact_selection_list_fragment.xml @@ -22,11 +22,4 @@ android:textSize="20sp" tools:text="No contacts." /> - - diff --git a/res/layout/contact_selection_list_item.xml b/res/layout/contact_selection_list_item.xml index 8f5a1afdd..bb4aee0bf 100644 --- a/res/layout/contact_selection_list_item.xml +++ b/res/layout/contact_selection_list_item.xml @@ -8,10 +8,8 @@ android:gravity="center_vertical" android:focusable="true" android:background="?attr/conversation_list_item_background" - android:paddingLeft="48dp" - android:paddingStart="48dp" - android:paddingRight="24dp" - android:paddingEnd="24dp"> + android:paddingLeft="24dp" + android:paddingRight="24dp"> - diff --git a/res/layout/recycler_view_fast_scroller.xml b/res/layout/recycler_view_fast_scroller.xml deleted file mode 100644 index 2edd24c13..000000000 --- a/res/layout/recycler_view_fast_scroller.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java index 51e675421..4c0791403 100644 --- a/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/src/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -20,7 +20,6 @@ package org.thoughtcrime.securesms; import android.Manifest; import android.annotation.SuppressLint; import android.content.Intent; -import android.content.res.Configuration; import android.content.res.TypedArray; import android.graphics.Color; import android.os.AsyncTask; @@ -44,14 +43,12 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.TextView; import android.widget.Toast; import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; import com.b44t.messenger.DcEvent; -import org.thoughtcrime.securesms.components.RecyclerViewFastScroller; import org.thoughtcrime.securesms.connect.DcContactsLoader; import org.thoughtcrime.securesms.connect.DcEventCenter; import org.thoughtcrime.securesms.connect.DcHelper; @@ -60,7 +57,6 @@ import org.thoughtcrime.securesms.contacts.ContactSelectionListAdapter; import org.thoughtcrime.securesms.contacts.ContactSelectionListItem; import org.thoughtcrime.securesms.mms.GlideApp; import org.thoughtcrime.securesms.permissions.Permissions; -import org.thoughtcrime.securesms.util.StickyHeaderDecoration; import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.ViewUtil; @@ -95,8 +91,6 @@ public class ContactSelectionListFragment extends Fragment private OnContactSelectedListener onContactSelectedListener; private String cursorFilter; private RecyclerView recyclerView; - private StickyHeaderDecoration listDecoration; - private RecyclerViewFastScroller fastScroller; private ActionMode actionMode; private ActionMode.Callback actionModeCallback; @@ -131,7 +125,6 @@ public class ContactSelectionListFragment extends Fragment View view = inflater.inflate(R.layout.contact_selection_list_fragment, container, false); recyclerView = ViewUtil.findById(view, R.id.recycler_view); - fastScroller = ViewUtil.findById(view, R.id.fast_scroller); recyclerView.setLayoutManager(new LinearLayoutManager(getActivity())); actionModeCallback = new ActionMode.Callback() { @Override @@ -183,12 +176,6 @@ public class ContactSelectionListFragment extends Fragment return view; } - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - listDecoration.onConfigurationChanged(newConfig); - } - private void handleSelectAll() { getContactSelectionListAdapter().selectAll(); updateActionModeTitle(); @@ -286,8 +273,6 @@ public class ContactSelectionListFragment extends Fragment selectedContacts.addAll(preselectedContacts); } recyclerView.setAdapter(adapter); - listDecoration = new StickyHeaderDecoration(adapter, true, true); - recyclerView.addItemDecoration(listDecoration); } public void setQueryFilter(String filter) { @@ -295,18 +280,6 @@ public class ContactSelectionListFragment extends Fragment this.getLoaderManager().restartLoader(0, null, this); } - public void resetQueryFilter() { - setQueryFilter(null); - } - - public void reset() { - selectedContacts.clear(); - - if (!isDetached() && !isRemoving() && getActivity() != null && !getActivity().isFinishing()) { - getLoaderManager().restartLoader(0, null, this); - } - } - @Override public Loader onCreateLoader(int id, Bundle args) { boolean addCreateGroupLinks = isFromShareActivity() || isRelayingMessageContent(getActivity()) ? false : !isMulti(); @@ -320,18 +293,11 @@ public class ContactSelectionListFragment extends Fragment @Override public void onLoadFinished(Loader loader, DcContactsLoader.Ret data) { ((ContactSelectionListAdapter) recyclerView.getAdapter()).changeData(data); - boolean useFastScroller = (recyclerView.getAdapter().getItemCount() > 20); - recyclerView.setVerticalScrollBarEnabled(!useFastScroller); - if (useFastScroller) { - fastScroller.setVisibility(View.VISIBLE); - fastScroller.setRecyclerView(recyclerView); - } } @Override public void onLoaderReset(Loader loader) { ((ContactSelectionListAdapter) recyclerView.getAdapter()).changeData(null); - fastScroller.setVisibility(View.GONE); } @SuppressLint("StaticFieldLeak") diff --git a/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java b/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java deleted file mode 100644 index 1de7fcdd7..000000000 --- a/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java +++ /dev/null @@ -1,213 +0,0 @@ -/** - * Modified version of - * https://github.com/AndroidDeveloperLB/LollipopContactsRecyclerViewFastScroller - * - * Their license: - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.thoughtcrime.securesms.components; - -import android.animation.Animator; -import android.animation.AnimatorListenerAdapter; -import android.animation.ObjectAnimator; -import android.annotation.TargetApi; -import android.content.Context; -import android.os.Build.VERSION; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; -import androidx.recyclerview.widget.LinearLayoutManager; -import androidx.recyclerview.widget.RecyclerView; -import android.util.AttributeSet; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewTreeObserver; -import android.widget.LinearLayout; -import android.widget.TextView; - -import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.util.Util; -import org.thoughtcrime.securesms.util.ViewUtil; - -public class RecyclerViewFastScroller extends LinearLayout { - private static final int BUBBLE_ANIMATION_DURATION = 100; - private static final int TRACK_SNAP_RANGE = 5; - - private @NonNull TextView bubble; - private @NonNull View handle; - private @Nullable RecyclerView recyclerView; - - private int height; - private ObjectAnimator currentAnimator; - - private final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() { - @Override - public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) { - if (handle.isSelected()) return; - final int offset = recyclerView.computeVerticalScrollOffset(); - final int range = recyclerView.computeVerticalScrollRange(); - final int extent = recyclerView.computeVerticalScrollExtent(); - final int offsetRange = Math.max(range - extent, 1); - setBubbleAndHandlePosition((float) Util.clamp(offset, 0, offsetRange) / offsetRange); - } - }; - - public interface FastScrollAdapter { - CharSequence getBubbleText(int pos); - } - - public RecyclerViewFastScroller(final Context context) { - this(context, null); - } - - public RecyclerViewFastScroller(final Context context, final AttributeSet attrs) { - super(context, attrs); - setOrientation(HORIZONTAL); - setClipChildren(false); - setScrollContainer(true); - inflate(context, R.layout.recycler_view_fast_scroller, this); - bubble = ViewUtil.findById(this, R.id.fastscroller_bubble); - handle = ViewUtil.findById(this, R.id.fastscroller_handle); - } - - @Override - protected void onSizeChanged(int w, int h, int oldw, int oldh) { - super.onSizeChanged(w, h, oldw, oldh); - height = h; - } - - @Override - @TargetApi(11) - public boolean onTouchEvent(@NonNull MotionEvent event) { - final int action = event.getAction(); - switch (action) { - case MotionEvent.ACTION_DOWN: - if (event.getX() < ViewUtil.getX(handle) - handle.getPaddingLeft() || - event.getY() < ViewUtil.getY(handle) - handle.getPaddingTop() || - event.getY() > ViewUtil.getY(handle) + handle.getHeight() + handle.getPaddingBottom()) - { - return false; - } - if (currentAnimator != null) { - currentAnimator.cancel(); - } - if (bubble.getVisibility() != VISIBLE) { - showBubble(); - } - handle.setSelected(true); - case MotionEvent.ACTION_MOVE: - final float y = event.getY(); - setBubbleAndHandlePosition(y / height); - setRecyclerViewPosition(y); - return true; - case MotionEvent.ACTION_UP: - case MotionEvent.ACTION_CANCEL: - handle.setSelected(false); - hideBubble(); - return true; - } - return super.onTouchEvent(event); - } - - public void setRecyclerView(final @NonNull RecyclerView recyclerView) { - if (this.recyclerView != null) { - this.recyclerView.removeOnScrollListener(onScrollListener); - } - this.recyclerView = recyclerView; - recyclerView.addOnScrollListener(onScrollListener); - recyclerView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() { - @Override - public boolean onPreDraw() { - recyclerView.getViewTreeObserver().removeOnPreDrawListener(this); - if (handle.isSelected()) return true; - final int verticalScrollOffset = recyclerView.computeVerticalScrollOffset(); - final int verticalScrollRange = recyclerView.computeVerticalScrollRange(); - float proportion = (float)verticalScrollOffset / ((float)verticalScrollRange - height); - setBubbleAndHandlePosition(height * proportion); - return true; - } - }); - } - - @Override - protected void onDetachedFromWindow() { - super.onDetachedFromWindow(); - if (recyclerView != null) - recyclerView.removeOnScrollListener(onScrollListener); - } - - private void setRecyclerViewPosition(float y) { - if (recyclerView != null) { - final int itemCount = recyclerView.getAdapter().getItemCount(); - float proportion; - if (ViewUtil.getY(handle) == 0) { - proportion = 0f; - } else if (ViewUtil.getY(handle) + handle.getHeight() >= height - TRACK_SNAP_RANGE) { - proportion = 1f; - } else { - proportion = y / (float)height; - } - - final int targetPos = Util.clamp((int)(proportion * (float)itemCount), 0, itemCount - 1); - ((LinearLayoutManager) recyclerView.getLayoutManager()).scrollToPositionWithOffset(targetPos, 0); - final CharSequence bubbleText = ((FastScrollAdapter) recyclerView.getAdapter()).getBubbleText(targetPos); - bubble.setText(bubbleText); - } - } - - private void setBubbleAndHandlePosition(float y) { - final int handleHeight = handle.getHeight(); - final int bubbleHeight = bubble.getHeight(); - final int handleY = Util.clamp((int)((height - handleHeight) * y), 0, height - handleHeight); - ViewUtil.setY(handle, handleY); - ViewUtil.setY(bubble, Util.clamp(handleY - bubbleHeight - bubble.getPaddingBottom() + handleHeight, - 0, - height - bubbleHeight)); - } - - @TargetApi(11) - private void showBubble() { - bubble.setVisibility(VISIBLE); - if (VERSION.SDK_INT >= 11) { - if (currentAnimator != null) currentAnimator.cancel(); - currentAnimator = ObjectAnimator.ofFloat(bubble, "alpha", 0f, 1f).setDuration(BUBBLE_ANIMATION_DURATION); - currentAnimator.start(); - } - } - - @TargetApi(11) - private void hideBubble() { - if (VERSION.SDK_INT >= 11) { - if (currentAnimator != null) currentAnimator.cancel(); - currentAnimator = ObjectAnimator.ofFloat(bubble, "alpha", 1f, 0f).setDuration(BUBBLE_ANIMATION_DURATION); - currentAnimator.addListener(new AnimatorListenerAdapter() { - @Override - public void onAnimationEnd(Animator animation) { - super.onAnimationEnd(animation); - bubble.setVisibility(INVISIBLE); - currentAnimator = null; - } - - @Override - public void onAnimationCancel(Animator animation) { - super.onAnimationCancel(animation); - bubble.setVisibility(INVISIBLE); - currentAnimator = null; - } - }); - currentAnimator.start(); - } else { - bubble.setVisibility(INVISIBLE); - } - } -} diff --git a/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java b/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java index 3d1e761bd..053513fc3 100644 --- a/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java +++ b/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java @@ -32,14 +32,10 @@ import com.b44t.messenger.DcContact; import com.b44t.messenger.DcContext; import org.thoughtcrime.securesms.R; -import org.thoughtcrime.securesms.components.RecyclerViewFastScroller.FastScrollAdapter; import org.thoughtcrime.securesms.connect.DcContactsLoader; import org.thoughtcrime.securesms.connect.DcHelper; -import org.thoughtcrime.securesms.contacts.ContactSelectionListAdapter.HeaderViewHolder; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.util.LRUCache; -import org.thoughtcrime.securesms.util.StickyHeaderDecoration.StickyHeaderAdapter; -import org.thoughtcrime.securesms.util.Util; import java.lang.ref.SoftReference; import java.util.Collections; @@ -53,8 +49,6 @@ import java.util.Set; * @author Jake McGinty */ public class ContactSelectionListAdapter extends RecyclerView.Adapter - implements FastScrollAdapter, - StickyHeaderAdapter { private final static String TAG = ContactSelectionListAdapter.class.getSimpleName(); @@ -243,12 +237,6 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter } } - static class HeaderViewHolder extends RecyclerView.ViewHolder { - HeaderViewHolder(View itemView) { - super(itemView); - } - } - public ContactSelectionListAdapter(@NonNull Context context, @NonNull GlideRequests glideRequests, @Nullable ItemClickListener clickListener, @@ -328,11 +316,6 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter return VIEW_TYPE_CONTACT; } - @Override - public CharSequence getBubbleText(int position) { - return getHeaderString(position); - } - public Set getSelectedContacts() { return selectedContacts; } @@ -347,38 +330,6 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter void onItemLongClick(ContactSelectionListItem view); } - @Override - public long getHeaderId(int position) { - if (position < 0 || position >= getItemCount()) { - return -1; - } - - return Util.hashCode(getHeaderString(position)); - } - - private @NonNull String getHeaderString(int position) { - DcContact dcContact = getContact(position); - String name = dcContact.getDisplayName(); - if (!TextUtils.isEmpty(name)) { - String firstChar = name.trim().substring(0, 1).toUpperCase(); - if (Character.isLetterOrDigit(firstChar.codePointAt(0))) { - return firstChar; - } - } - return ""; - } - - @Override - public HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent) { - return new HeaderViewHolder(LayoutInflater.from(context).inflate(R.layout.contact_selection_recyclerview_header, parent, false)); - } - - @Override - public void onBindHeaderViewHolder(HeaderViewHolder viewHolder, int position) { - ((TextView)viewHolder.itemView).setText(getHeaderString(position)); - } - - public void changeData(DcContactsLoader.Ret loaderRet) { this.dcContactList = loaderRet==null? new int[0] : loaderRet.ids; this.query = loaderRet==null? null : loaderRet.query; diff --git a/src/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java b/src/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java index b660f493e..3d0cd3891 100644 --- a/src/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java +++ b/src/org/thoughtcrime/securesms/contacts/ContactSelectionListItem.java @@ -12,7 +12,6 @@ import com.b44t.messenger.DcContact; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.AvatarView; -import org.thoughtcrime.securesms.connect.DcHelper; import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientModifiedListener;