Browse Source

Some work on eventEmitter

Guy Carmeli 8 years ago
parent
commit
c70f8e379e

+ 15
- 0
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java View File

@@ -5,7 +5,9 @@ import android.os.Handler;
5 5
 import android.support.annotation.NonNull;
6 6
 
7 7
 import com.facebook.react.ReactPackage;
8
+import com.facebook.react.bridge.ReactContext;
8 9
 import com.facebook.react.shell.MainReactPackage;
10
+import com.reactnativenavigation.bridge.NavigationReactEventEmitter;
9 11
 import com.reactnativenavigation.bridge.NavigationReactPackage;
10 12
 import com.reactnativenavigation.react.NavigationReactInstance;
11 13
 
@@ -16,6 +18,7 @@ public abstract class NavigationApplication extends Application {
16 18
 
17 19
     public static NavigationApplication instance;
18 20
     private NavigationReactInstance navigationReactInstance;
21
+    private NavigationReactEventEmitter reactEventEmitter;
19 22
     private Handler handler;
20 23
 
21 24
     @Override
@@ -27,6 +30,18 @@ public abstract class NavigationApplication extends Application {
27 30
         navigationReactInstance.startReactContextOnceInBackgroundAndExecuteJS();
28 31
     }
29 32
 
33
+    public NavigationReactEventEmitter getReactEventEmitter() {
34
+        if (reactEventEmitter == null) {
35
+            reactEventEmitter = new NavigationReactEventEmitter(getCurrentReactContext());
36
+        }
37
+
38
+        return reactEventEmitter;
39
+    }
40
+
41
+    private ReactContext getCurrentReactContext() {
42
+        return navigationReactInstance.getReactInstanceManager().getCurrentReactContext();
43
+    }
44
+
30 45
     public Handler getMainHandler() {
31 46
         return handler;
32 47
     }

+ 11
- 7
android/app/src/main/java/com/reactnativenavigation/bridge/NavigationReactEventEmitter.java View File

@@ -1,5 +1,7 @@
1 1
 package com.reactnativenavigation.bridge;
2 2
 
3
+import com.facebook.react.bridge.Arguments;
4
+import com.facebook.react.bridge.ReactContext;
3 5
 import com.facebook.react.bridge.WritableMap;
4 6
 import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
5 7
 
@@ -8,15 +10,17 @@ public class NavigationReactEventEmitter {
8 10
     private static final String KEY_EVENT_ID = "id";
9 11
     private static final String KEY_EVENT_TYPE = "type";
10 12
     private static final String EVENT_TYPE = "NavBarButtonPress";
13
+    private RCTDeviceEventEmitter eventEmitter;
11 14
 
12
-    public void sendEvent(RCTDeviceEventEmitter eventEmitter, String eventName, String navigatorEventId, WritableMap params) {
13
-        if (eventEmitter == null) {
14
-            return;
15
-        }
15
+    public NavigationReactEventEmitter(ReactContext reactContext) {
16
+        this.eventEmitter = reactContext.getJSModule(RCTDeviceEventEmitter.class);
17
+    }
16 18
 
19
+    public void sendEvent(String eventId, String screenInstanceId) {
20
+        WritableMap params = Arguments.createMap();
17 21
         params.putString(KEY_EVENT_TYPE, EVENT_TYPE);
18
-        params.putString(KEY_EVENT_ID, eventName);
19
-//        params.putString(_Screen.KEY_NAVIGATOR_EVENT_ID, navigatorEventId);
20
-        eventEmitter.emit(navigatorEventId, params);
22
+        params.putString(KEY_EVENT_ID, eventId);
23
+        params.putString("navigatorEventID", screenInstanceId);
24
+        eventEmitter.emit(screenInstanceId, params);
21 25
     }
22 26
 }

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/layouts/ScreenLayout.java View File

@@ -40,7 +40,7 @@ public class ScreenLayout extends LinearLayout implements ScrollDirectionListene
40 40
     }
41 41
 
42 42
     private void addTitleBar() {
43
-        topBar.addTitleBarAndSetButtons(screenParams.buttons, this);
43
+        topBar.addTitleBarAndSetButtons(screenParams.buttons, screenParams.screenInstanceId);
44 44
         topBar.setTitle(screenParams.title);
45 45
     }
46 46
 

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

@@ -2,7 +2,6 @@ package com.reactnativenavigation.layouts;
2 2
 
3 3
 import android.content.Context;
4 4
 import android.support.design.widget.AppBarLayout;
5
-import android.view.MenuItem;
6 5
 
7 6
 import com.reactnativenavigation.params.TitleBarButtonParams;
8 7
 import com.reactnativenavigation.views.TitleBar;
@@ -18,10 +17,10 @@ public class TopBar extends AppBarLayout {
18 17
         setFitsSystemWindows(true);
19 18
     }
20 19
 
21
-    public void addTitleBarAndSetButtons(List<TitleBarButtonParams> buttons, MenuItem.OnMenuItemClickListener onTitleBarButtonClickListener) {
20
+    public void addTitleBarAndSetButtons(List<TitleBarButtonParams> buttons, String screenInstanceId) {
22 21
         titleBar = new TitleBar(getContext());
23 22
         addView(titleBar);
24
-        titleBar.setButtons(buttons, onTitleBarButtonClickListener);
23
+        titleBar.setButtons(buttons, screenInstanceId);
25 24
     }
26 25
 
27 26
     public void setTitleBarVisibility(boolean isHidden) {

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/params/TitleBarButtonParams.java View File

@@ -17,7 +17,7 @@ public class TitleBarButtonParams {
17 17
         }
18 18
     }
19 19
 
20
-    // Todo: add id for click listener
20
+    public String eventId;
21 21
     public String label;
22 22
     public Drawable icon;
23 23
     public ScreenStyleParams.Color color;

+ 0
- 11
android/app/src/main/java/com/reactnativenavigation/react/NavigationReactInstance.java View File

@@ -5,9 +5,7 @@ import android.content.Intent;
5 5
 import com.facebook.react.LifecycleState;
6 6
 import com.facebook.react.ReactInstanceManager;
7 7
 import com.facebook.react.ReactPackage;
8
-import com.facebook.react.bridge.ReactContext;
9 8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10
-import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
11 9
 import com.reactnativenavigation.NavigationApplication;
12 10
 import com.reactnativenavigation.controllers.NavigationActivity;
13 11
 
@@ -38,15 +36,6 @@ public class NavigationReactInstance {
38 36
         }
39 37
     }
40 38
 
41
-    public RCTDeviceEventEmitter getEventEmitter() {
42
-        ReactContext currentReactContext = reactInstanceManager.getCurrentReactContext();
43
-        if (currentReactContext == null) {
44
-            return null;
45
-        }
46
-
47
-        return currentReactContext.getJSModule(RCTDeviceEventEmitter.class);
48
-    }
49
-
50 39
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
51 40
         reactInstanceManager.onActivityResult(requestCode, resultCode, data);
52 41
     }

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

