That fuck shit the fascists are using
at master 304 lines 9.8 kB view raw
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}