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 @@ -3,11 +3,13 @@ package com.reactnativenavigation
import androidx.annotation.VisibleForTesting

enum class RNNToggles {
TOP_BAR_COLOR_ANIMATION,
TOP_BAR_COLOR_ANIMATION__PUSH,
TOP_BAR_COLOR_ANIMATION__TABS,
}

private val ToggleDefaults = mapOf(
RNNToggles.TOP_BAR_COLOR_ANIMATION to false
RNNToggles.TOP_BAR_COLOR_ANIMATION__PUSH to false,
RNNToggles.TOP_BAR_COLOR_ANIMATION__TABS to false,
)

object RNNFeatureToggles {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@
import android.annotation.TargetApi;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Color;
import android.os.Build;
import android.os.Bundle;
import android.view.KeyEvent;
Expand All @@ -12,8 +11,8 @@
import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
import com.facebook.react.modules.core.PermissionAwareActivity;
import com.facebook.react.modules.core.PermissionListener;
import com.reactnativenavigation.options.Options;
import com.reactnativenavigation.viewcontrollers.overlay.OverlayManager;
import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter;
import com.reactnativenavigation.viewcontrollers.viewcontroller.RootPresenter;
import com.reactnativenavigation.react.JsDevReloadHandler;
import com.reactnativenavigation.react.ReactGateway;
Expand Down Expand Up @@ -51,6 +50,7 @@ protected void onCreate(@Nullable Bundle savedInstanceState) {
navigator.bindViews();
getReactGateway().onActivityCreated(this);
setBackPressedCallback();
StatusBarPresenter.Companion.init(this);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
package com.reactnativenavigation.utils;

import android.graphics.Color;

public class ColorUtils {
public static double[] colorToLAB(int color) {
final double[] result = new double[3];
Expand All @@ -10,4 +12,13 @@ public static double[] colorToLAB(int color) {
public static int labToColor(double[] lab) {
return androidx.core.graphics.ColorUtils.LABToColor(lab[0], lab[1], lab[2]);
}

public static boolean isColorLight(int color) {
double darkness = 1 - (0.299 * Color.red(color) + 0.587 * Color.green(color) + 0.114 * Color.blue(color)) / 255;
return darkness < 0.5;
}

public static int setAlpha(int color, int alpha) {
return (color & 0x00FFFFFF) | (alpha << 24);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package com.reactnativenavigation.utils
import android.app.Activity
import android.graphics.Color
import android.graphics.Rect
import android.os.Build
import android.view.View
import android.view.Window
import androidx.annotation.ColorInt
Expand All @@ -16,7 +15,6 @@ import kotlin.math.ceil

object SystemUiUtils {
private const val STATUS_BAR_HEIGHT_M = 24
private const val STATUS_BAR_HEIGHT_L = 25
internal const val STATUS_BAR_HEIGHT_TRANSLUCENCY = 0.65f
private var statusBarHeight = -1
var navigationBarDefaultColor = -1
Expand All @@ -38,7 +36,7 @@ object SystemUiUtils {
val contentViewTop = contentView.top
abs(contentViewTop - statusBarHeight)
}
} ?: if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) STATUS_BAR_HEIGHT_M else STATUS_BAR_HEIGHT_L
} ?: STATUS_BAR_HEIGHT_M
statusBarHeight
}
return res
Expand Down Expand Up @@ -77,8 +75,6 @@ object SystemUiUtils {

@JvmStatic
fun setStatusBarColorScheme(window: Window?, view: View, isDark: Boolean) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return

window?.let {
WindowInsetsControllerCompat(window, view).isAppearanceLightStatusBars = isDark
// Workaround: on devices with api 30 status bar icons flickers or get hidden when removing view
Expand Down Expand Up @@ -121,18 +117,17 @@ object SystemUiUtils {
@ColorInt color: Int,
translucent: Boolean
) {
val opaqueColor =
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
Color.BLACK
} else {
val colorAlpha = Color.alpha(color)
val alpha = if (translucent && colorAlpha == 255) STATUS_BAR_HEIGHT_TRANSLUCENCY else colorAlpha/255.0f
val red: Int = Color.red(color)
val green: Int = Color.green(color)
val blue: Int = Color.blue(color)
Color.argb(ceil(alpha * 255).toInt(), red, green, blue)
}
window?.statusBarColor = opaqueColor
val colorAlpha = Color.alpha(color)
val alpha = if (translucent && colorAlpha == 255) STATUS_BAR_HEIGHT_TRANSLUCENCY else colorAlpha/255.0f
val red: Int = Color.red(color)
val green: Int = Color.green(color)
val blue: Int = Color.blue(color)
val opaqueColor = Color.argb(ceil(alpha * 255).toInt(), red, green, blue)
setStatusBarColor(window, opaqueColor)
}

fun setStatusBarColor(window: Window?, color: Int) {
window?.statusBarColor = color
}

@JvmStatic
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@

import androidx.annotation.NonNull;

import com.aurelhubert.ahbottomnavigation.AHTextView;
import com.aurelhubert.ahbottomnavigation.notification.AHNotification;
import com.reactnativenavigation.options.BottomTabOptions;
import com.reactnativenavigation.options.DotIndicatorOptions;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -271,11 +271,11 @@ public void selectTab(final int newIndex) {
private void selectTab(int newIndex, boolean enableSelectionHistory) {
saveTabSelection(newIndex, enableSelectionHistory);
tabsAttacher.onTabSelected(tabs.get(newIndex));
getCurrentView().setVisibility(View.INVISIBLE);
getCurrentChild().onDeselected();

ViewController<?> previouslyVisible = getCurrentChild();
bottomTabs.setCurrentItem(newIndex, false);
getCurrentView().setVisibility(View.VISIBLE);
getCurrentChild().onViewWillAppear();
getCurrentChild().onViewDidAppear();
getCurrentChild().onSelected(previouslyVisible);
}

private void saveTabSelection(int newIndex, boolean enableSelectionHistory) {
Expand All @@ -287,11 +287,6 @@ private void saveTabSelection(int newIndex, boolean enableSelectionHistory) {
}
}

@NonNull
private ViewGroup getCurrentView() {
return tabs.get(bottomTabs.getCurrentItem()).getView();
}

public Animator getPushAnimation(Options appearingOptions) {
return presenter.getPushAnimation(appearingOptions);
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
package com.reactnativenavigation.viewcontrollers.component;

import android.animation.Animator;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;

import com.reactnativenavigation.options.Options;
import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter;
import com.reactnativenavigation.views.component.ComponentLayout;

public class ComponentPresenter extends ComponentPresenterBase {
Expand Down Expand Up @@ -35,4 +41,16 @@ public void onConfigurationChanged(ComponentLayout view, Options options) {
Options withDefault = options.withDefaultOptions(defaultOptions);
setBackgroundColor(view, withDefault);
}

@Nullable
public Animator getStatusBarPushAnimation(@NonNull Options appearingOptions) {
Options appearingOptionsWithDefault = appearingOptions.copy().withDefaultOptions(defaultOptions);
return StatusBarPresenter.instance.getStatusBarPushAnimation(appearingOptionsWithDefault);
}

@Nullable
public Animator getStatusBarPopAnimation(@NonNull Options appearingOptions, @NonNull Options disappearingOptions) {
Options appearingOptionsWithDefault = appearingOptions.copy().withDefaultOptions(defaultOptions);
return StatusBarPresenter.instance.getStatusBarPopAnimation(appearingOptionsWithDefault, disappearingOptions);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@
import com.reactnativenavigation.utils.SystemUiUtils;
import com.reactnativenavigation.viewcontrollers.child.ChildController;
import com.reactnativenavigation.viewcontrollers.child.ChildControllersRegistry;
import com.reactnativenavigation.viewcontrollers.stack.statusbar.StatusBarController;
import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
import com.reactnativenavigation.viewcontrollers.viewcontroller.ReactViewCreator;
import com.reactnativenavigation.viewcontrollers.viewcontroller.ScrollEventListener;
import com.reactnativenavigation.views.component.ComponentLayout;

public class ComponentViewController extends ChildController<ComponentLayout> implements StatusBarController {
public class ComponentViewController extends ChildController<ComponentLayout> {
private final String componentName;
private final ComponentPresenter presenter;
private final ReactViewCreator viewCreator;
Expand Down Expand Up @@ -65,27 +64,16 @@ public void setDefaultOptions(Options defaultOptions) {
presenter.setDefaultOptions(defaultOptions);
}

@Override
public StatusBarController getStatusBarController() {
return this;
}

@Nullable
@Override
public Animator getStatusBarPushAnimation(@NonNull Options appearingOptions) {
if (super.presenter != null) {
return super.presenter.getStatusBarPushAnimation(appearingOptions);
}
return null;
public Animator getPushAnimations(Options appearingOptions) {
return this.presenter.getStatusBarPushAnimation(appearingOptions);
}

@Nullable
@Override
public Animator getStatusBarPopAnimation(@NonNull Options appearingOptions, @NonNull Options disappearingOptions) {
if (super.presenter != null) {
return super.presenter.getStatusBarPopAnimation(appearingOptions, disappearingOptions);
}
return null;
public Animator getPopAnimations(Options appearingOptions, Options disappearingOptions) {
return this.presenter.getStatusBarPopAnimation(appearingOptions, disappearingOptions);
}

@Override
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,23 @@
package com.reactnativenavigation.viewcontrollers.stack;

import static com.reactnativenavigation.react.Constants.HARDWARE_BACK_BUTTON_ID;
import static com.reactnativenavigation.utils.CollectionUtils.requireLast;
import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.matchParentWithBehaviour;
import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.updateBottomMargin;
import static com.reactnativenavigation.utils.ObjectUtils.perform;

import android.app.Activity;
import android.content.res.Configuration;
import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.Size;
import androidx.annotation.VisibleForTesting;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.viewpager.widget.ViewPager;

import com.facebook.react.ReactRootView;
import com.reactnativenavigation.options.ButtonOptions;
import com.reactnativenavigation.options.Options;
Expand All @@ -18,7 +31,9 @@
import com.reactnativenavigation.viewcontrollers.stack.topbar.TopBarController;
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.BackButtonHelper;
import com.reactnativenavigation.viewcontrollers.viewcontroller.Presenter;
import com.reactnativenavigation.viewcontrollers.viewcontroller.TopBarVisibilityInfo;
import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewControllerVisibilityInfo;
import com.reactnativenavigation.views.component.Component;
import com.reactnativenavigation.views.stack.StackBehaviour;
import com.reactnativenavigation.views.stack.StackLayout;
Expand All @@ -31,19 +46,6 @@
import java.util.Iterator;
import java.util.List;

import androidx.annotation.NonNull;
import androidx.annotation.RestrictTo;
import androidx.annotation.Size;
import androidx.annotation.VisibleForTesting;
import androidx.coordinatorlayout.widget.CoordinatorLayout;
import androidx.viewpager.widget.ViewPager;

import static com.reactnativenavigation.react.Constants.HARDWARE_BACK_BUTTON_ID;
import static com.reactnativenavigation.utils.CollectionUtils.*;
import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.matchParentWithBehaviour;
import static com.reactnativenavigation.utils.CoordinatorLayoutUtils.updateBottomMargin;
import static com.reactnativenavigation.utils.ObjectUtils.perform;

public class StackController extends ParentController<StackLayout> {

private IdStack<ViewController<?>> stack = new IdStack<>();
Expand Down Expand Up @@ -95,6 +97,19 @@ public ViewController<?> getCurrentChild() {
return stack.peek();
}

@Override
public void onSelected(ViewController<?> previousVC) {
presenter.bindNewViewController(previousVC, this);
super.onSelected(previousVC);
}

@NonNull
@Override
public ViewControllerVisibilityInfo getVisibilityInfo() {
TopBarVisibilityInfo topBarInfo = topBarController.getVisibilityInfo();
return new ViewControllerVisibilityInfo(topBarInfo);
}

@Override
public void onAttachToParent() {
if (!isEmpty() && !getCurrentChild().isDestroyed() && !isViewShown()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.ButtonPresenter;
import com.reactnativenavigation.viewcontrollers.stack.topbar.button.IconResolver;
import com.reactnativenavigation.viewcontrollers.stack.topbar.title.TitleBarReactViewController;
import com.reactnativenavigation.viewcontrollers.statusbar.StatusBarPresenter;
import com.reactnativenavigation.viewcontrollers.viewcontroller.IReactView;
import com.reactnativenavigation.viewcontrollers.viewcontroller.ViewController;
import com.reactnativenavigation.views.stack.topbar.TopBar;
Expand Down Expand Up @@ -191,6 +192,12 @@ public void onChildDestroyed(ViewController<?> child) {
componentLeftButtons.remove(child.getView());
}

public void bindNewViewController(ViewController<?> previousVC, ViewController<?> newVC) {
Options options = newVC.resolveCurrentOptions(defaultOptions);
topBarController.bindNewViewController(previousVC, newVC);
StatusBarPresenter.instance.bindViewController(options.statusBar);
}

private void destroyButtons(@Nullable Map<String, ButtonController> buttons) {
if (buttons != null)
forEach(buttons.values(), ViewController::destroy);
Expand Down Expand Up @@ -423,17 +430,17 @@ public List<Animator> getAdditionalPushAnimations(
Options appearingOptions) {
return CollectionUtils.asList(
topBarController.getPushAnimation(appearingOptions, getTopBarTranslationAnimationDelta(stack, appearingCtrl)),
perform(appearingCtrl.getStatusBarController(), null, sbc -> sbc.getStatusBarPushAnimation(appearingOptions)),
perform(bottomTabsController, null, btc -> btc.getPushAnimation(appearingOptions))
);
perform(appearingCtrl, null, vc -> vc.getPushAnimations(appearingOptions)),
perform(bottomTabsController, null, btc -> btc.getPushAnimation(appearingOptions)
));
}

public List<Animator> getAdditionalPopAnimations(Options appearingOptions, Options disappearingOptions, ViewController<?> appearingCtrl) {
return CollectionUtils.asList(
topBarController.getPopAnimation(appearingOptions, disappearingOptions),
perform(appearingCtrl.getStatusBarController(), null, sbc -> sbc.getStatusBarPopAnimation(appearingOptions, disappearingOptions)),
perform(bottomTabsController, null, btc -> btc.getPopAnimation(appearingOptions, disappearingOptions))
);
perform(appearingCtrl, null, vc -> vc.getPopAnimations(appearingOptions, disappearingOptions)),
perform(bottomTabsController, null, btc -> btc.getPopAnimation(appearingOptions, disappearingOptions)
));
}

public List<Animator> getAdditionalSetRootAnimations(StackController stack, ViewController<?> appearing,
Expand Down

This file was deleted.

This file was deleted.

Loading
Loading