Sfoglia il codice sorgente

Apply layoutDirection to buttons container

For some reason layout direction isn't propagated to subviews correctly in the Wix app.
This commit is mostly a workaround, it sets the layout direction on the ViewGroup containing TopBar buttons
so that they appear in the right order in RTL.
Guy Carmeli 5 anni fa
parent
commit
14b5221caa

+ 11
- 2
lib/android/app/src/main/java/com/reactnativenavigation/views/titlebar/TitleBar.java Vedi File

@@ -6,8 +6,6 @@ import android.graphics.PorterDuff;
6 6
 import android.graphics.PorterDuffColorFilter;
7 7
 import android.graphics.Typeface;
8 8
 import android.graphics.drawable.Drawable;
9
-import androidx.appcompat.widget.ActionMenuView;
10
-import androidx.appcompat.widget.Toolbar;
11 9
 import android.util.Log;
12 10
 import android.view.View;
13 11
 import android.view.ViewGroup;
@@ -24,7 +22,12 @@ import java.util.List;
24 22
 
25 23
 import javax.annotation.Nullable;
26 24
 
25
+import androidx.appcompat.widget.ActionMenuView;
26
+import androidx.appcompat.widget.Toolbar;
27
+
28
+import static com.reactnativenavigation.utils.ObjectUtils.perform;
27 29
 import static com.reactnativenavigation.utils.UiUtils.runOnPreDrawOnce;
30
+import static com.reactnativenavigation.utils.ViewUtils.findChildByClass;
28 31
 
29 32
 @SuppressLint("ViewConstructor")
30 33
 public class TitleBar extends Toolbar {
@@ -140,6 +143,12 @@ public class TitleBar extends Toolbar {
140 143
         }
141 144
     }
142 145
 
146
+    @Override
147
+    public void setLayoutDirection(int layoutDirection) {
148
+        super.setLayoutDirection(layoutDirection);
149
+        perform(findChildByClass(this, ActionMenuView.class), buttonsContainer -> buttonsContainer.setLayoutDirection(layoutDirection));
150
+    }
151
+
143 152
     @Nullable
144 153
     public TextView findTitleTextView() {
145 154
         List<TextView> children = ViewUtils.findChildrenByClass(this, TextView.class, textView -> textView.getText().equals(getTitle()));

+ 13
- 0
lib/android/app/src/test/java/com/reactnativenavigation/TestUtils.java Vedi File

@@ -2,6 +2,8 @@ package com.reactnativenavigation;
2 2
 
3 3
 import android.app.Activity;
4 4
 import android.content.Context;
5
+import android.view.View;
6
+import android.view.ViewGroup;
5 7
 
6 8
 import com.reactnativenavigation.mocks.TitleBarReactViewCreatorMock;
7 9
 import com.reactnativenavigation.mocks.TopBarBackgroundViewCreatorMock;
@@ -19,6 +21,8 @@ import com.reactnativenavigation.viewcontrollers.topbar.TopBarController;
19 21
 import com.reactnativenavigation.views.StackLayout;
20 22
 import com.reactnativenavigation.views.topbar.TopBar;
21 23
 
24
+import org.mockito.Mockito;
25
+
22 26
 public class TestUtils {
23 27
     public static StackControllerBuilder newStackController(Activity activity) {
24 28
         TopBarController topBarController = new TopBarController() {
@@ -40,4 +44,13 @@ public class TestUtils {
40 44
     public static void hideBackButton(ViewController viewController) {
41 45
         viewController.options.topBar.buttons.back.visible = new Bool(false);
42 46
     }
47
+
48
+    public static <T extends View> T spyOn(T child) {
49
+        ViewGroup parent = (ViewGroup) child.getParent();
50
+        int indexOf = parent.indexOfChild(child);
51
+        parent.removeView(child);
52
+        T spy = Mockito.spy(child);
53
+        parent.addView(spy, indexOf);
54
+        return spy;
55
+    }
43 56
 }

+ 14
- 1
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/TitleBarTest.java Vedi File

@@ -1,11 +1,11 @@
1 1
 package com.reactnativenavigation.viewcontrollers;
2 2
 
3 3
 import android.app.Activity;
4
-import androidx.appcompat.widget.ActionMenuView;
5 4
 import android.view.View;
6 5
 import android.widget.TextView;
7 6
 
8 7
 import com.reactnativenavigation.BaseTest;
8
+import com.reactnativenavigation.TestUtils;
9 9
 import com.reactnativenavigation.parse.params.Button;
10 10
 import com.reactnativenavigation.parse.params.Text;
11 11
 import com.reactnativenavigation.react.Constants;
@@ -21,7 +21,11 @@ import java.util.Arrays;
21 21
 import java.util.Collections;
22 22
 import java.util.List;
23 23
 
24
+import androidx.appcompat.widget.ActionMenuView;
25
+
26
+import static com.reactnativenavigation.utils.Assertions.assertNotNull;
24 27
 import static com.reactnativenavigation.utils.TitleBarHelper.createButtonController;
28
+import static com.reactnativenavigation.utils.ViewUtils.findChildByClass;
25 29
 import static org.assertj.core.api.Java6Assertions.assertThat;
26 30
 import static org.mockito.Mockito.any;
27 31
 import static org.mockito.Mockito.eq;
@@ -140,6 +144,15 @@ public class TitleBarTest extends BaseTest {
140 144
         verify(uut).removeView(title);
141 145
     }
142 146
 
147
+    @Test
148
+    public void setLayoutDirection_directionIsExplicitlyAppliedToButtonsContainer() {
149
+        ActionMenuView buttonsContainer = findChildByClass(uut, ActionMenuView.class);
150
+        assertNotNull(buttonsContainer);
151
+        ActionMenuView spy = TestUtils.spyOn(buttonsContainer);
152
+        uut.setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
153
+        verify(spy).setLayoutDirection(View.LAYOUT_DIRECTION_RTL);
154
+    }
155
+
143 156
     private List<TitleBarButtonController> leftButton(Button leftButton) {
144 157
         return Collections.singletonList(createButtonController(activity, uut, leftButton));
145 158
     }