package com.reactnativenavigation.views;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.text.SpannableStringBuilder;
import android.text.TextUtils;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import com.reactnativenavigation.NavigationApplication;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.utils.TypefaceSpan;
import com.reactnativenavigation.utils.ViewUtils;
import java.util.ArrayList;
class TitleBarButton implements MenuItem.OnMenuItemClickListener {
protected final Menu menu;
protected final View parent;
TitleBarButtonParams buttonParams;
@Nullable protected String navigatorEventId;
TitleBarButton(Menu menu, View parent, TitleBarButtonParams buttonParams, @Nullable String navigatorEventId) {
this.menu = menu;
this.parent = parent;
this.buttonParams = buttonParams;
this.navigatorEventId = navigatorEventId;
}
MenuItem addToMenu(int index) {
MenuItem item = createMenuItem(index);
item.setShowAsAction(buttonParams.showAsAction.action);
item.setEnabled(buttonParams.enabled);
setIcon(item);
setColor();
setFont();
item.setOnMenuItemClickListener(this);
return item;
}
private MenuItem createMenuItem(int index) {
if (!buttonParams.hasFont() || TextUtils.isEmpty(buttonParams.label)) {
return menu.add(Menu.NONE, Menu.NONE, index, buttonParams.label);
}
TypefaceSpan span = new TypefaceSpan(buttonParams.font.get());
SpannableStringBuilder title = new SpannableStringBuilder(buttonParams.label);
title.setSpan(span, 0, title.length(), 0);
return menu.add(Menu.NONE, Menu.NONE, index, title);
}
private void setIcon(MenuItem item) {
if (hasIcon()) {
item.setIcon(buttonParams.icon);
}
}
private void setColor() {
if (!hasColor() || disableIconTint()) {
return;
}
if (hasIcon()) {
setIconColor();
} else {
setTextColor();
}
}
private void setIconColor() {
ViewUtils.tintDrawable(buttonParams.icon, buttonParams.color.getColor(), buttonParams.enabled);
}
private void setTextColor() {
ViewUtils.runOnPreDraw(parent, new Runnable() {
@Override
public void run() {
ArrayList<View> outViews = findActualTextViewInMenuByLabel();
setTextColorForFoundButtonViews(outViews);
}
});
}
private void setFont() {
if (!buttonParams.hasFont()) {
return;
}
ArrayList<View> buttons = findActualTextViewInMenuByLabel();
setTextFontForFoundButtonViews(buttons);
}
@NonNull
private ArrayList<View> findActualTextViewInMenuByLabel() {
ArrayList<View> outViews = new ArrayList<>();
parent.findViewsWithText(outViews, buttonParams.label, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION);
return outViews;
}
private void setTextColorForFoundButtonViews(ArrayList<View> buttons) {
for (View button : buttons) {
((TextView) button).setTextColor(buttonParams.getColor().getColor());
}
}
private void setTextFontForFoundButtonViews(ArrayList<View> buttons) {
for (View button : buttons) {
if (buttonParams.hasFont()) {
((TextView) button).setTypeface(buttonParams.font.get());
}
}
}
private boolean hasIcon() {
return buttonParams.icon != null;
}
private boolean hasColor() {
return buttonParams.color.hasColor();
}
private boolean disableIconTint() {
return buttonParams.disableIconTint;
}
@Override
public boolean onMenuItemClick(MenuItem item) {
NavigationApplication.instance.getEventEmitter().sendNavigatorEvent(buttonParams.eventId, navigatorEventId);
return true;
}
}