package me.ccrama.redditslide.Activities;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import net.dean.jraw.models.Submission;
import java.util.ArrayList;
import java.util.List;
import me.ccrama.redditslide.Adapters.GalleryView;
import me.ccrama.redditslide.Adapters.MultiredditPosts;
import me.ccrama.redditslide.Adapters.SubmissionDisplay;
import me.ccrama.redditslide.Adapters.SubredditPosts;
import me.ccrama.redditslide.Authentication;
import me.ccrama.redditslide.ContentType;
import me.ccrama.redditslide.Fragments.AlbumFull;
import me.ccrama.redditslide.Fragments.MediaFragment;
import me.ccrama.redditslide.Fragments.SelftextFull;
import me.ccrama.redditslide.Fragments.TitleFull;
import me.ccrama.redditslide.OfflineSubreddit;
import me.ccrama.redditslide.PostLoader;
import me.ccrama.redditslide.R;
import me.ccrama.redditslide.Reddit;
import me.ccrama.redditslide.SettingValues;
import me.ccrama.redditslide.Views.CatchStaggeredGridLayoutManager;
/**
* Created by ccrama on 9/17/2015.
*/
public class Gallery extends FullScreenActivity implements SubmissionDisplay {
public static final String EXTRA_PROFILE = "profile";
public static final String EXTRA_PAGE = "page";
public static final String EXTRA_SUBREDDIT = "subreddit";
public static final String EXTRA_MULTIREDDIT = "multireddit";
public PostLoader subredditPosts;
public String subreddit;
public ArrayList<Submission> baseSubs;
@Override
public void onCreate(Bundle savedInstance) {
overrideSwipeFromAnywhere();
subreddit = getIntent().getExtras().getString(EXTRA_SUBREDDIT);
String multireddit = getIntent().getExtras().getString(EXTRA_MULTIREDDIT);
String profile = getIntent().getExtras().getString(EXTRA_PROFILE, "");
if (multireddit != null) {
subredditPosts = new MultiredditPosts(multireddit, profile);
} else {
subredditPosts = new SubredditPosts(subreddit, Gallery.this);
}
subreddit = multireddit == null ? subreddit : ("multi" + multireddit);
if (multireddit == null) {
setShareUrl("https://reddit.com/r/" + subreddit);
}
applyDarkColorTheme(subreddit);
super.onCreate(savedInstance);
setContentView(R.layout.gallery);
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);
long offline = getIntent().getLongExtra("offline", 0L);
final OfflineSubreddit submissions =
OfflineSubreddit.getSubreddit(subreddit, offline, !Authentication.didOnline, this);
baseSubs = new ArrayList<>();
for (Submission s : submissions.submissions) {
if (s.getThumbnails() != null && s.getThumbnails().getSource() != null) {
baseSubs.add(s);
} else if (ContentType.getContentType(s) == ContentType.Type.IMAGE) {
baseSubs.add(s);
}
subredditPosts.getPosts().add(s);
}
rv = (RecyclerView) findViewById(R.id.content_view);
recyclerAdapter = new GalleryView(this, baseSubs, subreddit);
RecyclerView.LayoutManager layoutManager =
createLayoutManager(getNumColumns(getResources().getConfiguration().orientation));
rv.setLayoutManager(layoutManager);
rv.setAdapter(recyclerAdapter);
rv.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
int[] firstVisibleItems;
firstVisibleItems =
((CatchStaggeredGridLayoutManager) rv.getLayoutManager()).findFirstVisibleItemPositions(
null);
if (firstVisibleItems != null && firstVisibleItems.length > 0) {
for (int firstVisibleItem : firstVisibleItems) {
pastVisiblesItems = firstVisibleItem;
}
}
if ((visibleItemCount + pastVisiblesItems) + 5 >= totalItemCount) {
if (subredditPosts instanceof SubredditPosts) {
if (!((SubredditPosts) subredditPosts).loading) {
((SubredditPosts) subredditPosts).loading = true;
((SubredditPosts) subredditPosts).loadMore(Gallery.this, Gallery.this,
false, subreddit);
}
} else if (subredditPosts instanceof MultiredditPosts) {
if (!((MultiredditPosts) subredditPosts).loading) {
((MultiredditPosts) subredditPosts).loading = true;
(subredditPosts).loadMore(Gallery.this, Gallery.this, false);
}
}
}
}
});
}
GalleryView recyclerAdapter;
public int pastVisiblesItems;
public int visibleItemCount;
public int totalItemCount;
RecyclerView rv;
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
final int currentOrientation = newConfig.orientation;
final CatchStaggeredGridLayoutManager mLayoutManager =
(CatchStaggeredGridLayoutManager) rv.getLayoutManager();
mLayoutManager.setSpanCount(getNumColumns(currentOrientation));
}
@Override
public void updateSuccess(final List<Submission> submissions, final int startIndex) {
runOnUiThread(new Runnable() {
@Override
public void run() {
int startSize = baseSubs.size();
for (Submission s : submissions) {
if (!baseSubs.contains(s)
&& s.getThumbnails() != null
&& s.getThumbnails().getSource() != null) {
baseSubs.add(s);
}
}
recyclerAdapter.notifyItemRangeInserted(startSize, baseSubs.size() - startSize);
}
});
}
@Override
public void updateOffline(List<Submission> submissions, final long cacheTime) {
runOnUiThread(new Runnable() {
@Override
public void run() {
recyclerAdapter.notifyDataSetChanged();
}
});
}
@Override
public void updateOfflineError() {
}
@Override
public void updateError() {
}
@Override
public void updateViews() {
recyclerAdapter.notifyDataSetChanged();
}
@NonNull
private RecyclerView.LayoutManager createLayoutManager(final int numColumns) {
return new CatchStaggeredGridLayoutManager(numColumns,
CatchStaggeredGridLayoutManager.VERTICAL);
}
private int getNumColumns(final int orientation) {
final int numColumns;
if (orientation == Configuration.ORIENTATION_LANDSCAPE && SettingValues.tabletUI) {
numColumns = Reddit.dpWidth;
} else if (orientation == Configuration.ORIENTATION_PORTRAIT
&& SettingValues.dualPortrait) {
numColumns = 2;
} else {
numColumns = 1;
}
return numColumns;
}
public class OverviewPagerAdapter extends FragmentStatePagerAdapter {
public OverviewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment f = null;
ContentType.Type t = ContentType.getContentType(baseSubs.get(i));
if (baseSubs.size() - 2 <= i && subredditPosts.hasMore()) {
subredditPosts.loadMore(Gallery.this.getApplicationContext(), Gallery.this, false);
}
switch (t) {
case GIF:
case IMAGE:
case IMGUR:
case REDDIT:
case EXTERNAL:
case SPOILER:
case XKCD:
case DEVIANTART:
case EMBEDDED:
case LINK:
case VID_ME:
case STREAMABLE:
case VIDEO: {
f = new MediaFragment();
Bundle args = new Bundle();
Submission submission = baseSubs.get(i);
String previewUrl = "";
if (t != ContentType.Type.XKCD
&& submission.getDataNode().has("preview")
&& submission.getDataNode()
.get("preview")
.get("images")
.get(0)
.get("source")
.has("height")) { //Load the preview image which has probably already been cached in memory instead of the direct link
previewUrl = submission.getDataNode()
.get("preview")
.get("images")
.get(0)
.get("source")
.get("url")
.asText();
}
args.putString("contentUrl", submission.getUrl());
args.putString("firstUrl", previewUrl);
args.putInt("page", i);
args.putString("sub", subreddit);
f.setArguments(args);
}
break;
case SELF: {
if (baseSubs.get(i).getSelftext().isEmpty()) {
f = new TitleFull();
Bundle args = new Bundle();
args.putInt("page", i);
args.putString("sub", subreddit);
f.setArguments(args);
} else {
f = new SelftextFull();
Bundle args = new Bundle();
args.putInt("page", i);
args.putString("sub", subreddit);
f.setArguments(args);
}
}
break;
case ALBUM: {
f = new AlbumFull();
Bundle args = new Bundle();
args.putInt("page", i);
args.putString("sub", subreddit);
f.setArguments(args);
}
break;
case NONE: {
if (baseSubs.get(i).getSelftext().isEmpty()) {
f = new TitleFull();
Bundle args = new Bundle();
args.putInt("page", i);
args.putString("sub", subreddit);
f.setArguments(args);
} else {
f = new SelftextFull();
Bundle args = new Bundle();
args.putInt("page", i);
args.putString("sub", subreddit);
f.setArguments(args);
}
}
break;
}
return f;
}
@Override
public int getCount() {
return baseSubs.size();
}
}
}