aboutsummaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
authorAlex Ning <chineseperson5@gmail.com>2019-10-08 13:48:58 +0000
committerAlex Ning <chineseperson5@gmail.com>2019-10-08 13:48:58 +0000
commitc4fd313839466df975a2afc6ad03e8f06dedf2e8 (patch)
treefda8615753caa54f02b45ff189c858e71bc89b34 /app
parent35f9a645d864922f12fa9c04793adf7e3ce39036 (diff)
downloadinfinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.tar
infinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.tar.gz
infinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.tar.bz2
infinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.tar.lz
infinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.tar.xz
infinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.tar.zst
infinity-for-reddit-c4fd313839466df975a2afc6ad03e8f06dedf2e8.zip
Add ViewGifActivity to view gifs. Fixed some links cannot be opened by browsers. Maybe fixed IllegalStateException in ViewSubredditDetailActivity and FilteredThingActivity. Minor bugs fixed.
Diffstat (limited to 'app')
-rw-r--r--app/src/main/AndroidManifest.xml21
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/FilteredThingActivity.java14
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/LinkResolverActivity.java1
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewGIFActivity.java448
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewImageActivity.java11
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java13
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java6
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewVideoActivity.java1
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java19
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java26
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java3
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java13
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java4
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/Post.java2
-rw-r--r--app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java2
-rw-r--r--app/src/main/res/layout/activity_view_gif.xml41
-rw-r--r--app/src/main/res/menu/view_gif_activity.xml10
17 files changed, 575 insertions, 60 deletions
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index cfddbb91..907caafe 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -2,15 +2,6 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="ml.docilealligator.infinityforreddit">
- <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
- <uses-permission android:name="android.permission.INTERNET" />
-
- <uses-permission
- android:name="android.permission.WRITE_EXTERNAL_STORAGE"
- android:maxSdkVersion="22" />
-
- <uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
-
<application
android:name=".Infinity"
android:allowBackup="true"
@@ -21,6 +12,10 @@
android:theme="@style/AppTheme"
android:usesCleartextTraffic="true">
<activity
+ android:name=".Activity.ViewGIFActivity"
+ android:parentActivityName=".Activity.MainActivity"
+ android:theme="@style/AppTheme.ActionBar.Transparent" />
+ <activity
android:name=".Activity.AccountSavedThingActivity"
android:label="@string/account_saved_thing_activity"
android:parentActivityName=".Activity.MainActivity"
@@ -258,5 +253,13 @@
android:enabled="true"
android:exported="false" />
</application>
+ <uses-permission android:name="android.permission.INTERNET" />
+ <uses-permission
+ android:name="android.permission.WRITE_EXTERNAL_STORAGE"
+ android:maxSdkVersion="22" />
+
+ <uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
+
+ <uses-permission-sdk-23 android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
</manifest> \ No newline at end of file
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/FilteredThingActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/FilteredThingActivity.java
index 28e6dd20..52f370b2 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/FilteredThingActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/FilteredThingActivity.java
@@ -148,11 +148,15 @@ public class FilteredThingActivity extends BaseActivity implements SortTypeBotto
isInLazyMode = savedInstanceState.getBoolean(IS_IN_LAZY_MODE_STATE);
mNullAccessToken = savedInstanceState.getBoolean(NULL_ACCESS_TOKEN_STATE);
mAccessToken = savedInstanceState.getString(ACCESS_TOKEN_STATE);
+
+ mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit();
+
if (!mNullAccessToken && mAccessToken == null) {
getCurrentAccountAndBindView(filter, sortType);
} else {
- mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE);
- getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit();
+ /*mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_filtered_posts_activity, mFragment).commit();*/
bindView(filter, sortType, false);
}
} else {
@@ -236,7 +240,7 @@ public class FilteredThingActivity extends BaseActivity implements SortTypeBotto
case Post.VIDEO_TYPE:
toolbar.setSubtitle(R.string.video);
break;
- case Post.GIF_VIDEO_TYPE:
+ case Post.GIF_TYPE:
toolbar.setSubtitle(R.string.gif);
}
@@ -333,9 +337,7 @@ public class FilteredThingActivity extends BaseActivity implements SortTypeBotto
@Override
protected void onSaveInstanceState(@NonNull Bundle outState) {
super.onSaveInstanceState(outState);
- if (mFragment != null) {
- getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment);
- }
+ getSupportFragmentManager().putFragment(outState, FRAGMENT_OUT_STATE, mFragment);
outState.putBoolean(IS_IN_LAZY_MODE_STATE, isInLazyMode);
outState.putString(ACCESS_TOKEN_STATE, mAccessToken);
outState.putBoolean(NULL_ACCESS_TOKEN_STATE, mNullAccessToken);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/LinkResolverActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/LinkResolverActivity.java
index c35a8073..b85d14f2 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/LinkResolverActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/LinkResolverActivity.java
@@ -165,7 +165,6 @@ public class LinkResolverActivity extends AppCompatActivity {
}
if (!packageNames.isEmpty()) {
- intent.setPackage(packageNames.get(0));
try {
startActivity(intent);
} catch (ActivityNotFoundException e) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewGIFActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewGIFActivity.java
new file mode 100644
index 00000000..be842ae0
--- /dev/null
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewGIFActivity.java
@@ -0,0 +1,448 @@
+package ml.docilealligator.infinityforreddit.Activity;
+
+import android.Manifest;
+import android.animation.Animator;
+import android.animation.ArgbEvaluator;
+import android.animation.ValueAnimator;
+import android.app.DownloadManager;
+import android.content.Context;
+import android.content.Intent;
+import android.content.SharedPreferences;
+import android.content.pm.PackageManager;
+import android.graphics.PorterDuff;
+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.view.Menu;
+import android.view.MenuItem;
+import android.view.MotionEvent;
+import android.view.View;
+import android.widget.LinearLayout;
+import android.widget.ProgressBar;
+import android.widget.RelativeLayout;
+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 com.bumptech.glide.Glide;
+import com.bumptech.glide.load.DataSource;
+import com.bumptech.glide.load.engine.GlideException;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.RequestOptions;
+import com.bumptech.glide.request.target.Target;
+import com.github.pwittchen.swipe.library.rx2.SimpleSwipeListener;
+import com.github.pwittchen.swipe.library.rx2.Swipe;
+
+import java.io.File;
+
+import javax.inject.Inject;
+
+import butterknife.BindView;
+import butterknife.ButterKnife;
+import ml.docilealligator.infinityforreddit.ContentFontStyle;
+import ml.docilealligator.infinityforreddit.FontStyle;
+import ml.docilealligator.infinityforreddit.Infinity;
+import ml.docilealligator.infinityforreddit.R;
+import ml.docilealligator.infinityforreddit.SharedPreferencesUtils;
+import ml.docilealligator.infinityforreddit.TitleFontStyle;
+import pl.droidsonroids.gif.GifImageView;
+
+public class ViewGIFActivity extends AppCompatActivity {
+
+ public static final String IMAGE_URL_KEY = "IUK";
+ public static final String FILE_NAME_KEY = "FNK";
+ private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
+ @BindView(R.id.parent_relative_layout_view_gif_activity)
+ RelativeLayout mRelativeLayout;
+ @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
+ SharedPreferences mSharedPreferences;
+ private boolean isActionBarHidden = false;
+ private boolean isDownloading = false;
+ private Menu mMenu;
+ private Swipe swipe;
+ private String mImageUrl;
+ private String mImageFileName;
+ private float totalLengthY = 0.0f;
+ private float touchY = -1.0f;
+ private float zoom = 1.0f;
+ private boolean isSwiping = false;
+
+ @Override
+ protected void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ ((Infinity) getApplication()).getAppComponent().inject(this);
+
+ getTheme().applyStyle(R.style.Theme_Default, 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);
+
+ 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)));
+ setTitle("");
+
+ Intent intent = getIntent();
+ mImageUrl = intent.getStringExtra(IMAGE_URL_KEY);
+ mImageFileName = intent.getStringExtra(FILE_NAME_KEY);
+
+ mLoadErrorLinearLayout.setOnClickListener(view -> {
+ if (!isSwiping) {
+ mProgressBar.setVisibility(View.VISIBLE);
+ mLoadErrorLinearLayout.setVisibility(View.GONE);
+ loadImage();
+ }
+ });
+
+ float pxHeight = getResources().getDisplayMetrics().heightPixels;
+
+ int activityColorFrom = getResources().getColor(android.R.color.black);
+ int actionBarColorFrom = getResources().getColor(R.color.transparentActionBarAndExoPlayerControllerColor);
+ int actionBarElementColorFrom = getResources().getColor(android.R.color.white);
+ int colorTo = getResources().getColor(android.R.color.transparent);
+
+ final ValueAnimator activityColorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), activityColorFrom, colorTo);
+ final ValueAnimator actionBarColorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), actionBarColorFrom, colorTo);
+ final ValueAnimator actionBarElementColorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), actionBarElementColorFrom, colorTo);
+
+ activityColorAnimation.setDuration(300); // milliseconds
+ actionBarColorAnimation.setDuration(300);
+ actionBarElementColorAnimation.setDuration(300);
+
+ activityColorAnimation.addUpdateListener(valueAnimator -> mRelativeLayout.setBackgroundColor((int) valueAnimator.getAnimatedValue()));
+
+ actionBarColorAnimation.addUpdateListener(valueAnimator -> actionBar.setBackgroundDrawable(new ColorDrawable((int) valueAnimator.getAnimatedValue())));
+
+ actionBarElementColorAnimation.addUpdateListener(valueAnimator -> {
+ upArrow.setColorFilter((int) valueAnimator.getAnimatedValue(), PorterDuff.Mode.SRC_IN);
+ if (mMenu != null) {
+ Drawable drawable = mMenu.getItem(0).getIcon();
+ //drawable.mutate();
+ drawable.setColorFilter((int) valueAnimator.getAnimatedValue(), PorterDuff.Mode.SRC_IN);
+ }
+ });
+
+ loadImage();
+
+ swipe = new Swipe();
+ swipe.setListener(new SimpleSwipeListener() {
+ @Override
+ public void onSwipingUp(final MotionEvent event) {
+ isSwiping = true;
+ float nowY = event.getY();
+ float offset;
+ if (touchY == -1.0f) {
+ offset = 0.0f;
+ } else {
+ offset = nowY - touchY;
+ }
+ totalLengthY += offset;
+ touchY = nowY;
+ mImageView.animate()
+ .y(totalLengthY)
+ .setDuration(0)
+ .start();
+ mLoadErrorLinearLayout.animate()
+ .y(totalLengthY)
+ .setDuration(0)
+ .start();
+ }
+
+ @Override
+ public boolean onSwipedUp(final MotionEvent event) {
+ if (totalLengthY < -pxHeight / 8) {
+ mImageView.animate()
+ .y(-pxHeight)
+ .setDuration(300)
+ .setListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animator) {
+ activityColorAnimation.start();
+ actionBarColorAnimation.start();
+ actionBarElementColorAnimation.start();
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animator) {
+ finish();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animator) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animator) {
+ }
+ })
+ .start();
+ mLoadErrorLinearLayout.animate()
+ .y(-pxHeight)
+ .setDuration(300)
+ .start();
+ } else {
+ isSwiping = false;
+ mImageView.animate()
+ .y(0)
+ .setDuration(300)
+ .start();
+ mLoadErrorLinearLayout.animate()
+ .y(0)
+ .setDuration(300)
+ .start();
+ }
+
+ totalLengthY = 0.0f;
+ touchY = -1.0f;
+ return false;
+ }
+
+ @Override
+ public void onSwipingDown(final MotionEvent event) {
+ isSwiping = true;
+ float nowY = event.getY();
+ float offset;
+ if (touchY == -1.0f) {
+ offset = 0.0f;
+ } else {
+ offset = nowY - touchY;
+ }
+ totalLengthY += offset;
+ touchY = nowY;
+ mImageView.animate()
+ .y(totalLengthY)
+ .setDuration(0)
+ .start();
+ mLoadErrorLinearLayout.animate()
+ .y(totalLengthY)
+ .setDuration(0)
+ .start();
+ }
+
+ @Override
+ public boolean onSwipedDown(final MotionEvent event) {
+ if (totalLengthY > pxHeight / 8) {
+ mImageView.animate()
+ .y(pxHeight)
+ .setDuration(300)
+ .setListener(new Animator.AnimatorListener() {
+ @Override
+ public void onAnimationStart(Animator animator) {
+ activityColorAnimation.start();
+ actionBarColorAnimation.start();
+ actionBarElementColorAnimation.start();
+ }
+
+ @Override
+ public void onAnimationEnd(Animator animator) {
+ finish();
+ }
+
+ @Override
+ public void onAnimationCancel(Animator animator) {
+ }
+
+ @Override
+ public void onAnimationRepeat(Animator animator) {
+ }
+ })
+ .start();
+ mLoadErrorLinearLayout.animate()
+ .y(pxHeight)
+ .setDuration(300)
+ .start();
+ } else {
+ isSwiping = false;
+ mImageView.animate()
+ .y(0)
+ .setDuration(300)
+ .start();
+ mLoadErrorLinearLayout.animate()
+ .y(0)
+ .setDuration(300)
+ .start();
+ }
+
+ totalLengthY = 0.0f;
+ touchY = -1.0f;
+
+ return false;
+ }
+ });
+
+ 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.with(this).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) {
+ mMenu = 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:
+ 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;
+ }
+
+ return false;
+ }
+
+ @Override
+ public boolean dispatchTouchEvent(MotionEvent ev) {
+ if (zoom == 1.0) {
+ swipe.dispatchTouchEvent(ev);
+ }
+ return super.dispatchTouchEvent(ev);
+ }
+
+ @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();
+ }
+
+ @Override
+ protected void onPause() {
+ super.onPause();
+ overridePendingTransition(0, 0);
+ }
+}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewImageActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewImageActivity.java
index 9d1d20af..652db78e 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewImageActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewImageActivity.java
@@ -59,7 +59,6 @@ import ml.docilealligator.infinityforreddit.TitleFontStyle;
public class ViewImageActivity extends AppCompatActivity {
- public static final String TITLE_KEY = "TK";
public static final String IMAGE_URL_KEY = "IUK";
public static final String FILE_NAME_KEY = "FNK";
private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
@@ -113,7 +112,7 @@ public class ViewImageActivity extends AppCompatActivity {
Intent intent = getIntent();
mImageUrl = intent.getStringExtra(IMAGE_URL_KEY);
- mImageFileName = intent.getStringExtra(FILE_NAME_KEY) + ".jpg";
+ mImageFileName = intent.getStringExtra(FILE_NAME_KEY);
mLoadErrorLinearLayout.setOnClickListener(view -> {
if (!isSwiping) {
@@ -382,10 +381,10 @@ public class ViewImageActivity extends AppCompatActivity {
PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE);
} else {
// Permission has already been granted
- saveImage();
+ download();
}
} else {
- saveImage();
+ download();
}
return true;
@@ -408,13 +407,13 @@ public class ViewImageActivity extends AppCompatActivity {
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) {
- saveImage();
+ download();
}
isDownloading = false;
}
}
- private void saveImage() {
+ private void download() {
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(mImageUrl));
request.setTitle(mImageFileName);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java
index 2a64eab3..bf5bd92d 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewSubredditDetailActivity.java
@@ -203,12 +203,15 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
mMessageFullname = savedInstanceState.getString(MESSAGE_FULLNAME_STATE);
mNewAccountName = savedInstanceState.getString(NEW_ACCOUNT_NAME_STATE);
+ mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
+
if (!mNullAccessToken && mAccessToken == null) {
getCurrentAccountAndBindView();
} else {
bindView(false);
- mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY);
- getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();
+ /*mFragment = getSupportFragmentManager().getFragment(savedInstanceState, FRAGMENT_OUT_STATE_KEY);
+ getSupportFragmentManager().beginTransaction().replace(R.id.frame_layout_view_subreddit_detail_activity, mFragment).commit();*/
}
if (mFetchSubredditInfoSuccess) {
@@ -258,9 +261,8 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
glide.load(subredditData.getBannerUrl()).into(bannerImageView);
bannerImageView.setOnClickListener(view -> {
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
- intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getBannerUrl());
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner");
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-banner.jpg");
startActivity(intent);
});
}
@@ -280,9 +282,8 @@ public class ViewSubredditDetailActivity extends BaseActivity implements SortTyp
.into(iconGifImageView);
iconGifImageView.setOnClickListener(view -> {
Intent intent = new Intent(ViewSubredditDetailActivity.this, ViewImageActivity.class);
- intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, subredditData.getIconUrl());
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon");
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName + "-icon.jpg");
startActivity(intent);
});
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java
index fa86fb67..ec574dec 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewUserDetailActivity.java
@@ -279,9 +279,8 @@ public class ViewUserDetailActivity extends BaseActivity implements UserThingSor
glide.load(userData.getBanner()).into(bannerImageView);
bannerImageView.setOnClickListener(view -> {
Intent intent = new Intent(this, ViewImageActivity.class);
- intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getBanner());
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-banner");
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-banner.jpg");
startActivity(intent);
});
}
@@ -302,9 +301,8 @@ public class ViewUserDetailActivity extends BaseActivity implements UserThingSor
iconGifImageView.setOnClickListener(view -> {
Intent intent = new Intent(this, ViewImageActivity.class);
- intent.putExtra(ViewImageActivity.TITLE_KEY, title);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, userData.getIconUrl());
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-icon");
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, username + "-icon.jpg");
startActivity(intent);
});
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewVideoActivity.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewVideoActivity.java
index 222ecbf8..933b998f 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewVideoActivity.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Activity/ViewVideoActivity.java
@@ -50,7 +50,6 @@ import ml.docilealligator.infinityforreddit.R;
public class ViewVideoActivity extends AppCompatActivity {
- public static final String TITLE_KEY = "TK";
public static final String SUBREDDIT_KEY = "SK";
public static final String ID_KEY = "IK";
private static final int PERMISSION_REQUEST_WRITE_EXTERNAL_STORAGE = 0;
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
index f7e16eb1..e2e72171 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/CommentAndPostRecyclerViewAdapter.java
@@ -53,6 +53,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import ml.docilealligator.infinityforreddit.Activity.CommentActivity;
import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity;
import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity;
+import ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity;
@@ -419,9 +420,8 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
((PostDetailViewHolder) holder).mImageView.setOnClickListener(view -> {
Intent intent = new Intent(mActivity, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, mPost.getUrl());
- intent.putExtra(ViewImageActivity.TITLE_KEY, mPost.getTitle());
intent.putExtra(ViewImageActivity.FILE_NAME_KEY, mPost.getSubredditNamePrefixed().substring(2)
- + "-" + mPost.getId().substring(3));
+ + "-" + mPost.getId().substring(3) + ".jpg");
mActivity.startActivity(intent);
});
break;
@@ -443,16 +443,14 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
mActivity.startActivity(intent);
});
break;
- case Post.GIF_VIDEO_TYPE:
+ case Post.GIF_TYPE:
((PostDetailViewHolder) holder).mTypeTextView.setText("GIF");
- final Uri gifVideoUri = Uri.parse(mPost.getVideoUrl());
((PostDetailViewHolder) holder).mImageView.setOnClickListener(view -> {
- Intent intent = new Intent(mActivity, ViewVideoActivity.class);
- intent.setData(gifVideoUri);
- intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
- intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, mPost.getSubredditName());
- intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
+ Intent intent = new Intent(mActivity, ViewGIFActivity.class);
+ intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, mPost.getSubredditName()
+ + "-" + mPost.getId() + ".gif");
+ intent.putExtra(ViewGIFActivity.IMAGE_URL_KEY, mPost.getVideoUrl());
mActivity.startActivity(intent);
});
break;
@@ -463,7 +461,6 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
((PostDetailViewHolder) holder).mImageView.setOnClickListener(view -> {
Intent intent = new Intent(mActivity, ViewVideoActivity.class);
intent.setData(videoUri);
- intent.putExtra(ViewVideoActivity.TITLE_KEY, mPost.getTitle());
intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, mPost.getSubredditName());
intent.putExtra(ViewVideoActivity.ID_KEY, mPost.getId());
mActivity.startActivity(intent);
@@ -979,7 +976,7 @@ public class CommentAndPostRecyclerViewAdapter extends RecyclerView.Adapter<Recy
}
private int getParentPosition(int position) {
- if (position < mVisibleComments.size()) {
+ if (position >= 0 && position < mVisibleComments.size()) {
int childDepth = mVisibleComments.get(position).getDepth();
for (int i = position; i >= 0; i--) {
if (mVisibleComments.get(i).getDepth() < childDepth) {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java
index 7f3f5f83..a0dbe900 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Adapter/PostRecyclerViewAdapter.java
@@ -45,6 +45,7 @@ import jp.wasabeef.glide.transformations.RoundedCornersTransformation;
import ml.docilealligator.infinityforreddit.Activity.CommentActivity;
import ml.docilealligator.infinityforreddit.Activity.FilteredThingActivity;
import ml.docilealligator.infinityforreddit.Activity.LinkResolverActivity;
+import ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewSubredditDetailActivity;
@@ -146,7 +147,8 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
if (holder instanceof DataViewHolder) {
Post post = getItem(position);
if (post != null) {
- final String id = post.getFullName();
+ final String fullName = post.getFullName();
+ final String id = post.getId();
final String subredditNamePrefixed = post.getSubredditNamePrefixed();
String subredditName = subredditNamePrefixed.substring(2);
String authorPrefixed = "u/" + post.getAuthor();
@@ -399,9 +401,8 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
((DataViewHolder) holder).imageView.setOnClickListener(view -> {
Intent intent = new Intent(mContext, ViewImageActivity.class);
intent.putExtra(ViewImageActivity.IMAGE_URL_KEY, imageUrl);
- intent.putExtra(ViewImageActivity.TITLE_KEY, title);
- intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditNamePrefixed.substring(2)
- + "-" + id.substring(3));
+ intent.putExtra(ViewImageActivity.FILE_NAME_KEY, subredditName
+ + "-" + id + ".jpg");
mContext.startActivity(intent);
});
break;
@@ -423,16 +424,16 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
mContext.startActivity(intent);
});
break;
- case Post.GIF_VIDEO_TYPE:
+ case Post.GIF_TYPE:
((DataViewHolder) holder).typeTextView.setText(R.string.gif);
final Uri gifVideoUri = Uri.parse(post.getVideoUrl());
((DataViewHolder) holder).imageView.setOnClickListener(view -> {
- Intent intent = new Intent(mContext, ViewVideoActivity.class);
+ Intent intent = new Intent(mContext, ViewGIFActivity.class);
intent.setData(gifVideoUri);
- intent.putExtra(ViewVideoActivity.TITLE_KEY, title);
- intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, subredditName);
- intent.putExtra(ViewVideoActivity.ID_KEY, id);
+ intent.putExtra(ViewGIFActivity.FILE_NAME_KEY, subredditName
+ + "-" + id + ".gif");
+ intent.putExtra(ViewGIFActivity.IMAGE_URL_KEY, post.getVideoUrl());
mContext.startActivity(intent);
});
break;
@@ -443,9 +444,8 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
((DataViewHolder) holder).imageView.setOnClickListener(view -> {
Intent intent = new Intent(mContext, ViewVideoActivity.class);
intent.setData(videoUri);
- intent.putExtra(ViewVideoActivity.TITLE_KEY, title);
intent.putExtra(ViewVideoActivity.SUBREDDIT_KEY, subredditName);
- intent.putExtra(ViewVideoActivity.ID_KEY, id);
+ intent.putExtra(ViewVideoActivity.ID_KEY, fullName);
mContext.startActivity(intent);
});
break;
@@ -541,7 +541,7 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
}
- }, id, newVoteType, holder.getAdapterPosition());
+ }, fullName, newVoteType, holder.getAdapterPosition());
});
((DataViewHolder) holder).downvoteButton.setOnClickListener(view -> {
@@ -612,7 +612,7 @@ public class PostRecyclerViewAdapter extends PagedListAdapter<Post, RecyclerView
EventBus.getDefault().post(new PostUpdateEventToDetailActivity(post));
}
- }, id, newVoteType, holder.getAdapterPosition());
+ }, fullName, newVoteType, holder.getAdapterPosition());
});
((DataViewHolder) holder).commentButton.setOnClickListener(view -> {
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
index f82237a4..4c10e9c2 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/AppComponent.java
@@ -23,6 +23,7 @@ import ml.docilealligator.infinityforreddit.Activity.SearchSubredditsResultActiv
import ml.docilealligator.infinityforreddit.Activity.SettingsActivity;
import ml.docilealligator.infinityforreddit.Activity.SubredditSelectionActivity;
import ml.docilealligator.infinityforreddit.Activity.SubscribedThingListingActivity;
+import ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewImageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewMessageActivity;
import ml.docilealligator.infinityforreddit.Activity.ViewPostDetailActivity;
@@ -112,4 +113,6 @@ public interface AppComponent {
void inject(AccountSavedThingActivity accountSavedThingActivity);
void inject(ViewImageActivity viewImageActivity);
+
+ void inject(ViewGIFActivity viewGIFActivity);
}
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
index a12c1d33..9ab9b097 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParsePost.java
@@ -151,7 +151,7 @@ public class ParsePost {
} else if (data.has(JSONUtils.PREVIEW_KEY)) {
if (data.getJSONObject(JSONUtils.PREVIEW_KEY).has(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY)) {
//Gif video post (HLS)
- int postType = Post.GIF_VIDEO_TYPE;
+ int postType = Post.VIDEO_TYPE;
String videoUrl = Html.fromHtml(data.getJSONObject(JSONUtils.PREVIEW_KEY)
.getJSONObject(JSONUtils.REDDIT_VIDEO_PREVIEW_KEY).getString(JSONUtils.HLS_URL_KEY)).toString();
@@ -174,6 +174,17 @@ public class ParsePost {
post.setPreviewWidth(previewWidth);
post.setPreviewHeight(previewHeight);
+ } else if (url.endsWith("gif")){
+ //Gif post
+ int postType = Post.GIF_TYPE;
+ post = new Post(id, fullName, subredditName, subredditNamePrefixed, author,
+ formattedPostTime, title, previewUrl, url, permalink, score, postType,
+ voteType, gilded, nComments, flair, hidden, spoiler, nsfw, stickied,
+ archived, locked, saved, isCrosspost);
+
+ post.setPreviewWidth(previewWidth);
+ post.setPreviewHeight(previewHeight);
+ post.setVideoUrl(url);
} else {
if (url.contains(permalink)) {
//Text post but with a preview
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java
index b3cb14f7..e0fa6651 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/ParseUserData.java
@@ -20,6 +20,10 @@ public class ParseUserData {
}
private static UserData parseUserDataBase(JSONObject userDataJson) throws JSONException {
+ if(userDataJson == null) {
+ return null;
+ }
+
userDataJson = userDataJson.getJSONObject(JSONUtils.DATA_KEY);
String userName = userDataJson.getString(JSONUtils.NAME_KEY);
String iconImageUrl = userDataJson.getString(JSONUtils.ICON_IMG_KEY);
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java b/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java
index 8e2e40de..2aee9455 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/Post.java
@@ -13,7 +13,7 @@ public class Post implements Parcelable {
public static final int IMAGE_TYPE = 1;
public static final int LINK_TYPE = 2;
public static final int VIDEO_TYPE = 3;
- public static final int GIF_VIDEO_TYPE = 4;
+ public static final int GIF_TYPE = 4;
public static final int NO_PREVIEW_LINK_TYPE = 5;
public static final Creator<Post> CREATOR = new Creator<Post>() {
@Override
diff --git a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
index 429ed567..83c7a072 100644
--- a/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
+++ b/app/src/main/java/ml/docilealligator/infinityforreddit/PostDataSource.java
@@ -164,7 +164,7 @@ public class PostDataSource extends PageKeyedDataSource<String, Post> {
this.params = params;
this.callback = callback;
- if (params.key.equals("") || params.key.equals("null")) {
+ if ("".equals(params.key) || "null".equals(params.key)) {
return;
}
diff --git a/app/src/main/res/layout/activity_view_gif.xml b/app/src/main/res/layout/activity_view_gif.xml
new file mode 100644
index 00000000..b1821e41
--- /dev/null
+++ b/app/src/main/res/layout/activity_view_gif.xml
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="utf-8"?>
+<RelativeLayout 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:layout_width="match_parent"
+ android:layout_height="match_parent"
+ android:id="@+id/parent_relative_layout_view_gif_activity"
+ android:background="@android:color/black"
+ tools:application="ml.docilealligator.infinityforreddit.Activity.ViewGIFActivity">
+
+ <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/tap_to_retry"
+ android:textSize="?attr/font_default" />
+
+ </LinearLayout>
+
+</RelativeLayout>
diff --git a/app/src/main/res/menu/view_gif_activity.xml b/app/src/main/res/menu/view_gif_activity.xml
new file mode 100644
index 00000000..493c9fdb
--- /dev/null
+++ b/app/src/main/res/menu/view_gif_activity.xml
@@ -0,0 +1,10 @@
+<?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"
+ android:orderInCategory="1"
+ android:title="@string/action_download"
+ android:icon="@drawable/ic_file_download_white_24dp"
+ app:showAsAction="always" />
+</menu> \ No newline at end of file