package me.ccrama.redditslide.Activities; import android.app.Dialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.SharedPreferences; import android.content.res.Configuration; import android.graphics.Color; import android.graphics.drawable.ColorDrawable; import android.net.Uri; import android.os.AsyncTask; import android.os.Bundle; import android.os.Parcelable; import android.support.annotation.NonNull; import android.support.design.widget.CoordinatorLayout; import android.support.design.widget.Snackbar; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.widget.DrawerLayout; import android.support.v7.view.ContextThemeWrapper; import android.support.v7.widget.AppCompatCheckBox; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.text.Spannable; import android.util.Log; import android.view.Gravity; 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.animation.LinearInterpolator; import android.widget.CompoundButton; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.TextView; import android.widget.Toast; import com.afollestad.materialdialogs.AlertDialogWrapper; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; import com.fasterxml.jackson.databind.JsonNode; import net.dean.jraw.ApiException; import net.dean.jraw.http.MultiRedditUpdateRequest; import net.dean.jraw.http.NetworkException; import net.dean.jraw.managers.AccountManager; import net.dean.jraw.managers.ModerationManager; import net.dean.jraw.managers.MultiRedditManager; import net.dean.jraw.models.FlairTemplate; import net.dean.jraw.models.MultiReddit; import net.dean.jraw.models.MultiSubreddit; import net.dean.jraw.models.Submission; import net.dean.jraw.models.Subreddit; import net.dean.jraw.models.UserRecord; import net.dean.jraw.paginators.Sorting; import net.dean.jraw.paginators.TimePeriod; import net.dean.jraw.paginators.UserRecordPaginator; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import me.ccrama.redditslide.Adapters.SettingsSubAdapter; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.ColorPreferences; import me.ccrama.redditslide.Constants; import me.ccrama.redditslide.Fragments.BlankFragment; import me.ccrama.redditslide.Fragments.CommentPage; import me.ccrama.redditslide.Fragments.SubmissionsView; import me.ccrama.redditslide.ImageFlairs; import me.ccrama.redditslide.Notifications.CheckForMail; import me.ccrama.redditslide.OfflineSubreddit; import me.ccrama.redditslide.PostMatch; import me.ccrama.redditslide.R; import me.ccrama.redditslide.Reddit; import me.ccrama.redditslide.SettingValues; import me.ccrama.redditslide.SpoilerRobotoTextView; import me.ccrama.redditslide.UserSubscriptions; import me.ccrama.redditslide.Views.CatchStaggeredGridLayoutManager; import me.ccrama.redditslide.Views.CommentOverflow; import me.ccrama.redditslide.Views.PreCachingLayoutManager; import me.ccrama.redditslide.Views.SidebarLayout; import me.ccrama.redditslide.Views.ToggleSwipeViewPager; import me.ccrama.redditslide.Visuals.Palette; import me.ccrama.redditslide.util.LogUtil; import me.ccrama.redditslide.util.OnSingleClickListener; import me.ccrama.redditslide.util.SubmissionParser; public class SubredditView extends BaseActivity { public static final String EXTRA_SUBREDDIT = "subreddit"; public boolean canSubmit = true; public String subreddit; public Submission openingComments; public int currentComment; public OverviewPagerAdapter adapter; public String term; public ToggleSwipeViewPager pager; public boolean singleMode; public boolean commentPager; public boolean loaded; View header; Subreddit sub; private DrawerLayout drawerLayout; private boolean currentlySubbed = false; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { // Check which request we're responding to if (requestCode == 2) { // Make sure the request was successful pager.setAdapter(new OverviewPagerAdapter(getSupportFragmentManager())); } else if (requestCode == 1) { restartTheme(); } else if (requestCode == 940) { if (adapter != null && adapter.getCurrentFragment() != null) { if (resultCode == RESULT_OK) { LogUtil.v("Doing hide posts"); ArrayList<Integer> posts = data.getIntegerArrayListExtra("seen"); ((SubmissionsView) adapter.getCurrentFragment()).adapter.refreshView(posts); if (data.hasExtra("lastPage") && data.getIntExtra("lastPage", 0) != 0 && ((SubmissionsView) adapter.getCurrentFragment()).rv.getLayoutManager() instanceof LinearLayoutManager) { ((LinearLayoutManager) ((SubmissionsView) adapter.getCurrentFragment()).rv.getLayoutManager()) .scrollToPositionWithOffset(data.getIntExtra("lastPage", 0) + 1, mToolbar.getHeight()); } } else { ((SubmissionsView) adapter.getCurrentFragment()).adapter.refreshView(); } } } else { super.onActivityResult(requestCode, resultCode, data); } } @Override public void onBackPressed() { if (drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.START) || drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.END)) { drawerLayout.closeDrawers(); } else if (commentPager && pager.getCurrentItem() == 2) { pager.setCurrentItem(pager.getCurrentItem() - 1); } else { super.onBackPressed(); } } @Override public void onCreate(Bundle savedInstanceState) { overrideSwipeFromAnywhere(); if (SettingValues.commentPager && SettingValues.single) { disableSwipeBackLayout(); } getWindow().setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT)); getWindow().getDecorView().setBackgroundDrawable(null); super.onCreate(savedInstanceState); if (!restarting) { overridePendingTransition(R.anim.slideright, 0); } else { restarting = false; } subreddit = getIntent().getExtras().getString(EXTRA_SUBREDDIT, ""); applyColorTheme(subreddit); setContentView(R.layout.activity_singlesubreddit); setupSubredditAppBar(R.id.toolbar, subreddit, true, subreddit); header = findViewById(R.id.header); drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); setResult(3); mToolbar.setPopupTheme(new ColorPreferences(this).getFontStyle().getBaseId()); pager = (ToggleSwipeViewPager) findViewById(R.id.content_view); singleMode = SettingValues.single; commentPager = false; if (singleMode) commentPager = SettingValues.commentPager; if (commentPager) { adapter = new OverviewPagerAdapterComment(getSupportFragmentManager()); pager.setSwipeLeftOnly(false); pager.setSwipingEnabled(true); } else { adapter = new OverviewPagerAdapter(getSupportFragmentManager()); } pager.setAdapter(adapter); pager.setCurrentItem(1); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int[] firstVisibleItems; int pastVisiblesItems = 0; firstVisibleItems = ((CatchStaggeredGridLayoutManager) ((SubmissionsView) (adapter.getCurrentFragment())).rv .getLayoutManager()).findFirstVisibleItemPositions(null); if (firstVisibleItems != null && firstVisibleItems.length > 0) { for (int firstVisibleItem : firstVisibleItems) { pastVisiblesItems = firstVisibleItem; } } if (pastVisiblesItems > 8) { ((SubmissionsView) (adapter.getCurrentFragment())).rv.scrollToPosition(0); header.animate() .translationY(header.getHeight()) .setInterpolator(new LinearInterpolator()) .setDuration(180); } else { ((SubmissionsView) (adapter.getCurrentFragment())).rv.smoothScrollToPosition(0); } ((SubmissionsView) (adapter.getCurrentFragment())).resetScroll(); } }); if (!subreddit.equals("random") && !subreddit.equals("all") && !subreddit.equals("frontpage") && !subreddit.equals("friends") && !subreddit.equals("mod") && !subreddit.equals("myrandom") && !subreddit.equals("randnsfw") && !subreddit.equals("popular") && !subreddit.contains("+")) { executeAsyncSubreddit(subreddit); } else { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); } } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); if (SettingValues.expandedToolbar) { inflater.inflate(R.menu.menu_single_subreddit_expanded, menu); } else { inflater.inflate(R.menu.menu_single_subreddit, menu); } if (SettingValues.fab && SettingValues.fabType == Constants.FAB_DISMISS) { menu.findItem(R.id.hide_posts).setVisible(false); } return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); //Hide the "Submit" menu item if the currently viewed sub is the frontpage or /r/all. if (subreddit.equals("frontpage") || subreddit.equals("all") || subreddit.equals("popular") || subreddit.equals("friends") || subreddit.equals("mod")) { menu.findItem(R.id.submit).setVisible(false); menu.findItem(R.id.sidebar).setVisible(false); } mToolbar.getMenu() .findItem(R.id.theme) .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int style = new ColorPreferences(SubredditView.this).getThemeSubreddit( subreddit); final Context contextThemeWrapper = new ContextThemeWrapper(SubredditView.this, style); LayoutInflater localInflater = getLayoutInflater().cloneInContext(contextThemeWrapper); final View dialoglayout = localInflater.inflate(R.layout.colorsub, null); ArrayList<String> arrayList = new ArrayList<>(); arrayList.add(subreddit); SettingsSubAdapter.showSubThemeEditor(arrayList, SubredditView.this, dialoglayout); return false; } }); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case android.R.id.home: onBackPressed(); return true; case R.id.filter: filterContent(subreddit); return true; case R.id.submit: Intent i = new Intent(this, Submit.class); if (canSubmit) i.putExtra(Submit.EXTRA_SUBREDDIT, subreddit); startActivity(i); return true; case R.id.action_refresh: if (adapter != null && adapter.getCurrentFragment() != null) { ((SubmissionsView) adapter.getCurrentFragment()).forceRefresh(); } return true; case R.id.action_sort: if (subreddit.equalsIgnoreCase("friends")) { Snackbar s = Snackbar.make(findViewById(R.id.anchor), getString(R.string.friends_sort_error), Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } else { openPopup(); } return true; case R.id.gallery: if (SettingValues.tabletUI) { List<Submission> posts = ((SubmissionsView) adapter.getCurrentFragment()).posts.posts; if (posts != null && !posts.isEmpty()) { Intent i2 = new Intent(this, Gallery.class); i2.putExtra("offline", ((SubmissionsView) adapter.getCurrentFragment()).posts.cached != null ? ((SubmissionsView) adapter.getCurrentFragment()).posts.cached.time : 0L); i2.putExtra(Gallery.EXTRA_SUBREDDIT, ((SubmissionsView) adapter.getCurrentFragment()).posts.subreddit); startActivity(i2); } } else { new AlertDialogWrapper.Builder(this).setTitle( R.string.general_gallerymode_ispro) .setMessage(R.string.pro_upgrade_msg) .setPositiveButton(R.string.btn_yes_exclaim, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( "market://details?id=me.ccrama.slideforreddittabletuiunlock"))); } catch (ActivityNotFoundException e) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( "http://play.google.com/store/apps/details?id=me.ccrama.slideforreddittabletuiunlock"))); } } }) .setNegativeButton(R.string.btn_no_danks, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }) .show(); } return true; case R.id.search: MaterialDialog.Builder builder = new MaterialDialog.Builder(this).title(R.string.search_title) .alwaysCallInputCallback() .input(getString(R.string.search_msg), "", new MaterialDialog.InputCallback() { @Override public void onInput(MaterialDialog materialDialog, CharSequence charSequence) { term = charSequence.toString(); } }) .neutralText(R.string.search_all) .onNeutral(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) { Intent i = new Intent(SubredditView.this, Search.class); i.putExtra(Search.EXTRA_TERM, term); startActivity(i); } }); //Add "search current sub" if it is not frontpage/all/random if (!subreddit.equalsIgnoreCase("frontpage") && !subreddit.equalsIgnoreCase("all") && !subreddit.equalsIgnoreCase("random") && !subreddit.equalsIgnoreCase("popular") && !subreddit.equals("myrandom") && !subreddit.equals("randnsfw") && !subreddit.equalsIgnoreCase("friends") && !subreddit.equalsIgnoreCase("mod")) { builder.positiveText(getString(R.string.search_subreddit, subreddit)) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) { Intent i = new Intent(SubredditView.this, Search.class); i.putExtra(Search.EXTRA_TERM, term); i.putExtra(Search.EXTRA_SUBREDDIT, subreddit); Log.v(LogUtil.getTag(), "INTENT SHOWS " + term + " AND " + subreddit); startActivity(i); } }); } builder.show(); return true; case R.id.sidebar: drawerLayout.openDrawer(Gravity.RIGHT); return true; case R.id.hide_posts: ((SubmissionsView) adapter.getCurrentFragment()).clearSeenPosts(false); return true; case R.id.action_shadowbox: if (SettingValues.tabletUI) { List<Submission> posts = ((SubmissionsView) ((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment()).posts.posts; if (posts != null && !posts.isEmpty()) { Intent i2 = new Intent(this, Shadowbox.class); i2.putExtra(Shadowbox.EXTRA_PAGE, getCurrentPage()); i2.putExtra(Shadowbox.EXTRA_SUBREDDIT, ((SubmissionsView) adapter.getCurrentFragment()).posts.subreddit); startActivity(i2); } } else { new AlertDialogWrapper.Builder(this).setTitle(R.string.general_shadowbox_ispro) .setMessage(R.string.pro_upgrade_msg) .setPositiveButton(R.string.btn_yes_exclaim, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { try { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( "market://details?id=me.ccrama.slideforreddittabletuiunlock"))); } catch (ActivityNotFoundException e) { startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse( "http://play.google.com/store/apps/details?id=me.ccrama.slideforreddittabletuiunlock"))); } } }) .setNegativeButton(R.string.btn_no_danks, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int whichButton) { dialog.dismiss(); } }) .show(); } return true; default: return false; } } @Override public void onDestroy() { super.onDestroy(); if (sub != null) { if (sub.isNsfw() && (!SettingValues.storeHistory || !SettingValues.storeNSFWHistory)) { SharedPreferences.Editor e = Reddit.cachedData.edit(); for (String s : OfflineSubreddit.getAll(sub.getDisplayName())) { e.remove(s); } e.apply(); } else if (!SettingValues.storeHistory) { SharedPreferences.Editor e = Reddit.cachedData.edit(); for (String s : OfflineSubreddit.getAll(sub.getDisplayName())) { e.remove(s); } e.apply(); } } } 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 void doPageSelectedComments(int position) { header.animate().translationY(0).setInterpolator(new LinearInterpolator()).setDuration(180); pager.setSwipeLeftOnly(false); Reddit.currentPosition = position; if (position == 1 && adapter != null && adapter.getCurrentFragment() != null) { ((SubmissionsView) adapter.getCurrentFragment()).adapter.refreshView(); } } public void doSubSidebar(final String subOverride) { findViewById(R.id.loader).setVisibility(View.VISIBLE); invalidateOptionsMenu(); if (!subOverride.equalsIgnoreCase("all") && !subOverride.equalsIgnoreCase("frontpage") && !subOverride.equalsIgnoreCase("random") && !subOverride.equalsIgnoreCase("popular") && !subOverride.equalsIgnoreCase("myrandom") && !subOverride.equalsIgnoreCase("randnsfw") && !subOverride.equalsIgnoreCase("friends") && !subOverride.equalsIgnoreCase("mod") && !subOverride.contains("+") && !subOverride.contains(".") && !subOverride.contains("/m/")) { if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END); } loaded = true; final View dialoglayout = findViewById(R.id.sidebarsub); { View submit = (dialoglayout.findViewById(R.id.submit)); if (!Authentication.isLoggedIn || !Authentication.didOnline) { submit.setVisibility(View.GONE); } if (SettingValues.fab && SettingValues.fabType == Constants.FAB_POST) { submit.setVisibility(View.GONE); } submit.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(SubredditView.this, Submit.class); if (!subOverride.contains("/m/") && canSubmit) { inte.putExtra(Submit.EXTRA_SUBREDDIT, subOverride); } SubredditView.this.startActivity(inte); } }); } dialoglayout.findViewById(R.id.wiki).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(SubredditView.this, Wiki.class); i.putExtra(Wiki.EXTRA_SUBREDDIT, subOverride); startActivity(i); } }); dialoglayout.findViewById(R.id.syncflair) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ImageFlairs.syncFlairs(SubredditView.this, subreddit); } }); dialoglayout.findViewById(R.id.submit).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(SubredditView.this, Submit.class); if ((!subOverride.contains("/m/") || !subOverride.contains(".")) && canSubmit) { i.putExtra(Submit.EXTRA_SUBREDDIT, subOverride); } startActivity(i); } }); final TextView sort = (TextView) dialoglayout.findViewById(R.id.sort); Sorting sortingis = Sorting.HOT; if(SettingValues.hasSort(subreddit)) { sortingis = SettingValues.getBaseSubmissionSort(subreddit); sort.setText(sortingis.name() + ((sortingis == Sorting.CONTROVERSIAL || sortingis == Sorting.TOP)?" of " + SettingValues.getBaseTimePeriod(subreddit).name():"")); } else { sort.setText("Set default sorting"); } final int sortid = Reddit.getSortingId(sortingis); dialoglayout.findViewById(R.id.sorting).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final DialogInterface.OnClickListener l2 = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { switch (i) { case 0: sorts = Sorting.HOT; break; case 1: sorts = Sorting.NEW; break; case 2: sorts = Sorting.RISING; break; case 3: sorts = Sorting.TOP; askTimePeriod(sorts, subreddit, dialoglayout); return; case 4: sorts = Sorting.CONTROVERSIAL; askTimePeriod(sorts, subreddit, dialoglayout); return; } SettingValues.setSubSorting(sorts,time,subreddit); Sorting sortingis = SettingValues.getBaseSubmissionSort(subreddit); sort.setText(sortingis.name() + ((sortingis == Sorting.CONTROVERSIAL || sortingis == Sorting.TOP)?" of " + SettingValues.getBaseTimePeriod(subreddit).name():"")); reloadSubs(); } }; AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(SubredditView.this); builder.setTitle(R.string.sorting_choose); builder.setSingleChoiceItems(Reddit.getSortingStrings(getBaseContext()), sortid, l2); builder.setNegativeButton("Reset default sorting", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { SettingValues.prefs.edit().remove("defaultSort" + subreddit.toLowerCase()).apply(); SettingValues.prefs.edit().remove("defaultTime" + subreddit.toLowerCase()).apply(); final TextView sort = (TextView) dialoglayout.findViewById(R.id.sort); if(SettingValues.hasSort(subreddit)) { Sorting sortingis = SettingValues.getBaseSubmissionSort(subreddit); sort.setText(sortingis.name() + ((sortingis == Sorting.CONTROVERSIAL || sortingis == Sorting.TOP)?" of " + SettingValues.getBaseTimePeriod(subreddit).name():"")); } else { sort.setText("Set default sorting"); } reloadSubs(); } }); builder.show(); } }); dialoglayout.findViewById(R.id.theme).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { int style = new ColorPreferences(SubredditView.this).getThemeSubreddit(subOverride); final Context contextThemeWrapper = new ContextThemeWrapper(SubredditView.this, style); LayoutInflater localInflater = getLayoutInflater().cloneInContext(contextThemeWrapper); final View dialoglayout = localInflater.inflate(R.layout.colorsub, null); ArrayList<String> arrayList = new ArrayList<>(); arrayList.add(subOverride); SettingsSubAdapter.showSubThemeEditor(arrayList, SubredditView.this, dialoglayout); } }); dialoglayout.findViewById(R.id.mods).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Dialog d = new MaterialDialog.Builder(SubredditView.this).title( R.string.sidebar_findingmods) .cancelable(true) .content(R.string.misc_please_wait) .progress(true, 100) .show(); new AsyncTask<Void, Void, Void>() { ArrayList<UserRecord> mods; @Override protected Void doInBackground(Void... params) { mods = new ArrayList<>(); UserRecordPaginator paginator = new UserRecordPaginator(Authentication.reddit, subOverride, "moderators"); paginator.setSorting(Sorting.HOT); paginator.setTimePeriod(TimePeriod.ALL); while (paginator.hasNext()) { mods.addAll(paginator.next()); } return null; } @Override protected void onPostExecute(Void aVoid) { final ArrayList<String> names = new ArrayList<>(); for (UserRecord rec : mods) { names.add(rec.getFullName()); } d.dismiss(); new MaterialDialog.Builder(SubredditView.this).title( getString(R.string.sidebar_submods, subreddit)) .items(names) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { Intent i = new Intent(SubredditView.this, Profile.class); i.putExtra(Profile.EXTRA_PROFILE, names.get(which)); startActivity(i); } }) .positiveText(R.string.btn_message) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Intent i = new Intent(SubredditView.this, SendMessage.class); i.putExtra(SendMessage.EXTRA_NAME, "/r/" + subOverride); startActivity(i); } }) .show(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); dialoglayout.findViewById(R.id.flair).setVisibility(View.GONE); if (Authentication.didOnline && Authentication.isLoggedIn) { new AsyncTask<View, Void, View>() { List<FlairTemplate> flairs; ArrayList<String> flairText; String current; AccountManager m; @Override protected View doInBackground(View... params) { try { m = new AccountManager(Authentication.reddit); JsonNode node = m.getFlairChoicesRootNode(subOverride, null); flairs = m.getFlairChoices(subOverride, node); FlairTemplate currentF = m.getCurrentFlair(subOverride, node); if (currentF != null) { if (currentF.getText().isEmpty()) { current = ("[" + currentF.getCssClass() + "]"); } else { current = (currentF.getText()); } } flairText = new ArrayList<>(); for (FlairTemplate temp : flairs) { if (temp.getText().isEmpty()) { flairText.add("[" + temp.getCssClass() + "]"); } else { flairText.add(temp.getText()); } } } catch (Exception e1) { e1.printStackTrace(); } return params[0]; } @Override protected void onPostExecute(View flair) { if (flairs != null && !flairs.isEmpty() && flairText != null && !flairText.isEmpty()) { flair.setVisibility(View.VISIBLE); if (current != null) { ((TextView) dialoglayout.findViewById(R.id.flair_text)).setText( getString(R.string.sidebar_flair, current)); } flair.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new MaterialDialog.Builder(SubredditView.this).items(flairText) .title(R.string.sidebar_select_flair) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { final FlairTemplate t = flairs.get(which); if (t.isTextEditable()) { new MaterialDialog.Builder( SubredditView.this).title( R.string.sidebar_select_flair_text) .input(getString( R.string.mod_flair_hint), t.getText(), true, new MaterialDialog.InputCallback() { @Override public void onInput( MaterialDialog dialog, CharSequence input) { } }) .positiveText(R.string.btn_set) .onPositive( new MaterialDialog.SingleButtonCallback() { @Override public void onClick( MaterialDialog dialog, DialogAction which) { final String flair = dialog.getInputEditText() .getText() .toString(); new AsyncTask<Void, Void, Boolean>() { @Override protected Boolean doInBackground( Void... params) { try { new ModerationManager( Authentication.reddit) .setFlair( subOverride, t, flair, Authentication.name); FlairTemplate currentF = m.getCurrentFlair( subOverride); if (currentF .getText() .isEmpty()) { current = ("[" + currentF .getCssClass() + "]"); } else { current = (currentF .getText()); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override protected void onPostExecute( Boolean done) { Snackbar s; if (done) { if (current != null) { ((TextView) dialoglayout .findViewById( R.id.flair_text)) .setText( getString( R.string.sidebar_flair, current)); } s = Snackbar.make( mToolbar, R.string.snackbar_flair_success, Snackbar.LENGTH_SHORT); } else { s = Snackbar.make( mToolbar, R.string.snackbar_flair_error, Snackbar.LENGTH_SHORT); } if (s != null) { View view = s.getView(); TextView tv = (TextView) view .findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor( Color.WHITE); s.show(); } } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }) .negativeText(R.string.btn_cancel) .show(); } else { new AsyncTask<Void, Void, Boolean>() { @Override protected Boolean doInBackground( Void... params) { try { new ModerationManager( Authentication.reddit).setFlair( subOverride, t, null, Authentication.name); FlairTemplate currentF = m.getCurrentFlair( subOverride); if (currentF.getText() .isEmpty()) { current = ("[" + currentF.getCssClass() + "]"); } else { current = (currentF.getText()); } return true; } catch (Exception e) { e.printStackTrace(); return false; } } @Override protected void onPostExecute( Boolean done) { Snackbar s; if (done) { if (current != null) { ((TextView) dialoglayout.findViewById( R.id.flair_text)).setText( getString( R.string.sidebar_flair, current)); } s = Snackbar.make(mToolbar, R.string.snackbar_flair_success, Snackbar.LENGTH_SHORT); } else { s = Snackbar.make(mToolbar, R.string.snackbar_flair_error, Snackbar.LENGTH_SHORT); } if (s != null) { View view = s.getView(); TextView tv = (TextView) view.findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } }) .show(); } }); } } }.execute(dialoglayout.findViewById(R.id.flair)); } } else { if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); } } } public void doSubSidebarNoLoad(final String subOverride) { findViewById(R.id.loader).setVisibility(View.GONE); invalidateOptionsMenu(); if (!subOverride.equalsIgnoreCase("all") && !subOverride.equalsIgnoreCase("frontpage") && !subOverride.equalsIgnoreCase("friends") && !subOverride.equalsIgnoreCase("mod") && !subOverride.contains("+") && !subOverride.contains(".") && !subOverride.contains( "/m/")) { if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END); } findViewById(R.id.sidebar_text).setVisibility(View.GONE); findViewById(R.id.sub_title).setVisibility(View.GONE); findViewById(R.id.subscribers).setVisibility(View.GONE); findViewById(R.id.active_users).setVisibility(View.GONE); findViewById(R.id.header_sub).setBackgroundColor(Palette.getColor(subOverride)); ((TextView) findViewById(R.id.sub_infotitle)).setText(subOverride); //Sidebar buttons should use subOverride's accent color int subColor = new ColorPreferences(this).getColor(subOverride); ((TextView) findViewById(R.id.theme_text)).setTextColor(subColor); ((TextView) findViewById(R.id.wiki_text)).setTextColor(subColor); ((TextView) findViewById(R.id.post_text)).setTextColor(subColor); ((TextView) findViewById(R.id.mods_text)).setTextColor(subColor); ((TextView) findViewById(R.id.flair_text)).setTextColor(subColor); ((TextView) findViewById(R.id.sorting).findViewById(R.id.sort)).setTextColor(subColor); ((TextView) findViewById(R.id.sync)).setTextColor(subColor); } else { if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); } } } public void executeAsyncSubreddit(String sub) { new AsyncGetSubreddit().execute(sub); } public void filterContent(final String subreddit) { final boolean[] chosen = new boolean[]{ PostMatch.isImage(subreddit.toLowerCase()), PostMatch.isAlbums(subreddit.toLowerCase()), PostMatch.isGif(subreddit.toLowerCase()), PostMatch.isVideo(subreddit.toLowerCase()), PostMatch.isUrls(subreddit.toLowerCase()), PostMatch.isSelftext(subreddit.toLowerCase()), PostMatch.isNsfw(subreddit.toLowerCase()) }; final String FILTER_TITLE = (subreddit.equals("frontpage")) ? (getString(R.string.content_to_hide, "frontpage")) : (getString(R.string.content_to_hide, "/r/" + subreddit)); new AlertDialogWrapper.Builder(this).setTitle(FILTER_TITLE) .alwaysCallMultiChoiceCallback() .setMultiChoiceItems(new String[]{ getString(R.string.image_downloads), getString(R.string.type_albums), getString(R.string.type_gifs), getString(R.string.type_videos), getString(R.string.type_links), getString(R.string.type_selftext), getString(R.string.type_nsfw_content) }, chosen, new DialogInterface.OnMultiChoiceClickListener() { @Override public void onClick(DialogInterface dialog, int which, boolean isChecked) { chosen[which] = isChecked; } }) .setPositiveButton(R.string.btn_save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { PostMatch.setChosen(chosen, subreddit); reloadSubs(); } }) .setNegativeButton(R.string.btn_cancel, null) .show(); } public int getCurrentPage() { int position = 0; int currentOrientation = getResources().getConfiguration().orientation; if (((SubmissionsView) adapter.getCurrentFragment()).rv.getLayoutManager() instanceof LinearLayoutManager && currentOrientation == Configuration.ORIENTATION_LANDSCAPE) { position = ((LinearLayoutManager) ((SubmissionsView) adapter.getCurrentFragment()).rv.getLayoutManager()) .findFirstCompletelyVisibleItemPosition() - 1; } else if (((SubmissionsView) adapter.getCurrentFragment()).rv.getLayoutManager() instanceof CatchStaggeredGridLayoutManager) { int[] firstVisibleItems = null; firstVisibleItems = ((CatchStaggeredGridLayoutManager) ((SubmissionsView) adapter.getCurrentFragment()).rv .getLayoutManager()).findFirstCompletelyVisibleItemPositions( firstVisibleItems); if (firstVisibleItems != null && firstVisibleItems.length > 0) { position = firstVisibleItems[0] - 1; } } else { position = ((PreCachingLayoutManager) ((SubmissionsView) adapter.getCurrentFragment()).rv.getLayoutManager()) .findFirstCompletelyVisibleItemPosition() - 1; } return position; } TimePeriod time = TimePeriod.DAY; Sorting sorts; private void askTimePeriod(final Sorting sort, final String sub, final View dialoglayout) { final DialogInterface.OnClickListener l2 = new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialogInterface, int i) { switch (i) { case 0: time = TimePeriod.HOUR; break; case 1: time = TimePeriod.DAY; break; case 2: time = TimePeriod.WEEK; break; case 3: time = TimePeriod.MONTH; break; case 4: time = TimePeriod.YEAR; break; case 5: time = TimePeriod.ALL; break; } SettingValues.setSubSorting(sort, time, sub); Reddit.setSorting(sub, sort); Reddit.setTime(sub, time); final TextView sort = (TextView) dialoglayout.findViewById(R.id.sort); Sorting sortingis = SettingValues.getBaseSubmissionSort("Default sorting: " + subreddit); sort.setText(sortingis.name() + ((sortingis == Sorting.CONTROVERSIAL || sortingis == Sorting.TOP)?" of " + SettingValues.getBaseTimePeriod(subreddit).name():"")); reloadSubs(); } }; AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(SubredditView.this); builder.setTitle(R.string.sorting_choose); builder.setSingleChoiceItems(Reddit.getSortingStringsTime(getBaseContext()), Reddit.getSortingIdTime(""), l2); builder.show(); } public void openPopup() { PopupMenu popup = new PopupMenu(SubredditView.this, findViewById(R.id.anchor), Gravity.RIGHT); final Spannable[] base = Reddit.getSortingSpannables(getBaseContext(), subreddit); for (Spannable s : base) { MenuItem m = popup.getMenu().add(s); } popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { LogUtil.v("Chosen is " + item.getOrder()); int i = 0; for (Spannable s : base) { if (s.equals(item.getTitle())) { break; } i++; } switch (i) { case 0: Reddit.setSorting(subreddit, Sorting.HOT); reloadSubs(); break; case 1: Reddit.setSorting(subreddit, Sorting.NEW); reloadSubs(); break; case 2: Reddit.setSorting(subreddit, Sorting.RISING); reloadSubs(); break; case 3: Reddit.setSorting(subreddit, Sorting.TOP); openPopupTime(); break; case 4: Reddit.setSorting(subreddit, Sorting.CONTROVERSIAL); openPopupTime(); break; } return true; } }); popup.show(); } public void openPopupTime() { PopupMenu popup = new PopupMenu(SubredditView.this, findViewById(R.id.anchor), Gravity.RIGHT); final Spannable[] base = Reddit.getSortingSpannablesTime(getBaseContext(), subreddit); for (Spannable s : base) { MenuItem m = popup.getMenu().add(s); } popup.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() { public boolean onMenuItemClick(MenuItem item) { LogUtil.v("Chosen is " + item.getOrder()); int i = 0; for (Spannable s : base) { if (s.equals(item.getTitle())) { break; } i++; } switch (i) { case 0: Reddit.setTime(subreddit, TimePeriod.HOUR); reloadSubs(); break; case 1: Reddit.setTime(subreddit, TimePeriod.DAY); reloadSubs(); break; case 2: Reddit.setTime(subreddit, TimePeriod.WEEK); reloadSubs(); break; case 3: Reddit.setTime(subreddit, TimePeriod.MONTH); reloadSubs(); break; case 4: Reddit.setTime(subreddit, TimePeriod.YEAR); reloadSubs(); break; case 5: Reddit.setTime(subreddit, TimePeriod.ALL); reloadSubs(); break; } return true; } }); popup.show(); } public static boolean restarting; public void restartTheme() { Intent intent = this.getIntent(); intent.putExtra(EXTRA_SUBREDDIT, subreddit); finish(); restarting = true; overridePendingTransition(0, 0); startActivity(intent); overridePendingTransition(0, 0); } private void changeSubscription(Subreddit subreddit, boolean isChecked) { if (isChecked) { UserSubscriptions.addSubreddit(subreddit.getDisplayName().toLowerCase(), SubredditView.this); } else { UserSubscriptions.removeSubreddit(subreddit.getDisplayName().toLowerCase(), SubredditView.this); pager.setCurrentItem(pager.getCurrentItem() - 1); restartTheme(); } Snackbar s = Snackbar.make(mToolbar, isChecked ? getString(R.string.misc_subscribed) : getString(R.string.misc_unsubscribed), Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } private void doSubOnlyStuff(final Subreddit subreddit) { if (!isFinishing()) { findViewById(R.id.loader).setVisibility(View.GONE); if (subreddit.getDataNode().has("subreddit_type") && !subreddit.getDataNode() .get("subreddit_type") .isNull()) { canSubmit = !subreddit.getDataNode() .get("subreddit_type") .asText() .toUpperCase() .equals("RESTRICTED"); } if (subreddit.getSidebar() != null && !subreddit.getSidebar().isEmpty()) { findViewById(R.id.sidebar_text).setVisibility(View.VISIBLE); final String text = subreddit.getDataNode().get("description_html").asText().trim(); final SpoilerRobotoTextView body = (SpoilerRobotoTextView) findViewById(R.id.sidebar_text); CommentOverflow overflow = (CommentOverflow) findViewById(R.id.commentOverflow); setViews(text, subreddit.getDisplayName(), body, overflow); //get all subs that have Notifications enabled ArrayList<String> rawSubs = Reddit.stringToArray( Reddit.appRestart.getString(CheckForMail.SUBS_TO_GET, "")); HashMap<String, Integer> subThresholds = new HashMap<>(); for (String s : rawSubs) { try { String[] split = s.split(":"); subThresholds.put(split[0].toLowerCase(), Integer.valueOf(split[1])); } catch (Exception ignored) { //do nothing } } //whether or not this subreddit was in the keySet boolean isNotified = subThresholds.keySet().contains(subreddit.getDisplayName().toLowerCase()); ((AppCompatCheckBox) findViewById(R.id.notify_posts_state)).setChecked(isNotified); } else { findViewById(R.id.sidebar_text).setVisibility(View.GONE); } View collection = findViewById(R.id.collection); if (Authentication.isLoggedIn) { collection.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AsyncTask<Void, Void, Void>() { HashMap<String, MultiReddit> multis = new HashMap<String, MultiReddit>(); @Override protected Void doInBackground(Void... params) { if (UserSubscriptions.multireddits == null) { UserSubscriptions.syncMultiReddits(SubredditView.this); } for (MultiReddit r : UserSubscriptions.multireddits) { multis.put(r.getDisplayName(), r); } return null; } @Override protected void onPostExecute(Void aVoid) { new MaterialDialog.Builder(SubredditView.this).title( "Add /r/" + subreddit.getDisplayName() + " to") .items(multis.keySet()) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, final int which, CharSequence text) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { final String multiName = multis.keySet() .toArray( new String[multis.size()])[which]; List<String> subs = new ArrayList<String>(); for (MultiSubreddit sub : multis.get( multiName).getSubreddits()) { subs.add(sub.getDisplayName()); } subs.add(subreddit.getDisplayName()); new MultiRedditManager( Authentication.reddit).createOrUpdate( new MultiRedditUpdateRequest.Builder( Authentication.name, multiName).subreddits( subs).build()); UserSubscriptions.syncMultiReddits( SubredditView.this); runOnUiThread(new Runnable() { @Override public void run() { drawerLayout.closeDrawers(); Snackbar s = Snackbar.make(mToolbar, getString( R.string.multi_subreddit_added, multiName), Snackbar.LENGTH_LONG); View view = s.getView(); TextView tv = (TextView) view.findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } }); } catch (final NetworkException | ApiException e) { runOnUiThread(new Runnable() { @Override public void run() { runOnUiThread(new Runnable() { @Override public void run() { Snackbar.make(mToolbar, getString( R.string.multi_error), Snackbar.LENGTH_LONG) .setAction( R.string.btn_ok, new View.OnClickListener() { @Override public void onClick( View v) { } }) .show(); } }); } }); e.printStackTrace(); } return null; } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }) .show(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); } else { collection.setVisibility(View.GONE); } { final TextView subscribe = (TextView) findViewById(R.id.subscribe); currentlySubbed = (!Authentication.isLoggedIn && UserSubscriptions.getSubscriptions(this) .contains(subreddit.getDisplayName().toLowerCase())) || ( Authentication.isLoggedIn && subreddit.isUserSubscriber()); doSubscribeButtonText(currentlySubbed, subscribe); assert subscribe != null; subscribe.setOnClickListener(new View.OnClickListener() { private void doSubscribe() { if (Authentication.isLoggedIn) { new AlertDialogWrapper.Builder(SubredditView.this).setTitle( getString(R.string.subscribe_to, subreddit.getDisplayName())) .setPositiveButton(R.string.reorder_add_subscribe, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new AsyncTask<Void, Void, Boolean>() { @Override public void onPostExecute(Boolean success) { if (!success) { // If subreddit was removed from account or not new AlertDialogWrapper.Builder( SubredditView.this).setTitle( R.string.force_change_subscription) .setMessage( R.string.force_change_subscription_desc) .setPositiveButton( R.string.btn_yes, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { changeSubscription( subreddit, true); // Force add the subscription Snackbar s = Snackbar.make( mToolbar, getString( R.string.misc_subscribed), Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view .findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor( Color.WHITE); s.show(); } }) .setNegativeButton( R.string.btn_no, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { } }) .setCancelable(false) .show(); } else { changeSubscription(subreddit, true); } } @Override protected Boolean doInBackground( Void... params) { try { new AccountManager( Authentication.reddit).subscribe( subreddit); } catch (NetworkException e) { return false; // Either network crashed or trying to unsubscribe to a subreddit that the account isn't subscribed to } return true; } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }) .setNegativeButton(R.string.btn_cancel, null) .setNeutralButton(R.string.btn_add_to_sublist, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { changeSubscription(subreddit, true); // Force add the subscription Snackbar s = Snackbar.make(mToolbar, R.string.sub_added, Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view.findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } }) .show(); } else { changeSubscription(subreddit, true); } } @Override public void onClick(View v) { if (!currentlySubbed) { doSubscribe(); doSubscribeButtonText(currentlySubbed, subscribe); } else { doUnsubscribe(); doSubscribeButtonText(currentlySubbed, subscribe); } } private void doUnsubscribe() { if (Authentication.didOnline) { new AlertDialogWrapper.Builder(SubredditView.this).setTitle( getString(R.string.unsubscribe_from, subreddit.getDisplayName())) .setPositiveButton(R.string.reorder_remove_unsubsribe, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { new AsyncTask<Void, Void, Boolean>() { @Override public void onPostExecute(Boolean success) { if (!success) { // If subreddit was removed from account or not new AlertDialogWrapper.Builder( SubredditView.this).setTitle( R.string.force_change_subscription) .setMessage( R.string.force_change_subscription_desc) .setPositiveButton( R.string.btn_yes, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { changeSubscription( subreddit, false); // Force add the subscription Snackbar s = Snackbar.make( mToolbar, getString( R.string.misc_unsubscribed), Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view .findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor( Color.WHITE); s.show(); } }) .setNegativeButton( R.string.btn_no, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { } }) .setCancelable(false) .show(); } else { changeSubscription(subreddit, false); } } @Override protected Boolean doInBackground( Void... params) { try { new AccountManager( Authentication.reddit).unsubscribe( subreddit); } catch (NetworkException e) { return false; // Either network crashed or trying to unsubscribe to a subreddit that the account isn't subscribed to } return true; } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }) .setNeutralButton(R.string.just_unsub, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { changeSubscription(subreddit, false); // Force add the subscription Snackbar s = Snackbar.make(mToolbar, R.string.misc_unsubscribed, Snackbar.LENGTH_SHORT); View view = s.getView(); TextView tv = (TextView) view.findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } }) .setNegativeButton(R.string.btn_cancel, null) .show(); } else { changeSubscription(subreddit, false); } } }); } { final AppCompatCheckBox notifyStateCheckBox = (AppCompatCheckBox) findViewById(R.id.notify_posts_state); assert notifyStateCheckBox != null; notifyStateCheckBox.setOnCheckedChangeListener( new CompoundButton.OnCheckedChangeListener() { @Override public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { if (isChecked) { final String sub = subreddit.getDisplayName(); if (!sub.equalsIgnoreCase("all") && !sub.equalsIgnoreCase("frontpage") && !sub.equalsIgnoreCase("friends") && !sub.equalsIgnoreCase("mod") && !sub.contains("+") && !sub.contains(".") && !sub.contains("/m/")) { new AlertDialogWrapper.Builder(SubredditView.this).setTitle( getString(R.string.sub_post_notifs_title, sub)) .setMessage(R.string.sub_post_notifs_msg) .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { new MaterialDialog.Builder( SubredditView.this).title( R.string.sub_post_notifs_threshold) .items(new String[]{ "1", "5", "10", "20", "40", "50" }) .alwaysCallSingleChoiceCallback() .itemsCallbackSingleChoice( 0, new MaterialDialog.ListCallbackSingleChoice() { @Override public boolean onSelection( MaterialDialog dialog, View itemView, int which, CharSequence text) { ArrayList<String> subs = Reddit.stringToArray( Reddit.appRestart .getString( CheckForMail.SUBS_TO_GET, "")); subs.add(sub + ":" + text); Reddit.appRestart .edit() .putString( CheckForMail.SUBS_TO_GET, Reddit.arrayToString( subs)) .commit(); return true; } }) .cancelable(false) .show(); } }) .setNegativeButton(R.string.btn_cancel, null) .setNegativeButton(R.string.btn_cancel, new DialogInterface.OnClickListener() { @Override public void onClick( DialogInterface dialog, int which) { notifyStateCheckBox.setChecked( false); } }) .setOnCancelListener( new DialogInterface.OnCancelListener() { @Override public void onCancel( DialogInterface dialog) { notifyStateCheckBox.setChecked( false); } }) .show(); } else { notifyStateCheckBox.setChecked(false); Toast.makeText(SubredditView.this, R.string.sub_post_notifs_err, Toast.LENGTH_SHORT) .show(); } } else { Intent cancelIntent = new Intent(SubredditView.this, CancelSubNotifs.class); cancelIntent.putExtra(CancelSubNotifs.EXTRA_SUB, subreddit.getDisplayName()); startActivity(cancelIntent); } } }); } if (!subreddit.getPublicDescription().isEmpty()) { findViewById(R.id.sub_title).setVisibility(View.VISIBLE); setViews(subreddit.getDataNode().get("public_description_html").asText(), subreddit.getDisplayName().toLowerCase(), ((SpoilerRobotoTextView) findViewById(R.id.sub_title)), (CommentOverflow) findViewById(R.id.sub_title_overflow)); } else { findViewById(R.id.sub_title).setVisibility(View.GONE); } if (subreddit.getDataNode().has("icon_img") && !subreddit.getDataNode() .get("icon_img") .asText() .isEmpty()) { ((Reddit) getApplication()).getImageLoader() .displayImage(subreddit.getDataNode().get("icon_img").asText(), (ImageView) findViewById(R.id.subimage)); } else { findViewById(R.id.subimage).setVisibility(View.GONE); } ((TextView) findViewById(R.id.subscribers)).setText( getString(R.string.subreddit_subscribers_string, subreddit.getLocalizedSubscriberCount())); findViewById(R.id.subscribers).setVisibility(View.VISIBLE); ((TextView) findViewById(R.id.active_users)).setText( getString(R.string.subreddit_active_users_string_new, subreddit.getLocalizedAccountsActive())); findViewById(R.id.active_users).setVisibility(View.VISIBLE); } } private void doSubscribeButtonText(boolean currentlySubbed, TextView subscribe) { if (Authentication.didOnline) { if (currentlySubbed) { subscribe.setText(R.string.unsubscribe_caps); } else { subscribe.setText(R.string.subscribe_caps); } } else { if (currentlySubbed) { subscribe.setText(R.string.btn_remove_from_sublist); } else { subscribe.setText(R.string.btn_add_to_sublist); } } } private void reloadSubs() { restartTheme(); } private void setViews(String rawHTML, String subreddit, SpoilerRobotoTextView firstTextView, CommentOverflow commentOverflow) { if (rawHTML.isEmpty()) { return; } List<String> blocks = SubmissionParser.getBlocks(rawHTML); int startIndex = 0; // the <div class="md"> case is when the body contains a table or code block first if (!blocks.get(0).equals("<div class=\"md\">")) { firstTextView.setVisibility(View.VISIBLE); firstTextView.setTextHtml(blocks.get(0), subreddit); startIndex = 1; } else { firstTextView.setText(""); firstTextView.setVisibility(View.GONE); } if (blocks.size() > 1) { if (startIndex == 0) { commentOverflow.setViews(blocks, subreddit); } else { commentOverflow.setViews(blocks.subList(startIndex, blocks.size()), subreddit); } SidebarLayout sidebar = (SidebarLayout) findViewById(R.id.drawer_layout); for (int i = 0; i < commentOverflow.getChildCount(); i++) { View maybeScrollable = commentOverflow.getChildAt(i); if (maybeScrollable instanceof HorizontalScrollView) { sidebar.addScrollable(maybeScrollable); } } } else { commentOverflow.removeAllViews(); } } public class OverviewPagerAdapter extends FragmentStatePagerAdapter { private SubmissionsView mCurrentFragment; private BlankFragment blankPage; public OverviewPagerAdapter(FragmentManager fm) { super(fm); pager.clearOnPageChangeListeners(); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 0) { CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) header.getLayoutParams(); params.setMargins(header.getWidth() - positionOffsetPixels, 0, -((header.getWidth() - positionOffsetPixels)), 0); header.setLayoutParams(params); if (positionOffsetPixels == 0) { finish(); overridePendingTransition(0, R.anim.fade_out); } } if (position == 0) { ((OverviewPagerAdapter) pager.getAdapter()).blankPage.doOffset( positionOffset); pager.setBackgroundColor(adjustAlpha(positionOffset * 0.7f)); } } @Override public void onPageSelected(final int position) { } @Override public void onPageScrollStateChanged(int state) { } }); if (pager.getAdapter() != null) { pager.setCurrentItem(1); } } @Override public int getCount() { return 2; } @Override public Fragment getItem(int i) { if (i == 1) { SubmissionsView f = new SubmissionsView(); Bundle args = new Bundle(); args.putString("id", subreddit); f.setArguments(args); return f; } else { blankPage = new BlankFragment(); return blankPage; } } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { super.setPrimaryItem(container, position, object); doSetPrimary(object, position); } @Override public Parcelable saveState() { return null; } public void doSetPrimary(Object object, int position) { if (object != null && getCurrentFragment() != object && position != 3 && object instanceof SubmissionsView) { mCurrentFragment = ((SubmissionsView) object); if (mCurrentFragment.posts == null && mCurrentFragment.isAdded()) { mCurrentFragment.doAdapter(); } } } public Fragment getCurrentFragment() { return mCurrentFragment; } } public class OverviewPagerAdapterComment extends OverviewPagerAdapter { public int size = 2; public Fragment storedFragment; BlankFragment blankPage; private SubmissionsView mCurrentFragment; public OverviewPagerAdapterComment(FragmentManager fm) { super(fm); pager.clearOnPageChangeListeners(); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == 0) { CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) header.getLayoutParams(); params.setMargins(header.getWidth() - positionOffsetPixels, 0, -((header.getWidth() - positionOffsetPixels)), 0); header.setLayoutParams(params); if (positionOffsetPixels == 0) { finish(); overridePendingTransition(0, R.anim.fade_out); } blankPage.doOffset(positionOffset); pager.setBackgroundColor(adjustAlpha(positionOffset * 0.7f)); } else if (positionOffset == 0) { if (position == 1) { doPageSelectedComments(position); } else { //todo if (mAsyncGetSubreddit != null) { //mAsyncGetSubreddit.cancel(true); //} if (header.getTranslationY() == 0) { header.animate() .translationY(-header.getHeight()) .setInterpolator(new LinearInterpolator()) .setDuration(180); } pager.setSwipeLeftOnly(true); themeSystemBars(openingComments.getSubredditName().toLowerCase()); setRecentBar(openingComments.getSubredditName().toLowerCase()); } } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { } }); if (pager.getAdapter() != null) { pager.getAdapter().notifyDataSetChanged(); pager.setCurrentItem(1); pager.setCurrentItem(0); } } @Override public Parcelable saveState() { return null; } public Fragment getCurrentFragment() { return mCurrentFragment; } @Override public void doSetPrimary(Object object, int position) { if (position != 2 && position != 0) { if (getCurrentFragment() != object) { mCurrentFragment = ((SubmissionsView) object); if (mCurrentFragment != null && mCurrentFragment.posts == null && mCurrentFragment.isAdded()) { mCurrentFragment.doAdapter(); } } } } @Override public int getItemPosition(Object object) { if (object != storedFragment) return POSITION_NONE; return POSITION_UNCHANGED; } @Override public Fragment getItem(int i) { if (i == 0) { blankPage = new BlankFragment(); return blankPage; } else if (openingComments == null || i != 2) { SubmissionsView f = new SubmissionsView(); Bundle args = new Bundle(); args.putString("id", subreddit); f.setArguments(args); return f; } else { Fragment f = new CommentPage(); Bundle args = new Bundle(); String name = openingComments.getFullName(); args.putString("id", name.substring(3, name.length())); args.putBoolean("archived", openingComments.isArchived()); args.putBoolean("contest", openingComments.getDataNode().get("contest_mode").asBoolean()); args.putBoolean("locked", openingComments.isLocked()); args.putInt("page", currentComment); args.putString("subreddit", openingComments.getSubredditName()); args.putString("baseSubreddit", subreddit); f.setArguments(args); return f; } } @Override public int getCount() { return size; } } private class AsyncGetSubreddit extends AsyncTask<String, Void, Subreddit> { @Override public void onPostExecute(Subreddit subreddit) { if (subreddit != null) { setResult(RESULT_OK); sub = subreddit; try { doSubSidebarNoLoad(sub.getDisplayName()); doSubSidebar(sub.getDisplayName()); doSubOnlyStuff(sub); } catch (NullPointerException e) { //activity has been killed if (!isFinishing()) finish(); } SubredditView.this.subreddit = sub.getDisplayName(); if (subreddit.isNsfw() && SettingValues.storeHistory && SettingValues.storeNSFWHistory) { UserSubscriptions.addSubToHistory(subreddit.getDisplayName()); } else if (SettingValues.storeHistory && !subreddit.isNsfw()) { UserSubscriptions.addSubToHistory(subreddit.getDisplayName()); } // Over 18 interstitial for signed out users or those who haven't enabled NSFW content if (subreddit.isNsfw() && (!Reddit.over18 || !Authentication.isLoggedIn)) { new AlertDialogWrapper.Builder(SubredditView.this).setTitle( getString(R.string.over18_title, subreddit.getDisplayName())) .setMessage(getString(R.string.over18_desc) + "\n\n" + getString( Authentication.isLoggedIn ? R.string.over18_desc_loggedin : R.string.over18_desc_loggedout)) .setCancelable(false) .setPositiveButton(R.string.misc_continue, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ((SubmissionsView) adapter.getCurrentFragment()).doAdapter( true); } }) .setNeutralButton(R.string.btn_go_back, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); overridePendingTransition(0, R.anim.fade_out); } }) .show(); } } } @Override protected Subreddit doInBackground(final String... params) { try { return Authentication.reddit.getSubreddit(params[0]); } catch (Exception e) { runOnUiThread(new Runnable() { @Override public void run() { try { new AlertDialogWrapper.Builder(SubredditView.this).setTitle( R.string.subreddit_err) .setMessage( getString(R.string.subreddit_err_msg_new, params[0])) .setPositiveButton(R.string.btn_ok, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); setResult(4); finish(); } }) .setOnDismissListener(new DialogInterface.OnDismissListener() { @Override public void onDismiss(DialogInterface dialog) { setResult(4); finish(); } }) .show(); } catch (Exception ignored) { } } }); e.printStackTrace(); return null; } } } }