package it.sephiroth.android.library.bottomnavigation; import android.annotation.SuppressLint; import android.content.Context; import android.content.res.Resources; import android.support.annotation.NonNull; import android.util.Log; import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.Toast; import it.sephiroth.android.library.bottonnavigation.R; import static android.util.Log.INFO; import static it.sephiroth.android.library.bottomnavigation.MiscUtils.log; /** * Created by crugnola on 4/4/16. * MaterialBottomNavigation */ public class TabletLayout extends ViewGroup implements ItemsLayoutContainer { private static final String TAG = TabletLayout.class.getSimpleName(); private final int itemHeight; private final int paddingTop; private boolean hasFrame; private int selectedIndex; OnItemClickListener listener; private MenuParser.Menu menu; public TabletLayout(final Context context) { super(context); final Resources res = getResources(); selectedIndex = 0; itemHeight = res.getDimensionPixelSize(R.dimen.bbn_tablet_item_height); paddingTop = res.getDimensionPixelSize(R.dimen.bbn_tablet_layout_padding_top); } @Override public void removeAll() { removeAllViews(); selectedIndex = 0; menu = null; } @Override protected void onLayout(final boolean changed, final int l, final int t, final int r, final int b) { if (!hasFrame || getChildCount() == 0) { return; } int top = paddingTop; for (int i = 0; i < getChildCount(); i++) { final View child = getChildAt(i); final LayoutParams params = child.getLayoutParams(); setChildFrame(child, 0, top, params.width, params.height); top += child.getHeight(); } } @Override protected void onSizeChanged(final int w, final int h, final int oldw, final int oldh) { super.onSizeChanged(w, h, oldw, oldh); hasFrame = true; if (null != menu) { populateInternal(menu); menu = null; } } private void setChildFrame(View child, int left, int top, int width, int height) { MiscUtils.log(TAG, Log.VERBOSE, "setChildFrame: " + left + ", " + top + ", " + width + ", " + height); child.layout(left, top, left + width, top + height); } @Override public void setSelectedIndex(final int index, final boolean animate) { MiscUtils.log(TAG, Log.INFO, "setSelectedIndex: " + index); if (selectedIndex == index) { return; } int oldSelectedIndex = this.selectedIndex; this.selectedIndex = index; if (!hasFrame || getChildCount() == 0) { return; } final BottomNavigationTabletItemView current = (BottomNavigationTabletItemView) getChildAt(oldSelectedIndex); final BottomNavigationTabletItemView child = (BottomNavigationTabletItemView) getChildAt(index); if (null != current) { current.setExpanded(false, 0, animate); } if (null != child) { child.setExpanded(true, 0, animate); } } @Override public void setItemEnabled(final int index, final boolean enabled) { log(TAG, INFO, "setItemEnabled(%d, %b)", index, enabled); final BottomNavigationItemViewAbstract child = (BottomNavigationItemViewAbstract) getChildAt(index); if (null != child) { child.setEnabled(enabled); child.postInvalidate(); requestLayout(); } } @Override public int getSelectedIndex() { return selectedIndex; } @Override public void populate(@NonNull final MenuParser.Menu menu) { MiscUtils.log(TAG, Log.INFO, "populate: " + menu); if (hasFrame) { populateInternal(menu); } else { this.menu = menu; } } @Override public void setOnItemClickListener(OnItemClickListener listener) { this.listener = listener; } private void populateInternal(@NonNull final MenuParser.Menu menu) { MiscUtils.log(TAG, Log.DEBUG, "populateInternal"); final BottomNavigation parent = (BottomNavigation) getParent(); for (int i = 0; i < menu.getItemsCount(); i++) { final BottomNavigationItem item = menu.getItemAt(i); MiscUtils.log(TAG, Log.DEBUG, "item: " + item); LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(getWidth(), itemHeight); BottomNavigationTabletItemView view = new BottomNavigationTabletItemView(parent, i == selectedIndex, menu); view.setItem(item); view.setLayoutParams(params); view.setClickable(true); view.setTypeface(parent.typeface); final int finalI = i; view.setOnTouchListener(new OnTouchListener() { @Override @SuppressLint ("ClickableViewAccessibility") public boolean onTouch(final View v, final MotionEvent event) { final int action = event.getActionMasked(); if (action == MotionEvent.ACTION_DOWN) { if (null != listener) { listener.onItemPressed(TabletLayout.this, v, true); } } else if (action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL) { if (null != listener) { listener.onItemPressed(TabletLayout.this, v, false); } } return false; } }); view.setOnClickListener(new OnClickListener() { @Override public void onClick(final View v) { if (null != listener) { listener.onItemClick(TabletLayout.this, v, finalI, true); } } }); view.setOnLongClickListener(new OnLongClickListener() { @Override public boolean onLongClick(final View v) { Toast.makeText(getContext(), item.getTitle(), Toast.LENGTH_SHORT).show(); return true; } }); addView(view); } } }