Skip to content

Commit a49ade1

Browse files
committed
Updated RNExternalDisplayModule to initialize ExternalDisplayHelper and handle display events
1 parent b7ecd1d commit a49ade1

File tree

2 files changed

+80
-48
lines changed

2 files changed

+80
-48
lines changed

packages/react-native-external-display/android/src/newarch/java/com/externaldisplay/RNExternalDisplayManager.java

Lines changed: 19 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -27,11 +27,11 @@
2727
import java.util.HashMap;
2828

2929
public class RNExternalDisplayManager extends ViewGroupManager<RNExternalDisplayView>
30-
implements ExternalDisplayHelper.Listener, RNExternalDisplayManagerInterface<RNExternalDisplayView> {
30+
implements RNExternalDisplayManagerInterface<RNExternalDisplayView> {
3131
public static final String REACT_CLASS = "RNExternalDisplay";
32-
private ExternalDisplayHelper helper;
32+
private static final String TAG = "RNExternalDisplayEvent";
3333
private ReactApplicationContext reactContext;
34-
private Map<RNExternalDisplayView, RNExternalDisplayView> views = new HashMap<RNExternalDisplayView, RNExternalDisplayView>();
34+
//private Map<RNExternalDisplayView, RNExternalDisplayView> views = new HashMap<RNExternalDisplayView, RNExternalDisplayView>();
3535

3636
private final ViewManagerDelegate<RNExternalDisplayView> mDelegate;
3737

@@ -54,22 +54,28 @@ public String getName() {
5454

5555
@Override
5656
public RNExternalDisplayView createViewInstance(ThemedReactContext context) {
57-
if (this.helper == null) {
58-
this.helper = new ExternalDisplayHelper(reactContext, this);
57+
// Retrieve the module to access the helper
58+
RNExternalDisplayModule module = context.getNativeModule(RNExternalDisplayModule.class);
59+
ExternalDisplayHelper helper = null;
60+
if (module != null) {
61+
helper = module.getExternalDisplayHelper();
62+
} else {
5963
}
60-
RNExternalDisplayView view = new RNExternalDisplayView(context, this.helper);
61-
views.put(view, view);
64+
65+
RNExternalDisplayView view = new RNExternalDisplayView(context, helper);
6266
return view;
6367
}
6468

6569
@Override
6670
public void onDropViewInstance(RNExternalDisplayView view) {
67-
views.remove(view);
71+
//views.remove(view);
6872
super.onDropViewInstance(view);
6973
view.onDropInstance();
7074
}
71-
75+
/*
7276
private void checkScreen() {
77+
Log.d("RNExternalDisplayEvent", "RNExternalDisplayManager checkScreen");
78+
7379
int screenId = -1;
7480
for (RNExternalDisplayView view : views.values()) {
7581
int viewScreenId = view.getScreen();
@@ -83,45 +89,16 @@ private void checkScreen() {
8389
}
8490
}
8591
92+
*/
93+
8694
@ReactProp(name = "screen")
87-
public void setScreen(RNExternalDisplayView view, @Nullable String screen) {
95+
public void setScreen(RNExternalDisplayView view, String screen) {
8896
view.setScreen(screen);
89-
checkScreen();
97+
//checkScreen();
9098
}
9199

92100
@ReactProp(name = "fallbackInMainScreen", defaultBoolean = false)
93101
public void setFallbackInMainScreen(RNExternalDisplayView view, boolean fallbackInMainScreen) {
94102
view.setFallbackInMainScreen(fallbackInMainScreen);
95103
}
96-
97-
private void sendEvent(String eventName, @Nullable WritableMap params) {
98-
reactContext
99-
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
100-
.emit(eventName, params);
101-
}
102-
103-
public void onDisplayAdded(Display[] displays, int displayId) {
104-
sendEvent(
105-
"@RNExternalDisplay_screenDidConnect",
106-
Arguments.makeNativeMap(
107-
ExternalDisplayHelper.getScreenInfo(displays)
108-
)
109-
);
110-
}
111-
public void onDisplayChanged(Display[] displays, int displayId) {
112-
sendEvent(
113-
"@RNExternalDisplay_screenDidChange",
114-
Arguments.makeNativeMap(
115-
ExternalDisplayHelper.getScreenInfo(displays)
116-
)
117-
);
118-
}
119-
public void onDisplayRemoved(Display[] displays, int displayId) {
120-
sendEvent(
121-
"@RNExternalDisplay_screenDidDisconnect",
122-
Arguments.makeNativeMap(
123-
ExternalDisplayHelper.getScreenInfo(displays)
124-
)
125-
);
126-
}
127104
}

packages/react-native-external-display/android/src/newarch/java/com/externaldisplay/RNExternalDisplayModule.java

Lines changed: 61 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,19 +9,24 @@
99

1010
import android.view.Display;
1111
import android.hardware.display.DisplayManager;
12+
import android.util.Log;
1213

1314
import java.util.Map;
1415
import java.util.HashMap;
1516

16-
public class RNExternalDisplayModule extends NativeRNExternalDisplayEventSpec {
17+
import com.facebook.react.modules.core.DeviceEventManagerModule;
18+
19+
public class RNExternalDisplayModule extends NativeRNExternalDisplayEventSpec implements ExternalDisplayHelper.Listener {
1720
public static final String REACT_CLASS = "RNExternalDisplayEvent";
21+
private static final String TAG = "RNExternalDisplayEvent";
22+
1823
private ReactApplicationContext reactContext = null;
19-
private DisplayManager dm = null;
20-
24+
2125
public RNExternalDisplayModule(ReactApplicationContext context) {
2226
super(context);
23-
reactContext = context;
24-
dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
27+
this.reactContext = context;
28+
// Initialize ExternalDisplayHelper singleton
29+
ExternalDisplayHelper.initialize(context, this);
2530
}
2631

2732
@Override
@@ -32,7 +37,11 @@ public String getName() {
3237
@Override
3338
public WritableMap getInitialScreens() {
3439
WritableMap map = Arguments.createMap();
35-
map.putMap("SCREEN_INFO", Arguments.makeNativeMap(ExternalDisplayHelper.getScreenInfo(dm.getDisplays())));
40+
try {
41+
map.putMap("SCREEN_INFO", Arguments.makeNativeMap(ExternalDisplayHelper.getScreenInfo(ExternalDisplayHelper.getInstance().getDisplays())));
42+
} catch (IllegalStateException e) {
43+
map.putMap("SCREEN_INFO", Arguments.createMap());
44+
}
3645
return map;
3746
}
3847

@@ -52,4 +61,50 @@ public void init() {}
5261

5362
@Override
5463
public boolean resumeMainScene() { return false; }
64+
65+
private void sendEvent(String eventName, WritableMap params) {
66+
reactContext
67+
.getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class)
68+
.emit(eventName, params);
69+
}
70+
71+
@Override
72+
public void onDisplayAdded(Display[] displays, int displayId) {
73+
sendEvent(
74+
"@RNExternalDisplay_screenDidConnect",
75+
Arguments.makeNativeMap(ExternalDisplayHelper.getScreenInfo(displays))
76+
);
77+
}
78+
79+
@Override
80+
public void onDisplayChanged(Display[] displays, int displayId) {
81+
sendEvent(
82+
"@RNExternalDisplay_screenDidChange",
83+
Arguments.makeNativeMap(ExternalDisplayHelper.getScreenInfo(displays))
84+
);
85+
}
86+
87+
@Override
88+
public void onDisplayRemoved(Display[] displays, int displayId) {
89+
sendEvent(
90+
"@RNExternalDisplay_screenDidDisconnect",
91+
Arguments.makeNativeMap(ExternalDisplayHelper.getScreenInfo(displays))
92+
);
93+
}
94+
95+
@Override
96+
public void onCatalystInstanceDestroy() {
97+
super.onCatalystInstanceDestroy();
98+
// Clean up the ExternalDisplayHelper singleton
99+
ExternalDisplayHelper.destroy();
100+
}
101+
102+
// Optional: Provide a getter for ExternalDisplayHelper
103+
public ExternalDisplayHelper getExternalDisplayHelper() {
104+
try {
105+
return ExternalDisplayHelper.getInstance();
106+
} catch (IllegalStateException e) {
107+
return null;
108+
}
109+
}
55110
}

0 commit comments

Comments
 (0)