package me.ccrama.redditslide.Activities;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.AsyncTask;
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.util.TypedValue;
import android.view.KeyEvent;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.AlertDialogWrapper;
import net.dean.jraw.models.Submission;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.Set;
import me.ccrama.redditslide.Authentication;
import me.ccrama.redditslide.Autocache.AutoCacheScheduler;
import me.ccrama.redditslide.Fragments.BlankFragment;
import me.ccrama.redditslide.Fragments.CommentPage;
import me.ccrama.redditslide.HasSeen;
import me.ccrama.redditslide.LastComments;
import me.ccrama.redditslide.Notifications.NotificationJobScheduler;
import me.ccrama.redditslide.R;
import me.ccrama.redditslide.Reddit;
import me.ccrama.redditslide.SettingValues;
import me.ccrama.redditslide.UserSubscriptions;
import me.ccrama.redditslide.util.LogUtil;
/**
* Created by ccrama on 9/17/2015.
* <p/>
* This activity takes parameters for a submission id (through intent or direct link), retrieves the
* Submission object, and then displays the submission with its comments.
*/
public class CommentsScreenSingle extends BaseActivityAnim {
OverviewPagerAdapter comments;
boolean np;
private ViewPager pager;
private String subreddit;
private String name;
private String context;
private int contextNumber;
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (requestCode == 14 && comments != null) {
comments.notifyDataSetChanged();
}
}
public static final String EXTRA_SUBREDDIT = "subreddit";
public static final String EXTRA_CONTEXT = "context";
public static final String EXTRA_CONTEXT_NUMBER = "contextNumber";
public static final String EXTRA_SUBMISSION = "submission";
public static final String EXTRA_NP = "np";
public static final String EXTRA_LOADMORE = "loadmore";
@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);
}
}
return super.dispatchKeyEvent(event);
}
@Override
public void onCreate(Bundle savedInstance) {
disableSwipeBackLayout();
getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
getWindow().getDecorView().setBackgroundDrawable(null);
super.onCreate(savedInstance);
applyColorTheme();
setContentView(R.layout.activity_slide);
name = getIntent().getExtras().getString(EXTRA_SUBMISSION, "");
subreddit = getIntent().getExtras().getString(EXTRA_SUBREDDIT, "");
np = getIntent().getExtras().getBoolean(EXTRA_NP, false);
context = getIntent().getExtras().getString(EXTRA_CONTEXT, "");
contextNumber = getIntent().getExtras().getInt(EXTRA_CONTEXT_NUMBER, 5);
if (subreddit.equals(Reddit.EMPTY_STRING)) {
new AsyncGetSubredditName().execute(name);
TypedValue typedValue = new TypedValue();
getTheme().resolveAttribute(R.attr.activity_background, typedValue, true);
int color = typedValue.data;
findViewById(R.id.content_view).setBackgroundColor(color);
} else {
setupAdapter();
}
if (Authentication.isLoggedIn && Authentication.me == null) {
new AsyncTask<Void, Void, Void>() {
@Override
protected Void doInBackground(Void... params) {
if (Authentication.reddit == null) {
new Authentication(getApplicationContext());
} else {
Authentication.me = Authentication.reddit.me();
Authentication.mod = Authentication.me.isMod();
Reddit.over18 = Authentication.me.isOver18();
Authentication.authentication.edit()
.putBoolean(Reddit.SHARED_PREF_IS_MOD, Authentication.mod)
.apply();
Authentication.authentication.edit()
.putBoolean(Reddit.SHARED_PREF_IS_OVER_18, Reddit.over18)
.apply();
if (Reddit.notificationTime != -1) {
Reddit.notifications = new NotificationJobScheduler(CommentsScreenSingle.this);
Reddit.notifications.start(getApplicationContext());
}
if (Reddit.cachedData.contains("toCache")) {
Reddit.autoCache = new AutoCacheScheduler(CommentsScreenSingle.this);
Reddit.autoCache.start(getApplicationContext());
}
final String name = Authentication.me.getFullName();
Authentication.name = name;
LogUtil.v("AUTHENTICATED");
UserSubscriptions.doCachedModSubs();
if (Authentication.reddit.isAuthenticated()) {
final Set<String> accounts =
Authentication.authentication.getStringSet("accounts", new HashSet<String>());
if (accounts.contains(name)) { //convert to new system
accounts.remove(name);
accounts.add(name + ":" + Authentication.refresh);
Authentication.authentication.edit()
.putStringSet("accounts", accounts)
.apply(); //force commit
}
Authentication.isLoggedIn = true;
Reddit.notFirst = true;
}
}
return null;
}
}.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR);
}
}
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);
}
private void setupAdapter() {
themeSystemBars(subreddit);
setRecentBar(subreddit);
pager = (ViewPager) findViewById(R.id.content_view);
comments = new OverviewPagerAdapter(getSupportFragmentManager());
pager.setAdapter(comments);
pager.setBackgroundColor(Color.TRANSPARENT);
pager.setCurrentItem(1);
pager.setOnPageChangeListener(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) {
((OverviewPagerAdapter) pager.getAdapter()).blankPage.doOffset(positionOffset);
pager.setBackgroundColor(adjustAlpha(positionOffset * 0.7f));
}
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
boolean locked;
boolean archived;
boolean contest;
private class AsyncGetSubredditName extends AsyncTask<String, Void, String> {
@Override
protected void onPostExecute(String s) {
subreddit = s;
setupAdapter();
}
@Override
protected String doInBackground(String... params) {
try {
final Submission s = Authentication.reddit.getSubmission(params[0]);
if (SettingValues.storeHistory) {
if (SettingValues.storeNSFWHistory && s.isNsfw() || !s.isNsfw()) {
HasSeen.addSeen(s.getFullName());
}
LastComments.setComments(s);
}
HasSeen.setHasSeenSubmission(new ArrayList<Submission>() {{
this.add(s);
}});
locked = s.isLocked();
archived = s.isArchived();
contest = s.getDataNode().get("contest_mode").asBoolean();
if(s.getSubredditName() == null){
subreddit = "Promoted";
} else {
subreddit = s.getSubredditName();
}
return subreddit;
} catch (Exception e) {
try {
runOnUiThread(new Runnable() {
@Override
public void run() {
new AlertDialogWrapper.Builder(CommentsScreenSingle.this).setTitle(
R.string.submission_not_found)
.setMessage(R.string.submission_not_found_msg)
.setPositiveButton(R.string.btn_ok,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog,
int which) {
finish();
}
})
.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
finish();
}
})
.show();
}
});
} catch (Exception ignored) {
}
return null;
}
}
}
public class OverviewPagerAdapter extends FragmentStatePagerAdapter {
private Fragment 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) {
if (getCurrentFragment() != object) {
mCurrentFragment = (Fragment) object;
}
super.setPrimaryItem(container, position, object);
}
@Override
public Fragment getItem(int i) {
if (i == 0) {
blankPage = new BlankFragment();
return blankPage;
} else {
Fragment f = new CommentPage();
Bundle args = new Bundle();
if (name.contains("t3_")) name = name.substring(3, name.length());
args.putString("id", name);
args.putString("context", context);
if (SettingValues.storeHistory) {
if (context != null && !context.isEmpty() && !context.equals(
Reddit.EMPTY_STRING)) {
HasSeen.addSeen("t1_" + context);
} else {
HasSeen.addSeen(name);
}
}
args.putBoolean("archived", archived);
args.putBoolean("locked", locked);
args.putBoolean("contest", contest);
args.putInt("contextNumber", contextNumber);
args.putString("subreddit", subreddit);
args.putBoolean("single", getIntent().getBooleanExtra(EXTRA_LOADMORE, true));
args.putBoolean("np", np);
f.setArguments(args);
return f;
}
}
@Override
public int getCount() {
return 2;
}
}
}