diff --git a/docs/docs/options-migration.md b/docs/docs/options-migration.md index 23e211d8b3e..1863cd618df 100644 --- a/docs/docs/options-migration.md +++ b/docs/docs/options-migration.md @@ -540,6 +540,15 @@ statusBar: { } ``` +## navigationBarColor +NavigationBar color + +```js +navigationBar: { + backgroundColor: 'red' +} +``` + ## drawUnderStatusBar Draw content behind the StatusBar @@ -603,7 +612,6 @@ topBar: { * topBarShadowOffset * topBarShadowRadius * preferredContentSize -* navigationBarColor * navBarSubTitleTextCentered * collapsingToolBarImage * collapsingToolBarCollapsedColor diff --git a/docs/docs/styling.md b/docs/docs/styling.md index 76b13193df9..8e1b291b54f 100644 --- a/docs/docs/styling.md +++ b/docs/docs/styling.md @@ -258,6 +258,9 @@ Navigation.mergeOptions(this.props.componentId, { drawBehind: true, visible: false }, + navigationBar: { + backgroundColor: 'red', + }, layout: { topMargin: (await Navigation.constants()).statusBarHeight, // Set the layout's top margin orientation: ['portrait', 'landscape'] | ['sensorLandscape'], // An array of supported orientations diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/parse/NavigationBarOptions.java b/lib/android/app/src/main/java/com/reactnativenavigation/parse/NavigationBarOptions.java new file mode 100644 index 00000000000..0d920cb92a6 --- /dev/null +++ b/lib/android/app/src/main/java/com/reactnativenavigation/parse/NavigationBarOptions.java @@ -0,0 +1,28 @@ +package com.reactnativenavigation.parse; + +import com.reactnativenavigation.parse.params.Colour; +import com.reactnativenavigation.parse.params.NullColor; +import com.reactnativenavigation.parse.parsers.ColorParser; + +import org.json.JSONObject; + +public class NavigationBarOptions { + public static NavigationBarOptions parse(JSONObject json) { + NavigationBarOptions result = new NavigationBarOptions(); + if (json == null) return result; + + result.backgroundColor = ColorParser.parse(json, "backgroundColor"); + + return result; + } + + public Colour backgroundColor = new NullColor(); + + public void mergeWith(NavigationBarOptions other) { + if (other.backgroundColor.hasValue()) backgroundColor = other.backgroundColor; + } + + public void mergeWithDefault(NavigationBarOptions defaultOptions) { + if (!backgroundColor.hasValue()) backgroundColor = defaultOptions.backgroundColor; + } +} \ No newline at end of file diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/parse/Options.java b/lib/android/app/src/main/java/com/reactnativenavigation/parse/Options.java index e8f572748ff..a0a8fd2ad54 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/parse/Options.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/parse/Options.java @@ -27,6 +27,7 @@ public static Options parse(TypefaceLoader typefaceManager, JSONObject json) { result.sideMenuRootOptions = SideMenuRootOptions.parse(json.optJSONObject("sideMenu")); result.animations = AnimationsOptions.parse(json.optJSONObject("animations")); result.modal = ModalOptions.parse(json); + result.navigationBar = NavigationBarOptions.parse(json.optJSONObject("navigationBar")); result.statusBar = StatusBarOptions.parse(json.optJSONObject("statusBar")); result.layout = LayoutOptions.parse(json.optJSONObject("layout")); result.transitions = Transitions.parse(json.optJSONObject("customTransition")); @@ -44,6 +45,7 @@ public static Options parse(TypefaceLoader typefaceManager, JSONObject json) { @NonNull public AnimationsOptions animations = new AnimationsOptions(); @NonNull public SideMenuRootOptions sideMenuRootOptions = new SideMenuRootOptions(); @NonNull public ModalOptions modal = new ModalOptions(); + @NonNull public NavigationBarOptions navigationBar = new NavigationBarOptions(); @NonNull public StatusBarOptions statusBar = new StatusBarOptions(); @NonNull public LayoutOptions layout = new LayoutOptions(); @NonNull public Transitions transitions = new Transitions(); @@ -65,6 +67,7 @@ public Options copy() { result.sideMenuRootOptions.mergeWith(sideMenuRootOptions); result.animations.mergeWith(animations); result.modal.mergeWith(modal); + result.navigationBar.mergeWith(navigationBar); result.statusBar.mergeWith(statusBar); result.layout.mergeWith(layout); result.transitions.mergeWith(transitions); @@ -83,6 +86,7 @@ public Options mergeWith(final Options other) { result.animations.mergeWith(other.animations); result.sideMenuRootOptions.mergeWith(other.sideMenuRootOptions); result.modal.mergeWith(other.modal); + result.navigationBar.mergeWith(other.navigationBar); result.statusBar.mergeWith(other.statusBar); result.layout.mergeWith(other.layout); result.transitions.mergeWith(transitions); @@ -99,6 +103,7 @@ public Options withDefaultOptions(final Options defaultOptions) { animations.mergeWithDefault(defaultOptions.animations); sideMenuRootOptions.mergeWithDefault(defaultOptions.sideMenuRootOptions); modal.mergeWithDefault(defaultOptions.modal); + navigationBar.mergeWithDefault(defaultOptions.navigationBar); statusBar.mergeWithDefault(defaultOptions.statusBar); layout.mergeWithDefault(defaultOptions.layout); transitions.mergeWithDefault(defaultOptions.transitions); diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/presentation/Presenter.java b/lib/android/app/src/main/java/com/reactnativenavigation/presentation/Presenter.java index 2427cf76e43..926fb0af838 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/presentation/Presenter.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/presentation/Presenter.java @@ -10,6 +10,7 @@ import android.view.ViewGroup.MarginLayoutParams; import android.view.Window; +import com.reactnativenavigation.parse.NavigationBarOptions; import com.reactnativenavigation.parse.Options; import com.reactnativenavigation.parse.OrientationOptions; import com.reactnativenavigation.parse.StatusBarOptions; @@ -84,6 +85,7 @@ private void applyBackgroundColor(ViewController view, Options options) { } private void applyStatusBarOptions(Options options) { + setNavigationBarBackgroundColor(options.navigationBar); setStatusBarBackgroundColor(options.statusBar); setTextColorScheme(options.statusBar.textColorScheme); setTranslucent(options.statusBar); @@ -117,6 +119,13 @@ private void setStatusBarBackgroundColor(StatusBarOptions statusBar) { } } + private void setNavigationBarBackgroundColor(NavigationBarOptions navigationBar) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP && navigationBar.backgroundColor.canApplyValue()) { + int defaultColor = activity.getWindow().getNavigationBarColor(); + activity.getWindow().setNavigationBarColor(navigationBar.backgroundColor.get(defaultColor)); + } + } + private void setTextColorScheme(TextColorScheme scheme) { final View view = activity.getWindow().getDecorView(); if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return;