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