From 002b7d8f331019f79421e7cd28bab9bf411d73e4 Mon Sep 17 00:00:00 2001 From: Guy Carmeli Date: Wed, 20 Nov 2019 10:34:41 +0200 Subject: [PATCH] DrawBehind when tabs are hidden (#5663) When BottomTabs are hidden, draw components behind the tabs even if drawBehind isn't set to true explicitly. --- .../parse/BottomTabsOptions.java | 4 ++ .../viewcontrollers/ChildController.java | 2 +- .../bottomtabs/BottomTabsController.java | 2 +- .../mocks/SimpleViewController.java | 8 +++- .../bottomtabs/BottomTabsControllerTest.java | 39 ++++++++++++++++--- 5 files changed, 46 insertions(+), 9 deletions(-) diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabsOptions.java b/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabsOptions.java index 2a9d03a8810..2e8eb8c150d 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabsOptions.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/parse/BottomTabsOptions.java @@ -79,6 +79,10 @@ void mergeWithDefault(final BottomTabsOptions defaultOptions) { if (!tabsAttachMode.hasValue()) tabsAttachMode = defaultOptions.tabsAttachMode; } + public boolean isHiddenOrDrawBehind() { + return visible.isFalse() || drawBehind.isTrue(); + } + public void clearOneTimeOptions() { currentTabId = new NullText(); currentTabIndex = new NullNumber(); diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ChildController.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ChildController.java index 717f2390ae5..d4ee2b60fcf 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ChildController.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/ChildController.java @@ -71,8 +71,8 @@ public void applyOptions(Options options) { public void mergeOptions(Options options) { if (options == Options.EMPTY) return; if (isViewShown()) presenter.mergeOptions(getView(), options); - performOnParentController(parentController -> parentController.mergeChildOptions(options, this)); super.mergeOptions(options); + performOnParentController(parentController -> parentController.mergeChildOptions(options, this)); } @Override diff --git a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java index d91e4c44a11..68fb9501f42 100644 --- a/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java +++ b/lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java @@ -177,7 +177,7 @@ public boolean onMeasureChild(CoordinatorLayout parent, ViewGroup child, int par @Override public int getBottomInset(ViewController child) { - int bottomTabsInset = resolveChildOptions(child).bottomTabsOptions.drawBehind.isTrue() ? 0 : bottomTabs.getHeight(); + int bottomTabsInset = resolveChildOptions(child).bottomTabsOptions.isHiddenOrDrawBehind() ? 0 : bottomTabs.getHeight(); return bottomTabsInset + perform(getParentController(), 0, p -> p.getBottomInset(this)); } diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java b/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java index 9a3058fe402..2709fb65b83 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java +++ b/lib/android/app/src/test/java/com/reactnativenavigation/mocks/SimpleViewController.java @@ -7,6 +7,7 @@ import com.facebook.react.ReactInstanceManager; import com.reactnativenavigation.interfaces.ScrollEventListener; import com.reactnativenavigation.parse.Options; +import com.reactnativenavigation.presentation.ComponentPresenterBase; import com.reactnativenavigation.presentation.Presenter; import com.reactnativenavigation.react.ReactView; import com.reactnativenavigation.viewcontrollers.ChildController; @@ -20,7 +21,7 @@ import static com.reactnativenavigation.utils.ObjectUtils.perform; public class SimpleViewController extends ChildController { - + private ComponentPresenterBase presenter = new ComponentPresenterBase(); public SimpleViewController(Activity activity, ChildControllersRegistry childRegistry, String id, Options options) { this(activity, childRegistry, id, new Presenter(activity, new Options()), options); @@ -58,6 +59,11 @@ public int getTopInset() { return statusBarInset + perform(getParentController(), 0, p -> p.getTopInset(this)); } + @Override + public void applyBottomInset() { + if (view != null) presenter.applyBottomInset(view, getBottomInset()); + } + public static class SimpleView extends ReactView implements ReactComponent { public SimpleView(@NonNull Context context) { diff --git a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java index 7cf09511acb..37a6cee2828 100644 --- a/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java +++ b/lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java @@ -4,6 +4,7 @@ import android.graphics.Color; import android.view.Gravity; import android.view.View; +import android.view.ViewGroup.MarginLayoutParams; import com.reactnativenavigation.BaseTest; import com.reactnativenavigation.TestUtils; @@ -27,6 +28,7 @@ import com.reactnativenavigation.viewcontrollers.ViewController; import com.reactnativenavigation.viewcontrollers.stack.StackController; import com.reactnativenavigation.views.BottomTabs; +import com.reactnativenavigation.views.bottomtabs.BottomTabsLayout; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -84,7 +86,7 @@ public void superCreateItems() { child1 = spy(new SimpleViewController(activity, childRegistry, "child1", tabOptions)); child2 = spy(new SimpleViewController(activity, childRegistry, "child2", tabOptions)); child3 = spy(new SimpleViewController(activity, childRegistry, "child3", tabOptions)); - child4 = spy(createStack("someStack")); + child4 = spy(createStack()); child5 = spy(new SimpleViewController(activity, childRegistry, "child5", tabOptions)); when(child5.handleBack(any())).thenReturn(true); tabs = createTabs(); @@ -208,17 +210,34 @@ public void mergeOptions_currentTabIndex() { @Test public void mergeOptions_drawBehind() { - assertThat(uut.getBottomInset()).isEqualTo(uut.getBottomTabs().getHeight()); + assertThat(uut.getBottomInset(child1)).isEqualTo(uut.getBottomTabs().getHeight()); Options o1 = new Options(); o1.bottomTabsOptions.drawBehind = new Bool(true); child1.mergeOptions(o1); - assertThat(uut.getBottomInset()).isEqualTo(0); + assertThat(uut.getBottomInset(child1)).isEqualTo(0); Options o2 = new Options(); o2.topBar.title.text = new Text("Some text"); child1.mergeOptions(o1); - assertThat(uut.getBottomInset()).isEqualTo(0); + assertThat(uut.getBottomInset(child1)).isEqualTo(0); + } + + @Test + public void mergeOptions_drawBehind_stack() { + uut.selectTab(3); + + SimpleViewController stackChild = new SimpleViewController(activity, childRegistry, "stackChild", new Options()); + disablePushAnimation(stackChild); + child4.push(stackChild, new CommandListenerAdapter()); + + assertThat(((MarginLayoutParams) stackChild.getView().getLayoutParams()).bottomMargin).isEqualTo(bottomTabs.getHeight()); + + Options o1 = new Options(); + o1.bottomTabsOptions.drawBehind = new Bool(true); + stackChild.mergeOptions(o1); + + assertThat(((MarginLayoutParams) stackChild.getView().getLayoutParams()).bottomMargin).isEqualTo(0); } @Test @@ -369,9 +388,9 @@ private List createTabs() { return Arrays.asList(child1, child2, child3, child4, child5); } - private StackController createStack(String id) { + private StackController createStack() { return TestUtils.newStackController(activity) - .setId(id) + .setId("someStack") .setInitialOptions(tabOptions) .build(); } @@ -401,6 +420,14 @@ public void ensureViewIsCreated() { uut.getView().layout(0, 0, 1000, 1000); } + @NonNull + @Override + protected BottomTabsLayout createView() { + BottomTabsLayout view = super.createView(); + bottomTabs.getLayoutParams().height = 100; + return view; + } + @NonNull @Override protected BottomTabs createBottomTabs() {