That fuck shit the fascists are using
1/*
2 * Copyright 2023 Signal Messenger, LLC
3 * SPDX-License-Identifier: AGPL-3.0-only
4 */
5
6package org.tm.archive.components;
7
8import android.content.Context;
9import android.util.AttributeSet;
10import android.view.ViewGroup;
11import android.widget.FrameLayout;
12import android.widget.TextView;
13
14import androidx.annotation.ColorInt;
15import androidx.annotation.IdRes;
16import androidx.annotation.NonNull;
17import androidx.annotation.Nullable;
18
19import com.bumptech.glide.RequestManager;
20
21import org.tm.archive.R;
22import org.tm.archive.components.transfercontrols.TransferControlView;
23import org.tm.archive.mms.Slide;
24import org.tm.archive.mms.SlideClickListener;
25import org.tm.archive.mms.SlidesClickedListener;
26import org.tm.archive.util.MediaUtil;
27import org.tm.archive.util.views.Stub;
28
29import java.util.List;
30
31public class AlbumThumbnailView extends FrameLayout {
32
33 private @Nullable SlideClickListener thumbnailClickListener;
34 private @Nullable SlidesClickedListener startTransferClickListener;
35 private @Nullable SlidesClickedListener cancelTransferClickListener;
36 private @Nullable SlideClickListener playVideoClickListener;
37
38 private int currentSizeClass;
39
40 private final int[] corners = new int[4];
41
42 private final ViewGroup albumCellContainer;
43 private final Stub<TransferControlView> transferControlsStub;
44
45 private final SlideClickListener defaultThumbnailClickListener = (v, slide) -> {
46 if (thumbnailClickListener != null) {
47 thumbnailClickListener.onClick(v, slide);
48 }
49 };
50
51 private final OnLongClickListener defaultLongClickListener = v -> this.performLongClick();
52
53 public AlbumThumbnailView(@NonNull Context context) {
54 super(context);
55 inflate(getContext(), R.layout.album_thumbnail_view, this);
56
57 albumCellContainer = findViewById(R.id.album_cell_container);
58 transferControlsStub = new Stub<>(findViewById(R.id.album_transfer_controls_stub));
59 }
60
61 public AlbumThumbnailView(@NonNull Context context, @Nullable AttributeSet attrs) {
62 super(context, attrs);
63 inflate(getContext(), R.layout.album_thumbnail_view, this);
64
65 albumCellContainer = findViewById(R.id.album_cell_container);
66 transferControlsStub = new Stub<>(findViewById(R.id.album_transfer_controls_stub));
67 }
68
69 public void setSlides(@NonNull RequestManager requestManager, @NonNull List<Slide> slides, boolean showControls) {
70 if (slides.size() < 2) {
71 throw new IllegalStateException("Provided less than two slides.");
72 }
73
74 if (showControls) {
75 transferControlsStub.get().setShowSecondaryText(true);
76 transferControlsStub.get().setTransferClickListener(
77 v -> {
78 if (startTransferClickListener != null) {
79 startTransferClickListener.onClick(v, slides);
80 }
81 });
82 transferControlsStub.get().setCancelClickListener(
83 v -> {
84 if (cancelTransferClickListener != null) {
85 cancelTransferClickListener.onClick(v, slides);
86 }
87 });
88 transferControlsStub.get().setSlides(slides);
89 } else {
90 if (transferControlsStub.resolved()) {
91 transferControlsStub.get().setVisibility(GONE);
92 }
93 }
94
95 int sizeClass = sizeClass(slides.size());
96
97 if (sizeClass != currentSizeClass) {
98 inflateLayout(sizeClass);
99 currentSizeClass = sizeClass;
100 }
101
102 showSlides(requestManager, slides);
103 applyCorners();
104 forceLayout();
105 }
106
107 public void setCellBackgroundColor(@ColorInt int color) {
108 ViewGroup cellRoot = findViewById(R.id.album_thumbnail_root);
109
110 if (cellRoot != null) {
111 for (int i = 0; i < cellRoot.getChildCount(); i++) {
112 cellRoot.getChildAt(i).setBackgroundColor(color);
113 }
114 }
115 }
116
117 public void setThumbnailClickListener(@Nullable SlideClickListener listener) {
118 thumbnailClickListener = listener;
119 }
120
121 public void setStartTransferClickListener(SlidesClickedListener listener) {
122 this.startTransferClickListener = listener;
123 }
124
125 public void setCancelTransferClickListener(SlidesClickedListener listener) {
126 this.cancelTransferClickListener = listener;
127 }
128
129 public void setPlayVideoClickListener(SlideClickListener listener) {
130 this.playVideoClickListener = listener;
131 }
132
133
134 public void setRadii(int topLeft, int topRight, int bottomRight, int bottomLeft) {
135 corners[0] = topLeft;
136 corners[1] = topRight;
137 corners[2] = bottomRight;
138 corners[3] = bottomLeft;
139
140 applyCorners();
141 }
142
143 private void inflateLayout(int sizeClass) {
144 albumCellContainer.removeAllViews();
145
146 int resId;
147 switch (sizeClass) {
148 case 2:
149 resId = R.layout.album_thumbnail_2;
150 break;
151 case 3:
152 resId = R.layout.album_thumbnail_3;
153 break;
154 case 4:
155 resId = R.layout.album_thumbnail_4;
156 break;
157 case 5:
158 resId = R.layout.album_thumbnail_5;
159 break;
160 default:
161 resId = R.layout.album_thumbnail_many;
162 break;
163 }
164
165 inflate(getContext(), resId, albumCellContainer);
166 if (transferControlsStub.resolved()) {
167 int size;
168 switch (sizeClass) {
169 case 2:
170 size = R.dimen.album_2_total_height;
171 break;
172 case 3:
173 size = R.dimen.album_3_total_height;
174 break;
175 case 4:
176 size = R.dimen.album_4_total_height;
177 break;
178 default:
179 size = R.dimen.album_5_total_height;
180 break;
181 }
182 ViewGroup.LayoutParams params = transferControlsStub.get().getLayoutParams();
183 params.height = getContext().getResources().getDimensionPixelSize(size);
184 transferControlsStub.get().setLayoutParams(params);
185 }
186 }
187
188 private void applyCorners() {
189 if (currentSizeClass < 2) {
190 return;
191 }
192
193 switch (currentSizeClass) {
194 case 2:
195 applyCornersForSizeClass2();
196 break;
197 case 3:
198 applyCornersForSizeClass3();
199 break;
200 case 4:
201 applyCornersForSizeClass4();
202 break;
203 case 5:
204 applyCornersForSizeClass5();
205 break;
206 default:
207 applyCornersForManySizeClass();
208 }
209 }
210
211 private ThumbnailView[] getCells() {
212 ThumbnailView one = findViewById(R.id.album_cell_1);
213 ThumbnailView two = findViewById(R.id.album_cell_2);
214 ThumbnailView three = findViewById(R.id.album_cell_3);
215 ThumbnailView four = findViewById(R.id.album_cell_4);
216 ThumbnailView five = findViewById(R.id.album_cell_5);
217
218 return new ThumbnailView[] { one, two, three, four, five };
219 }
220
221 private void applyCornersForSizeClass2() {
222 ThumbnailView[] cells = getCells();
223 setRelativeRadii(cells[0], corners[0], 0, 0, corners[3]);
224 setRelativeRadii(cells[1], 0, corners[1], corners[2], 0);
225 }
226
227 private void applyCornersForSizeClass3() {
228 ThumbnailView[] cells = getCells();
229 setRelativeRadii(cells[0], corners[0], 0, 0, corners[3]);
230 setRelativeRadii(cells[1], 0, corners[1], 0, 0);
231 setRelativeRadii(cells[2], 0, 0, corners[2], 0);
232 }
233
234 private void applyCornersForSizeClass4() {
235 ThumbnailView[] cells = getCells();
236 setRelativeRadii(cells[0], corners[0], 0, 0, 0);
237 setRelativeRadii(cells[1], 0, corners[1], 0, 0);
238 setRelativeRadii(cells[2], 0, 0, 0, corners[3]);
239 setRelativeRadii(cells[3], 0, 0, corners[2], 0);
240 }
241
242 private void applyCornersForSizeClass5() {
243 ThumbnailView[] cells = getCells();
244 setRelativeRadii(cells[0], corners[0], 0, 0, 0);
245 setRelativeRadii(cells[1], 0, corners[1], 0, 0);
246 setRelativeRadii(cells[2], 0, 0, 0, corners[3]);
247 setRelativeRadii(cells[3], 0, 0, 0, 0);
248 setRelativeRadii(cells[4], 0, 0, corners[2], 0);
249 }
250
251 private void setRelativeRadii(@NonNull ThumbnailView cell, int topLeft, int topRight, int bottomRight, int bottomLeft) {
252 boolean isLTR = getRootView().getLayoutDirection() == LAYOUT_DIRECTION_LTR;
253 cell.setRadii(
254 isLTR ? topLeft : topRight,
255 isLTR ? topRight : topLeft,
256 isLTR ? bottomRight : bottomLeft,
257 isLTR ? bottomLeft : bottomRight
258 );
259 }
260
261 private void applyCornersForManySizeClass() {
262 applyCornersForSizeClass5();
263 }
264
265 private void showSlides(@NonNull RequestManager requestManager, @NonNull List<Slide> slides) {
266 boolean showControls = TransferControlView.containsPlayableSlides(slides);
267 setSlide(requestManager, slides.get(0), R.id.album_cell_1, showControls);
268 setSlide(requestManager, slides.get(1), R.id.album_cell_2, showControls);
269
270 if (slides.size() >= 3) {
271 setSlide(requestManager, slides.get(2), R.id.album_cell_3, showControls);
272 }
273
274 if (slides.size() >= 4) {
275 setSlide(requestManager, slides.get(3), R.id.album_cell_4, showControls);
276 }
277
278 if (slides.size() >= 5) {
279 setSlide(requestManager, slides.get(4), R.id.album_cell_5, showControls && slides.size() == 5);
280 }
281
282 if (slides.size() > 5) {
283 TextView text = findViewById(R.id.album_cell_overflow_text);
284 text.setText(getContext().getString(R.string.AlbumThumbnailView_plus, slides.size() - 5));
285 }
286 }
287
288 private void setSlide(@NonNull RequestManager requestManager, @NonNull Slide slide, @IdRes int id, boolean showControls) {
289 ThumbnailView cell = findViewById(id);
290 cell.showSecondaryText(false);
291 cell.setThumbnailClickListener(defaultThumbnailClickListener);
292 cell.setStartTransferClickListener(startTransferClickListener);
293 cell.setCancelTransferClickListener(cancelTransferClickListener);
294 if (MediaUtil.isInstantVideoSupported(slide)) {
295 cell.setPlayVideoClickListener(playVideoClickListener);
296 }
297 cell.setOnLongClickListener(defaultLongClickListener);
298 cell.setImageResource(requestManager, slide, showControls, false);
299 }
300
301 private int sizeClass(int size) {
302 return Math.min(size, 6);
303 }
304}