package com.fastaccess.ui.base;
import android.app.ActivityManager;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.StringRes;
import android.support.design.widget.AppBarLayout;
import android.support.design.widget.NavigationView;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.widget.Toolbar;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewTreeObserver;
import android.widget.TextView;
import android.widget.Toast;
import com.fastaccess.App;
import com.fastaccess.BuildConfig;
import com.fastaccess.R;
import com.fastaccess.data.dao.model.Login;
import com.fastaccess.helper.AppHelper;
import com.fastaccess.helper.BundleConstant;
import com.fastaccess.helper.Bundler;
import com.fastaccess.helper.InputHelper;
import com.fastaccess.helper.PrefGetter;
import com.fastaccess.helper.PrefHelper;
import com.fastaccess.helper.ViewHelper;
import com.fastaccess.ui.base.mvp.BaseMvp;
import com.fastaccess.ui.base.mvp.presenter.BasePresenter;
import com.fastaccess.ui.modules.about.FastHubAboutActivity;
import com.fastaccess.ui.modules.changelog.ChangelogBottomSheetDialog;
import com.fastaccess.ui.modules.gists.GistsListActivity;
import com.fastaccess.ui.modules.login.LoginChooserActivity;
import com.fastaccess.ui.modules.main.MainActivity;
import com.fastaccess.ui.modules.main.donation.DonationActivity;
import com.fastaccess.ui.modules.main.orgs.OrgListDialogFragment;
import com.fastaccess.ui.modules.notification.NotificationActivity;
import com.fastaccess.ui.modules.pinned.PinnedReposActivity;
import com.fastaccess.ui.modules.repos.RepoPagerActivity;
import com.fastaccess.ui.modules.settings.SettingsActivity;
import com.fastaccess.ui.modules.user.UserPagerActivity;
import com.fastaccess.ui.widgets.AvatarLayout;
import com.fastaccess.ui.widgets.dialog.MessageDialogView;
import com.fastaccess.ui.widgets.dialog.ProgressDialogFragment;
import com.google.android.gms.auth.api.Auth;
import com.nostra13.universalimageloader.core.ImageLoader;
import java.util.ArrayList;
import butterknife.BindView;
import butterknife.ButterKnife;
import es.dmoral.toasty.Toasty;
import icepick.Icepick;
import icepick.State;
/**
* Created by Kosh on 24 May 2016, 8:48 PM
*/
public abstract class BaseActivity<V extends BaseMvp.FAView, P extends BasePresenter<V>> extends AdActivity<V, P> implements
BaseMvp.FAView, NavigationView.OnNavigationItemSelectedListener {
@State boolean isProgressShowing;
@Nullable @BindView(R.id.toolbar) Toolbar toolbar;
@Nullable @BindView(R.id.appbar) public AppBarLayout appbar;
@Nullable @BindView(R.id.drawer) public DrawerLayout drawer;
@Nullable @BindView(R.id.extrasNav) public NavigationView extraNav;
private static int REFRESH_CODE = 64;
private long backPressTimer;
private Toast toast;
@LayoutRes protected abstract int layout();
protected abstract boolean isTransparent();
protected abstract boolean canBack();
protected abstract boolean isSecured();
@Override protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Icepick.saveInstanceState(this, outState);
}
@Override protected void onCreate(@Nullable Bundle savedInstanceState) {
setupTheme();
AppHelper.updateAppLanguage(this);
super.onCreate(savedInstanceState);
if (layout() != 0) {
setContentView(layout());
ButterKnife.bind(this);
}
if (!isSecured()) {
if (!isLoggedIn()) {
onRequireLogin();
return;
}
}
Icepick.setDebug(BuildConfig.DEBUG);
if (savedInstanceState != null && !savedInstanceState.isEmpty()) {
Icepick.restoreInstanceState(this, savedInstanceState);
}
setupToolbarAndStatusBar(toolbar);
showHideAds();
if (savedInstanceState == null && PrefGetter.showWhatsNew()) {
new ChangelogBottomSheetDialog().show(getSupportFragmentManager(), "ChangelogBottomSheetDialog");
}
setupNavigationView(extraNav);
setupDrawer();
}
@Override public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override public boolean onOptionsItemSelected(MenuItem item) {
if (canBack()) {
if (item.getItemId() == android.R.id.home) {
onBackPressed();
return true;
}
}
return super.onOptionsItemSelected(item);
}
@Override public void onDialogDismissed() {
}//pass
@Override public void onMessageDialogActionClicked(boolean isOk, @Nullable Bundle bundle) {
if (isOk && bundle != null) {
boolean logout = bundle.getBoolean("logout");
if (logout){
onRequireLogin();
if(App.getInstance().getGoogleApiClient().isConnected())
Auth.CredentialsApi.disableAutoSignIn(App.getInstance().getGoogleApiClient());
}
}
}//pass
@Override public void showMessage(@StringRes int titleRes, @StringRes int msgRes) {
showMessage(getString(titleRes), getString(msgRes));
}
@Override public void showMessage(@NonNull String titleRes, @NonNull String msgRes) {
hideProgress();
if (toast != null) toast.cancel();
toast = titleRes.equals(getString(R.string.error))
? Toasty.error(getApplicationContext(), msgRes, Toast.LENGTH_LONG)
: Toasty.info(getApplicationContext(), msgRes, Toast.LENGTH_LONG);
toast.show();
}
@Override public void showErrorMessage(@NonNull String msgRes) {
showMessage(getString(R.string.error), msgRes);
}
@Override public boolean isLoggedIn() {
return !InputHelper.isEmpty(PrefGetter.getToken()) && Login.getUser() != null;
}
@Override public void showProgress(@StringRes int resId) {
String msg = getString(R.string.in_progress);
if (resId != 0) {
msg = getString(resId);
}
if (!isProgressShowing) {
ProgressDialogFragment fragment = (ProgressDialogFragment) AppHelper.getFragmentByTag(getSupportFragmentManager(),
ProgressDialogFragment.TAG);
if (fragment == null) {
isProgressShowing = true;
fragment = ProgressDialogFragment.newInstance(msg, false);
fragment.show(getSupportFragmentManager(), ProgressDialogFragment.TAG);
}
}
}
@Override public void hideProgress() {
ProgressDialogFragment fragment = (ProgressDialogFragment) AppHelper.getFragmentByTag(getSupportFragmentManager(),
ProgressDialogFragment.TAG);
if (fragment != null) {
isProgressShowing = false;
fragment.dismiss();
}
}
@Override public void onRequireLogin() {
Toasty.warning(this, getString(R.string.unauthorized_user), Toast.LENGTH_LONG).show();
ImageLoader.getInstance().clearDiskCache();
ImageLoader.getInstance().clearMemoryCache();
PrefHelper.clearKey("token");
App.getInstance().getDataStore()
.delete(Login.class)
.get()
.value();
Intent intent = new Intent(this, LoginChooserActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
finishAffinity();
}
@Override public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (drawer != null) {
drawer.closeDrawer(GravityCompat.START);
}
if (item.isChecked()) return false;
new Handler().postDelayed(() -> {
if (isFinishing()) return;
if (item.getItemId() == R.id.navToRepo) {
onNavToRepoClicked();
} else if (item.getItemId() == R.id.supportDev) {
startActivity(new Intent(this, DonationActivity.class));
} else if (item.getItemId() == R.id.gists) {
GistsListActivity.startActivity(this, false);
} else if (item.getItemId() == R.id.pinnedMenu) {
PinnedReposActivity.startActivity(this);
} else if (item.getItemId() == R.id.mainView) {
Intent intent = new Intent(this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
} else if (item.getItemId() == R.id.profile) {
startActivity(UserPagerActivity.createIntent(this, Login.getUser().getLogin()));
} else if (item.getItemId() == R.id.logout) {
onLogoutPressed();
} else if (item.getItemId() == R.id.settings) {
onOpenSettings();
} else if (item.getItemId() == R.id.about) {
startActivity(new Intent(this, FastHubAboutActivity.class));
} else if (item.getItemId() == R.id.orgs) {
onOpenOrgsDialog();
} else if (item.getItemId() == R.id.notifications) {
startActivity(new Intent(this, NotificationActivity.class));
}
}, 250);
return false;
}
@Override public void onBackPressed() {
if (drawer != null && drawer.isDrawerOpen(GravityCompat.START)) {
drawer.closeDrawer(GravityCompat.START);
} else {
boolean clickTwiceToExit = !PrefGetter.isTwiceBackButtonDisabled();
superOnBackPressed(clickTwiceToExit);
}
}
@Override public void onLogoutPressed() {
MessageDialogView.newInstance(getString(R.string.logout), getString(R.string.confirm_message),
Bundler.start()
.put(BundleConstant.YES_NO_EXTRA, true)
.put("logout", true)
.end())
.show(getSupportFragmentManager(), MessageDialogView.TAG);
}
@Override public void onThemeChanged() {
if (this instanceof MainActivity) {
recreate();
} else {
Intent intent = new Intent(this, MainActivity.class);
intent.putExtras(Bundler.start().put(BundleConstant.YES_NO_EXTRA, true).end());
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
finish();
}
}
@Override public void onOpenSettings() {
startActivityForResult(new Intent(this, SettingsActivity.class), REFRESH_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode==REFRESH_CODE)
if(resultCode==RESULT_OK)
recreate();
super.onActivityResult(requestCode, resultCode, data);
}
protected void selectHome(boolean hideRepo) {
if (extraNav != null) {
if (hideRepo) {
extraNav.getMenu().findItem(R.id.navToRepo).setVisible(false);
extraNav.getMenu().findItem(R.id.mainView).setVisible(true);
return;
}
extraNav.getMenu().findItem(R.id.navToRepo).setVisible(false);
extraNav.getMenu().findItem(R.id.mainView).setCheckable(true);
extraNav.getMenu().findItem(R.id.mainView).setChecked(true);
}
}
protected void selectProfile() {
selectHome(true);
if (extraNav != null) {
extraNav.getMenu().findItem(R.id.profile).setCheckable(true);
extraNav.getMenu().findItem(R.id.profile).setChecked(true);
}
}
protected void selectPinned() {
if (extraNav != null) {
extraNav.getMenu().findItem(R.id.pinnedMenu).setCheckable(true);
extraNav.getMenu().findItem(R.id.pinnedMenu).setChecked(true);
}
}
protected void onSelectNotifications() {
if (extraNav != null) {
extraNav.getMenu().findItem(R.id.notifications).setCheckable(true);
extraNav.getMenu().findItem(R.id.notifications).setChecked(true);
}
}
protected void onOpenOrgsDialog() {
OrgListDialogFragment.newInstance().show(getSupportFragmentManager(), "OrgListDialogFragment");
}
protected void showNavToRepoItem() {
if (extraNav != null) {
extraNav.getMenu().findItem(R.id.navToRepo).setVisible(true);
}
}
protected void onNavToRepoClicked() {}
private void setupToolbarAndStatusBar(@Nullable Toolbar toolbar) {
changeStatusBarColor(isTransparent());
if (toolbar != null) {
setSupportActionBar(toolbar);
if (canBack()) {
if (getSupportActionBar() != null) {
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_back);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
if (canBack()) {
View navIcon = getToolbarNavigationIcon(toolbar);
if (navIcon != null) {
navIcon.setOnLongClickListener(v -> {
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
return true;
});
}
}
}
}
}
}
protected void setToolbarIcon(@DrawableRes int res) {
if (getSupportActionBar() != null) {
getSupportActionBar().setHomeAsUpIndicator(res);
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
}
}
protected void hideShowShadow(boolean show) {
if (appbar != null) {
appbar.setElevation(show ? getResources().getDimension(R.dimen.spacing_micro) : 0.0f);
}
}
protected void changeStatusBarColor(boolean isTransparent) {
if (!isTransparent) {
getWindow().setStatusBarColor(ViewHelper.getPrimaryDarkColor(this));
}
}
private void setupTheme() {
int themeMode = PrefGetter.getThemeType(getApplicationContext());
int themeColor = PrefGetter.getThemeColor(getApplicationContext());
if (themeMode == PrefGetter.LIGHT) {
switch (themeColor) {
case PrefGetter.RED:
setTheme(R.style.ThemeLight_Red);
break;
case PrefGetter.PINK:
setTheme(R.style.ThemeLight_Pink);
break;
case PrefGetter.PURPLE:
setTheme(R.style.ThemeLight_Purple);
break;
case PrefGetter.DEEP_PURPLE:
setTheme(R.style.ThemeLight_DeepPurple);
break;
case PrefGetter.INDIGO:
setTheme(R.style.ThemeLight_Indigo);
break;
case PrefGetter.BLUE:
setTheme(R.style.ThemeLight);
break;
case PrefGetter.LIGHT_BLUE:
setTheme(R.style.ThemeLight_LightBlue);
break;
case PrefGetter.CYAN:
setTheme(R.style.ThemeLight_Cyan);
break;
case PrefGetter.TEAL:
setTheme(R.style.ThemeLight_Teal);
break;
case PrefGetter.GREEN:
setTheme(R.style.ThemeLight_Green);
break;
case PrefGetter.LIGHT_GREEN:
setTheme(R.style.ThemeLight_LightGreen);
break;
case PrefGetter.LIME:
setTheme(R.style.ThemeLight_Lime);
break;
case PrefGetter.YELLOW:
setTheme(R.style.ThemeLight_Yellow);
break;
case PrefGetter.AMBER:
setTheme(R.style.ThemeLight_Amber);
break;
case PrefGetter.ORANGE:
setTheme(R.style.ThemeLight_Orange);
break;
case PrefGetter.DEEP_ORANGE:
setTheme(R.style.ThemeLight_DeepOrange);
break;
default:
setTheme(R.style.ThemeLight);
}
} else if (themeMode == PrefGetter.DARK) {
switch (themeColor) {
case PrefGetter.RED:
setTheme(R.style.ThemeDark_Red);
break;
case PrefGetter.PINK:
setTheme(R.style.ThemeDark_Pink);
break;
case PrefGetter.PURPLE:
setTheme(R.style.ThemeDark_Purple);
break;
case PrefGetter.DEEP_PURPLE:
setTheme(R.style.ThemeDark_DeepPurple);
break;
case PrefGetter.INDIGO:
setTheme(R.style.ThemeDark_Indigo);
break;
case PrefGetter.BLUE:
setTheme(R.style.ThemeDark);
break;
case PrefGetter.LIGHT_BLUE:
setTheme(R.style.ThemeDark_LightBlue);
break;
case PrefGetter.CYAN:
setTheme(R.style.ThemeDark_Cyan);
break;
case PrefGetter.TEAL:
setTheme(R.style.ThemeDark_Teal);
break;
case PrefGetter.GREEN:
setTheme(R.style.ThemeDark_Green);
break;
case PrefGetter.LIGHT_GREEN:
setTheme(R.style.ThemeDark_LightGreen);
break;
case PrefGetter.LIME:
setTheme(R.style.ThemeDark_Lime);
break;
case PrefGetter.YELLOW:
setTheme(R.style.ThemeDark_Yellow);
break;
case PrefGetter.AMBER:
setTheme(R.style.ThemeDark_Amber);
break;
case PrefGetter.ORANGE:
setTheme(R.style.ThemeDark_Orange);
break;
case PrefGetter.DEEP_ORANGE:
setTheme(R.style.ThemeDark_DeepOrange);
break;
default:
setTheme(R.style.ThemeDark);
}
}
setTaskDescription(new ActivityManager.TaskDescription(getString(R.string.app_name),
BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher), ViewHelper.getPrimaryColor(this)));
}
protected void setupNavigationView(@Nullable NavigationView extraNav) {
if (extraNav != null) {
extraNav.setNavigationItemSelectedListener(this);
Login userModel = Login.getUser();
if (userModel != null) {
View view = extraNav.getHeaderView(0);
if (view != null) {
((AvatarLayout) view.findViewById(R.id.avatarLayout)).setUrl(userModel.getAvatarUrl(), userModel.getLogin());
((TextView) view.findViewById(R.id.username)).setText(userModel.getLogin());
if (!InputHelper.isEmpty(userModel.getName())) {
((TextView) view.findViewById(R.id.email)).setText(userModel.getName());
} else {
view.findViewById(R.id.email).setVisibility(View.GONE);
}
view.findViewById(R.id.userHolder).setOnClickListener(v -> UserPagerActivity.startActivity(this, userModel.getLogin()));
}
}
}
}
private void setupDrawer() {
if (drawer != null && !(this instanceof MainActivity)) {
if (!PrefGetter.isNavDrawerHintShowed()) {
drawer.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override public boolean onPreDraw() {
drawer.openDrawer(GravityCompat.START);
drawer.addDrawerListener(new DrawerLayout.SimpleDrawerListener() {
@Override public void onDrawerOpened(View drawerView) {
super.onDrawerOpened(drawerView);
drawerView.postDelayed(() -> {
if (drawer != null) {
drawer.closeDrawer(GravityCompat.START);
drawer.removeDrawerListener(this);
}
}, 1000);
}
});
drawer.getViewTreeObserver().removeOnPreDrawListener(this);
return true;
}
});
}
}
}
private void superOnBackPressed(boolean didClickTwice) {
if (this instanceof MainActivity) {
if (didClickTwice) {
if (canExit()) {
super.onBackPressed();
}
} else {
super.onBackPressed();
}
} else {
super.onBackPressed();
}
}
private boolean canExit() {
if (backPressTimer + 2000 > System.currentTimeMillis()) {
return true;
} else {
Toast.makeText(getBaseContext(), R.string.press_again_to_exit, Toast.LENGTH_SHORT).show();
}
backPressTimer = System.currentTimeMillis();
return false;
}
@Nullable private View getToolbarNavigationIcon(Toolbar toolbar) {
boolean hadContentDescription = TextUtils.isEmpty(toolbar.getNavigationContentDescription());
String contentDescription = !hadContentDescription ? String.valueOf(toolbar.getNavigationContentDescription()) : "navigationIcon";
toolbar.setNavigationContentDescription(contentDescription);
ArrayList<View> potentialViews = new ArrayList<>();
toolbar.findViewsWithText(potentialViews, contentDescription, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
View navIcon = null;
if (potentialViews.size() > 0) {
navIcon = potentialViews.get(0);
}
if (hadContentDescription) toolbar.setNavigationContentDescription(null);
return navIcon;
}
}