package com.reactnativenavigation.views;
import android.content.Context;
import android.graphics.Color;
import android.os.Build;
import android.support.design.widget.AppBarLayout;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import com.facebook.react.bridge.Callback;
import com.reactnativenavigation.params.BaseScreenParams;
import com.reactnativenavigation.params.ContextualMenuParams;
import com.reactnativenavigation.params.StyleParams;
import com.reactnativenavigation.params.TitleBarButtonParams;
import com.reactnativenavigation.params.TitleBarLeftButtonParams;
import com.reactnativenavigation.utils.ViewUtils;
import java.util.List;
import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
public class TopBar extends AppBarLayout {
protected TitleBar titleBar;
private ContextualMenu contextualMenu;
protected FrameLayout titleBarAndContextualMenuContainer;
protected TopTabs topTabs;
public TopBar(Context context) {
super(context);
setId(ViewUtils.generateViewId());
createLayout();
}
protected void createLayout() {
titleBarAndContextualMenuContainer = new FrameLayout(getContext());
addView(titleBarAndContextualMenuContainer);
}
public void addTitleBarAndSetButtons(List<TitleBarButtonParams> rightButtons,
TitleBarLeftButtonParams leftButton,
LeftButtonOnClickListener leftButtonOnClickListener,
String navigatorEventId, boolean overrideBackPressInJs) {
titleBar = createTitleBar();
addTitleBar();
addButtons(rightButtons, leftButton, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
}
protected TitleBar createTitleBar() {
return new TitleBar(getContext());
}
protected void addTitleBar() {
titleBarAndContextualMenuContainer.addView(titleBar, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}
private void addButtons(List<TitleBarButtonParams> rightButtons, TitleBarLeftButtonParams leftButton, LeftButtonOnClickListener leftButtonOnClickListener, String navigatorEventId, boolean overrideBackPressInJs) {
titleBar.setRightButtons(rightButtons, navigatorEventId);
titleBar.setLeftButton(leftButton, leftButtonOnClickListener, navigatorEventId, overrideBackPressInJs);
}
public void setTitle(String title) {
titleBar.setTitle(title);
}
public void setSubtitle(String subtitle) {
titleBar.setSubtitle(subtitle);
}
public void setButtonColor(StyleParams styleParams) {
titleBar.setButtonColor(styleParams.titleBarButtonColor);
}
public void setStyle(StyleParams styleParams) {
if (styleParams.topBarColor.hasColor()) {
setBackgroundColor(styleParams.topBarColor.getColor());
}
if (styleParams.topBarTransparent) {
setTransparent();
}
titleBar.setStyle(styleParams);
setTopTabsStyle(styleParams);
if (!styleParams.topBarElevationShadowEnabled) {
disableElevationShadow();
}
}
private void setTransparent() {
setBackgroundColor(Color.TRANSPARENT);
disableElevationShadow();
}
private void disableElevationShadow() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
setOutlineProvider(null);
}
}
public void setTitleBarRightButtons(String navigatorEventId, List<TitleBarButtonParams> titleBarButtons) {
titleBar.setRightButtons(titleBarButtons, navigatorEventId);
}
public TopTabs initTabs() {
topTabs = new TopTabs(getContext());
addView(topTabs, new ViewGroup.LayoutParams(MATCH_PARENT, (int) ViewUtils.convertDpToPixel(48)));
return topTabs;
}
public void setTitleBarLeftButton(String navigatorEventId,
LeftButtonOnClickListener leftButtonOnClickListener,
TitleBarLeftButtonParams titleBarLeftButtonParams,
boolean overrideBackPressInJs) {
titleBar.setLeftButton(titleBarLeftButtonParams, leftButtonOnClickListener, navigatorEventId,
overrideBackPressInJs);
}
private void setTopTabsStyle(StyleParams style) {
if (topTabs == null) {
return;
}
topTabs.setTopTabsTextColor(style);
topTabs.setSelectedTabIndicatorStyle(style);
topTabs.setScrollable(style);
}
public void showContextualMenu(final ContextualMenuParams params, StyleParams styleParams, Callback onButtonClicked) {
final ContextualMenu menuToRemove = contextualMenu != null ? contextualMenu : null;
contextualMenu = new ContextualMenu(getContext(), params, styleParams, onButtonClicked);
titleBarAndContextualMenuContainer.addView(contextualMenu, new ViewGroup.LayoutParams(MATCH_PARENT, WRAP_CONTENT));
ViewUtils.runOnPreDraw(contextualMenu, new Runnable() {
@Override
public void run() {
titleBar.hide();
contextualMenu.show(new Runnable() {
@Override
public void run() {
if (menuToRemove != null) {
titleBarAndContextualMenuContainer.removeView(menuToRemove);
}
}
});
}
});
}
public void onContextualMenuHidden() {
contextualMenu = null;
titleBar.show();
}
public void dismissContextualMenu() {
if (contextualMenu != null) {
contextualMenu.dismiss();
contextualMenu = null;
titleBar.show();
}
}
public void destroy() {
}
public void onViewPagerScreenChanged(BaseScreenParams screenParams) {
titleBar.onViewPagerScreenChanged(screenParams);
}
}