package me.ccrama.redditslide.Activities;
import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Color;
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.view.ViewPager;
import android.support.v7.app.NotificationCompat;
import android.support.v7.widget.RecyclerView;
import android.support.v7.widget.Toolbar;
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.Toast;
import com.afollestad.materialdialogs.AlertDialogWrapper;
import org.jetbrains.annotations.NotNull;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import me.ccrama.redditslide.Adapters.AlbumView;
import me.ccrama.redditslide.ColorPreferences;
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.Views.PreCachingLayoutManager;
import me.ccrama.redditslide.Views.ToolbarColorizeHelper;
/**
* Created by ccrama on 3/5/2015. <p/> This class is responsible for accessing the Imgur api to get
* the album json data from a URL or Imgur hash. It extends FullScreenActivity and supports swipe
* from anywhere.
*/
public class Album extends FullScreenActivity implements FolderChooserDialogCreate.FolderCallback {
public static final String EXTRA_URL = "url";
public static final String SUBREDDIT = "subreddit";
private List<Image> images;
private int adapterPosition;
@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()),
Toast.LENGTH_LONG).show();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
onBackPressed();
}
if (id == R.id.slider) {
SettingValues.albumSwipe = true;
SettingValues.prefs.edit().putBoolean(SettingValues.PREF_ALBUM_SWIPE, true).apply();
Intent i = new Intent(Album.this, AlbumPager.class);
int adapterPosition = getIntent().getIntExtra(MediaView.ADAPTER_POSITION, -1);
i.putExtra(MediaView.ADAPTER_POSITION, adapterPosition);
if (getIntent().hasExtra(MediaView.SUBMISSION_URL)) {
i.putExtra(MediaView.SUBMISSION_URL,
getIntent().getStringExtra(MediaView.SUBMISSION_URL));
}
i.putExtra("url", url);
startActivity(i);
finish();
}
if (id == R.id.grid) {
mToolbar.findViewById(R.id.grid).callOnClick();
}
if (id == R.id.comments) {
SubmissionsView.datachanged(adapterPosition);
finish();
}
if (id == R.id.external) {
Reddit.defaultShare(url, this);
}
if (id == R.id.download) {
for (final Image elem : images) {
doImageSave(false, elem.getImageUrl());
}
}
return super.onOptionsItemSelected(item);
}
public void doImageSave(boolean isGif, String contentUrl) {
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);
startService(i);
}
} else {
MediaView.doOnClick.run();
}
}
public void showFirstDialog() {
try {
new AlertDialogWrapper.Builder(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(Album.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();
} catch (Exception ignored) {
}
}
public void showErrorDialog() {
new AlertDialogWrapper.Builder(Album.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(Album.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();
}
private void saveImageGallery(final Bitmap bitmap, String URL) {
if (Reddit.appRestart.getString("imagelocation", "").isEmpty()) {
showFirstDialog();
} else if (!new File(Reddit.appRestart.getString("imagelocation", "")).exists()) {
showErrorDialog();
} else {
File f = new File(Reddit.appRestart.getString("imagelocation", "")
+ File.separator
+ UUID.randomUUID().toString()
+ ".png");
FileOutputStream out = null;
try {
f.createNewFile();
out = new FileOutputStream(f);
bitmap.compress(Bitmap.CompressFormat.PNG, 100, out);
} catch (Exception e) {
e.printStackTrace();
showErrorDialog();
} finally {
try {
if (out != null) {
out.close();
}
} catch (IOException e) {
e.printStackTrace();
showErrorDialog();
}
}
}
}
public String url;
public String subreddit;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.album_vertical, menu);
adapterPosition = getIntent().getIntExtra(MediaView.ADAPTER_POSITION, -1);
if (adapterPosition < 0) {
menu.findItem(R.id.comments).setVisible(false);
}
return true;
}
public OverviewPagerAdapter album;
public void onCreate(Bundle savedInstanceState) {
overrideSwipeFromAnywhere();
super.onCreate(savedInstanceState);
getTheme().applyStyle(
new ColorPreferences(this).getDarkThemeSubreddit(ColorPreferences.FONT_STYLE),
true);
setContentView(R.layout.album);
//Keep the screen on
getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON);
if(getIntent().hasExtra(SUBREDDIT)){
this.subreddit = getIntent().getExtras().getString(SUBREDDIT);
}
final ViewPager pager = (ViewPager) findViewById(R.id.images);
album = new OverviewPagerAdapter(getSupportFragmentManager());
pager.setAdapter(album);
pager.setCurrentItem(1);
pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset,
int positionOffsetPixels) {
if (position == 0 && positionOffsetPixels == 0) {
finish();
}
if (position == 0
&& ((OverviewPagerAdapter) pager.getAdapter()).blankPage != null) {
if (((OverviewPagerAdapter) pager.getAdapter()).blankPage
!= null) {
((OverviewPagerAdapter) pager.getAdapter()).blankPage
.doOffset(positionOffset);
}
((OverviewPagerAdapter) pager.getAdapter()).blankPage.realBack.setBackgroundColor(
adjustAlpha(positionOffset * 0.7f));
}
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
}
);
if (!Reddit.appRestart.contains("tutorialSwipe")) {
startActivityForResult(new Intent(this, SwipeTutorial.class), 3);
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 3) {
Reddit.appRestart.edit().putBoolean("tutorialSwipe", true).apply();
}
}
public class OverviewPagerAdapter extends FragmentStatePagerAdapter {
public BlankFragment blankPage;
public AlbumFrag album;
public OverviewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
if (i == 0) {
blankPage = new BlankFragment();
return blankPage;
} else {
album = new AlbumFrag();
return album;
}
}
@Override
public int getCount() {
return 2;
}
}
public int adjustAlpha(float factor) {
int alpha = Math.round(Color.alpha(Color.BLACK) * factor);
int red = Color.red(Color.BLACK);
int green = Color.green(Color.BLACK);
int blue = Color.blue(Color.BLACK);
return Color.argb(alpha, red, green, blue);
}
public static class AlbumFrag extends Fragment {
View rootView;
public RecyclerView recyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
rootView = inflater.inflate(R.layout.fragment_verticalalbum, container, false);
final PreCachingLayoutManager mLayoutManager;
mLayoutManager = new PreCachingLayoutManager(getActivity());
recyclerView = (RecyclerView) rootView.findViewById(R.id.images);
recyclerView.setLayoutManager(mLayoutManager);
((Album) getActivity()).url =
getActivity().getIntent().getExtras().getString(EXTRA_URL, "");
((BaseActivity) getActivity()).setShareUrl(((Album) getActivity()).url);
new LoadIntoRecycler(((Album) getActivity()).url, getActivity()).executeOnExecutor(
AsyncTask.THREAD_POOL_EXECUTOR);
((Album) getActivity()).mToolbar = (Toolbar) rootView.findViewById(R.id.toolbar);
((Album) getActivity()).mToolbar.setTitle(R.string.type_album);
ToolbarColorizeHelper.colorizeToolbar(((Album) getActivity()).mToolbar, Color.WHITE,
(getActivity()));
((Album) getActivity()).setSupportActionBar(((Album) getActivity()).mToolbar);
((Album) getActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);
((Album) getActivity()).mToolbar.setPopupTheme(
new ColorPreferences(getActivity()).getDarkThemeSubreddit(
ColorPreferences.FONT_STYLE));
return rootView;
}
public class LoadIntoRecycler extends AlbumUtils.GetAlbumWithCallback {
String url;
public LoadIntoRecycler(@NotNull String url, @NotNull Activity baseActivity) {
super(url, baseActivity);
this.url = url;
}
@Override
public void onError() {
if (getActivity() != null) {
getActivity().runOnUiThread(new Runnable() {
@Override
public void run() {
try {
new AlertDialogWrapper.Builder(getActivity()).setTitle(
R.string.error_album_not_found)
.setMessage(R.string.error_album_not_found_text)
.setNegativeButton(R.string.btn_no,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
getActivity().finish();
}
})
.setCancelable(false)
.setPositiveButton(R.string.btn_yes,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
Intent i = new Intent(getActivity(),
Website.class);
i.putExtra(Website.EXTRA_URL, url);
startActivity(i);
getActivity().finish();
}
})
.show();
} catch (Exception e) {
}
}
});
}
}
@Override
public void doWithData(final List<Image> jsonElements) {
super.doWithData(jsonElements);
if (getActivity() != null) {
getActivity().findViewById(R.id.progress).setVisibility(View.GONE);
((Album) getActivity()).images = new ArrayList<>(jsonElements);
AlbumView adapter = new AlbumView(baseActivity, ((Album) getActivity()).images,
getActivity().findViewById(R.id.toolbar).getHeight(), ((Album) getActivity()).subreddit);
recyclerView.setAdapter(adapter);
}
}
}
}
}