Browse Source

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 years ago
parent
commit
14b5221caa

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

6
 import android.graphics.PorterDuffColorFilter;
6
 import android.graphics.PorterDuffColorFilter;
7
 import android.graphics.Typeface;
7
 import android.graphics.Typeface;
8
 import android.graphics.drawable.Drawable;
8
 import android.graphics.drawable.Drawable;
9
-import androidx.appcompat.widget.ActionMenuView;
10
-import androidx.appcompat.widget.Toolbar;
11
 import android.util.Log;
9
 import android.util.Log;
12
 import android.view.View;
10
 import android.view.View;
13
 import android.view.ViewGroup;
11
 import android.view.ViewGroup;
24
 
22
 
25
 import javax.annotation.Nullable;
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
 import static com.reactnativenavigation.utils.UiUtils.runOnPreDrawOnce;
29
 import static com.reactnativenavigation.utils.UiUtils.runOnPreDrawOnce;
30
+import static com.reactnativenavigation.utils.ViewUtils.findChildByClass;
28
 
31
 
29
 @SuppressLint("ViewConstructor")
32
 @SuppressLint("ViewConstructor")
30
 public class TitleBar extends Toolbar {
33
 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
     @Nullable
152
     @Nullable
144
     public TextView findTitleTextView() {
153
     public TextView findTitleTextView() {
145
         List<TextView> children = ViewUtils.findChildrenByClass(this, TextView.class, textView -> textView.getText().equals(getTitle()));
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 View File

2
 
2
 
3
 import android.app.Activity;
3
 import android.app.Activity;
4
 import android.content.Context;
4
 import android.content.Context;
5
+import android.view.View;
6
+import android.view.ViewGroup;
5
 
7
 
6
 import com.reactnativenavigation.mocks.TitleBarReactViewCreatorMock;
8
 import com.reactnativenavigation.mocks.TitleBarReactViewCreatorMock;
7
 import com.reactnativenavigation.mocks.TopBarBackgroundViewCreatorMock;
9
 import com.reactnativenavigation.mocks.TopBarBackgroundViewCreatorMock;
19
 import com.reactnativenavigation.views.StackLayout;
21
 import com.reactnativenavigation.views.StackLayout;
20
 import com.reactnativenavigation.views.topbar.TopBar;
22
 import com.reactnativenavigation.views.topbar.TopBar;
21
 
23
 
24
+import org.mockito.Mockito;
25
+
22
 public class TestUtils {
26
 public class TestUtils {
23
     public static StackControllerBuilder newStackController(Activity activity) {
27
     public static StackControllerBuilder newStackController(Activity activity) {
24
         TopBarController topBarController = new TopBarController() {
28
         TopBarController topBarController = new TopBarController() {
40
     public static void hideBackButton(ViewController viewController) {
44
     public static void hideBackButton(ViewController viewController) {
41
         viewController.options.topBar.buttons.back.visible = new Bool(false);
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 View File

1
 package com.reactnativenavigation.viewcontrollers;
1
 package com.reactnativenavigation.viewcontrollers;
2
 
2
 
3
 import android.app.Activity;
3
 import android.app.Activity;
4
-import androidx.appcompat.widget.ActionMenuView;
5
 import android.view.View;
4
 import android.view.View;
6
 import android.widget.TextView;
5
 import android.widget.TextView;
7
 
6
 
8
 import com.reactnativenavigation.BaseTest;
7
 import com.reactnativenavigation.BaseTest;
8
+import com.reactnativenavigation.TestUtils;
9
 import com.reactnativenavigation.parse.params.Button;
9
 import com.reactnativenavigation.parse.params.Button;
10
 import com.reactnativenavigation.parse.params.Text;
10
 import com.reactnativenavigation.parse.params.Text;
11
 import com.reactnativenavigation.react.Constants;
11
 import com.reactnativenavigation.react.Constants;
21
 import java.util.Collections;
21
 import java.util.Collections;
22
 import java.util.List;
22
 import java.util.List;
23
 
23
 
24
+import androidx.appcompat.widget.ActionMenuView;
25
+
26
+import static com.reactnativenavigation.utils.Assertions.assertNotNull;
24
 import static com.reactnativenavigation.utils.TitleBarHelper.createButtonController;
27
 import static com.reactnativenavigation.utils.TitleBarHelper.createButtonController;
28
+import static com.reactnativenavigation.utils.ViewUtils.findChildByClass;
25
 import static org.assertj.core.api.Java6Assertions.assertThat;
29
 import static org.assertj.core.api.Java6Assertions.assertThat;
26
 import static org.mockito.Mockito.any;
30
 import static org.mockito.Mockito.any;
27
 import static org.mockito.Mockito.eq;
31
 import static org.mockito.Mockito.eq;
140
         verify(uut).removeView(title);
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
     private List<TitleBarButtonController> leftButton(Button leftButton) {
156
     private List<TitleBarButtonController> leftButton(Button leftButton) {
144
         return Collections.singletonList(createButtonController(activity, uut, leftButton));
157
         return Collections.singletonList(createButtonController(activity, uut, leftButton));
145
     }
158
     }