add context menu to MediaBrowser to

* share
* open
* delete
This commit is contained in:
Christian Schneppe 2020-02-18 21:19:22 +01:00
parent ad9f8fde90
commit 6dff9bc8a9
No known key found for this signature in database
GPG key ID: F30B8D686B44D87E
4 changed files with 140 additions and 15 deletions

View file

@ -38,6 +38,15 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded
private String account;
private String jid;
@Override
protected void onStart() {
super.onStart();
getPreferences().edit().putBoolean("show_videos_images_only", OnlyImagesVideos).apply();
filter(OnlyImagesVideos);
invalidateOptionsMenu();
refreshUiReal();
}
public static void launch(Context context, Contact contact) {
launch(context, contact.getAccount(), contact.getJid().asBareJid().toEscapedString());
}
@ -79,7 +88,7 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded
}
@Override
protected void refreshUiReal() {
public void refreshUiReal() {
mMediaAdapter.notifyDataSetChanged();
}
@ -145,19 +154,18 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded
@Override
public void onMediaLoaded(List<Attachment> attachments) {
allAttachments.clear();
allAttachments.addAll(attachments);
runOnUiThread(() -> {
if (OnlyImagesVideos) {
filter(OnlyImagesVideos);
} else {
loadAttachments(allAttachments);
}
filter(OnlyImagesVideos);
});
}
private void loadAttachments(List<Attachment> attachments) {
if (attachments.size() > 0) {
mMediaAdapter.setAttachments(attachments);
if (mMediaAdapter.getItemCount() != attachments.size()) {
mMediaAdapter.setAttachments(attachments);
}
this.binding.noMedia.setVisibility(View.GONE);
this.binding.progressbar.setVisibility(View.GONE);
} else {
@ -172,20 +180,26 @@ public class MediaBrowserActivity extends XmppActivity implements OnMediaLoaded
}
}
@Override
public void onResume() {
super.onResume();
filter(OnlyImagesVideos);
}
protected void filterAttachments(boolean needle) {
if (allAttachments.size() > 0) {
final ArrayList<Attachment> attachments = new ArrayList<>(allAttachments);
filteredAttachments.clear();
if (needle) {
final ArrayList<Attachment> attachments = new ArrayList<>(allAttachments);
filteredAttachments.clear();
for (Attachment attachment : attachments) {
if (attachment.getMime() != null && (attachment.getMime().startsWith("image/") || attachment.getMime().startsWith("video/"))) {
filteredAttachments.add(attachment);
}
}
loadAttachments(filteredAttachments);
} else {
filteredAttachments.addAll(allAttachments);
loadAttachments(allAttachments);
}
loadAttachments(filteredAttachments);
}
}
}

View file

