diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 4192f48468..6057141155 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -323,9 +323,14 @@ class ConversationSettingsFragment : DSLSettingsFragment( state.withRecipientSettingsState { customPref( - BioTextPreference.RecipientModel(recipient = state.recipient, onHeadlineClickListener = { - AboutSheet.create(state.recipient).show(parentFragmentManager, null) - }) + BioTextPreference.RecipientModel( + recipient = state.recipient, + onHeadlineClickListener = if (state.recipient.isSelf || !state.recipient.isIndividual) { + null + } else { + { AboutSheet.create(state.recipient).show(parentFragmentManager, null) } + } + ) ) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt index 3b228710d4..f14394c381 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/preferences/BioTextPreference.kt @@ -2,13 +2,14 @@ package org.thoughtcrime.securesms.components.settings.conversation.preferences import android.content.ClipData import android.content.Context +import android.graphics.drawable.InsetDrawable import android.text.SpannableStringBuilder import android.view.View import android.widget.TextView import android.widget.Toast +import org.signal.core.util.dp import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.settings.PreferenceModel -import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.ServiceUtil @@ -32,12 +33,12 @@ object BioTextPreference { abstract fun getSubhead1Text(context: Context): String? abstract fun getSubhead2Text(): String? - open val onHeadlineClickListener: () -> Unit = {} + open val onHeadlineClickListener: (() -> Unit)? = null } class RecipientModel( private val recipient: Recipient, - override val onHeadlineClickListener: () -> Unit + override val onHeadlineClickListener: (() -> Unit)? ) : BioTextPreferenceModel() { override fun getHeadlineText(context: Context): CharSequence { @@ -56,8 +57,13 @@ object BioTextPreference { SpanUtil.appendCenteredImageSpan(this, ContextUtil.requireDrawable(context, R.drawable.ic_official_28), 28, 28) } - if (recipient.isIndividual) { - SpanUtil.appendCenteredImageSpan(this, ContextUtil.requireDrawable(context, R.drawable.symbol_chevron_right_24_color_on_secondary_container), 24, 24) + if (recipient.isIndividual && !recipient.isSelf) { + val drawable = ContextUtil.requireDrawable(context, R.drawable.symbol_chevron_right_24_color_on_secondary_container) + drawable.setBounds(0, 0, 24.dp, 24.dp) + + val insetDrawable = InsetDrawable(drawable, 0, 0, 0, 4.dp) + + SpanUtil.appendBottomImageSpan(this, insetDrawable, 24, 28) } } } @@ -70,11 +76,7 @@ object BioTextPreference { } } - override fun getSubhead2Text(): String? = if (recipient.shouldShowE164()) { - recipient.e164.map(PhoneNumberFormatter::prettyPrint).orElse(null) - } else { - null - } + override fun getSubhead2Text(): String? = null override fun areContentsTheSame(newItem: RecipientModel): Boolean { return super.areContentsTheSame(newItem) && newItem.recipient.hasSameContent(recipient) @@ -114,7 +116,11 @@ object BioTextPreference { override fun bind(model: T) { headline.text = model.getHeadlineText(context) - headline.setOnClickListener { model.onHeadlineClickListener() } + + val clickListener = model.onHeadlineClickListener + if (clickListener != null) { + headline.setOnClickListener { clickListener() } + } model.getSubhead1Text(context).let { subhead1.text = it diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt index 07ac9df4fb..58715d7ce1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationAdapterV2.kt @@ -584,7 +584,7 @@ class ConversationAdapterV2( conversationBanner.hideSubtitle() } } else if (isSelf) { - conversationBanner.setSubtitle(context.getString(R.string.ConversationFragment__you_can_add_notes_for_yourself_in_this_conversation), R.drawable.symbol_person_light_24) + conversationBanner.setSubtitle(context.getString(R.string.ConversationFragment__you_can_add_notes_for_yourself_in_this_conversation), R.drawable.symbol_note_light_24) } else { val subtitle: String? = recipient.takeIf { it.shouldShowE164() }?.e164?.map { e164: String? -> PhoneNumberFormatter.prettyPrint(e164!!) }?.orElse(null) if (subtitle == null || subtitle == title) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index 277816dc8c..89b64db38f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -5,6 +5,7 @@ import android.content.ActivityNotFoundException; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; +import android.graphics.drawable.InsetDrawable; import android.os.Bundle; import android.text.SpannableStringBuilder; import android.text.TextUtils; @@ -17,13 +18,13 @@ import android.widget.Toast; import androidx.annotation.NonNull; import androidx.annotation.Nullable; -import androidx.core.content.ContextCompat; import androidx.fragment.app.DialogFragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; import com.google.android.material.bottomsheet.BottomSheetDialogFragment; +import org.signal.core.util.DimensionUnit; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.avatar.view.AvatarView; @@ -35,7 +36,6 @@ import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.FallbackPhoto80dp; import org.thoughtcrime.securesms.groups.GroupId; import org.thoughtcrime.securesms.keyvalue.SignalStore; -import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter; import org.thoughtcrime.securesms.recipients.Recipient; import org.thoughtcrime.securesms.recipients.RecipientExporter; import org.thoughtcrime.securesms.recipients.RecipientId; @@ -43,8 +43,6 @@ import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.recipients.ui.about.AboutSheet; import org.thoughtcrime.securesms.util.BottomSheetUtil; import org.thoughtcrime.securesms.util.ContextUtil; -import org.thoughtcrime.securesms.util.DrawableUtil; -import org.thoughtcrime.securesms.util.ServiceUtil; import org.thoughtcrime.securesms.util.SpanUtil; import org.thoughtcrime.securesms.util.ThemeUtil; import org.thoughtcrime.securesms.util.Util; @@ -73,7 +71,6 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF private AvatarView avatar; private TextView fullName; private TextView about; - private TextView usernameNumber; private TextView blockButton; private TextView unblockButton; private TextView addContactButton; @@ -124,7 +121,6 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF avatar = view.findViewById(R.id.rbs_recipient_avatar); fullName = view.findViewById(R.id.rbs_full_name); about = view.findViewById(R.id.rbs_about); - usernameNumber = view.findViewById(R.id.rbs_username_number); blockButton = view.findViewById(R.id.rbs_block_button); unblockButton = view.findViewById(R.id.rbs_unblock_button); addContactButton = view.findViewById(R.id.rbs_add_contact_button); @@ -186,20 +182,24 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF : recipient.getDisplayName(requireContext()); fullName.setVisibility(TextUtils.isEmpty(name) ? View.GONE : View.VISIBLE); SpannableStringBuilder nameBuilder = new SpannableStringBuilder(name); - if (recipient.isSystemContact() && !recipient.isSelf()) { - Drawable systemContact = DrawableUtil.tint(ContextUtil.requireDrawable(requireContext(), R.drawable.ic_profile_circle_outline_16), - ContextCompat.getColor(requireContext(), R.color.signal_text_primary)); - SpanUtil.appendCenteredImageSpan(nameBuilder, systemContact, 16, 16); - } else if (recipient.showVerified()) { + if (recipient.showVerified()) { SpanUtil.appendCenteredImageSpan(nameBuilder, ContextUtil.requireDrawable(requireContext(), R.drawable.ic_official_28), 28, 28); } - SpanUtil.appendCenteredImageSpan(nameBuilder, ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_chevron_right_24_color_on_secondary_container), 24, 24); - fullName.setText(nameBuilder); - fullName.setOnClickListener(v -> { - dismiss(); - AboutSheet.create(recipient).show(getParentFragmentManager(), null); - }); + if (!recipient.isSelf() && recipient.isIndividual()) { + Drawable drawable = ContextUtil.requireDrawable(requireContext(), R.drawable.symbol_chevron_right_24_color_on_secondary_container); + drawable.setBounds(0, 0, (int) DimensionUnit.DP.toPixels(24), (int) DimensionUnit.DP.toPixels(24)); + + Drawable insetDrawable = new InsetDrawable(drawable, 0, 0, 0, (int) DimensionUnit.DP.toPixels(4)); + + SpanUtil.appendBottomImageSpan(nameBuilder, insetDrawable, 24, 28); + + fullName.setText(nameBuilder); + fullName.setOnClickListener(v -> { + dismiss(); + AboutSheet.create(recipient).show(getParentFragmentManager(), null); + }); + } String aboutText = recipient.getCombinedAboutAndEmoji(); if (recipient.isReleaseNotes()) { @@ -213,18 +213,6 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF about.setVisibility(View.GONE); } - String usernameNumberString = recipient.hasAUserSetDisplayName(requireContext()) && !recipient.isSelf() && recipient.shouldShowE164() - ? recipient.getSmsAddress().map(PhoneNumberFormatter::prettyPrint).orElse("").trim() - : ""; - usernameNumber.setText(usernameNumberString); - usernameNumber.setVisibility(TextUtils.isEmpty(usernameNumberString) ? View.GONE : View.VISIBLE); - usernameNumber.setOnLongClickListener(v -> { - Util.copyToClipboard(v.getContext(), usernameNumber.getText().toString()); - ServiceUtil.getVibrator(v.getContext()).vibrate(250); - Toast.makeText(v.getContext(), R.string.RecipientBottomSheet_copied_to_clipboard, Toast.LENGTH_SHORT).show(); - return true; - }); - noteToSelfDescription.setVisibility(recipient.isSelf() ? View.VISIBLE : View.GONE); if (RecipientUtil.isBlockable(recipient)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java index 44dd314459..a62e3a3da8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/SpanUtil.java @@ -116,10 +116,14 @@ public final class SpanUtil { } public static CharSequence buildImageSpan(@NonNull Drawable drawable) { - SpannableString imageSpan = new SpannableString(" "); - int flag = Build.VERSION.SDK_INT >= 29 ? DynamicDrawableSpan.ALIGN_CENTER : DynamicDrawableSpan.ALIGN_BASELINE; + return buildImageSpan(drawable, flag); + } + + private static CharSequence buildImageSpan(@NonNull Drawable drawable, int flag) { + SpannableString imageSpan = new SpannableString(" "); + imageSpan.setSpan(new ImageSpan(drawable, flag), 0, imageSpan.length(), 0); return imageSpan; @@ -143,6 +147,11 @@ public final class SpanUtil { builder.append(" ").append(SpanUtil.buildCenteredImageSpan(drawable)); } + public static void appendBottomImageSpan(@NonNull SpannableStringBuilder builder, @NonNull Drawable drawable, int width, int height) { + drawable.setBounds(0, 0, ViewUtil.dpToPx(width), ViewUtil.dpToPx(height)); + builder.append(" ").append(SpanUtil.buildImageSpan(drawable, DynamicDrawableSpan.ALIGN_BOTTOM)); + } + public static CharSequence learnMore(@NonNull Context context, @ColorInt int color, @NonNull View.OnClickListener onLearnMoreClicked) diff --git a/app/src/main/res/drawable/symbol_note_light_24.xml b/app/src/main/res/drawable/symbol_note_light_24.xml new file mode 100644 index 0000000000..ced3e49d35 --- /dev/null +++ b/app/src/main/res/drawable/symbol_note_light_24.xml @@ -0,0 +1,18 @@ + + + + + + diff --git a/app/src/main/res/layout/conversation_header_view.xml b/app/src/main/res/layout/conversation_header_view.xml index 593bb5bc81..de150c6d76 100644 --- a/app/src/main/res/layout/conversation_header_view.xml +++ b/app/src/main/res/layout/conversation_header_view.xml @@ -124,7 +124,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center" - android:textAppearance="@style/Signal.Text.MessageRequest.Subtitle" + android:textAppearance="@style/Signal.Text.BodyMedium" app:layout_constrainedWidth="true" app:layout_constraintBottom_toTopOf="@id/message_request_description" app:layout_constraintEnd_toEndOf="parent" @@ -139,7 +139,7 @@ android:layout_height="wrap_content" android:layout_marginTop="15dp" android:gravity="center" - android:textAppearance="@style/Signal.Text.MessageRequest.Description" + android:textAppearance="@style/Signal.Text.BodyMedium" android:visibility="gone" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="parent" diff --git a/app/src/main/res/layout/recipient_bottom_sheet.xml b/app/src/main/res/layout/recipient_bottom_sheet.xml index 924ace1ae3..df7f348b41 100644 --- a/app/src/main/res/layout/recipient_bottom_sheet.xml +++ b/app/src/main/res/layout/recipient_bottom_sheet.xml @@ -74,22 +74,6 @@ app:layout_constraintTop_toBottomOf="@id/rbs_full_name" tools:text="🕷🕷🕷Hangin' on the web🕷🕷" /> - - You can swipe to the left on any message to quickly reply View-once media is deleted after sending You already viewed this message - You can add notes for yourself in this chat.\nIf your account has any linked devices, new notes will be synced. + You can add notes for yourself in this chat. If your account has any linked devices, new notes will be synced. %1$d group members have the same name. Tap to review Review requests carefully