Resolve conflicts: Some refactors on media activities.

This commit is contained in:
Alex Ning 2020-06-16 15:17:00 +08:00
parent 268ea4f9d8
commit 88a2119586
22 changed files with 519 additions and 908 deletions

View File

@ -40,7 +40,7 @@ dependencies {
implementation "androidx.room:room-runtime:$roomVersion" implementation "androidx.room:room-runtime:$roomVersion"
annotationProcessor "androidx.room:room-compiler:$roomVersion" annotationProcessor "androidx.room:room-compiler:$roomVersion"
implementation 'androidx.work:work-runtime:2.3.4' implementation 'androidx.work:work-runtime:2.3.4'
implementation 'com.google.android.material:material:1.2.0-alpha05' implementation 'com.google.android.material:material:1.3.0-alpha01'
implementation 'com.google.android.exoplayer:exoplayer-core:2.10.4' implementation 'com.google.android.exoplayer:exoplayer-core:2.10.4'
implementation 'com.google.android.exoplayer:exoplayer-hls:2.10.4' implementation 'com.google.android.exoplayer:exoplayer-hls:2.10.4'

View File

@ -83,10 +83,6 @@
android:label="@string/multi_reddit_listing_activity_label" android:label="@string/multi_reddit_listing_activity_label"
android:parentActivityName=".Activity.MainActivity" android:parentActivityName=".Activity.MainActivity"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar" />
<activity
android:name=".Activity.ViewGIFActivity"
android:parentActivityName=".Activity.MainActivity"
android:theme="@style/AppTheme.Draggable" />
<activity <activity
android:name=".Activity.AccountSavedThingActivity" android:name=".Activity.AccountSavedThingActivity"
android:label="@string/account_saved_thing_activity_label" android:label="@string/account_saved_thing_activity_label"
@ -290,7 +286,7 @@
android:parentActivityName=".Activity.MainActivity" android:parentActivityName=".Activity.MainActivity"
android:theme="@style/AppTheme.NoActionBar" /> android:theme="@style/AppTheme.NoActionBar" />
<activity <activity
android:name=".Activity.ViewImageActivity" android:name=".Activity.ViewImageOrGifActivity"
android:parentActivityName=".Activity.MainActivity" android:parentActivityName=".Activity.MainActivity"
android:theme="@style/AppTheme.Draggable" /> android:theme="@style/AppTheme.Draggable" />
<activity <activity

View File

@ -79,20 +79,20 @@ public class LinkResolverActivity extends AppCompatActivity {
} }
if (path.endsWith("jpg") || path.endsWith("png")) { if (path.endsWith("jpg") || path.endsWith("png")) {
Intent intent = new Intent(this, ViewImageActivity.class); Intent intent = new Intent(this, ViewImageOrGifActivity.class);
String url = uri.toString(); String url = uri.toString();
String fileName = url.substring(url.lastIndexOf('/') + 1); String fileName = url.substring(url.lastIndexOf('/') + 1);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, url); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, url);
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, fileName); intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, fileName);
intent.putExtra(ViewImageActivity.POST_TITLE_KEY, fileName); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, fileName);
startActivity(intent); startActivity(intent);
} else if (path.endsWith("gif")) { } else if (path.endsWith("gif")) {
Intent intent = new Intent(this, ViewGIFActivity.class); Intent intent = new Intent(this, ViewImageOrGifActivity.class);
String url = uri.toString(); String url = uri.toString();
String fileName = url.substring(url.lastIndexOf('/') + 1); String fileName = url.substring(url.lastIndexOf('/') + 1);
intent.putExtra(ViewGIFActivity.GIF_URL_KEY, url); intent.putExtra(ViewImageOrGifActivity.GIF_URL_KEY, url);
intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, fileName); intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, fileName);
intent.putExtra(ViewGIFActivity.POST_TITLE_KEY, fileName); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, fileName);
startActivity(intent); startActivity(intent);
} else if (path.endsWith("mp4")) { } else if (path.endsWith("mp4")) {
Intent intent = new Intent(this, ViewVideoActivity.class); Intent intent = new Intent(this, ViewVideoActivity.class);

View File

@ -1,324 +0,0 @@
package ml.docilealligator.infinityforreddit.Activity;
import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageManager;
import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Build;
import android.os.Bundle;
import android.os.Environment;
import android.text.Html;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider;
import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.RequestOptions;
import com.bumptech.glide.request.target.Target;
import com.thefuntasty.hauler.DragDirection;
import com.thefuntasty.hauler.HaulerView;
import java.io.File;
import javax.inject.Inject;
import javax.inject.Named;
import butterknife.BindView;
import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.AsyncTask.SaveGIFToFileAsyncTask;
import ml.docilealligator.infinityforreddit.BuildConfig;
import ml.docilealligator.infinityforreddit.Font.ContentFontFamily;
import ml.docilealligator.infinityforreddit.Font.ContentFontStyle;
import ml.docilealligator.infinityforreddit.Font.FontFamily;
import ml.docilealligator.infinityforreddit.Font.FontStyle;
import ml.docilealligator.infinityforreddit.Font.TitleFontFamily;
import ml.docilealligator.infinityforreddit.Font.TitleFontStyle;
import ml.docilealligator.infinityforreddit.Infinity;
import ml.docilealligator.infinityforreddit.R;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import pl.droidsonroids.gif.GifImageView;
public class ViewGIFActivity extends AppCompatActivity {
public static final String GIF_URL_KEY = "GUK";
public static final String FILE_NAME_KEY = "FNK";
public static final String POST_TITLE_KEY = "PTK";
private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
@BindView(R.id.hauler_view_view_gif_activity)
HaulerView mHaulerView;
@BindView(R.id.progress_bar_view_gif_activity)
ProgressBar mProgressBar;
@BindView(R.id.image_view_view_gif_activity)
GifImageView mImageView;
@BindView(R.id.load_image_error_linear_layout_view_gif_activity)
LinearLayout mLoadErrorLinearLayout;
@Inject
@Named("default")
SharedPreferences mSharedPreferences;
private boolean isActionBarHidden = false;
private boolean isDownloading = false;
private RequestManager glide;
private String mImageUrl;
private String mImageFileName;
private boolean isSwiping = false;
private String postTitle;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
((Infinity) getApplication()).getAppComponent().inject(this);
getTheme().applyStyle(R.style.Theme_Normal, true);
getTheme().applyStyle(FontStyle.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.FONT_SIZE_KEY, FontStyle.Normal.name())).getResId(), true);
getTheme().applyStyle(TitleFontStyle.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.TITLE_FONT_SIZE_KEY, TitleFontStyle.Normal.name())).getResId(), true);
getTheme().applyStyle(ContentFontStyle.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.CONTENT_FONT_SIZE_KEY, ContentFontStyle.Normal.name())).getResId(), true);
getTheme().applyStyle(FontFamily.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.FONT_FAMILY_KEY, FontFamily.Default.name())).getResId(), true);
getTheme().applyStyle(TitleFontFamily.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.TITLE_FONT_FAMILY_KEY, TitleFontFamily.Default.name())).getResId(), true);
getTheme().applyStyle(ContentFontFamily.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.CONTENT_FONT_FAMILY_KEY, ContentFontFamily.Default.name())).getResId(), true);
setContentView(R.layout.activity_view_gif);
ButterKnife.bind(this);
ActionBar actionBar = getSupportActionBar();
Drawable upArrow = getResources().getDrawable(R.drawable.ic_arrow_back_white_24dp);
actionBar.setHomeAsUpIndicator(upArrow);
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor)));
mHaulerView.setOnDragDismissedListener(dragDirection -> {
int slide = dragDirection == DragDirection.UP ? R.anim.slide_out_up : R.anim.slide_out_down;
finish();
overridePendingTransition(0, slide);
});
glide = Glide.with(this);
Intent intent = getIntent();
mImageUrl = intent.getStringExtra(GIF_URL_KEY);
mImageFileName = intent.getStringExtra(FILE_NAME_KEY);
postTitle = intent.getStringExtra(POST_TITLE_KEY);
if (postTitle != null) {
setTitle(Html.fromHtml(String.format("<small>%s</small>", postTitle)));
} else {
setTitle("");
}
mLoadErrorLinearLayout.setOnClickListener(view -> {
if (!isSwiping) {
mProgressBar.setVisibility(View.VISIBLE);
mLoadErrorLinearLayout.setVisibility(View.GONE);
loadImage();
}
});
loadImage();
mImageView.setOnClickListener(view -> {
if (isActionBarHidden) {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN);
isActionBarHidden = false;
} else {
getWindow().getDecorView().setSystemUiVisibility(
View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE);
isActionBarHidden = true;
}
});
}
private void loadImage() {
glide.load(mImageUrl).listener(new RequestListener<Drawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
mLoadErrorLinearLayout.setVisibility(View.VISIBLE);
return false;
}
@Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
mProgressBar.setVisibility(View.GONE);
return false;
}
}).apply(new RequestOptions().fitCenter()).into(mImageView);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.view_gif_activity, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
finish();
return true;
case R.id.action_download_view_gif_activity:
if (isDownloading) {
return false;
}
isDownloading = true;
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE)
!= PackageManager.PERMISSION_GRANTED) {
// Permission is not granted
// No explanation needed; request the permission
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},
PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
} else {
// Permission has already been granted
download();
}
} else {
download();
}
return true;
case R.id.action_share_view_gif_activity:
Toast.makeText(ViewGIFActivity.this, R.string.save_gif_first, Toast.LENGTH_SHORT).show();
glide.asGif().load(mImageUrl).listener(new RequestListener<GifDrawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
if (getExternalCacheDir() != null) {
new SaveGIFToFileAsyncTask(resource, getExternalCacheDir().getPath(), mImageFileName,
new SaveGIFToFileAsyncTask.SaveGIFToFileAsyncTaskListener() {
@Override
public void saveSuccess(File imageFile) {
Uri uri = FileProvider.getUriForFile(ViewGIFActivity.this,
BuildConfig.APPLICATION_ID + ".provider", imageFile);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
}
@Override
public void saveFailed() {
Toast.makeText(ViewGIFActivity.this,
R.string.cannot_save_gif, Toast.LENGTH_SHORT).show();
}
}).execute();
} else {
Toast.makeText(ViewGIFActivity.this,
R.string.cannot_get_storage, Toast.LENGTH_SHORT).show();
}
return false;
}
}).submit();
return true;
}
return false;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE && grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) {
download();
}
isDownloading = false;
}
}
private void download() {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(mImageUrl));
request.setTitle(mImageFileName);
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//Android Q support
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, mImageFileName);
} else {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File directory = new File(path + "/Infinity/");
boolean saveToInfinityFolder = true;
if (!directory.exists()) {
if (!directory.mkdir()) {
saveToInfinityFolder = false;
}
} else {
if (directory.isFile()) {
if (!(directory.delete() && directory.mkdir())) {
saveToInfinityFolder = false;
}
}
}
if (saveToInfinityFolder) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES + "/Infinity/", mImageFileName);
} else {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, mImageFileName);
}
}
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (manager == null) {
Toast.makeText(this, R.string.download_failed, Toast.LENGTH_SHORT).show();
return;
}
manager.enqueue(request);
Toast.makeText(this, R.string.download_started, Toast.LENGTH_SHORT).show();
}
}

