That fuck shit the fascists are using
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}