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