package it.feio.android.omninotes.models.views; import android.os.Build; import android.support.v4.view.ViewPropertyAnimatorListener; import android.view.View; import android.view.ViewGroup; import android.view.animation.AccelerateDecelerateInterpolator; import android.widget.FrameLayout; import android.widget.ListView; import android.widget.RelativeLayout; import com.getbase.floatingactionbutton.AddFloatingActionButton; import com.getbase.floatingactionbutton.FloatingActionsMenu; import it.feio.android.checklistview.utils.DensityUtil; import it.feio.android.omninotes.OmniNotes; import it.feio.android.omninotes.R; import it.feio.android.omninotes.models.listeners.AbsListViewScrollDetector; import it.feio.android.omninotes.models.listeners.OnFabItemClickedListener; import it.feio.android.omninotes.utils.Constants; import it.feio.android.omninotes.utils.Display; import it.feio.android.omninotes.utils.Navigation; import static android.support.v4.view.ViewCompat.animate; public class Fab { private FloatingActionsMenu fab; private boolean fabAllowed; private boolean fabHidden; private boolean fabExpanded; private final ListView listView; private boolean expandOnLongClick; private View overlay; OnFabItemClickedListener onFabItemClickedListener; public Fab(View fabView, ListView listView, boolean expandOnLongClick) { this.fab = (FloatingActionsMenu) fabView; this.listView = listView; this.expandOnLongClick = expandOnLongClick; init(); } private void init() { this.fabHidden = true; this.fabExpanded = false; AddFloatingActionButton fabAddButton = (AddFloatingActionButton) fab.findViewById(R.id.fab_expand_menu_button); fabAddButton.setOnClickListener(v -> { if (!isExpanded() && expandOnLongClick) { performAction(v); } else { performToggle(); } }); fabAddButton.setOnLongClickListener(v -> { if (!expandOnLongClick) { performAction(v); } else { performToggle(); } return true; }); listView.setOnScrollListener( new AbsListViewScrollDetector() { public void onScrollUp() { if (fab != null) { fab.collapse(); hideFab(); } } public void onScrollDown() { if (fab != null) { fab.collapse(); showFab(); } } }); fab.findViewById(R.id.fab_checklist).setOnClickListener(onClickListener); fab.findViewById(R.id.fab_camera).setOnClickListener(onClickListener); if (!expandOnLongClick) { View noteBtn = fab.findViewById(R.id.fab_note); noteBtn.setVisibility(View.VISIBLE); noteBtn.setOnClickListener(onClickListener); } // In KitKat bottom padding is added by navbar height if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { int navBarHeight = Display.getNavigationBarHeightKitkat(OmniNotes.getAppContext()); FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) fab.getLayoutParams(); params.setMargins(params.leftMargin, params.topMargin, params.rightMargin, navBarHeight + DensityUtil.pxToDp(params.bottomMargin, OmniNotes.getAppContext())); fab.setLayoutParams(params); } } private View.OnClickListener onClickListener = new View.OnClickListener() { @Override public void onClick(View v) { onFabItemClickedListener.OnFabItemClick(v.getId()); } }; public void performToggle() { fabExpanded = !fabExpanded; fab.toggle(); toggleOverlay(); } private void toggleOverlay() { if (this.overlay != null) { if (fabExpanded) { this.overlay.setVisibility(View.VISIBLE); } else { this.overlay.setVisibility(View.GONE); } } } private void performAction(View v) { if (fabExpanded) { fab.toggle(); fabExpanded = false; } else { onFabItemClickedListener.OnFabItemClick(v.getId()); } } public void showFab() { if (fab != null && fabAllowed && fabHidden) { animateFab(0, View.VISIBLE, View.VISIBLE); fabHidden = false; } } public void hideFab() { if (fab != null && !fabHidden) { fab.collapse(); animateFab(fab.getHeight() + getMarginBottom(fab), View.VISIBLE, View.INVISIBLE); fabHidden = true; fabExpanded = false; toggleOverlay(); } } public void animateFab(int translationY, final int visibilityBefore, final int visibilityAfter) { animate(fab).setInterpolator(new AccelerateDecelerateInterpolator()) .setDuration(Constants.FAB_ANIMATION_TIME) .translationY(translationY) .setListener(new ViewPropertyAnimatorListener() { @Override public void onAnimationStart(View view) { fab.setVisibility(visibilityBefore); } @Override public void onAnimationEnd(View view) { fab.setVisibility(visibilityAfter); } @Override public void onAnimationCancel(View view) { } }); } public void setAllowed(boolean allowed) { fabAllowed = allowed; } private int getMarginBottom(View view) { int marginBottom = 0; final ViewGroup.LayoutParams layoutParams = view.getLayoutParams(); if (layoutParams instanceof ViewGroup.MarginLayoutParams) { marginBottom = ((ViewGroup.MarginLayoutParams) layoutParams).bottomMargin; } return marginBottom; } public void setOnFabItemClickedListener(OnFabItemClickedListener onFabItemClickedListener) { this.onFabItemClickedListener = onFabItemClickedListener; } public void setOverlay(View overlay) { this.overlay = overlay; this.overlay.setOnClickListener(v -> performToggle()); } public void setOverlay(int colorResurce) { View overlayView = new View(OmniNotes.getAppContext()); overlayView.setBackgroundResource(colorResurce); RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams .MATCH_PARENT, RelativeLayout.LayoutParams.MATCH_PARENT); overlayView.setLayoutParams(params); overlayView.setVisibility(View.GONE); overlayView.setOnClickListener(v -> performToggle()); ViewGroup parent = ((ViewGroup) fab.getParent()); parent.addView(overlayView, parent.indexOfChild(fab)); this.overlay = overlayView; } public boolean isExpanded() { return fabExpanded; } }