mirror of
https://github.com/oxen-io/session-android.git
synced 2024-11-23 18:15:22 +00:00
Allow batch saving in media overview
This commit is contained in:
parent
c82afd8944
commit
91a119393c
@ -1,5 +1,10 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
|
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||||
|
<item android:id="@+id/save"
|
||||||
|
android:title="@string/save"
|
||||||
|
android:icon="@drawable/ic_save_white_24dp"
|
||||||
|
app:showAsAction="always"/>
|
||||||
|
|
||||||
<item android:id="@+id/delete"
|
<item android:id="@+id/delete"
|
||||||
android:title="@string/delete"
|
android:title="@string/delete"
|
||||||
android:icon="@drawable/ic_delete_white_24dp"
|
android:icon="@drawable/ic_delete_white_24dp"
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
<string name="no">No</string>
|
<string name="no">No</string>
|
||||||
<string name="delete">Delete</string>
|
<string name="delete">Delete</string>
|
||||||
<string name="please_wait">Please wait...</string>
|
<string name="please_wait">Please wait...</string>
|
||||||
|
<string name="save">Save</string>
|
||||||
|
|
||||||
<!-- AbstractNotificationBuilder -->
|
<!-- AbstractNotificationBuilder -->
|
||||||
<string name="AbstractNotificationBuilder_new_message">New message</string>
|
<string name="AbstractNotificationBuilder_new_message">New message</string>
|
||||||
@ -395,6 +396,7 @@
|
|||||||
<string name="MediaOverviewActivity_Media_delete_progress_message">Deleting messages...</string>
|
<string name="MediaOverviewActivity_Media_delete_progress_message">Deleting messages...</string>
|
||||||
<string name="MediaOverviewActivity_Documents">Documents</string>
|
<string name="MediaOverviewActivity_Documents">Documents</string>
|
||||||
<string name="MediaOverviewActivity_Select_all">Select all</string>
|
<string name="MediaOverviewActivity_Select_all">Select all</string>
|
||||||
|
<string name="MediaOverviewActivity_collecting_attachments">Collecting attachments...</string>
|
||||||
|
|
||||||
<!--- NotificationBarManager -->
|
<!--- NotificationBarManager -->
|
||||||
<string name="NotificationBarManager_signal_call_in_progress">Signal call in progress</string>
|
<string name="NotificationBarManager_signal_call_in_progress">Signal call in progress</string>
|
||||||
|
@ -16,6 +16,7 @@
|
|||||||
*/
|
*/
|
||||||
package org.thoughtcrime.securesms;
|
package org.thoughtcrime.securesms;
|
||||||
|
|
||||||
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@ -46,6 +47,7 @@ import android.view.View;
|
|||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
import android.view.Window;
|
import android.view.Window;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
|
import android.widget.Toast;
|
||||||
|
|
||||||
import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager;
|
import com.codewaves.stickyheadergrid.StickyHeaderGridLayoutManager;
|
||||||
|
|
||||||
@ -56,16 +58,20 @@ import org.thoughtcrime.securesms.database.loaders.BucketedThreadMediaLoader;
|
|||||||
import org.thoughtcrime.securesms.database.loaders.BucketedThreadMediaLoader.BucketedThreadMedia;
|
import org.thoughtcrime.securesms.database.loaders.BucketedThreadMediaLoader.BucketedThreadMedia;
|
||||||
import org.thoughtcrime.securesms.database.loaders.ThreadMediaLoader;
|
import org.thoughtcrime.securesms.database.loaders.ThreadMediaLoader;
|
||||||
import org.thoughtcrime.securesms.mms.GlideApp;
|
import org.thoughtcrime.securesms.mms.GlideApp;
|
||||||
|
import org.thoughtcrime.securesms.permissions.Permissions;
|
||||||
import org.thoughtcrime.securesms.recipients.Recipient;
|
import org.thoughtcrime.securesms.recipients.Recipient;
|
||||||
import org.thoughtcrime.securesms.util.AttachmentUtil;
|
import org.thoughtcrime.securesms.util.AttachmentUtil;
|
||||||
import org.thoughtcrime.securesms.util.DynamicLanguage;
|
import org.thoughtcrime.securesms.util.DynamicLanguage;
|
||||||
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme;
|
||||||
import org.thoughtcrime.securesms.util.DynamicTheme;
|
import org.thoughtcrime.securesms.util.DynamicTheme;
|
||||||
|
import org.thoughtcrime.securesms.util.SaveAttachmentTask;
|
||||||
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
|
import org.thoughtcrime.securesms.util.StickyHeaderDecoration;
|
||||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||||
import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
|
import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.LinkedList;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -317,6 +323,50 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("CodeBlock2Expr")
|
||||||
|
@SuppressLint({"InlinedApi","StaticFieldLeak"})
|
||||||
|
private void handleSaveMedia(@NonNull Collection<MediaDatabase.MediaRecord> mediaRecords) {
|
||||||
|
final Context context = getContext();
|
||||||
|
SaveAttachmentTask.showWarningDialog(context, (dialogInterface, which) -> {
|
||||||
|
Permissions.with(this)
|
||||||
|
.request(android.Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE)
|
||||||
|
.ifNecessary()
|
||||||
|
.withPermanentDenialDialog(getString(R.string.MediaPreviewActivity_signal_needs_the_storage_permission_in_order_to_write_to_external_storage_but_it_has_been_permanently_denied))
|
||||||
|
.onAnyDenied(() -> Toast.makeText(getContext(), R.string.MediaPreviewActivity_unable_to_write_to_external_storage_without_permission, Toast.LENGTH_LONG).show())
|
||||||
|
.onAllGranted(() -> {
|
||||||
|
new ProgressDialogAsyncTask<Void, Void, List<SaveAttachmentTask.Attachment>>(context,
|
||||||
|
R.string.MediaOverviewActivity_collecting_attachments,
|
||||||
|
R.string.please_wait) {
|
||||||
|
@Override
|
||||||
|
protected List<SaveAttachmentTask.Attachment> doInBackground(Void... params) {
|
||||||
|
List<SaveAttachmentTask.Attachment> attachments = new LinkedList<>();
|
||||||
|
|
||||||
|
for (MediaDatabase.MediaRecord mediaRecord : mediaRecords) {
|
||||||
|
if (mediaRecord.getAttachment().getDataUri() != null) {
|
||||||
|
attachments.add(new SaveAttachmentTask.Attachment(mediaRecord.getAttachment().getDataUri(),
|
||||||
|
mediaRecord.getContentType(),
|
||||||
|
mediaRecord.getDate(),
|
||||||
|
mediaRecord.getAttachment().getFileName()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return attachments;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void onPostExecute(List<SaveAttachmentTask.Attachment> attachments) {
|
||||||
|
super.onPostExecute(attachments);
|
||||||
|
SaveAttachmentTask saveTask = new SaveAttachmentTask(context,
|
||||||
|
attachments.size());
|
||||||
|
saveTask.executeOnExecutor(THREAD_POOL_EXECUTOR,
|
||||||
|
attachments.toArray(new SaveAttachmentTask.Attachment[attachments.size()]));
|
||||||
|
}
|
||||||
|
}.execute();
|
||||||
|
})
|
||||||
|
.execute();
|
||||||
|
}, mediaRecords.size());
|
||||||
|
}
|
||||||
|
|
||||||
@SuppressLint("StaticFieldLeak")
|
@SuppressLint("StaticFieldLeak")
|
||||||
private void handleDeleteMedia(@NonNull Collection<MediaDatabase.MediaRecord> mediaRecords) {
|
private void handleDeleteMedia(@NonNull Collection<MediaDatabase.MediaRecord> mediaRecords) {
|
||||||
int recordCount = mediaRecords.size();
|
int recordCount = mediaRecords.size();
|
||||||
@ -402,6 +452,9 @@ public class MediaOverviewActivity extends PassphraseRequiredActionBarActivity {
|
|||||||
@Override
|
@Override
|
||||||
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
|
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
|
||||||
switch (menuItem.getItemId()) {
|
switch (menuItem.getItemId()) {
|
||||||
|
case R.id.save:
|
||||||
|
handleSaveMedia(getListAdapter().getSelectedMedia());
|
||||||
|
return true;
|
||||||
case R.id.delete:
|
case R.id.delete:
|
||||||
handleDeleteMedia(getListAdapter().getSelectedMedia());
|
handleDeleteMedia(getListAdapter().getSelectedMedia());
|
||||||
exitMultiSelect();
|
exitMultiSelect();
|
||||||
|
Loading…
Reference in New Issue
Block a user