Username search UI tweak.

fork-5.53.8
Alex Hart 2022-09-07 14:48:51 -03:00 zatwierdzone przez Greyson Parrelli
rodzic d458ddba55
commit 993e49db48
8 zmienionych plików z 83 dodań i 23 usunięć

Wyświetl plik

@ -64,6 +64,7 @@ public final class AvatarImageView extends AppCompatImageView {
private @Nullable RecipientContactPhoto recipientContactPhoto; private @Nullable RecipientContactPhoto recipientContactPhoto;
private @NonNull Drawable unknownRecipientDrawable; private @NonNull Drawable unknownRecipientDrawable;
private @Nullable AvatarColor fallbackPhotoColor;
public AvatarImageView(Context context) { public AvatarImageView(Context context) {
super(context); super(context);
@ -105,6 +106,10 @@ public final class AvatarImageView extends AppCompatImageView {
this.fallbackPhotoProvider = fallbackPhotoProvider; this.fallbackPhotoProvider = fallbackPhotoProvider;
} }
public void setFallbackPhotoColor(@Nullable AvatarColor fallbackPhotoColor) {
this.fallbackPhotoColor = fallbackPhotoColor;
}
/** /**
* Shows self as the actual profile picture. * Shows self as the actual profile picture.
*/ */
@ -213,7 +218,7 @@ public final class AvatarImageView extends AppCompatImageView {
requestManager.clear(this); requestManager.clear(this);
if (fallbackPhotoProvider != null) { if (fallbackPhotoProvider != null) {
setImageDrawable(fallbackPhotoProvider.getPhotoForRecipientWithoutName() setImageDrawable(fallbackPhotoProvider.getPhotoForRecipientWithoutName()
.asDrawable(getContext(), AvatarColor.UNKNOWN, inverted)); .asDrawable(getContext(), Util.firstNonNull(fallbackPhotoColor, AvatarColor.UNKNOWN), inverted));
} else { } else {
setImageDrawable(unknownRecipientDrawable); setImageDrawable(unknownRecipientDrawable);
} }

Wyświetl plik

@ -2,6 +2,8 @@ package org.thoughtcrime.securesms.contacts;
import android.annotation.SuppressLint; import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.view.View; import android.view.View;
import android.widget.CheckBox; import android.widget.CheckBox;
@ -10,18 +12,23 @@ import android.widget.TextView;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable; import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout; import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.core.content.ContextCompat;
import org.signal.core.util.logging.Log; import org.signal.core.util.logging.Log;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.badges.BadgeImageView; import org.thoughtcrime.securesms.badges.BadgeImageView;
import org.thoughtcrime.securesms.components.AvatarImageView; import org.thoughtcrime.securesms.components.AvatarImageView;
import org.thoughtcrime.securesms.components.FromTextView; import org.thoughtcrime.securesms.components.FromTextView;
import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto;
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
import org.thoughtcrime.securesms.conversation.colors.AvatarColor;
import org.thoughtcrime.securesms.mms.GlideRequests; import org.thoughtcrime.securesms.mms.GlideRequests;
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter;
import org.thoughtcrime.securesms.recipients.LiveRecipient; import org.thoughtcrime.securesms.recipients.LiveRecipient;
import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver; import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.SpanUtil;
import org.thoughtcrime.securesms.util.Util; import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil; import org.thoughtcrime.securesms.util.ViewUtil;
@ -51,6 +58,8 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
private LiveRecipient recipient; private LiveRecipient recipient;
private GlideRequests glideRequests; private GlideRequests glideRequests;
private final UsernameFallbackPhotoProvider usernameFallbackPhotoProvider = new UsernameFallbackPhotoProvider();
public ContactSelectionListItem(Context context) { public ContactSelectionListItem(Context context) {
super(context); super(context);
} }
@ -104,8 +113,11 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
this.contactLabel = label; this.contactLabel = label;
this.contactAbout = about; this.contactAbout = about;
this.contactPhotoImage.setFallbackPhotoProvider(null);
if (type == ContactRepository.NEW_PHONE_TYPE || type == ContactRepository.NEW_USERNAME_TYPE) { if (type == ContactRepository.NEW_PHONE_TYPE || type == ContactRepository.NEW_USERNAME_TYPE) {
this.recipient = null; this.recipient = null;
this.contactPhotoImage.setFallbackPhotoProvider(usernameFallbackPhotoProvider);
this.contactPhotoImage.setFallbackPhotoColor(AvatarColor.ON_SURFACE_VARIANT);
this.contactPhotoImage.setAvatar(glideRequests, null, false); this.contactPhotoImage.setAvatar(glideRequests, null, false);
} else if (recipientId != null) { } else if (recipientId != null) {
if (this.recipient != null) { if (this.recipient != null) {
@ -168,6 +180,8 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
@SuppressLint("SetTextI18n") @SuppressLint("SetTextI18n")
private void setText(@Nullable Recipient recipient, int type, String name, String number, String label, @Nullable String about) { private void setText(@Nullable Recipient recipient, int type, String name, String number, String label, @Nullable String about) {
this.numberView.setVisibility(View.VISIBLE);
if (number == null || number.isEmpty()) { if (number == null || number.isEmpty()) {
this.nameView.setEnabled(false); this.nameView.setEnabled(false);
this.numberView.setText(""); this.numberView.setText("");
@ -181,10 +195,9 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
this.nameView.setEnabled(true); this.nameView.setEnabled(true);
this.labelView.setVisibility(View.GONE); this.labelView.setVisibility(View.GONE);
} else if (type == ContactRepository.NEW_USERNAME_TYPE) { } else if (type == ContactRepository.NEW_USERNAME_TYPE) {
this.numberView.setText("@" + number); this.numberView.setVisibility(View.GONE);
this.nameView.setEnabled(true); this.nameView.setEnabled(true);
this.labelView.setText(label); this.labelView.setVisibility(View.GONE);
this.labelView.setVisibility(View.VISIBLE);
} else if (recipient != null && recipient.isDistributionList()) { } else if (recipient != null && recipient.isDistributionList()) {
this.numberView.setText(getViewerCount(number)); this.numberView.setText(getViewerCount(number));
this.labelView.setVisibility(View.GONE); this.labelView.setVisibility(View.GONE);
@ -198,6 +211,8 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
if (recipient != null) { if (recipient != null) {
this.nameView.setText(recipient); this.nameView.setText(recipient);
chipName = recipient.getShortDisplayName(getContext()); chipName = recipient.getShortDisplayName(getContext());
} else if (type == ContactRepository.NEW_USERNAME_TYPE && number != null) {
this.nameView.setText(presentUsername(number));
} else { } else {
this.nameView.setText(name); this.nameView.setText(name);
chipName = name; chipName = name;
@ -224,6 +239,14 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
int viewerCount = Integer.parseInt(number); int viewerCount = Integer.parseInt(number);
return getContext().getResources().getQuantityString(R.plurals.contact_selection_list_item__number_of_viewers, viewerCount, viewerCount); return getContext().getResources().getQuantityString(R.plurals.contact_selection_list_item__number_of_viewers, viewerCount, viewerCount);
} }
private CharSequence presentUsername(@NonNull String username) {
if (username.contains("#")) {
return username;
} else {
return new SpannableStringBuilder(username).append(SpanUtil.color(ContextCompat.getColor(getContext(), R.color.signal_colorOutline), "#"));
}
}
public @Nullable LiveRecipient getRecipient() { public @Nullable LiveRecipient getRecipient() {
return recipient; return recipient;
@ -264,4 +287,11 @@ public class ContactSelectionListItem extends ConstraintLayout implements Recipi
Log.w(TAG, "Bad change! Local recipient doesn't match. Ignoring. Local: " + (this.recipient == null ? "null" : this.recipient.getId()) + ", Changed: " + recipient.getId()); Log.w(TAG, "Bad change! Local recipient doesn't match. Ignoring. Local: " + (this.recipient == null ? "null" : this.recipient.getId()) + ", Changed: " + recipient.getId());
} }
} }
private static class UsernameFallbackPhotoProvider extends Recipient.FallbackPhotoProvider {
@Override
public @NonNull FallbackContactPhoto getPhotoForRecipientWithoutName() {
return new ResourceContactPhoto(R.drawable.ic_search_24, R.drawable.ic_search_24, R.drawable.ic_search_24);
}
}
} }

Wyświetl plik

@ -259,7 +259,7 @@ public class ContactsCursorLoader extends AbstractContactsCursorLoader {
} }
private Cursor getUsernameSearchCursor() { private Cursor getUsernameSearchCursor() {
return ContactsCursorRows.forUsernameSearch(getUnknownContactTitle(), getFilter()); return ContactsCursorRows.forUsernameSearch(getFilter());
} }
private String getUnknownContactTitle() { private String getUnknownContactTitle() {

Wyświetl plik

@ -104,11 +104,11 @@ public final class ContactsCursorRows {
/** /**
* Create a row for a contacts cursor for a username the user is entering or has entered. * Create a row for a contacts cursor for a username the user is entering or has entered.
*/ */
public static @NonNull MatrixCursor forUsernameSearch(@NonNull String unknownContactTitle, @NonNull String filter) { public static @NonNull MatrixCursor forUsernameSearch(@NonNull String filter) {
MatrixCursor matrixCursor = createMatrixCursor(1); MatrixCursor matrixCursor = createMatrixCursor(1);
matrixCursor.addRow(new Object[]{null, matrixCursor.addRow(new Object[]{null,
unknownContactTitle, null,
filter, filter,
ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM, ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM,
"\u21e2", "\u21e2",
@ -119,7 +119,7 @@ public final class ContactsCursorRows {
} }
public static @NonNull MatrixCursor forUsernameSearchHeader(@NonNull Context context) { public static @NonNull MatrixCursor forUsernameSearchHeader(@NonNull Context context) {
return forHeader(context.getString(R.string.ContactsCursorLoader_username_search)); return forHeader(context.getString(R.string.ContactsCursorLoader_find_by_username));
} }
public static @NonNull MatrixCursor forPhoneNumberSearchHeader(@NonNull Context context) { public static @NonNull MatrixCursor forPhoneNumberSearchHeader(@NonNull Context context) {

Wyświetl plik

@ -1,7 +1,6 @@
package org.thoughtcrime.securesms.contacts.avatars; package org.thoughtcrime.securesms.contacts.avatars;
import android.content.Context; import android.content.Context;
import android.graphics.Color;
import android.graphics.PorterDuff; import android.graphics.PorterDuff;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.graphics.drawable.LayerDrawable; import android.graphics.drawable.LayerDrawable;
@ -17,8 +16,8 @@ import com.makeramen.roundedimageview.RoundedDrawable;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.avatar.Avatars;
import org.thoughtcrime.securesms.conversation.colors.AvatarColor; import org.thoughtcrime.securesms.conversation.colors.AvatarColor;
import org.thoughtcrime.securesms.conversation.colors.AvatarColorPair;
import java.util.Objects; import java.util.Objects;
@ -64,18 +63,10 @@ public class ResourceContactPhoto implements FallbackContactPhoto {
} }
private @NonNull Drawable buildDrawable(@NonNull Context context, int resourceId, @NonNull AvatarColor color, boolean inverted) { private @NonNull Drawable buildDrawable(@NonNull Context context, int resourceId, @NonNull AvatarColor color, boolean inverted) {
final int backgroundColor; AvatarColorPair avatarColorPair = AvatarColorPair.create(context, color);
final int foregroundColor;
if (color == AvatarColor.UNKNOWN) { final int backgroundColor = avatarColorPair.getBackgroundColor();
backgroundColor = ContextCompat.getColor(context, R.color.signal_colorSurfaceVariant); final int foregroundColor = avatarColorPair.getForegroundColor();
foregroundColor = ContextCompat.getColor(context, R.color.signal_colorOnSurface);
} else {
Avatars.ForegroundColor foregroundAvatarColor = Avatars.getForegroundColor(color);
backgroundColor = color.colorInt();
foregroundColor = foregroundAvatarColor.getColorInt();
}
Drawable background = Objects.requireNonNull(ContextCompat.getDrawable(context, R.drawable.circle_tintable)); Drawable background = Objects.requireNonNull(ContextCompat.getDrawable(context, R.drawable.circle_tintable));
RoundedDrawable foreground = (RoundedDrawable) RoundedDrawable.fromDrawable(AppCompatResources.getDrawable(context, resourceId)); RoundedDrawable foreground = (RoundedDrawable) RoundedDrawable.fromDrawable(AppCompatResources.getDrawable(context, resourceId));

Wyświetl plik

@ -24,7 +24,8 @@ public enum AvatarColor {
A190("A190", 0xFFEAE6D5), A190("A190", 0xFFEAE6D5),
A200("A200", 0xFFD2D2DC), A200("A200", 0xFFD2D2DC),
A210("A210", 0xFFD7D7D9), A210("A210", 0xFFD7D7D9),
UNKNOWN("UNKNOWN", 0x00000000); UNKNOWN("UNKNOWN", 0x00000000),
ON_SURFACE_VARIANT("ON_SURFACE_VARIANT", 0x00000000);
/** Fast map of name to enum, while also giving us a location to map old colors to new ones. */ /** Fast map of name to enum, while also giving us a location to map old colors to new ones. */
private static final Map<String, AvatarColor> NAME_MAP = new HashMap<>(); private static final Map<String, AvatarColor> NAME_MAP = new HashMap<>();

Wyświetl plik

@ -0,0 +1,32 @@
package org.thoughtcrime.securesms.conversation.colors
import android.content.Context
import androidx.annotation.ColorInt
import androidx.core.content.ContextCompat
import org.thoughtcrime.securesms.R
import org.thoughtcrime.securesms.avatar.Avatars
class AvatarColorPair private constructor(
@ColorInt val foregroundColor: Int,
@ColorInt val backgroundColor: Int
) {
companion object {
@JvmStatic
fun create(context: Context, avatarColor: AvatarColor): AvatarColorPair {
return when (avatarColor) {
AvatarColor.UNKNOWN -> AvatarColorPair(
foregroundColor = ContextCompat.getColor(context, R.color.signal_colorOnSurface),
backgroundColor = ContextCompat.getColor(context, R.color.signal_colorSurfaceVariant)
)
AvatarColor.ON_SURFACE_VARIANT -> AvatarColorPair(
foregroundColor = ContextCompat.getColor(context, R.color.signal_colorOnSurfaceVariant),
backgroundColor = ContextCompat.getColor(context, R.color.signal_colorSurfaceVariant)
)
else -> AvatarColorPair(
foregroundColor = Avatars.getForegroundColor(avatarColor).colorInt,
backgroundColor = avatarColor.colorInt()
)
}
}
}
}

Wyświetl plik

@ -214,7 +214,8 @@
<string name="ContactsCursorLoader_contacts">Contacts</string> <string name="ContactsCursorLoader_contacts">Contacts</string>
<string name="ContactsCursorLoader_groups">Groups</string> <string name="ContactsCursorLoader_groups">Groups</string>
<string name="ContactsCursorLoader_phone_number_search">Phone number search</string> <string name="ContactsCursorLoader_phone_number_search">Phone number search</string>
<string name="ContactsCursorLoader_username_search">Username search</string> <!-- Header for username search -->
<string name="ContactsCursorLoader_find_by_username">Find by username</string>
<!-- Label for my stories when selecting who to send media to --> <!-- Label for my stories when selecting who to send media to -->
<string name="ContactsCursorLoader_my_stories">My Stories</string> <string name="ContactsCursorLoader_my_stories">My Stories</string>
<!-- Action for creating a new story --> <!-- Action for creating a new story -->