/** * ******************************************************************************* * Copyright 2015 Tom Praschan * <p/> * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * <p/> * http://www.apache.org/licenses/LICENSE-2.0 * <p/> * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ****************************************************************************** */ package de.tap.easy_xkcd.Activities; import android.app.ProgressDialog; import android.app.SearchManager; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.pm.PackageManager; import android.content.res.Configuration; import android.content.res.Resources; import android.net.Uri; import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; import android.support.design.widget.FloatingActionButton; import android.support.design.widget.NavigationView; import android.support.v4.app.FragmentTransaction; import android.support.v4.content.ContextCompat; import android.support.v4.view.GravityCompat; import android.support.v4.view.MenuItemCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.app.AlertDialog; import android.support.v7.widget.Toolbar; import android.util.Log; import android.util.TypedValue; import android.view.Menu; import android.view.MenuItem; import android.view.View; import android.view.animation.AccelerateInterpolator; import android.view.inputmethod.InputMethodManager; import android.widget.SearchView; import android.widget.Toast; import com.commonsware.cwac.wakeful.WakefulIntentService; import com.nbsp.materialfilepicker.ui.FilePickerActivity; import com.tap.xkcd_reader.R; import java.util.Random; import butterknife.Bind; import butterknife.ButterKnife; import butterknife.OnClick; import butterknife.OnLongClick; import de.tap.easy_xkcd.CustomTabHelpers.CustomTabActivityHelper; import de.tap.easy_xkcd.database.DatabaseManager; import de.tap.easy_xkcd.fragments.comics.ComicBrowserFragment; import de.tap.easy_xkcd.fragments.comics.ComicFragment; import de.tap.easy_xkcd.fragments.comics.FavoritesFragment; import de.tap.easy_xkcd.fragments.comics.OfflineFragment; import de.tap.easy_xkcd.fragments.overview.OverviewBaseFragment; import de.tap.easy_xkcd.fragments.overview.OverviewCardsFragment; import de.tap.easy_xkcd.fragments.overview.OverviewListFragment; import de.tap.easy_xkcd.fragments.overview.OverviewStaggeredGridFragment; import de.tap.easy_xkcd.fragments.whatIf.WhatIfFragment; import de.tap.easy_xkcd.fragments.whatIf.WhatIfOverviewFragment; import de.tap.easy_xkcd.notifications.ComicListener; import de.tap.easy_xkcd.utils.PrefHelper; import de.tap.easy_xkcd.utils.ThemePrefs; public class MainActivity extends BaseActivity { @Bind(R.id.fab) FloatingActionButton mFab; @Bind(R.id.nvView) NavigationView mNavView; @Bind(R.id.drawer_layout) DrawerLayout mDrawer; @Bind(R.id.toolbar) Toolbar toolbar; public static boolean fullOffline = false; public static boolean fullOfflineWhatIf = false; public static boolean fromSearch = false; public static boolean overviewLaunch; public ActionBarDrawerToggle drawerToggle; private MenuItem searchMenuItem; private CustomTabActivityHelper customTabActivityHelper; private int currentFragment; private ProgressDialog progress; private DatabaseManager databaseManager; private static final String COMIC_INTENT = "de.tap.easy_xkcd.ACTION_COMIC"; private static final String WHATIF_INTENT = "de.tap.easy_xkcd.ACTION_WHAT_IF"; private static final String SAVED_INSTANCE_CURRENT_FRAGMENT = "CurrentFragment"; private static final String BROWSER_TAG = "browser"; private static final String FAV_TAG = "favorites"; private static final String WHATIF_TAG = "whatif"; private static final String OVERVIEW_TAG = "overview"; public static final int UPDATE_ALARM = 2; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ButterKnife.bind(this); PreferenceManager.setDefaultValues(this, R.xml.pref_alt_sharing, false); customTabActivityHelper = new CustomTabActivityHelper(); databaseManager = new DatabaseManager(this); databaseManager.moveFavorites(this); if (savedInstanceState == null) { //Setup the notifications in case the device was restarted if (prefHelper.getNotificationInterval() != 0) WakefulIntentService.scheduleAlarms(new ComicListener(), this, true); else WakefulIntentService.cancelAlarms(this); } fullOffline = prefHelper.fullOfflineEnabled(); fullOfflineWhatIf = prefHelper.fullOfflineWhatIf(); boolean whatIfIntent = false; //Check for intents switch (getIntent().getAction()) { case Intent.ACTION_VIEW: if (getIntent().getDataString().contains("what")) { WhatIfActivity.WhatIfIndex = (getNumberFromUrl(getIntent().getDataString(), 1)); prefHelper.setLastWhatIf(WhatIfActivity.WhatIfIndex); whatIfIntent = true; WhatIfFragment.newIntent = true; } else prefHelper.setLastComic(getNumberFromUrl(getIntent().getDataString(), prefHelper.getLastComic())); break; case COMIC_INTENT: int number = getIntent().getIntExtra("number", 0); prefHelper.setLastComic(number); break; case WHATIF_INTENT: WhatIfActivity.WhatIfIndex = getIntent().getIntExtra("number", 0); prefHelper.setLastWhatIf(WhatIfActivity.WhatIfIndex); whatIfIntent = true; WhatIfFragment.newIntent = true; break; } setupToolbar(toolbar); if (savedInstanceState == null && !SearchResultsActivity.isOpen) toolbar.setAlpha(0); mDrawer.addDrawerListener(drawerToggle); mDrawer.setStatusBarBackgroundColor(themePrefs.getPrimaryDarkColor()); drawerToggle = setupDrawerToggle(); if (themePrefs.nightThemeEnabled()) { mNavView.setBackgroundColor(ContextCompat.getColor(this, R.color.background_material_dark)); toolbar.setPopupTheme(R.style.ThemeOverlay_AppCompat); } setupDrawerContent(mNavView); if(!prefHelper.navDrawerSwipe()) { mDrawer.setDrawerLockMode(DrawerLayout.LOCK_MODE_LOCKED_CLOSED); toolbar.setNavigationOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(v.getId() == -1) mDrawer.openDrawer(mNavView, true); Log.d("test", String.valueOf(v.getId())); } }); } if (savedInstanceState == null) { new Handler().postDelayed(new Runnable() { @Override public void run() { prefHelper.showRateSnackbar(MainActivity.this.getPackageName(), MainActivity.this, mFab); prefHelper.showSurveySnackbar(MainActivity.this, mFab); //prefHelper.showFeatureSnackbar(MainActivity.this, mFab); } }, 1500); } //Load fragment if (fullOffline || prefHelper.isOnline(this) || fullOfflineWhatIf) { //Do we have internet or are in offline mode? MenuItem item; boolean showOverview = false; if (savedInstanceState != null) { //Show the current Fragment currentFragment = savedInstanceState.getInt(SAVED_INSTANCE_CURRENT_FRAGMENT); item = mNavView.getMenu().findItem(currentFragment); } else { if (!whatIfIntent && fullOffline | prefHelper.isOnline(this)) item = mNavView.getMenu().findItem(R.id.nav_browser); else item = mNavView.getMenu().findItem(R.id.nav_whatif); } if (savedInstanceState != null) showOverview = savedInstanceState.getBoolean(OVERVIEW_TAG, false); //Check if overview mode was active before the device was rotated else overviewLaunch = prefHelper.launchToOverview() && !getIntent().getAction().equals(Intent.ACTION_VIEW); //Check if the user chose overview to be shown by default selectDrawerItem(item, showOverview, !showOverview); } else if ((currentFragment != R.id.nav_favorites)) { //Don't show the dialog if the user is currently browsing his favorites or full offline is enabled AlertDialog.Builder dialog = new AlertDialog.Builder(this); dialog.setMessage(R.string.no_connection) .setPositiveButton(R.string.no_connection_retry, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) { finish(); startActivity(getIntent()); } }) .setCancelable(false); if (!databaseManager.noFavorites()) { dialog.setNegativeButton(R.string.no_connection_favorites, new DialogInterface.OnClickListener() { //We have favorites, so let give the user the option to view them @Override public void onClick(DialogInterface dialog, int which) { MenuItem m = mNavView.getMenu().findItem(R.id.nav_favorites); selectDrawerItem(m, false, false); } }); } dialog.show(); } } @SuppressWarnings("unused") // it's actually used, just injected by Butter Knife @OnClick(R.id.fab) void onClick() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); OverviewBaseFragment overviewBaseFragment = (OverviewBaseFragment) fragmentManager.findFragmentByTag(OVERVIEW_TAG); if (overviewBaseFragment != null && overviewBaseFragment.isVisible()) { //The user is in overview mode ComicFragment comicFragment = (ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG); if (!prefHelper.overviewFav()) //Only favorites? if (!prefHelper.hideRead()) overviewBaseFragment.showRandomComic(prefHelper.getRandomNumber(comicFragment.lastComicNumber)); else overviewBaseFragment.showRandomComic(databaseManager.getRandomUnread()); else overviewBaseFragment.showComic(new Random().nextInt(databaseManager.getFavComics().length)); } else { // The user is browsing comics or favorites switch (currentFragment) { case R.id.nav_browser: { ((ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG)).getRandomComic(); if (prefHelper.showRandomTip()) { Toast.makeText(this, getResources().getString(R.string.random_tip), Toast.LENGTH_LONG).show(); prefHelper.setRandomTip(false); } break; } case R.id.nav_favorites: { ((FavoritesFragment) fragmentManager.findFragmentByTag(FAV_TAG)).getRandomComic(); break; } } } } @SuppressWarnings("unused") @OnLongClick(R.id.fab) boolean onLongClick() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); OverviewBaseFragment overviewBaseFragment = (OverviewBaseFragment) fragmentManager.findFragmentByTag(OVERVIEW_TAG); if (overviewBaseFragment != null && overviewBaseFragment.isVisible()) return false; // Long click does not work in overview else if (currentFragment == R.id.nav_browser) ((ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG)).getPreviousRandom(); return true; } /** * Adds the listener for the navigationView and adjusts the colors according to our theme */ private void setupDrawerContent(NavigationView navigationView) { navigationView.setNavigationItemSelectedListener( new NavigationView.OnNavigationItemSelectedListener() { @Override public boolean onNavigationItemSelected(MenuItem menuItem) { selectDrawerItem(menuItem, false, false); return true; } }); themePrefs.setupNavdrawerColor(navigationView); } /** * Selects a item from the navigation Drawer * * @param menuItem the pressed menu item * @param showOverview should be true when the user selected "Launch to Overview Mode" in the settings * @param animateOverview should be false when the device was rotated and the app showed overview mode before the rotation */ public void selectDrawerItem(final MenuItem menuItem, final boolean showOverview, final boolean animateOverview) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { //Setup the toolbar elevation for WhatIf overview if (menuItem.getItemId() == R.id.nav_whatif) toolbar.setElevation(0); else { Resources r = getResources(); float px = TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 4, r.getDisplayMetrics()); toolbar.setElevation(px); } } switch (menuItem.getItemId()) { case R.id.nav_browser: if (!prefHelper.isOnline(this) && !fullOffline) { showDrawerErrorToast(R.string.no_connection); //No connection, so show Error toast and return return; } animateToolbar(-300); showFragment("pref_random_comics", menuItem.getItemId(), "Comics", BROWSER_TAG, FAV_TAG, WHATIF_TAG, showOverview, animateOverview); break; case R.id.nav_favorites: if (databaseManager.noFavorites()) { showDrawerErrorToast(R.string.no_favorites); //No favorites, so show Error Toast and return return; } animateToolbar(300); showFragment("pref_random_favorites", menuItem.getItemId(), getResources().getString(R.string.nv_favorites), FAV_TAG, BROWSER_TAG, WHATIF_TAG, showOverview, animateOverview); break; case R.id.nav_whatif: if (!prefHelper.isOnline(this) && !fullOfflineWhatIf) { showDrawerErrorToast(R.string.no_connection); //No connection, so show Error toast and return return; } animateToolbar(300); if (getSupportFragmentManager().findFragmentByTag(WHATIF_TAG) == null) { mDrawer.closeDrawers(); new Handler().postDelayed(new Runnable() { //If the fragment is not added yet, add a small delay to avoid lag @Override public void run() { showFragment("", menuItem.getItemId(), "What if?", WHATIF_TAG, FAV_TAG, BROWSER_TAG, showOverview, animateOverview); } }, 150); } else showFragment("", menuItem.getItemId(), "What if?", WHATIF_TAG, FAV_TAG, BROWSER_TAG, showOverview, animateOverview); break; case R.id.nav_settings: mDrawer.closeDrawers(); new Handler().postDelayed(new Runnable() { //Wait for the drawer to be closed to avoid lag @Override public void run() { startActivityForResult(new Intent(MainActivity.this, SettingsActivity.class), 1); } }, 200); return; case R.id.nav_feedback: mDrawer.closeDrawers(); new Handler().postDelayed(new Runnable() { @Override public void run() { Intent i = new Intent(Intent.ACTION_SENDTO, Uri.fromParts("mailto", "easyxkcd@gmail.com", null)); startActivity(Intent.createChooser(i, getResources().getString(R.string.nav_feedback_send))); } }, 200); return; case R.id.nav_about: mDrawer.closeDrawers(); new Handler().postDelayed(new Runnable() { @Override public void run() { startActivity(new Intent(MainActivity.this, AboutActivity.class)); } }, 250); return; } menuItem.setChecked(true); mDrawer.closeDrawers(); currentFragment = menuItem.getItemId(); invalidateOptionsMenu(); } /** * Shows an error toast and resets the navigationDrawer to the previous item * * @param errorId the string resource to be shown */ private void showDrawerErrorToast(int errorId) { Toast.makeText(this, errorId, Toast.LENGTH_SHORT).show(); MenuItem m = mNavView.getMenu().findItem(currentFragment); m.setChecked(true); mDrawer.closeDrawers(); } /** * Animates the toolbar and its childs * * @param translation The initial vertical translation of the menu items */ private void animateToolbar(int translation) { View view; for (int i = 2; i < toolbar.getChildCount(); i++) { view = toolbar.getChildAt(i); view.setTranslationY(translation); view.animate().setStartDelay(50 * (i + 1)).setDuration(70 * (i + 1)).translationY(0); } toolbar.getChildAt(0).setAlpha(0); toolbar.getChildAt(0).animate().alpha(1).setDuration(200).setInterpolator(new AccelerateInterpolator()); } /** * Shows a new fragment and adjusts toolbar and FAB accordingly * * @param prefTag the preference tag that specifies whether the FAB should be hidden (Only in ComicBrowser or Favorites) * @param itemId the id of the pressed menu item * @param toolbarTitle the new title of the toolbar * @param fragmentTagShow the tag of the fragment to be shown (Comic Browser, Favorites, WhatIf) * @param fragmentTagHide the tag of the fragment to be hidden * @param fragmentTagHide2 the tag of the second fragment to be hidden * @param showOverview should be true when the user selected "Launch to Overview Mode" in the settings * @param animateOverview should be false when the device was rotated and the app showed overview mode before the rotation */ private void showFragment(String prefTag, int itemId, String toolbarTitle, String fragmentTagShow, String fragmentTagHide, String fragmentTagHide2, boolean showOverview, boolean animateOverview) { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); assert getSupportActionBar() != null; //We always have an ActionBar available, so this stops Android Studio from complaining about possible NullPointerExceptions //Setup FAB if (prefHelper.fabEnabled(prefTag) || fragmentTagShow.equals(WHATIF_TAG)) mFab.setVisibility(View.GONE); //User chose to hide fab or is is viewing WhatIf else mFab.setVisibility(View.VISIBLE); getSupportActionBar().setTitle(toolbarTitle); if (fragmentManager.findFragmentByTag(fragmentTagShow) != null) { //if the fragment exists, show it. android.support.v4.app.FragmentTransaction ft = fragmentManager.beginTransaction(); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) fragmentManager.findFragmentByTag(fragmentTagShow).setEnterTransition(null); if (fragmentTagShow.equals(BROWSER_TAG)) ft.setCustomAnimations(R.anim.abc_slide_in_top, R.anim.abc_slide_in_top); //ComicBrowser slide in from the top else ft.setCustomAnimations(R.anim.abc_slide_in_bottom, R.anim.abc_slide_in_bottom); //Favorites & WhatIf from the bottom ft.show(fragmentManager.findFragmentByTag(fragmentTagShow)); ft.commitAllowingStateLoss(); } else { //if the fragment does not exist, add it to fragment manager. switch (itemId) { case R.id.nav_favorites: fragmentManager.beginTransaction().setCustomAnimations(R.anim.abc_slide_in_bottom, R.anim.abc_slide_in_bottom).add(R.id.flContent, new FavoritesFragment(), fragmentTagShow).commitAllowingStateLoss(); break; case R.id.nav_browser: if (prefHelper.isOnline(this) && !fullOffline) { fragmentManager.beginTransaction().add(R.id.flContent, new ComicBrowserFragment(), fragmentTagShow).commitAllowingStateLoss(); } else { fragmentManager.beginTransaction().add(R.id.flContent, new OfflineFragment(), fragmentTagShow).commitAllowingStateLoss(); } break; case R.id.nav_whatif: fragmentManager.beginTransaction().add(R.id.flContent, new WhatIfOverviewFragment(), fragmentTagShow).commitAllowingStateLoss(); break; } } if (prefHelper.subtitleEnabled() && itemId != R.id.nav_whatif) { switch (itemId) { //Update Action Bar title case R.id.nav_favorites: { FavoritesFragment favoritesFragment = (FavoritesFragment) getSupportFragmentManager().findFragmentByTag(FAV_TAG); if (favoritesFragment != null && favoritesFragment.favorites != null) getSupportActionBar().setSubtitle(String.valueOf(favoritesFragment.favorites[favoritesFragment.favoriteIndex])); break; } case R.id.nav_browser: { ComicFragment comicFragment = (ComicFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG); if (comicFragment != null && comicFragment.lastComicNumber != 0) getSupportActionBar().setSubtitle(String.valueOf(comicFragment.lastComicNumber)); else getSupportActionBar().setSubtitle(String.valueOf(prefHelper.getLastComic())); break; } } } else if (itemId == R.id.nav_whatif) { getSupportActionBar().setSubtitle(""); } //Hide the other fragments FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); if (fragmentManager.findFragmentByTag(fragmentTagHide) != null) fragmentTransaction.hide(fragmentManager.findFragmentByTag(fragmentTagHide)); if (fragmentManager.findFragmentByTag(fragmentTagHide2) != null) fragmentTransaction.hide(fragmentManager.findFragmentByTag(fragmentTagHide2)); if (fragmentManager.findFragmentByTag(OVERVIEW_TAG) != null) fragmentTransaction.hide(fragmentManager.findFragmentByTag(OVERVIEW_TAG)); fragmentTransaction.commitAllowingStateLoss(); if (showOverview) showOverview(animateOverview); } @Override protected void onNewIntent(Intent intent) { setIntent(intent); handleIntent(intent); } private void handleIntent(Intent intent) { android.support.v4.app.FragmentManager fm = getSupportFragmentManager(); switch (intent.getAction()) { case Intent.ACTION_VIEW: if (intent.getDataString().contains("what")) { MenuItem item = mNavView.getMenu().findItem(R.id.nav_whatif); selectDrawerItem(item, false, false); WhatIfActivity.WhatIfIndex = getNumberFromUrl(intent.getDataString(), 1); Intent whatIf = new Intent(MainActivity.this, WhatIfActivity.class); prefHelper.setLastWhatIf(WhatIfActivity.WhatIfIndex); startActivity(whatIf); } else { MenuItem item = mNavView.getMenu().findItem(R.id.nav_browser); selectDrawerItem(item, false, false); ComicFragment comicFragment = (ComicFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG); comicFragment.lastComicNumber = getNumberFromUrl(intent.getDataString(), comicFragment.lastComicNumber); comicFragment.scrollTo(comicFragment.lastComicNumber - 1, false); } break; case COMIC_INTENT: /*int number = getIntent().getIntExtra("number", 0); ComicFragment fragment = (ComicFragment) fm.findFragmentByTag(BROWSER_TAG); fragment.lastComicNumber = number; if (fragment instanceof ComicBrowserFragment && fragment.isVisible()) progress = ProgressDialog.show(this, "", this.getResources().getString(R.string.loading_comics), true); fragment.updatePager();*/ MenuItem item = mNavView.getMenu().findItem(R.id.nav_browser); selectDrawerItem(item, false, false); ComicFragment comicFragment = (ComicFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG); comicFragment.lastComicNumber = intent.getIntExtra("number", 1); comicFragment.scrollTo(comicFragment.lastComicNumber - 1, false); break; case WHATIF_INTENT: item = mNavView.getMenu().findItem(R.id.nav_whatif); selectDrawerItem(item, false, false); WhatIfActivity.WhatIfIndex = intent.getIntExtra("number", 1); Intent whatIf = new Intent(MainActivity.this, WhatIfActivity.class); prefHelper.setLastWhatIf(WhatIfActivity.WhatIfIndex); startActivity(whatIf); break; } } /** * Extracts the number from xkcd links * * @param url the xkcd.com or m.xkcd.com url * @param defaultNumber the number to be returned when something went wrong (usually lastComicNumber) * @return the number of the comic that the url links to */ private int getNumberFromUrl(String url, int defaultNumber) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < url.length(); i++) { char c = url.charAt(i); if (c >= '0' && c <= '9') sb.append(c); else if (c == '/' && sb.length() > 0) //Fix for comic 1663 break; } try { return Integer.parseInt(sb.toString()); } catch (NumberFormatException e) { return defaultNumber; } } @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.menu_main, menu); // Get the SearchView and set the searchable configuration SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); final SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView(); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); searchView.setIconifiedByDefault(false); searchMenuItem = menu.findItem(R.id.action_search); searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { @Override public boolean onQueryTextSubmit(String query) { MenuItem searchMenuItem = getSearchMenuItem(); searchMenuItem.collapseActionView(); searchView.setQuery("", false); //Hide Keyboard View view = MainActivity.this.getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } return false; } @Override public boolean onQueryTextChange(String newText) { return false; } }); MenuItemCompat.setOnActionExpandListener(searchMenuItem, new MenuItemCompat.OnActionExpandListener() { @Override public boolean onMenuItemActionExpand(MenuItem item) { //Show keyboard View view = getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.showSoftInput(view, 0); } searchView.requestFocus(); return true; } @Override public boolean onMenuItemActionCollapse(MenuItem item) { //Hide keyboard View view = getCurrentFocus(); if (view != null) { InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } return true; } }); if (prefHelper.hideDonate()) menu.findItem(R.id.action_donate).setVisible(false); menu.findItem(R.id.action_night_mode).setChecked(themePrefs.nightEnabledThemeIgnoreAutoNight()); menu.findItem(R.id.action_night_mode).setVisible(!themePrefs.autoNightEnabled()); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case R.id.action_donate: startActivity(new Intent(MainActivity.this, DonateActivity.class)); return true; case R.id.action_overview: showOverview(true); return true; case R.id.action_night_mode: return toggleNightMode(item); } return super.onOptionsItemSelected(item); } protected boolean toggleNightMode(MenuItem item) { item.setChecked(!item.isChecked()); themePrefs.setNightThemeEnabled(item.isChecked()); prefHelper.setLastComic(((ComicFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG)).lastComicNumber); Intent intent = getIntent(); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_NO_ANIMATION); overridePendingTransition(0, 0); finish(); overridePendingTransition(0, 0); startActivity(intent); return true; } public void showOverview(boolean animate) { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction transaction = fragmentManager.beginTransaction(); if (fragmentManager.findFragmentByTag(OVERVIEW_TAG) != null) { //Scroll to the current comic int pos = ((ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG)).lastComicNumber; ((OverviewBaseFragment) fragmentManager.findFragmentByTag(OVERVIEW_TAG)).notifyAdapter(pos); } if (animate) transaction.setCustomAnimations(R.anim.slide_in_left, R.anim.slide_out_right); OverviewBaseFragment overviewBaseFragment = (OverviewBaseFragment) fragmentManager.findFragmentByTag(OVERVIEW_TAG); if (overviewBaseFragment == null || (overviewBaseFragment.overViewFav() != (currentFragment == R.id.nav_favorites)) ) { switch (prefHelper.getOverviewStyle()) { case 0: overviewBaseFragment = new OverviewListFragment(); break; case 1: overviewBaseFragment = new OverviewCardsFragment(); break; case 2: overviewBaseFragment = new OverviewStaggeredGridFragment(); break; } transaction.add(R.id.flContent, overviewBaseFragment, OVERVIEW_TAG); } else transaction.show(fragmentManager.findFragmentByTag(OVERVIEW_TAG)); if (fragmentManager.findFragmentByTag(BROWSER_TAG) != null) transaction.hide(fragmentManager.findFragmentByTag(BROWSER_TAG)); if (fragmentManager.findFragmentByTag(FAV_TAG) != null) transaction.hide(fragmentManager.findFragmentByTag(FAV_TAG)); transaction.commitAllowingStateLoss(); assert getSupportActionBar() != null; getSupportActionBar().setSubtitle(""); } @Override public void onSaveInstanceState(Bundle savedInstanceState) { //Save the current fragment savedInstanceState.putInt(SAVED_INSTANCE_CURRENT_FRAGMENT, currentFragment); //Remember if overview is currently visible if (getSupportFragmentManager().findFragmentByTag(OVERVIEW_TAG) != null) savedInstanceState.putBoolean(OVERVIEW_TAG, getSupportFragmentManager().findFragmentByTag(OVERVIEW_TAG).isVisible()); else savedInstanceState.putBoolean(OVERVIEW_TAG, false); super.onSaveInstanceState(savedInstanceState); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); // Pass any configuration change to the drawer toggles drawerToggle.onConfigurationChanged(newConfig); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); // Sync the toggle state after onRestoreInstanceState has occurred. drawerToggle.syncState(); } @Override public void onBackPressed() { android.support.v4.app.FragmentManager fragmentManager = getSupportFragmentManager(); if (getSearchMenuItem().isActionViewExpanded()) { getSearchMenuItem().collapseActionView(); } else if (mDrawer != null && mDrawer.isDrawerOpen(GravityCompat.START)) { mDrawer.closeDrawer(GravityCompat.START); } else if ((currentFragment == R.id.nav_browser || currentFragment == R.id.nav_favorites) && (fragmentManager.findFragmentByTag(OVERVIEW_TAG) == null || !fragmentManager.findFragmentByTag(OVERVIEW_TAG).isVisible())) { boolean zoomReset; zoomReset = ((ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG)).zoomReset(); //Reset the zoom level of the current image if (!zoomReset) { if (!SearchResultsActivity.isOpen && !getIntent().getAction().equals(Intent.ACTION_VIEW)) { prefHelper.setOverviewFav(currentFragment == R.id.nav_favorites); if (currentFragment == R.id.nav_favorites && (prefHelper.isOnline(this) || prefHelper.fullOfflineEnabled())) { showOverview(true); currentFragment = R.id.nav_browser; getSupportActionBar().setTitle("Comics"); mNavView.getMenu().findItem(R.id.nav_browser).setChecked(true); } else { showOverview(true); } } else { if (((ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG)).transition != null) ((ComicFragment) fragmentManager.findFragmentByTag(BROWSER_TAG)).transition.exit(MainActivity.this); //return to the SearchResultsActivity else super.onBackPressed(); } } } else if (currentFragment == R.id.nav_favorites) { FavoritesFragment favoritesFragment = (FavoritesFragment) fragmentManager.findFragmentByTag(FAV_TAG); if (!favoritesFragment.zoomReset()) super.onBackPressed(); } else { super.onBackPressed(); } } @Override protected void onStart() { super.onStart(); customTabActivityHelper.bindCustomTabsService(this); } @Override protected void onStop() { super.onStop(); customTabActivityHelper.unbindCustomTabsService(this); } @Override protected void onResume() { super.onResume(); try { mNavView.getMenu().findItem(getCurrentFragment()).setChecked(true); } catch (NullPointerException e) { e.printStackTrace(); } } @Override protected void onRestart() { ComicFragment fragment = (ComicFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG); if (fragment != null && prefHelper.isOnline(this) && !fromSearch) if (fullOffline || (prefHelper.isWifi(this) || prefHelper.mobileEnabled())) fragment.updatePager(); //Update the pager in case a new comic has ben posted while the app was still active in the background if (fromSearch) fromSearch = false; super.onRestart(); } @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (requestCode == 1) { switch (resultCode) { case RESULT_OK: //restart the activity when something major was changed in the settings finish(); startActivity(getIntent()); break; case UPDATE_ALARM: if (prefHelper.getNotificationInterval() != 0) WakefulIntentService.scheduleAlarms(new ComicListener(), this, true); else WakefulIntentService.cancelAlarms(this); break; } } else if (requestCode == 2 && resultCode == FilePickerActivity.RESULT_OK) { ((FavoritesFragment) getSupportFragmentManager().findFragmentByTag(FAV_TAG)).importFavorites(data); } } @Override public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) { switch (requestCode) { case 1: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) if (currentFragment == R.id.nav_favorites) { FavoritesFragment fragment = (FavoritesFragment) getSupportFragmentManager().findFragmentByTag(FAV_TAG); fragment.shareComic(true); } else { ComicBrowserFragment fragment = (ComicBrowserFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG); fragment.shareComicImage(); } break; case 2: if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { ComicBrowserFragment fragment = (ComicBrowserFragment) getSupportFragmentManager().findFragmentByTag(BROWSER_TAG); fragment.new SaveComicImageTask().execute(true); } } } // Getters/Setters public MenuItem getSearchMenuItem() { return searchMenuItem; } public FloatingActionButton getFab() { return mFab; } public Toolbar getToolbar() { return toolbar; } public NavigationView getNavView() { return mNavView; } public int getCurrentFragment() { return currentFragment; } public void setCurrentFragment(int id) {currentFragment = id;} public ProgressDialog getProgressDialog() { return progress; } public PrefHelper getPrefHelper() { return prefHelper; } public ThemePrefs getThemePrefs() { return themePrefs; } public DatabaseManager getDatabaseManager() { return databaseManager; } public void setProgressDialog(String message, boolean cancel) { progress = ProgressDialog.show(this, "", message, cancel); } private ActionBarDrawerToggle setupDrawerToggle() { return new ActionBarDrawerToggle(this, mDrawer, toolbar, R.string.drawer_open, R.string.drawer_close); } public void setNavSwipe() { } }