package com.mercandalli.android.apps.files.main;
import android.content.Context;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.annotation.DrawableRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageView;
import android.widget.TextView;
import com.mercandalli.android.apps.files.R;
import com.mercandalli.android.apps.files.user.UserModel;
import com.mercandalli.android.library.base.precondition.Preconditions;
import com.mercandalli.android.library.base.view.ViewUtils;
import java.util.HashMap;
import java.util.Map;
/**
* The all NavDrawer {@link FrameLayout}.
*/
/* package */
class NavDrawerView extends FrameLayout implements View.OnClickListener {
private static final String TAG = "NavDrawerView";
private NavDrawerRow mLastClicked;
private NavDrawerHeaderView mNavDrawerHeaderView;
private OnNavDrawerClickCallback mOnNavDrawerClickCallback;
private final Map<Integer, View> mChildrenViews = new HashMap<>();
private final Map<Integer, TextView> mTextViews = new HashMap<>();
private final Map<Integer, ImageView> mImageViews = new HashMap<>();
public NavDrawerView(Context context) {
super(context);
initView(context);
}
public NavDrawerView(Context context, AttributeSet attrs) {
super(context, attrs);
initView(context);
}
public NavDrawerView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
initView(context);
}
@Override
public void onClick(View v) {
final NavDrawerRow navDrawerRow = setSelectedRow(getContext(), getNavDrawerRowById(v.getId()));
if (mOnNavDrawerClickCallback != null) {
mOnNavDrawerClickCallback.onNavDrawerClicked(navDrawerRow, v);
}
}
/* package */ NavDrawerRow setSelectedRow(final Context context, @NonNull final NavDrawerRow navDrawerRow) {
Preconditions.checkNotNull(context);
Preconditions.checkNotNull(navDrawerRow);
if (!navDrawerRow.mIsSelectable) {
return navDrawerRow;
}
if (mLastClicked != null && mLastClicked.mNavDrawerSimpleRow != null) {
applyFont(mTextViews.get(mLastClicked.mId), mLastClicked, false);
mImageViews.get(mLastClicked.mId).setImageResource(
mLastClicked.mNavDrawerSimpleRow.mDrawableId);
}
if (mOnNavDrawerClickCallback != null) {
if (navDrawerRow.mNavDrawerSimpleRow != null) {
applyFont(mTextViews.get(navDrawerRow.mId), navDrawerRow, true);
if (!isOtherSection(navDrawerRow)) {
mImageViews.get(navDrawerRow.mId)
.setImageResource(navDrawerRow.mNavDrawerSimpleRow.mDrawablePressedId);
}
}
mLastClicked = navDrawerRow;
}
return mLastClicked;
}
@Nullable
/* package */ NavDrawerRow getLastClicked() {
return mLastClicked;
}
/* package */ void setOnNavDrawerClickCallback(OnNavDrawerClickCallback onNavDrawerClickCallback) {
mOnNavDrawerClickCallback = onNavDrawerClickCallback;
}
/* package */ void setConnected(boolean connected) {
for (final NavDrawerRow navDrawerRow : NavDrawerRow.values()) {
if (!navDrawerRow.mVisibleIfDisconnected) {
mChildrenViews.get(navDrawerRow.mId).setVisibility(connected ? VISIBLE : GONE);
}
}
}
/* package */ void setUser(final UserModel userModel) {
final boolean isAdmin = userModel.isAdmin();
for (final NavDrawerRow navDrawerRow : NavDrawerRow.values()) {
if (!navDrawerRow.mVisibleIfNotAdmin) {
mChildrenViews.get(navDrawerRow.mId).setVisibility(isAdmin ? VISIBLE : GONE);
}
}
mNavDrawerHeaderView.setUser(userModel);
}
private void initView(final @NonNull Context context) {
inflate(context, R.layout.view_nav_drawer, this);
setBackgroundColor(Color.WHITE);
mNavDrawerHeaderView = (NavDrawerHeaderView) findViewById(R.id.view_nav_drawer_header);
FileApp.logPerformance(TAG, "initView - Start");
ViewUtils.applyFont((TextView) findViewById(R.id.view_nav_drawer_other), "fonts/MYRIADAB.TTF");
for (final NavDrawerRow navDrawerRow : NavDrawerRow.values()) {
final View view = findViewById(navDrawerRow.mId);
mChildrenViews.put(navDrawerRow.mId, view);
view.setOnClickListener(this);
if (navDrawerRow.mNavDrawerSimpleRow != null) {
final TextView textView = (TextView) findViewById(navDrawerRow.mNavDrawerSimpleRow.mTitleId);
applyFont(textView, navDrawerRow, false);
mTextViews.put(navDrawerRow.mId, textView);
mImageViews.put(navDrawerRow.mId, (ImageView) findViewById(navDrawerRow.mNavDrawerSimpleRow.mIconId));
}
}
FileApp.logPerformance(TAG, "initView - End");
}
private void applyFont(TextView textView, NavDrawerRow navDrawerRow, boolean selected) {
if (navDrawerRow.mNavDrawerSimpleRow == null) {
return;
}
if (selected) {
textView.setTypeface(Typeface.SANS_SERIF, Typeface.BOLD);
} else {
textView.setTypeface(Typeface.SANS_SERIF, Typeface.NORMAL);
}
}
private boolean isOtherSection(NavDrawerRow navDrawerRow) {
return navDrawerRow.mNavDrawerSimpleRow != null && navDrawerRow.mNavDrawerSimpleRow.mDrawablePressedId == null;
}
@NonNull
private NavDrawerRow getNavDrawerRowById(final int viewId) {
for (NavDrawerRow navDrawerRow : NavDrawerRow.values()) {
if (navDrawerRow.mId == viewId) {
return navDrawerRow;
}
}
throw new IllegalArgumentException("Wrong id. No NavDrawerRow getNavDrawerRowById.");
}
/**
* The nav drawer items.
*/
/* package */ enum NavDrawerRow {
HEADER(R.id.view_nav_drawer_header, null, true, true, false),
FILES(R.id.view_nav_drawer_files, NavDrawerSimpleRow.FILES, true, true),
CLOUD(R.id.view_nav_drawer_cloud, NavDrawerSimpleRow.CLOUD, false, true),
WORKSPACE(R.id.view_nav_drawer_workspace, NavDrawerSimpleRow.NOTES, true, true),
COMMUNITY(R.id.view_nav_drawer_community, NavDrawerSimpleRow.COMMUNITY, false, true),
ADMIN(R.id.view_nav_drawer_admin, NavDrawerSimpleRow.ADMIN, false, false),
SETTINGS(R.id.view_nav_drawer_settings, NavDrawerSimpleRow.SETTINGS, true, true),
LOYALTY(R.id.view_nav_drawer_loyalty, NavDrawerSimpleRow.LOYALTY, Constants.ADS_VISIBLE, Constants.ADS_VISIBLE, false),
LOGOUT(R.id.view_nav_drawer_logout, NavDrawerSimpleRow.LOGOUT, false, true),
SUPPORT(R.id.view_nav_drawer_support, NavDrawerSimpleRow.SUPPORT, true, true);
private final int mId;
@Nullable
private final NavDrawerSimpleRow mNavDrawerSimpleRow;
private final boolean mVisibleIfDisconnected;
private final boolean mVisibleIfNotAdmin;
private final boolean mIsSelectable;
NavDrawerRow(final int id, @Nullable NavDrawerSimpleRow navDrawerSimpleRow,
boolean visibleIfDisconnected, boolean visibleIfNotAdmin) {
this(id, navDrawerSimpleRow, visibleIfDisconnected, visibleIfNotAdmin, true);
}
NavDrawerRow(final int id, @Nullable NavDrawerSimpleRow navDrawerSimpleRow,
boolean visibleIfDisconnected, boolean visibleIfNotAdmin, boolean isSelectable) {
mId = id;
mNavDrawerSimpleRow = navDrawerSimpleRow;
mVisibleIfDisconnected = visibleIfDisconnected;
mVisibleIfNotAdmin = visibleIfNotAdmin;
mIsSelectable = isSelectable;
}
@NonNull
/* package */ String getTag() {
return mId + "" + mVisibleIfDisconnected + "" + mVisibleIfNotAdmin;
}
}
/**
* The simple nav drawer items.
*/
private enum NavDrawerSimpleRow {
FILES(R.id.view_nav_drawer_files_title,
R.id.view_nav_drawer_files_icon,
R.drawable.q_ic_drawer_home,
R.drawable.q_ic_drawer_home_pressed),
CLOUD(R.id.view_nav_drawer_cloud_title,
R.id.view_nav_drawer_cloud_icon,
R.drawable.q_ic_drawer_files,
R.drawable.q_ic_drawer_files_pressed),
NOTES(R.id.view_nav_drawer_note_title,
R.id.view_nav_drawer_note_icon,
R.drawable.q_ic_drawer_workspace,
R.drawable.q_ic_drawer_workspace_pressed),
COMMUNITY(R.id.view_nav_drawer_community_title,
R.id.view_nav_drawer_community_icon,
R.drawable.q_ic_drawer_community,
R.drawable.q_ic_drawer_community_pressed),
ADMIN(R.id.view_nav_drawer_admin_title,
R.id.view_nav_drawer_admin_icon,
R.drawable.q_ic_drawer_data,
R.drawable.q_ic_drawer_data_pressed),
SETTINGS(R.id.view_nav_drawer_settings_title,
R.id.view_nav_drawer_settings_icon,
R.drawable.ic_settings_grey,
null),
LOYALTY(R.id.view_nav_drawer_loyalty_title,
R.id.view_nav_drawer_loyalty_icon,
R.drawable.ic_loyalty,
null),
LOGOUT(R.id.view_nav_drawer_logout_title,
R.id.view_nav_drawer_logout_icon,
R.drawable.ic_log_out,
null),
SUPPORT(R.id.view_nav_drawer_support_title,
R.id.view_nav_drawer_support_icon,
R.drawable.ic_help_grey,
null);
private final int mTitleId;
private final int mIconId;
private final int mDrawableId;
private final Integer mDrawablePressedId;
NavDrawerSimpleRow(final int titleId, final int iconId, @DrawableRes int drawableId, @DrawableRes Integer drawablePressedId) {
mTitleId = titleId;
mIconId = iconId;
mDrawableId = drawableId;
mDrawablePressedId = drawablePressedId;
}
}
/**
* Interface definition for a callback to be invoked when a nav drawer view is clicked.
*/
interface OnNavDrawerClickCallback {
/**
* Called when a view has been clicked.
*
* @param navDrawerRow The nav drawer view that was clicked.
* @param v The view that was clicked.
*/
void onNavDrawerClicked(NavDrawerRow navDrawerRow, View v);
}
}