View File

@ -1,27 +1,19 @@
package ml.docilealligator.infinityforreddit.Activity; package ml.docilealligator.infinityforreddit.Activity;
import android.Manifest; import android.Manifest;
import android.app.DownloadManager;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.text.Html; import android.text.Html;
import android.util.DisplayMetrics;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast; import android.widget.Toast;
@ -34,11 +26,12 @@ import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat; import androidx.core.content.ContextCompat;
import androidx.core.content.FileProvider; import androidx.core.content.FileProvider;
import com.alexvasilkov.gestures.views.GestureImageView; import com.alexvasilkov.gestures.views.GestureFrameLayout;
import com.bumptech.glide.Glide; import com.bumptech.glide.Glide;
import com.bumptech.glide.RequestManager; import com.bumptech.glide.RequestManager;
import com.bumptech.glide.load.DataSource; import com.bumptech.glide.load.DataSource;
import com.bumptech.glide.load.engine.GlideException; import com.bumptech.glide.load.engine.GlideException;
import com.bumptech.glide.load.resource.gif.GifDrawable;
import com.bumptech.glide.request.RequestListener; import com.bumptech.glide.request.RequestListener;
import com.bumptech.glide.request.target.CustomTarget; import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.target.Target; import com.bumptech.glide.request.target.Target;
@ -47,13 +40,13 @@ import com.thefuntasty.hauler.DragDirection;
import com.thefuntasty.hauler.HaulerView; import com.thefuntasty.hauler.HaulerView;
import java.io.File; import java.io.File;
import java.io.IOException;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
import butterknife.BindView; import butterknife.BindView;
import butterknife.ButterKnife; import butterknife.ButterKnife;
import ml.docilealligator.infinityforreddit.AsyncTask.SaveGIFToFileAsyncTask;
import ml.docilealligator.infinityforreddit.AsyncTask.SaveImageToFileAsyncTask; import ml.docilealligator.infinityforreddit.AsyncTask.SaveImageToFileAsyncTask;
import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment; import ml.docilealligator.infinityforreddit.BottomSheetFragment.SetAsWallpaperBottomSheetFragment;
import ml.docilealligator.infinityforreddit.BuildConfig; import ml.docilealligator.infinityforreddit.BuildConfig;
@ -64,32 +57,42 @@ 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.SetAsWallpaperCallback; import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.WallpaperSetter;
import pl.droidsonroids.gif.GifImageView;
public class ViewImageActivity extends AppCompatActivity implements SetAsWallpaperCallback { public class ViewImageOrGifActivity extends AppCompatActivity implements SetAsWallpaperCallback {
public static final String IMAGE_URL_KEY = "IUK"; public static final String IMAGE_URL_KEY = "IUK";
public static final String GIF_URL_KEY = "GUK";
public static final String FILE_NAME_KEY = "FNK"; public static final String FILE_NAME_KEY = "FNK";
public static final String POST_TITLE_KEY = "PTK"; public static final String POST_TITLE_KEY = "PTK";
private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0; private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
@BindView(R.id.hauler_view_view_image_activity) @BindView(R.id.hauler_view_view_image_or_gif_activity)
HaulerView mHaulerView; HaulerView mHaulerView;
@BindView(R.id.progress_bar_view_image_activity) @BindView(R.id.progress_bar_view_image_or_gif_activity)
ProgressBar mProgressBar; ProgressBar mProgressBar;
@BindView(R.id.image_view_view_image_activity) @BindView(R.id.image_view_view_image_or_gif_activity)
GestureImageView mImageView; GifImageView mImageView;
@BindView(R.id.load_image_error_linear_layout_view_image_activity) @BindView(R.id.gesture_layout_view_image_or_gif_activity)
GestureFrameLayout gestureLayout;
@BindView(R.id.load_image_error_linear_layout_view_image_or_gif_activity)
LinearLayout mLoadErrorLinearLayout; LinearLayout mLoadErrorLinearLayout;
@Inject @Inject
@Named("default") @Named("default")
SharedPreferences mSharedPreferences; SharedPreferences mSharedPreferences;
private MediaDownloader mediaDownloader;
private WallpaperSetter wallpaperSetter;
private boolean isActionBarHidden = false; private boolean isActionBarHidden = false;
private boolean isDownloading = false; private boolean isDownloading = false;
private RequestManager glide;
private String mImageUrl; private String mImageUrl;
private String mImageFileName; private String mImageFileName;
private RequestManager glide; private boolean isGif = true;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -117,7 +120,7 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
getTheme().applyStyle(ContentFontFamily.valueOf(mSharedPreferences getTheme().applyStyle(ContentFontFamily.valueOf(mSharedPreferences
.getString(SharedPreferencesUtils.CONTENT_FONT_FAMILY_KEY, ContentFontFamily.Default.name())).getResId(), true); .getString(SharedPreferencesUtils.CONTENT_FONT_FAMILY_KEY, ContentFontFamily.Default.name())).getResId(), true);
setContentView(R.layout.activity_view_image); setContentView(R.layout.activity_view_image_or_gif);
ButterKnife.bind(this); ButterKnife.bind(this);
@ -126,10 +129,19 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
actionBar.setHomeAsUpIndicator(upArrow); actionBar.setHomeAsUpIndicator(upArrow);
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor))); actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor)));
mHaulerView.setOnDragDismissedListener(dragDirection -> finish());
mediaDownloader = new MediaDownloaderImpl();
wallpaperSetter = new WallpaperSetter();
glide = Glide.with(this); glide = Glide.with(this);
Intent intent = getIntent(); Intent intent = getIntent();
mImageUrl = intent.getStringExtra(IMAGE_URL_KEY); mImageUrl = intent.getStringExtra(GIF_URL_KEY);
if (mImageUrl == null) {
isGif = false;
mImageUrl = intent.getStringExtra(IMAGE_URL_KEY);
}
mImageFileName = intent.getStringExtra(FILE_NAME_KEY); mImageFileName = intent.getStringExtra(FILE_NAME_KEY);
String postTitle = intent.getStringExtra(POST_TITLE_KEY); String postTitle = intent.getStringExtra(POST_TITLE_KEY);
@ -153,7 +165,7 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
loadImage(); loadImage();
mImageView.getController().getSettings().setMaxZoom(10f).setDoubleTapZoom(2f).setPanEnabled(true); gestureLayout.getController().getSettings().setMaxZoom(10f).setDoubleTapZoom(2f).setPanEnabled(true);
mImageView.setOnClickListener(view -> { mImageView.setOnClickListener(view -> {
if (isActionBarHidden) { if (isActionBarHidden) {
@ -194,7 +206,9 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
@Override @Override
public boolean onCreateOptionsMenu(Menu menu) { public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.view_image_activity, menu); getMenuInflater().inflate(R.menu.view_image_or_gif_activity, menu);
if (!isGif)
menu.findItem(R.id.action_set_wallpaper_view_image_or_gif_activity).setVisible(true);
return true; return true;
} }
@ -204,7 +218,7 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
case android.R.id.home: case android.R.id.home:
finish(); finish();
return true; return true;
case R.id.action_download_view_image_activity: case R.id.action_download_view_image_or_gif_activity:
if (isDownloading) { if (isDownloading) {
return false; return false;
} }
@ -223,59 +237,27 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
} else { } else {
// Permission has already been granted // Permission has already been granted
download(); mediaDownloader.download(mImageUrl, mImageFileName, this);
} }
} else { } else {
download(); mediaDownloader.download(mImageUrl, mImageFileName, this);
} }
return true; return true;
case R.id.action_share_view_image_activity: case R.id.action_share_view_image_or_gif_activity:
glide.asBitmap().load(mImageUrl).into(new CustomTarget<Bitmap>() { if (isGif)
shareGif();
@Override else
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { shareImage();
if (getExternalCacheDir() != null) {
Toast.makeText(ViewImageActivity.this, R.string.save_image_first, Toast.LENGTH_SHORT).show();
new SaveImageToFileAsyncTask(resource, getExternalCacheDir().getPath(), mImageFileName,
new SaveImageToFileAsyncTask.SaveImageToFileAsyncTaskListener() {
@Override
public void saveSuccess(File imageFile) {
Uri uri = FileProvider.getUriForFile(ViewImageActivity.this,
BuildConfig.APPLICATION_ID + ".provider", imageFile);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
}
@Override
public void saveFailed() {
Toast.makeText(ViewImageActivity.this,
R.string.cannot_save_image, Toast.LENGTH_SHORT).show();
}
}).execute();
} else {
Toast.makeText(ViewImageActivity.this,
R.string.cannot_get_storage, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
return true; return true;
case R.id.action_set_wallpaper_view_image_or_gif_activity:
case R.id.action_set_wallpaper_view_image_activity: if (!isGif) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
SetAsWallpaperBottomSheetFragment setAsWallpaperBottomSheetFragment = new SetAsWallpaperBottomSheetFragment(); SetAsWallpaperBottomSheetFragment setAsWallpaperBottomSheetFragment = new SetAsWallpaperBottomSheetFragment();
setAsWallpaperBottomSheetFragment.show(getSupportFragmentManager(), setAsWallpaperBottomSheetFragment.getTag()); setAsWallpaperBottomSheetFragment.show(getSupportFragmentManager(), setAsWallpaperBottomSheetFragment.getTag());
} else { } else {
setAsWallpaper(2); wallpaperSetter.set(mImageUrl, WallpaperSetter.BOTH_SCREENS, this);
}
} }
return true; return true;
} }
@ -283,117 +265,36 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
return false; return false;
} }
@Override private void shareImage() {
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE && grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) {
download();
}
isDownloading = false;
}
}
private void download() {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(mImageUrl));
request.setTitle(mImageFileName);
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//Android Q support
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, mImageFileName);
} else {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File directory = new File(path + "/Infinity/");
boolean saveToInfinityFolder = true;
if (!directory.exists()) {
if (!directory.mkdir()) {
saveToInfinityFolder = false;
}
} else {
if (directory.isFile()) {
if (!(directory.delete() && directory.mkdir())) {
saveToInfinityFolder = false;
}
}
}
if (saveToInfinityFolder) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES + "/Infinity/", mImageFileName);
} else {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, mImageFileName);
}
}
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (manager == null) {
Toast.makeText(this, R.string.download_failed, Toast.LENGTH_SHORT).show();
return;
}
manager.enqueue(request);
Toast.makeText(this, R.string.download_started, Toast.LENGTH_SHORT).show();
}
private void setAsWallpaper(int setTo) {
Toast.makeText(ViewImageActivity.this, R.string.save_image_first, Toast.LENGTH_SHORT).show();
glide.asBitmap().load(mImageUrl).into(new CustomTarget<Bitmap>() { glide.asBitmap().load(mImageUrl).into(new CustomTarget<Bitmap>() {
@Override @Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) { public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
WallpaperManager manager = WallpaperManager.getInstance(ViewImageActivity.this); if (getExternalCacheDir() != null) {
Toast.makeText(ViewImageOrGifActivity.this, R.string.save_image_first, Toast.LENGTH_SHORT).show();
new SaveImageToFileAsyncTask(resource, getExternalCacheDir().getPath(), mImageFileName,
new SaveImageToFileAsyncTask.SaveImageToFileAsyncTaskListener() {
@Override
public void saveSuccess(File imageFile) {
Uri uri = FileProvider.getUriForFile(ViewImageOrGifActivity.this,
BuildConfig.APPLICATION_ID + ".provider", imageFile);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
}
DisplayMetrics metrics = new DisplayMetrics(); @Override
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE); public void saveFailed() {
Toast.makeText(ViewImageOrGifActivity.this,
Rect rect = null; R.string.cannot_save_image, Toast.LENGTH_SHORT).show();
}
if (windowManager != null) { }).execute();
windowManager.getDefaultDisplay().getMetrics(metrics); } else {
int height = metrics.heightPixels; Toast.makeText(ViewImageOrGifActivity.this,
int width = metrics.widthPixels; R.string.cannot_get_storage, Toast.LENGTH_SHORT).show();
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
resource = ThumbnailUtils.extractThumbnail(resource, width, height);
}
float imageAR = (float) resource.getWidth() / (float) resource.getHeight();
float screenAR = (float) width / (float) height;
if (imageAR > screenAR) {
int desiredWidth = (int) (resource.getHeight() * screenAR);
rect = new Rect((resource.getWidth() - desiredWidth) / 2, 0, resource.getWidth(), resource.getHeight());
} else {
int desiredHeight = (int) (resource.getWidth() / screenAR);
rect = new Rect(0, (resource.getHeight() - desiredHeight) / 2, resource.getWidth(), (resource.getHeight() + desiredHeight) / 2);
}
}
try {
switch (setTo) {
case 0:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_SYSTEM);
}
break;
case 1:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_LOCK);
}
break;
case 2:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK);
} else {
manager.setBitmap(resource);
}
break;
}
Toast.makeText(ViewImageActivity.this, R.string.wallpaper_set, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(ViewImageActivity.this, R.string.error_set_wallpaper, Toast.LENGTH_SHORT).show();
} }
} }
@ -404,18 +305,70 @@ public class ViewImageActivity extends AppCompatActivity implements SetAsWallpap
}); });
} }
private void shareGif() {
Toast.makeText(ViewImageOrGifActivity.this, R.string.save_gif_first, Toast.LENGTH_SHORT).show();
glide.asGif().load(mImageUrl).listener(new RequestListener<GifDrawable>() {
@Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<GifDrawable> target, boolean isFirstResource) {
return false;
}
@Override
public boolean onResourceReady(GifDrawable resource, Object model, Target<GifDrawable> target, DataSource dataSource, boolean isFirstResource) {
if (getExternalCacheDir() != null) {
new SaveGIFToFileAsyncTask(resource, getExternalCacheDir().getPath(), mImageFileName,
new SaveGIFToFileAsyncTask.SaveGIFToFileAsyncTaskListener() {
@Override
public void saveSuccess(File imageFile) {
Uri uri = FileProvider.getUriForFile(ViewImageOrGifActivity.this,
BuildConfig.APPLICATION_ID + ".provider", imageFile);
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
shareIntent.setType("image/*");
shareIntent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
startActivity(Intent.createChooser(shareIntent, getString(R.string.share)));
}
@Override
public void saveFailed() {
Toast.makeText(ViewImageOrGifActivity.this,
R.string.cannot_save_gif, Toast.LENGTH_SHORT).show();
}
}).execute();
} else {
Toast.makeText(ViewImageOrGifActivity.this,
R.string.cannot_get_storage, Toast.LENGTH_SHORT).show();
}
return false;
}
}).submit();
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE && grantResults.length > 0) {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(this, R.string.no_storage_permission, Toast.LENGTH_SHORT).show();
} else if (grantResults[0] == PackageManager.PERMISSION_GRANTED && isDownloading) {
mediaDownloader.download(mImageUrl, mImageFileName, this);
}
isDownloading = false;
}
}
@Override @Override
public void setToHomeScreen(int viewPagerPosition) { public void setToHomeScreen(int viewPagerPosition) {
setAsWallpaper(0); wallpaperSetter.set(mImageUrl, WallpaperSetter.HOME_SCREEN, this);
} }
@Override @Override
public void setToLockScreen(int viewPagerPosition) { public void setToLockScreen(int viewPagerPosition) {
setAsWallpaper(1); wallpaperSetter.set(mImageUrl, WallpaperSetter.LOCK_SCREEN, this);
} }
@Override @Override
public void setToBoth(int viewPagerPosition) { public void setToBoth(int viewPagerPosition) {
setAsWallpaper(2); wallpaperSetter.set(mImageUrl, WallpaperSetter.BOTH_SCREENS, this);
} }
} }

