package org.wikipedia.gallery; import android.app.Activity; import android.app.DownloadManager; import android.content.BroadcastReceiver; import android.content.ContentValues; import android.content.Context; import android.content.Intent; import android.database.Cursor; import android.net.Uri; import android.os.Environment; import android.provider.MediaStore; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import org.wikipedia.R; import org.wikipedia.feed.image.FeaturedImage; import org.wikipedia.util.FeedbackUtil; import org.wikipedia.util.FileUtil; public class MediaDownloadReceiver extends BroadcastReceiver { private static final String FILE_NAMESPACE = "File:"; @NonNull private Activity activity; @NonNull private DownloadManager downloadManager; public MediaDownloadReceiver(@NonNull Activity activity) { this.activity = activity; downloadManager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); } public void download(@NonNull FeaturedImage featuredImage) { String filename = FileUtil.sanitizeFileName(featuredImage.title()); String targetDirectory = Environment.DIRECTORY_PICTURES; performDownloadRequest(featuredImage.image().source(), targetDirectory, filename, null); } public void download(@NonNull GalleryItem galleryItem) { String saveFilename = FileUtil.sanitizeFileName(trimFileNamespace(galleryItem.getName())); String targetDirectory; if (FileUtil.isVideo(galleryItem.getMimeType())) { targetDirectory = Environment.DIRECTORY_MOVIES; } else if (FileUtil.isAudio(galleryItem.getMimeType())) { targetDirectory = Environment.DIRECTORY_MUSIC; } else if (FileUtil.isImage(galleryItem.getMimeType())) { targetDirectory = Environment.DIRECTORY_PICTURES; } else { targetDirectory = Environment.DIRECTORY_DOWNLOADS; } performDownloadRequest(Uri.parse(galleryItem.getUrl()), targetDirectory, saveFilename, galleryItem.getMimeType()); } private void performDownloadRequest(@NonNull Uri uri, @NonNull String targetDirectory, @NonNull String filename, @Nullable String mimeType) { DownloadManager.Request request = new DownloadManager.Request(uri); request.setDestinationInExternalFilesDir(activity, targetDirectory, filename); request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED); if (mimeType != null) { request.setMimeType(mimeType); } request.allowScanningByMediaScanner(); downloadManager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE); downloadManager.enqueue(request); FeedbackUtil.showMessage(activity, R.string.gallery_save_progress); } @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(action)) { long downloadId = intent.getLongExtra(DownloadManager.EXTRA_DOWNLOAD_ID, 0); DownloadManager.Query query = new DownloadManager.Query(); query.setFilterById(downloadId); Cursor c = downloadManager.query(query); try { if (c.moveToFirst()) { int statusIndex = c.getColumnIndexOrThrow(DownloadManager.COLUMN_STATUS); int pathIndex = c.getColumnIndexOrThrow(DownloadManager.COLUMN_LOCAL_URI); int mimeIndex = c.getColumnIndexOrThrow(DownloadManager.COLUMN_MEDIA_TYPE); if (DownloadManager.STATUS_SUCCESSFUL == c.getInt(statusIndex)) { FeedbackUtil.showMessage(activity, R.string.gallery_save_success); notifyContentResolver(Uri.parse(c.getString(pathIndex)).getPath(), c.getString(mimeIndex)); } } } finally { c.close(); } } } @NonNull private String trimFileNamespace(@NonNull String filename) { return filename.startsWith(FILE_NAMESPACE) ? filename.substring(FILE_NAMESPACE.length()) : filename; } private void notifyContentResolver(@NonNull String path, @NonNull String mimeType) { ContentValues values = new ContentValues(); Uri contentUri; if (FileUtil.isVideo(mimeType)) { values.put(MediaStore.Video.Media.DATA, path); values.put(MediaStore.Video.Media.MIME_TYPE, mimeType); contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI; } else if (FileUtil.isAudio(mimeType)) { values.put(MediaStore.Audio.Media.DATA, path); values.put(MediaStore.Audio.Media.MIME_TYPE, mimeType); contentUri = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI; } else { values.put(MediaStore.Images.Media.DATA, path); values.put(MediaStore.Images.Media.MIME_TYPE, mimeType); contentUri = MediaStore.Images.Media.EXTERNAL_CONTENT_URI; } activity.getContentResolver().insert(contentUri, values); } }