Support different download locations in ViewImgurImageFragment, ViewImgurVideoFragment, ViewRedditGalleryImageOrGifFragment and ViewRedditGalleryVideoFragment.

This commit is contained in:
Alex Ning 2020-09-06 14:02:04 +08:00
parent cb0d662ed3
commit 1ee48844d2
12 changed files with 158 additions and 91 deletions

View File

@ -25,7 +25,7 @@
android:usesCleartextTraffic="true" android:usesCleartextTraffic="true"
tools:replace="android:label"> tools:replace="android:label">
<service <service
android:name=".Service.DownloadImageService" android:name=".Service.DownloadMediaService"
android:enabled="true" android:enabled="true"
android:exported="false"></service> android:exported="false"></service>
@ -42,7 +42,7 @@
android:windowSoftInputMode="adjustResize" /> android:windowSoftInputMode="adjustResize" />
<service <service
android:name=".Service.DownloadVideoService" android:name=".Service.DownloadRedditVideoService"
android:enabled="true" android:enabled="true"
android:exported="false" /> android:exported="false" />

View File

@ -63,10 +63,8 @@ import ml.docilealligator.infinityforreddit.Font.FontStyle;
import ml.docilealligator.infinityforreddit.Font.TitleFontFamily; import ml.docilealligator.infinityforreddit.Font.TitleFontFamily;
import ml.docilealligator.infinityforreddit.Font.TitleFontStyle; import ml.docilealligator.infinityforreddit.Font.TitleFontStyle;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.MediaDownloader;
import ml.docilealligator.infinityforreddit.MediaDownloaderImpl;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Service.DownloadImageService; import ml.docilealligator.infinityforreddit.Service.DownloadMediaService;
import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback; import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.WallpaperSetter; import ml.docilealligator.infinityforreddit.WallpaperSetter;
@ -87,7 +85,6 @@ public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWa
@Inject @Inject
@Named("default") @Named("default")
SharedPreferences mSharedPreferences; SharedPreferences mSharedPreferences;
private MediaDownloader mediaDownloader;
private boolean isActionBarHidden = false; private boolean isActionBarHidden = false;
private boolean isDownloading = false; private boolean isDownloading = false;
private RequestManager glide; private RequestManager glide;
@ -134,8 +131,6 @@ public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWa
Slidr.attach(this, new SlidrConfig.Builder().position(SlidrPosition.VERTICAL).distanceThreshold(0.125f).build()); Slidr.attach(this, new SlidrConfig.Builder().position(SlidrPosition.VERTICAL).distanceThreshold(0.125f).build());
mediaDownloader = new MediaDownloaderImpl();
glide = Glide.with(this); glide = Glide.with(this);
Intent intent = getIntent(); Intent intent = getIntent();
@ -339,10 +334,10 @@ public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWa
private void download() { private void download() {
isDownloading = false; isDownloading = false;
Intent intent = new Intent(this, DownloadImageService.class); Intent intent = new Intent(this, DownloadMediaService.class);
intent.putExtra(DownloadImageService.EXTRA_URL, mImageUrl); intent.putExtra(DownloadMediaService.EXTRA_URL, mImageUrl);
intent.putExtra(DownloadImageService.EXTRA_IS_GIF, isGif); intent.putExtra(DownloadMediaService.EXTRA_MEDIA_TYPE, isGif ? DownloadMediaService.EXTRA_MEDIA_TYPE_GIF : DownloadMediaService.EXTRA_MEDIA_TYPE_IMAGE);
intent.putExtra(DownloadImageService.EXTRA_FILE_NAME, mImageFileName); intent.putExtra(DownloadMediaService.EXTRA_FILE_NAME, mImageFileName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent); startForegroundService(intent);
} else { } else {
@ -437,7 +432,7 @@ public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWa
if (grantResults[0] == PackageManager.PERMISSION_DENIED) { if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) { } else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) {
mediaDownloader.download(mImageUrl, mImageFileName, this); download();
} }
isDownloading = false; isDownloading = false;
} }

View File