View File

@ -1,27 +1,17 @@
package ml.docilealligator.infinityforreddit.Activity; package ml.docilealligator.infinityforreddit.Activity;
import android.app.WallpaperManager;
import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.ColorDrawable;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.os.AsyncTask; import android.os.AsyncTask;
import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.util.DisplayMetrics;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.WindowManager;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ProgressBar; import android.widget.ProgressBar;
import android.widget.Toast;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar; import androidx.appcompat.app.ActionBar;
import androidx.appcompat.app.AppCompatActivity; import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment; import androidx.fragment.app.Fragment;
@ -29,9 +19,6 @@ import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentStatePagerAdapter; import androidx.fragment.app.FragmentStatePagerAdapter;
import androidx.viewpager.widget.ViewPager; import androidx.viewpager.widget.ViewPager;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import com.thefuntasty.hauler.DragDirection; import com.thefuntasty.hauler.DragDirection;
import com.thefuntasty.hauler.HaulerView; import com.thefuntasty.hauler.HaulerView;
@ -39,7 +26,6 @@ import org.json.JSONArray;
import org.json.JSONException; import org.json.JSONException;
import org.json.JSONObject; import org.json.JSONObject;
import java.io.IOException;
import java.util.ArrayList; import java.util.ArrayList;
import javax.inject.Inject; import javax.inject.Inject;
@ -63,6 +49,7 @@ import ml.docilealligator.infinityforreddit.SetAsWallpaperCallback;
import ml.docilealligator.infinityforreddit.Utils.APIUtils; import ml.docilealligator.infinityforreddit.Utils.APIUtils;
import ml.docilealligator.infinityforreddit.Utils.JSONUtils; import ml.docilealligator.infinityforreddit.Utils.JSONUtils;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
import ml.docilealligator.infinityforreddit.WallpaperSetter;
import retrofit2.Call; import retrofit2.Call;
import retrofit2.Callback; import retrofit2.Callback;
import retrofit2.Response; import retrofit2.Response;
@ -93,6 +80,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa
@Inject @Inject
@Named("default") @Named("default")
SharedPreferences sharedPreferences; SharedPreferences sharedPreferences;
private WallpaperSetter wallpaperSetter;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
@ -129,6 +117,8 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa
actionBar.setHomeAsUpIndicator(upArrow); actionBar.setHomeAsUpIndicator(upArrow);
actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor))); actionBar.setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor)));
wallpaperSetter = new WallpaperSetter();
setTitle(" "); setTitle(" ");
String imgurId = getIntent().getStringExtra(EXTRA_IMGUR_ID); String imgurId = getIntent().getStringExtra(EXTRA_IMGUR_ID);
@ -154,9 +144,7 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa
setupViewPager(); setupViewPager();
} }
errorLinearLayout.setOnClickListener(view -> { errorLinearLayout.setOnClickListener(view -> fetchImgurMedia(imgurId));
fetchImgurMedia(imgurId);
});
} }
private void fetchImgurMedia(String imgurId) { private void fetchImgurMedia(String imgurId) {
@ -322,89 +310,24 @@ public class ViewImgurMediaActivity extends AppCompatActivity implements SetAsWa
outState.putParcelableArrayList(IMGUR_IMAGES_STATE, images); outState.putParcelableArrayList(IMGUR_IMAGES_STATE, images);
} }
public void setAsWallpaper(String link, int setTo) {
Toast.makeText(ViewImgurMediaActivity.this, R.string.save_image_first, Toast.LENGTH_SHORT).show();
Glide.with(this).asBitmap().load(link).into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
WallpaperManager manager = WallpaperManager.getInstance(ViewImgurMediaActivity.this);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) getSystemService(Context.WINDOW_SERVICE);
Rect rect = null;
if (windowManager != null) {
windowManager.getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
resource = ThumbnailUtils.extractThumbnail(resource, width, height);
}
float imageAR = (float) resource.getWidth() / (float) resource.getHeight();
float screenAR = (float) width / (float) height;
if (imageAR > screenAR) {
int desiredWidth = (int) (resource.getHeight() * screenAR);
rect = new Rect((resource.getWidth() - desiredWidth) / 2, 0, resource.getWidth(), resource.getHeight());
} else {
int desiredHeight = (int) (resource.getWidth() / screenAR);
rect = new Rect(0, (resource.getHeight() - desiredHeight) / 2, resource.getWidth(), (resource.getHeight() + desiredHeight) / 2);
}
}
try {
switch (setTo) {
case 0:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_SYSTEM);
}
break;
case 1:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_LOCK);
}
break;
case 2:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK);
} else {
manager.setBitmap(resource);
}
break;
}
Toast.makeText(ViewImgurMediaActivity.this, R.string.wallpaper_set, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(ViewImgurMediaActivity.this, R.string.error_set_wallpaper, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
@Override @Override
public void setToHomeScreen(int viewPagerPosition) { public void setToHomeScreen(int viewPagerPosition) {
if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) { if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) {
setAsWallpaper(images.get(viewPagerPosition).getLink(), 0); wallpaperSetter.set(images.get(viewPagerPosition).getLink(), WallpaperSetter.HOME_SCREEN, this);
} }
} }
@Override @Override
public void setToLockScreen(int viewPagerPosition) { public void setToLockScreen(int viewPagerPosition) {
if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) { if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) {
setAsWallpaper(images.get(viewPagerPosition).getLink(), 1); wallpaperSetter.set(images.get(viewPagerPosition).getLink(), WallpaperSetter.LOCK_SCREEN, this);
} }
} }
@Override @Override
public void setToBoth(int viewPagerPosition) { public void setToBoth(int viewPagerPosition) {
if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) { if (images != null && viewPagerPosition >= 0 && viewPagerPosition < images.size()) {
setAsWallpaper(images.get(viewPagerPosition).getLink(), 2); wallpaperSetter.set(images.get(viewPagerPosition).getLink(), WallpaperSetter.BOTH_SCREENS, this);
} }
} }

