diff --git a/res/drawable-hdpi/ic_badge_24dp.png b/res/drawable-hdpi/ic_badge_24dp.png deleted file mode 100644 index aaf4fba850..0000000000 Binary files a/res/drawable-hdpi/ic_badge_24dp.png and /dev/null differ diff --git a/res/drawable-mdpi/ic_badge_24dp.png b/res/drawable-mdpi/ic_badge_24dp.png deleted file mode 100644 index 49b7c74eaf..0000000000 Binary files a/res/drawable-mdpi/ic_badge_24dp.png and /dev/null differ diff --git a/res/drawable-xhdpi/ic_badge_24dp.png b/res/drawable-xhdpi/ic_badge_24dp.png deleted file mode 100644 index 15fde7bffd..0000000000 Binary files a/res/drawable-xhdpi/ic_badge_24dp.png and /dev/null differ diff --git a/res/drawable-xxhdpi/ic_badge_24dp.png b/res/drawable-xxhdpi/ic_badge_24dp.png deleted file mode 100644 index e64872158a..0000000000 Binary files a/res/drawable-xxhdpi/ic_badge_24dp.png and /dev/null differ diff --git a/res/drawable-xxxhdpi/ic_badge_24dp.png b/res/drawable-xxxhdpi/ic_badge_24dp.png deleted file mode 100644 index 549a87dc66..0000000000 Binary files a/res/drawable-xxxhdpi/ic_badge_24dp.png and /dev/null differ diff --git a/res/drawable/badge_drawable.xml b/res/drawable/badge_drawable.xml deleted file mode 100644 index 5a87e3c781..0000000000 --- a/res/drawable/badge_drawable.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - diff --git a/res/layout/contact_selection_list_item.xml b/res/layout/contact_selection_list_item.xml index ab4ab40aaa..4f9d121420 100644 --- a/res/layout/contact_selection_list_item.xml +++ b/res/layout/contact_selection_list_item.xml @@ -18,7 +18,6 @@ android:layout_height="40dp" android:foreground="@drawable/contact_photo_background" android:cropToPadding="true" - app:showBadge="true" tools:src="@color/md_material_blue_600" android:layout_marginRight="10dp" android:contentDescription="@string/SingleContactSelectionActivity_contact_photo" /> diff --git a/res/values/attrs.xml b/res/values/attrs.xml index 433040b358..afd2e9a504 100644 --- a/res/values/attrs.xml +++ b/res/values/attrs.xml @@ -132,7 +132,6 @@ - diff --git a/src/org/thoughtcrime/securesms/components/AvatarImageView.java b/src/org/thoughtcrime/securesms/components/AvatarImageView.java index 6f7f462141..6fc4ea17ee 100644 --- a/src/org/thoughtcrime/securesms/components/AvatarImageView.java +++ b/src/org/thoughtcrime/securesms/components/AvatarImageView.java @@ -3,13 +3,8 @@ package org.thoughtcrime.securesms.components; import android.content.Context; import android.content.Intent; import android.content.res.TypedArray; -import android.graphics.drawable.Drawable; -import android.graphics.drawable.LayerDrawable; -import android.os.AsyncTask; import android.provider.ContactsContract; import android.support.annotation.Nullable; -import android.support.v4.content.ContextCompat; -import android.support.v4.util.Pair; import android.util.AttributeSet; import android.view.View; import android.widget.ImageView; @@ -21,13 +16,10 @@ import org.thoughtcrime.securesms.contacts.avatars.ContactPhotoFactory; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientFactory; import org.thoughtcrime.securesms.recipients.Recipients; -import org.thoughtcrime.securesms.util.DirectoryHelper; -import org.thoughtcrime.securesms.util.DirectoryHelper.UserCapabilities.Capability; public class AvatarImageView extends ImageView { private boolean inverted; - private boolean showBadge; public AvatarImageView(Context context) { super(context); @@ -41,7 +33,6 @@ public class AvatarImageView extends ImageView { if (attrs != null) { TypedArray typedArray = context.getTheme().obtainStyledAttributes(attrs, R.styleable.AvatarImageView, 0, 0); inverted = typedArray.getBoolean(0, false); - showBadge = typedArray.getBoolean(1, false); typedArray.recycle(); } } @@ -51,12 +42,9 @@ public class AvatarImageView extends ImageView { MaterialColor backgroundColor = recipients.getColor(); setImageDrawable(recipients.getContactPhoto().asDrawable(getContext(), backgroundColor.toConversationColor(getContext()), inverted)); setAvatarClickHandler(recipients, quickContactEnabled); - setTag(recipients); - if (showBadge) new BadgeResolutionTask(getContext()).execute(recipients); } else { setImageDrawable(ContactPhotoFactory.getDefaultContactPhoto(null).asDrawable(getContext(), ContactColors.UNKNOWN_COLOR.toConversationColor(getContext()), inverted)); setOnClickListener(null); - setTag(null); } } @@ -85,30 +73,4 @@ public class AvatarImageView extends ImageView { setOnClickListener(null); } } - - private class BadgeResolutionTask extends AsyncTask> { - private final Context context; - - public BadgeResolutionTask(Context context) { - this.context = context; - } - - @Override - protected Pair doInBackground(Recipients... recipients) { - Capability textCapability = DirectoryHelper.getUserCapabilities(context, recipients[0]).getTextCapability(); - return new Pair<>(recipients[0], textCapability == Capability.SUPPORTED); - } - - @Override - protected void onPostExecute(Pair result) { - if (getTag() == result.first && result.second) { - final Drawable badged = new LayerDrawable(new Drawable[] { - getDrawable(), - ContextCompat.getDrawable(context, R.drawable.badge_drawable) - }); - - setImageDrawable(badged); - } - } - } } diff --git a/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java b/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java index 70c7336223..3eed8e0ab7 100644 --- a/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java +++ b/src/org/thoughtcrime/securesms/components/RecyclerViewFastScroller.java @@ -25,7 +25,6 @@ import android.annotation.TargetApi; import android.content.Context; import android.os.Build.VERSION; import android.support.annotation.NonNull; -import android.support.v4.view.ViewCompat; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.util.AttributeSet; @@ -57,8 +56,8 @@ public class RecyclerViewFastScroller extends LinearLayout { return; final int verticalScrollOffset = recyclerView.computeVerticalScrollOffset(); final int verticalScrollRange = recyclerView.computeVerticalScrollRange(); - float proportion = (float)verticalScrollOffset / ((float)verticalScrollRange - height); - setBubbleAndHandlePosition(height * proportion); + final float proportion = (float)verticalScrollOffset / verticalScrollRange; + setBubbleAndHandlePosition(proportion); } }; @@ -106,7 +105,7 @@ public class RecyclerViewFastScroller extends LinearLayout { handle.setSelected(true); case MotionEvent.ACTION_MOVE: final float y = event.getY(); - setBubbleAndHandlePosition(y); + setBubbleAndHandlePosition(y / height); setRecyclerViewPosition(y); return true; case MotionEvent.ACTION_UP: @@ -147,12 +146,14 @@ public class RecyclerViewFastScroller extends LinearLayout { if (recyclerView != null) { final int itemCount = recyclerView.getAdapter().getItemCount(); float proportion; - if (ViewUtil.getY(handle) == 0) + if (ViewUtil.getY(handle) == 0) { proportion = 0f; - else if (ViewUtil.getY(handle) + handle.getHeight() >= height - TRACK_SNAP_RANGE) + } else if (ViewUtil.getY(handle) + handle.getHeight() >= height - TRACK_SNAP_RANGE) { proportion = 1f; - else - proportion = y / (float) height; + } 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); @@ -164,8 +165,11 @@ public class RecyclerViewFastScroller extends LinearLayout { private void setBubbleAndHandlePosition(float y) { final int handleHeight = handle.getHeight(); final int bubbleHeight = bubble.getHeight(); - ViewUtil.setY(handle, Util.clamp((int)(y - handleHeight / 2), 0, height - handleHeight)); - ViewUtil.setY(bubble, Util.clamp((int)(y - bubbleHeight), 0, height - bubbleHeight - handleHeight / 2)); + 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) diff --git a/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java b/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java index 6405827c94..11149397c7 100644 --- a/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java +++ b/src/org/thoughtcrime/securesms/contacts/ContactSelectionListAdapter.java @@ -20,14 +20,13 @@ import android.content.Context; import android.content.res.TypedArray; import android.database.Cursor; import android.provider.ContactsContract; -import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.v7.widget.RecyclerView; import android.text.SpannableString; import android.text.Spanned; import android.text.TextUtils; -import android.text.style.ImageSpan; +import android.text.style.ForegroundColorSpan; import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; @@ -40,6 +39,7 @@ import org.thoughtcrime.securesms.ContactSelectionListFragment.StickyHeaderAdapt import org.thoughtcrime.securesms.contacts.ContactSelectionListAdapter.HeaderViewHolder; import org.thoughtcrime.securesms.contacts.ContactSelectionListAdapter.ViewHolder; import org.thoughtcrime.securesms.database.CursorRecyclerViewAdapter; +import org.thoughtcrime.securesms.util.Util; import java.util.HashMap; import java.util.Map; @@ -103,7 +103,7 @@ public class ContactSelectionListAdapter extends CursorRecyclerViewAdapter getSelectedContacts() { return selectedContacts; } - private CharSequence getSpannedHeaderString(int position, @DrawableRes int drawable) { - Cursor cursor = getCursorAtPositionOrThrow(position); - - if (cursor.getInt(cursor.getColumnIndexOrThrow(ContactsDatabase.CONTACT_TYPE_COLUMN)) == ContactsDatabase.PUSH_TYPE) { - SpannableString spannable = new SpannableString(" "); - spannable.setSpan(new ImageSpan(getContext(), drawable, ImageSpan.ALIGN_BOTTOM), 0, spannable.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); + private CharSequence getSpannedHeaderString(int position) { + final String headerString = getHeaderString(position); + if (isPush(position)) { + SpannableString spannable = new SpannableString(headerString); + spannable.setSpan(new ForegroundColorSpan(getContext().getResources().getColor(R.color.signal_primary)), 0, headerString.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); return spannable; } else { - return getHeaderString(position); + return headerString; } } private @NonNull String getHeaderString(int position) { Cursor cursor = getCursorAtPositionOrThrow(position); String letter = cursor.getString(cursor.getColumnIndexOrThrow(ContactsDatabase.NAME_COLUMN)); - if (cursor.getInt(cursor.getColumnIndexOrThrow(ContactsDatabase.CONTACT_TYPE_COLUMN)) == ContactsDatabase.PUSH_TYPE) { - return getContext().getString(R.string.app_name); - } else if (!TextUtils.isEmpty(letter)) { + if (!TextUtils.isEmpty(letter)) { String firstChar = letter.trim().substring(0, 1).toUpperCase(); if (Character.isLetterOrDigit(firstChar.codePointAt(0))) { return firstChar; @@ -176,12 +173,19 @@ public class ContactSelectionListAdapter extends CursorRecyclerViewAdapter