@ -111,6 +111,7 @@ public abstract class XmppActivity extends ActionBarActivity {
public static final String EXTRA_ACCOUNT = "account";
public XmppConnectionService xmppConnectionService;
public MediaBrowserActivity mediaBrowserActivity;
public boolean xmppConnectionServiceBound = false;
protected int mColorWarningButton;

View file

@ -1,34 +1,49 @@
package de.pixart.messenger.ui.adapter;
import android.content.ActivityNotFoundException;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.AsyncTask;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.Toast;
import androidx.annotation.AttrRes;
import androidx.annotation.DimenRes;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.widget.PopupMenu;
import androidx.databinding.DataBindingUtil;
import androidx.recyclerview.widget.RecyclerView;
import java.io.File;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.RejectedExecutionException;
import de.pixart.messenger.Config;
import de.pixart.messenger.R;
import de.pixart.messenger.databinding.MediaBinding;
import de.pixart.messenger.persistance.FileBackend;
import de.pixart.messenger.services.ExportBackupService;
import de.pixart.messenger.ui.XmppActivity;
import de.pixart.messenger.ui.util.Attachment;
import de.pixart.messenger.ui.util.StyledAttributes;
import de.pixart.messenger.ui.util.ViewUtil;
import de.pixart.messenger.utils.MimeUtils;
import me.drakeet.support.toast.ToastCompat;
public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHolder> {
@ -140,9 +155,105 @@ public class MediaAdapter extends RecyclerView.Adapter<MediaAdapter.MediaViewHol
loadPreview(attachment, holder.binding.media);
} else {
cancelPotentialWork(attachment, holder.binding.media);
renderPreview(activity, attachment, holder.binding.media);
renderPreview(this.activity, attachment, holder.binding.media);
}
holder.binding.getRoot().setOnClickListener(v -> ViewUtil.view(activity, attachment));
holder.binding.getRoot().setOnClickListener(v -> ViewUtil.view(this.activity, attachment));
holder.binding.getRoot().setOnLongClickListener(v -> {
setSelection(v);
final PopupMenu popupMenu = new PopupMenu(this.activity, v);
popupMenu.inflate(R.menu.media_viewer);
popupMenu.getMenu().findItem(R.id.action_delete).setVisible(isDeletableFile(new File(attachment.getUri().getPath())));
popupMenu.setOnMenuItemClickListener(item -> {
switch (item.getItemId()) {
case R.id.action_share:
share(attachment);
return true;
case R.id.action_open:
open(attachment);
return true;
case R.id.action_delete:
deleteFile(attachment);
return true;
}
return false;
});
popupMenu.setOnDismissListener(menu -> resetSelection(v));
popupMenu.show();
return true;
});
}
private void setSelection(final View v) {
v.setBackgroundColor(StyledAttributes.getColor(this.activity, R.attr.colorAccent));
}
private void resetSelection(final View v) {
v.setBackgroundColor(0);
}
private void share(final Attachment attachment) {
final Intent share = new Intent(Intent.ACTION_SEND);
final File file = new File(attachment.getUri().getPath());
share.setType(attachment.getMime());
share.putExtra(Intent.EXTRA_STREAM, FileBackend.getUriForFile(this.activity, file));
try {
this.activity.startActivity(Intent.createChooser(share, this.activity.getText(R.string.share_with)));
} catch (ActivityNotFoundException e) {
//This should happen only on faulty androids because normally chooser is always available
ToastCompat.makeText(this.activity, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show();
}
}
private void deleteFile(final Attachment attachment) {
final File file = new File(attachment.getUri().getPath());
final int hash = attachment.hashCode();
final AlertDialog.Builder builder = new AlertDialog.Builder(this.activity);
builder.setNegativeButton(R.string.cancel, null);
builder.setTitle(R.string.delete_file_dialog);
builder.setMessage(R.string.delete_file_dialog_msg);
builder.setPositiveButton(R.string.confirm, (dialog, which) -> {
if (activity.xmppConnectionService.getFileBackend().deleteFile(file)) {
for (int i = 0; i < attachments.size(); i++) {
if (hash == attachments.get(i).hashCode()) {
attachments.remove(i);
notifyDataSetChanged();
this.activity.refreshUi();
return;
}
}
}
});
builder.create().show();
}
private void open(final Attachment attachment) {
final File file = new File(attachment.getUri().getPath());
final Uri uri;
try {
uri = FileBackend.getUriForFile(this.activity, file);
} catch (SecurityException e) {
Log.d(Config.LOGTAG, "No permission to access " + file.getAbsolutePath(), e);
ToastCompat.makeText(this.activity, this.activity.getString(R.string.no_permission_to_access_x, file.getAbsolutePath()), Toast.LENGTH_SHORT).show();
return;
}
String mime = MimeUtils.guessMimeTypeFromUri(this.activity, uri);
Intent openIntent = new Intent(Intent.ACTION_VIEW);
openIntent.setDataAndType(uri, mime);
openIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
PackageManager manager = this.activity.getPackageManager();
List<ResolveInfo> info = manager.queryIntentActivities(openIntent, 0);
if (info.size() == 0) {
openIntent.setDataAndType(uri, "*/*");
}
try {
this.activity.startActivity(openIntent);
} catch (ActivityNotFoundException e) {
ToastCompat.makeText(this.activity, R.string.no_application_found_to_open_file, Toast.LENGTH_SHORT).show();
}
}
private boolean isDeletableFile(File file) {
return (file == null || !file.toString().startsWith("/") || file.toString().contains(FileBackend.getConversationsDirectory("null")));
}
public void setAttachments(List<Attachment> attachments) {

View file

@ -14,6 +14,5 @@
android:id="@+id/action_delete"
android:icon="@drawable/ic_delete_white_24dp"
android:orderInCategory="20"
android:title="@string/action_delete"
android:visible="false" />
android:title="@string/action_delete" />
</menu>