View File

@ -349,9 +349,9 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
} else { } else {
glide.load(subredditData.getBannerUrl()).into(bannerImageView); glide.load(subredditData.getBannerUrl()).into(bannerImageView);
bannerImageView.setOnClickListener(view -> { bannerImageView.setOnClickListener(view -> {
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class); Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getBannerUrl()); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, subredditData.getBannerUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner.jpg"); intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, subredditName + "-banner.jpg");
startActivity(intent); startActivity(intent);
}); });
} }
@ -370,9 +370,9 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
.apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0)))) .apply(RequestOptions.bitmapTransform(new RoundedCornersTransformation(216, 0))))
.into(iconGifImageView); .into(iconGifImageView);
iconGifImageView.setOnClickListener(view -> { iconGifImageView.setOnClickListener(view -> {
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class); Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getIconUrl()); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, subredditData.getIconUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon.jpg"); intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, subredditName + "-icon.jpg");
startActivity(intent); startActivity(intent);
}); });
} }

View File

@ -295,9 +295,9 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
} else { } else {
glide.load(userData.getBanner()).into(bannerImageView); glide.load(userData.getBanner()).into(bannerImageView);
bannerImageView.setOnClickListener(view -> { bannerImageView.setOnClickListener(view -> {
Intent intent = new Intent(this, ViewImageActivity.class); Intent intent = new Intent(this, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getBanner()); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, userData.getBanner());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-banner.jpg"); intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, username + "-banner.jpg");
startActivity(intent); startActivity(intent);
}); });
} }
@ -315,9 +315,9 @@ public class ViewUserDetailActivity extends BaseActivity implements SortTypeSele
.into(iconGifImageView); .into(iconGifImageView);
iconGifImageView.setOnClickListener(view -> { iconGifImageView.setOnClickListener(view -> {
Intent intent = new Intent(this, ViewImageActivity.class); Intent intent = new Intent(this, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getIconUrl()); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, userData.getIconUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-icon.jpg"); intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, username + "-icon.jpg");
startActivity(intent); startActivity(intent);
}); });
} }

View File

