Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions docs/_sidebar.md
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
- Options
- [NavigationOptions](/docs/options/NavigationOptions)
- [TopBar](/docs/options/TopBar)
- [TopTab](/docs/options/TopTab)
- [Button](/docs/options/Button)
- [BottomTabs](/docs/options/BottomTabs)
- [BottomTab](/docs/options/BottomTab)
9 changes: 9 additions & 0 deletions docs/docs/options/TopTab.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
<h1>TopTab</h1>

**Properties**

| Name | Type | Description |
| --- | --- | --- |
| title | <code>string</code> | The tab's title in the TopTabs view |
| titleFontFamily | <code>string</code> | Change the tab's title font family |

Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import com.facebook.react.ReactInstanceManager;
import com.reactnativenavigation.react.ReactContainerViewCreator;
import com.reactnativenavigation.utils.TypefaceLoader;
import com.reactnativenavigation.viewcontrollers.BottomTabsController;
import com.reactnativenavigation.viewcontrollers.ContainerViewController;
import com.reactnativenavigation.viewcontrollers.SideMenuController;
Expand All @@ -22,11 +23,13 @@ public class LayoutFactory {
private final Activity activity;
private final ReactInstanceManager reactInstanceManager;
private NavigationOptions defaultOptions;
private final TypefaceLoader typefaceManager;

public LayoutFactory(Activity activity, final ReactInstanceManager reactInstanceManager, NavigationOptions defaultOptions) {
this.activity = activity;
this.reactInstanceManager = reactInstanceManager;
this.defaultOptions = defaultOptions;
typefaceManager = new TypefaceLoader(activity);
}

public ViewController create(final LayoutNode node) {
Expand Down Expand Up @@ -92,7 +95,7 @@ private ViewController createSideMenuRight(LayoutNode node) {
private ViewController createContainer(LayoutNode node) {
String id = node.id;
String name = node.data.optString("name");
NavigationOptions navigationOptions = NavigationOptions.parse(node.data.optJSONObject("navigationOptions"), defaultOptions);
NavigationOptions navigationOptions = NavigationOptions.parse(typefaceManager, node.data.optJSONObject("navigationOptions"), defaultOptions);
return new ContainerViewController(activity,
id,
name,
Expand Down Expand Up @@ -128,16 +131,18 @@ private ViewController createDialogContainer(LayoutNode node) {

private ViewController createTopTabs(LayoutNode node) {
final List<TopTabController> tabs = new ArrayList<>();
for (LayoutNode child : node.children) {
tabs.add((TopTabController) create(child));
for (int i = 0; i < node.children.size(); i++) {
TopTabController tabController = (TopTabController) create(node.children.get(i));
tabController.setTabIndex(i);
tabs.add(tabController);
}
return new TopTabsController(activity, node.id, tabs);
}

private ViewController createTopTab(LayoutNode node) {
String id = node.id;
String name = node.data.optString("name");
NavigationOptions navigationOptions = NavigationOptions.parse(node.data.optJSONObject("navigationOptions"), defaultOptions);
NavigationOptions navigationOptions = NavigationOptions.parse(typefaceManager, node.getNavigationOptions(), defaultOptions);
return new TopTabController(activity,
id,
name,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,8 @@ public enum Type {
this.data = data;
this.children = children;
}

JSONObject getNavigationOptions() {
return data.optJSONObject("navigationOptions");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

import android.support.annotation.NonNull;

import com.reactnativenavigation.utils.TypefaceLoader;

import org.json.JSONObject;

import java.util.ArrayList;
Expand All @@ -22,18 +24,18 @@ static BooleanOptions parse(String value) {
}

@NonNull
public static NavigationOptions parse(JSONObject json) {
return parse(json, new NavigationOptions());
public static NavigationOptions parse(TypefaceLoader typefaceManager, JSONObject json) {
return parse(typefaceManager, json, new NavigationOptions());
}

@NonNull
public static NavigationOptions parse(JSONObject json, @NonNull NavigationOptions defaultOptions) {
public static NavigationOptions parse(TypefaceLoader typefaceManager, JSONObject json, @NonNull NavigationOptions defaultOptions) {
NavigationOptions result = new NavigationOptions();
if (json == null) return result;

result.topBarOptions = TopBarOptions.parse(json.optJSONObject("topBar"));
result.topTabsOptions = TopTabsOptions.parse(json.optJSONObject("topTabs"));
result.topTabOptions = TopTabOptions.parse(json.optJSONObject("topTab"));
result.topTabOptions = TopTabOptions.parse(typefaceManager, json.optJSONObject("topTab"));
result.bottomTabsOptions = BottomTabsOptions.parse(json.optJSONObject("bottomTabs"));
result.rightButtons = Button.parseJsonArray(json.optJSONArray("rightButtons"));
result.leftButtons = Button.parseJsonArray(json.optJSONArray("leftButtons"));
Expand All @@ -42,7 +44,7 @@ public static NavigationOptions parse(JSONObject json, @NonNull NavigationOption
}

@NonNull public TopBarOptions topBarOptions = new TopBarOptions();
@NonNull private TopTabsOptions topTabsOptions = new TopTabsOptions();
@NonNull public TopTabsOptions topTabsOptions = new TopTabsOptions();
@NonNull public TopTabOptions topTabOptions = new TopTabOptions();
@NonNull public BottomTabsOptions bottomTabsOptions = new BottomTabsOptions();
public ArrayList<Button> leftButtons;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,23 @@
package com.reactnativenavigation.parse;

import android.graphics.Typeface;
import android.support.annotation.Nullable;

import com.reactnativenavigation.utils.TypefaceLoader;

import org.json.JSONObject;

public class TopTabOptions implements DEFAULT_VALUES {
public String title = NO_VALUE;
@Nullable public Typeface fontFamily;
public int tabIndex;

public static TopTabOptions parse(JSONObject json) {
public static TopTabOptions parse(TypefaceLoader typefaceManager, JSONObject json) {
TopTabOptions result = new TopTabOptions();
if (json == null) return result;

result.title = json.optString("title", NO_VALUE);
result.fontFamily = typefaceManager.getTypeFace(json.optString("titleFontFamily"));
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Why do you need to load typeface now. I mean it's better to have it consistent. Because topBar options load typeface in presenter, and topTabs in parser.

return result;
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
package com.reactnativenavigation.parse;

import android.support.annotation.Nullable;

import org.json.JSONObject;

public class TopTabsOptions implements DEFAULT_VALUES {
public static TopTabsOptions parse(JSONObject topTabs) {
return new TopTabsOptions();

public static TopTabsOptions parse(@Nullable JSONObject json) {
TopTabsOptions result = new TopTabsOptions();
if (json == null) return result;
return result;
}

void mergeWith(TopTabsOptions topTabsOptions) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
import com.reactnativenavigation.parse.Button;
import com.reactnativenavigation.parse.NavigationOptions;
import com.reactnativenavigation.parse.TopBarOptions;
import com.reactnativenavigation.parse.TopTabOptions;
import com.reactnativenavigation.utils.TypefaceLoader;
import com.reactnativenavigation.views.TopBar;

Expand All @@ -23,19 +24,20 @@ public OptionsPresenter(TopBar topBar, View contentView) {
animator = new StackAnimator(topBar.getContext());
}

public void applyOptions(NavigationOptions options) {
public void applyOptions(NavigationOptions options) {
applyTopBarOptions(options.topBarOptions);
applyButtons(options.leftButtons, options.rightButtons);
}
applyTopTabOptions(options.topTabOptions);
}

private void applyTopBarOptions(TopBarOptions options) {
topBar.setTitle(options.title);
topBar.setBackgroundColor(options.backgroundColor);
topBar.setTitleTextColor(options.textColor);
topBar.setTitleFontSize(options.textFontSize);

TypefaceLoader typefaceLoader = new TypefaceLoader();
topBar.setTitleTypeface(typefaceLoader.getTypeFace(topBar.getContext(), options.textFontFamily));
TypefaceLoader typefaceLoader = new TypefaceLoader(topBar.getContext());
topBar.setTitleTypeface(typefaceLoader.getTypeFace(options.textFontFamily));
if (options.hidden == NavigationOptions.BooleanOptions.True) {
hideTopBar(options.animateHide);
}
Expand Down Expand Up @@ -69,4 +71,10 @@ private void hideTopBar(NavigationOptions.BooleanOptions animated) {
private void applyButtons(ArrayList<Button> leftButtons, ArrayList<Button> rightButtons) {
topBar.setButtons(leftButtons, rightButtons);
}

private void applyTopTabOptions(TopTabOptions topTabOptions) {
if (topTabOptions.fontFamily != null) {
topBar.setTopTabFontFamily(topTabOptions.tabIndex, topTabOptions.fontFamily);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
import com.reactnativenavigation.parse.LayoutNodeParser;
import com.reactnativenavigation.parse.NavigationOptions;
import com.reactnativenavigation.parse.OverlayOptions;
import com.reactnativenavigation.utils.TypefaceLoader;
import com.reactnativenavigation.utils.UiThread;
import com.reactnativenavigation.viewcontrollers.Navigator;
import com.reactnativenavigation.viewcontrollers.ViewController;
Expand Down Expand Up @@ -48,7 +49,7 @@ public void run() {

@ReactMethod
public void setDefaultOptions(final ReadableMap options) {
final NavigationOptions defaultOptions = NavigationOptions.parse(JSONParser.parse(options));
final NavigationOptions defaultOptions = NavigationOptions.parse(new TypefaceLoader(activity()), JSONParser.parse(options));
handle(new Runnable() {
@Override
public void run() {
Expand All @@ -59,7 +60,7 @@ public void run() {

@ReactMethod
public void setOptions(final String onContainerId, final ReadableMap options) {
final NavigationOptions navOptions = NavigationOptions.parse(JSONParser.parse(options));
final NavigationOptions navOptions = NavigationOptions.parse(new TypefaceLoader(activity()), JSONParser.parse(options));
handle(new Runnable() {
@Override
public void run() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
import android.content.res.AssetManager;
import android.graphics.Typeface;
import android.support.annotation.Nullable;
import android.text.TextUtils;

import java.io.IOException;
import java.util.Arrays;
Expand All @@ -13,14 +14,17 @@

public class TypefaceLoader {
private static final Map<String, Typeface> typefaceCache = new HashMap<>();
private Context context;

public TypefaceLoader(Context context) {
this.context = context;
}

@Nullable
public Typeface getTypeFace(String fontFamilyName) {
if (TextUtils.isEmpty(fontFamilyName)) return null;
if (typefaceCache.containsKey(fontFamilyName)) return typefaceCache.get(fontFamilyName);

public Typeface getTypeFace(Context context, String fontFamilyName) {
if (fontFamilyName == null) {
return null;
}
if (typefaceCache.containsKey(fontFamilyName)) {
return typefaceCache.get(fontFamilyName);
}
Typeface result = load(context, fontFamilyName);
typefaceCache.put(fontFamilyName, result);
return result;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.reactnativenavigation.utils;

import android.support.annotation.Nullable;
import android.view.View;
import android.view.ViewGroup;

public class ViewUtils {
@Nullable
public static <T> T findChildByClass(ViewGroup root, Class clazz) {
for (int i = 0; i < root.getChildCount(); i++) {
View view = root.getChildAt(i);
if (clazz.isAssignableFrom(view.getClass())) {
return (T) view;
}

if (view instanceof ViewGroup) {
view = findChildByClass((ViewGroup) view, clazz);
if (view != null && clazz.isAssignableFrom(view.getClass())) {
return (T) view;
}
}
}
return null;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -74,4 +74,8 @@ public void mergeNavigationOptions(NavigationOptions options) {
String getTabTitle() {
return options.topTabOptions.title;
}

public void setTabIndex(int i) {
options.topTabOptions.tabIndex = i;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,9 @@ public class TopBar extends AppBarLayout {

public TopBar(final Context context, Container container) {
super(context);
titleBar = new Toolbar(context);
this.container = container;
titleBar = new Toolbar(context);
topTabs = new TopTabs(getContext());
addView(titleBar);
}

Expand Down Expand Up @@ -57,6 +58,10 @@ public void setTitleTypeface(Typeface typeface) {
}
}

public void setTopTabFontFamily(int tabIndex, Typeface fontFamily) {
topTabs.setFontFamily(tabIndex, fontFamily);
}

public void setButtons(ArrayList<Button> leftButtons, ArrayList<Button> rightButtons) {
setLeftButtons(leftButtons);
setRightButtons(rightButtons);
Expand Down Expand Up @@ -129,7 +134,6 @@ public void setupTopTabsWithViewPager(TopTabsViewPager viewPager) {
}

private void initTopTabs() {
topTabs = new TopTabs(getContext());
addView(topTabs);
}
}
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package com.reactnativenavigation.views;

import android.content.Context;
import android.graphics.Typeface;
import android.support.design.widget.TabLayout;

public class TopTabs extends TabLayout {
private final TopTabsStyleHelper styleHelper;

public TopTabs(Context context) {
super(context);
styleHelper = new TopTabsStyleHelper(this);
}

public void setFontFamily(int tabIndex, Typeface fontFamily) {
styleHelper.setFontFamily(tabIndex, fontFamily);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.reactnativenavigation.views;

import android.graphics.Typeface;
import android.view.ViewGroup;
import android.widget.TextView;

import com.reactnativenavigation.utils.ViewUtils;

class TopTabsStyleHelper {
private TopTabs topTabs;

TopTabsStyleHelper(TopTabs topTabs) {
this.topTabs = topTabs;
}

void setFontFamily(int tabIndex, Typeface fontFamily) {
TextView title = ViewUtils.findChildByClass(getTabView(tabIndex), TextView.class);
if (title != null) {
title.setTypeface(fontFamily);
}
}

private ViewGroup getTabView(int tabIndex) {
return (ViewGroup) ((ViewGroup) topTabs.getChildAt(0)).getChildAt(tabIndex);
}
}
Loading