That fuck shit the fascists are using
1package org.tm.archive.mediaoverview;
2
3import android.Manifest;
4import android.content.Context;
5import android.content.res.Resources;
6import android.widget.Toast;
7
8import androidx.annotation.NonNull;
9import androidx.annotation.Nullable;
10import androidx.fragment.app.Fragment;
11
12import com.google.android.material.dialog.MaterialAlertDialogBuilder;
13
14import org.tm.archive.R;
15import org.tm.archive.database.MediaTable;
16import org.tm.archive.permissions.Permissions;
17import org.tm.archive.util.AttachmentUtil;
18import org.tm.archive.util.SaveAttachmentTask;
19import org.tm.archive.util.StorageUtil;
20import org.tm.archive.util.task.ProgressDialogAsyncTask;
21
22import java.util.Collection;
23import java.util.LinkedList;
24import java.util.List;
25
26final class MediaActions {
27
28 private MediaActions() {
29 }
30
31 static void handleSaveMedia(@NonNull Fragment fragment,
32 @NonNull Collection<MediaTable.MediaRecord> mediaRecords,
33 @Nullable Runnable postExecute)
34 {
35 Context context = fragment.requireContext();
36
37 if (StorageUtil.canWriteToMediaStore()) {
38 performSaveToDisk(context, mediaRecords, postExecute);
39 return;
40 }
41
42 SaveAttachmentTask.showWarningDialog(context, (dialogInterface, which) -> Permissions.with(fragment)
43 .request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
44 .ifNecessary()
45 .withPermanentDenialDialog(fragment.getString(R.string.MediaPreviewActivity_signal_needs_the_storage_permission_in_order_to_write_to_external_storage_but_it_has_been_permanently_denied))
46 .onAnyDenied(() -> Toast.makeText(context, R.string.MediaPreviewActivity_unable_to_write_to_external_storage_without_permission, Toast.LENGTH_LONG).show())
47 .onAllGranted(() -> performSaveToDisk(context, mediaRecords, postExecute))
48 .execute(), mediaRecords.size());
49 }
50
51 static void handleDeleteMedia(@NonNull Context context,
52 @NonNull Collection<MediaTable.MediaRecord> mediaRecords)
53 {
54 int recordCount = mediaRecords.size();
55 Resources res = context.getResources();
56 String confirmTitle = res.getQuantityString(R.plurals.MediaOverviewActivity_Media_delete_confirm_title,
57 recordCount,
58 recordCount);
59 String confirmMessage = res.getQuantityString(R.plurals.MediaOverviewActivity_Media_delete_confirm_message,
60 recordCount,
61 recordCount);
62
63 MaterialAlertDialogBuilder builder = new MaterialAlertDialogBuilder(context).setTitle(confirmTitle)
64 .setMessage(confirmMessage)
65 .setCancelable(true);
66
67 builder.setPositiveButton(R.string.delete, (dialogInterface, i) ->
68 new ProgressDialogAsyncTask<MediaTable.MediaRecord, Void, Void>(context,
69 R.string.MediaOverviewActivity_Media_delete_progress_title,
70 R.string.MediaOverviewActivity_Media_delete_progress_message)
71 {
72 @Override
73 protected Void doInBackground(MediaTable.MediaRecord... records) {
74 if (records == null || records.length == 0) {
75 return null;
76 }
77
78 for (MediaTable.MediaRecord record : records) {
79 AttachmentUtil.deleteAttachment(context, record.getAttachment());
80 }
81 return null;
82 }
83
84 }.execute(mediaRecords.toArray(new MediaTable.MediaRecord[0]))
85 );
86 builder.setNegativeButton(android.R.string.cancel, null);
87 builder.show();
88 }
89
90 private static void performSaveToDisk(@NonNull Context context, @NonNull Collection<MediaTable.MediaRecord> mediaRecords, @Nullable Runnable postExecute) {
91 new ProgressDialogAsyncTask<Void, Void, List<SaveAttachmentTask.Attachment>>(context,
92 R.string.MediaOverviewActivity_collecting_attachments,
93 R.string.please_wait)
94 {
95 @Override
96 protected List<SaveAttachmentTask.Attachment> doInBackground(Void... params) {
97 List<SaveAttachmentTask.Attachment> attachments = new LinkedList<>();
98
99 for (MediaTable.MediaRecord mediaRecord : mediaRecords) {
100 if (mediaRecord.getAttachment().getUri() != null) {
101 attachments.add(new SaveAttachmentTask.Attachment(mediaRecord.getAttachment().getUri(),
102 mediaRecord.getContentType(),
103 mediaRecord.getDate(),
104 mediaRecord.getAttachment().fileName));
105 }
106 }
107
108 return attachments;
109 }
110
111 @Override
112 protected void onPostExecute(List<SaveAttachmentTask.Attachment> attachments) {
113 super.onPostExecute(attachments);
114 SaveAttachmentTask saveTask = new SaveAttachmentTask(context, attachments.size());
115 saveTask.executeOnExecutor(THREAD_POOL_EXECUTOR,
116 attachments.toArray(new SaveAttachmentTask.Attachment[0]));
117
118 if (postExecute != null) postExecute.run();
119 }
120 }.execute();
121 }
122}