@ -1,8 +1,6 @@
package ml.docilealligator.infinityforreddit.Activity; package ml.docilealligator.infinityforreddit.Activity;
import android.Manifest; import android.Manifest;
import android.app.DownloadManager;
import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -13,7 +11,6 @@ import android.media.AudioManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.text.Html; import android.text.Html;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
@ -50,8 +47,6 @@ import com.google.android.exoplayer2.util.Util;
import com.thefuntasty.hauler.DragDirection; import com.thefuntasty.hauler.DragDirection;
import com.thefuntasty.hauler.HaulerView; import com.thefuntasty.hauler.HaulerView;
import java.io.File;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -62,6 +57,8 @@ import ml.docilealligator.infinityforreddit.Font.ContentFontFamily;
import ml.docilealligator.infinityforreddit.Font.FontFamily; import ml.docilealligator.infinityforreddit.Font.FontFamily;
import ml.docilealligator.infinityforreddit.Font.TitleFontFamily; import ml.docilealligator.infinityforreddit.Font.TitleFontFamily;
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.DownloadRedditVideoService; import ml.docilealligator.infinityforreddit.Service.DownloadRedditVideoService;
import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
@ -96,6 +93,7 @@ public class ViewVideoActivity extends AppCompatActivity {
private Uri mVideoUri; private Uri mVideoUri;
private SimpleExoPlayer player; private SimpleExoPlayer player;
private DataSource.Factory dataSourceFactory; private DataSource.Factory dataSourceFactory;
private MediaDownloader mediaDownloader;
private String videoDownloadUrl; private String videoDownloadUrl;
private String videoFileName; private String videoFileName;
@ -167,6 +165,8 @@ public class ViewVideoActivity extends AppCompatActivity {
overridePendingTransition(0, slide); overridePendingTransition(0, slide);
}); });
mediaDownloader = new MediaDownloaderImpl();
Intent intent = getIntent(); Intent intent = getIntent();
mVideoUri = intent.getData(); mVideoUri = intent.getData();
postTitle = intent.getStringExtra(EXTRA_POST_TITLE); postTitle = intent.getStringExtra(EXTRA_POST_TITLE);
@ -412,46 +412,7 @@ public class ViewVideoActivity extends AppCompatActivity {
isDownloading = false; isDownloading = false;
if (videoType != VIDEO_TYPE_NORMAL) { if (videoType != VIDEO_TYPE_NORMAL) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(videoDownloadUrl)); mediaDownloader.download(videoDownloadUrl, videoFileName, this);
request.setTitle(videoFileName);
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//Android Q support
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, videoFileName);
} else {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File directory = new File(path + "/Infinity/");
boolean saveToInfinityFolder = true;
if (!directory.exists()) {
if (!directory.mkdir()) {
saveToInfinityFolder = false;
}
} else {
if (directory.isFile()) {
if (!(directory.delete() && directory.mkdir())) {
saveToInfinityFolder = false;
}
}
}
if (saveToInfinityFolder) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES + "/Infinity/", videoFileName);
} else {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, videoFileName);
}
}
DownloadManager manager = (DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
if (manager == null) {
Toast.makeText(this, R.string.download_failed, Toast.LENGTH_SHORT).show();
return;
}
manager.enqueue(request);
} else { } else {
Intent intent = new Intent(this, DownloadRedditVideoService.class); Intent intent = new Intent(this, DownloadRedditVideoService.class);
intent.putExtra(DownloadRedditVideoService.EXTRA_VIDEO_URL, videoDownloadUrl); intent.putExtra(DownloadRedditVideoService.EXTRA_VIDEO_URL, videoDownloadUrl);
@ -463,8 +424,8 @@ public class ViewVideoActivity extends AppCompatActivity {
} else { } else {
startService(intent); startService(intent);
} }
Toast.makeText(this, R.string.download_started, Toast.LENGTH_SHORT).show();
} }
Toast.makeText(this, R.string.download_started, Toast.LENGTH_SHORT).show();
} }
@Override @Override

View File

