package carbon.widget;
import android.content.Context;
import android.content.Intent;
import android.content.res.ColorStateList;
import android.graphics.drawable.Drawable;
import android.support.annotation.DrawableRes;
import android.support.annotation.LayoutRes;
import android.support.annotation.StringRes;
import android.view.ActionProvider;
import android.view.ContextMenu;
import android.view.Display;
import android.view.LayoutInflater;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import carbon.CarbonContextWrapper;
import carbon.R;
public class FloatingMenuItem implements MenuItem {
private final FloatingActionMenu menu;
private LinearLayout view;
private TextView tooltip;
private FloatingActionButton fab;
private Drawable background;
private boolean enabled;
private boolean visible;
private int iconRes;
private Drawable icon;
private CharSequence title;
private int titleRes;
private int id;
private int groupId;
private int order;
private ColorStateList iconTint;
public FloatingMenuItem(int id, int groupId, int order, CharSequence title, FloatingActionMenu menu) {
this.id = id;
this.groupId = groupId;
this.order = order;
this.title = title;
this.menu = menu;
}
public void build() {
int[] location = new int[2];
menu.anchor.getLocationOnScreen(location);
WindowManager wm = (WindowManager) menu.anchor.getContext().getSystemService(Context.WINDOW_SERVICE);
Display display = wm.getDefaultDisplay();
boolean left = location[0] < display.getWidth() + menu.anchor.getWidth() - location[0];
ViewGroup content = (ViewGroup) menu.getContentView();
Context context = new CarbonContextWrapper(content.getContext());
LayoutInflater inflater = LayoutInflater.from(context);
view = (LinearLayout) inflater.inflate(left ? R.layout.carbon_floatingactionmenu_left : R.layout.carbon_floatingactionmenu_right, content, false);
tooltip = (TextView) view.findViewById(R.id.carbon_tooltip);
fab = (FloatingActionButton) view.findViewById(R.id.carbon_fab);
tooltip.setText(titleRes == 0 ? title : context.getResources().getString(titleRes));
if (background != null)
fab.setBackgroundDrawable(background);
if (iconTint != null)
fab.setTint(iconTint);
fab.setImageDrawable(icon != null ? icon : context.getResources().getDrawable(iconRes)); // always null
fab.setOnClickListener(v -> {
if (enabled) {
if (menu.listener == null || menu.listener.onMenuItemClick(this))
menu.dismiss();
}
});
content.addView(view);
view.setEnabled(enabled);
view.setVisibility(visible ? View.VISIBLE : View.GONE);
}
@Override
public int getItemId() {
return id;
}
@Override
public int getGroupId() {
return groupId;
}
@Override
public int getOrder() {
return order;
}
@Override
public MenuItem setTitle(CharSequence title) {
this.title = title;
if (tooltip != null)
tooltip.setText(title);
return this;
}
@Override
public MenuItem setTitle(@StringRes int titleRes) {
this.titleRes = titleRes;
if (tooltip != null)
tooltip.setText(titleRes);
return this;
}
@Override
public CharSequence getTitle() {
return tooltip.getText();
}
@Override
public MenuItem setTitleCondensed(CharSequence title) {
return this;
}
@Override
public CharSequence getTitleCondensed() {
return null;
}
@Override
public MenuItem setIcon(Drawable icon) {
this.icon = icon;
if (fab != null)
fab.setImageDrawable(icon);
return this;
}
@Override
public MenuItem setIcon(@DrawableRes int iconRes) {
this.iconRes = iconRes;
if (fab != null)
fab.setImageResource(iconRes);
return this;
}
@Override
public Drawable getIcon() {
return icon;
}
@Override
public MenuItem setIntent(Intent intent) {
return this;
}
@Override
public Intent getIntent() {
return null;
}
@Override
public MenuItem setShortcut(char numericChar, char alphaChar) {
return this;
}
@Override
public MenuItem setNumericShortcut(char numericChar) {
return this;
}
@Override
public char getNumericShortcut() {
return 0;
}
@Override
public MenuItem setAlphabeticShortcut(char alphaChar) {
return this;
}
@Override
public char getAlphabeticShortcut() {
return 0;
}
@Override
public MenuItem setCheckable(boolean checkable) {
return this;
}
@Override
public boolean isCheckable() {
return false;
}
@Override
public MenuItem setChecked(boolean checked) {
return this;
}
@Override
public boolean isChecked() {
return false;
}
@Override
public MenuItem setVisible(boolean visible) {
this.visible = visible;
if (view != null)
view.setVisibility(visible ? View.VISIBLE : View.GONE);
return this;
}
@Override
public boolean isVisible() {
return visible;
}
@Override
public MenuItem setEnabled(boolean enabled) {
this.enabled = enabled;
if (view != null)
view.setEnabled(enabled);
return this;
}
@Override
public boolean isEnabled() {
return enabled;
}
@Override
public boolean hasSubMenu() {
return false;
}
@Override
public SubMenu getSubMenu() {
return null;
}
@Override
public MenuItem setOnMenuItemClickListener(OnMenuItemClickListener menuItemClickListener) {
return this;
}
@Override
public ContextMenu.ContextMenuInfo getMenuInfo() {
return null;
}
@Override
public void setShowAsAction(int actionEnum) {
}
@Override
public MenuItem setShowAsActionFlags(int actionEnum) {
return this;
}
@Override
public MenuItem setActionView(View view) {
return this;
}
@Override
public MenuItem setActionView(@LayoutRes int resId) {
return this;
}
@Override
public View getActionView() {
return null;
}
@Override
public MenuItem setActionProvider(ActionProvider actionProvider) {
return this;
}
@Override
public ActionProvider getActionProvider() {
return null;
}
@Override
public boolean expandActionView() {
return false;
}
@Override
public boolean collapseActionView() {
return false;
}
@Override
public boolean isActionViewExpanded() {
return false;
}
@Override
public MenuItem setOnActionExpandListener(OnActionExpandListener listener) {
return this;
}
public MenuItem setBackgroundDrawable(Drawable drawable) {
background = drawable;
if (fab != null)
fab.setBackgroundDrawable(drawable);
return this;
}
public Drawable getBackgroundDrawable() {
return background;
}
public void performAction() {
view.performClick();
}
public void setIconTint(ColorStateList tint) {
iconTint = tint;
if (fab != null)
fab.setTint(tint);
}
}