Add option to download all media for a toot with one tap. (#1121)

Addresses #966
This commit is contained in:
Levi Bard 2019-03-23 12:49:36 +01:00 committed by Konrad Pozniak
commit 205f3771d4
6 changed files with 113 additions and 32 deletions

View file

@ -15,15 +15,22 @@
package com.keylesspalace.tusky.fragment;
import android.Manifest;
import android.app.DownloadManager;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.text.Spanned;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.keylesspalace.tusky.BaseActivity;
import com.keylesspalace.tusky.BottomSheetActivity;
@ -69,6 +76,7 @@ public abstract class SFragment extends BaseFragment implements Injectable {
protected abstract void onReblog(final boolean reblog, final int position);
private BottomSheetActivity bottomSheetActivity;
private Status pendingDownloadStatus;
@Inject
public MastodonApi mastodonApi;
@ -158,6 +166,8 @@ public abstract class SFragment extends BaseFragment implements Injectable {
// Give a different menu depending on whether this is the user's own toot or not.
if (loggedInAccountId == null || !loggedInAccountId.equals(accountId)) {
popup.inflate(R.menu.status_more);
Menu menu = popup.getMenu();
menu.findItem(R.id.status_download_media).setVisible(!status.getAttachments().isEmpty());
} else {
popup.inflate(R.menu.status_more_for_user);
Menu menu = popup.getMenu();
@ -236,6 +246,10 @@ public abstract class SFragment extends BaseFragment implements Injectable {
showOpenAsDialog(statusUrl, item.getTitle());
return true;
}
case R.id.status_download_media: {
requestDownloadAllMedia(status);
return true;
}
case R.id.status_mute: {
timelineCases.mute(accountId);
return true;
@ -342,4 +356,31 @@ public abstract class SFragment extends BaseFragment implements Injectable {
BaseActivity activity = (BaseActivity)getActivity();
activity.showAccountChooserDialog(dialogTitle, false, account -> openAsAccount(statusUrl, account));
}
private void downloadAllMedia(Status status) {
pendingDownloadStatus = null;
Toast.makeText(getContext(), R.string.downloading_media, Toast.LENGTH_SHORT).show();
for(Attachment attachment: status.getAttachments()) {
String url = attachment.getUrl();
Uri uri = Uri.parse(url);
String filename = uri.getLastPathSegment();
DownloadManager downloadManager = (DownloadManager)getActivity().getSystemService(Context.DOWNLOAD_SERVICE);
DownloadManager.Request request = new DownloadManager.Request(uri);
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, filename);
downloadManager.enqueue(request);
}
}
private void requestDownloadAllMedia(Status status) {
pendingDownloadStatus = status;
String[] permissions = new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE };
((BaseActivity)getActivity()).requestPermissions(permissions, Build.VERSION_CODES.M, (permissions1, grantResults) -> {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
downloadAllMedia(status);
} else {
Toast.makeText(getContext(), R.string.error_media_download_permission, Toast.LENGTH_SHORT).show();
}
});
}
}