@ -81,8 +81,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import ml.docilealligator.infinityforreddit.Activity.CommentActivity; import ml.docilealligator.infinityforreddit.Activity.CommentActivity;
import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity; import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity;
import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity; import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity; import ml.docilealligator.infinityforreddit.Activity.ViewImageOrGifActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity;
@ -307,7 +306,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
mShowElapsedTime = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ELAPSED_TIME_KEY, false); mShowElapsedTime = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ELAPSED_TIME_KEY, false);
mExpandChildren = !mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_TOP_LEVEL_COMMENTS_FIRST, false); mExpandChildren = !mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_TOP_LEVEL_COMMENTS_FIRST, false);
mCommentToolbarHidden = mSharedPreferences.getBoolean(SharedPreferencesUtils.COMMENT_TOOLBAR_HIDDEN, false); mCommentToolbarHidden = mSharedPreferences.getBoolean(SharedPreferencesUtils.COMMENT_TOOLBAR_HIDDEN, false);
mCommentToolbarHideOnClick= mSharedPreferences.getBoolean(SharedPreferencesUtils.COMMENT_TOOLBAR_HIDE_ON_CLICK, true); mCommentToolbarHideOnClick = mSharedPreferences.getBoolean(SharedPreferencesUtils.COMMENT_TOOLBAR_HIDE_ON_CLICK, true);
mSwapTapAndLong = mSharedPreferences.getBoolean(SharedPreferencesUtils.SWAP_TAP_AND_LONG_COMMENTS, false); mSwapTapAndLong = mSharedPreferences.getBoolean(SharedPreferencesUtils.SWAP_TAP_AND_LONG_COMMENTS, false);
mShowCommentDivider = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_COMMENT_DIVIDER, false); mShowCommentDivider = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_COMMENT_DIVIDER, false);
mShowAbsoluteNumberOfVotes = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ABSOLUTE_NUMBER_OF_VOTES, true); mShowAbsoluteNumberOfVotes = mSharedPreferences.getBoolean(SharedPreferencesUtils.SHOW_ABSOLUTE_NUMBER_OF_VOTES, true);
@ -934,7 +933,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
((LoadMoreChildCommentsViewHolder) holder).placeholderTextView.setOnClickListener(view -> { ((LoadMoreChildCommentsViewHolder) holder).placeholderTextView.setOnClickListener(view -> {
int commentPosition = mIsSingleCommentThreadMode ? holder.getAdapterPosition() - 2 : holder.getAdapterPosition() - 1; int commentPosition = mIsSingleCommentThreadMode ? holder.getAdapterPosition() - 2 : holder.getAdapterPosition() - 1;
int parentPosition = getParentPosition(commentPosition); int parentPosition = getParentPosition(commentPosition);
if(parentPosition >= 0) { if (parentPosition >= 0) {
CommentData parentComment = mVisibleComments.get(parentPosition); CommentData parentComment = mVisibleComments.get(parentPosition);
mVisibleComments.get(commentPosition).setLoadingMoreChildren(true); mVisibleComments.get(commentPosition).setLoadingMoreChildren(true);
@ -1172,7 +1171,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
} else { } else {
imageRequestBuilder.override(Target.SIZE_ORIGINAL).into(((PostDetailVideoAndGifPreviewHolder) holder).mImageView); imageRequestBuilder.override(Target.SIZE_ORIGINAL).into(((PostDetailVideoAndGifPreviewHolder) holder).mImageView);
} }
} else if(holder instanceof PostDetailLinkViewHolder) { } else if (holder instanceof PostDetailLinkViewHolder) {
RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(mPost.getPreviewUrl()) RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(mPost.getPreviewUrl())
.listener(new RequestListener<Drawable>() { .listener(new RequestListener<Drawable>() {
@Override @Override
@ -2255,11 +2254,11 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, mPost.getTitle()); intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, mPost.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} else if (mPost.getPostType() == Post.GIF_TYPE) { } else if (mPost.getPostType() == Post.GIF_TYPE) {
Intent intent = new Intent(mActivity, ViewGIFActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, mPost.getSubredditName() intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, mPost.getSubredditName()
+ "-" + mPost.getId() + ".gif"); + "-" + mPost.getId() + ".gif");
intent.putExtra(ViewGIFActivity.GIF_URL_KEY, mPost.getVideoUrl()); intent.putExtra(ViewImageOrGifActivity.GIF_URL_KEY, mPost.getVideoUrl());
intent.putExtra(ViewImageActivity.POST_TITLE_KEY, mPost.getTitle()); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, mPost.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} }
}); });
@ -2350,18 +2349,18 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
mImageView.setOnClickListener(view -> { mImageView.setOnClickListener(view -> {
if (mPost.getPostType() == Post.IMAGE_TYPE) { if (mPost.getPostType() == Post.IMAGE_TYPE) {
Intent intent = new Intent(mActivity, ViewImageActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, mPost.getUrl()); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, mPost.getUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2) intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2)
+ "-" + mPost.getId().substring(3) + ".jpg"); + "-" + mPost.getId().substring(3) + ".jpg");
intent.putExtra(ViewImageActivity.POST_TITLE_KEY, mPost.getTitle()); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, mPost.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} else if (mPost.getPostType() == Post.GIF_TYPE) { } else if (mPost.getPostType() == Post.GIF_TYPE) {
Intent intent = new Intent(mActivity, ViewGIFActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, mPost.getSubredditName() intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, mPost.getSubredditName()
+ "-" + mPost.getId() + ".gif"); + "-" + mPost.getId() + ".gif");
intent.putExtra(ViewGIFActivity.GIF_URL_KEY, mPost.getVideoUrl()); intent.putExtra(ViewImageOrGifActivity.GIF_URL_KEY, mPost.getVideoUrl());
intent.putExtra(ViewImageActivity.POST_TITLE_KEY, mPost.getTitle()); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, mPost.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} }
}); });
@ -2934,7 +2933,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
expandButton.setOnClickListener(view -> { expandButton.setOnClickListener(view -> {
if (expandButton.getVisibility() == View.VISIBLE) { if (expandButton.getVisibility() == View.VISIBLE) {
int commentPosition = mIsSingleCommentThreadMode ? getAdapterPosition() - 2 : getAdapterPosition() - 1; int commentPosition = mIsSingleCommentThreadMode ? getAdapterPosition() - 2 : getAdapterPosition() - 1;
if(commentPosition >= 0 && commentPosition < mVisibleComments.size()) { if (commentPosition >= 0 && commentPosition < mVisibleComments.size()) {
CommentData comment = getCurrentComment(); CommentData comment = getCurrentComment();
if (mVisibleComments.get(commentPosition).isExpanded()) { if (mVisibleComments.get(commentPosition).isExpanded()) {
collapseChildren(commentPosition); collapseChildren(commentPosition);

View File

@ -65,8 +65,7 @@ import jp.wasabeef.glide.transformations.BlurTransformation;
import jp.wasabeef.glide.transformations.RoundedCornersTransformation; import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity; import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity;
import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity; import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity; import ml.docilealligator.infinityforreddit.Activity.ViewImageOrGifActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewUserDetailActivity;
@ -836,9 +835,9 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
final String imageUrl = post.getUrl(); final String imageUrl = post.getUrl();
((PostCompactViewHolder) holder).imageView.setOnClickListener(view -> { ((PostCompactViewHolder) holder).imageView.setOnClickListener(view -> {
Intent intent = new Intent(mActivity, ViewImageActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, imageUrl);
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, subredditName
+ "-" + id + ".jpg"); + "-" + id + ".jpg");
mActivity.startActivity(intent); mActivity.startActivity(intent);
}); });
@ -866,11 +865,11 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
final Uri gifVideoUri = Uri.parse(post.getVideoUrl()); final Uri gifVideoUri = Uri.parse(post.getVideoUrl());
((PostCompactViewHolder) holder).imageView.setOnClickListener(view -> { ((PostCompactViewHolder) holder).imageView.setOnClickListener(view -> {
Intent intent = new Intent(mActivity, ViewGIFActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.setData(gifVideoUri); intent.setData(gifVideoUri);
intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, subredditName intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, subredditName
+ "-" + id + ".gif"); + "-" + id + ".gif");
intent.putExtra(ViewGIFActivity.GIF_URL_KEY, post.getVideoUrl()); intent.putExtra(ViewImageOrGifActivity.GIF_URL_KEY, post.getVideoUrl());
mActivity.startActivity(intent); mActivity.startActivity(intent);
}); });
@ -1209,18 +1208,18 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
String previewUrl = post.getThumbnailPreviewUrl().equals("") ? post.getPreviewUrl() : post.getThumbnailPreviewUrl(); String previewUrl = post.getThumbnailPreviewUrl().equals("") ? post.getPreviewUrl() : post.getThumbnailPreviewUrl();
RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(previewUrl) RequestBuilder<Drawable> imageRequestBuilder = mGlide.load(previewUrl)
.error(R.drawable.ic_error_outline_black_24dp).listener(new RequestListener<Drawable>() { .error(R.drawable.ic_error_outline_black_24dp).listener(new RequestListener<Drawable>() {
@Override @Override
public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) { public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
((PostCompactViewHolder) holder).progressBar.setVisibility(View.GONE); ((PostCompactViewHolder) holder).progressBar.setVisibility(View.GONE);
return false; return false;
} }
@Override @Override
public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) { public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
((PostCompactViewHolder) holder).progressBar.setVisibility(View.GONE); ((PostCompactViewHolder) holder).progressBar.setVisibility(View.GONE);
return false; return false;
} }
}); });
if ((post.isNSFW() && mNeedBlurNSFW) || post.isSpoiler() && mNeedBlurSpoiler) { if ((post.isNSFW() && mNeedBlurNSFW) || post.isSpoiler() && mNeedBlurSpoiler) {
imageRequestBuilder imageRequestBuilder
.transform(new BlurTransformation(50, 2)) .transform(new BlurTransformation(50, 2))
@ -1310,7 +1309,7 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
public void removeFooter() { public void removeFooter() {
if (hasExtraRow()) { if (hasExtraRow()) {
notifyItemRemoved(getItemCount() - 1); notifyItemRemoved(getItemCount() - 1);
} }
networkState = null; networkState = null;
@ -2144,11 +2143,11 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, post.getTitle()); intent.putExtra(ViewVideoActivity.EXTRA_POST_TITLE, post.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} else if (post.getPostType() == Post.GIF_TYPE) { } else if (post.getPostType() == Post.GIF_TYPE) {
Intent intent = new Intent(mActivity, ViewGIFActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, post.getSubredditName() intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, post.getSubredditName()
+ "-" + post.getId() + ".gif"); + "-" + post.getId() + ".gif");
intent.putExtra(ViewGIFActivity.GIF_URL_KEY, post.getVideoUrl()); intent.putExtra(ViewImageOrGifActivity.GIF_URL_KEY, post.getVideoUrl());
intent.putExtra(ViewGIFActivity.POST_TITLE_KEY, post.getTitle()); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, post.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} }
} }
@ -2243,18 +2242,18 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
Post post = getItem(getAdapterPosition()); Post post = getItem(getAdapterPosition());
if (post != null) { if (post != null) {
if (post.getPostType() == Post.IMAGE_TYPE) { if (post.getPostType() == Post.IMAGE_TYPE) {
Intent intent = new Intent(mActivity, ViewImageActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, post.getUrl()); intent.putExtra(ViewImageOrGifActivity.IMAGE_URL_KEY, post.getUrl());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, post.getSubredditName() intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, post.getSubredditName()
+ "-" + post.getId() + ".jpg"); + "-" + post.getId() + ".jpg");
intent.putExtra(ViewImageActivity.POST_TITLE_KEY, post.getTitle()); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, post.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} else if (post.getPostType() == Post.GIF_TYPE) { } else if (post.getPostType() == Post.GIF_TYPE) {
Intent intent = new Intent(mActivity, ViewGIFActivity.class); Intent intent = new Intent(mActivity, ViewImageOrGifActivity.class);
intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, post.getSubredditName() intent.putExtra(ViewImageOrGifActivity.FILE_NAME_KEY, post.getSubredditName()
+ "-" + post.getId() + ".gif"); + "-" + post.getId() + ".gif");
intent.putExtra(ViewGIFActivity.GIF_URL_KEY, post.getVideoUrl()); intent.putExtra(ViewImageOrGifActivity.GIF_URL_KEY, post.getVideoUrl());
intent.putExtra(ViewGIFActivity.POST_TITLE_KEY, post.getTitle()); intent.putExtra(ViewImageOrGifActivity.POST_TITLE_KEY, post.getTitle());
mActivity.startActivity(intent); mActivity.startActivity(intent);
} }
} }
@ -2507,7 +2506,7 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
@BindView(R.id.share_button_item_post_text_type) @BindView(R.id.share_button_item_post_text_type)
ImageView shareButton; ImageView shareButton;
PostTextTypeViewHolder (View itemView) { PostTextTypeViewHolder(View itemView) {
super(itemView); super(itemView);
ButterKnife.bind(this, itemView); ButterKnife.bind(this, itemView);
setBaseView(cardView, setBaseView(cardView,

View File

@ -32,8 +32,7 @@ import ml.docilealligator.infinityforreddit.Activity.SubredditMultiselectionActi
import ml.docilealligator.infinityforreddit.Activity.SubredditSelectionActivity; import ml.docilealligator.infinityforreddit.Activity.SubredditSelectionActivity;
import ml.docilealligator.infinityforreddit.Activity.SubscribedThingListingActivity; import ml.docilealligator.infinityforreddit.Activity.SubscribedThingListingActivity;
import ml.docilealligator.infinityforreddit.Activity.ThemePreviewActivity; import ml.docilealligator.infinityforreddit.Activity.ThemePreviewActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity; import ml.docilealligator.infinityforreddit.Activity.ViewImageOrGifActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImgurMediaActivity; import ml.docilealligator.infinityforreddit.Activity.ViewImgurMediaActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewMessageActivity; import ml.docilealligator.infinityforreddit.Activity.ViewMessageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewMultiRedditDetailActivity; import ml.docilealligator.infinityforreddit.Activity.ViewMultiRedditDetailActivity;
@ -133,9 +132,7 @@ public interface AppComponent {
void inject(AccountSavedThingActivity accountSavedThingActivity); void inject(AccountSavedThingActivity accountSavedThingActivity);
void inject(ViewImageActivity viewImageActivity); void inject(ViewImageOrGifActivity viewGIFActivity);
void inject(ViewGIFActivity viewGIFActivity);
void inject(MultiRedditListingActivity multiRedditListingActivity); void inject(MultiRedditListingActivity multiRedditListingActivity);

View File

@ -0,0 +1,98 @@
package ml.docilealligator.infinityforreddit.AsyncTask;
import android.app.WallpaperManager;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.media.ThumbnailUtils;
import android.os.AsyncTask;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import java.io.IOException;
public class SetAsWallpaperAsyncTask extends AsyncTask<Void, Void, Void> {
private Bitmap bitmap;
private int setTo;
private WallpaperManager manager;
private WindowManager windowManager;
private SetAsWallpaperAsyncTaskListener setAsWallpaperAsyncTaskListener;
private boolean success = true;
public SetAsWallpaperAsyncTask(Bitmap bitmap, int setTo, WallpaperManager manager, WindowManager windowManager,
SetAsWallpaperAsyncTaskListener setAsWallpaperAsyncTaskListener) {
this.bitmap = bitmap;
this.setTo = setTo;
this.manager = manager;
this.windowManager = windowManager;
this.setAsWallpaperAsyncTaskListener = setAsWallpaperAsyncTaskListener;
}
public interface SetAsWallpaperAsyncTaskListener {
void success();
void failed();
}
@Override
protected Void doInBackground(Void... voids) {
DisplayMetrics metrics = new DisplayMetrics();
Rect rect = null;
if (windowManager != null) {
windowManager.getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
bitmap = ThumbnailUtils.extractThumbnail(bitmap, width, height);
}
float imageAR = (float) bitmap.getWidth() / (float) bitmap.getHeight();
float screenAR = (float) width / (float) height;
if (imageAR > screenAR) {
int desiredWidth = (int) (bitmap.getHeight() * screenAR);
rect = new Rect((bitmap.getWidth() - desiredWidth) / 2, 0, bitmap.getWidth(), bitmap.getHeight());
} else {
int desiredHeight = (int) (bitmap.getWidth() / screenAR);
rect = new Rect(0, (bitmap.getHeight() - desiredHeight) / 2, bitmap.getWidth(), (bitmap.getHeight() + desiredHeight) / 2);
}
}
try {
switch (setTo) {
case 0:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(bitmap, rect, true, WallpaperManager.FLAG_SYSTEM);
}
break;
case 1:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(bitmap, rect, true, WallpaperManager.FLAG_LOCK);
}
break;
case 2:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(bitmap, rect, true, WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK);
} else {
manager.setBitmap(bitmap);
}
break;
}
} catch (IOException e) {
success = false;
}
return null;
}
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
if (success) {
setAsWallpaperAsyncTaskListener.success();
} else {
setAsWallpaperAsyncTaskListener.failed();
}
}
}

