Skip to content

Commit 80d0be8

Browse files
committed
Bring over android code
1 parent 7631bf8 commit 80d0be8

File tree

6 files changed

+156
-31
lines changed

6 files changed

+156
-31
lines changed

android/build.gradle

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ def configureReactNativePom(def pom) {
8282
name packageJson.title
8383
artifactId packageJson.name
8484
version = packageJson.version
85-
group = "com.mpiannucci"
85+
group = "com.mpiannucci.reactnativecontextmenu"
8686
description packageJson.description
8787
url packageJson.repository.baseUrl
8888

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
2-
package="com.mpiannucci">
2+
package="com.mpiannucci.reactnativecontextmenu">
33

44
</manifest>

android/src/main/java/com/mpiannucci/ReactNativeContextMenuManager.java

Lines changed: 0 additions & 26 deletions
This file was deleted.
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
package com.mpiannucci.reactnativecontextmenu;
2+
3+
import android.view.ViewGroup;
4+
5+
import com.facebook.react.bridge.ReadableArray;
6+
import com.facebook.react.bridge.ReadableMap;
7+
import com.facebook.react.common.MapBuilder;
8+
import com.facebook.react.uimanager.ThemedReactContext;
9+
import com.facebook.react.uimanager.ViewGroupManager;
10+
import com.facebook.react.uimanager.annotations.ReactProp;
11+
import com.facebook.react.views.view.ReactViewGroup;
12+
13+
import java.util.ArrayList;
14+
import java.util.Map;
15+
16+
import javax.annotation.Nullable;
17+
18+
public class ContextMenuManager extends ViewGroupManager<ContextMenuView> {
19+
20+
public static final String REACT_CLASS = "ContextMenu";
21+
22+
@Override
23+
public String getName() {
24+
return REACT_CLASS;
25+
}
26+
27+
@Override
28+
public ContextMenuView createViewInstance(ThemedReactContext context) {
29+
ContextMenuView reactViewGroup = new ContextMenuView(context);
30+
return reactViewGroup;
31+
}
32+
33+
@ReactProp(name = "title")
34+
public void setTitle(ContextMenuView view, @Nullable String title) {
35+
// TODO: Maybe support this? IDK if its necessary though
36+
}
37+
38+
@ReactProp(name = "actions")
39+
public void setActions(ContextMenuView view, @Nullable ReadableArray actions) {
40+
ArrayList<String> newActions = new ArrayList();
41+
42+
for (int i = 0; i < actions.size(); i++) {
43+
ReadableMap action = actions.getMap(i);
44+
newActions.add(action.getString("title"));
45+
}
46+
47+
view.setActions(newActions);
48+
}
49+
50+
@androidx.annotation.Nullable
51+
@Override
52+
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
53+
return MapBuilder.<String, Object>builder()
54+
.put("onPress", MapBuilder.of("registrationName", "onPress"))
55+
.put("onCancel", MapBuilder.of("registrationName", "onCancel"))
56+
.build();
57+
}
58+
}

android/src/main/java/com/mpiannucci/ReactNativeContextMenuPackage.java renamed to android/src/main/java/com/mpiannucci/reactnativecontextmenu/ContextMenuPackage.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.mpiannucci;
1+
package com.mpiannucci.reactnativecontextmenu;
22

33
import java.util.Arrays;
44
import java.util.Collections;
@@ -10,14 +10,14 @@
1010
import com.facebook.react.uimanager.ViewManager;
1111
import com.facebook.react.bridge.JavaScriptModule;
1212

13-
public class ReactNativeContextMenuPackage implements ReactPackage {
13+
public class ContextMenuPackage implements ReactPackage {
1414
@Override
1515
public List<NativeModule> createNativeModules(ReactApplicationContext reactContext) {
1616
return Collections.emptyList();
1717
}
1818

1919
@Override
2020
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
21-
return Arrays.<ViewManager>asList(new ReactNativeContextMenuManager());
21+
return Arrays.<ViewManager>asList(new ContextMenuManager());
2222
}
2323
}
Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package com.mpiannucci.reactnativecontextmenu;
2+
3+
import android.content.Context;
4+
import android.gesture.Gesture;
5+
import android.util.Log;
6+
import android.view.GestureDetector;
7+
import android.view.Menu;
8+
import android.view.MenuItem;
9+
import android.view.MotionEvent;
10+
import android.view.View;
11+
import android.view.ViewGroup;
12+
import android.widget.PopupMenu;
13+
14+
import com.facebook.react.bridge.Arguments;
15+
import com.facebook.react.bridge.ReactContext;
16+
import com.facebook.react.bridge.ReactContextBaseJavaModule;
17+
import com.facebook.react.bridge.WritableMap;
18+
import com.facebook.react.touch.OnInterceptTouchEventListener;
19+
import com.facebook.react.uimanager.events.RCTEventEmitter;
20+
import com.facebook.react.views.view.ReactViewGroup;
21+
22+
import java.util.List;
23+
24+
public class ContextMenuView extends ReactViewGroup implements PopupMenu.OnMenuItemClickListener, PopupMenu.OnDismissListener {
25+
26+
PopupMenu contextMenu;
27+
28+
GestureDetector gestureDetector;
29+
30+
boolean cancelled = true;
31+
32+
public ContextMenuView(final Context context) {
33+
super(context);
34+
35+
contextMenu = new PopupMenu(getContext(), this);
36+
contextMenu.setOnMenuItemClickListener(this);
37+
contextMenu.setOnDismissListener(this);
38+
39+
gestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener() {
40+
@Override
41+
public void onLongPress(MotionEvent e) {
42+
contextMenu.show();
43+
}
44+
});
45+
}
46+
47+
@Override
48+
public void addView(View child, int index) {
49+
super.addView(child, index);
50+
51+
child.setClickable(false);
52+
}
53+
54+
@Override
55+
public boolean onInterceptTouchEvent(MotionEvent ev) {
56+
return true;
57+
}
58+
59+
@Override
60+
public boolean onTouchEvent(MotionEvent ev) {
61+
gestureDetector.onTouchEvent(ev);
62+
return false;
63+
}
64+
65+
public void setActions(List<String> actions) {
66+
Menu menu = contextMenu.getMenu();
67+
menu.clear();
68+
69+
for (String action : actions) {
70+
menu.add(action);
71+
}
72+
}
73+
74+
@Override
75+
public boolean onMenuItemClick(MenuItem menuItem) {
76+
cancelled = false;
77+
ReactContext reactContext = (ReactContext) getContext();
78+
WritableMap event = Arguments.createMap();
79+
event.putString("name", menuItem.getTitle().toString());
80+
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "onPress", event);
81+
return false;
82+
}
83+
84+
@Override
85+
public void onDismiss(PopupMenu popupMenu) {
86+
if (cancelled) {
87+
ReactContext reactContext = (ReactContext) getContext();
88+
reactContext.getJSModule(RCTEventEmitter.class).receiveEvent(getId(), "onCancel", null);
89+
}
90+
91+
cancelled = true;
92+
}
93+
}

0 commit comments

Comments
 (0)