@ -62,7 +62,7 @@ import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.MediaDownloader; import ml.docilealligator.infinityforreddit.MediaDownloader;
import ml.docilealligator.infinityforreddit.MediaDownloaderImpl; import ml.docilealligator.infinityforreddit.MediaDownloaderImpl;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Service.DownloadVideoService; import ml.docilealligator.infinityforreddit.Service.DownloadRedditVideoService;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import retrofit2.Retrofit; import retrofit2.Retrofit;
@ -440,11 +440,11 @@ public class ViewVideoActivity extends AppCompatActivity {
if (videoType != VIDEO_TYPE_NORMAL) { if (videoType != VIDEO_TYPE_NORMAL) {
mediaDownloader.download(videoDownloadUrl, videoFileName, this); mediaDownloader.download(videoDownloadUrl, videoFileName, this);
} else { } else {
Intent intent = new Intent(this, DownloadVideoService.class); Intent intent = new Intent(this, DownloadRedditVideoService.class);
intent.putExtra(DownloadVideoService.EXTRA_VIDEO_URL, videoDownloadUrl); intent.putExtra(DownloadRedditVideoService.EXTRA_VIDEO_URL, videoDownloadUrl);
intent.putExtra(DownloadVideoService.EXTRA_POST_ID, id); intent.putExtra(DownloadRedditVideoService.EXTRA_POST_ID, id);
intent.putExtra(DownloadVideoService.EXTRA_SUBREDDIT, subredditName); intent.putExtra(DownloadRedditVideoService.EXTRA_SUBREDDIT, subredditName);
intent.putExtra(DownloadVideoService.EXTRA_IS_REDDIT_VIDEO, true); intent.putExtra(DownloadRedditVideoService.EXTRA_IS_REDDIT_VIDEO, true);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
startForegroundService(intent); startForegroundService(intent);

View File

@ -54,8 +54,8 @@ import ml.docilealligator.infinityforreddit.Fragment.SubscribedSubredditsListing
import ml.docilealligator.infinityforreddit.Fragment.UserListingFragment; import ml.docilealligator.infinityforreddit.Fragment.UserListingFragment;
import ml.docilealligator.infinityforreddit.Fragment.ViewImgurVideoFragment; import ml.docilealligator.infinityforreddit.Fragment.ViewImgurVideoFragment;
import ml.docilealligator.infinityforreddit.Fragment.ViewRedditGalleryVideoFragment; import ml.docilealligator.infinityforreddit.Fragment.ViewRedditGalleryVideoFragment;
import ml.docilealligator.infinityforreddit.Service.DownloadImageService; import ml.docilealligator.infinityforreddit.Service.DownloadMediaService;
import ml.docilealligator.infinityforreddit.Service.DownloadVideoService; import ml.docilealligator.infinityforreddit.Service.DownloadRedditVideoService;
import ml.docilealligator.infinityforreddit.Service.SubmitPostService; import ml.docilealligator.infinityforreddit.Service.SubmitPostService;
import ml.docilealligator.infinityforreddit.Settings.AdvancedPreferenceFragment; import ml.docilealligator.infinityforreddit.Settings.AdvancedPreferenceFragment;
import ml.docilealligator.infinityforreddit.Settings.CustomizeMainPageTabsFragment; import ml.docilealligator.infinityforreddit.Settings.CustomizeMainPageTabsFragment;
@ -173,7 +173,7 @@ public interface AppComponent {
void inject(ViewImgurVideoFragment viewImgurVideoFragment); void inject(ViewImgurVideoFragment viewImgurVideoFragment);
void inject(DownloadVideoService downloadVideoService); void inject(DownloadRedditVideoService downloadRedditVideoService);
void inject(MultiRedditListingFragment multiRedditListingFragment); void inject(MultiRedditListingFragment multiRedditListingFragment);
@ -191,7 +191,7 @@ public interface AppComponent {
void inject(CustomizeMainPageTabsFragment customizeMainPageTabsFragment); void inject(CustomizeMainPageTabsFragment customizeMainPageTabsFragment);
void inject(DownloadImageService downloadImageService); void inject(DownloadMediaService downloadMediaService);
void inject(DownloadLocationPreferenceFragment downloadLocationPreferenceFragment); void inject(DownloadLocationPreferenceFragment downloadLocationPreferenceFragment);
} }

View File

@ -1,9 +1,9 @@
package ml.docilealligator.infinityforreddit.Event; package ml.docilealligator.infinityforreddit.Event;
public class DownloadImageOrGifEvent { public class DownloadMediaEvent {
public boolean isSuccessful; public boolean isSuccessful;
public DownloadImageOrGifEvent(boolean isSuccessful) { public DownloadMediaEvent(boolean isSuccessful) {
this.isSuccessful = isSuccessful; this.isSuccessful = isSuccessful;
} }
} }

View File

@ -45,10 +45,8 @@ import ml.docilealligator.infinityforreddit.AsyncTask.SaveBitmapImageToFileAsync
import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment; import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment;
import ml.docilealligator.infinityforreddit.BuildConfig; import ml.docilealligator.infinityforreddit.BuildConfig;
import ml.docilealligator.infinityforreddit.ImgurMedia; import ml.docilealligator.infinityforreddit.ImgurMedia;
import ml.docilealligator.infinityforreddit.MediaDownloader;
import ml.docilealligator.infinityforreddit.MediaDownloaderImpl;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Service.DownloadImageService; import ml.docilealligator.infinityforreddit.Service.DownloadMediaService;
import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback; import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback;
public class ViewImgurImageFragment extends Fragment { public class ViewImgurImageFragment extends Fragment {
@ -65,7 +63,6 @@ public class ViewImgurImageFragment extends Fragment {
private ViewImgurMediaActivity activity; private ViewImgurMediaActivity activity;
private RequestManager glide; private RequestManager glide;
private MediaDownloader mediaDownloader;
private ImgurMedia imgurMedia; private ImgurMedia imgurMedia;
private boolean isDownloading = false; private boolean isDownloading = false;
private boolean isActionBarHidden = false; private boolean isActionBarHidden = false;
@ -85,7 +82,6 @@ public class ViewImgurImageFragment extends Fragment {
imgurMedia = getArguments().getParcelable(EXTRA_IMGUR_IMAGES); imgurMedia = getArguments().getParcelable(EXTRA_IMGUR_IMAGES);
glide = Glide.with(activity); glide = Glide.with(activity);
mediaDownloader = new MediaDownloaderImpl();
loadImage(); loadImage();
imageView.setOnClickListener(view -> { imageView.setOnClickListener(view -> {
@ -236,10 +232,10 @@ public class ViewImgurImageFragment extends Fragment {
private void download() { private void download() {
isDownloading = false; isDownloading = false;
Intent intent = new Intent(activity, DownloadImageService.class); Intent intent = new Intent(activity, DownloadMediaService.class);
intent.putExtra(DownloadImageService.EXTRA_URL, imgurMedia.getLink()); intent.putExtra(DownloadMediaService.EXTRA_URL, imgurMedia.getLink());
intent.putExtra(DownloadImageService.EXTRA_IS_GIF, false); intent.putExtra(DownloadMediaService.EXTRA_MEDIA_TYPE, DownloadMediaService.EXTRA_MEDIA_TYPE_IMAGE);
intent.putExtra(DownloadImageService.EXTRA_FILE_NAME, imgurMedia.getFileName()); intent.putExtra(DownloadMediaService.EXTRA_FILE_NAME, imgurMedia.getFileName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(intent); activity.startForegroundService(intent);
} else { } else {

View File

@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit.Fragment;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -46,9 +47,8 @@ import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.ImgurMedia; import ml.docilealligator.infinityforreddit.ImgurMedia;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.MediaDownloader;
import ml.docilealligator.infinityforreddit.MediaDownloaderImpl;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Service.DownloadMediaService;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
public class ViewImgurVideoFragment extends Fragment { public class ViewImgurVideoFragment extends Fragment {
@ -65,7 +65,6 @@ public class ViewImgurVideoFragment extends Fragment {
private ImgurMedia imgurMedia; private ImgurMedia imgurMedia;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private DataSource.Factory dataSourceFactory; private DataSource.Factory dataSourceFactory;
private MediaDownloader mediaDownloader;
private boolean wasPlaying = false; private boolean wasPlaying = false;
private boolean isMute = false; private boolean isMute = false;
private boolean isDownloading = false; private boolean isDownloading = false;
@ -128,8 +127,6 @@ public class ViewImgurVideoFragment extends Fragment {
} }
}); });
mediaDownloader = new MediaDownloaderImpl();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(); TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory();
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(activity, trackSelector); player = ExoPlayerFactory.newSimpleInstance(activity, trackSelector);
@ -188,7 +185,16 @@ public class ViewImgurVideoFragment extends Fragment {
private void download() { private void download() {
isDownloading = false; isDownloading = false;
mediaDownloader.download(imgurMedia.getLink(), imgurMedia.getFileName(), getContext()); Intent intent = new Intent(activity, DownloadMediaService.class);
intent.putExtra(DownloadMediaService.EXTRA_URL, imgurMedia.getLink());
intent.putExtra(DownloadMediaService.EXTRA_MEDIA_TYPE, DownloadMediaService.EXTRA_MEDIA_TYPE_VIDEO);
intent.putExtra(DownloadMediaService.EXTRA_FILE_NAME, imgurMedia.getFileName());
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(intent);
} else {
activity.startService(intent);
}
Toast.makeText(activity, R.string.download_started, Toast.LENGTH_SHORT).show();
} }
private void preparePlayer(Bundle savedInstanceState) { private void preparePlayer(Bundle savedInstanceState) {

View File

@ -50,11 +50,9 @@ import ml.docilealligator.infinityforreddit.AsyncTask.SaveBitmapImageToFileAsync
import ml.docilealligator.infinityforreddit.AsyncTask.SaveGIFToFileAsyncTask; import ml.docilealligator.infinityforreddit.AsyncTask.SaveGIFToFileAsyncTask;
import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment; import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment;
import ml.docilealligator.infinityforreddit.BuildConfig; import ml.docilealligator.infinityforreddit.BuildConfig;
import ml.docilealligator.infinityforreddit.MediaDownloader;
import ml.docilealligator.infinityforreddit.MediaDownloaderImpl;
import ml.docilealligator.infinityforreddit.Post.Post; import ml.docilealligator.infinityforreddit.Post.Post;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Service.DownloadImageService; import ml.docilealligator.infinityforreddit.Service.DownloadMediaService;
import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback; import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback;
public class ViewRedditGalleryImageOrGifFragment extends Fragment { public class ViewRedditGalleryImageOrGifFragment extends Fragment {
@ -71,7 +69,6 @@ public class ViewRedditGalleryImageOrGifFragment extends Fragment {
private ViewRedditGalleryActivity activity; private ViewRedditGalleryActivity activity;
private RequestManager glide; private RequestManager glide;
private MediaDownloader mediaDownloader;
private Post.Gallery media; private Post.Gallery media;
private boolean isDownloading = false; private boolean isDownloading = false;
private boolean isActionBarHidden = false; private boolean isActionBarHidden = false;
@ -93,7 +90,6 @@ public class ViewRedditGalleryImageOrGifFragment extends Fragment {
media = getArguments().getParcelable(EXTRA_REDDIT_GALLERY_MEDIA); media = getArguments().getParcelable(EXTRA_REDDIT_GALLERY_MEDIA);
glide = Glide.with(activity); glide = Glide.with(activity);
mediaDownloader = new MediaDownloaderImpl();
imageView.setImageViewFactory(new GlideImageViewFactory()); imageView.setImageViewFactory(new GlideImageViewFactory());
@ -269,10 +265,10 @@ public class ViewRedditGalleryImageOrGifFragment extends Fragment {
private void download() { private void download() {
isDownloading = false; isDownloading = false;
Intent intent = new Intent(activity, DownloadImageService.class); Intent intent = new Intent(activity, DownloadMediaService.class);
intent.putExtra(DownloadImageService.EXTRA_URL, media.url); intent.putExtra(DownloadMediaService.EXTRA_URL, media.url);
intent.putExtra(DownloadImageService.EXTRA_IS_GIF, media.mediaType == Post.Gallery.TYPE_GIF); intent.putExtra(DownloadMediaService.EXTRA_MEDIA_TYPE, media.mediaType == Post.Gallery.TYPE_GIF ? DownloadMediaService.EXTRA_MEDIA_TYPE_GIF: DownloadMediaService.EXTRA_MEDIA_TYPE_IMAGE);
intent.putExtra(DownloadImageService.EXTRA_FILE_NAME, media.fileName); intent.putExtra(DownloadMediaService.EXTRA_FILE_NAME, media.fileName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(intent); activity.startForegroundService(intent);
} else { } else {

View File

@ -3,6 +3,7 @@ package ml.docilealligator.infinityforreddit.Fragment;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.content.Context; import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.content.res.Configuration; import android.content.res.Configuration;
@ -45,10 +46,9 @@ import javax.inject.Named;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.MediaDownloader;
import ml.docilealligator.infinityforreddit.MediaDownloaderImpl;
import ml.docilealligator.infinityforreddit.Post.Post; import ml.docilealligator.infinityforreddit.Post.Post;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Service.DownloadMediaService;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
public class ViewRedditGalleryVideoFragment extends Fragment { public class ViewRedditGalleryVideoFragment extends Fragment {
@ -65,7 +65,6 @@ public class ViewRedditGalleryVideoFragment extends Fragment {
private Post.Gallery galleryVideo; private Post.Gallery galleryVideo;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private DataSource.Factory dataSourceFactory; private DataSource.Factory dataSourceFactory;
private MediaDownloader mediaDownloader;
private boolean wasPlaying = false; private boolean wasPlaying = false;
private boolean isMute = false; private boolean isMute = false;
private boolean isDownloading = false; private boolean isDownloading = false;
@ -128,8 +127,6 @@ public class ViewRedditGalleryVideoFragment extends Fragment {
} }
}); });
mediaDownloader = new MediaDownloaderImpl();
TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory(); TrackSelection.Factory videoTrackSelectionFactory = new AdaptiveTrackSelection.Factory();
TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory); TrackSelector trackSelector = new DefaultTrackSelector(videoTrackSelectionFactory);
player = ExoPlayerFactory.newSimpleInstance(activity, trackSelector); player = ExoPlayerFactory.newSimpleInstance(activity, trackSelector);
@ -188,7 +185,16 @@ public class ViewRedditGalleryVideoFragment extends Fragment {
private void download() { private void download() {
isDownloading = false; isDownloading = false;
mediaDownloader.download(galleryVideo.url, galleryVideo.fileName, getContext()); Intent intent = new Intent(activity, DownloadMediaService.class);
intent.putExtra(DownloadMediaService.EXTRA_URL, galleryVideo.url);
intent.putExtra(DownloadMediaService.EXTRA_MEDIA_TYPE, DownloadMediaService.EXTRA_MEDIA_TYPE_VIDEO);
intent.putExtra(DownloadMediaService.EXTRA_FILE_NAME, galleryVideo.fileName);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
activity.startForegroundService(intent);
} else {
activity.startService(intent);
}
Toast.makeText(activity, R.string.download_started, Toast.LENGTH_SHORT).show();
} }
private void preparePlayer(Bundle savedInstanceState) { private void preparePlayer(Bundle savedInstanceState) {

View File

@ -36,7 +36,7 @@ import javax.inject.Named;
import ml.docilealligator.infinityforreddit.API.DownloadFile; import ml.docilealligator.infinityforreddit.API.DownloadFile;
import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper; import ml.docilealligator.infinityforreddit.CustomTheme.CustomThemeWrapper;
import ml.docilealligator.infinityforreddit.Event.DownloadImageOrGifEvent; import ml.docilealligator.infinityforreddit.Event.DownloadMediaEvent;
import ml.docilealligator.infinityforreddit.Infinity; import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.NotificationUtils; import ml.docilealligator.infinityforreddit.NotificationUtils;
import ml.docilealligator.infinityforreddit.R; import ml.docilealligator.infinityforreddit.R;
@ -49,10 +49,13 @@ import retrofit2.Retrofit;
import static android.os.Environment.getExternalStoragePublicDirectory; import static android.os.Environment.getExternalStoragePublicDirectory;
public class DownloadImageService extends Service { public class DownloadMediaService extends Service {
public static final String EXTRA_URL = "EU"; public static final String EXTRA_URL = "EU";
public static final String EXTRA_FILE_NAME = "EFN"; public static final String EXTRA_FILE_NAME = "EFN";
public static final String EXTRA_IS_GIF = "EIG"; public static final String EXTRA_MEDIA_TYPE = "EIG";
public static final int EXTRA_MEDIA_TYPE_IMAGE = 0;
public static final int EXTRA_MEDIA_TYPE_GIF = 1;
public static final int EXTRA_MEDIA_TYPE_VIDEO = 2;
private static final int NO_ERROR = -1; private static final int NO_ERROR = -1;
private static final int ERROR_CANNOT_GET_DESTINATION_DIRECTORY = 0; private static final int ERROR_CANNOT_GET_DESTINATION_DIRECTORY = 0;
@ -66,9 +69,9 @@ public class DownloadImageService extends Service {
SharedPreferences mSharedPreferences; SharedPreferences mSharedPreferences;
@Inject @Inject
CustomThemeWrapper mCustomThemeWrapper; CustomThemeWrapper mCustomThemeWrapper;
private boolean isGif; private int mediaType;
public DownloadImageService() { public DownloadMediaService() {
} }
@Override @Override
@ -76,6 +79,50 @@ public class DownloadImageService extends Service {
return null; return null;
} }
private String getNotificationChannelId() {
switch (mediaType) {
case EXTRA_MEDIA_TYPE_GIF:
return NotificationUtils.CHANNEL_ID_DOWNLOAD_GIF;
case EXTRA_MEDIA_TYPE_VIDEO:
return NotificationUtils.CHANNEL_ID_DOWNLOAD_VIDEO;
default:
return NotificationUtils.CHANNEL_ID_DOWNLOAD_IMAGE;
}
}
private String getNotificationChannel() {
switch (mediaType) {
case EXTRA_MEDIA_TYPE_GIF:
return NotificationUtils.CHANNEL_DOWNLOAD_GIF;
case EXTRA_MEDIA_TYPE_VIDEO:
return NotificationUtils.CHANNEL_DOWNLOAD_VIDEO;
default:
return NotificationUtils.CHANNEL_DOWNLOAD_IMAGE;
}
}
private int getNotificationId() {
switch (mediaType) {
case EXTRA_MEDIA_TYPE_GIF:
return NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID;
case EXTRA_MEDIA_TYPE_VIDEO:
return NotificationUtils.DOWNLOAD_VIDEO_NOTIFICATION_ID;
default:
return NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID;
}
}
private String getDownloadLocation() {
switch (mediaType) {
case EXTRA_MEDIA_TYPE_GIF:
return mSharedPreferences.getString(SharedPreferencesUtils.GIF_DOWNLOAD_LOCATION, "");
case EXTRA_MEDIA_TYPE_VIDEO:
return mSharedPreferences.getString(SharedPreferencesUtils.VIDEO_DOWNLOAD_LOCATION, "");
default:
return mSharedPreferences.getString(SharedPreferencesUtils.IMAGE_DOWNLOAD_LOCATION, "");
}
}
@Override @Override
public int onStartCommand(Intent intent, int flags, int startId) { public int onStartCommand(Intent intent, int flags, int startId) {
((Infinity) getApplication()).getAppComponent().inject(this); ((Infinity) getApplication()).getAppComponent().inject(this);
@ -83,13 +130,13 @@ public class DownloadImageService extends Service {
String fileUrl = intent.getStringExtra(EXTRA_URL); String fileUrl = intent.getStringExtra(EXTRA_URL);
String fileName; String fileName;
fileName = intent.getStringExtra(EXTRA_FILE_NAME); fileName = intent.getStringExtra(EXTRA_FILE_NAME);
isGif = intent.getBooleanExtra(EXTRA_IS_GIF, false); mediaType = intent.getIntExtra(EXTRA_MEDIA_TYPE, EXTRA_MEDIA_TYPE_IMAGE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel serviceChannel; NotificationChannel serviceChannel;
serviceChannel = new NotificationChannel( serviceChannel = new NotificationChannel(
isGif ? NotificationUtils.CHANNEL_ID_DOWNLOAD_GIF : NotificationUtils.CHANNEL_ID_DOWNLOAD_IMAGE, getNotificationChannelId(),
isGif ? NotificationUtils.CHANNEL_DOWNLOAD_GIF : NotificationUtils.CHANNEL_DOWNLOAD_IMAGE, getNotificationChannel(),
NotificationManager.IMPORTANCE_LOW NotificationManager.IMPORTANCE_LOW
); );
@ -97,17 +144,31 @@ public class DownloadImageService extends Service {
manager.createNotificationChannel(serviceChannel); manager.createNotificationChannel(serviceChannel);
} }
startForeground( switch (mediaType) {
isGif ? NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID : NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID, case EXTRA_MEDIA_TYPE_GIF:
createNotification(isGif ? R.string.downloading_gif : R.string.downloading_image, fileName, null) startForeground(
); NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID,
createNotification(R.string.downloading_gif, fileName, null)
);
break;
case EXTRA_MEDIA_TYPE_VIDEO:
startForeground(
NotificationUtils.DOWNLOAD_VIDEO_NOTIFICATION_ID,
createNotification(R.string.downloading_video, fileName, null)
);
break;
default:
startForeground(
NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID,
createNotification(R.string.downloading_image, fileName, null)
);
}
retrofit.create(DownloadFile.class).downloadFile(fileUrl).enqueue(new Callback<ResponseBody>() { retrofit.create(DownloadFile.class).downloadFile(fileUrl).enqueue(new Callback<ResponseBody>() {
@Override @Override
public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) { public void onResponse(@NonNull Call<ResponseBody> call, @NonNull Response<ResponseBody> response) {
if (response.isSuccessful() && response.body() != null) { if (response.isSuccessful() && response.body() != null) {
String destinationFileDirectory = isGif ? mSharedPreferences.getString(SharedPreferencesUtils.GIF_DOWNLOAD_LOCATION, "") : String destinationFileDirectory = getDownloadLocation();
mSharedPreferences.getString(SharedPreferencesUtils.IMAGE_DOWNLOAD_LOCATION, "");
String destinationFileUriString; String destinationFileUriString;
boolean isDefaultDestination; boolean isDefaultDestination;
if (destinationFileDirectory.equals("")) { if (destinationFileDirectory.equals("")) {
@ -131,7 +192,7 @@ public class DownloadImageService extends Service {
isDefaultDestination = true; isDefaultDestination = true;
} else { } else {
isDefaultDestination = false; isDefaultDestination = false;
DocumentFile picFile = DocumentFile.fromTreeUri(DownloadImageService.this, Uri.parse(destinationFileDirectory)).createFile("image/*", fileName); DocumentFile picFile = DocumentFile.fromTreeUri(DownloadMediaService.this, Uri.parse(destinationFileDirectory)).createFile("image/*", fileName);
if (picFile == null) { if (picFile == null) {
downloadFinished(null, fileName, ERROR_CANNOT_GET_DESTINATION_DIRECTORY); downloadFinished(null, fileName, ERROR_CANNOT_GET_DESTINATION_DIRECTORY);
return; return;
@ -139,7 +200,7 @@ public class DownloadImageService extends Service {
destinationFileUriString = picFile.getUri().toString(); destinationFileUriString = picFile.getUri().toString();
} }
new SaveImageOrGifAndCopyToExternalStorageAsyncTask(response.body(), isGif, new SaveImageOrGifAndCopyToExternalStorageAsyncTask(response.body(), mediaType,
isDefaultDestination, fileName, destinationFileUriString, getContentResolver(), isDefaultDestination, fileName, destinationFileUriString, getContentResolver(),
new SaveImageOrGifAndCopyToExternalStorageAsyncTask.SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener() { new SaveImageOrGifAndCopyToExternalStorageAsyncTask.SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener() {
@Override @Override
@ -165,7 +226,7 @@ public class DownloadImageService extends Service {
private Notification createNotification(int stringResId, String fileName, PendingIntent pendingIntent) { private Notification createNotification(int stringResId, String fileName, PendingIntent pendingIntent) {
NotificationCompat.Builder builder; NotificationCompat.Builder builder;
builder = new NotificationCompat.Builder(this, isGif ? NotificationUtils.CHANNEL_ID_DOWNLOAD_GIF : NotificationUtils.CHANNEL_ID_DOWNLOAD_IMAGE); builder = new NotificationCompat.Builder(this, getNotificationChannelId());
builder.setContentTitle(fileName).setContentText(getString(stringResId)); builder.setContentTitle(fileName).setContentText(getString(stringResId));
if (pendingIntent != null) { if (pendingIntent != null) {
builder.setContentIntent(pendingIntent); builder.setContentIntent(pendingIntent);
@ -178,8 +239,7 @@ public class DownloadImageService extends Service {
private void updateNotification(int stringResId, String fileName, PendingIntent pendingIntent) { private void updateNotification(int stringResId, String fileName, PendingIntent pendingIntent) {
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager != null) { if (notificationManager != null) {
notificationManager.notify(isGif ? NotificationUtils.DOWNLOAD_GIF_NOTIFICATION_ID : NotificationUtils.DOWNLOAD_IMAGE_NOTIFICATION_ID, notificationManager.notify(getNotificationId(), createNotification(stringResId, fileName, pendingIntent));
createNotification(stringResId, fileName, pendingIntent));
} }
} }
@ -190,13 +250,13 @@ public class DownloadImageService extends Service {
updateNotification(R.string.downloading_image_or_gif_failed_cannot_get_destination_directory, fileName, null); updateNotification(R.string.downloading_image_or_gif_failed_cannot_get_destination_directory, fileName, null);
break; break;
case ERROR_FILE_CANNOT_DOWNLOAD: case ERROR_FILE_CANNOT_DOWNLOAD:
updateNotification(isGif ? R.string.downloading_gif_failed_cannot_download_gif : R.string.downloading_image_failed_cannot_download_image, fileName, null); updateNotification(R.string.downloading_media_failed_cannot_download_media, fileName, null);
break; break;
case ERROR_FILE_CANNOT_SAVE: case ERROR_FILE_CANNOT_SAVE:
updateNotification(isGif ? R.string.downloading_gif_failed_cannot_save_gif : R.string.downloading_image_failed_cannot_save_image, fileName, null); updateNotification(R.string.downloading_media_failed_cannot_save_to_destination_directory, fileName, null);
break; break;
} }
EventBus.getDefault().post(new DownloadImageOrGifEvent(false)); EventBus.getDefault().post(new DownloadMediaEvent(false));
} else { } else {
MediaScannerConnection.scanFile( MediaScannerConnection.scanFile(
this, new String[]{destinationFileUri.toString()}, null, this, new String[]{destinationFileUri.toString()}, null,
@ -205,8 +265,8 @@ public class DownloadImageService extends Service {
intent.setAction(android.content.Intent.ACTION_VIEW); intent.setAction(android.content.Intent.ACTION_VIEW);
intent.setDataAndType(destinationFileUri, "image/*"); intent.setDataAndType(destinationFileUri, "image/*");
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
updateNotification(isGif ? R.string.downloading_gif_finished : R.string.downloading_image_finished, fileName, pendingIntent); updateNotification(R.string.downloading_media_finished, fileName, pendingIntent);
EventBus.getDefault().post(new DownloadImageOrGifEvent(true)); EventBus.getDefault().post(new DownloadMediaEvent(true));
} }
); );
} }
@ -216,7 +276,7 @@ public class DownloadImageService extends Service {
private static class SaveImageOrGifAndCopyToExternalStorageAsyncTask extends AsyncTask<Void, Integer, Void> { private static class SaveImageOrGifAndCopyToExternalStorageAsyncTask extends AsyncTask<Void, Integer, Void> {
private ResponseBody response; private ResponseBody response;
private boolean isGif; private int mediaType;
private boolean isDefaultDestination; private boolean isDefaultDestination;
private String destinationFileName; private String destinationFileName;
@NonNull @NonNull
@ -230,14 +290,14 @@ public class DownloadImageService extends Service {
void updateProgressNotification(int stringResId); void updateProgressNotification(int stringResId);
} }
public SaveImageOrGifAndCopyToExternalStorageAsyncTask(ResponseBody response, boolean isGif, public SaveImageOrGifAndCopyToExternalStorageAsyncTask(ResponseBody response, int mediaType,
boolean isDefaultDestination, boolean isDefaultDestination,
String destinationFileName, String destinationFileName,
@NonNull String destinationFileUriString, @NonNull String destinationFileUriString,
ContentResolver contentResolver, ContentResolver contentResolver,
SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener saveImageOrGifAndCopyToExternalStorageAsyncTaskListener) { SaveImageOrGifAndCopyToExternalStorageAsyncTaskListener saveImageOrGifAndCopyToExternalStorageAsyncTaskListener) {
this.response = response; this.response = response;
this.isGif = isGif; this.mediaType = mediaType;
this.isDefaultDestination = isDefaultDestination; this.isDefaultDestination = isDefaultDestination;
this.destinationFileName = destinationFileName; this.destinationFileName = destinationFileName;
this.destinationFileUriString = destinationFileUriString; this.destinationFileUriString = destinationFileUriString;
@ -253,7 +313,17 @@ public class DownloadImageService extends Service {
@Override @Override
protected Void doInBackground(Void... voids) { protected Void doInBackground(Void... voids) {
publishProgress(isGif ? R.string.downloading_gif_save_gif : R.string.downloading_image_save_image); switch (mediaType) {
case EXTRA_MEDIA_TYPE_IMAGE:
publishProgress(R.string.downloading_image_save_image);
break;
case EXTRA_MEDIA_TYPE_GIF:
publishProgress(R.string.downloading_gif_save_gif);
break;
case EXTRA_MEDIA_TYPE_VIDEO:
publishProgress(R.string.downloading_video_save_video);
}
try { try {
writeResponseBodyToDisk(response); writeResponseBodyToDisk(response);
} catch (IOException e) { } catch (IOException e) {

View File

@ -53,7 +53,7 @@ import retrofit2.Retrofit;
import static android.os.Environment.getExternalStoragePublicDirectory; import static android.os.Environment.getExternalStoragePublicDirectory;
public class DownloadVideoService extends Service { public class DownloadRedditVideoService extends Service {
public static final String EXTRA_VIDEO_URL = "EVU"; public static final String EXTRA_VIDEO_URL = "EVU";
public static final String EXTRA_SUBREDDIT = "ES"; public static final String EXTRA_SUBREDDIT = "ES";
@ -78,7 +78,7 @@ public class DownloadVideoService extends Service {
CustomThemeWrapper mCustomThemeWrapper; CustomThemeWrapper mCustomThemeWrapper;
String resultFile; String resultFile;
public DownloadVideoService() { public DownloadRedditVideoService() {
} }
@Override @Override

View File

@ -843,18 +843,16 @@
<string name="downloading_reddit_video_failed_cannot_mux">Download failed: cannot mux video and audio</string> <string name="downloading_reddit_video_failed_cannot_mux">Download failed: cannot mux video and audio</string>
<string name="downloading_reddit_video_failed_cannot_save_mux_video">Download failed: cannot save the video to public directory</string> <string name="downloading_reddit_video_failed_cannot_save_mux_video">Download failed: cannot save the video to public directory</string>
<string name="downloading_video">Downloading Video</string> <string name="downloading_video">Downloading Video</string>
<string name="downloading_video_save_video">Saving Video</string>
<string name="downloading_image">Downloading Image</string> <string name="downloading_image">Downloading Image</string>
<string name="downloading_gif">Downloading Gif</string> <string name="downloading_gif">Downloading Gif</string>
<string name="downloading_image_save_image">Saving Image</string> <string name="downloading_image_save_image">Saving Image</string>
<string name="downloading_gif_save_gif">Saving Gif</string> <string name="downloading_gif_save_gif">Saving Gif</string>
<string name="downloading_image_finished">Downloaded</string> <string name="downloading_media_finished">Downloaded</string>
<string name="downloading_gif_finished">Downloaded</string>
<string name="downloading_image_or_gif_failed_cannot_get_destination_directory">Download failed: cannot access destination directory</string> <string name="downloading_image_or_gif_failed_cannot_get_destination_directory">Download failed: cannot access destination directory</string>
<string name="downloading_image_failed_cannot_download_image">Download image failed</string> <string name="downloading_media_failed_cannot_download_media">Download failed</string>
<string name="downloading_image_failed_cannot_save_image">Download failed: cannot save image to destination directory</string> <string name="downloading_media_failed_cannot_save_to_destination_directory">Download failed: cannot save the file to destination directory</string>
<string name="downloading_gif_failed_cannot_download_gif">Download gif failed</string>
<string name="downloading_gif_failed_cannot_save_gif">Download failed: cannot save gif to destination directory</string>
<string name="wallpaper_set">Wallpaper set</string> <string name="wallpaper_set">Wallpaper set</string>
<string name="error_set_wallpaper">Cannot set wallpaper</string> <string name="error_set_wallpaper">Cannot set wallpaper</string>