View File

@ -1,7 +1,6 @@
package ml.docilealligator.infinityforreddit.Fragment; package ml.docilealligator.infinityforreddit.Fragment;
import android.Manifest; import android.Manifest;
import android.app.DownloadManager;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -10,7 +9,6 @@ import android.graphics.drawable.Drawable;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -47,7 +45,10 @@ import ml.docilealligator.infinityforreddit.AsyncTask.SaveImageToFileAsyncTask;
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.SetAsWallpaperCallback;
public class ViewImgurImageFragment extends Fragment { public class ViewImgurImageFragment extends Fragment {
@ -63,6 +64,7 @@ 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;
@ -81,6 +83,7 @@ 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();
return rootView; return rootView;
@ -131,10 +134,10 @@ public class ViewImgurImageFragment extends Fragment {
PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE); PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
} else { } else {
// Permission has already been granted // Permission has already been granted
download(); mediaDownloader.download(imgurMedia.getLink(), imgurMedia.getFileName(), getContext());
} }
} else { } else {
download(); mediaDownloader.download(imgurMedia.getLink(), imgurMedia.getFileName(), getContext());
} }
return true; return true;
@ -151,7 +154,7 @@ public class ViewImgurImageFragment extends Fragment {
@Override @Override
public void saveSuccess(File imageFile) { public void saveSuccess(File imageFile) {
Uri uri = FileProvider.getUriForFile(activity, Uri uri = FileProvider.getUriForFile(activity,
BuildConfig.APPLICATION_ID + ".provider",imageFile); BuildConfig.APPLICATION_ID + ".provider", imageFile);
Intent shareIntent = new Intent(); Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND); shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uri); shareIntent.putExtra(Intent.EXTRA_STREAM, uri);
@ -186,7 +189,7 @@ public class ViewImgurImageFragment extends Fragment {
setAsWallpaperBottomSheetFragment.setArguments(bundle); setAsWallpaperBottomSheetFragment.setArguments(bundle);
setAsWallpaperBottomSheetFragment.show(activity.getSupportFragmentManager(), setAsWallpaperBottomSheetFragment.getTag()); setAsWallpaperBottomSheetFragment.show(activity.getSupportFragmentManager(), setAsWallpaperBottomSheetFragment.getTag());
} else { } else {
activity.setAsWallpaper(imgurMedia.getLink(), 2); ((SetAsWallpaperCallback) activity).setToBoth(activity.getCurrentPagePosition());
} }
return true; return true;
} }
@ -200,56 +203,12 @@ public class ViewImgurImageFragment extends Fragment {
if (grantResults[0] == PackageManager.PERMISSION_DENIED) { if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
Toast.makeText(activity, R.string.no_storage_permission, Toast.LENGTH_SHORT).show(); Toast.makeText(activity, 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) {
download(); mediaDownloader.download(imgurMedia.getLink(), imgurMedia.getFileName(), getContext());
} }
isDownloading = false; isDownloading = false;
} }
} }
private void download() {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(imgurMedia.getLink()));
request.setTitle(imgurMedia.getFileName());
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//Android Q support
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, imgurMedia.getFileName());
} else {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File directory = new File(path + "/Infinity/");
boolean saveToInfinityFolder = true;
if (!directory.exists()) {
if (!directory.mkdir()) {
saveToInfinityFolder = false;
}
} else {
if (directory.isFile()) {
if (!(directory.delete() && directory.mkdir())) {
saveToInfinityFolder = false;
}
}
}
if (saveToInfinityFolder) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES + "/Infinity/", imgurMedia.getFileName());
} else {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, imgurMedia.getFileName());
}
}
DownloadManager manager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
if (manager == null) {
Toast.makeText(activity, R.string.download_failed, Toast.LENGTH_SHORT).show();
return;
}
manager.enqueue(request);
Toast.makeText(activity, R.string.download_started, Toast.LENGTH_SHORT).show();
}
@Override @Override
public void onAttach(@NonNull Context context) { public void onAttach(@NonNull Context context) {
super.onAttach(context); super.onAttach(context);

View File

@ -2,7 +2,6 @@ package ml.docilealligator.infinityforreddit.Fragment;
import android.Manifest; import android.Manifest;
import android.app.Activity; import android.app.Activity;
import android.app.DownloadManager;
import android.content.Context; import android.content.Context;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.pm.PackageManager; import android.content.pm.PackageManager;
@ -11,7 +10,6 @@ import android.media.AudioManager;
import android.net.Uri; import android.net.Uri;
import android.os.Build; import android.os.Build;
import android.os.Bundle; import android.os.Bundle;
import android.os.Environment;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.Menu; import android.view.Menu;
import android.view.MenuInflater; import android.view.MenuInflater;
@ -42,8 +40,6 @@ import com.google.android.exoplayer2.upstream.DataSource;
import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory; import com.google.android.exoplayer2.upstream.DefaultDataSourceFactory;
import com.google.android.exoplayer2.util.Util; import com.google.android.exoplayer2.util.Util;
import java.io.File;
import javax.inject.Inject; import javax.inject.Inject;
import javax.inject.Named; import javax.inject.Named;
@ -51,6 +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.Utils.SharedPreferencesUtils; import ml.docilealligator.infinityforreddit.Utils.SharedPreferencesUtils;
@ -71,6 +69,7 @@ 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;
@ -131,6 +130,8 @@ 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);
@ -190,47 +191,7 @@ public class ViewImgurVideoFragment extends Fragment {
private void download() { private void download() {
isDownloading = false; isDownloading = false;
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(imgurMedia.getLink())); mediaDownloader.download(imgurMedia.getLink(), imgurMedia.getFileName(), getContext());
request.setTitle(imgurMedia.getFileName());
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//Android Q support
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, imgurMedia.getFileName());
} else {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File directory = new File(path + "/Infinity/");
boolean saveToInfinityFolder = true;
if (!directory.exists()) {
if (!directory.mkdir()) {
saveToInfinityFolder = false;
}
} else {
if (directory.isFile()) {
if (!(directory.delete() && directory.mkdir())) {
saveToInfinityFolder = false;
}
}
}
if (saveToInfinityFolder) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES + "/Infinity/", imgurMedia.getFileName());
} else {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, imgurMedia.getFileName());
}
}
DownloadManager manager = (DownloadManager) activity.getSystemService(Context.DOWNLOAD_SERVICE);
if (manager == null) {
Toast.makeText(activity, R.string.download_failed, Toast.LENGTH_SHORT).show();
return;
}
manager.enqueue(request);
Toast.makeText(activity, R.string.download_started, Toast.LENGTH_SHORT).show();
} }
private void preparePlayer(Bundle savedInstanceState) { private void preparePlayer(Bundle savedInstanceState) {

View File

@ -0,0 +1,7 @@
package ml.docilealligator.infinityforreddit;
import android.content.Context;
public interface MediaDownloader {
void download(String url, String fileName, Context ctx);
}

View File

@ -0,0 +1,58 @@
package ml.docilealligator.infinityforreddit;
import android.app.DownloadManager;
import android.content.Context;
import android.net.Uri;
import android.os.Build;
import android.os.Environment;
import android.widget.Toast;
import java.io.File;
public class MediaDownloaderImpl implements MediaDownloader {
@Override
public void download(String url, String fileName, Context ctx) {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(url));
request.setTitle(fileName);
request.allowScanningByMediaScanner();
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
//Android Q support
if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, fileName);
} else {
String path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_PICTURES).toString();
File directory = new File(path + "/Infinity/");
boolean saveToInfinityFolder = true;
if (!directory.exists()) {
if (!directory.mkdir()) {
saveToInfinityFolder = false;
}
} else {
if (directory.isFile()) {
if (!(directory.delete() && directory.mkdir())) {
saveToInfinityFolder = false;
}
}
}
if (saveToInfinityFolder) {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES + "/Infinity/", fileName);
} else {
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_PICTURES, fileName);
}
}
DownloadManager manager = (DownloadManager) ctx.getSystemService(Context.DOWNLOAD_SERVICE);
if (manager == null) {
Toast.makeText(ctx, R.string.download_failed, Toast.LENGTH_SHORT).show();
return;
}
manager.enqueue(request);
Toast.makeText(ctx, R.string.download_started, Toast.LENGTH_SHORT).show();
}
}

