Guy Carmeli пре 8 година
родитељ
комит
c70f8e379e

+ 15
- 0
android/app/src/main/java/com/reactnativenavigation/NavigationApplication.java Прегледај датотеку

5
 import android.support.annotation.NonNull;
5
 import android.support.annotation.NonNull;
6
 
6
 
7
 import com.facebook.react.ReactPackage;
7
 import com.facebook.react.ReactPackage;
8
+import com.facebook.react.bridge.ReactContext;
8
 import com.facebook.react.shell.MainReactPackage;
9
 import com.facebook.react.shell.MainReactPackage;
10
+import com.reactnativenavigation.bridge.NavigationReactEventEmitter;
9
 import com.reactnativenavigation.bridge.NavigationReactPackage;
11
 import com.reactnativenavigation.bridge.NavigationReactPackage;
10
 import com.reactnativenavigation.react.NavigationReactInstance;
12
 import com.reactnativenavigation.react.NavigationReactInstance;
11
 
13
 
16
 
18
 
17
     public static NavigationApplication instance;
19
     public static NavigationApplication instance;
18
     private NavigationReactInstance navigationReactInstance;
20
     private NavigationReactInstance navigationReactInstance;
21
+    private NavigationReactEventEmitter reactEventEmitter;
19
     private Handler handler;
22
     private Handler handler;
20
 
23
 
21
     @Override
24
     @Override
27
         navigationReactInstance.startReactContextOnceInBackgroundAndExecuteJS();
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
     public Handler getMainHandler() {
45
     public Handler getMainHandler() {
31
         return handler;
46
         return handler;
32
     }
47
     }

+ 11
- 7
android/app/src/main/java/com/reactnativenavigation/bridge/NavigationReactEventEmitter.java Прегледај датотеку

1
 package com.reactnativenavigation.bridge;
1
 package com.reactnativenavigation.bridge;
2
 
2
 
3
+import com.facebook.react.bridge.Arguments;
4
+import com.facebook.react.bridge.ReactContext;
3
 import com.facebook.react.bridge.WritableMap;
5
 import com.facebook.react.bridge.WritableMap;
4
 import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
6
 import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
5
 
7
 
8
     private static final String KEY_EVENT_ID = "id";
10
     private static final String KEY_EVENT_ID = "id";
9
     private static final String KEY_EVENT_TYPE = "type";
11
     private static final String KEY_EVENT_TYPE = "type";
10
     private static final String EVENT_TYPE = "NavBarButtonPress";
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
         params.putString(KEY_EVENT_TYPE, EVENT_TYPE);
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 Прегледај датотеку

40
     }
40
     }
41
 
41
 
42
     private void addTitleBar() {
42
     private void addTitleBar() {
43
-        topBar.addTitleBarAndSetButtons(screenParams.buttons, this);
43
+        topBar.addTitleBarAndSetButtons(screenParams.buttons, screenParams.screenInstanceId);
44
         topBar.setTitle(screenParams.title);
44
         topBar.setTitle(screenParams.title);
45
     }
45
     }
46
 
46
 

+ 2
- 3
android/app/src/main/java/com/reactnativenavigation/layouts/TopBar.java Прегледај датотеку

2
 
2
 
3
 import android.content.Context;
3
 import android.content.Context;
4
 import android.support.design.widget.AppBarLayout;
4
 import android.support.design.widget.AppBarLayout;
5
-import android.view.MenuItem;
6
 
5
 
7
 import com.reactnativenavigation.params.TitleBarButtonParams;
6
 import com.reactnativenavigation.params.TitleBarButtonParams;
8
 import com.reactnativenavigation.views.TitleBar;
7
 import com.reactnativenavigation.views.TitleBar;
18
         setFitsSystemWindows(true);
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
         titleBar = new TitleBar(getContext());
21
         titleBar = new TitleBar(getContext());
23
         addView(titleBar);
22
         addView(titleBar);
24
-        titleBar.setButtons(buttons, onTitleBarButtonClickListener);
23
+        titleBar.setButtons(buttons, screenInstanceId);
25
     }
24
     }
26
 
25
 
