diff --git a/android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java b/android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java index 5e0949c5e1f..4ff1f95f8ed 100644 --- a/android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java +++ b/android/app/src/main/java/com/reactnativenavigation/controllers/Modal.java @@ -120,6 +120,7 @@ interface OnModalDismissedListener { setAnimation(screenParams); setStatusBarStyle(screenParams.styleParams); setNavigationBarStyle(screenParams.styleParams); + setDrawUnderStatusBar(screenParams.styleParams); } private void setStatusBarStyle(StyleParams styleParams) { @@ -128,6 +129,12 @@ private void setStatusBarStyle(StyleParams styleParams) { StatusBar.setTextColorScheme(window.getDecorView(), styleParams.statusBarTextColorScheme); } + private void setDrawUnderStatusBar(StyleParams styleParams) { + Window window = getWindow(); + if (window == null) return; + StatusBar.displayOverScreen(window.getDecorView(), styleParams.drawUnderStatusBar); + } + private void setNavigationBarStyle(StyleParams styleParams) { NavigationBar.setColor(getWindow(), styleParams.navigationBarColor); } diff --git a/android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java b/android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java index c646ad75268..341e6eca27a 100644 --- a/android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java +++ b/android/app/src/main/java/com/reactnativenavigation/controllers/NavigationActivity.java @@ -63,7 +63,9 @@ public class NavigationActivity extends AppCompatActivity implements DefaultHard @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (!NavigationApplication.instance.getReactGateway().hasStartedCreatingContext()) { + if (!NavigationApplication.instance.getReactGateway().hasStartedCreatingContext() || + getIntent() == null || + getIntent().getBundleExtra("ACTIVITY_PARAMS_BUNDLE") == null) { SplashActivity.start(this); finish(); return; diff --git a/android/app/src/main/java/com/reactnativenavigation/params/StyleParams.java b/android/app/src/main/java/com/reactnativenavigation/params/StyleParams.java index 24337a173c7..8a905b45f95 100644 --- a/android/app/src/main/java/com/reactnativenavigation/params/StyleParams.java +++ b/android/app/src/main/java/com/reactnativenavigation/params/StyleParams.java @@ -48,6 +48,11 @@ public String getHexColor() { public int getColor(int defaultColor) { return hasColor() ? getColor() : defaultColor; } + + @Override + public String toString() { + return this.getHexColor(); + } } public static class Font { @@ -84,6 +89,7 @@ public String toString() { public StatusBarTextColorScheme statusBarTextColorScheme; public Color statusBarColor; public boolean statusBarHidden; + public boolean drawUnderStatusBar; public Color contextualMenuStatusBarColor; public Color contextualMenuButtonsColor; public Color contextualMenuBackgroundColor; @@ -119,6 +125,7 @@ public String toString() { public Font titleBarButtonFontFamily; public Color topTabTextColor; + public Font topTabTextFontFamily; public Color topTabIconColor; public Color selectedTopTabTextColor; public Color selectedTopTabIconColor; diff --git a/android/app/src/main/java/com/reactnativenavigation/params/parsers/StyleParamsParser.java b/android/app/src/main/java/com/reactnativenavigation/params/parsers/StyleParamsParser.java index c4a1eab69c7..1e052ec171b 100644 --- a/android/app/src/main/java/com/reactnativenavigation/params/parsers/StyleParamsParser.java +++ b/android/app/src/main/java/com/reactnativenavigation/params/parsers/StyleParamsParser.java @@ -32,6 +32,7 @@ public StyleParams parse() { result.statusBarColor = getColor("statusBarColor", getDefaultStatusBarColor()); result.statusBarHidden = getBoolean("statusBarHidden", getDefaultStatusHidden()); result.statusBarTextColorScheme = StatusBarTextColorScheme.fromString(params.getString("statusBarTextColorScheme"), getDefaultStatusBarTextColorScheme()); + result.drawUnderStatusBar = params.getBoolean("drawUnderStatusBar", getDefaultDrawUnderStatusBar()); result.contextualMenuStatusBarColor = getColor("contextualMenuStatusBarColor", getDefaultContextualMenuStatusBarColor()); result.contextualMenuButtonsColor = getColor("contextualMenuButtonsColor", getDefaultContextualMenuButtonsColor()); result.contextualMenuBackgroundColor = getColor("contextualMenuBackgroundColor", getDefaultContextualMenuBackgroundColor()); @@ -70,6 +71,7 @@ public StyleParams parse() { result.topTabsHidden = getBoolean("topTabsHidden", getDefaultTopTabsHidden()); result.topTabTextColor = getColor("topTabTextColor", getDefaultTopTabTextColor()); + result.topTabTextFontFamily = getFont("topTabTextFontFamily", getDefaultTopTabTextFontFamily()); result.topTabIconColor = getColor("topTabIconColor", getDefaultTopTabIconColor()); result.selectedTopTabIconColor = getColor("selectedTopTabIconColor", getDefaultSelectedTopTabIconColor()); result.selectedTopTabTextColor = getColor("selectedTopTabTextColor", getDefaultSelectedTopTabTextColor()); @@ -124,6 +126,7 @@ private StyleParams createDefaultStyleParams() { result.titleBarTitleFont = new StyleParams.Font(); result.titleBarSubtitleFontFamily = new StyleParams.Font(); result.titleBarButtonFontFamily = new StyleParams.Font(); + result.topTabTextFontFamily = new StyleParams.Font(); result.titleBarHeight = -1; result.screenAnimationType = "slide-up"; return result; @@ -281,6 +284,10 @@ private boolean getDefaultStatusHidden() { return AppStyle.appStyle != null && AppStyle.appStyle.statusBarHidden; } + private boolean getDefaultDrawUnderStatusBar() { + return AppStyle.appStyle != null && AppStyle.appStyle.drawUnderStatusBar; + } + private StyleParams.Font getDefaultBottomTabsFontFamily() { return AppStyle.appStyle == null ? new StyleParams.Font() : AppStyle.appStyle.bottomTabFontFamily; } @@ -301,6 +308,10 @@ private StyleParams.Font getDefaultSubtitleFontFamily() { return AppStyle.appStyle == null ? new StyleParams.Font() : AppStyle.appStyle.titleBarSubtitleFontFamily; } + private StyleParams.Font getDefaultTopTabTextFontFamily() { + return AppStyle.appStyle == null ? new StyleParams.Font() : AppStyle.appStyle.topTabTextFontFamily; + } + private StyleParams.Font getDefaultTitleBarButtonFont() { return AppStyle.appStyle == null ? new StyleParams.Font() : AppStyle.appStyle.titleBarButtonFontFamily; } diff --git a/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java b/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java index 0f8b67882fa..010212e6ad6 100644 --- a/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java +++ b/android/app/src/main/java/com/reactnativenavigation/screens/Screen.java @@ -62,6 +62,7 @@ public Screen(AppCompatActivity activity, ScreenParams screenParams, LeftButtonO createViews(); EventBus.instance.register(this); sharedElements = new SharedElements(); + setDrawUnderStatusBar(styleParams.drawUnderStatusBar); } public void registerSharedElement(SharedElementTransition toView, String key) { @@ -106,6 +107,7 @@ public void setStyle() { setStatusBarHidden(styleParams.statusBarHidden); setStatusBarTextColorScheme(styleParams.statusBarTextColorScheme); setNavigationBarColor(styleParams.navigationBarColor); + setDrawUnderStatusBar(styleParams.drawUnderStatusBar); topBar.setStyle(styleParams); if (styleParams.screenBackgroundColor.hasColor()) { setBackgroundColor(styleParams.screenBackgroundColor.getColor()); @@ -174,6 +176,10 @@ private void setStatusBarHidden(boolean statusBarHidden) { StatusBar.setHidden(((NavigationActivity) activity).getScreenWindow(), statusBarHidden); } + private void setDrawUnderStatusBar(boolean drawUnderStatusBar) { + StatusBar.displayOverScreen(this, drawUnderStatusBar); + } + private void setStatusBarTextColorScheme(StatusBarTextColorScheme textColorScheme) { StatusBar.setTextColorScheme(this, textColorScheme); } diff --git a/android/app/src/main/java/com/reactnativenavigation/utils/StatusBar.java b/android/app/src/main/java/com/reactnativenavigation/utils/StatusBar.java index d5f3f07096b..af907d44bf4 100644 --- a/android/app/src/main/java/com/reactnativenavigation/utils/StatusBar.java +++ b/android/app/src/main/java/com/reactnativenavigation/utils/StatusBar.java @@ -30,6 +30,23 @@ public static void setColor(Window window, StyleParams.Color statusBarColor) { } } + @TargetApi(Build.VERSION_CODES.LOLLIPOP) + public static void displayOverScreen(View view, boolean shouldDisplay) { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) return; + + if(shouldDisplay) { + int flags = view.getSystemUiVisibility(); + flags |= View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + flags |= View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + view.setSystemUiVisibility(flags); + } else { + int flags = view.getSystemUiVisibility(); + flags &= ~View.SYSTEM_UI_FLAG_LAYOUT_STABLE; + flags &= ~View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN; + view.setSystemUiVisibility(flags); + } + } + @TargetApi(Build.VERSION_CODES.M) public static void setTextColorScheme(View view, StatusBarTextColorScheme textColorScheme) { if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return; diff --git a/android/app/src/main/java/com/reactnativenavigation/views/ContentView.java b/android/app/src/main/java/com/reactnativenavigation/views/ContentView.java index 6d3c7b36e9e..978d7734a2a 100644 --- a/android/app/src/main/java/com/reactnativenavigation/views/ContentView.java +++ b/android/app/src/main/java/com/reactnativenavigation/views/ContentView.java @@ -66,9 +66,13 @@ public void unmountReactView() { @Override protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { - super.onMeasure(widthMeasureSpec, heightMeasureSpec); - int measuredHeight = viewMeasurer.getMeasuredHeight(heightMeasureSpec); - setMeasuredDimension(viewMeasurer.getMeasuredWidth(widthMeasureSpec), measuredHeight); + int widthSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(widthMeasureSpec), MeasureSpec.AT_MOST); + int heightSpec = MeasureSpec.makeMeasureSpec(MeasureSpec.getSize(heightMeasureSpec), MeasureSpec.AT_MOST); + + super.onMeasure(widthSpec, heightSpec); + + int measuredHeight = viewMeasurer.getMeasuredHeight(heightSpec); + setMeasuredDimension(viewMeasurer.getMeasuredWidth(widthSpec), measuredHeight); } @Override diff --git a/android/app/src/main/java/com/reactnativenavigation/views/TitleBarButton.java b/android/app/src/main/java/com/reactnativenavigation/views/TitleBarButton.java index 3487a915647..61384948e39 100644 --- a/android/app/src/main/java/com/reactnativenavigation/views/TitleBarButton.java +++ b/android/app/src/main/java/com/reactnativenavigation/views/TitleBarButton.java @@ -114,7 +114,7 @@ private void setFont() { @NonNull private ArrayList findActualTextViewInMenuByLabel() { ArrayList outViews = new ArrayList<>(); - parent.findViewsWithText(outViews, buttonParams.label, View.FIND_VIEWS_WITH_CONTENT_DESCRIPTION); + parent.findViewsWithText(outViews, buttonParams.label, View.FIND_VIEWS_WITH_TEXT); return outViews; } diff --git a/android/app/src/main/java/com/reactnativenavigation/views/TopBar.java b/android/app/src/main/java/com/reactnativenavigation/views/TopBar.java index 22834bb8c95..dfda98caa99 100644 --- a/android/app/src/main/java/com/reactnativenavigation/views/TopBar.java +++ b/android/app/src/main/java/com/reactnativenavigation/views/TopBar.java @@ -213,6 +213,7 @@ private void setTopTabsStyle(StyleParams style) { topTabs.setTopTabsTextColor(style); topTabs.setSelectedTabIndicatorStyle(style); topTabs.setScrollable(style); + topTabs.setTopTabsTextFontFamily(style); } public void showContextualMenu(final ContextualMenuParams params, StyleParams styleParams, Callback onButtonClicked) { diff --git a/android/app/src/main/java/com/reactnativenavigation/views/TopTabs.java b/android/app/src/main/java/com/reactnativenavigation/views/TopTabs.java index 77d68d90a8d..456b2f9bcb4 100644 --- a/android/app/src/main/java/com/reactnativenavigation/views/TopTabs.java +++ b/android/app/src/main/java/com/reactnativenavigation/views/TopTabs.java @@ -2,7 +2,11 @@ import android.content.Context; import android.content.res.ColorStateList; +import android.graphics.Typeface; import android.support.design.widget.TabLayout; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; import com.reactnativenavigation.params.StyleParams; import com.reactnativenavigation.views.utils.TopTabsIconColorHelper; @@ -39,6 +43,24 @@ void setTopTabsTextColor(StyleParams style) { setTabTextColors(tabTextColor, selectedTabColor); } + void setTopTabsTextFontFamily(StyleParams style) { + if (style.topTabTextFontFamily.hasFont()) { + ViewGroup viewGroup = (ViewGroup) this.getChildAt(0); + + for (int tab = 0; tab < viewGroup.getChildCount(); tab++) { + ViewGroup tabViewGroup = (ViewGroup) viewGroup.getChildAt(tab); + + for (int i = 0; i < tabViewGroup.getChildCount(); i++) { + View tabViewChild = tabViewGroup.getChildAt(i); + if (tabViewChild instanceof TextView) { + ((TextView) tabViewChild).setTypeface( + style.topTabTextFontFamily.get(), Typeface.NORMAL); + } + } + } + } + } + void setScrollable(StyleParams style) { if (style.topTabsScrollable) { setTabMode(TabLayout.MODE_SCROLLABLE); diff --git a/docs/styling-the-navigator.md b/docs/styling-the-navigator.md index e2b5b7cfbba..9888ac1defa 100644 --- a/docs/styling-the-navigator.md +++ b/docs/styling-the-navigator.md @@ -101,6 +101,7 @@ this.props.navigator.setStyle({ navBarButtonFontFamily: 'sans-serif-thin', // Change the font family of textual buttons topBarElevationShadowEnabled: false, // default: true. Disables TopBar elevation shadow on Lolipop and above statusBarColor: '#000000', // change the color of the status bar. + drawUnderStatusBar: false, // default: false, will draw the screen underneath the statusbar. Useful togheter with statusBarColor: transparent collapsingToolBarImage: "http://lorempixel.com/400/200/", // Collapsing Toolbar image. collapsingToolBarImage: require('../../img/topbar.jpg'), // Collapsing Toolbar image. Either use a url or require a local image. collapsingToolBarCollapsedColor: '#0f2362', // Collapsing Toolbar scrim color. diff --git a/docs/top-level-api.md b/docs/top-level-api.md index e7792fe8fc3..863f452a360 100644 --- a/docs/top-level-api.md +++ b/docs/top-level-api.md @@ -75,7 +75,7 @@ Navigation.startTabBasedApp({      drawerShadow: true, // optional, add this if you want a side menu drawer shadow      contentOverlayColor: 'rgba(0,0,0,0.25)', // optional, add this if you want a overlay color when drawer is open leftDrawerWidth: 50, // optional, add this if you want a define left drawer width (50=percent) - rightDrawerWidth: 50 // optional, add this if you want a define right drawer width (50=percent) + rightDrawerWidth: 50, // optional, add this if you want a define right drawer width (50=percent) shouldStretchDrawer: true // optional, iOS only with 'MMDrawer' type, whether or not the panning gesture will “hard-stop” at the maximum width for a given drawer side, default : true }, type: 'MMDrawer', // optional, iOS only, types: 'TheSideBar', 'MMDrawer' default: 'MMDrawer' diff --git a/example/src/screens/types/TopTabs.js b/example/src/screens/types/TopTabs.js index a8b06874b87..70454eca4c4 100644 --- a/example/src/screens/types/TopTabs.js +++ b/example/src/screens/types/TopTabs.js @@ -4,6 +4,7 @@ import {PixelRatio} from 'react-native'; class TopTabs extends React.Component { static navigatorStyle = { topTabTextColor: '#ffffff', + topTabTextFontFamily: 'BioRhyme-Bold', selectedTopTabTextColor: '#ff505c', // Icons diff --git a/ios/RCCNavigationController.m b/ios/RCCNavigationController.m index bbf0e534559..36602d27f21 100755 --- a/ios/RCCNavigationController.m +++ b/ios/RCCNavigationController.m @@ -172,6 +172,8 @@ - (void)performAction:(NSString*)performAction actionParams:(NSDictionary*)actio if ([self.topViewController isKindOfClass:[RCCViewController class]]) { RCCViewController *topViewController = ((RCCViewController*)self.topViewController); + topViewController.previewController = nil; + [topViewController.navigationController unregisterForPreviewingWithContext:topViewController.previewContext]; viewController.previewActions = previewActions; viewController.previewCommit = actionParams[@"previewCommit"] ? [actionParams[@"previewCommit"] boolValue] : YES; NSNumber *previewHeight = actionParams[@"previewHeight"]; @@ -184,7 +186,7 @@ - (void)performAction:(NSString*)performAction actionParams:(NSDictionary*)actio [bridge.uiManager addUIBlock:^(__unused RCTUIManager *uiManager, NSDictionary *viewRegistry) { UIView *view = viewRegistry[previewViewID]; topViewController.previewView = view; - [topViewController registerForPreviewingWithDelegate:(id)topViewController sourceView:view]; + topViewController.previewContext = [topViewController registerForPreviewingWithDelegate:(id)topViewController sourceView:view]; }]; }); topViewController.previewController = viewController; @@ -257,7 +259,7 @@ - (void)performAction:(NSString*)performAction actionParams:(NSDictionary*)actio if (!component) return; NSMutableDictionary *passProps = [actionParams[@"passProps"] mutableCopy]; - passProps[@"commantType"] = @"resetTo"; + passProps[@"commandType"] = @"resetTo"; NSDictionary *navigatorStyle = actionParams[@"style"]; RCCViewController *viewController = [[RCCViewController alloc] initWithComponent:component passProps:passProps navigatorStyle:navigatorStyle globalProps:nil bridge:bridge]; diff --git a/ios/RCCViewController.h b/ios/RCCViewController.h index 27ca96d415a..5b35a755756 100755 --- a/ios/RCCViewController.h +++ b/ios/RCCViewController.h @@ -22,6 +22,7 @@ extern NSString* const RCCViewControllerCancelReactTouchesNotification; @property (nonatomic) UIView *previewView; @property (nonatomic) NSArray *previewActions; @property (nonatomic) BOOL previewCommit; +@property (nonatomic) id previewContext; + (UIViewController*)controllerWithLayout:(NSDictionary *)layout globalProps:(NSDictionary *)globalProps bridge:(RCTBridge *)bridge; diff --git a/src/deprecated/platformSpecificDeprecated.android.js b/src/deprecated/platformSpecificDeprecated.android.js index f1f5818c8d7..0ee116d489a 100644 --- a/src/deprecated/platformSpecificDeprecated.android.js +++ b/src/deprecated/platformSpecificDeprecated.android.js @@ -80,6 +80,12 @@ function navigatorPush(navigator, params) { adapted = adaptNavigationParams(adapted); adapted.overrideBackPress = params.overrideBackPress; adapted.timestamp = Date.now(); + if (!adapted.passProps) { + adapted.passProps = {}; + } + if (!adapted.passProps.commandType) { + adapted.passProps.commandType = 'Push'; + } return newPlatformSpecific.push(adapted); } @@ -143,6 +149,7 @@ function convertStyleParams(originalStyleObject) { statusBarColor: processColor(originalStyleObject.statusBarColor), statusBarHidden: originalStyleObject.statusBarHidden, statusBarTextColorScheme: originalStyleObject.statusBarTextColorScheme, + drawUnderStatusBar: originalStyleObject.drawUnderStatusBar || false, topBarReactView: originalStyleObject.navBarCustomView, topBarReactViewAlignment: originalStyleObject.navBarComponentAlignment, topBarReactViewInitialProps: originalStyleObject.navBarCustomViewInitialProps, @@ -183,6 +190,7 @@ function convertStyleParams(originalStyleObject) { drawBelowTopBar: !originalStyleObject.drawUnderNavBar, topTabTextColor: processColor(originalStyleObject.topTabTextColor), + topTabTextFontFamily: originalStyleObject.topTabTextFontFamily, topTabIconColor: processColor(originalStyleObject.topTabIconColor), selectedTopTabIconColor: processColor(originalStyleObject.selectedTopTabIconColor), selectedTopTabTextColor: processColor(originalStyleObject.selectedTopTabTextColor), @@ -472,6 +480,12 @@ function showModal(params) { adapted = adaptNavigationParams(adapted); adapted.overrideBackPress = params.overrideBackPress; adapted.timestamp = Date.now(); + if (!adapted.passProps) { + adapted.passProps = {}; + } + if (!adapted.passProps.commandType) { + adapted.passProps.commandType = 'ShowModal'; + } newPlatformSpecific.showModal(adapted); }