Parcourir la source

Fix rare race condition when applying bottomTabs.drawBehind (#5326)

When setting BottomTabs root, if one of the children was a stack with multiple children
and the top child in the stack had `drawBehind: true` while the bottom child had `drawBehind: false`,
sometimes the tabs' bottomMargin would be wrong since it was applied in onPreDraw.
Guy Carmeli il y a 5 ans
Parent
révision
ecdb691640
No account linked to committer's email address

+ 6
- 15
lib/android/app/src/main/java/com/reactnativenavigation/presentation/BottomTabsPresenter.java Voir le fichier

@@ -10,7 +10,6 @@ import com.reactnativenavigation.anim.BottomTabsAnimator;
10 10
 import com.reactnativenavigation.parse.AnimationsOptions;
11 11
 import com.reactnativenavigation.parse.BottomTabsOptions;
12 12
 import com.reactnativenavigation.parse.Options;
13
-import com.reactnativenavigation.utils.UiUtils;
14 13
 import com.reactnativenavigation.viewcontrollers.ViewController;
15 14
 import com.reactnativenavigation.viewcontrollers.bottomtabs.BottomTabFinder;
16 15
 import com.reactnativenavigation.viewcontrollers.bottomtabs.TabSelector;
@@ -19,6 +18,8 @@ import com.reactnativenavigation.views.Component;
19 18
 
20 19
 import java.util.List;
21 20
 
21
+import static com.reactnativenavigation.utils.ViewUtils.getHeight;
22
+
22 23
 public class BottomTabsPresenter {
23 24
     private final BottomTabFinder bottomTabFinder;
24 25
     private final List<ViewController> tabs;
@@ -111,13 +112,8 @@ public class BottomTabsPresenter {
111 112
         MarginLayoutParams lp = (MarginLayoutParams) tab.getLayoutParams();
112 113
         if (options.drawBehind.isTrue()) {
113 114
             lp.bottomMargin = 0;
114
-        }
115
-        if (options.visible.isTrueOrUndefined() && options.drawBehind.isFalseOrUndefined()) {
116
-            if (bottomTabs.getHeight() == 0) {
117
-                UiUtils.runOnPreDrawOnce(bottomTabs, () -> lp.bottomMargin = bottomTabs.getHeight());
118
-            } else {
119
-                lp.bottomMargin = bottomTabs.getHeight();
120
-            }
115
+        } else if (options.visible.isTrueOrUndefined()) {
116
+            lp.bottomMargin = getHeight(bottomTabs);
121 117
         }
122 118
     }
123 119
 
@@ -126,13 +122,8 @@ public class BottomTabsPresenter {
126 122
         MarginLayoutParams lp = (MarginLayoutParams) tab.getLayoutParams();
127 123
         if (options.drawBehind.isTrue()) {
128 124
             lp.bottomMargin = 0;
129
-        }
130
-        if (options.visible.isTrue() && options.drawBehind.isFalse()) {
131
-            if (bottomTabs.getHeight() == 0) {
132
-                UiUtils.runOnPreDrawOnce(bottomTabs, () -> lp.bottomMargin = bottomTabs.getHeight());
133
-            } else {
134
-                lp.bottomMargin = bottomTabs.getHeight();
135
-            }
125
+        } else if (options.visible.isTrue() && options.drawBehind.isFalse()) {
126
+            lp.bottomMargin = getHeight(bottomTabs);
136 127
         }
137 128
     }
138 129
 

+ 4
- 4
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsController.java Voir le fichier

@@ -27,10 +27,10 @@ import java.util.Collection;
27 27
 import java.util.List;
28 28
 
29 29
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
30
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
31 30
 import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
32
-import static com.reactnativenavigation.utils.CollectionUtils.forEach;
33
-import static com.reactnativenavigation.utils.CollectionUtils.map;
31
+import static com.reactnativenavigation.react.Constants.BOTTOM_TABS_HEIGHT;
32
+import static com.reactnativenavigation.utils.CollectionUtils.*;
33
+import static com.reactnativenavigation.utils.UiUtils.dpToPx;
34 34
 
35 35
 public class BottomTabsController extends ParentController implements AHBottomNavigation.OnTabSelectedListener, TabSelector {
36 36
 
@@ -69,7 +69,7 @@ public class BottomTabsController extends ParentController implements AHBottomNa
69 69
         presenter.bindView(bottomTabs, this);
70 70
         tabPresenter.bindView(bottomTabs);
71 71
         bottomTabs.setOnTabSelectedListener(this);
72
-		RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, WRAP_CONTENT);
72
+		RelativeLayout.LayoutParams lp = new RelativeLayout.LayoutParams(MATCH_PARENT, dpToPx(getActivity(), BOTTOM_TABS_HEIGHT));
73 73
 		lp.addRule(ALIGN_PARENT_BOTTOM);
74 74
 		root.addView(bottomTabs, lp);
75 75
 		bottomTabs.addItems(createTabs());

+ 0
- 1
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java Voir le fichier

@@ -402,7 +402,6 @@ public class BottomTabsControllerTest extends BaseTest {
402 402
             public void ensureViewIsCreated() {
403 403
                 super.ensureViewIsCreated();
404 404
                 uut.getView().layout(0, 0, 1000, 1000);
405
-                uut.getBottomTabs().layout(0, 0, 1000, 100);
406 405
             }
407 406
 
408 407
             @NonNull