Browse Source

Refactor TitleBarReactView

Manage the view with controller which handles lifecycle
Guy Carmeli 6 years ago
parent
commit
a14d6f9636

+ 6
- 0
e2e/ScreenStyle.test.js View File

127
     await elementById(testIDs.TAB_BASED_APP_BUTTON).tap();
127
     await elementById(testIDs.TAB_BASED_APP_BUTTON).tap();
128
     await expect(elementById(testIDs.TOP_BAR_ELEMENT)).toBeVisible();
128
     await expect(elementById(testIDs.TOP_BAR_ELEMENT)).toBeVisible();
129
   });
129
   });
130
+
131
+  it('set title component', async () => {
132
+    await elementById(testIDs.PUSH_OPTIONS_BUTTON).tap();
133
+    await elementById(testIDs.SHOW_TOPBAR_REACT_VIEW).tap();
134
+    await expect(elementByLabel('Press Me')).toBeVisible();
135
+  });
130
 });
136
 });

+ 2
- 2
lib/android/app/src/main/java/com/reactnativenavigation/presentation/OptionsPresenter.java View File

38
 
38
 
39
     private void applyTopBarOptions(TopBarOptions options, AnimationsOptions animationOptions, Component component) {
39
     private void applyTopBarOptions(TopBarOptions options, AnimationsOptions animationOptions, Component component) {
40
         if (options.title.text.hasValue()) topBar.setTitle(options.title.text.get());
40
         if (options.title.text.hasValue()) topBar.setTitle(options.title.text.get());
41
-        if (options.title.component.hasValue()) topBar.setComponent(options.title.component.get(), options.title.alignment);
41
+        if (options.title.component.hasValue()) topBar.setTitleComponent(options.title.component.get(), options.title.alignment);
42
         topBar.setBackgroundColor(options.background.color);
42
         topBar.setBackgroundColor(options.background.color);
43
         topBar.setBackgroundComponent(options.background.component);
43
         topBar.setBackgroundComponent(options.background.component);
44
         topBar.setTitleTextColor(options.title.color);
44
         topBar.setTitleTextColor(options.title.color);
121
 
121
 
122
     private void mergeTopBarOptions(TopBarOptions options, AnimationsOptions animationsOptions, Component component) {
122
     private void mergeTopBarOptions(TopBarOptions options, AnimationsOptions animationsOptions, Component component) {
123
         if (options.title.text.hasValue()) topBar.setTitle(options.title.text.get());
123
         if (options.title.text.hasValue()) topBar.setTitle(options.title.text.get());
124
-        if (options.title.component.hasValue()) topBar.setComponent(options.title.component.get(), options.title.alignment);
124
+        if (options.title.component.hasValue()) topBar.setTitleComponent(options.title.component.get(), options.title.alignment);
125
         if (options.background.color.hasValue()) topBar.setBackgroundColor(options.background.color);
125
         if (options.background.color.hasValue()) topBar.setBackgroundColor(options.background.color);
126
         if (options.title.color.hasValue()) topBar.setTitleTextColor(options.title.color);
126
         if (options.title.color.hasValue()) topBar.setTitleTextColor(options.title.color);
127
         if (options.title.fontSize.hasValue()) topBar.setTitleFontSize(options.title.fontSize);
127
         if (options.title.fontSize.hasValue()) topBar.setTitleFontSize(options.title.fontSize);

+ 6
- 4
lib/android/app/src/main/java/com/reactnativenavigation/viewcontrollers/TitleBarReactViewController.java View File

12
     private final TitleBarReactViewCreator reactViewCreator;
12
     private final TitleBarReactViewCreator reactViewCreator;
13
     private String componentName;
13
     private String componentName;
14
 
14
 
15
-    public TitleBarReactViewController(TitleBarReactViewController reactViewController) {
16
-        this(reactViewController.getActivity(), reactViewController.reactViewCreator);
17
-    }
18
-
19
     public TitleBarReactViewController(Activity activity, TitleBarReactViewCreator reactViewCreator) {
15
     public TitleBarReactViewController(Activity activity, TitleBarReactViewCreator reactViewCreator) {
20
         super(activity, CompatUtils.generateViewId() + "", new Options());
16
         super(activity, CompatUtils.generateViewId() + "", new Options());
21
         this.reactViewCreator = reactViewCreator;
17
         this.reactViewCreator = reactViewCreator;
22
     }
18
     }
23
 
19
 
20
+    @Override
21
+    public void onViewAppeared() {
22
+        super.onViewAppeared();
23
+        runOnPreDraw(view -> view.setLayoutParams(view.getLayoutParams()));
24
+    }
25
+
24
     @Override
26
     @Override
25
     protected TitleBarReactView createView() {
27
     protected TitleBarReactView createView() {
26
         return reactViewCreator.create(getActivity(), getId(), componentName);
28
         return reactViewCreator.create(getActivity(), getId(), componentName);

+ 2
- 3
lib/android/app/src/main/java/com/reactnativenavigation/views/TopBar.java View File

26
 import com.reactnativenavigation.parse.params.Text;
26
 import com.reactnativenavigation.parse.params.Text;
27
 import com.reactnativenavigation.utils.CompatUtils;
27
 import com.reactnativenavigation.utils.CompatUtils;
28
 import com.reactnativenavigation.viewcontrollers.ReactViewCreator;
28
 import com.reactnativenavigation.viewcontrollers.ReactViewCreator;
29
-import com.reactnativenavigation.viewcontrollers.TitleBarReactViewController;
30
 import com.reactnativenavigation.viewcontrollers.TopBarButtonController;
29
 import com.reactnativenavigation.viewcontrollers.TopBarButtonController;
31
 import com.reactnativenavigation.views.titlebar.TitleBar;
30
 import com.reactnativenavigation.views.titlebar.TitleBar;
32
 import com.reactnativenavigation.views.titlebar.TitleBarReactViewCreator;
31
 import com.reactnativenavigation.views.titlebar.TitleBarReactViewCreator;
71
     protected TitleBar createTitleBar(Context context, ReactViewCreator buttonCreator, TitleBarReactViewCreator reactViewCreator, TopBarButtonController.OnClickListener onClickListener) {
70
     protected TitleBar createTitleBar(Context context, ReactViewCreator buttonCreator, TitleBarReactViewCreator reactViewCreator, TopBarButtonController.OnClickListener onClickListener) {
72
         return new TitleBar(context,
71
         return new TitleBar(context,
73
                 buttonCreator,
72
                 buttonCreator,
74
-                new TitleBarReactViewController((Activity) context, reactViewCreator),
73
+                reactViewCreator,
75
                 onClickListener
74
                 onClickListener
76
         );
75
         );
77
     }
76
     }
100
         titleBar.setTitleTypeface(typeface);
99
         titleBar.setTitleTypeface(typeface);
101
     }
100
     }
102
 
101
 
103
-    public void setComponent(String componentName, TitleOptions.Alignment alignment) {
102
+    public void setTitleComponent(String componentName, TitleOptions.Alignment alignment) {
104
         titleBar.setComponent(componentName, alignment);
103
         titleBar.setComponent(componentName, alignment);
105
     }
104
     }
106
 
105
 

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

30
 public class TitleBar extends Toolbar {
30
 public class TitleBar extends Toolbar {
31
     private final ReactViewCreator buttonCreator;
31
     private final ReactViewCreator buttonCreator;
32
     private TitleBarReactViewController reactViewController;
32
     private TitleBarReactViewController reactViewController;
33
+    private final TitleBarReactViewCreator reactViewCreator;
33
     private final TopBarButtonController.OnClickListener onClickListener;
34
     private final TopBarButtonController.OnClickListener onClickListener;
34
     private final List<TopBarButtonController> rightButtonControllers = new ArrayList<>();
35
     private final List<TopBarButtonController> rightButtonControllers = new ArrayList<>();
35
     private TopBarButtonController leftButtonController;
36
     private TopBarButtonController leftButtonController;
36
 
37
 
37
-    public TitleBar(Context context, ReactViewCreator buttonCreator, TitleBarReactViewController reactViewController, TopBarButtonController.OnClickListener onClickListener) {
38
+    public TitleBar(Context context, ReactViewCreator buttonCreator, TitleBarReactViewCreator reactViewCreator, TopBarButtonController.OnClickListener onClickListener) {
38
         super(context);
39
         super(context);
39
         this.buttonCreator = buttonCreator;
40
         this.buttonCreator = buttonCreator;
40
-        this.reactViewController = reactViewController;
41
+        this.reactViewCreator = reactViewCreator;
42
+        reactViewController = new TitleBarReactViewController((Activity) context, reactViewCreator);
41
         this.onClickListener = onClickListener;
43
         this.onClickListener = onClickListener;
42
         getMenu();
44
         getMenu();
43
         setContentDescription("titleBar");
45
         setContentDescription("titleBar");
61
         clearTitle();
63
         clearTitle();
62
         reactViewController.setComponent(componentName);
64
         reactViewController.setComponent(componentName);
63
         addView(reactViewController.getView(), getComponentLayoutParams(alignment));
65
         addView(reactViewController.getView(), getComponentLayoutParams(alignment));
64
-        requestLayout();
65
     }
66
     }
66
 
67
 
67
     public void setBackgroundColor(Color color) {
68
     public void setBackgroundColor(Color color) {
99
 
100
 
100
     private void clearComponent() {
101
     private void clearComponent() {
101
         reactViewController.destroy();
102
         reactViewController.destroy();
102
-        reactViewController = new TitleBarReactViewController(reactViewController);
103
+        reactViewController = new TitleBarReactViewController((Activity) getContext(), reactViewCreator);
103
     }
104
     }
104
 
105
 
105
     private void clearLeftButton() {
106
     private void clearLeftButton() {

+ 1
- 1
lib/android/app/src/main/java/com/reactnativenavigation/views/titlebar/TitleBarReactView.java View File

16
     @Override
16
     @Override
17
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
17
     protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
18
         super.onMeasure(
18
         super.onMeasure(
19
-                getChildCount() > 0 ? MeasureSpec.makeMeasureSpec(getChildAt(0).getWidth(), MeasureSpec.EXACTLY) : widthMeasureSpec,
19
+                (getChildCount() > 0 && getChildAt(0).getWidth() > 0) ? MeasureSpec.makeMeasureSpec(getChildAt(0).getWidth(), MeasureSpec.EXACTLY) : widthMeasureSpec,
20
                 heightMeasureSpec
20
                 heightMeasureSpec
21
         );
21
         );
22
     }
22
     }

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

137
 
137
 
138
     private void assertTopBarOptions(int t) {
138
     private void assertTopBarOptions(int t) {
139
         verify(topBar, times(t)).setTitle(any());
139
         verify(topBar, times(t)).setTitle(any());
140
-        verify(topBar, times(t)).setComponent(any(), any());
140
+        verify(topBar, times(t)).setTitleComponent(any(), any());
141
         verify(topBar, times(t)).setBackgroundColor(any());
141
         verify(topBar, times(t)).setBackgroundColor(any());
142
         verify(topBar, times(t)).setTitleTextColor(any());
142
         verify(topBar, times(t)).setTitleTextColor(any());
143
         verify(topBar, times(t)).setTitleFontSize(any());
143
         verify(topBar, times(t)).setTitleFontSize(any());

+ 5
- 4
lib/android/app/src/test/java/com/reactnativenavigation/viewcontrollers/TitleBarTest.java View File

12
 import com.reactnativenavigation.parse.params.Button;
12
 import com.reactnativenavigation.parse.params.Button;
13
 import com.reactnativenavigation.parse.params.Text;
13
 import com.reactnativenavigation.parse.params.Text;
14
 import com.reactnativenavigation.react.ReactView;
14
 import com.reactnativenavigation.react.ReactView;
15
+import com.reactnativenavigation.utils.ViewUtils;
15
 import com.reactnativenavigation.views.titlebar.TitleBar;
16
 import com.reactnativenavigation.views.titlebar.TitleBar;
16
 import com.reactnativenavigation.views.titlebar.TitleBarReactView;
17
 import com.reactnativenavigation.views.titlebar.TitleBarReactView;
17
 
18
 
38
     private Button textButton;
39
     private Button textButton;
39
     private Button customButton;
40
     private Button customButton;
40
     private Map<String, TopBarButtonController> buttonControllers;
41
     private Map<String, TopBarButtonController> buttonControllers;
41
-    private TitleBarReactViewController reactViewController;
42
 
42
 
43
     @Override
43
     @Override
44
     public void beforeEach() {
44
     public void beforeEach() {
45
         final TopBarButtonCreatorMock buttonCreator = new TopBarButtonCreatorMock();
45
         final TopBarButtonCreatorMock buttonCreator = new TopBarButtonCreatorMock();
46
         final Activity activity = newActivity();
46
         final Activity activity = newActivity();
47
-        reactViewController = spy(new TitleBarReactViewController(activity, new TitleBarReactViewCreatorMock()));
48
         createButtons();
47
         createButtons();
49
         buttonControllers = new HashMap<>();
48
         buttonControllers = new HashMap<>();
50
-        uut = spy(new TitleBar(activity, buttonCreator, reactViewController, (buttonId -> {})) {
49
+        TitleBarReactViewCreatorMock reactViewCreator = new TitleBarReactViewCreatorMock();
50
+        uut = spy(new TitleBar(activity, buttonCreator, reactViewCreator, (buttonId -> {})) {
51
             @Override
51
             @Override
52
             public TopBarButtonController createButtonController(Button button) {
52
             public TopBarButtonController createButtonController(Button button) {
53
                 TopBarButtonController controller = spy(super.createButtonController(button));
53
                 TopBarButtonController controller = spy(super.createButtonController(button));
169
 
169
 
170
     @Test
170
     @Test
171
     public void clear() throws Exception {
171
     public void clear() throws Exception {
172
+        uut.setComponent("someComponent", TitleOptions.Alignment.Center);
172
         uut.clear();
173
         uut.clear();
173
         assertThat(uut.getTitle()).isNullOrEmpty();
174
         assertThat(uut.getTitle()).isNullOrEmpty();
174
         assertThat(uut.getMenu().size()).isZero();
175
         assertThat(uut.getMenu().size()).isZero();
175
         assertThat(uut.getNavigationIcon()).isNull();
176
         assertThat(uut.getNavigationIcon()).isNull();
176
-        verify(reactViewController, times(1)).destroy();
177
+        assertThat(ViewUtils.findChildrenByClassRecursive(uut, TitleBarReactView.class).size()).isZero();
177
     }
178
     }
178
 
179
 
179
     private List<Button> leftButton(Button leftButton) {
180
     private List<Button> leftButton(Button leftButton) {

+ 0
- 1
playground/src/screens/OptionsScreen.js View File

131
             title: 'Two',
131
             title: 'Two',
132
             icon: require('../../img/navicon_add.png'),
132
             icon: require('../../img/navicon_add.png'),
133
             disableIconTint: true,
133
             disableIconTint: true,
134
-            // disabled: true,
135
             showAsAction: 'ifRoom',
134
             showAsAction: 'ifRoom',
136
             buttonColor: 'green',
135
             buttonColor: 'green',
137
             buttonFontSize: 28,
136
             buttonFontSize: 28,