@@ -3,7 +3,6 @@ package com.reactnativenavigation.views;
3 3
 import android.content.Context;
4 4
 import android.support.v7.widget.Toolbar;
5 5
 import android.view.Menu;
6
-import android.view.MenuItem;
7 6
 
8 7
 import com.reactnativenavigation.animation.HideOnScrollAnimator;
9 8
 import com.reactnativenavigation.params.TitleBarButtonParams;
@@ -19,12 +18,12 @@ public class TitleBar extends Toolbar {
19 18
         super(context);
20 19
     }
21 20
 
22
-    public void setButtons(List<TitleBarButtonParams> buttons, MenuItem.OnMenuItemClickListener onTitleBarButtonClickListener) {
21
+    public void setButtons(List<TitleBarButtonParams> buttons, String screenInstanceId) {
23 22
         Menu menu = getMenu();
24 23
         menu.clear();
25 24
 
26 25
         for (int i = 0; i < buttons.size(); i++) {
27
-            final TitleBarButton button = new TitleBarButton(menu, this, buttons.get(i), onTitleBarButtonClickListener);
26
+            final TitleBarButton button = new TitleBarButton(menu, this, buttons.get(i), screenInstanceId);
28 27
             // Add button in reverse order because in iOS index 0 starts at right
29 28
             final int index = buttons.size() - i - 1;
30 29
             button.addToMenu(index);

+ 12
- 5
android/app/src/main/java/com/reactnativenavigation/views/TitleBarButton.java View File

@@ -6,24 +6,25 @@ import android.view.MenuItem;
6 6
 import android.view.View;
7 7
 import android.widget.TextView;
8 8
 
9
+import com.reactnativenavigation.NavigationApplication;
9 10
 import com.reactnativenavigation.params.TitleBarButtonParams;
10 11
 import com.reactnativenavigation.utils.ImageUtils;
11 12
 import com.reactnativenavigation.utils.ViewUtils;
12 13
 
13 14
 import java.util.ArrayList;
14 15
 
15
-public class TitleBarButton {
16
+public class TitleBarButton implements MenuItem.OnMenuItemClickListener {
16 17
 
17 18
     private final Menu menu;
18 19
     private final View parent;
19 20
     private TitleBarButtonParams buttonParams;
20
-    private MenuItem.OnMenuItemClickListener onMenuItemClickListener;
21
+    private String screenInstanceId;
21 22
 
22
-    public TitleBarButton(Menu menu, View parent, TitleBarButtonParams buttonParams, MenuItem.OnMenuItemClickListener onMenuItemClickListener) {
23
+    public TitleBarButton(Menu menu, View parent, TitleBarButtonParams buttonParams, String screenInstanceId) {
23 24
         this.menu = menu;
24 25
         this.parent = parent;
25 26
         this.buttonParams = buttonParams;
26
-        this.onMenuItemClickListener = onMenuItemClickListener;
27
+        this.screenInstanceId = screenInstanceId;
27 28
     }
28 29
 
29 30
     public MenuItem addToMenu(int index) {
@@ -32,7 +33,7 @@ public class TitleBarButton {
32 33
         item.setEnabled(buttonParams.enabled);
33 34
         setIcon(item);
34 35
         setColor();
35
-        item.setOnMenuItemClickListener(onMenuItemClickListener);
36
+        item.setOnMenuItemClickListener(this);
36 37
         return item;
37 38
     }
38 39
 
@@ -89,4 +90,10 @@ public class TitleBarButton {
89 90
     private boolean hasColor() {
90 91
         return buttonParams.color.hasColor();
91 92
     }
93
+
94
+    @Override
95
+    public boolean onMenuItemClick(MenuItem item) {
96
+        NavigationApplication.instance.getReactEventEmitter().sendEvent(buttonParams.eventId, screenInstanceId);
97
+        return true;
98
+    }
92 99
 }