diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 438a85c6..5b49b6bd 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -5,6 +5,7 @@
+
fragments = getSupportFragmentManager().getFragments();
+ if (fragments != null) {
+ for (Fragment fragment : fragments) {
+ fragment.onRequestPermissionsResult(requestCode, permissions, grantResults);
+ }
+ }
+ }
}
\ No newline at end of file
diff --git a/app/src/main/java/com/keylesspalace/tusky/ViewMediaFragment.java b/app/src/main/java/com/keylesspalace/tusky/ViewMediaFragment.java
index 67517a47..fed8cbeb 100644
--- a/app/src/main/java/com/keylesspalace/tusky/ViewMediaFragment.java
+++ b/app/src/main/java/com/keylesspalace/tusky/ViewMediaFragment.java
@@ -15,9 +15,21 @@
package com.keylesspalace.tusky;
+import android.app.AlertDialog;
+import android.app.DownloadManager;
+import android.content.Context;
+import android.content.DialogInterface;
+import android.content.pm.PackageManager;
+import android.net.Uri;
+import android.os.Build;
import android.os.Bundle;
+import android.os.Environment;
+import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
+import android.support.annotation.StringRes;
+import android.support.design.widget.Snackbar;
import android.support.v4.app.DialogFragment;
+import android.support.v4.content.ContextCompat;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
@@ -27,6 +39,8 @@ import android.view.WindowManager;
import com.squareup.picasso.Callback;
import com.squareup.picasso.Picasso;
+import java.io.File;
+
import butterknife.BindView;
import butterknife.ButterKnife;
import uk.co.senab.photoview.PhotoView;
@@ -35,6 +49,9 @@ import uk.co.senab.photoview.PhotoViewAttacher;
public class ViewMediaFragment extends DialogFragment {
private PhotoViewAttacher attacher;
+ private DownloadManager downloadManager;
+
+ private static final int PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE = 1;
@BindView(R.id.view_media_image) PhotoView photoView;
@@ -99,6 +116,25 @@ public class ViewMediaFragment extends DialogFragment {
}
});
+ attacher.setOnLongClickListener(new View.OnLongClickListener() {
+ @Override
+ public boolean onLongClick(View v) {
+
+ AlertDialog downloadDialog = new AlertDialog.Builder(getContext()).create();
+
+ downloadDialog.setButton(AlertDialog.BUTTON_NEUTRAL, getString(R.string.dialog_download_image),
+ new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int which) {
+ dialog.dismiss();
+
+ downloadImage();
+ }
+ });
+ downloadDialog.show();
+ return false;
+ }
+ });
+
Picasso.with(getContext())
.load(url)
.into(photoView, new Callback() {
@@ -121,4 +157,63 @@ public class ViewMediaFragment extends DialogFragment {
attacher.cleanup();
super.onDestroyView();
}
+
+ private void downloadImage(){
+
+ //Permission stuff
+
+ if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN &&
+ ContextCompat.checkSelfPermission(this.getContext(), android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
+ != PackageManager.PERMISSION_GRANTED) {
+ android.support.v4.app.ActivityCompat.requestPermissions(getActivity(),
+ new String[] { android.Manifest.permission.WRITE_EXTERNAL_STORAGE },
+ PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE);
+ } else {
+
+
+ //download stuff
+ String url = getArguments().getString("url");
+ Uri uri = Uri.parse(url);
+
+ String filename = new File(url).getName();
+
+ downloadManager = (DownloadManager) getContext().getSystemService(Context.DOWNLOAD_SERVICE);
+
+ DownloadManager.Request request = new DownloadManager.Request(uri);
+ request.allowScanningByMediaScanner();
+ request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, getString(R.string.app_name) + "/" + filename);
+
+ downloadManager.enqueue(request);
+ }
+ }
+
+ @Override
+ public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[],
+ @NonNull int[] grantResults) {
+ switch (requestCode) {
+ case PERMISSIONS_REQUEST_WRITE_EXTERNAL_STORAGE: {
+ if (grantResults.length > 0
+ && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
+ downloadImage();
+ } else {
+ doErrorDialog(R.string.error_media_download_permission, R.string.action_retry,
+ new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ downloadImage();
+ }
+ });
+ }
+ break;
+ }
+ }
+ }
+
+ private void doErrorDialog(@StringRes int descriptionId, @StringRes int actionId,
+ View.OnClickListener listener) {
+ Snackbar bar = Snackbar.make(getView(), getString(descriptionId),
+ Snackbar.LENGTH_SHORT);
+ bar.setAction(actionId, listener);
+ bar.show();
+ }
}
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index 169b67bb..1e81f0ef 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -14,6 +14,7 @@
Ein Fehler ist aufgetreten.
Kein Webbrowser gefunden.
Es konnte kein Login-Token abgerufen werden.
+ Eine Berechtigung wird zum Speichern des Mediums benötigt.
Start
Benachrichtigungen
@@ -107,6 +108,7 @@
Stelle Medienupload fertig
Lade hoch…
+ Herunterladen
Öffentlich sichtbar
Öffentlich sichtbar, aber nicht in der öffentlichen Timeline
@@ -126,6 +128,7 @@
Benachrichtigen wenn
Mir jemand folgt
Ich erwähnt werde
+
Jemand meine Posts teilt
Browser
Öffne Links in der App
@@ -139,4 +142,4 @@
Gesperrter Account
-
\ No newline at end of file
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 2268ba4d..b82d265d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -13,6 +13,8 @@
That type of file cannot be uploaded.
That file could not be opened.
Permission to read media is required.
+ Permission to store media is required.
+
Images and videos cannot both be attached to the same status.
The upload failed.
At least one status must be reported.
@@ -120,6 +122,7 @@
Finishing Media Upload
Uploading…
+ Download
Everyone can view
Everyone can view, but not on public timelines
@@ -152,5 +155,4 @@
Locked Account
Share content of toot
Share link to toot
-