That fuck shit the fascists are using
at master 182 lines 6.7 kB view raw
1package org.tm.archive.components; 2 3 4import android.content.Context; 5import android.content.res.TypedArray; 6import android.graphics.Color; 7import android.graphics.PorterDuff; 8import android.util.AttributeSet; 9import android.view.View; 10import android.view.ViewGroup; 11import android.widget.FrameLayout; 12import android.widget.ImageView; 13import android.widget.TextView; 14 15import androidx.annotation.AttrRes; 16import androidx.annotation.NonNull; 17import androidx.annotation.Nullable; 18 19import com.pnikosis.materialishprogress.ProgressWheel; 20 21import org.greenrobot.eventbus.Subscribe; 22import org.greenrobot.eventbus.ThreadMode; 23import org.signal.core.util.logging.Log; 24import org.tm.archive.R; 25import org.tm.archive.database.AttachmentTable; 26import org.tm.archive.events.PartProgressEvent; 27import org.tm.archive.mms.Slide; 28import org.tm.archive.mms.SlideClickListener; 29import org.tm.archive.util.Util; 30import org.whispersystems.signalservice.api.util.OptionalUtil; 31 32public class DocumentView extends FrameLayout { 33 34 private static final String TAG = Log.tag(DocumentView.class); 35 36 private final @NonNull AnimatingToggle controlToggle; 37 private final @NonNull ImageView downloadButton; 38 private final @NonNull ProgressWheel downloadProgress; 39 private final @NonNull View container; 40 private final @NonNull ViewGroup iconContainer; 41 private final @NonNull TextView fileName; 42 private final @NonNull TextView fileSize; 43 private final @NonNull TextView document; 44 45 private @Nullable SlideClickListener downloadListener; 46 private @Nullable SlideClickListener viewListener; 47 private @Nullable Slide documentSlide; 48 49 public DocumentView(@NonNull Context context) { 50 this(context, null); 51 } 52 53 public DocumentView(@NonNull Context context, @Nullable AttributeSet attrs) { 54 this(context, attrs, 0); 55 } 56 57 public DocumentView(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) { 58 super(context, attrs, defStyleAttr); 59 inflate(context, R.layout.document_view, this); 60 61 this.container = findViewById(R.id.document_container); 62 this.iconContainer = findViewById(R.id.icon_container); 63 this.controlToggle = findViewById(R.id.control_toggle); 64 this.downloadButton = findViewById(R.id.download); 65 this.downloadProgress = findViewById(R.id.download_progress); 66 this.fileName = findViewById(R.id.file_name); 67 this.fileSize = findViewById(R.id.file_size); 68 this.document = findViewById(R.id.document); 69 70 if (attrs != null) { 71 TypedArray typedArray = getContext().getTheme().obtainStyledAttributes(attrs, R.styleable.DocumentView, 0, 0); 72 int titleColor = typedArray.getInt(R.styleable.DocumentView_doc_titleColor, Color.BLACK); 73 int captionColor = typedArray.getInt(R.styleable.DocumentView_doc_captionColor, Color.BLACK); 74 int downloadTint = typedArray.getInt(R.styleable.DocumentView_doc_downloadButtonTint, Color.WHITE); 75 typedArray.recycle(); 76 77 fileName.setTextColor(titleColor); 78 fileSize.setTextColor(captionColor); 79 downloadButton.setColorFilter(downloadTint, PorterDuff.Mode.MULTIPLY); 80 downloadProgress.setBarColor(downloadTint); 81 } 82 } 83 84 public void setDownloadClickListener(@Nullable SlideClickListener listener) { 85 this.downloadListener = listener; 86 } 87 88 public void setDocumentClickListener(@Nullable SlideClickListener listener) { 89 this.viewListener = listener; 90 } 91 92 public void setDocument(final @NonNull Slide documentSlide, 93 final boolean showControls, 94 final boolean showSingleLineFilename) 95 { 96 if (showControls && documentSlide.isPendingDownload()) { 97 controlToggle.displayQuick(downloadButton); 98 downloadButton.setOnClickListener(new DownloadClickedListener(documentSlide)); 99 if (downloadProgress.isSpinning()) downloadProgress.stopSpinning(); 100 } else if (showControls && documentSlide.getTransferState() == AttachmentTable.TRANSFER_PROGRESS_STARTED) { 101 controlToggle.displayQuick(downloadProgress); 102 downloadProgress.spin(); 103 } else { 104 controlToggle.displayQuick(iconContainer); 105 if (downloadProgress.isSpinning()) downloadProgress.stopSpinning(); 106 } 107 108 this.documentSlide = documentSlide; 109 110 // Android OS filenames are limited to 256 characters, so 111 // we don't need an additional max characters/lines constraint when 112 // [showSingleLineFilename] is false. 113 this.fileName.setSingleLine(showSingleLineFilename); 114 115 this.fileName.setText(OptionalUtil.or(documentSlide.getFileName(), 116 documentSlide.getCaption()) 117 .orElse(getContext().getString(R.string.DocumentView_unnamed_file))); 118 this.fileSize.setText(Util.getPrettyFileSize(documentSlide.getFileSize())); 119 this.document.setText(documentSlide.getFileType(getContext()).orElse("").toLowerCase()); 120 this.setOnClickListener(new OpenClickedListener(documentSlide)); 121 } 122 123 public void setDocument(final @NonNull Slide documentSlide, 124 final boolean showControls) 125 { 126 setDocument(documentSlide, showControls, true); 127 } 128 129 @Override 130 public void setFocusable(boolean focusable) { 131 super.setFocusable(focusable); 132 this.downloadButton.setFocusable(focusable); 133 } 134 135 @Override 136 public void setClickable(boolean clickable) { 137 super.setClickable(clickable); 138 this.downloadButton.setClickable(clickable); 139 } 140 141 @Override 142 public void setEnabled(boolean enabled) { 143 super.setEnabled(enabled); 144 this.downloadButton.setEnabled(enabled); 145 } 146 147 @Subscribe(sticky = true, threadMode = ThreadMode.MAIN) 148 public void onEventAsync(final PartProgressEvent event) { 149 if (documentSlide != null && event.attachment.equals(documentSlide.asAttachment())) { 150 downloadProgress.setInstantProgress(((float) event.progress) / event.total); 151 } 152 } 153 154 private class DownloadClickedListener implements View.OnClickListener { 155 private final @NonNull Slide slide; 156 157 private DownloadClickedListener(@NonNull Slide slide) { 158 this.slide = slide; 159 } 160 161 @Override 162 public void onClick(View v) { 163 if (downloadListener != null) downloadListener.onClick(v, slide); 164 } 165 } 166 167 private class OpenClickedListener implements View.OnClickListener { 168 private final @NonNull Slide slide; 169 170 private OpenClickedListener(@NonNull Slide slide) { 171 this.slide = slide; 172 } 173 174 @Override 175 public void onClick(View v) { 176 if (!slide.isPendingDownload() && !slide.isInProgress() && viewListener != null) { 177 viewListener.onClick(v, slide); 178 } 179 } 180 } 181 182}