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
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ public void destroy() {
@Override
public void mergeNavigationOptions(NavigationOptions options) {
this.options.mergeWith(options);
applyOptions(this.options);
}

String getTabTitle() {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -51,4 +51,8 @@ public void onPageSelected(int position) {
public void onPageScrollStateChanged(int state) {

}

int getCurrentItem() {
return currentPage;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

import com.reactnativenavigation.parse.NavigationOptions;
import com.reactnativenavigation.presentation.NavigationOptionsListener;
import com.reactnativenavigation.utils.Task;
import com.reactnativenavigation.viewcontrollers.ParentController;
import com.reactnativenavigation.viewcontrollers.ViewController;
import com.reactnativenavigation.views.TopTabsLayout;
Expand All @@ -17,10 +18,12 @@ public class TopTabsController extends ParentController implements NavigationOpt

private List<TopTabController> tabs;
private TopTabsLayout topTabsLayout;
private TopTabsAdapter adapter;

public TopTabsController(Activity activity, String id, List<TopTabController> tabs) {
super(activity, id);
this.tabs = tabs;
this.adapter = new TopTabsAdapter(tabs);
for (ViewController tab : tabs) {
tab.setParentController(this);
}
Expand All @@ -29,7 +32,7 @@ public TopTabsController(Activity activity, String id, List<TopTabController> ta
@NonNull
@Override
protected ViewGroup createView() {
topTabsLayout = new TopTabsLayout(getActivity(), tabs);
topTabsLayout = new TopTabsLayout(getActivity(), tabs, adapter);
return topTabsLayout;
}

Expand All @@ -41,12 +44,12 @@ public Collection<? extends ViewController> getChildControllers() {

@Override
public void onViewAppeared() {
topTabsLayout.performOnCurrentTab(TopTabController::onViewAppeared);
performOnCurrentTab(TopTabController::onViewAppeared);
}

@Override
public void onViewDisappear() {
topTabsLayout.performOnCurrentTab(TopTabController::onViewDisappear);
performOnCurrentTab(TopTabController::onViewDisappear);
}

@Override
Expand All @@ -62,4 +65,8 @@ public void mergeNavigationOptions(NavigationOptions options) {
public void switchToTab(int index) {
topTabsLayout.switchToTab(index);
}

private void performOnCurrentTab(Task<TopTabController> task) {
task.run(tabs.get(adapter.getCurrentItem()));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,18 +16,17 @@ public class TopTabsViewPager extends ViewPager {
private static final int OFFSCREEN_PAGE_LIMIT = 99;
private List<TopTabController> tabs;

public TopTabsViewPager(Context context, List<TopTabController> tabs) {
public TopTabsViewPager(Context context, List<TopTabController> tabs, TopTabsAdapter adapter) {
super(context);
this.tabs = tabs;
init();
init(adapter);
}

private void init() {
private void init(TopTabsAdapter adapter) {
setOffscreenPageLimit(OFFSCREEN_PAGE_LIMIT);
for (ViewController tab : tabs) {
addView(tab.getView(), new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}
TopTabsAdapter adapter = new TopTabsAdapter(tabs);
setAdapter(adapter);
addOnPageChangeListener(adapter);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@

import com.reactnativenavigation.parse.NavigationOptions;
import com.reactnativenavigation.presentation.OptionsPresenter;
import com.reactnativenavigation.utils.Task;
import com.reactnativenavigation.viewcontrollers.toptabs.TopTabController;
import com.reactnativenavigation.viewcontrollers.toptabs.TopTabsAdapter;
import com.reactnativenavigation.viewcontrollers.toptabs.TopTabsViewPager;

import java.util.List;
Expand All @@ -18,16 +18,14 @@
public class TopTabsLayout extends LinearLayout implements Container {

private TopBar topBar;
private List<TopTabController> tabs;
private TopTabsViewPager viewPager;
private final OptionsPresenter optionsPresenter;

public TopTabsLayout(Context context, List<TopTabController> tabs) {
public TopTabsLayout(Context context, List<TopTabController> tabs, TopTabsAdapter adapter) {
super(context);
topBar = new TopBar(context);
this.tabs = tabs;
viewPager = new TopTabsViewPager(context, tabs);
optionsPresenter = new OptionsPresenter(topBar, viewPager);
viewPager = new TopTabsViewPager(context, tabs, adapter);
initViews();
}

Expand All @@ -54,11 +52,6 @@ public ViewPager getViewPager() {
return viewPager;
}


public void performOnCurrentTab(Task<TopTabController> task) {
task.run(tabs.get(viewPager.getCurrentItem()));
}

public void switchToTab(int index) {
viewPager.setCurrentItem(index);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.reactnativenavigation.viewcontrollers;

import android.app.Activity;

import com.reactnativenavigation.BaseTest;
import com.reactnativenavigation.mocks.TopTabLayoutMock;
import com.reactnativenavigation.parse.NavigationOptions;
import com.reactnativenavigation.viewcontrollers.toptabs.TopTabController;

import org.junit.Test;

import static org.mockito.Mockito.spy;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;

public class TopTabControllerTest extends BaseTest {
private TopTabController uut;
private TopTabLayoutMock view;
private ParentController parentController;
private NavigationOptions initialOptions;

@Override
public void beforeEach() {
super.beforeEach();
Activity activity = newActivity();
view = spy(new TopTabLayoutMock(activity));
initialOptions = new NavigationOptions();
uut = new TopTabController(activity,
"containerId",
"containerName",
(activity1, containerId, containerName) -> view,
initialOptions
);
parentController = spy(new TopTabsControllerMock(activity, "parentContainerId"));
uut.setParentController(parentController);
}

@Test
public void styleIsAppliedOnParentControllerWhenTabIsVisible() throws Exception {
uut.ensureViewIsCreated();
uut.onViewAppeared();
verify(parentController, times(1)).applyOptions(initialOptions);
}

@Test
public void styleIsAppliedOnParentControllerWhenOptionsAreSetDynamically() throws Exception {
uut.ensureViewIsCreated();
uut.onViewAppeared();
uut.mergeNavigationOptions(new NavigationOptions());
verify(parentController, times(2)).applyOptions(initialOptions);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.reactnativenavigation.viewcontrollers;

import android.app.Activity;
import android.support.annotation.NonNull;
import android.view.ViewGroup;

import java.util.Collection;

public class TopTabsControllerMock extends ParentController {
public TopTabsControllerMock(Activity activity, String id) {
super(activity, id);
}

@NonNull
@Override
protected ViewGroup createView() {
return null;
}

@NonNull
@Override
public Collection<? extends ViewController> getChildControllers() {
return null;
}
}
24 changes: 22 additions & 2 deletions playground/src/containers/TopTabOptionsScreen.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
const React = require('react');
const { PureComponent } = require('react');

const { View, Text } = require('react-native');
const testIDs = require('../testIDs');
const { View, Text, Button } = require('react-native');
const Navigation = require('react-native-navigation');

class TopTabOptionsScreen extends PureComponent {
static get navigationOptions() {
Expand All @@ -15,14 +16,33 @@ class TopTabOptionsScreen extends PureComponent {
};
}

constructor(props) {
super(props);
this.onClickDynamicOptions = this.onClickDynamicOptions.bind(this);
}

render() {
return (
<View style={styles.root}>
<Text style={styles.h1}>{this.props.text || 'Top Tab Screen'}</Text>
<Text style={styles.footer}>{`this.props.containerId = ${this.props.containerId}`}</Text>
<Button title="Dynamic Options" testID={testIDs.DYNAMIC_OPTIONS_BUTTON} onPress={this.onClickDynamicOptions} />
</View>
);
}

onClickDynamicOptions() {
Navigation.setOptions(this.props.containerId, {
topBar: {
title: 'Dynamic Title',
textColor: '#00FFFF',
largeTitle: false,
buttonColor: 'red',
textFontSize: 20,
textFontFamily: 'HelveticaNeue-CondensedBold'
}
});
}
}

const styles = {
Expand Down