27
     public void setTitleBarVisibility(boolean isHidden) {
26
     public void setTitleBarVisibility(boolean isHidden) {

+ 1
- 1
android/app/src/main/java/com/reactnativenavigation/params/TitleBarButtonParams.java Прегледај датотеку

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

+ 0
- 11
android/app/src/main/java/com/reactnativenavigation/react/NavigationReactInstance.java Прегледај датотеку

5
 import com.facebook.react.LifecycleState;
5
 import com.facebook.react.LifecycleState;
6
 import com.facebook.react.ReactInstanceManager;
6
 import com.facebook.react.ReactInstanceManager;
7
 import com.facebook.react.ReactPackage;
7
 import com.facebook.react.ReactPackage;
8
-import com.facebook.react.bridge.ReactContext;
9
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
8
 import com.facebook.react.modules.core.DefaultHardwareBackBtnHandler;
10
-import com.facebook.react.modules.core.DeviceEventManagerModule.RCTDeviceEventEmitter;
11
 import com.reactnativenavigation.NavigationApplication;
9
 import com.reactnativenavigation.NavigationApplication;
12
 import com.reactnativenavigation.controllers.NavigationActivity;
10
 import com.reactnativenavigation.controllers.NavigationActivity;
13
 
11
 
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
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
39
     public void onActivityResult(int requestCode, int resultCode, Intent data) {
51
         reactInstanceManager.onActivityResult(requestCode, resultCode, data);
40
         reactInstanceManager.onActivityResult(requestCode, resultCode, data);
52
     }
41
     }

+ 2
- 3
android/app/src/main/java/com/reactnativenavigation/views/TitleBar.java Прегледај датотеку

3
 import android.content.Context;
3
 import android.content.Context;
4
 import android.support.v7.widget.Toolbar;
4
 import android.support.v7.widget.Toolbar;
5
 import android.view.Menu;
5
 import android.view.Menu;
6
-import android.view.MenuItem;
7
 
6
 
8
 import com.reactnativenavigation.animation.HideOnScrollAnimator;
7
 import com.reactnativenavigation.animation.HideOnScrollAnimator;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
8
 import com.reactnativenavigation.params.TitleBarButtonParams;
19
         super(context);
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
         Menu menu = getMenu();
22
         Menu menu = getMenu();
24
         menu.clear();
23
         menu.clear();
25
 
24
 
26
         for (int i = 0; i < buttons.size(); i++) {
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
             // Add button in reverse order because in iOS index 0 starts at right
27
             // Add button in reverse order because in iOS index 0 starts at right
29
             final int index = buttons.size() - i - 1;
28
             final int index = buttons.size() - i - 1;
30
             button.addToMenu(index);
29
             button.addToMenu(index);

+ 12
- 5
android/app/src/main/java/com/reactnativenavigation/views/TitleBarButton.java Прегледај датотеку

6
 import android.view.View;
6
 import android.view.View;
7
 import android.widget.TextView;
7
 import android.widget.TextView;
8
 
8
 
9
+import com.reactnativenavigation.NavigationApplication;
9
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.params.TitleBarButtonParams;
10
 import com.reactnativenavigation.utils.ImageUtils;
11
 import com.reactnativenavigation.utils.ImageUtils;
11
 import com.reactnativenavigation.utils.ViewUtils;
12
 import com.reactnativenavigation.utils.ViewUtils;
12
 
13
 
13
 import java.util.ArrayList;
14
 import java.util.ArrayList;
14
 
15
 
15
-public class TitleBarButton {
16
+public class TitleBarButton implements MenuItem.OnMenuItemClickListener {
16
 
17
 
17
     private final Menu menu;
18
     private final Menu menu;
18
     private final View parent;
19
     private final View parent;
19
     private TitleBarButtonParams buttonParams;
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
         this.menu = menu;
24
         this.menu = menu;
24
         this.parent = parent;
25
         this.parent = parent;
25
         this.buttonParams = buttonParams;
26
         this.buttonParams = buttonParams;
26
-        this.onMenuItemClickListener = onMenuItemClickListener;
27
+        this.screenInstanceId = screenInstanceId;
27
     }
28
     }
28
 
29
 
29
     public MenuItem addToMenu(int index) {
30
     public MenuItem addToMenu(int index) {
32
         item.setEnabled(buttonParams.enabled);
33
         item.setEnabled(buttonParams.enabled);
33
         setIcon(item);
34
         setIcon(item);
34
         setColor();
35
         setColor();
35
-        item.setOnMenuItemClickListener(onMenuItemClickListener);
36
+        item.setOnMenuItemClickListener(this);
36
         return item;
37
         return item;
37
     }
38
     }
38
 
39
 
89
     private boolean hasColor() {
90
     private boolean hasColor() {
90
         return buttonParams.color.hasColor();
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
 }