That fuck shit the fascists are using
at master 224 lines 8.1 kB view raw
1package org.tm.archive.conversation; 2 3import android.content.Context; 4import android.graphics.drawable.Drawable; 5import android.os.Bundle; 6import android.os.Parcelable; 7import android.text.TextUtils; 8import android.util.AttributeSet; 9import android.view.View; 10import android.widget.ImageView; 11import android.widget.TextView; 12 13import androidx.annotation.NonNull; 14import androidx.annotation.Nullable; 15import androidx.constraintlayout.widget.ConstraintLayout; 16import androidx.core.content.ContextCompat; 17 18import com.annimon.stream.Collectors; 19import com.annimon.stream.Stream; 20import com.bumptech.glide.RequestManager; 21 22import org.tm.archive.R; 23import org.tm.archive.avatar.view.AvatarView; 24import org.tm.archive.badges.BadgeImageView; 25import org.tm.archive.database.model.StoryViewState; 26import org.tm.archive.recipients.Recipient; 27import org.tm.archive.util.ContextUtil; 28import org.tm.archive.util.DrawableUtil; 29import org.tm.archive.util.ExpirationUtil; 30import org.tm.archive.util.ViewUtil; 31 32public class ConversationTitleView extends ConstraintLayout { 33 34 private static final String STATE_ROOT = "root"; 35 private static final String STATE_IS_SELF = "is_self"; 36 37 private AvatarView avatar; 38 private BadgeImageView badge; 39 private TextView title; 40 private TextView subtitle; 41 private ImageView verified; 42 private View subtitleContainer; 43 private View verifiedSubtitle; 44 private View expirationBadgeContainer; 45 private TextView expirationBadgeTime; 46 private boolean isSelf; 47 48 public ConversationTitleView(Context context) { 49 this(context, null); 50 } 51 52 public ConversationTitleView(Context context, AttributeSet attrs) { 53 super(context, attrs); 54 } 55 56 @Override 57 public void onFinishInflate() { 58 super.onFinishInflate(); 59 60 this.title = findViewById(R.id.title); 61 this.badge = findViewById(R.id.badge); 62 this.subtitle = findViewById(R.id.subtitle); 63 this.verified = findViewById(R.id.verified_indicator); 64 this.subtitleContainer = findViewById(R.id.subtitle_container); 65 this.verifiedSubtitle = findViewById(R.id.verified_subtitle); 66 this.avatar = findViewById(R.id.contact_photo_image); 67 this.expirationBadgeContainer = findViewById(R.id.expiration_badge_container); 68 this.expirationBadgeTime = findViewById(R.id.expiration_badge); 69 70 ViewUtil.setTextViewGravityStart(this.title, getContext()); 71 ViewUtil.setTextViewGravityStart(this.subtitle, getContext()); 72 } 73 74 @Override 75 protected @NonNull Parcelable onSaveInstanceState() { 76 Bundle bundle = new Bundle(); 77 78 bundle.putParcelable(STATE_ROOT, super.onSaveInstanceState()); 79 bundle.putBoolean(STATE_IS_SELF, isSelf); 80 81 return bundle; 82 } 83 84 @Override 85 protected void onRestoreInstanceState(Parcelable state) { 86 if (state instanceof Bundle) { 87 Parcelable rootState = ((Bundle) state).getParcelable(STATE_ROOT); 88 super.onRestoreInstanceState(rootState); 89 90 isSelf = ((Bundle) state).getBoolean(STATE_IS_SELF, false); 91 } else { 92 super.onRestoreInstanceState(state); 93 } 94 } 95 96 public void showExpiring(@NonNull Recipient recipient) { 97 isSelf = recipient.isSelf(); 98 99 expirationBadgeTime.setText(ExpirationUtil.getExpirationAbbreviatedDisplayValue(getContext(), recipient.getExpiresInSeconds())); 100 expirationBadgeContainer.setVisibility(View.VISIBLE); 101 updateSubtitleVisibility(); 102 } 103 104 public void clearExpiring() { 105 expirationBadgeContainer.setVisibility(View.GONE); 106 updateSubtitleVisibility(); 107 } 108 109 public void setTitle(@NonNull RequestManager requestManager, @Nullable Recipient recipient) { 110 isSelf = recipient != null && recipient.isSelf(); 111 112 this.subtitleContainer.setVisibility(View.VISIBLE); 113 114 if (recipient == null) setComposeTitle(); 115 else setRecipientTitle(recipient); 116 117 Drawable startDrawable = null; 118 Drawable endDrawable = null; 119 120 if (recipient != null && recipient.isBlocked()) { 121 startDrawable = ContextUtil.requireDrawable(getContext(), R.drawable.symbol_block_16); 122 startDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); 123 } else if (recipient != null && recipient.isMuted()) { 124 startDrawable = ContextUtil.requireDrawable(getContext(), R.drawable.ic_bell_disabled_16); 125 startDrawable.setBounds(0, 0, ViewUtil.dpToPx(18), ViewUtil.dpToPx(18)); 126 } 127 128 if (recipient != null && recipient.isSystemContact() && !recipient.isSelf()) { 129 endDrawable = ContextCompat.getDrawable(getContext(), R.drawable.ic_profile_circle_outline_16); 130 } 131 132 if (startDrawable != null) { 133 startDrawable = DrawableUtil.tint(startDrawable, ContextCompat.getColor(getContext(), R.color.signal_inverse_transparent_80)); 134 } 135 136 if (endDrawable != null) { 137 endDrawable = DrawableUtil.tint(endDrawable, ContextCompat.getColor(getContext(), R.color.signal_inverse_transparent_80)); 138 } 139 140 if (recipient != null && recipient.showVerified()) { 141 endDrawable = ContextUtil.requireDrawable(getContext(), R.drawable.ic_official_24); 142 } 143 144 title.setCompoundDrawablesRelativeWithIntrinsicBounds(startDrawable, null, endDrawable, null); 145 146 if (recipient != null) { 147 this.avatar.displayChatAvatar(requestManager, recipient, false); 148 } 149 150 if (recipient == null || recipient.isSelf()) { 151 badge.setBadgeFromRecipient(null); 152 } else { 153 badge.setBadgeFromRecipient(recipient); 154 } 155 156 updateVerifiedSubtitleVisibility(); 157 } 158 159 public void setStoryRingFromState(@NonNull StoryViewState storyViewState) { 160 avatar.setStoryRingFromState(storyViewState); 161 } 162 163 public void setOnStoryRingClickListener(@NonNull OnClickListener onStoryRingClickListener) { 164 avatar.setOnClickListener(v -> { 165 if (avatar.hasStory()) { 166 onStoryRingClickListener.onClick(v); 167 } else { 168 performClick(); 169 } 170 }); 171 } 172 173 public void setVerified(boolean verified) { 174 this.verified.setVisibility(verified ? View.VISIBLE : View.GONE); 175 176 updateVerifiedSubtitleVisibility(); 177 } 178 179 private void setComposeTitle() { 180 this.title.setText(R.string.ConversationActivity_compose_message); 181 this.subtitle.setText(null); 182 updateSubtitleVisibility(); 183 } 184 185 private void setRecipientTitle(@NonNull Recipient recipient) { 186 if (recipient.isGroup()) setGroupRecipientTitle(recipient); 187 else if (recipient.isSelf()) setSelfTitle(); 188 else setIndividualRecipientTitle(recipient); 189 } 190 191 private void setGroupRecipientTitle(@NonNull Recipient recipient) { 192 this.title.setText(recipient.getDisplayName(getContext())); 193 this.subtitle.setText(Stream.of(recipient.getParticipantIds()) 194 .limit(10) 195 .map(Recipient::resolved) 196 .sorted((a, b) -> Boolean.compare(a.isSelf(), b.isSelf())) 197 .map(r -> r.isSelf() ? getResources().getString(R.string.ConversationTitleView_you) 198 : r.getDisplayName(getContext())) 199 .collect(Collectors.joining(", "))); 200 201 updateSubtitleVisibility(); 202 } 203 204 private void setSelfTitle() { 205 this.title.setText(R.string.note_to_self); 206 updateSubtitleVisibility(); 207 } 208 209 private void setIndividualRecipientTitle(@NonNull Recipient recipient) { 210 final String displayName = recipient.getDisplayName(getContext()); 211 this.title.setText(displayName); 212 this.subtitle.setText(null); 213 updateSubtitleVisibility(); 214 } 215 216 private void updateVerifiedSubtitleVisibility() { 217 verifiedSubtitle.setVisibility(!isSelf && subtitle.getVisibility() != VISIBLE && verified.getVisibility() == VISIBLE ? VISIBLE : GONE); 218 } 219 220 private void updateSubtitleVisibility() { 221 subtitle.setVisibility(!isSelf && expirationBadgeContainer.getVisibility() != VISIBLE && !TextUtils.isEmpty(subtitle.getText()) ? VISIBLE : GONE); 222 updateVerifiedSubtitleVisibility(); 223 } 224}