View File

@ -0,0 +1,92 @@
package ml.docilealligator.infinityforreddit;
import android.app.WallpaperManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Rect;
import android.graphics.drawable.Drawable;
import android.media.ThumbnailUtils;
import android.os.Build;
import android.util.DisplayMetrics;
import android.view.WindowManager;
import android.widget.Toast;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.bumptech.glide.Glide;
import com.bumptech.glide.request.target.CustomTarget;
import com.bumptech.glide.request.transition.Transition;
import java.io.IOException;
public class WallpaperSetter {
public static final int HOME_SCREEN = 0;
public static final int LOCK_SCREEN = 1;
public static final int BOTH_SCREENS = 2;
public void set(String url, int setTo, Context ctx) {
Toast.makeText(ctx, R.string.save_image_first, Toast.LENGTH_SHORT).show();
Glide.with(ctx).asBitmap().load(url).into(new CustomTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, @Nullable Transition<? super Bitmap> transition) {
WallpaperManager manager = WallpaperManager.getInstance(ctx);
DisplayMetrics metrics = new DisplayMetrics();
WindowManager windowManager = (WindowManager) ctx.getSystemService(Context.WINDOW_SERVICE);
Rect rect = null;
if (windowManager != null) {
windowManager.getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.N) {
resource = ThumbnailUtils.extractThumbnail(resource, width, height);
}
float imageAR = (float) resource.getWidth() / (float) resource.getHeight();
float screenAR = (float) width / (float) height;
if (imageAR > screenAR) {
int desiredWidth = (int) (resource.getHeight() * screenAR);
rect = new Rect((resource.getWidth() - desiredWidth) / 2, 0, resource.getWidth(), resource.getHeight());
} else {
int desiredHeight = (int) (resource.getWidth() / screenAR);
rect = new Rect(0, (resource.getHeight() - desiredHeight) / 2, resource.getWidth(), (resource.getHeight() + desiredHeight) / 2);
}
}
try {
switch (setTo) {
case HOME_SCREEN:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_SYSTEM);
}
break;
case LOCK_SCREEN:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_LOCK);
}
break;
case BOTH_SCREENS:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
manager.setBitmap(resource, rect, true, WallpaperManager.FLAG_SYSTEM | WallpaperManager.FLAG_LOCK);
} else {
manager.setBitmap(resource);
}
break;
}
Toast.makeText(ctx, R.string.wallpaper_set, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
Toast.makeText(ctx, R.string.error_set_wallpaper, Toast.LENGTH_SHORT).show();
}
}
@Override
public void onLoadCleared(@Nullable Drawable placeholder) {
}
});
}
}

View File

@ -1,57 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<com.thefuntasty.hauler.HaulerView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/hauler_view_view_gif_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:keepScreenOn="true"
app:dragUpEnabled="true"
tools:application="ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity">
<androidx.core.widget.NestedScrollView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:fillViewport="true">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<ProgressBar
android:id="@+id/progress_bar_view_gif_activity"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true" />
<pl.droidsonroids.gif.GifImageView
android:id="@+id/image_view_view_gif_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
app:gest_fillViewport="true" />
<LinearLayout
android:id="@+id/load_image_error_linear_layout_view_gif_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:visibility="gone">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_error_outline_white_24dp"
android:layout_gravity="center"
android:gravity="center"
android:textColor="@android:color/white"
android:text="@string/error_loading_gif_tap_to_retry"
android:textSize="?attr/font_default"
android:fontFamily="?attr/font_family" />
</LinearLayout>
</RelativeLayout>
</androidx.core.widget.NestedScrollView>
</com.thefuntasty.hauler.HaulerView>

View File

@ -1,9 +1,8 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<com.thefuntasty.hauler.HaulerView <com.thefuntasty.hauler.HaulerView xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/hauler_view_view_image_activity" android:id="@+id/hauler_view_view_image_or_gif_activity"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
app:dragUpEnabled="true" app:dragUpEnabled="true"
@ -19,21 +18,27 @@
android:layout_height="match_parent"> android:layout_height="match_parent">
<ProgressBar <ProgressBar
android:id="@+id/progress_bar_view_image_activity" android:id="@+id/progress_bar_view_image_or_gif_activity"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_centerInParent="true" /> android:layout_centerInParent="true" />
<com.alexvasilkov.gestures.views.GestureImageView <com.alexvasilkov.gestures.views.GestureFrameLayout
android:id="@+id/image_view_view_image_activity" android:id="@+id/gesture_layout_view_image_or_gif_activity"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent">
android:adjustViewBounds="true"
android:scaleType="fitCenter" <pl.droidsonroids.gif.GifImageView
app:gest_fillViewport="true" /> android:id="@+id/image_view_view_image_or_gif_activity"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:adjustViewBounds="true"
android:scaleType="fitCenter"
app:gest_fillViewport="true" />
</com.alexvasilkov.gestures.views.GestureFrameLayout>
<LinearLayout <LinearLayout
android:id="@+id/load_image_error_linear_layout_view_image_activity" android:id="@+id/load_image_error_linear_layout_view_image_or_gif_activity"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:visibility="gone"> android:visibility="gone">
@ -41,13 +46,13 @@
<TextView <TextView
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_error_outline_white_24dp"
android:layout_gravity="center" android:layout_gravity="center"
android:drawableTop="@drawable/ic_error_outline_white_24dp"
android:fontFamily="?attr/font_family"
android:gravity="center" android:gravity="center"
android:textColor="@android:color/white"
android:text="@string/error_loading_image_tap_to_retry" android:text="@string/error_loading_image_tap_to_retry"
android:textSize="?attr/font_default" android:textColor="@android:color/white"
android:fontFamily="?attr/font_family" /> android:textSize="?attr/font_default" />
</LinearLayout> </LinearLayout>

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_download_view_gif_activity"
android:orderInCategory="1"
android:title="@string/action_download"
android:icon="@drawable/ic_file_download_toolbar_white_24dp"
app:showAsAction="ifRoom" />
<item
android:id="@+id/action_share_view_gif_activity"
android:orderInCategory="2"
android:title="@string/action_share"
android:icon="@drawable/ic_share_toolbar_white_24dp"
app:showAsAction="ifRoom" />
</menu>

View File

@ -2,22 +2,23 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android" <menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"> xmlns:app="http://schemas.android.com/apk/res-auto">
<item <item
android:id="@+id/action_download_view_image_activity" android:id="@+id/action_download_view_image_or_gif_activity"
android:icon="@drawable/ic_file_download_toolbar_white_24dp"
android:orderInCategory="1" android:orderInCategory="1"
android:title="@string/action_download" android:title="@string/action_download"
android:icon="@drawable/ic_file_download_toolbar_white_24dp"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_share_view_image_activity" android:id="@+id/action_share_view_image_or_gif_activity"
android:icon="@drawable/ic_share_toolbar_white_24dp"
android:orderInCategory="2" android:orderInCategory="2"
android:title="@string/action_share" android:title="@string/action_share"
android:icon="@drawable/ic_share_toolbar_white_24dp"
app:showAsAction="ifRoom" /> app:showAsAction="ifRoom" />
<item <item
android:id="@+id/action_set_wallpaper_view_image_activity" android:id="@+id/action_set_wallpaper_view_image_or_gif_activity"
android:orderInCategory="3" android:orderInCategory="3"
android:title="@string/action_set_wallpaper" android:title="@string/action_set_wallpaper"
android:visible="false"
app:showAsAction="never" /> app:showAsAction="never" />
</menu> </menu>