/** * This file is part of FileSpace for Android, an app for managing your server (files, talks...). * <p/> * Copyright (c) 2014-2015 FileSpace for Android contributors (http://mercandalli.com) * <p/> * LICENSE: * <p/> * FileSpace for Android is free software: you can redistribute it and/or modify it under the terms of the GNU General * Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any * later version. * <p/> * FileSpace for Android is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * @author Jonathan Mercandalli * @license http://www.gnu.org/licenses/gpl.html * @copyright 2014-2015 FileSpace for Android contributors (http://mercandalli.com) */ package com.mercandalli.android.apps.files.main; import android.content.SharedPreferences; import android.content.res.Configuration; import android.os.Bundle; import android.preference.PreferenceManager; import android.support.annotation.NonNull; import android.support.annotation.Nullable; import android.support.annotation.StringRes; import android.support.design.widget.NavigationView; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.view.GravityCompat; import android.support.v4.widget.DrawerLayout; import android.support.v7.app.ActionBarDrawerToggle; import android.support.v7.widget.Toolbar; import android.view.KeyEvent; import android.view.View; import android.widget.Toast; import com.google.android.gms.ads.AdListener; import com.google.android.gms.ads.AdRequest; import com.google.android.gms.ads.InterstitialAd; import com.mercandalli.android.apps.files.R; import com.mercandalli.android.apps.files.admin.AdminFragment; import com.mercandalli.android.apps.files.common.fragment.BackFragment; import com.mercandalli.android.apps.files.common.listener.SetToolbarCallback; import com.mercandalli.android.apps.files.file.cloud.FileCloudPagerFragment; import com.mercandalli.android.apps.files.file.local.FileLocalPagerFragment; import com.mercandalli.android.apps.files.note.WorkspaceFragment; import com.mercandalli.android.apps.files.settings.SettingsFragment; import com.mercandalli.android.apps.files.storage.StorageFragment; import com.mercandalli.android.apps.files.support.SupportFragment; import com.mercandalli.android.apps.files.user.ProfileFragment; import com.mercandalli.android.apps.files.user.community.CommunityFragment; import com.mercandalli.android.library.base.dialog.DialogUtils; import com.mercandalli.android.library.base.precondition.Preconditions; import static com.mercandalli.android.apps.files.main.FileApp.logPerformance; /** * An abstract class with a {@link NavigationView}. */ /* package */ abstract class NavDrawerActivity extends ApplicationActivity implements SetToolbarCallback, DrawerLayout.DrawerListener, NavDrawerView.OnNavDrawerClickCallback { private static final String TAG = "NavDrawerActivity"; /** * Per the design guidelines, you should show the drawer on launch until the * user manually expands it. This shared preference tracks this. */ private static final String PREF_USER_LEARNED_DRAWER = "NavDrawerActivity.navigation_drawer_learned"; private DrawerLayout mDrawerLayout; private ActionBarDrawerToggle mActionBarDrawerToggle; private NavigationView mNavigationView; private NavDrawerView mNavDrawerView; @NonNull private final FragmentManager mFragmentManager = getSupportFragmentManager(); /** * True if returns from a saved instance state, false otherwise. */ private boolean mFromSavedInstanceState; /** * True if the user has already learned to user the navigation drawer, false otherwise. * <p/> * In this implementation, we consider that the user learns the navigation drawer when she closes it. */ private boolean mUserLearnedDrawer; private InterstitialAd mInterstitialAd; private int mThankYou; private String mCurrentFragmentTag; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); logPerformance(TAG, "NavDrawerActivity#onCreate() - Start"); setContentView(R.layout.activity_main); // Read in the flag indicating whether or not the user has demonstrated awareness of the // drawer. See PREF_USER_LEARNED_DRAWER for details. final SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); mUserLearnedDrawer = sp.getBoolean(PREF_USER_LEARNED_DRAWER, false); mDrawerLayout = (DrawerLayout) findViewById(R.id.activity_main_drawer_layout); mNavigationView = (NavigationView) findViewById(R.id.activity_main_navigation_view); mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow, GravityCompat.START); mNavDrawerView = (NavDrawerView) findViewById(R.id.activity_main_nav_drawer_view); mNavDrawerView.setOnNavDrawerClickCallback(this); mNavDrawerView.setSelectedRow(this, getInitFragmentId()); mNavDrawerView.setConnected(Config.isLogged()); if (Config.isLogged()) { mNavDrawerView.setUser(Config.getUser()); } logPerformance(TAG, "NavDrawerActivity#onCreate() - Middle"); // Initial Fragment if (savedInstanceState == null) { selectItem(getInitFragmentId()); } else { mFromSavedInstanceState = true; } mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, R.string.app_name, R.string.app_name); mDrawerLayout.addDrawerListener(mActionBarDrawerToggle); // If the user hasn't 'learned' about the drawer, open it to introduce them to the drawer, // per the navigation drawer design guidelines. if (!mUserLearnedDrawer && !mFromSavedInstanceState) { mDrawerLayout.openDrawer(GravityCompat.START); } initAds(); logPerformance(TAG, "NavDrawerActivity#onCreate() - End"); } @Override protected void onDestroy() { mNavDrawerView.setOnNavDrawerClickCallback(null); super.onDestroy(); } /** * {@inheritDoc} */ @Override public void onNavDrawerClicked(final NavDrawerView.NavDrawerRow navDrawerRow, final View v) { selectItem(navDrawerRow); } @Override protected void onPostCreate(Bundle savedInstanceState) { super.onPostCreate(savedInstanceState); mActionBarDrawerToggle.syncState(); } @Override public void onConfigurationChanged(Configuration newConfig) { super.onConfigurationChanged(newConfig); mActionBarDrawerToggle.onConfigurationChanged(newConfig); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { return keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0 && backPressed() || super.onKeyDown(keyCode, event); } @Override public void setToolbar(final Toolbar toolbar) { setSupportActionBar(toolbar); mActionBarDrawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.navigation_drawer_open, R.string.navigation_drawer_close); mDrawerLayout.addDrawerListener(this); mActionBarDrawerToggle.syncState(); } @Override public void setTitleToolbar(@StringRes int title) { setTitle(title); } @Override public void onDrawerSlide(View drawerView, float slideOffset) { if (mActionBarDrawerToggle != null) { mActionBarDrawerToggle.onDrawerSlide(drawerView, slideOffset); } } @Override public void onDrawerOpened(View drawerView) { if (mActionBarDrawerToggle != null) { mActionBarDrawerToggle.onDrawerOpened(drawerView); } invalidateOptionsMenu(); } @Override public void onDrawerClosed(View drawerView) { if (mActionBarDrawerToggle != null) { mActionBarDrawerToggle.onDrawerClosed(drawerView); } if (!mUserLearnedDrawer) { // The user manually closed the drawer; store this flag to prevent auto-showing // the navigation drawer automatically in the future. mUserLearnedDrawer = true; PreferenceManager.getDefaultSharedPreferences(this).edit() .putBoolean(PREF_USER_LEARNED_DRAWER, true).apply(); } invalidateOptionsMenu(); } @Override public void onDrawerStateChanged(int newState) { if (mActionBarDrawerToggle != null) { mActionBarDrawerToggle.onDrawerStateChanged(newState); } } @Nullable protected Fragment getCurrentFragment() { return mFragmentManager.findFragmentByTag(mCurrentFragmentTag); } private void selectItem(final NavDrawerView.NavDrawerRow navDrawerRow) { Preconditions.checkNotNull(navDrawerRow); if (NavDrawerView.NavDrawerRow.LOGOUT.equals(navDrawerRow)) { DialogUtils.alert( this, "Log out", "Do you want to log out?", "Yes", new DialogUtils.OnDialogUtilsListener() { @Override public void onDialogUtilsCalledBack() { Config.reset(NavDrawerActivity.this); NavDrawerActivity.this.finish(); } }, getString(android.R.string.cancel), null); return; } mCurrentFragmentTag = navDrawerRow.getTag(); Fragment fragment = mFragmentManager.findFragmentByTag(mCurrentFragmentTag); if (fragment == null) { switch (navDrawerRow) { case HEADER: if (Config.isLogged()) { fragment = ProfileFragment.newInstance(); } else { fragment = StorageFragment.newInstance(); } break; case FILES: fragment = FileLocalPagerFragment.newInstance(); break; case CLOUD: fragment = FileCloudPagerFragment.newInstance(getString(R.string.tab_cloud)); break; case WORKSPACE: fragment = WorkspaceFragment.newInstance(getString(R.string.tab_notes)); break; case COMMUNITY: fragment = CommunityFragment.newInstance(getString(R.string.tab_community)); break; case ADMIN: fragment = AdminFragment.newInstance(getString(R.string.tab_admin)); break; case SETTINGS: fragment = SettingsFragment.newInstance(getString(R.string.tab_settings)); break; case LOYALTY: if (Constants.ADS_VISIBLE) { if (mInterstitialAd != null && mInterstitialAd.isLoaded()) { mInterstitialAd.show(); } else { requestNewInterstitial(); Toast.makeText(this, R.string.settings_ad_is_loading, Toast.LENGTH_SHORT).show(); } } return; case LOGOUT: break; case SUPPORT: fragment = SupportFragment.newInstance(getString(R.string.tab_support)); break; default: throw new IllegalArgumentException("Wrong navDrawerRow in selectItem() " + navDrawerRow); } } mFragmentManager.beginTransaction().replace(R.id.activity_main_content_frame, fragment, mCurrentFragmentTag).commit(); if (mDrawerLayout.isDrawerOpen(mNavigationView)) { mDrawerLayout.closeDrawer(mNavigationView); } } /** * Close the nav drawer or follow back to fragment. * * @return true if action done, false will finish. */ private boolean backPressed() { if (mDrawerLayout.isDrawerOpen(mNavigationView)) { mDrawerLayout.closeDrawer(mNavigationView); return true; } final Fragment fragment = getCurrentFragment(); return fragment instanceof BackFragment && ((BackFragment) fragment).back(); } private NavDrawerView.NavDrawerRow getInitFragmentId() { return NavDrawerView.NavDrawerRow.FILES; } /** * Load a new interstitial ad asynchronously. */ private void requestNewInterstitial() { if (mInterstitialAd == null || mInterstitialAd.isLoaded()) { return; } mInterstitialAd.loadAd(new AdRequest.Builder().build()); } private void initAds() { if (Constants.ADS_VISIBLE) { // Ads // Create an InterstitialAd object. This same object can be re-used whenever you want to // show an interstitial. mInterstitialAd = new InterstitialAd(this); mInterstitialAd.setAdUnitId(Constants.AD_MOB_KEY_NAV_DRAWER); mInterstitialAd.setAdListener(new AdListener() { @Override public void onAdClosed() { if (!isFinishing()) { switch (mThankYou) { case 0: Toast.makeText(NavDrawerActivity.this, R.string.settings_ad_thank_you_1, Toast.LENGTH_SHORT).show(); break; case 1: Toast.makeText(NavDrawerActivity.this, R.string.settings_ad_thank_you_2, Toast.LENGTH_SHORT).show(); break; case 2: Toast.makeText(NavDrawerActivity.this, R.string.settings_ad_thank_you_3, Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(NavDrawerActivity.this, R.string.settings_ad_thank_you_4, Toast.LENGTH_SHORT).show(); break; } mThankYou++; } } }); requestNewInterstitial(); } } }