Browse 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 5 years ago
parent
commit
ecdb691640
No account linked to committer's email address

+ 6
- 15
lib/android/app/src/main/java/com/reactnativenavigation/presentation/BottomTabsPresenter.java View File

10
 import com.reactnativenavigation.parse.AnimationsOptions;
10
 import com.reactnativenavigation.parse.AnimationsOptions;
11
 import com.reactnativenavigation.parse.BottomTabsOptions;
11
 import com.reactnativenavigation.parse.BottomTabsOptions;
12
 import com.reactnativenavigation.parse.Options;
12
 import com.reactnativenavigation.parse.Options;
13
-import com.reactnativenavigation.utils.UiUtils;
14
 import com.reactnativenavigation.viewcontrollers.ViewController;
13
 import com.reactnativenavigation.viewcontrollers.ViewController;
15
 import com.reactnativenavigation.viewcontrollers.bottomtabs.BottomTabFinder;
14
 import com.reactnativenavigation.viewcontrollers.bottomtabs.BottomTabFinder;
16
 import com.reactnativenavigation.viewcontrollers.bottomtabs.TabSelector;
15
 import com.reactnativenavigation.viewcontrollers.bottomtabs.TabSelector;
19
 
18
 
20
 import java.util.List;
19
 import java.util.List;
21
 
20
 
21
+import static com.reactnativenavigation.utils.ViewUtils.getHeight;
22
+
22
 public class BottomTabsPresenter {
23
 public class BottomTabsPresenter {
23
     private final BottomTabFinder bottomTabFinder;
24
     private final BottomTabFinder bottomTabFinder;
24
     private final List<ViewController> tabs;
25
     private final List<ViewController> tabs;
111
         MarginLayoutParams lp = (MarginLayoutParams) tab.getLayoutParams();
112
         MarginLayoutParams lp = (MarginLayoutParams) tab.getLayoutParams();
112
         if (options.drawBehind.isTrue()) {
113
         if (options.drawBehind.isTrue()) {
113
             lp.bottomMargin = 0;
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
         MarginLayoutParams lp = (MarginLayoutParams) tab.getLayoutParams();
122
         MarginLayoutParams lp = (MarginLayoutParams) tab.getLayoutParams();
127
         if (options.drawBehind.isTrue()) {
123
         if (options.drawBehind.isTrue()) {
128
             lp.bottomMargin = 0;
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 View File

27
 import java.util.List;
27
 import java.util.List;
28
 
28
 
29
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
29
 import static android.view.ViewGroup.LayoutParams.MATCH_PARENT;
30
-import static android.view.ViewGroup.LayoutParams.WRAP_CONTENT;
31
 import static android.widget.RelativeLayout.ALIGN_PARENT_BOTTOM;
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
 public class BottomTabsController extends ParentController implements AHBottomNavigation.OnTabSelectedListener, TabSelector {
35
 public class BottomTabsController extends ParentController implements AHBottomNavigation.OnTabSelectedListener, TabSelector {
36
 
36
 
69
         presenter.bindView(bottomTabs, this);
69
         presenter.bindView(bottomTabs, this);
70
         tabPresenter.bindView(bottomTabs);
70
         tabPresenter.bindView(bottomTabs);
71
         bottomTabs.setOnTabSelectedListener(this);
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
 		lp.addRule(ALIGN_PARENT_BOTTOM);
73
 		lp.addRule(ALIGN_PARENT_BOTTOM);
74
 		root.addView(bottomTabs, lp);
74
 		root.addView(bottomTabs, lp);
75
 		bottomTabs.addItems(createTabs());
75
 		bottomTabs.addItems(createTabs());

+ 0
- 1
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/bottomtabs/BottomTabsControllerTest.java View File

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