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 -