Skip to content

Commit

Permalink
[V3] Android: re-add support for navigationBarColor (#5547)
Browse files Browse the repository at this point in the history
Add support for NavigationBar color on Android
  • Loading branch information
mcuelenaere authored and guyca committed Oct 31, 2019
1 parent f1dc46d commit 8af95da
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 1 deletion.
10 changes: 9 additions & 1 deletion docs/docs/options-migration.md
Original file line number Diff line number Diff line change
Expand Up @@ -540,6 +540,15 @@ statusBar: {
}
```

## navigationBarColor
NavigationBar color

```js
navigationBar: {
backgroundColor: 'red'
}
```

## drawUnderStatusBar
Draw content behind the StatusBar

Expand Down Expand Up @@ -603,7 +612,6 @@ topBar: {
* topBarShadowOffset
* topBarShadowRadius
* preferredContentSize
* navigationBarColor
* navBarSubTitleTextCentered
* collapsingToolBarImage
* collapsingToolBarCollapsedColor
Expand Down
3 changes: 3 additions & 0 deletions docs/docs/styling.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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"));
Expand All @@ -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();
Expand All @@ -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);
Expand All @@ -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);
Expand All @@ -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);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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;
Expand Down

0 comments on commit 8af95da

Please sign in to comment.