package me.ccrama.redditslide.Activities;
import android.app.Activity;
import android.app.Dialog;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Bitmap;
import android.graphics.Color;
import android.graphics.PorterDuff;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.media.MediaScannerConnection;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v4.content.FileProvider;
import android.support.v4.view.ViewPager;
import android.support.v7.app.NotificationCompat;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.GridView;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.afollestad.materialdialogs.AlertDialogWrapper;
import com.cocosw.bottomsheet.BottomSheet;
import com.devspark.robototextview.util.RobotoTypefaceManager;
import com.nostra13.universalimageloader.core.DisplayImageOptions;
import com.nostra13.universalimageloader.core.assist.FailReason;
import com.nostra13.universalimageloader.core.assist.ImageScaleType;
import com.nostra13.universalimageloader.core.imageaware.ImageViewAware;
import com.nostra13.universalimageloader.core.listener.ImageLoadingListener;
import com.nostra13.universalimageloader.core.listener.ImageLoadingProgressListener;
import com.nostra13.universalimageloader.core.listener.SimpleImageLoadingListener;
import com.sothree.slidinguppanel.SlidingUpPanelLayout;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import me.ccrama.redditslide.Adapters.ImageGridAdapter;
import me.ccrama.redditslide.Adapters.ImageGridAdapterTumblr;
import me.ccrama.redditslide.ColorPreferences;
import me.ccrama.redditslide.ContentType;
import me.ccrama.redditslide.Fragments.BlankFragment;
import me.ccrama.redditslide.Fragments.FolderChooserDialogCreate;
import me.ccrama.redditslide.Fragments.SubmissionsView;
import me.ccrama.redditslide.ImgurAlbum.AlbumUtils;
import me.ccrama.redditslide.ImgurAlbum.Image;
import me.ccrama.redditslide.Notifications.ImageDownloadNotificationService;
import me.ccrama.redditslide.R;
import me.ccrama.redditslide.Reddit;
import me.ccrama.redditslide.SettingValues;
import me.ccrama.redditslide.SpoilerRobotoTextView;
import me.ccrama.redditslide.Tumblr.Photo;
import me.ccrama.redditslide.Tumblr.TumblrUtils;
import me.ccrama.redditslide.Views.ImageSource;
import me.ccrama.redditslide.Views.MediaVideoView;
import me.ccrama.redditslide.Views.SubsamplingScaleImageView;
import me.ccrama.redditslide.Views.ToolbarColorizeHelper;
import me.ccrama.redditslide.Visuals.FontPreferences;
import me.ccrama.redditslide.util.GifUtils;
import me.ccrama.redditslide.util.LinkUtil;
import me.ccrama.redditslide.util.NetworkUtil;
import me.ccrama.redditslide.util.SubmissionParser;
/**
* Created by ccrama on 1/25/2016. <p/> This is an extension of Album.java which utilizes a
* ViewPager for Imgur content instead of a RecyclerView (horizontal vs vertical). It also supports
* gifs and progress bars which Album.java doesn't.
*/
public class TumblrPager extends FullScreenActivity
implements FolderChooserDialogCreate.FolderCallback {
private static int adapterPosition;
public static final String SUBREDDIT = "subreddit";
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
}
if (id == R.id.vertical) {
SettingValues.albumSwipe = false;
SettingValues.prefs.edit().putBoolean(SettingValues.PREF_ALBUM_SWIPE, false).apply();
Intent i = new Intent(TumblrPager.this, Tumblr.class);
if (getIntent().hasExtra(MediaView.SUBMISSION_URL)) {
i.putExtra(MediaView.SUBMISSION_URL,
getIntent().getStringExtra(MediaView.SUBMISSION_URL));
}
if (getIntent().hasExtra(SUBREDDIT)) {
i.putExtra(SUBREDDIT, getIntent().getStringExtra(SUBREDDIT));
}
i.putExtras(getIntent());
startActivity(i);
finish();
}
if (id == R.id.grid) {
mToolbar.findViewById(R.id.grid).callOnClick();
}
if (id == R.id.external) {
Reddit.defaultShare(getIntent().getExtras().getString("url", ""), this);
}
if (id == R.id.comments) {
int adapterPosition = getIntent().getIntExtra(MediaView.ADAPTER_POSITION, -1);
finish();
SubmissionsView.datachanged(adapterPosition);
//getIntent().getStringExtra(MediaView.SUBMISSION_SUBREDDIT));
//SubmissionAdapter.setOpen(this, getIntent().getStringExtra(MediaView.SUBMISSION_URL));
}
if (id == R.id.download) {
int index = 0;
for (final Photo elem : images) {
doImageSave(false, elem.getOriginalSize().getUrl(), index);
index++;
}
}
return super.onOptionsItemSelected(item);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 3) {
Reddit.appRestart.edit().putBoolean("tutorialSwipe", true).apply();
}
}
public void onCreate(Bundle savedInstanceState) {
overrideSwipeFromAnywhere();
super.onCreate(savedInstanceState);
getTheme().applyStyle(
new ColorPreferences(this).getDarkThemeSubreddit(ColorPreferences.FONT_STYLE),
true);
setContentView(R.layout.album_pager);
//Keep the screen on
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
mToolbar = (Toolbar) findViewById(R.id.toolbar);
mToolbar.setTitle(R.string.type_album);
ToolbarColorizeHelper.colorizeToolbar(mToolbar, Color.WHITE, this);
setSupportActionBar(mToolbar);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if(getIntent().hasExtra(SUBREDDIT)){
this.subreddit = getIntent().getStringExtra(SUBREDDIT);
}
mToolbar.setPopupTheme(
new ColorPreferences(this).getDarkThemeSubreddit(ColorPreferences.FONT_STYLE));
adapterPosition = getIntent().getIntExtra(MediaView.ADAPTER_POSITION, -1);
String url = getIntent().getExtras().getString("url", "");
setShareUrl(url);
new LoadIntoPager(url, this).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
if (!Reddit.appRestart.contains("tutorialSwipe")) {
startActivityForResult(new Intent(this, SwipeTutorial.class), 3);
}
}
public class LoadIntoPager extends TumblrUtils.GetTumblrPostWithCallback {
String url;
public LoadIntoPager(@NotNull String url, @NotNull Activity baseActivity) {
super(url, baseActivity);
this.url = url;
}
@Override
public void onError() {
Intent i =
new Intent(TumblrPager.this, Website.class);
i.putExtra(Website.EXTRA_URL, url);
startActivity(i);
finish();
}
@Override
public void doWithData(final List<Photo> jsonElements) {
super.doWithData(jsonElements);
findViewById(R.id.progress).setVisibility(View.GONE);
images = new ArrayList<>(jsonElements);
p = (ViewPager) findViewById(R.id.images_horizontal);
if (getSupportActionBar() != null) {
getSupportActionBar().setSubtitle(1 + "/" + images.size());
}
AlbumViewPager adapter = new AlbumViewPager(getSupportFragmentManager());
p.setAdapter(adapter);
p.setCurrentItem(1);
findViewById(R.id.grid).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
LayoutInflater l = getLayoutInflater();
View body = l.inflate(R.layout.album_grid_dialog, null, false);
AlertDialogWrapper.Builder b = new AlertDialogWrapper.Builder(TumblrPager.this);
GridView gridview = (GridView) body.findViewById(R.id.images);
gridview.setAdapter(new ImageGridAdapterTumblr(TumblrPager.this, images));
b.setView(body);
final Dialog d = b.create();
gridview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
public void onItemClick(AdapterView<?> parent, View v, int position,
long id) {
p.setCurrentItem(position + 1);
d.dismiss();
}
});
d.show();
}
});
p.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
if (position != 0) {
if (getSupportActionBar() != null) {
getSupportActionBar().setSubtitle((position) + "/" + images.size());
}
}
if (position == 0 && positionOffset < 0.2) {
finish();
}
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
adapter.notifyDataSetChanged();
}
}
ViewPager p;
public List<Photo> images;
public String subreddit;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.album_pager, menu);
adapterPosition = getIntent().getIntExtra(MediaView.ADAPTER_POSITION, -1);
if (adapterPosition < 0) {
menu.findItem(R.id.comments).setVisible(false);
}
return true;
}
public class AlbumViewPager extends FragmentStatePagerAdapter {
public AlbumViewPager(FragmentManager m) {
super(m);
}
@Override
public Fragment getItem(int i) {
if (i == 0) {
Fragment blankFragment = new BlankFragment();
return blankFragment;
}
i--;
Photo current = images.get(i);
try {
if (ContentType.isGif(new URI(current.getOriginalSize().getUrl()))) {
//do gif stuff
Fragment f = new Gif();
Bundle args = new Bundle();
args.putInt("page", i);
f.setArguments(args);
return f;
} else {
Fragment f = new ImageFullNoSubmission();
Bundle args = new Bundle();
args.putInt("page", i);
f.setArguments(args);
return f;
}
} catch (URISyntaxException e) {
Fragment f = new ImageFullNoSubmission();
Bundle args = new Bundle();
args.putInt("page", i);
f.setArguments(args);
return f;
}
}
@Override
public int getCount() {
if (images == null) {
return 0;
}
return images.size() + 1;
}
}
public static class Gif extends Fragment {
private int i = 0;
private View gif;
ViewGroup rootView;
ProgressBar loader;
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
if (this.isVisible()) {
if (!isVisibleToUser) // If we are becoming invisible, then...
{
((MediaVideoView) gif).pause();
gif.setVisibility(View.GONE);
}
if (isVisibleToUser) // If we are becoming visible, then...
{
((MediaVideoView) gif).start();
gif.setVisibility(View.VISIBLE);
}
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = (ViewGroup) inflater.inflate(R.layout.submission_gifcard_album, container,
false);
loader = (ProgressBar) rootView.findViewById(R.id.gifprogress);
gif = rootView.findViewById(R.id.gif);
gif.setVisibility(View.VISIBLE);
final MediaVideoView v = (MediaVideoView) gif;
v.clearFocus();
final String url = ((TumblrPager) getActivity()).images.get(i).getOriginalSize().getUrl();
new GifUtils.AsyncLoadGif(getActivity(),
(MediaVideoView) rootView.findViewById(R.id.gif), loader, null, new Runnable() {
@Override
public void run() {
}
}, false, true, true, (TextView) rootView.findViewById(R.id.size), ((TumblrPager) getActivity()).subreddit).execute(url);
((MediaVideoView) rootView.findViewById(R.id.gif)).setZOrderOnTop(true);
rootView.findViewById(R.id.more).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((TumblrPager) getActivity()).showBottomSheetImage(url, true, i);
}
});
rootView.findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
MediaView.doOnClick.run();
}
});
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
i = bundle.getInt("page", 0);
}
}
public void showBottomSheetImage(final String contentUrl, final boolean isGif,
final int index) {
int[] attrs = new int[]{R.attr.tint};
TypedArray ta = obtainStyledAttributes(attrs);
int color = ta.getColor(0, Color.WHITE);
Drawable external = getResources().getDrawable(R.drawable.openexternal);
Drawable share = getResources().getDrawable(R.drawable.share);
Drawable image = getResources().getDrawable(R.drawable.image);
Drawable save = getResources().getDrawable(R.drawable.save);
external.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
share.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
image.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
save.setColorFilter(color, PorterDuff.Mode.SRC_ATOP);
ta.recycle();
BottomSheet.Builder b = new BottomSheet.Builder(this).title(contentUrl);
b.sheet(2, external, getString(R.string.submission_link_extern));
b.sheet(5, share, getString(R.string.submission_link_share));
if (!isGif) b.sheet(3, image, getString(R.string.share_image));
b.sheet(4, save, getString(R.string.submission_save_image));
b.listener(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
switch (which) {
case (2): {
LinkUtil.openExternally(contentUrl, TumblrPager.this, false);
}
break;
case (3): {
shareImage(contentUrl);
}
break;
case (5): {
Reddit.defaultShareText("", contentUrl, TumblrPager.this);
}
break;
case (4): {
doImageSave(isGif, contentUrl, index);
}
break;
}
}
});
b.show();
}
public void doImageSave(boolean isGif, String contentUrl, int index) {
if (!isGif) {
if (Reddit.appRestart.getString("imagelocation", "").isEmpty()) {
showFirstDialog();
} else if (!new File(Reddit.appRestart.getString("imagelocation", "")).exists()) {
showErrorDialog();
} else {
Intent i = new Intent(this, ImageDownloadNotificationService.class);
i.putExtra("actuallyLoaded", contentUrl);
if (subreddit != null && !subreddit.isEmpty()) i.putExtra("subreddit", subreddit);
i.putExtra("index", index);
startService(i);
}
} else {
MediaView.doOnClick.run();
}
}
public static class ImageFullNoSubmission extends Fragment {
private int i = 0;
public ImageFullNoSubmission() {
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
final ViewGroup rootView =
(ViewGroup) inflater.inflate(R.layout.album_image_pager, container, false);
final Photo current = ((TumblrPager) getActivity()).images.get(i);
final String url = current.getOriginalSize().getUrl();
boolean lq = false;
if (SettingValues.loadImageLq && (SettingValues.lowResAlways
|| (!NetworkUtil.isConnectedWifi(getActivity())
&& SettingValues.lowResMobile)) && current.getAltSizes()!= null&&! current.getAltSizes().isEmpty()) {
String lqurl = current.getAltSizes().get(current.getAltSizes().size()/2).getUrl();
loadImage(rootView, this, lqurl);
lq = true;
} else {
loadImage(rootView, this, url);
}
{
rootView.findViewById(R.id.more).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
((TumblrPager) getActivity()).showBottomSheetImage(url, false, i);
}
});
{
rootView.findViewById(R.id.save).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v2) {
((TumblrPager) getActivity()).doImageSave(false, url, i);
}
});
}
}
{
String title = "";
String description = "";
if (current.getCaption() != null) {
List<String> text = SubmissionParser.getBlocks(current.getCaption());
description = text.get(0).trim();
}
if (title.isEmpty() && description.isEmpty()) {
rootView.findViewById(R.id.panel).setVisibility(View.GONE);
(rootView.findViewById(R.id.margin)).setPadding(0, 0, 0, 0);
} else if (title.isEmpty()) {
setTextWithLinks(description,
((SpoilerRobotoTextView) rootView.findViewById(R.id.title)));
} else {
setTextWithLinks(title,
((SpoilerRobotoTextView) rootView.findViewById(R.id.title)));
setTextWithLinks(description,
((SpoilerRobotoTextView) rootView.findViewById(R.id.body)));
}
{
int type = new FontPreferences(getContext()).getFontTypeComment().getTypeface();
Typeface typeface;
if (type >= 0) {
typeface = RobotoTypefaceManager.obtainTypeface(getContext(), type);
} else {
typeface = Typeface.DEFAULT;
}
((SpoilerRobotoTextView) rootView.findViewById(R.id.body)).setTypeface(typeface);
}
{
int type = new FontPreferences(getContext()).getFontTypeTitle().getTypeface();
Typeface typeface;
if (type >= 0) {
typeface = RobotoTypefaceManager.obtainTypeface(getContext(), type);
} else {
typeface = Typeface.DEFAULT;
}
((SpoilerRobotoTextView) rootView.findViewById(R.id.title)).setTypeface(typeface);
}
final SlidingUpPanelLayout l =
(SlidingUpPanelLayout) rootView.findViewById(R.id.sliding_layout);
rootView.findViewById(R.id.title).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
l.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
}
});
rootView.findViewById(R.id.body).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
l.setPanelState(SlidingUpPanelLayout.PanelState.EXPANDED);
}
});
}
if (lq) {
rootView.findViewById(R.id.hq).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
loadImage(rootView, ImageFullNoSubmission.this, url);
rootView.findViewById(R.id.hq).setVisibility(View.GONE);
}
});
} else {
rootView.findViewById(R.id.hq).setVisibility(View.GONE);
}
if (getActivity().getIntent().hasExtra(MediaView.SUBMISSION_URL)) {
rootView.findViewById(R.id.comments).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getActivity().finish();
SubmissionsView.datachanged(adapterPosition);
}
});
} else {
rootView.findViewById(R.id.comments).setVisibility(View.GONE);
}
return rootView;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle bundle = this.getArguments();
i = bundle.getInt("page", 0);
}
}
public static void setTextWithLinks(String s, SpoilerRobotoTextView text) {
String[] parts = s.split("\\s+");
StringBuilder b = new StringBuilder();
for (String item : parts)
try {
URL url = new URL(item);
b.append(" <a href=\"").append(url).append("\">").append(url).append("</a>");
} catch (MalformedURLException e) {
b.append(" ").append(item);
}
text.setTextHtml(b.toString(), "no sub");
}
public static String readableFileSize(long size) {
if (size <= 0) return "0";
final String[] units = new String[]{"B", "kB", "MB", "GB", "TB"};
int digitGroups = (int) (Math.log10(size) / Math.log10(1024));
return new DecimalFormat("#,##0.#").format(size / Math.pow(1024, digitGroups))
+ " "
+ units[digitGroups];
}
private static void loadImage(final View rootView, Fragment f, String url) {
final SubsamplingScaleImageView image =
(SubsamplingScaleImageView) rootView.findViewById(R.id.image);
image.setMinimumDpi(70);
image.setMinimumTileDpi(240);
ImageView fakeImage = new ImageView(f.getActivity());
final TextView size = (TextView) rootView.findViewById(R.id.size);
fakeImage.setLayoutParams(
new LinearLayout.LayoutParams(image.getWidth(), image.getHeight()));
fakeImage.setScaleType(ImageView.ScaleType.CENTER_CROP);
((Reddit) f.getActivity().getApplication()).getImageLoader()
.displayImage(url, new ImageViewAware(fakeImage),
new DisplayImageOptions.Builder().resetViewBeforeLoading(true)
.cacheOnDisk(true)
.imageScaleType(ImageScaleType.NONE)
.cacheInMemory(false)
.build(), new ImageLoadingListener() {
private View mView;
@Override
public void onLoadingStarted(String imageUri, View view) {
mView = view;
size.setVisibility(View.VISIBLE);
}
@Override
public void onLoadingFailed(String imageUri, View view,
FailReason failReason) {
Log.v("Slide", "LOADING FAILED");
}
@Override
public void onLoadingComplete(String imageUri, View view,
Bitmap loadedImage) {
size.setVisibility(View.GONE);
image.setImage(ImageSource.bitmap(loadedImage));
(rootView.findViewById(R.id.progress)).setVisibility(View.GONE);
}
@Override
public void onLoadingCancelled(String imageUri, View view) {
Log.v("Slide", "LOADING CANCELLED");
}
}, new ImageLoadingProgressListener() {
@Override
public void onProgressUpdate(String imageUri, View view, int current,
int total) {
size.setText(readableFileSize(total));
((ProgressBar) rootView.findViewById(R.id.progress)).setProgress(
Math.round(100.0f * current / total));
}
});
}
public void showFirstDialog() {
runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialogWrapper.Builder(TumblrPager.this).setTitle(R.string.set_save_location)
.setMessage(R.string.set_save_location_msg)
.setPositiveButton(R.string.btn_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new FolderChooserDialogCreate.Builder(TumblrPager.this).chooseButton(
R.string.btn_select) // changes label of the choose button
.initialPath(Environment.getExternalStorageDirectory()
.getPath()) // changes initial path, defaults to external storage directory
.show();
}
})
.setNegativeButton(R.string.btn_no, null)
.show();
}
});
}
public void showNotifPhoto(final File localAbsoluteFilePath, final Bitmap loadedImage) {
MediaScannerConnection.scanFile(TumblrPager.this,
new String[]{localAbsoluteFilePath.getAbsolutePath()}, null,
new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
final Intent shareIntent = new Intent(Intent.ACTION_VIEW);
shareIntent.setDataAndType(Uri.fromFile(localAbsoluteFilePath), "image/*");
PendingIntent contentIntent =
PendingIntent.getActivity(TumblrPager.this, 0, shareIntent,
PendingIntent.FLAG_CANCEL_CURRENT);
Notification notif =
new NotificationCompat.Builder(TumblrPager.this).setContentTitle(
getString(R.string.info_photo_saved))
.setSmallIcon(R.drawable.notif)
.setLargeIcon(loadedImage)
.setContentIntent(contentIntent)
.setStyle(
new NotificationCompat.BigPictureStyle().bigPicture(
loadedImage))
.build();
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(NOTIFICATION_SERVICE);
mNotificationManager.notify(1, notif);
loadedImage.recycle();
}
});
}
private void shareImage(final String finalUrl) {
((Reddit) getApplication()).getImageLoader()
.loadImage(finalUrl, new SimpleImageLoadingListener() {
@Override
public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
shareImage(loadedImage);
}
});
}
/**
* Deletes all files in a folder
*
* @param dir to clear contents
*/
private void deleteFilesInDir(File dir) {
for (File child : dir.listFiles()) {
child.delete();
}
}
/**
* Converts an image to a PNG, stores it to the cache, then shares it. Saves the image to
* /cache/shared_image for easy deletion. If the /cache/shared_image folder already exists, we
* clear it's contents as to avoid increasing the cache size unnecessarily.
*
* @param bitmap image to share
*/
private void shareImage(final Bitmap bitmap) {
File image; //image to share
//check to see if the cache/shared_images directory is present
final File imagesDir =
new File(this.getCacheDir().toString() + File.separator + "shared_image");
if (!imagesDir.exists()) {
imagesDir.mkdir(); //create the folder if it doesn't exist
} else {
deleteFilesInDir(imagesDir);
}
try {
//creates a file in the cache; filename will be prefixed with "img" and end with ".png"
image = File.createTempFile("img", ".png", imagesDir);
FileOutputStream out = null;
try {
//convert image to png
out = new FileOutputStream(image);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
} finally {
if (out != null) {
out.close();
/**
* If a user has both a debug build and a release build installed, the authority name needs to be unique
*/
final String authority = (this.getPackageName()).concat(".")
.concat(MediaView.class.getSimpleName());
final Uri contentUri = FileProvider.getUriForFile(this, authority, image);
if (contentUri != null) {
final Intent shareImageIntent = new Intent(Intent.ACTION_SEND);
shareImageIntent.addFlags(
Intent.FLAG_GRANT_READ_URI_PERMISSION); //temp permission for receiving app to read this file
shareImageIntent.putExtra(Intent.EXTRA_STREAM, contentUri);
shareImageIntent.setDataAndType(contentUri,
getContentResolver().getType(contentUri));
//Select a share option
startActivity(Intent.createChooser(shareImageIntent,
getString(R.string.misc_img_share)));
} else {
Toast.makeText(this, getString(R.string.err_share_image), Toast.LENGTH_LONG)
.show();
}
}
}
} catch (IOException | NullPointerException e) {
e.printStackTrace();
Toast.makeText(this, getString(R.string.err_share_image), Toast.LENGTH_LONG).show();
}
}
public void showErrorDialog() {
runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialogWrapper.Builder(TumblrPager.this).setTitle(
R.string.err_something_wrong)
.setMessage(R.string.err_couldnt_save_choose_new)
.setPositiveButton(R.string.btn_yes, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new FolderChooserDialogCreate.Builder(TumblrPager.this).chooseButton(
R.string.btn_select) // changes label of the choose button
.initialPath(Environment.getExternalStorageDirectory()
.getPath()) // changes initial path, defaults to external storage directory
.show();
}
})
.setNegativeButton(R.string.btn_no, null)
.show();
}
});
}
@Override
public void onFolderSelection(FolderChooserDialogCreate dialog, File folder) {
if (folder != null) {
Reddit.appRestart.edit().putString("imagelocation", folder.getAbsolutePath()).apply();
Toast.makeText(this,
getString(R.string.settings_set_image_location, folder.getAbsolutePath())
+ folder.getAbsolutePath(), Toast.LENGTH_LONG).show();
}
}
}