diff --git a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java index 889d937cb..59f779b4c 100644 --- a/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java +++ b/app/src/main/java/fr/free/nrw/commons/media/MediaDetailPagerFragment.java @@ -1,11 +1,11 @@ package fr.free.nrw.commons.media; +import static fr.free.nrw.commons.Utils.handleWebUrl; + import android.annotation.SuppressLint; -import android.app.DownloadManager; import android.content.Intent; import android.net.Uri; import android.os.Bundle; -import android.os.Environment; import android.os.Handler; import android.view.LayoutInflater; import android.view.Menu; @@ -13,40 +13,31 @@ import android.view.MenuInflater; import android.view.MenuItem; import android.view.View; import android.view.ViewGroup; -import android.widget.Toast; - import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.viewpager.widget.ViewPager; - -import com.google.android.material.snackbar.Snackbar; - -import javax.inject.Inject; -import javax.inject.Named; - import butterknife.BindView; import butterknife.ButterKnife; +import com.google.android.material.snackbar.Snackbar; import fr.free.nrw.commons.Media; import fr.free.nrw.commons.R; -import fr.free.nrw.commons.category.CategoryImagesCallback; import fr.free.nrw.commons.auth.SessionManager; import fr.free.nrw.commons.bookmarks.Bookmark; import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesContentProvider; import fr.free.nrw.commons.bookmarks.pictures.BookmarkPicturesDao; +import fr.free.nrw.commons.category.CategoryImagesCallback; import fr.free.nrw.commons.contributions.Contribution; import fr.free.nrw.commons.di.CommonsDaggerSupportFragment; import fr.free.nrw.commons.kvstore.JsonKvStore; +import fr.free.nrw.commons.utils.DownloadUtils; import fr.free.nrw.commons.utils.ImageUtils; import fr.free.nrw.commons.utils.NetworkUtils; -import fr.free.nrw.commons.utils.PermissionUtils; import fr.free.nrw.commons.utils.ViewUtil; +import javax.inject.Inject; +import javax.inject.Named; import timber.log.Timber; -import static android.Manifest.permission.WRITE_EXTERNAL_STORAGE; -import static android.content.Context.DOWNLOAD_SERVICE; -import static fr.free.nrw.commons.Utils.handleWebUrl; - public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment implements ViewPager.OnPageChangeListener { @Inject SessionManager sessionManager; @@ -168,7 +159,7 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple ViewUtil.showShortSnackbar(getView(), R.string.no_internet); return false; } - downloadMedia(m); + DownloadUtils.downloadMedia(getActivity(), m); return true; case R.id.menu_set_as_wallpaper: // Set wallpaper @@ -192,53 +183,6 @@ public class MediaDetailPagerFragment extends CommonsDaggerSupportFragment imple ImageUtils.setWallpaperFromImageUrl(getActivity(), Uri.parse(media.getImageUrl())); } - /** - * Start the media file downloading to the local SD card/storage. - * The file can then be opened in Gallery or other apps. - * - * @param m Media file to download - */ - private void downloadMedia(Media m) { - String imageUrl = m.getImageUrl(), fileName = m.getFilename(); - - if (imageUrl == null - || fileName == null - || getContext() == null - || getActivity() == null) { - Timber.d("Skipping download media as either imageUrl %s or filename %s activity is null", imageUrl, fileName); - return; - } - - // Strip 'File:' from beginning of filename, we really shouldn't store it - fileName = fileName.replaceFirst("^File:", ""); - - Uri imageUri = Uri.parse(imageUrl); - - DownloadManager.Request req = new DownloadManager.Request(imageUri); - //These are not the image title and description fields, they are download descs for notifications - req.setDescription(getString(R.string.app_name)); - req.setTitle(m.getDisplayTitle()); - req.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName); - - // Modern Android updates the gallery automatically. Yay! - req.allowScanningByMediaScanner(); - req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); - PermissionUtils.checkPermissionsAndPerformAction(getActivity(), WRITE_EXTERNAL_STORAGE, - () -> enqueueRequest(req), () -> Toast.makeText(getContext(), - R.string.download_failed_we_cannot_download_the_file_without_storage_permission, - Toast.LENGTH_SHORT).show(), R.string.storage_permission, - R.string.write_storage_permission_rationale); - - } - - private void enqueueRequest(DownloadManager.Request req) { - DownloadManager systemService = - (DownloadManager) getActivity().getSystemService(DOWNLOAD_SERVICE); - if (systemService != null) { - systemService.enqueue(req); - } - } - @Override public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { if (!editable) { // Disable menu options for editable views diff --git a/app/src/main/java/fr/free/nrw/commons/utils/DownloadUtils.kt b/app/src/main/java/fr/free/nrw/commons/utils/DownloadUtils.kt new file mode 100644 index 000000000..9241668f5 --- /dev/null +++ b/app/src/main/java/fr/free/nrw/commons/utils/DownloadUtils.kt @@ -0,0 +1,65 @@ +package fr.free.nrw.commons.utils + +import android.Manifest.permission +import android.app.Activity +import android.app.DownloadManager +import android.content.Context +import android.net.Uri +import android.os.Environment +import android.widget.Toast +import fr.free.nrw.commons.Media +import fr.free.nrw.commons.R +import timber.log.Timber + +object DownloadUtils { + /** + * Start the media file downloading to the local SD card/storage. The file can then be opened in + * Gallery or other apps. + * + * @param m Media file to download + */ + @JvmStatic + fun downloadMedia(activity: Activity?, m: Media) { + val imageUrl = m.getImageUrl() + var fileName = m.getFilename() + if (imageUrl == null || fileName == null || activity == null + ) { + Timber.d( + "Skipping download media as either imageUrl %s or filename %s activity is null", + imageUrl, fileName + ) + return + } + // Strip 'File:' from beginning of filename, we really shouldn't store it + fileName = fileName.replaceFirst("^File:".toRegex(), "") + val imageUri = Uri.parse(imageUrl) + val req = DownloadManager.Request(imageUri) + //These are not the image title and description fields, they are download descs for notifications + req.setDescription(activity.getString(R.string.app_name)) + req.setTitle(m.displayTitle) + req.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, fileName) + // Modern Android updates the gallery automatically. Yay! + req.allowScanningByMediaScanner() + req.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED) + PermissionUtils.checkPermissionsAndPerformAction( + activity, + permission.WRITE_EXTERNAL_STORAGE, + { enqueueRequest(activity, req) }, + { + Toast.makeText( + activity, + R.string.download_failed_we_cannot_download_the_file_without_storage_permission, + Toast.LENGTH_SHORT + ).show() + }, + R.string.storage_permission, + R.string.write_storage_permission_rationale + ) + } + + private fun enqueueRequest(activity: Activity, req: DownloadManager.Request) { + val systemService = + activity.getSystemService(Context.DOWNLOAD_SERVICE) as DownloadManager + systemService?.enqueue(req) + } +} \ No newline at end of file