package me.ccrama.redditslide.Activities; import android.Manifest; import android.animation.Animator; import android.animation.ArgbEvaluator; import android.animation.ValueAnimator; import android.app.Activity; import android.app.Dialog; import android.app.NotificationManager; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; import android.content.SharedPreferences; import android.content.pm.PackageManager; import android.content.pm.ShortcutInfo; import android.content.pm.ShortcutManager; import android.content.res.Configuration; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Path; import android.graphics.Point; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.ColorDrawable; import android.graphics.drawable.Drawable; import android.graphics.drawable.Icon; import android.net.Uri; import android.os.AsyncTask; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Parcelable; import android.support.annotation.DrawableRes; import android.support.annotation.NonNull; import android.support.design.widget.Snackbar; import android.support.design.widget.TabLayout; import android.support.v4.app.ActivityCompat; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentStatePagerAdapter; import android.support.v4.content.ContextCompat; import android.support.v4.content.res.ResourcesCompat; import android.support.v4.view.GravityCompat; import android.support.v4.view.ViewPager; import android.support.v4.view.animation.FastOutSlowInInterpolator; import android.support.v4.widget.DrawerLayout; import android.support.v4.widget.ViewDragHelper; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.view.ContextThemeWrapper; import android.support.v7.widget.AppCompatCheckBox; import android.support.v7.widget.CardView; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.PopupMenu; import android.support.v7.widget.Toolbar; import android.text.Editable; import android.text.Spannable; import android.text.TextWatcher; import android.util.Log; import android.util.TypedValue; import android.view.Gravity; import android.view.KeyEvent; 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.ViewStub; import android.view.ViewTreeObserver; import android.view.Window; import android.view.WindowManager; import android.view.animation.AccelerateDecelerateInterpolator; import android.view.animation.LinearInterpolator; import android.view.inputmethod.EditorInfo; import android.view.inputmethod.InputMethodManager; import android.widget.AutoCompleteTextView; import android.widget.CompoundButton; import android.widget.EditText; import android.widget.HorizontalScrollView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.ListView; import android.widget.RelativeLayout; 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 com.lusfold.androidkeyvaluestore.KVStore; import com.lusfold.androidkeyvaluestore.core.KVManger; 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.LoggedInAccount; 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.SubredditPaginator; import net.dean.jraw.paginators.TimePeriod; import net.dean.jraw.paginators.UserRecordPaginator; import org.ligi.snackengage.SnackEngage; import org.ligi.snackengage.conditions.AfterNumberOfOpportunities; import org.ligi.snackengage.conditions.NeverAgainWhenClickedOnce; import org.ligi.snackengage.conditions.WithLimitedNumberOfTimes; import org.ligi.snackengage.snacks.BaseSnack; import org.ligi.snackengage.snacks.RateSnack; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import me.ccrama.redditslide.Adapters.SettingsSubAdapter; import me.ccrama.redditslide.Adapters.SideArrayAdapter; import me.ccrama.redditslide.Adapters.SubredditPosts; import me.ccrama.redditslide.Authentication; import me.ccrama.redditslide.Autocache.AutoCacheScheduler; import me.ccrama.redditslide.BuildConfig; import me.ccrama.redditslide.CaseInsensitiveArrayList; import me.ccrama.redditslide.ColorPreferences; import me.ccrama.redditslide.CommentCacheAsync; import me.ccrama.redditslide.Constants; 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.Notifications.NotificationJobScheduler; 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.Synccit.MySynccitUpdateTask; import me.ccrama.redditslide.Synccit.SynccitRead; import me.ccrama.redditslide.TimeUtils; 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.EditTextValidator; import me.ccrama.redditslide.util.LogUtil; import me.ccrama.redditslide.util.NetworkStateReceiver; import me.ccrama.redditslide.util.NetworkUtil; import me.ccrama.redditslide.util.OnSingleClickListener; import me.ccrama.redditslide.util.SubmissionParser; import static me.ccrama.redditslide.UserSubscriptions.modOf; public class MainActivity extends BaseActivity implements NetworkStateReceiver.NetworkStateReceiverListener { public static final String EXTRA_PAGE_TO = "pageTo"; public static final String IS_ONLINE = "online"; // Instance state keys static final String SUBS = "subscriptions"; static final String LOGGED_IN = "loggedIn"; static final String USERNAME = "username"; static final int TUTORIAL_RESULT = 55; static final int INBOX_RESULT = 66; static final int RESET_ADAPTER_RESULT = 3; static final int SETTINGS_RESULT = 2; public static Loader loader; public static boolean datasetChanged; public static Map<String, String> multiNameToSubsMap = new HashMap<>(); public static boolean checkedPopups; public static String shouldLoad; public static boolean isRestart; public static int restartPage; public final long ANIMATE_DURATION = 250; //duration of animations private final long ANIMATE_DURATION_OFFSET = 45; //offset for smoothing out the exit animations public boolean singleMode; public ToggleSwipeViewPager pager; public CaseInsensitiveArrayList usedArray; public DrawerLayout drawerLayout; public View hea; public EditText drawerSearch; public View header; public String subToDo; public OverviewPagerAdapter adapter; public int toGoto = 0; public boolean first = true; public TabLayout mTabLayout; public ListView drawerSubList; public String selectedSub; //currently selected subreddit public Runnable doImage; public Intent data; public boolean commentPager = false; public Runnable runAfterLoad; public boolean canSubmit; //if the view mode is set to Subreddit Tabs, save the title ("Slide" or "Slide (debug)") public String tabViewModeTitle; public int currentComment; public Submission openingComments; public int toOpenComments = -1; public boolean inNightMode; boolean changed; String term; View headerMain; MaterialDialog d; AsyncTask<View, Void, View> currentFlair; SpoilerRobotoTextView sidebarBody; CommentOverflow sidebarOverflow; View accountsArea; SideArrayAdapter sideArrayAdapter; Menu menu; AsyncTask caching; boolean currentlySubbed; int back; private AsyncGetSubreddit mAsyncGetSubreddit = null; private int headerHeight; //height of the header public int reloadItemNumber = -2; @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == SETTINGS_RESULT) { int current = pager.getCurrentItem(); if (commentPager && current == currentComment) { current = current - 1; } if (current < 0) current = 0; adapter = new OverviewPagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); pager.setCurrentItem(current); if (mTabLayout != null) { mTabLayout.setupWithViewPager(pager); scrollToTabAfterLayout(current); } setToolbarClick(); } else if ((requestCode == 2001 || requestCode == 2002) && resultCode == RESULT_OK) { if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_DRAWER || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) { drawerLayout.closeDrawers(); drawerSearch.setText(""); } //clear the text from the toolbar search field if (findViewById(R.id.toolbar_search) != null) { ((AutoCompleteTextView) findViewById(R.id.toolbar_search)).setText(""); } View view = MainActivity.this.getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } else if (requestCode == 2002 && resultCode != RESULT_OK) { mToolbar.performLongClick(); //search was init from the toolbar, so return focus to the toolbar } else if (requestCode == 423 && resultCode == RESULT_OK) { ((OverviewPagerAdapterComment) adapter).mCurrentComments.doResult(data); } else if (requestCode == 940) { if (adapter != null && adapter.getCurrentFragment() != null) { if (resultCode == RESULT_OK) { 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 if (requestCode == RESET_ADAPTER_RESULT) { resetAdapter(); setDrawerSubList(); } else if (requestCode == TUTORIAL_RESULT) { UserSubscriptions.doMainActivitySubs(this); } else if (requestCode == INBOX_RESULT) { //update notification badge new AsyncNotificationBadge().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } else if (requestCode == 3333) { this.data = data; if (doImage != null) { Handler handler = new Handler(); handler.post(doImage); } } else { super.onActivityResult(requestCode, resultCode, data); } /* todo if(resultCode == 4 && UserSubscriptions.hasChanged){ UserSubscriptions.hasChanged = false; sideArrayAdapter.setSideItems(UserSubscriptions.getAllSubreddits(this)); sideArrayAdapter.notifyDataSetChanged(); }*/ } @Override public void onBackPressed() { if (drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.START) || drawerLayout != null && drawerLayout.isDrawerOpen(GravityCompat.END)) { drawerLayout.closeDrawers(); } else if (commentPager && pager.getCurrentItem() == toOpenComments) { pager.setCurrentItem(pager.getCurrentItem() - 1); } else if ((SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) && findViewById(R.id.toolbar_search).getVisibility() == View.VISIBLE) { findViewById(R.id.close_search_toolbar).performClick(); //close GO_TO_SUB_FIELD } else if (SettingValues.exit) { final AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(MainActivity.this); builder.setTitle(R.string.general_confirm_exit); builder.setMessage(R.string.general_confirm_exit_msg); builder.setPositiveButton(R.string.btn_yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { finish(); } }); builder.setNegativeButton(R.string.btn_no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }); builder.show(); } else { super.onBackPressed(); } } @Override public void onPause() { super.onPause(); changed = false; if (!SettingValues.synccitName.isEmpty()) { new MySynccitUpdateTask().execute( SynccitRead.newVisited.toArray(new String[SynccitRead.newVisited.size()])); } if (Authentication.isLoggedIn && Authentication.me != null && Authentication.me.hasGold() && !SynccitRead.newVisited.isEmpty()) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { try { String[] returned = new String[SynccitRead.newVisited.size()]; int i = 0; for (String s : SynccitRead.newVisited) { if (!s.contains("t3_")) { s = "t3_" + s; } returned[i] = s; i++; } new AccountManager(Authentication.reddit).storeVisits(returned); SynccitRead.newVisited = new ArrayList<>(); } catch (Exception e) { e.printStackTrace(); } return null; } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } //Upon leaving MainActivity--hide the toolbar search if it is visible if (findViewById(R.id.toolbar_search).getVisibility() == View.VISIBLE) { findViewById(R.id.close_search_toolbar).performClick(); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: { // If request is cancelled, the result arrays are empty. if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) { // permission was granted, yay! Do the // contacts-related task you need to do. } else { runOnUiThread(new Runnable() { @Override public void run() { new AlertDialogWrapper.Builder(MainActivity.this).setTitle( R.string.err_permission) .setMessage(R.string.err_permission_msg) .setPositiveButton(R.string.btn_yes, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ActivityCompat.requestPermissions( MainActivity.this, new String[]{ Manifest.permission.WRITE_EXTERNAL_STORAGE }, 1); } }) .setNegativeButton(R.string.btn_no, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { dialog.dismiss(); } }) .show(); } }); } } // other 'case' lines to check for other // permissions this app might request } } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { changed = true; } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { changed = true; } } @Override public void onSaveInstanceState(Bundle savedInstanceState) { super.onSaveInstanceState(savedInstanceState); savedInstanceState.putStringArrayList(SUBS, (ArrayList<String>) usedArray); savedInstanceState.putBoolean(LOGGED_IN, Authentication.isLoggedIn); savedInstanceState.putBoolean(IS_ONLINE, Authentication.didOnline); savedInstanceState.putString(USERNAME, Authentication.name); } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (pager != null && SettingValues.commentPager && pager.getCurrentItem() == toOpenComments && SettingValues.commentVolumeNav && pager.getAdapter() instanceof OverviewPagerAdapterComment) { int keyCode = event.getKeyCode(); if (SettingValues.commentVolumeNav) { switch (keyCode) { case KeyEvent.KEYCODE_VOLUME_UP: return ((OverviewPagerAdapterComment) pager.getAdapter()).mCurrentComments.onKeyDown( keyCode, event); case KeyEvent.KEYCODE_VOLUME_DOWN: return ((OverviewPagerAdapterComment) pager.getAdapter()).mCurrentComments.onKeyDown( keyCode, event); default: return super.dispatchKeyEvent(event); } } else { return super.dispatchKeyEvent(event); } } return super.dispatchKeyEvent(event); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); if (NetworkUtil.isConnected(this)) { if (SettingValues.expandedToolbar) { inflater.inflate(R.menu.menu_subreddit_overview_expanded, menu); } else { inflater.inflate(R.menu.menu_subreddit_overview, menu); } //Only show the "Share Slide" menu item if the user doesn't have Pro installed if (SettingValues.tabletUI) { menu.findItem(R.id.share).setVisible(false); } if (SettingValues.fab && SettingValues.fabType == Constants.FAB_DISMISS) { menu.findItem(R.id.hide_posts).setVisible(false); } } else { inflater.inflate(R.menu.menu_subreddit_overview_offline, menu); } return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); this.menu = menu; /** * Hide the "Submit" and "Sidebar" menu items if the currently viewed sub is a multi, * domain, the frontpage, or /r/all. If the subreddit has a "." in it, we know it's a domain because * subreddits aren't allowed to have hard-stops in the name. */ if (Authentication.didOnline && usedArray != null) { final String subreddit = usedArray.get(pager.getCurrentItem()); if (subreddit.contains("/m/") || subreddit.contains(".") || subreddit.contains("+") || subreddit.equals("frontpage") || subreddit.equals("all")) { if (menu.findItem(R.id.submit) != null) { menu.findItem(R.id.submit).setVisible(false); } if (menu.findItem(R.id.sidebar) != null) { menu.findItem(R.id.sidebar).setVisible(false); } } else { if (menu.findItem(R.id.submit) != null) { menu.findItem(R.id.submit).setVisible(true); } if (menu.findItem(R.id.sidebar) != null) { menu.findItem(R.id.sidebar).setVisible(true); } } menu.findItem(R.id.theme) .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem item) { int style = new ColorPreferences(MainActivity.this).getThemeSubreddit( subreddit); final Context contextThemeWrapper = new ContextThemeWrapper(MainActivity.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, MainActivity.this, dialoglayout); /* boolean old = SettingValues.isPicsEnabled(selectedSub); SettingValues.setPicsEnabled(selectedSub, !item.isChecked()); item.setChecked(!item.isChecked()); reloadSubs(); invalidateOptionsMenu();*/ return false; } }); } return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { final String subreddit = usedArray.get(Reddit.currentPosition); switch (item.getItemId()) { case R.id.filter: filterContent(shouldLoad); return true; case R.id.sidebar: if (!subreddit.equals("all") && !subreddit.equals("frontpage") && !subreddit.contains(".") && !subreddit.contains("+") && !subreddit.contains(".") && !subreddit.contains("/m/")) { drawerLayout.openDrawer(GravityCompat.END); } else { Toast.makeText(this, R.string.sidebar_notfound, Toast.LENGTH_SHORT).show(); } return true; case R.id.night: { LayoutInflater inflater = getLayoutInflater(); final View dialoglayout = inflater.inflate(R.layout.choosethemesmall, null); AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(MainActivity.this); final TextView title = (TextView) dialoglayout.findViewById(R.id.title); title.setBackgroundColor(Palette.getDefaultColor()); builder.setView(dialoglayout); final Dialog d = builder.show(); back = new ColorPreferences(MainActivity.this).getFontStyle().getThemeType(); if (SettingValues.isNight()) { dialoglayout.findViewById(R.id.nightmsg).setVisibility(View.VISIBLE); } dialoglayout.findViewById(R.id.black) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 2) { back = theme.getThemeType(); new ColorPreferences(MainActivity.this).setFontStyle(theme); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.blacklighter) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 4) { back = theme.getThemeType(); new ColorPreferences(MainActivity.this).setFontStyle(theme); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.sepia) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 5) { back = theme.getThemeType(); new ColorPreferences(MainActivity.this).setFontStyle(theme); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.pixel) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 7) { back = theme.getThemeType(); new ColorPreferences(MainActivity.this).setFontStyle(theme); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.red).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 6) { back = theme.getThemeType(); new ColorPreferences(MainActivity.this).setFontStyle(theme); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.light) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 1) { new ColorPreferences(MainActivity.this).setFontStyle(theme); back = theme.getThemeType(); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.dark).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 0) { new ColorPreferences(MainActivity.this).setFontStyle(theme); back = theme.getThemeType(); d.dismiss(); restartTheme(); break; } } } }); dialoglayout.findViewById(R.id.blue).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { String[] names = new ColorPreferences(MainActivity.this).getFontStyle() .getTitle() .split("_"); String name = names[names.length - 1]; final String newName = name.replace("(", ""); for (ColorPreferences.Theme theme : ColorPreferences.Theme.values()) { if (theme.toString().contains(newName) && theme.getThemeType() == 3) { new ColorPreferences(MainActivity.this).setFontStyle(theme); back = theme.getThemeType(); d.dismiss(); restartTheme(); break; } } } }); } 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.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(); } }); //Add "search current sub" if it is not frontpage/all/random if (!subreddit.equalsIgnoreCase("frontpage") && !subreddit.equalsIgnoreCase("all") && !subreddit.contains(".") && !subreddit.contains("/m/") && !subreddit.equalsIgnoreCase("friends") && !subreddit.equalsIgnoreCase("random") && !subreddit.equalsIgnoreCase("popular") && !subreddit.equalsIgnoreCase("myrandom") && !subreddit.equalsIgnoreCase("randnsfw")) { 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(MainActivity.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.neutralText(R.string.search_all) .onNeutral(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) { Intent i = new Intent(MainActivity.this, Search.class); i.putExtra(Search.EXTRA_TERM, term); startActivity(i); } }); } else { builder.positiveText(R.string.search_all) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog materialDialog, @NonNull DialogAction dialogAction) { Intent i = new Intent(MainActivity.this, Search.class); i.putExtra(Search.EXTRA_TERM, term); startActivity(i); } }); } builder.show(); return true; case R.id.save: saveOffline(((SubmissionsView) adapter.getCurrentFragment()).posts.posts, ((SubmissionsView) adapter.getCurrentFragment()).posts.subreddit); return true; case R.id.hide_posts: ((SubmissionsView) adapter.getCurrentFragment()).clearSeenPosts(false); return true; case R.id.share: Reddit.defaultShareText("Slide for Reddit", "https://play.google.com/store/apps/details?id=me.ccrama.redditslide", MainActivity.this); return true; case R.id.submit: { Intent i = new Intent(MainActivity.this, Submit.class); i.putExtra(Submit.EXTRA_SUBREDDIT, subreddit); startActivity(i); } 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 { AlertDialogWrapper.Builder b = 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(); } }); if (SettingValues.previews > 0) { b.setNeutralButton(getString(R.string.pro_previews, SettingValues.previews), new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { SettingValues.prefs.edit() .putInt(SettingValues.PREVIEWS_LEFT, SettingValues.previews - 1) .apply(); SettingValues.previews = SettingValues.prefs.getInt( SettingValues.PREVIEWS_LEFT, 10); List<Submission> posts = ((SubmissionsView) adapter.getCurrentFragment()).posts.posts; if (posts != null && !posts.isEmpty()) { Intent i2 = new Intent(MainActivity.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); } } }); } b.show(); } return true; case R.id.action_shadowbox: if (SettingValues.tabletUI) { List<Submission> posts = ((SubmissionsView) adapter.getCurrentFragment()).posts.posts; if (posts != null && !posts.isEmpty()) { Intent i2 = new Intent(this, Shadowbox.class); i2.putExtra(Shadowbox.EXTRA_PAGE, getCurrentPage()); i2.putExtra("offline", ((SubmissionsView) adapter.getCurrentFragment()).posts.cached != null ? ((SubmissionsView) adapter.getCurrentFragment()).posts.cached.time : 0L); i2.putExtra(Shadowbox.EXTRA_SUBREDDIT, ((SubmissionsView) adapter.getCurrentFragment()).posts.subreddit); startActivity(i2); } } else { AlertDialogWrapper.Builder b = 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(); } }); if (SettingValues.previews > 0) { b.setNeutralButton("Preview (" + SettingValues.previews + ")", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { SettingValues.prefs.edit() .putInt(SettingValues.PREVIEWS_LEFT, SettingValues.previews - 1) .apply(); SettingValues.previews = SettingValues.prefs.getInt( SettingValues.PREVIEWS_LEFT, 10); List<Submission> posts = ((SubmissionsView) adapter.getCurrentFragment()).posts.posts; if (posts != null && !posts.isEmpty()) { Intent i2 = new Intent(MainActivity.this, Shadowbox.class); i2.putExtra(Shadowbox.EXTRA_PAGE, getCurrentPage()); i2.putExtra("offline", ((SubmissionsView) adapter.getCurrentFragment()).posts.cached != null ? ((SubmissionsView) adapter.getCurrentFragment()).posts.cached.time : 0L); i2.putExtra(Shadowbox.EXTRA_SUBREDDIT, ((SubmissionsView) adapter.getCurrentFragment()).posts.subreddit); startActivity(i2); } } }); } b.show(); } return true; default: return false; } } @Override protected void onCreate(final Bundle savedInstanceState) { inNightMode = SettingValues.isNight(); disableSwipeBackLayout(); super.onCreate(savedInstanceState); if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) { // Activity was brought to front and not created finish(); return; } if (!Slide.hasStarted) { Slide.hasStarted = true; } if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { // Show an expanation to the user *asynchronously* -- don't block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 1); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } } boolean first = false; if (Reddit.colors != null && !Reddit.colors.contains("Tutorial")) { first = true; if (Reddit.appRestart == null) { Reddit.appRestart = getSharedPreferences("appRestart", 0); } Reddit.appRestart.edit().putBoolean("firststart52", true).apply(); Intent i = new Intent(this, Tutorial.class); doForcePrefs(); startActivity(i); } else { if (Authentication.didOnline && NetworkUtil.isConnected(MainActivity.this) && !checkedPopups) { runAfterLoad = new Runnable() { @Override public void run() { runAfterLoad = null; if (Authentication.isLoggedIn) { new AsyncNotificationBadge().executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR); } if (!Reddit.appRestart.getString(CheckForMail.SUBS_TO_GET, "").isEmpty()) { new CheckForMail.AsyncGetSubs(MainActivity.this).executeOnExecutor( AsyncTask.THREAD_POOL_EXECUTOR); } new AsyncTask<Void, Void, Submission>() { @Override protected Submission doInBackground(Void... params) { if (Authentication.isLoggedIn) UserSubscriptions.doOnlineSyncing(); try { SubredditPaginator p = new SubredditPaginator(Authentication.reddit, "slideforreddit"); p.setLimit(2); ArrayList<Submission> posts = new ArrayList<>(p.next()); for (Submission s : posts) { String version = BuildConfig.VERSION_NAME; if (version.length() > 5) { version = version.substring(0, version.lastIndexOf(".")); } if (s.isStickied() && s.getSubmissionFlair().getText() != null && s.getSubmissionFlair() .getText() .equalsIgnoreCase("Announcement") && !Reddit.appRestart.contains( "announcement" + s.getFullName()) && s.getTitle().contains(version)) { Reddit.appRestart.edit() .putBoolean("announcement" + s.getFullName(), true) .apply(); return s; } else if (BuildConfig.VERSION_NAME.contains("alpha") && s.isStickied() && s.getSubmissionFlair().getText() != null && s.getSubmissionFlair() .getText() .equalsIgnoreCase("Alpha") && !Reddit.appRestart.contains( "announcement" + s.getFullName()) && s.getTitle() .contains(BuildConfig.VERSION_NAME)) { Reddit.appRestart.edit() .putBoolean("announcement" + s.getFullName(), true) .apply(); return s; } else if (s.isStickied() && s.getSubmissionFlair() .getText() .equalsIgnoreCase("PRO") && !SettingValues.tabletUI && !Reddit.appRestart.contains( "announcement" + s.getFullName())) { Reddit.appRestart.edit() .putBoolean("announcement" + s.getFullName(), true) .apply(); return s; } } } catch (Exception e) { e.printStackTrace(); } return null; } @Override protected void onPostExecute(final Submission s) { checkedPopups = true; if (s != null) { Reddit.appRestart.edit() .putString("page", s.getDataNode().get("selftext_html").asText()) .apply(); Reddit.appRestart.edit() .putString("title", s.getTitle()) .apply(); Reddit.appRestart.edit().putString("url", s.getUrl()).apply(); String title; if (s.getTitle().toLowerCase().contains("release")) { title = getString(R.string.btn_changelog); } else { title = getString(R.string.btn_view); } Snackbar snack = Snackbar.make(pager, s.getTitle(), Snackbar.LENGTH_INDEFINITE) .setAction(title, new OnSingleClickListener() { @Override public void onSingleClick(View v) { Intent i = new Intent(MainActivity.this, Announcement.class); startActivity(i); } }); View view = snack.getView(); TextView tv = (TextView) view.findViewById( android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); snack.show(); } } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); //todo this new AsyncStartNotifSocket().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }; } } if (savedInstanceState != null && !changed) { Authentication.isLoggedIn = savedInstanceState.getBoolean(LOGGED_IN); Authentication.name = savedInstanceState.getString(USERNAME, "LOGGEDOUT"); Authentication.didOnline = savedInstanceState.getBoolean(IS_ONLINE); } else { changed = false; } if (getIntent().getBooleanExtra("EXIT", false)) finish(); applyColorTheme(); setContentView(R.layout.activity_overview); mToolbar = (Toolbar) findViewById(R.id.toolbar); mToolbar.setPopupTheme(new ColorPreferences(this).getFontStyle().getBaseId()); setSupportActionBar(mToolbar); if (getIntent() != null && getIntent().hasExtra(EXTRA_PAGE_TO)) { toGoto = getIntent().getIntExtra(EXTRA_PAGE_TO, 0); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = this.getWindow(); window.setStatusBarColor( Palette.getDarkerColor(Palette.getDarkerColor(Palette.getDefaultColor()))); } mTabLayout = (TabLayout) findViewById(R.id.sliding_tabs); header = findViewById(R.id.header); //Gets the height of the header if (header != null) { header.getViewTreeObserver() .addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { headerHeight = header.getHeight(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) { header.getViewTreeObserver().removeOnGlobalLayoutListener(this); } else { header.getViewTreeObserver().removeGlobalOnLayoutListener(this); } } }); } pager = (ToggleSwipeViewPager) findViewById(R.id.content_view); singleMode = SettingValues.single; if (singleMode) { commentPager = SettingValues.commentPager; } // Inflate tabs if single mode is disabled if (!singleMode) { mTabLayout = (TabLayout) ((ViewStub) findViewById(R.id.stub_tabs)).inflate(); } // Disable swiping if single mode is enabled if (singleMode) { pager.setSwipingEnabled(false); } sidebarBody = (SpoilerRobotoTextView) findViewById(R.id.sidebar_text); sidebarOverflow = (CommentOverflow) findViewById(R.id.commentOverflow); if (!Reddit.appRestart.getBoolean("isRestarting", false) && Reddit.colors.contains( "Tutorial")) { LogUtil.v("Starting main " + Authentication.name); Authentication.isLoggedIn = Reddit.appRestart.getBoolean("loggedin", false); Authentication.name = Reddit.appRestart.getString("name", "LOGGEDOUT"); UserSubscriptions.doMainActivitySubs(this); } else if (!first) { LogUtil.v("Starting main 2 " + Authentication.name); Authentication.isLoggedIn = Reddit.appRestart.getBoolean("loggedin", false); Authentication.name = Reddit.appRestart.getString("name", "LOGGEDOUT"); Reddit.appRestart.edit().putBoolean("isRestarting", false).commit(); Reddit.isRestarting = false; UserSubscriptions.doMainActivitySubs(this); } final SharedPreferences seen = getSharedPreferences("SEEN", 0); if (!seen.contains("isCleared") && !seen.getAll(). isEmpty() || !Reddit.appRestart.contains("hasCleared")) { new AsyncTask<Void, Void, Void>() { @Override protected Void doInBackground(Void... params) { KVManger m = KVStore.getInstance(); Map<String, ?> values = seen.getAll(); for (Map.Entry<String, ?> entry : values.entrySet()) { if (entry.getKey().length() == 6 && entry.getValue() instanceof Boolean) { m.insert(entry.getKey(), "true"); } else if (entry.getValue() instanceof Long) { m.insert(entry.getKey(), String.valueOf(seen.getLong(entry.getKey(), 0))); } } seen.edit().clear().putBoolean("isCleared", true).apply(); if (getSharedPreferences("HIDDEN_POSTS", 0).getAll().size() != 0) { getSharedPreferences("HIDDEN", 0).edit().clear().apply(); getSharedPreferences("HIDDEN_POSTS", 0).edit().clear().apply(); } if (!Reddit.appRestart.contains("hasCleared")) { SharedPreferences.Editor e = Reddit.appRestart.edit(); Map<String, ?> toClear = Reddit.appRestart.getAll(); for (Map.Entry<String, ?> entry : toClear.entrySet()) { if (entry.getValue() instanceof String && ((String) entry.getValue()).length() > 300) { e.remove(entry.getKey()); } } e.putBoolean("hasCleared", true); e.apply(); } return null; } @Override protected void onPostExecute(Void aVoid) { dismissProgressDialog(); } @Override protected void onPreExecute() { d = new MaterialDialog.Builder(MainActivity.this).title( R.string.misc_setting_up) .content(R.string.misc_setting_up_message) .progress(true, 100) .cancelable(false) .build(); d.show(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } if (Authentication.isLoggedIn && NetworkUtil.isConnected(MainActivity.this)) { // Display an snackbar that asks the user to rate the app after this // activity was created 6 times, never again when once clicked or with a maximum of // two times. SnackEngage.from(MainActivity.this) .withSnack(new RateSnack().withConditions(new NeverAgainWhenClickedOnce(), new AfterNumberOfOpportunities(10), new WithLimitedNumberOfTimes(2)) .overrideActionText(getString(R.string.misc_rate_msg)) .overrideTitleText(getString(R.string.misc_rate_title)) .withDuration(BaseSnack.DURATION_LONG)) /*.withSnack(new CustomSnack(new Intent(MainActivity.this, SettingsReddit.class), "Thumbnails are disabled", "Change", "THUMBNAIL_INFO") .withConditions(new AfterNumberOfOpportunities(2), new WithLimitedNumberOfTimes(2), new NeverAgainWhenClickedOnce()) .withDuration(BaseSnack.DURATION_LONG))*/ .build() .engageWhenAppropriate(); } if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) { setupSubredditSearchToolbar(); } /** * int for the current base theme selected. * 0 = Dark, 1 = Light, 2 = AMOLED, 3 = Dark blue, 4 = AMOLED with contrast, 5 = Sepia */ SettingValues.currentTheme = new ColorPreferences(this).getFontStyle().getThemeType(); networkStateReceiver = new NetworkStateReceiver(); networkStateReceiver.addListener(this); try { this.registerReceiver(networkStateReceiver, new IntentFilter(android.net.ConnectivityManager.CONNECTIVITY_ACTION)); } catch (Exception e) { } } @Override public void networkAvailable() { if (runAfterLoad == null && Reddit.authentication != null) { Authentication.resetAdapter(); } } NetworkStateReceiver networkStateReceiver; @Override public void networkUnavailable() { } @Override public void onResume() { super.onResume(); if (Authentication.isLoggedIn && Authentication.didOnline && NetworkUtil.isConnected( MainActivity.this) && headerMain != null && runAfterLoad == null) { new AsyncNotificationBadge().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } if ((!inNightMode && SettingValues.isNight()) || (inNightMode && !SettingValues.isNight())) { restartTheme(); } if (pager != null && commentPager) { if (pager.getCurrentItem() != toOpenComments && shouldLoad != null) { if (usedArray != null && !shouldLoad.contains("+") && usedArray.indexOf(shouldLoad) != pager.getCurrentItem()) { pager.setCurrentItem(toOpenComments - 1); } } } Reddit.setDefaultErrorHandler(this); if (sideArrayAdapter != null) { sideArrayAdapter.updateHistory(UserSubscriptions.getHistory()); } /* remove if (datasetChanged && UserSubscriptions.hasSubs() && !usedArray.isEmpty()) { usedArray = new ArrayList<>(UserSubscriptions.getSubscriptions(this)); adapter.notifyDataSetChanged(); sideArrayAdapter.notifyDataSetChanged(); datasetChanged = false; if (mTabLayout != null) { mTabLayout.setupWithViewPager(pager); scrollToTabAfterLayout(pager.getCurrentItem()); } setToolbarClick(); }*/ //Only refresh the view if a Setting was altered if (Settings.changed || SettingsTheme.changed) { reloadSubs(); //If the user changed a Setting regarding the app's theme, restartTheme() if (SettingsTheme.changed /* todo maybe later || (usedArray != null && usedArray.size() != UserSubscriptions.getSubscriptions(this).size())*/) { restartTheme(); } //Need to change the subreddit search method if (SettingsGeneral.searchChanged) { setDrawerSubList(); if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_DRAWER) { mToolbar.setOnLongClickListener( null); //remove the long click listener from the toolbar findViewById(R.id.drawer_divider).setVisibility(View.GONE); } else if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR) { setupSubredditSearchToolbar(); } else if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) { findViewById(R.id.drawer_divider).setVisibility(View.GONE); setupSubredditSearchToolbar(); setDrawerSubList(); } SettingsGeneral.searchChanged = false; } SettingsTheme.changed = false; Settings.changed = false; setToolbarClick(); } } @Override public void onDestroy() { try { unregisterReceiver(networkStateReceiver); } catch (Exception ignored) { } dismissProgressDialog(); Slide.hasStarted = false; super.onDestroy(); } public static String abbreviate(final String str, final int maxWidth) { if (str.length() <= maxWidth) { return str; } final String abrevMarker = "..."; return str.substring(0, maxWidth - 3) + abrevMarker; } /** * Set the drawer edge (i.e. how sensitive the drawer is) Based on a given screen width * percentage. * * @param displayWidthPercentage larger the value, the more sensitive the drawer swipe is; * percentage of screen width * @param drawerLayout drawerLayout to adjust the swipe edge */ public static void setDrawerEdge(Activity activity, final float displayWidthPercentage, DrawerLayout drawerLayout) { try { Field mDragger = drawerLayout.getClass().getSuperclass().getDeclaredField("mLeftDragger"); mDragger.setAccessible(true); ViewDragHelper leftDragger = (ViewDragHelper) mDragger.get(drawerLayout); Field mEdgeSize = leftDragger.getClass().getDeclaredField("mEdgeSize"); mEdgeSize.setAccessible(true); final int currentEdgeSize = mEdgeSize.getInt(leftDragger); Point displaySize = new Point(); activity.getWindowManager().getDefaultDisplay().getSize(displaySize); mEdgeSize.setInt(leftDragger, Math.max(currentEdgeSize, (int) (displaySize.x * displayWidthPercentage))); } catch (Exception e) { LogUtil.e(e + ": Exception thrown while changing navdrawer edge size"); } } public void doDrawer() { drawerSubList = (ListView) findViewById(R.id.drawerlistview); drawerSubList.setDividerHeight(0); drawerSubList.setDescendantFocusability(ListView.FOCUS_BEFORE_DESCENDANTS); final LayoutInflater inflater = getLayoutInflater(); final View header; if (Authentication.isLoggedIn && Authentication.didOnline) { header = inflater.inflate(R.layout.drawer_loggedin, drawerSubList, false); headerMain = header; hea = header.findViewById(R.id.back); drawerSubList.addHeaderView(header, null, false); ((TextView) header.findViewById(R.id.name)).setText(Authentication.name); header.findViewById(R.id.multi).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { if (runAfterLoad == null) { Intent inte = new Intent(MainActivity.this, MultiredditOverview.class); MainActivity.this.startActivity(inte); } } }); header.findViewById(R.id.multi).setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { new MaterialDialog.Builder(MainActivity.this).inputRange(3, 20) .alwaysCallInputCallback() .input(getString(R.string.user_enter), null, new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { final EditText editText = dialog.getInputEditText(); EditTextValidator.validateUsername(editText); if (input.length() >= 3 && input.length() <= 20) { dialog.getActionButton(DialogAction.POSITIVE) .setEnabled(true); } } }) .positiveText(R.string.user_btn_gotomultis) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { if (runAfterLoad == null) { Intent inte = new Intent(MainActivity.this, MultiredditOverview.class); inte.putExtra(Profile.EXTRA_PROFILE, dialog.getInputEditText().getText().toString()); MainActivity.this.startActivity(inte); } } }) .negativeText(R.string.btn_cancel) .show(); return true; } }); header.findViewById(R.id.discover).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Discover.class); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.prof_click).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Profile.class); inte.putExtra(Profile.EXTRA_PROFILE, Authentication.name); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.saved).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Profile.class); inte.putExtra(Profile.EXTRA_PROFILE, Authentication.name); inte.putExtra(Profile.EXTRA_SAVED, true); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.later).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, PostReadLater.class); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.history).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Profile.class); inte.putExtra(Profile.EXTRA_PROFILE, Authentication.name); inte.putExtra(Profile.EXTRA_HISTORY, true); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.commented).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Profile.class); inte.putExtra(Profile.EXTRA_PROFILE, Authentication.name); inte.putExtra(Profile.EXTRA_COMMENT, true); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.submitted).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Profile.class); inte.putExtra(Profile.EXTRA_PROFILE, Authentication.name); inte.putExtra(Profile.EXTRA_SUBMIT, true); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.upvoted).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Profile.class); inte.putExtra(Profile.EXTRA_PROFILE, Authentication.name); inte.putExtra(Profile.EXTRA_UPVOTE, true); MainActivity.this.startActivity(inte); } }); /** * If the user is a known mod, show the "Moderation" drawer item quickly to * stop the UI from jumping */ if (modOf != null && !modOf.isEmpty() && Authentication.mod) { header.findViewById(R.id.mod).setVisibility(View.VISIBLE); } //update notification badge final LinearLayout profStuff = (LinearLayout) header.findViewById(R.id.accountsarea); profStuff.setVisibility(View.GONE); findViewById(R.id.back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (profStuff.getVisibility() == View.GONE) { expand(profStuff); flipAnimator(false, header.findViewById(R.id.headerflip)).start(); } else { collapse(profStuff); flipAnimator(true, header.findViewById(R.id.headerflip)).start(); } } }); final HashMap<String, String> accounts = new HashMap<>(); for (String s : Authentication.authentication.getStringSet("accounts", new HashSet<String>())) { if (s.contains(":")) { accounts.put(s.split(":")[0], s.split(":")[1]); } else { accounts.put(s, ""); } } final ArrayList<String> keys = new ArrayList<>(accounts.keySet()); final String guest = getString(R.string.guest); keys.add(guest); final LinearLayout accountList = (LinearLayout) header.findViewById(R.id.accountsarea); for (final String accName : keys) { LogUtil.v(accName); final View t = getLayoutInflater().inflate(R.layout.account_textview_white, accountList, false); ((TextView) t.findViewById(R.id.name)).setText(accName); if (!accName.equals(guest)) { t.findViewById(R.id.remove).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AlertDialogWrapper.Builder(MainActivity.this).setTitle( R.string.profile_remove) .setMessage(R.string.profile_remove_account) .setNegativeButton(R.string.btn_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog2, int which2) { Set<String> accounts2 = Authentication.authentication.getStringSet( "accounts", new HashSet<String>()); Set<String> done = new HashSet<>(); for (String s : accounts2) { if (!s.contains(accName)) { done.add(s); } } Authentication.authentication.edit() .putStringSet("accounts", done) .commit(); dialog2.dismiss(); accountList.removeView(t); if (accName.equalsIgnoreCase( Authentication.name)) { boolean d = false; for (String s : keys) { if (!s.equalsIgnoreCase(accName)) { d = true; LogUtil.v("Switching to " + s); if (accounts.containsKey(s) && !accounts.get(s) .isEmpty()) { Authentication.authentication.edit() .putString("lasttoken", accounts.get(s)) .remove("backedCreds") .commit(); } else { ArrayList<String> tokens = new ArrayList<>( Authentication.authentication .getStringSet( "tokens", new HashSet<String>())); int index = keys.indexOf(s); if (keys.indexOf(s) > tokens.size()) { index -= 1; } Authentication.authentication.edit() .putString("lasttoken", tokens.get( index)) .remove("backedCreds") .commit(); } Authentication.name = s; UserSubscriptions.switchAccounts(); Reddit.forceRestart( MainActivity.this, true); break; } } if (!d) { Authentication.name = "LOGGEDOUT"; Authentication.isLoggedIn = false; Authentication.authentication.edit() .remove("lasttoken") .remove("backedCreds") .commit(); UserSubscriptions.switchAccounts(); Reddit.forceRestart(MainActivity.this, true); } } else { accounts.remove(accName); keys.remove(accName); } } }) .setPositiveButton(R.string.btn_cancel, null) .show(); } }); } else { t.findViewById(R.id.remove).setVisibility(View.GONE); } t.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (!accName.equalsIgnoreCase(Authentication.name)) { LogUtil.v("Switching to " + accName); if (!accName.equals(guest)) { if (!accounts.get(accName).isEmpty()) { Authentication.authentication.edit() .putString("lasttoken", accounts.get(accName)) .remove("backedCreds") .apply(); } else { ArrayList<String> tokens = new ArrayList<>( Authentication.authentication.getStringSet("tokens", new HashSet<String>())); Authentication.authentication.edit() .putString("lasttoken", tokens.get(keys.indexOf(accName))) .remove("backedCreds") .apply(); } Authentication.name = accName; } else { Authentication.name = "LOGGEDOUT"; Authentication.isLoggedIn = false; Authentication.authentication.edit() .remove("lasttoken") .remove("backedCreds") .apply(); } UserSubscriptions.switchAccounts(); Reddit.forceRestart(MainActivity.this, true); } } }); accountList.addView(t); } header.findViewById(R.id.godown).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { LinearLayout body = (LinearLayout) header.findViewById(R.id.expand_profile); if (body.getVisibility() == View.GONE) { expand(body); flipAnimator(false, view).start(); } else { collapse(body); flipAnimator(true, view).start(); } } }); header.findViewById(R.id.add).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Login.class); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.offline).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Reddit.appRestart.edit().putBoolean("forceoffline", true).commit(); Reddit.forceRestart(MainActivity.this); } }); header.findViewById(R.id.inbox).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Inbox.class); MainActivity.this.startActivityForResult(inte, INBOX_RESULT); } }); headerMain = header; if (runAfterLoad == null) { new AsyncNotificationBadge().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } } else if (Authentication.didOnline) { header = inflater.inflate(R.layout.drawer_loggedout, drawerSubList, false); drawerSubList.addHeaderView(header, null, false); headerMain = header; hea = header.findViewById(R.id.back); final LinearLayout profStuff = (LinearLayout) header.findViewById(R.id.accountsarea); profStuff.setVisibility(View.GONE); findViewById(R.id.back).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if (profStuff.getVisibility() == View.GONE) { expand(profStuff); flipAnimator(false, header.findViewById(R.id.headerflip)).start(); } else { collapse(profStuff); flipAnimator(true, header.findViewById(R.id.headerflip)).start(); } } }); final HashMap<String, String> accounts = new HashMap<>(); for (String s : Authentication.authentication.getStringSet("accounts", new HashSet<String>())) { if (s.contains(":")) { accounts.put(s.split(":")[0], s.split(":")[1]); } else { accounts.put(s, ""); } } final ArrayList<String> keys = new ArrayList<>(accounts.keySet()); final String guest = getString(R.string.guest); keys.add(guest); final LinearLayout accountList = (LinearLayout) header.findViewById(R.id.accountsarea); for (final String accName : keys) { LogUtil.v(accName); final View t = getLayoutInflater().inflate(R.layout.account_textview_white, accountList, false); ((TextView) t.findViewById(R.id.name)).setText(accName); if (!accName.equals(guest)) { t.findViewById(R.id.remove).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { new AlertDialogWrapper.Builder(MainActivity.this).setTitle( R.string.profile_remove) .setMessage(R.string.profile_remove_account) .setNegativeButton(R.string.btn_delete, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog2, int which2) { Set<String> accounts2 = Authentication.authentication.getStringSet( "accounts", new HashSet<String>()); Set<String> done = new HashSet<>(); for (String s : accounts2) { if (!s.contains(accName)) { done.add(s); } } Authentication.authentication.edit() .putStringSet("accounts", done) .commit(); dialog2.dismiss(); accountList.removeView(t); if (accName.equalsIgnoreCase( Authentication.name)) { boolean d = false; for (String s : keys) { if (!s.equalsIgnoreCase(accName)) { d = true; LogUtil.v("Switching to " + s); if (!accounts.get(s).isEmpty()) { Authentication.authentication.edit() .putString("lasttoken", accounts.get(s)) .remove("backedCreds") .commit(); } else { ArrayList<String> tokens = new ArrayList<>( Authentication.authentication .getStringSet( "tokens", new HashSet<String>())); Authentication.authentication.edit() .putString("lasttoken", tokens.get( keys.indexOf( s))) .remove("backedCreds") .commit(); } Authentication.name = s; UserSubscriptions.switchAccounts(); Reddit.forceRestart( MainActivity.this, true); } } if (!d) { Authentication.name = "LOGGEDOUT"; Authentication.isLoggedIn = false; Authentication.authentication.edit() .remove("lasttoken") .remove("backedCreds") .commit(); UserSubscriptions.switchAccounts(); Reddit.forceRestart(MainActivity.this, true); } } else { accounts.remove(accName); keys.remove(accName); } } }) .setPositiveButton(R.string.btn_cancel, null) .show(); } }); } else { t.findViewById(R.id.remove).setVisibility(View.GONE); } t.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { if (!accName.equalsIgnoreCase(Authentication.name) && !accName.equals( guest)) { if (!accounts.get(accName).isEmpty()) { Authentication.authentication.edit() .putString("lasttoken", accounts.get(accName)) .remove("backedCreds") .commit(); } else { ArrayList<String> tokens = new ArrayList<>( Authentication.authentication.getStringSet("tokens", new HashSet<String>())); Authentication.authentication.edit() .putString("lasttoken", tokens.get(keys.indexOf(accName))) .remove("backedCreds") .commit(); } Authentication.isLoggedIn = true; Authentication.name = accName; UserSubscriptions.switchAccounts(); Reddit.forceRestart(MainActivity.this, true); } } }); accountList.addView(t); } header.findViewById(R.id.add).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent inte = new Intent(MainActivity.this, Login.class); MainActivity.this.startActivity(inte); } }); header.findViewById(R.id.offline).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Reddit.appRestart.edit().putBoolean("forceoffline", true).commit(); Reddit.forceRestart(MainActivity.this); } }); headerMain = header; header.findViewById(R.id.multi).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new MaterialDialog.Builder(MainActivity.this).inputRange(3, 20) .alwaysCallInputCallback() .input(getString(R.string.user_enter), null, new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { final EditText editText = dialog.getInputEditText(); EditTextValidator.validateUsername(editText); if (input.length() >= 3 && input.length() <= 20) { dialog.getActionButton(DialogAction.POSITIVE) .setEnabled(true); } } }) .positiveText(R.string.user_btn_gotomultis) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { if (runAfterLoad == null) { Intent inte = new Intent(MainActivity.this, MultiredditOverview.class); inte.putExtra(Profile.EXTRA_PROFILE, dialog.getInputEditText().getText().toString()); MainActivity.this.startActivity(inte); } } }) .negativeText(R.string.btn_cancel) .show(); } }); } else { header = inflater.inflate(R.layout.drawer_offline, drawerSubList, false); headerMain = header; drawerSubList.addHeaderView(header, null, false); hea = header.findViewById(R.id.back); header.findViewById(R.id.online).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Reddit.appRestart.edit().remove("forceoffline").commit(); Reddit.forceRestart(MainActivity.this); } }); } header.findViewById(R.id.manage).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { Intent i = new Intent(MainActivity.this, ManageOfflineContent.class); startActivity(i); } }); if (Authentication.didOnline) { View support = header.findViewById(R.id.support); if (SettingValues.tabletUI) { support.setVisibility(View.GONE); } else { header.findViewById(R.id.support).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { new AlertDialogWrapper.Builder(MainActivity.this).setTitle( R.string.settings_support_slide) .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(); } }); } header.findViewById(R.id.prof).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { new MaterialDialog.Builder(MainActivity.this).inputRange(3, 20) .alwaysCallInputCallback() .input(getString(R.string.user_enter), null, new MaterialDialog.InputCallback() { @Override public void onInput(@NonNull MaterialDialog dialog, CharSequence input) { final EditText editText = dialog.getInputEditText(); EditTextValidator.validateUsername(editText); if (input.length() >= 3 && input.length() <= 20) { dialog.getActionButton(DialogAction.POSITIVE) .setEnabled(true); } } }) .positiveText(R.string.user_btn_goto) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Intent inte = new Intent(MainActivity.this, Profile.class); //noinspection ConstantConditions inte.putExtra(Profile.EXTRA_PROFILE, dialog.getInputEditText().getText().toString()); MainActivity.this.startActivity(inte); } }) .negativeText(R.string.btn_cancel) .show(); } }); } header.findViewById(R.id.settings).setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View v) { Intent i = new Intent(MainActivity.this, Settings.class); startActivity(i); // Cancel sub loading because exiting the settings will reload it anyway if (mAsyncGetSubreddit != null) mAsyncGetSubreddit.cancel(true); drawerLayout.closeDrawers(); } }); /* footer.findViewById(R.id.settings).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Intent inte = new Intent(Overview.this, Setting.class); Overview.this.startActivityForResult(inte, 3); } });*/ final Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); final ActionBarDrawerToggle actionBarDrawerToggle = new ActionBarDrawerToggle(MainActivity.this, drawerLayout, toolbar, R.string.btn_open, R.string.btn_close) { @Override public void onDrawerSlide(View drawerView, float slideOffset) { super.onDrawerSlide(drawerView, 0); // this disables the animation } @Override public void onDrawerOpened(View drawerView) { super.onDrawerOpened(drawerView); if (drawerLayout.isDrawerOpen(GravityCompat.END)) { int current = pager.getCurrentItem(); if (current == toOpenComments && toOpenComments != 0) { current -= 1; } String compare = usedArray.get(current); if (compare.equals("random") || compare.equals("myrandom") || compare.equals("randnsfw")) { if (adapter != null && adapter.getCurrentFragment() != null && ((SubmissionsView) adapter.getCurrentFragment()).adapter.dataSet.subredditRandom != null) { String sub = ((SubmissionsView) adapter.getCurrentFragment()).adapter.dataSet.subredditRandom; doSubSidebarNoLoad(sub); doSubSidebar(sub); } } else { doSubSidebar(usedArray.get(current)); } } } @Override public void onDrawerClosed(View view) { super.onDrawerClosed(view); InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(drawerLayout.getWindowToken(), 0); } }; drawerLayout.setDrawerListener(actionBarDrawerToggle); actionBarDrawerToggle.syncState(); header.findViewById(R.id.back).setBackgroundColor(Palette.getColor("alsdkfjasld")); accountsArea = header.findViewById(R.id.accountsarea); if (accountsArea != null) { accountsArea.setBackgroundColor(Palette.getDarkerColor("alsdkfjasld")); } setDrawerSubList(); } public void doForcePrefs() { ArrayList<String> domains = new ArrayList<>(); for (String s : SettingValues.alwaysExternal.replaceAll("^[,\\s]+", "").split("[,\\s]+")) { if (!s.isEmpty()) { s = s.trim(); final String finalS = s; if (!finalS.contains("youtu")) domains.add(finalS); } } // Make some domains open externally by default, can be used with Chrome Customtabs if they remove the option in settings domains.add("youtube.com"); domains.add("youtu.be"); domains.add("play.google.com"); SharedPreferences.Editor e = SettingValues.prefs.edit(); e.putString(SettingValues.PREF_ALWAYS_EXTERNAL, Reddit.arrayToString(domains)); e.apply(); PostMatch.externalDomain = null; SettingValues.alwaysExternal = SettingValues.prefs.getString(SettingValues.PREF_ALWAYS_EXTERNAL, ""); } public void doFriends(final List<String> friends) { runOnUiThread(new Runnable() { @Override public void run() { if (friends != null && !friends.isEmpty() && headerMain.findViewById(R.id.friends) != null) { headerMain.findViewById(R.id.friends).setVisibility(View.VISIBLE); headerMain.findViewById(R.id.friends) .setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { new MaterialDialog.Builder(MainActivity.this).title("Friends") .items(friends) .itemsCallback(new MaterialDialog.ListCallback() { @Override public void onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { Intent i = new Intent(MainActivity.this, Profile.class); i.putExtra(Profile.EXTRA_PROFILE, friends.get(which)); startActivity(i); dialog.dismiss(); } }) .show(); } }); } else if (Authentication.isLoggedIn && headerMain.findViewById(R.id.friends) != null) { headerMain.findViewById(R.id.friends).setVisibility(View.GONE); } } }); } public void doPageSelectedComments(int position) { pager.setSwipeLeftOnly(false); header.animate().translationY(0).setInterpolator(new LinearInterpolator()).setDuration(180); Reddit.currentPosition = position; if (position + 1 != currentComment) { doSubSidebarNoLoad(usedArray.get(position)); } SubmissionsView page = (SubmissionsView) adapter.getCurrentFragment(); if (page != null && page.adapter != null) { SubredditPosts p = page.adapter.dataSet; if (p.offline && p.cached != null) { Toast.makeText(MainActivity.this, getString(R.string.offline_last_update, TimeUtils.getTimeAgo(p.cached.time, MainActivity.this)), Toast.LENGTH_LONG) .show(); } } if (hea != null) { hea.setBackgroundColor(Palette.getColor(usedArray.get(position))); if (accountsArea != null) { accountsArea.setBackgroundColor(Palette.getDarkerColor(usedArray.get(position))); } } header.setBackgroundColor(Palette.getColor(usedArray.get(position))); themeSystemBars(usedArray.get(position)); setRecentBar(usedArray.get(position)); if (SettingValues.single) { getSupportActionBar().setTitle(usedArray.get(position)); } else { if (mTabLayout != null) { mTabLayout.setSelectedTabIndicatorColor( new ColorPreferences(MainActivity.this).getColor(usedArray.get(position))); } } selectedSub = usedArray.get(position); } public void doSubOnlyStuff(final Subreddit subreddit) { findViewById(R.id.loader).setVisibility(View.GONE); if (subreddit.getSubredditType() != null) { canSubmit = !subreddit.getSubredditType().equals("RESTRICTED"); } else { canSubmit = true; } 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(); setViews(text, subreddit.getDisplayName(), sidebarBody, sidebarOverflow); //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(MainActivity.this); } for (MultiReddit r : UserSubscriptions.multireddits) { multis.put(r.getDisplayName(), r); } return null; } @Override protected void onPostExecute(Void aVoid) { new MaterialDialog.Builder(MainActivity.this).title( getString(R.string.multi_add_to, subreddit.getDisplayName())) .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( MainActivity.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 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(MainActivity.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( MainActivity.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(MainActivity.this, R.string.sub_post_notifs_err, Toast.LENGTH_SHORT).show(); } } else { Intent cancelIntent = new Intent(MainActivity.this, CancelSubNotifs.class); cancelIntent.putExtra(CancelSubNotifs.EXTRA_SUB, subreddit.getDisplayName()); startActivity(cancelIntent); } } }); } { final TextView subscribe = (TextView) findViewById(R.id.subscribe); currentlySubbed = (!Authentication.isLoggedIn && usedArray.contains( subreddit.getDisplayName().toLowerCase())) || subreddit.isUserSubscriber(); doSubscribeButtonText(currentlySubbed, subscribe); assert subscribe != null; subscribe.setOnClickListener(new View.OnClickListener() { private void doSubscribe() { if (Authentication.isLoggedIn) { new AlertDialogWrapper.Builder(MainActivity.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( MainActivity.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_LONG); 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); } }) .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_LONG); 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, true); } } private void doUnsubscribe() { if (Authentication.didOnline) { new AlertDialogWrapper.Builder(MainActivity.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( MainActivity.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_LONG); 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_LONG); 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); } } @Override public void onClick(View v) { if (!currentlySubbed) { doSubscribe(); doSubscribeButtonText(currentlySubbed, subscribe); } else { doUnsubscribe(); doSubscribeButtonText(currentlySubbed, subscribe); } } }); } 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); } ((ImageView) findViewById(R.id.subimage)).setImageResource(0); if (subreddit.getDataNode().has("icon_img") && !subreddit.getDataNode() .get("icon_img") .asText() .isEmpty()) { findViewById(R.id.subimage).setVisibility(View.VISIBLE); ((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); } Sorting sorts; public void doSubSidebar(final String subreddit) { if (mAsyncGetSubreddit != null) { mAsyncGetSubreddit.cancel(true); } findViewById(R.id.loader).setVisibility(View.VISIBLE); invalidateOptionsMenu(); if (!subreddit.equalsIgnoreCase("all") && !subreddit.equalsIgnoreCase("frontpage") && !subreddit.equalsIgnoreCase("friends") && !subreddit.equalsIgnoreCase("mod") && !subreddit.contains("+") && !subreddit.contains(".") && !subreddit.contains("/m/")) { if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, GravityCompat.END); } mAsyncGetSubreddit = new AsyncGetSubreddit(); mAsyncGetSubreddit.execute(subreddit); 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(MainActivity.this, Submit.class); if (!subreddit.contains("/m/") && canSubmit) { inte.putExtra(Submit.EXTRA_SUBREDDIT, subreddit); } MainActivity.this.startActivity(inte); } }); } dialoglayout.findViewById(R.id.wiki).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, Wiki.class); i.putExtra(Wiki.EXTRA_SUBREDDIT, subreddit); startActivity(i); } }); dialoglayout.findViewById(R.id.syncflair) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { ImageFlairs.syncFlairs(MainActivity.this, subreddit); } }); dialoglayout.findViewById(R.id.submit).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent i = new Intent(MainActivity.this, Submit.class); if ((!subreddit.contains("/m/") || !subreddit.contains(".")) && canSubmit) { i.putExtra(Submit.EXTRA_SUBREDDIT, subreddit); } 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(MainActivity.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(MainActivity.this).getThemeSubreddit(subreddit); final Context contextThemeWrapper = new ContextThemeWrapper(MainActivity.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, MainActivity.this, dialoglayout); } }); dialoglayout.findViewById(R.id.mods).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final Dialog d = new MaterialDialog.Builder(MainActivity.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, subreddit, "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(MainActivity.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(MainActivity.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(MainActivity.this, SendMessage.class); i.putExtra(SendMessage.EXTRA_NAME, "/r/" + subreddit); startActivity(i); } }) .show(); } }.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }); dialoglayout.findViewById(R.id.flair).setVisibility(View.GONE); if (Authentication.didOnline && Authentication.isLoggedIn) { if (currentFlair != null) currentFlair.cancel(true); currentFlair = 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(subreddit, null); flairs = m.getFlairChoices(subreddit, node); FlairTemplate currentF = m.getCurrentFlair(subreddit, 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(MainActivity.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( MainActivity.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( subreddit, t, flair, Authentication.name); FlairTemplate currentF = m.getCurrentFlair( subreddit); 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( subreddit, t, null, Authentication.name); FlairTemplate currentF = m.getCurrentFlair( subreddit); 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(); } }); } } }; currentFlair.execute(dialoglayout.findViewById(R.id.flair)); } } else { if (drawerLayout != null) { drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED, GravityCompat.END); } } } TimePeriod time = TimePeriod.DAY; 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); if(SettingValues.hasSort(sub)) { Sorting sortingis = SettingValues.getBaseSubmissionSort(sub); sort.setText(sortingis.name() + ((sortingis == Sorting.CONTROVERSIAL || sortingis == Sorting.TOP)?" of " + SettingValues.getBaseTimePeriod(sub).name():"")); } else { sort.setText("Set default sorting"); } reloadSubs(); } }; AlertDialogWrapper.Builder builder = new AlertDialogWrapper.Builder(MainActivity.this); builder.setTitle(R.string.sorting_choose); builder.setSingleChoiceItems(Reddit.getSortingStringsTime(getBaseContext()), Reddit.getSortingIdTime(""), l2); builder.show(); } public void doSubSidebarNoLoad(final String subreddit) { if (mAsyncGetSubreddit != null) { mAsyncGetSubreddit.cancel(true); } findViewById(R.id.loader).setVisibility(View.GONE); invalidateOptionsMenu(); if (!subreddit.equalsIgnoreCase("all") && !subreddit.equalsIgnoreCase("frontpage") && !subreddit.equalsIgnoreCase("friends") && !subreddit.equalsIgnoreCase("mod") && !subreddit.contains("+") && !subreddit.contains(".") && !subreddit.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(subreddit)); ((TextView) findViewById(R.id.sub_infotitle)).setText(subreddit); //Sidebar buttons should use subreddit's accent color int subColor = new ColorPreferences(this).getColor(subreddit); ((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) drawerLayout.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); } } } /** * Starts the enter animations for various UI components of the toolbar subreddit search * * @param ANIMATION_DURATION duration of the animation in ms * @param SUGGESTIONS_BACKGROUND background of subreddit suggestions list * @param GO_TO_SUB_FIELD search field in toolbar * @param CLOSE_BUTTON button that clears the search and closes the search UI */ public void enterAnimationsForToolbarSearch(final long ANIMATION_DURATION, final CardView SUGGESTIONS_BACKGROUND, final AutoCompleteTextView GO_TO_SUB_FIELD, final ImageView CLOSE_BUTTON) { SUGGESTIONS_BACKGROUND.animate() .translationY(headerHeight) .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(ANIMATION_DURATION + ANIMATE_DURATION_OFFSET) .start(); GO_TO_SUB_FIELD.animate() .alpha(1f) .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(ANIMATION_DURATION) .start(); CLOSE_BUTTON.animate() .alpha(1f) .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(ANIMATION_DURATION) .start(); } /** * Starts the exit animations for various UI components of the toolbar subreddit search * * @param ANIMATION_DURATION duration of the animation in ms * @param SUGGESTIONS_BACKGROUND background of subreddit suggestions list * @param GO_TO_SUB_FIELD search field in toolbar * @param CLOSE_BUTTON button that clears the search and closes the search UI */ public void exitAnimationsForToolbarSearch(final long ANIMATION_DURATION, final CardView SUGGESTIONS_BACKGROUND, final AutoCompleteTextView GO_TO_SUB_FIELD, final ImageView CLOSE_BUTTON) { SUGGESTIONS_BACKGROUND.animate() .translationY(-SUGGESTIONS_BACKGROUND.getHeight()) .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(ANIMATION_DURATION + ANIMATE_DURATION_OFFSET) .start(); GO_TO_SUB_FIELD.animate() .alpha(0f) .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(ANIMATION_DURATION) .start(); CLOSE_BUTTON.animate() .alpha(0f) .setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(ANIMATION_DURATION) .start(); //Helps smooth the transition between the toolbar title being reset and the search elements //fading out. final long OFFSET_ANIM = (ANIMATION_DURATION == 0) ? 0 : ANIMATE_DURATION_OFFSET; //Hide the various UI components after the animations are complete and //reset the toolbar title new Handler().postDelayed(new Runnable() { @Override public void run() { SUGGESTIONS_BACKGROUND.setVisibility(View.GONE); GO_TO_SUB_FIELD.setVisibility(View.GONE); CLOSE_BUTTON.setVisibility(View.GONE); if (SettingValues.single) { getSupportActionBar().setTitle(selectedSub); } else { getSupportActionBar().setTitle(tabViewModeTitle); } } }, ANIMATION_DURATION + ANIMATE_DURATION_OFFSET); } 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 currentSubredditName = usedArray.get(Reddit.currentPosition); //Title of the filter dialog String filterTitle; if (currentSubredditName.contains("/m/")) { filterTitle = getString(R.string.content_to_hide, currentSubredditName); } else { if (currentSubredditName.equals("frontpage")) { filterTitle = getString(R.string.content_to_hide, "frontpage"); } else { filterTitle = getString(R.string.content_to_hide, "/r/" + currentSubredditName); } } new AlertDialogWrapper.Builder(this).setTitle(filterTitle) .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 (adapter.getCurrentFragment() == null) { return 0; } 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; } public void openPopup() { PopupMenu popup = new PopupMenu(MainActivity.this, findViewById(R.id.anchor), Gravity.RIGHT); String id = ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id; final Spannable[] base = Reddit.getSortingSpannables(getBaseContext(), id); 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( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, Sorting.HOT); reloadSubs(); break; case 1: Reddit.setSorting( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, Sorting.NEW); reloadSubs(); break; case 2: Reddit.setSorting( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, Sorting.RISING); reloadSubs(); break; case 3: Reddit.setSorting( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, Sorting.TOP); openPopupTime(); break; case 4: Reddit.setSorting( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, Sorting.CONTROVERSIAL); openPopupTime(); break; } return true; } }); popup.show(); } public void openPopupTime() { PopupMenu popup = new PopupMenu(MainActivity.this, findViewById(R.id.anchor), Gravity.RIGHT); String id = ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id; final Spannable[] base = Reddit.getSortingSpannablesTime(getBaseContext(), id); 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( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, TimePeriod.HOUR); reloadSubs(); break; case 1: Reddit.setTime( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, TimePeriod.DAY); reloadSubs(); break; case 2: Reddit.setTime( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, TimePeriod.WEEK); reloadSubs(); break; case 3: Reddit.setTime( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, TimePeriod.MONTH); reloadSubs(); break; case 4: Reddit.setTime( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, TimePeriod.YEAR); reloadSubs(); break; case 5: Reddit.setTime( ((SubmissionsView) (((OverviewPagerAdapter) pager.getAdapter()).getCurrentFragment())).id, TimePeriod.ALL); reloadSubs(); break; } return true; } }); popup.show(); } public static String randomoverride; public void reloadSubs() { int current = pager.getCurrentItem(); if (commentPager && current == currentComment) { current = current - 1; } if (current < 0) { current = 0; } reloadItemNumber = current; if (adapter instanceof OverviewPagerAdapterComment) { pager.setAdapter(null); adapter = new OverviewPagerAdapterComment(getSupportFragmentManager()); pager.setAdapter(adapter); } else { adapter = new OverviewPagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); } reloadItemNumber = -2; shouldLoad = usedArray.get(current); pager.setCurrentItem(current); if (mTabLayout != null) { mTabLayout.setupWithViewPager(pager); scrollToTabAfterLayout(current); } if (SettingValues.single) { getSupportActionBar().setTitle(shouldLoad); } setToolbarClick(); if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) { setupSubredditSearchToolbar(); } } public void resetAdapter() { if (UserSubscriptions.hasSubs()) { runOnUiThread(new Runnable() { @Override public void run() { usedArray = new CaseInsensitiveArrayList( UserSubscriptions.getSubscriptions(MainActivity.this)); adapter = new OverviewPagerAdapter(getSupportFragmentManager()); pager.setAdapter(adapter); if (mTabLayout != null) { mTabLayout.setupWithViewPager(pager); scrollToTabAfterLayout(usedArray.indexOf(subToDo)); } setToolbarClick(); pager.setCurrentItem(usedArray.indexOf(subToDo)); int color = Palette.getColor(subToDo); hea.setBackgroundColor(color); header.setBackgroundColor(color); if (accountsArea != null) { accountsArea.setBackgroundColor(Palette.getDarkerColor(color)); } themeSystemBars(subToDo); setRecentBar(subToDo); } }); } } public void restartTheme() { isRestart = true; restartPage = getCurrentPage(); Intent intent = this.getIntent(); int page = pager.getCurrentItem(); if (currentComment == page) page -= 1; intent.putExtra(EXTRA_PAGE_TO, page); finish(); startActivity(intent); overridePendingTransition(R.anim.fade_in_real, R.anim.fading_out_real); } public void saveOffline(final List<Submission> submissions, final String subreddit) { final boolean[] chosen = new boolean[2]; new AlertDialogWrapper.Builder(this).setTitle(R.string.save_for_offline_viewing) .setMultiChoiceItems(new String[]{getString(R.string.type_gifs)}, new boolean[]{false}, 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) { caching = new CommentCacheAsync(submissions, MainActivity.this, subreddit, chosen).executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR); } }) .setPositiveButton(R.string.btn_save, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { ExecutorService service = Executors.newSingleThreadExecutor(); new CommentCacheAsync(submissions, MainActivity.this, subreddit, chosen).executeOnExecutor(service); } }) .show(); } public void scrollToTop() { int[] firstVisibleItems; int pastVisiblesItems = 0; if (((adapter.getCurrentFragment()) == null)) return; 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(0); } else { ((SubmissionsView) adapter.getCurrentFragment()).rv.smoothScrollToPosition(0); } ((SubmissionsView) adapter.getCurrentFragment()).resetScroll(); } public void setDataSet(List<String> data) { if (data != null && !data.isEmpty()) { usedArray = new CaseInsensitiveArrayList(data); if (adapter == null) { if (commentPager && singleMode) { adapter = new OverviewPagerAdapterComment(getSupportFragmentManager()); } else { adapter = new OverviewPagerAdapter(getSupportFragmentManager()); } } else { adapter.notifyDataSetChanged(); } pager.setAdapter(adapter); pager.setOffscreenPageLimit(1); if (toGoto == -1) { toGoto = 0; } if (toGoto >= usedArray.size()) { toGoto -= 1; } shouldLoad = usedArray.get(toGoto); selectedSub = (usedArray.get(toGoto)); themeSystemBars(usedArray.get(toGoto)); final String USEDARRAY_0 = usedArray.get(0); header.setBackgroundColor(Palette.getColor(USEDARRAY_0)); if (hea != null) { hea.setBackgroundColor(Palette.getColor(USEDARRAY_0)); if (accountsArea != null) { accountsArea.setBackgroundColor(Palette.getDarkerColor(USEDARRAY_0)); } } if (!SettingValues.single) { mTabLayout.setSelectedTabIndicatorColor( new ColorPreferences(MainActivity.this).getColor(USEDARRAY_0)); pager.setCurrentItem(toGoto); mTabLayout.setupWithViewPager(pager); if (mTabLayout != null) { mTabLayout.setupWithViewPager(pager); scrollToTabAfterLayout(toGoto); } } else { getSupportActionBar().setTitle(usedArray.get(toGoto)); pager.setCurrentItem(toGoto); } setToolbarClick(); setRecentBar(usedArray.get(toGoto)); doSubSidebarNoLoad(usedArray.get(toGoto)); } else if (NetworkUtil.isConnected(this)) { UserSubscriptions.doMainActivitySubs(this); } } public void setDrawerSubList() { ArrayList<String> copy; if (NetworkUtil.isConnected(this)) { copy = new ArrayList<>(usedArray); } else { copy = UserSubscriptions.getAllUserSubreddits(this); } copy.removeAll(Arrays.asList("", null)); sideArrayAdapter = new SideArrayAdapter(this, copy, UserSubscriptions.getAllSubreddits(this), drawerSubList); drawerSubList.setAdapter(sideArrayAdapter); if ((SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_DRAWER || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH || SettingValues.subredditSearchMethod != Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR)) { drawerSearch = ((EditText) headerMain.findViewById(R.id.sort)); drawerSearch.setVisibility(View.VISIBLE); drawerSubList.setFocusable(false); headerMain.findViewById(R.id.close_search_drawer) .setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { drawerSearch.setText(""); } }); drawerSearch.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (hasFocus) { getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN); drawerSubList.smoothScrollToPositionFromTop(1, drawerSearch.getHeight(), 100); } else { getWindow().setSoftInputMode( WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE); } } }); drawerSearch.setOnEditorActionListener(new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) { if (arg1 == EditorInfo.IME_ACTION_SEARCH) { //If it the input text doesn't match a subreddit from the list exactly, openInSubView is true if (sideArrayAdapter.fitems == null || sideArrayAdapter.openInSubView || !usedArray.contains( drawerSearch.getText().toString().toLowerCase())) { Intent inte = new Intent(MainActivity.this, SubredditView.class); inte.putExtra(SubredditView.EXTRA_SUBREDDIT, drawerSearch.getText().toString()); MainActivity.this.startActivityForResult(inte, 2001); } else { if (commentPager && adapter instanceof OverviewPagerAdapterComment) { openingComments = null; toOpenComments = -1; ((MainActivity.OverviewPagerAdapterComment) adapter).size = (usedArray.size() + 1); adapter.notifyDataSetChanged(); if (usedArray.contains( drawerSearch.getText().toString().toLowerCase())) { doPageSelectedComments(usedArray.indexOf( drawerSearch.getText().toString().toLowerCase())); } else { doPageSelectedComments( usedArray.indexOf(sideArrayAdapter.fitems.get(0))); } } if (usedArray.contains( drawerSearch.getText().toString().toLowerCase())) { pager.setCurrentItem(usedArray.indexOf( drawerSearch.getText().toString().toLowerCase())); } else { pager.setCurrentItem( usedArray.indexOf(sideArrayAdapter.fitems.get(0))); } drawerLayout.closeDrawers(); drawerSearch.setText(""); View view = MainActivity.this.getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } } } return false; } }); final View close = findViewById(R.id.close_search_drawer); close.setVisibility(View.GONE); drawerSearch.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { final String result = editable.toString(); if (result.isEmpty()) { close.setVisibility(View.GONE); } else { close.setVisibility(View.VISIBLE); } sideArrayAdapter.getFilter().filter(result); } }); } else { if (drawerSearch != null) { drawerSearch.setOnClickListener( null); //remove the touch listener on the drawer search field drawerSearch.setVisibility(View.GONE); } } } public void setToolbarClick() { if (mTabLayout != null) { mTabLayout.setOnTabSelectedListener( new TabLayout.ViewPagerOnTabSelectedListener(pager) { @Override public void onTabReselected(TabLayout.Tab tab) { super.onTabReselected(tab); scrollToTop(); } }); } else { LogUtil.v("notnull"); mToolbar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { scrollToTop(); } }); } } public void updateColor(int color, String subreddit) { hea.setBackgroundColor(color); header.setBackgroundColor(color); if (accountsArea != null) { accountsArea.setBackgroundColor(Palette.getDarkerColor(color)); } if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { Window window = getWindow(); window.setStatusBarColor(Palette.getDarkerColor(color)); } setRecentBar(subreddit, color); findViewById(R.id.header_sub).setBackgroundColor(color); } public void updateMultiNameToSubs(Map<String, String> subs) { multiNameToSubsMap = subs; } public void updateSubs(ArrayList<String> subs) { if (subs.isEmpty() && !NetworkUtil.isConnected(this)) { findViewById(R.id.toolbar).setVisibility(View.GONE); d = new MaterialDialog.Builder(MainActivity.this).title( R.string.offline_no_content_found) .positiveText(R.string.offline_enter_online) .negativeText(R.string.btn_close) .cancelable(false) .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { finish(); } }) .onPositive(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { Reddit.appRestart.edit().remove("forceoffline").commit(); Reddit.forceRestart(MainActivity.this); } }) .show(); } else { drawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout); if (!getResources().getBoolean(R.bool.isTablet)) { setDrawerEdge(this, Constants.DRAWER_SWIPE_EDGE, drawerLayout); } else { setDrawerEdge(this, Constants.DRAWER_SWIPE_EDGE_TABLET, drawerLayout); } if (loader != null) { header.setVisibility(View.VISIBLE); setDataSet(subs); doDrawer(); try { setDataSet(subs); } catch (Exception ignored) { } loader.finish(); loader = null; } else { setDataSet(subs); doDrawer(); } } if (NetworkUtil.isConnected(MainActivity.this)) { if (Authentication.isLoggedIn && android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ArrayList<ShortcutInfo> shortcuts = new ArrayList<>(); shortcuts.add(new ShortcutInfo.Builder(this, "inbox").setShortLabel("Inbox") .setLongLabel("Open your Inbox") .setIcon(getIcon("inbox", R.drawable.sidebar_inbox)) .setIntent(new Intent(Intent.ACTION_VIEW, new Uri.Builder().build(), this, Inbox.class)) .build()); shortcuts.add(new ShortcutInfo.Builder(this, "submit").setShortLabel("Submit") .setLongLabel("Create new Submission") .setIcon(getIcon("submit", R.drawable.edit)) .setIntent(new Intent(Intent.ACTION_VIEW, new Uri.Builder().build(), this, Submit.class)) .build()); int count = 0; for (String s : subs) { if (count == 2 || count == subs.size()) { break; } if (!s.contains("/m/")) { Intent sub = new Intent(Intent.ACTION_VIEW, new Uri.Builder().build(), this, SubredditView.class); sub.putExtra(SubredditView.EXTRA_SUBREDDIT, s); shortcuts.add(new ShortcutInfo.Builder(this, "sub" + s).setShortLabel( (s.equalsIgnoreCase("frontpage") ? "" : "/r/") + s) .setLongLabel((s.equalsIgnoreCase("frontpage") ? "" : "/r/") + s) .setIcon(getIcon(s, R.drawable.sub)) .setIntent(sub) .build()); count++; } } Collections.reverse(shortcuts); shortcutManager.setDynamicShortcuts(shortcuts); } else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) { ShortcutManager shortcutManager = getSystemService(ShortcutManager.class); ArrayList<ShortcutInfo> shortcuts = new ArrayList<>(); int count = 0; for (String s : subs) { if (count == 4 || count == subs.size()) { break; } if (!s.contains("/m/")) { Intent sub = new Intent(Intent.ACTION_VIEW, new Uri.Builder().build(), this, SubredditView.class); sub.putExtra(SubredditView.EXTRA_SUBREDDIT, s); new ShortcutInfo.Builder(this, "sub" + s).setShortLabel( (s.equalsIgnoreCase("frontpage") ? "" : "/r/") + s) .setLongLabel((s.equalsIgnoreCase("frontpage") ? "" : "/r/") + s) .setIcon(getIcon(s, R.drawable.sub)) .setIntent(sub) .build(); count++; } } Collections.reverse(shortcuts); shortcutManager.setDynamicShortcuts(shortcuts); } } } private Icon getIcon(String subreddit, @DrawableRes int overlay) { Bitmap color = Bitmap.createBitmap(toDp(this, 148), toDp(this, 148), Bitmap.Config.RGB_565); color.eraseColor(Palette.getColor(subreddit)); color = clipToCircle(color); Bitmap over = drawableToBitmap(ResourcesCompat.getDrawable(getResources(), overlay, null)); Canvas canvas = new Canvas(color); canvas.drawBitmap(over, color.getWidth() / 2 - (over.getWidth() / 2), color.getHeight() / 2 - (over.getHeight() / 2), null); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { return Icon.createWithBitmap(color); } return null; } public static Bitmap drawableToBitmap(Drawable drawable) { if (drawable instanceof BitmapDrawable) { return ((BitmapDrawable) drawable).getBitmap(); } Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); drawable.draw(canvas); return bitmap; } public static int toDp(Context context, int px) { return convert(context, px, TypedValue.COMPLEX_UNIT_PX); } private static int convert(Context context, int amount, int conversionUnit) { if (amount < 0) { throw new IllegalArgumentException("px should not be less than zero"); } Resources r = context.getResources(); return (int) TypedValue.applyDimension(conversionUnit, amount, r.getDisplayMetrics()); } public static Bitmap clipToCircle(Bitmap bitmap) { if (bitmap == null) { return null; } final int width = bitmap.getWidth(); final int height = bitmap.getHeight(); final Bitmap outputBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888); final Path path = new Path(); path.addCircle((float) (width / 2), (float) (height / 2), (float) Math.min(width, (height / 2)), Path.Direction.CCW); final Canvas canvas = new Canvas(outputBitmap); canvas.clipPath(path); canvas.drawBitmap(bitmap, 0, 0, null); return outputBitmap; } private static ValueAnimator flipAnimator(boolean isFlipped, final View v) { ValueAnimator animator = ValueAnimator.ofFloat(isFlipped ? -1f : 1f, isFlipped ? 1f : -1f); animator.setInterpolator(new FastOutSlowInInterpolator()); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { //Update Height v.setScaleY((Float) valueAnimator.getAnimatedValue()); } }); return animator; } private void changeSubscription(Subreddit subreddit, boolean isChecked) { currentlySubbed = isChecked; if (isChecked) { UserSubscriptions.addSubreddit(subreddit.getDisplayName().toLowerCase(), MainActivity.this); } else { UserSubscriptions.removeSubreddit(subreddit.getDisplayName().toLowerCase(), MainActivity.this); pager.setCurrentItem(pager.getCurrentItem() - 1); restartTheme(); } } private void collapse(final LinearLayout v) { int finalHeight = v.getHeight(); ValueAnimator mAnimator = slideAnimator(finalHeight, 0, v); mAnimator.addListener(new Animator.AnimatorListener() { @Override public void onAnimationStart(Animator animation) { } @Override public void onAnimationEnd(Animator animator) { v.setVisibility(View.GONE); } @Override public void onAnimationCancel(Animator animation) { } @Override public void onAnimationRepeat(Animator animation) { } }); mAnimator.start(); } private void dismissProgressDialog() { if (d != null && d.isShowing()) { d.dismiss(); } } 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 expand(LinearLayout v) { //set Visible v.setVisibility(View.VISIBLE); final int widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); final int heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED); v.measure(widthSpec, heightSpec); ValueAnimator mAnimator = slideAnimator(0, v.getMeasuredHeight(), v); mAnimator.start(); } private void scrollToTabAfterLayout(final int tabIndex) { //from http://stackoverflow.com/a/34780589/3697225 if (mTabLayout != null) { final ViewTreeObserver observer = mTabLayout.getViewTreeObserver(); if (observer.isAlive()) { observer.dispatchOnGlobalLayout(); // In case a previous call is waiting when this call is made observer.addOnGlobalLayoutListener(new ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { mTabLayout.getViewTreeObserver().removeGlobalOnLayoutListener(this); mTabLayout.getTabAt(tabIndex).select(); } }); } } } private void setViews(String rawHTML, String subredditName, 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), subredditName); firstTextView.setLinkTextColor(new ColorPreferences(this).getColor(subredditName)); startIndex = 1; } else { firstTextView.setText(""); firstTextView.setVisibility(View.GONE); } if (blocks.size() > 1) { if (startIndex == 0) { commentOverflow.setViews(blocks, subredditName); } else { commentOverflow.setViews(blocks.subList(startIndex, blocks.size()), subredditName); } 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(); } } /** * If the user has the Subreddit Search method set to "long press on toolbar title", an * OnLongClickListener needs to be set for the toolbar as well as handling all of the relevant * onClicks for the views of the search bar. */ private void setupSubredditSearchToolbar() { if (!NetworkUtil.isConnected(this)) { findViewById(R.id.drawer_divider).setVisibility(View.GONE); } else { if ((SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) && usedArray != null && !usedArray.isEmpty()) { if (findViewById(R.id.drawer_divider) != null) { if (SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) { findViewById(R.id.drawer_divider).setVisibility(View.GONE); } else { findViewById(R.id.drawer_divider).setVisibility(View.VISIBLE); } } final ListView TOOLBAR_SEARCH_SUGGEST_LIST = (ListView) findViewById(R.id.toolbar_search_suggestions_list); final ArrayList<String> subs_copy = new ArrayList<>(usedArray); final SideArrayAdapter TOOLBAR_SEARCH_SUGGEST_ADAPTER = new SideArrayAdapter(this, subs_copy, UserSubscriptions.getAllSubreddits(this), TOOLBAR_SEARCH_SUGGEST_LIST); if (TOOLBAR_SEARCH_SUGGEST_LIST != null) { TOOLBAR_SEARCH_SUGGEST_LIST.setAdapter(TOOLBAR_SEARCH_SUGGEST_ADAPTER); } if (mToolbar != null) { mToolbar.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { final AutoCompleteTextView GO_TO_SUB_FIELD = (AutoCompleteTextView) findViewById(R.id.toolbar_search); final ImageView CLOSE_BUTTON = (ImageView) findViewById(R.id.close_search_toolbar); final CardView SUGGESTIONS_BACKGROUND = (CardView) findViewById(R.id.toolbar_search_suggestions); //if the view mode is set to Subreddit Tabs, save the title ("Slide" or "Slide (debug)") tabViewModeTitle = (!SettingValues.single) ? getSupportActionBar().getTitle() .toString() : null; getSupportActionBar().setTitle( ""); //clear title to make room for search field if (GO_TO_SUB_FIELD != null && CLOSE_BUTTON != null && SUGGESTIONS_BACKGROUND != null) { GO_TO_SUB_FIELD.setVisibility(View.VISIBLE); CLOSE_BUTTON.setVisibility(View.VISIBLE); SUGGESTIONS_BACKGROUND.setVisibility(View.VISIBLE); //run enter animations enterAnimationsForToolbarSearch(ANIMATE_DURATION, SUGGESTIONS_BACKGROUND, GO_TO_SUB_FIELD, CLOSE_BUTTON); //Get focus of the search field and show the keyboard GO_TO_SUB_FIELD.requestFocus(); InputMethodManager imm = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE); imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY); //Close the search UI and keyboard when clicking the close button CLOSE_BUTTON.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { final View view = MainActivity.this.getCurrentFocus(); if (view != null) { //Hide the keyboard InputMethodManager imm = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } //run the exit animations exitAnimationsForToolbarSearch(ANIMATE_DURATION, SUGGESTIONS_BACKGROUND, GO_TO_SUB_FIELD, CLOSE_BUTTON); //clear sub text when close button is clicked GO_TO_SUB_FIELD.setText(""); } }); GO_TO_SUB_FIELD.setOnEditorActionListener( new TextView.OnEditorActionListener() { @Override public boolean onEditorAction(TextView arg0, int arg1, KeyEvent arg2) { if (arg1 == EditorInfo.IME_ACTION_SEARCH) { //If it the input text doesn't match a subreddit from the list exactly, openInSubView is true if (sideArrayAdapter.fitems == null || sideArrayAdapter.openInSubView || !usedArray.contains( GO_TO_SUB_FIELD.getText() .toString() .toLowerCase())) { Intent intent = new Intent(MainActivity.this, SubredditView.class); intent.putExtra( SubredditView.EXTRA_SUBREDDIT, GO_TO_SUB_FIELD.getText() .toString()); MainActivity.this.startActivityForResult( intent, 2002); } else { if (commentPager && adapter instanceof OverviewPagerAdapterComment) { openingComments = null; toOpenComments = -1; ((OverviewPagerAdapterComment) adapter).size = (usedArray.size() + 1); adapter.notifyDataSetChanged(); if (usedArray.contains( GO_TO_SUB_FIELD.getText() .toString() .toLowerCase())) { doPageSelectedComments( usedArray.indexOf( GO_TO_SUB_FIELD.getText() .toString() .toLowerCase())); } else { doPageSelectedComments( usedArray.indexOf( sideArrayAdapter.fitems .get(0))); } } if (usedArray.contains( GO_TO_SUB_FIELD.getText() .toString() .toLowerCase())) { pager.setCurrentItem(usedArray.indexOf( GO_TO_SUB_FIELD.getText() .toString() .toLowerCase())); } else { pager.setCurrentItem(usedArray.indexOf( sideArrayAdapter.fitems.get( 0))); } } View view = MainActivity.this.getCurrentFocus(); if (view != null) { //Hide the keyboard InputMethodManager imm = (InputMethodManager) getSystemService( Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow( view.getWindowToken(), 0); } SUGGESTIONS_BACKGROUND.setVisibility(View.GONE); GO_TO_SUB_FIELD.setVisibility(View.GONE); CLOSE_BUTTON.setVisibility(View.GONE); if (SettingValues.single) { getSupportActionBar().setTitle(selectedSub); } else { //Set the title back to "Slide" or "Slide (debug)" getSupportActionBar().setTitle( tabViewModeTitle); } } return false; } }); GO_TO_SUB_FIELD.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i2, int i3) { } @Override public void afterTextChanged(Editable editable) { final String RESULT = GO_TO_SUB_FIELD.getText() .toString() .replaceAll(" ", ""); TOOLBAR_SEARCH_SUGGEST_ADAPTER.getFilter().filter(RESULT); } }); } return true; } }); } } } } private ValueAnimator slideAnimator(int start, int end, final View v) { ValueAnimator animator = ValueAnimator.ofInt(start, end); animator.setInterpolator(new FastOutSlowInInterpolator()); animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator valueAnimator) { //Update Height int value = (Integer) valueAnimator.getAnimatedValue(); ViewGroup.LayoutParams layoutParams = v.getLayoutParams(); layoutParams.height = value; v.setLayoutParams(layoutParams); } }); return animator; } /*Todo once API allows for getting the websocket URL public class AsyncStartNotifSocket extends AsyncTask<Void, Void, Void>{ @Override protected Void doInBackground(Void... params) { try { String access = Authentication.authentication.getString("websocket_url", ""); LogUtil.v(access); com.neovisionaries.ws.client.WebSocket ws = new WebSocketFactory().createSocket(access); ws.addListener(new WebSocketListener() { @Override public void onStateChanged(com.neovisionaries.ws.client.WebSocket websocket, WebSocketState newState) throws Exception { } @Override public void onConnected(com.neovisionaries.ws.client.WebSocket websocket, Map<String, List<String>> headers) throws Exception { } @Override public void onConnectError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause) throws Exception { } @Override public void onDisconnected(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame serverCloseFrame, WebSocketFrame clientCloseFrame, boolean closedByServer) throws Exception { } @Override public void onFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onContinuationFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onTextFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onBinaryFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onCloseFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onPingFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onPongFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onTextMessage(com.neovisionaries.ws.client.WebSocket websocket, String s) throws Exception { LogUtil.v("Recieved" + s); } @Override public void onBinaryMessage(com.neovisionaries.ws.client.WebSocket websocket, byte[] binary) throws Exception { } @Override public void onSendingFrame(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onFrameSent(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onFrameUnsent(com.neovisionaries.ws.client.WebSocket websocket, WebSocketFrame frame) throws Exception { } @Override public void onError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause) throws Exception { } @Override public void onFrameError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause, WebSocketFrame frame) throws Exception { } @Override public void onMessageError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause, List<WebSocketFrame> frames) throws Exception { } @Override public void onMessageDecompressionError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause, byte[] compressed) throws Exception { } @Override public void onTextMessageError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause, byte[] data) throws Exception { } @Override public void onSendError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause, WebSocketFrame frame) throws Exception { } @Override public void onUnexpectedError(com.neovisionaries.ws.client.WebSocket websocket, WebSocketException cause) throws Exception { } @Override public void handleCallbackError(com.neovisionaries.ws.client.WebSocket websocket, Throwable cause) throws Exception { } @Override public void onSendingHandshake(com.neovisionaries.ws.client.WebSocket websocket, String requestLine, List<String[]> headers) throws Exception { } }); ws.connect(); } catch (IOException e) { e.printStackTrace(); } catch (WebSocketException e) { e.printStackTrace(); } return null; } }*/ public class AsyncGetSubreddit extends AsyncTask<String, Void, Subreddit> { @Override public void onPostExecute(Subreddit subreddit) { if (subreddit != null) doSubOnlyStuff(subreddit); } @Override protected Subreddit doInBackground(String... params) { try { return Authentication.reddit.getSubreddit(params[0]); } catch (Exception e) { return null; } } } public class AsyncNotificationBadge extends AsyncTask<Void, Void, Void> { int count; boolean restart; int modCount; @Override protected Void doInBackground(Void... params) { try { LoggedInAccount me; if (Authentication.me == null) { Authentication.me = Authentication.reddit.me(); me = Authentication.me; if (Authentication.name.equalsIgnoreCase("loggedout")) { Authentication.name = me.getFullName(); Reddit.appRestart.edit().putString("name", Authentication.name).apply(); restart = true; return null; } Authentication.mod = me.isMod(); Reddit.over18 = 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(MainActivity.this); Reddit.notifications.start(getApplicationContext()); } if (Reddit.cachedData.contains("toCache")) { Reddit.autoCache = new AutoCacheScheduler(MainActivity.this); Reddit.autoCache.start(getApplicationContext()); } final String name = me.getFullName(); Authentication.name = name; LogUtil.v("AUTHENTICATED"); 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) .commit(); //force commit } Authentication.isLoggedIn = true; Reddit.notFirst = true; } } else { me = Authentication.reddit.me(); } count = me.getInboxCount(); //Force reload of the LoggedInAccount object UserSubscriptions.doFriendsOfMain(MainActivity.this); } catch (Exception e) { Log.w(LogUtil.getTag(), "Cannot fetch inbox count"); count = -1; } return null; } @Override protected void onPostExecute(Void aVoid) { if (restart) { restartTheme(); return; } if (Authentication.mod && Authentication.didOnline) { RelativeLayout mod = (RelativeLayout) headerMain.findViewById(R.id.mod); mod.setVisibility(View.VISIBLE); mod.setOnClickListener(new OnSingleClickListener() { @Override public void onSingleClick(View view) { if (modOf != null && !modOf.isEmpty()) { Intent inte = new Intent(MainActivity.this, ModQueue.class); MainActivity.this.startActivity(inte); } } }); } if (count != -1) { int oldCount = Reddit.appRestart.getInt("inbox", 0); if (count > oldCount) { final Snackbar s = Snackbar.make(mToolbar, getResources().getQuantityString(R.plurals.new_messages, count - oldCount, count - oldCount), Snackbar.LENGTH_LONG) .setAction(R.string.btn_view, new OnSingleClickListener() { @Override public void onSingleClick(View v) { Intent i = new Intent(MainActivity.this, Inbox.class); i.putExtra(Inbox.EXTRA_UNREAD, true); startActivity(i); } }); View view = s.getView(); TextView tv = (TextView) view.findViewById(android.support.design.R.id.snackbar_text); tv.setTextColor(Color.WHITE); s.show(); } Reddit.appRestart.edit().putInt("inbox", count).apply(); } View badge = headerMain.findViewById(R.id.count); if (count == 0) { if (badge != null) { badge.setVisibility(View.GONE); } NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(0); } else if (count != -1) { if (badge != null) { badge.setVisibility(View.VISIBLE); } ((TextView) headerMain.findViewById(R.id.count)).setText( String.format(Locale.getDefault(), "%d", count)); } /* Todo possibly View modBadge = headerMain.findViewById(R.id.count_mod); if (modCount == 0) { if (modBadge != null) modBadge.setVisibility(View.GONE); } else if (modCount != -1) { if (modBadge != null) modBadge.setVisibility(View.VISIBLE); ((TextView) headerMain.findViewById(R.id.count)).setText(String.format(Locale.getDefault(), "%d", count)); }*/ } } public class OverviewPagerAdapter extends FragmentStatePagerAdapter { protected SubmissionsView mCurrentFragment; public OverviewPagerAdapter(FragmentManager fm) { super(fm); pager.clearOnPageChangeListeners(); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (positionOffset == 0) { header.animate() .translationY(0) .setInterpolator(new LinearInterpolator()) .setDuration(180); doSubSidebarNoLoad(usedArray.get(position)); } } @Override public void onPageSelected(final int position) { Reddit.currentPosition = position; selectedSub = usedArray.get(position); SubmissionsView page = (SubmissionsView) adapter.getCurrentFragment(); if (hea != null) { hea.setBackgroundColor(Palette.getColor(selectedSub)); if (accountsArea != null) { accountsArea.setBackgroundColor(Palette.getDarkerColor(selectedSub)); } } int colorFrom = ((ColorDrawable) header.getBackground()).getColor(); int colorTo = Palette.getColor(selectedSub); ValueAnimator colorAnimation = ValueAnimator.ofObject(new ArgbEvaluator(), colorFrom, colorTo); colorAnimation.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animator) { int color = (int) animator.getAnimatedValue(); header.setBackgroundColor(color); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { getWindow().setStatusBarColor(Palette.getDarkerColor(color)); if (SettingValues.colorNavBar) { getWindow().setNavigationBarColor( Palette.getDarkerColor(color)); } } } }); colorAnimation.setInterpolator(new AccelerateDecelerateInterpolator()); colorAnimation.setDuration(200); colorAnimation.start(); setRecentBar(selectedSub); if (SettingValues.single || mTabLayout == null) { //Smooth out the fading animation for the toolbar subreddit search UI if ((SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_TOOLBAR || SettingValues.subredditSearchMethod == Constants.SUBREDDIT_SEARCH_METHOD_BOTH) && findViewById(R.id.toolbar_search).getVisibility() == View.VISIBLE) { new Handler().postDelayed(new Runnable() { @Override public void run() { getSupportActionBar().setTitle(selectedSub); } }, ANIMATE_DURATION + ANIMATE_DURATION_OFFSET); } else { getSupportActionBar().setTitle(selectedSub); } } else { mTabLayout.setSelectedTabIndicatorColor( new ColorPreferences(MainActivity.this).getColor(selectedSub)); } if (page != null && page.adapter != null) { SubredditPosts p = page.adapter.dataSet; if (p.offline && !isRestart) { p.doMainActivityOffline(MainActivity.this, p.displayer); } } } @Override public void onPageScrollStateChanged(int state) { } }); if (pager.getAdapter() != null) { pager.getAdapter().notifyDataSetChanged(); pager.setCurrentItem(1); pager.setCurrentItem(0); } } @Override public int getCount() { if (usedArray == null) { return 1; } else { return usedArray.size(); } } @Override public Fragment getItem(int i) { SubmissionsView f = new SubmissionsView(); Bundle args = new Bundle(); String name; if (multiNameToSubsMap.containsKey(usedArray.get(i))) { name = multiNameToSubsMap.get(usedArray.get(i)); } else { name = usedArray.get(i); } args.putString("id", name); f.setArguments(args); return f; } @Override public void setPrimaryItem(ViewGroup container, int position, Object object) { if (reloadItemNumber == position || reloadItemNumber < 0) { super.setPrimaryItem(container, position, object); if (usedArray.size() >= position) doSetPrimary(object, position); } else { shouldLoad = usedArray.get(reloadItemNumber); if (multiNameToSubsMap.containsKey(usedArray.get(reloadItemNumber))) { shouldLoad = multiNameToSubsMap.get(usedArray.get(reloadItemNumber)); } else { shouldLoad = usedArray.get(reloadItemNumber); } } } @Override public Parcelable saveState() { return null; } public void doSetPrimary(Object object, int position) { if (object != null && getCurrentFragment() != object && position != toOpenComments && object instanceof SubmissionsView) { shouldLoad = usedArray.get(position); if (multiNameToSubsMap.containsKey(usedArray.get(position))) { shouldLoad = multiNameToSubsMap.get(usedArray.get(position)); } else { shouldLoad = usedArray.get(position); } mCurrentFragment = ((SubmissionsView) object); if (mCurrentFragment.posts == null && mCurrentFragment.isAdded()) { mCurrentFragment.doAdapter(); } } } public Fragment getCurrentFragment() { return mCurrentFragment; } @Override public CharSequence getPageTitle(int position) { if (usedArray != null) { return abbreviate(usedArray.get(position), 25); } else { return ""; } } } public class OverviewPagerAdapterComment extends OverviewPagerAdapter { public int size = usedArray.size(); public Fragment storedFragment; private CommentPage mCurrentComments; public OverviewPagerAdapterComment(FragmentManager fm) { super(fm); pager.clearOnPageChangeListeners(); pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (positionOffset == 0) { if (position != toOpenComments) { pager.setSwipeLeftOnly(true); header.setBackgroundColor(Palette.getColor(usedArray.get(position))); doPageSelectedComments(position); if (position == toOpenComments - 1 && adapter != null && adapter.getCurrentFragment() != null) { SubmissionsView page = (SubmissionsView) adapter.getCurrentFragment(); if (page != null && page.adapter != null) { page.adapter.refreshView(); } } } else { if (mAsyncGetSubreddit != null) { mAsyncGetSubreddit.cancel(true); } if (header.getTranslationY() == 0) { header.animate() .translationY(-header.getHeight() * 1.5f) .setInterpolator(new LinearInterpolator()) .setDuration(180); } pager.setSwipeLeftOnly(true); themeSystemBars(openingComments.getSubredditName().toLowerCase()); setRecentBar(openingComments.getSubredditName().toLowerCase()); } } } @Override public void onPageSelected(final int position) { if (position == toOpenComments - 1 && adapter != null && adapter.getCurrentFragment() != null) { SubmissionsView page = (SubmissionsView) adapter.getCurrentFragment(); if (page != null && page.adapter != null) { page.adapter.refreshView(); SubredditPosts p = page.adapter.dataSet; if (p.offline && !isRestart) { p.doMainActivityOffline(MainActivity.this, p.displayer); } } } else { SubmissionsView page = (SubmissionsView) adapter.getCurrentFragment(); if (page != null && page.adapter != null) { SubredditPosts p = page.adapter.dataSet; if (p.offline && !isRestart) { p.doMainActivityOffline(MainActivity.this, p.displayer); } } } } @Override public void onPageScrollStateChanged(int state) { } }); notifyDataSetChanged(); } @Override public int getCount() { if (usedArray == null) { return 1; } else { return size; } } @Override public Fragment getItem(int i) { if (openingComments == null || i != toOpenComments) { SubmissionsView f = new SubmissionsView(); Bundle args = new Bundle(); if (usedArray.size() > i) { if (multiNameToSubsMap.containsKey(usedArray.get(i))) { //if (usedArray.get(i).co args.putString("id", multiNameToSubsMap.get(usedArray.get(i))); } else { args.putString("id", usedArray.get(i)); } } 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", subToDo); f.setArguments(args); return f; } } @Override public Parcelable saveState() { return null; } @Override public void doSetPrimary(Object object, int position) { if (position != toOpenComments) { if (multiNameToSubsMap.containsKey(usedArray.get(position))) { shouldLoad = multiNameToSubsMap.get(usedArray.get(position)); } else { shouldLoad = usedArray.get(position); } if (getCurrentFragment() != object) { mCurrentFragment = ((SubmissionsView) object); if (mCurrentFragment != null && mCurrentFragment.posts == null && mCurrentFragment.isAdded()) { mCurrentFragment.doAdapter(); } } } else if (object instanceof CommentPage) { mCurrentComments = (CommentPage) object; } } public Fragment getCurrentFragment() { return mCurrentFragment; } @Override public int getItemPosition(Object object) { if (object != storedFragment) return POSITION_NONE; return POSITION_UNCHANGED; } @Override public CharSequence getPageTitle(int position) { if (usedArray != null && position != toOpenComments) { return abbreviate(usedArray.get(position), 25); } else { return ""; } } } }