package me.ccrama.redditslide.Activities; import android.content.Intent; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.os.Bundle; 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.widget.RecyclerView; import android.view.KeyEvent; import android.view.ViewGroup; import android.view.Window; import net.dean.jraw.models.Submission; import java.util.ArrayList; import java.util.List; 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.Fragments.BlankFragment; import me.ccrama.redditslide.Fragments.CommentPage; import me.ccrama.redditslide.LastComments; 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; /** * This activity is responsible for the view when clicking on a post, showing the post and its * comments underneath with the slide left/right for the next post. * <p/> * When the end of the currently loaded posts is being reached, more posts are loaded asynchronously * in {@link OverviewPagerAdapter}. * <p/> * Comments are displayed in the {@link CommentPage} fragment. * <p/> * Created by ccrama on 9/17/2015. */ public class CommentsScreen extends BaseActivityAnim 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 ArrayList<Submission> currentPosts; public PostLoader subredditPosts; int firstPage; OverviewPagerAdapter comments; private String subreddit; private String baseSubreddit; String multireddit; String profile; @Override public boolean dispatchKeyEvent(KeyEvent event) { int keyCode = event.getKeyCode(); if (SettingValues.commentVolumeNav) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: return ((CommentPage) comments.getCurrentFragment()).onKeyDown(keyCode, event); case KeyEvent.KEYCODE_VOLUME_DOWN: return ((CommentPage) comments.getCurrentFragment()).onKeyDown(keyCode, event); default: return super.dispatchKeyEvent(event); } } else { return super.dispatchKeyEvent(event); } } @Override public void onDestroy() { super.onDestroy(); if (!Reddit.appRestart.contains("tutorialSwipeComment")) { Reddit.appRestart.edit().putBoolean("tutorialSwipeComment", true).apply(); } else if (!Reddit.appRestart.contains("tutorial_comm")) { Reddit.appRestart.edit().putBoolean("tutorial_comm", true).apply(); } } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if (requestCode == 14) { comments.notifyDataSetChanged(); //todo make this work } if (requestCode == 333) { Reddit.appRestart.edit().putBoolean("tutorialSwipeComments", true).apply(); } } public int currentPage; public ArrayList<Integer> seen; 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 boolean popup; @Override public void onCreate(Bundle savedInstance) { popup = SettingValues.tabletUI && getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE && !SettingValues.fullCommentOverride; seen = new ArrayList<>(); if (popup) { disableSwipeBackLayout(); applyColorTheme(); setTheme(R.style.popup); supportRequestWindowFeature(Window.FEATURE_NO_TITLE); getWindow().setBackgroundDrawableResource(android.R.color.transparent); super.onCreate(savedInstance); setContentView(R.layout.activity_slide_popup); } else { overrideSwipeFromAnywhere(); applyColorTheme(); getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); getWindow().getDecorView().setBackgroundDrawable(null); super.onCreate(savedInstance); setContentView(R.layout.activity_slide); } Reddit.setDefaultErrorHandler(this); firstPage = getIntent().getExtras().getInt(EXTRA_PAGE, -1); baseSubreddit = getIntent().getExtras().getString(EXTRA_SUBREDDIT); subreddit = baseSubreddit; multireddit = getIntent().getExtras().getString(EXTRA_MULTIREDDIT); profile = getIntent().getExtras().getString(EXTRA_PROFILE, ""); currentPosts = new ArrayList<>(); if (multireddit != null) { subredditPosts = new MultiredditPosts(multireddit, profile); } else { baseSubreddit = subreddit.toLowerCase(); subredditPosts = new SubredditPosts(baseSubreddit, CommentsScreen.this); } if (firstPage == RecyclerView.NO_POSITION || firstPage < 0) { firstPage = 0; //IS SINGLE POST } else { OfflineSubreddit o = OfflineSubreddit.getSubreddit( multireddit == null ? baseSubreddit : "multi" + multireddit, OfflineSubreddit.currentid, !Authentication.didOnline, CommentsScreen.this); subredditPosts.getPosts().addAll(o.submissions); currentPosts.addAll(subredditPosts.getPosts()); } if (getIntent().hasExtra("fullname")) { String fullname = getIntent().getStringExtra("fullname"); for (int i = 0; i < currentPosts.size(); i++) { if (currentPosts.get(i).getFullName().equals(fullname)) { if (i != firstPage) firstPage = i; break; } } } if (currentPosts.isEmpty() || currentPosts.size() < firstPage || currentPosts.get(firstPage) == null || firstPage < 0) { finish(); } else { updateSubredditAndSubmission(currentPosts.get(firstPage)); final ViewPager pager = (ViewPager) findViewById(R.id.content_view); comments = new OverviewPagerAdapter(getSupportFragmentManager()); pager.setAdapter(comments); currentPage = firstPage; pager.setCurrentItem(firstPage + 1); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position <= firstPage && positionOffsetPixels == 0) { finish(); } if (position == firstPage && !popup) { if (((OverviewPagerAdapter) pager.getAdapter()).blankPage != null) { ((OverviewPagerAdapter) pager.getAdapter()).blankPage.doOffset( positionOffset); } pager.setBackgroundColor(adjustAlpha(positionOffset * 0.7f)); } } @Override public void onPageSelected(int position) { if (position != firstPage && position < currentPosts.size()) { position = position - 1; if (position < 0) position = 0; updateSubredditAndSubmission(currentPosts.get(position)); if (currentPosts.size() - 2 <= position && subredditPosts.hasMore()) { subredditPosts.loadMore(CommentsScreen.this.getApplicationContext(), CommentsScreen.this, false); } currentPage = position; seen.add(position); Bundle conData = new Bundle(); conData.putIntegerArrayList("seen", seen); conData.putInt("lastPage", position); Intent intent = new Intent(); intent.putExtras(conData); setResult(RESULT_OK, intent); } } @Override public void onPageScrollStateChanged(int state) { } } ); } if (!Reddit.appRestart.contains("tutorialSwipeComments")) { Intent i = new Intent(this, SwipeTutorial.class); i.putExtra("subtitle", "Swipe from the left edge to exit comments.\n\nYou can swipe in the middle to get to the previous/next submission."); startActivityForResult(i, 333); } } private void updateSubredditAndSubmission(Submission post) { subreddit = post.getSubredditName(); if(post.getSubredditName() == null){ subreddit = "Promoted"; } themeSystemBars(subreddit); setRecentBar(subreddit); } @Override public void updateSuccess(final List<Submission> submissions, final int startIndex) { if (SettingValues.storeHistory) LastComments.setCommentsSince(submissions); currentPosts.clear(); currentPosts.addAll(submissions); runOnUiThread(new Runnable() { @Override public void run() { if (startIndex != -1) { // TODO determine correct behaviour //comments.notifyItemRangeInserted(startIndex, posts.posts.size()); comments.notifyDataSetChanged(); } else { comments.notifyDataSetChanged(); } } }); } @Override public void updateOffline(List<Submission> submissions, final long cacheTime) { runOnUiThread(new Runnable() { @Override public void run() { comments.notifyDataSetChanged(); } }); } @Override public void updateOfflineError() { } @Override public void updateError() { } @Override public void updateViews() { } public class OverviewPagerAdapter extends FragmentStatePagerAdapter { private CommentPage mCurrentFragment; public BlankFragment blankPage; public OverviewPagerAdapter(FragmentManager fm) { super(fm); } public Fragment getCurrentFragment() { return mCurrentFragment; } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); if (getCurrentFragment() != object && object != null && object instanceof CommentPage) { mCurrentFragment = (CommentPage) object; if (!mCurrentFragment.loaded && mCurrentFragment.isAdded()) { mCurrentFragment.doAdapter(true); } } } @Override public Fragment getItem(int i) { if (i <= firstPage || i == 0) { blankPage = new BlankFragment(); return blankPage; } else { i = i - 1; Fragment f = new CommentPage(); Bundle args = new Bundle(); String name = currentPosts.get(i).getFullName(); args.putString("id", name.substring(3, name.length())); args.putBoolean("archived", currentPosts.get(i).isArchived()); args.putBoolean("contest", currentPosts.get(i).getDataNode().get("contest_mode").asBoolean()); args.putBoolean("locked", currentPosts.get(i).isLocked()); args.putInt("page", i); args.putString("subreddit", currentPosts.get(i).getSubredditName()); args.putString("baseSubreddit", multireddit == null ? baseSubreddit : "multi" + multireddit); f.setArguments(args); return f; } } @Override public int getCount() { return currentPosts.size() + 1; } } }