Skip to content

Commit 41d0c8f

Browse files
authored
Merge pull request #1 from tarikpo/fix-events-when-no-external-screen-exists-from-start
Fix events when no external screen exists from start
2 parents 8c5d768 + a971590 commit 41d0c8f

File tree

6 files changed

+544
-390
lines changed

6 files changed

+544
-390
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<projectDescription>
3+
<name>react-native-external-display</name>
4+
<comment>Project react-native-external-display created by Buildship.</comment>
5+
<projects>
6+
</projects>
7+
<buildSpec>
8+
<buildCommand>
9+
<name>org.eclipse.buildship.core.gradleprojectbuilder</name>
10+
<arguments>
11+
</arguments>
12+
</buildCommand>
13+
</buildSpec>
14+
<natures>
15+
<nature>org.eclipse.buildship.core.gradleprojectnature</nature>
16+
</natures>
17+
<filteredResources>
18+
<filter>
19+
<id>1733156198568</id>
20+
<name></name>
21+
<type>30</type>
22+
<matcher>
23+
<id>org.eclipse.core.resources.regexFilterMatcher</id>
24+
<arguments>node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__</arguments>
25+
</matcher>
26+
</filter>
27+
</filteredResources>
28+
</projectDescription>

packages/react-native-external-display/android/src/main/java/com/externaldisplay/ExternalDisplayHelper.java

Lines changed: 112 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -18,81 +18,126 @@
1818
import java.util.Map;
1919
import java.util.HashMap;
2020

21+
import android.util.Log;
22+
2123
import com.facebook.react.bridge.LifecycleEventListener;
2224
import com.facebook.react.bridge.ReactApplicationContext;
2325

2426
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
2527
class ExternalDisplayScreen extends Presentation {
26-
ExternalDisplayScreen(Context ctx, Display display) {
27-
super(ctx, display);
28-
}
29-
30-
@Override
31-
protected void onCreate(Bundle savedInstanceState) {
32-
super.onCreate(savedInstanceState);
33-
}
28+
ExternalDisplayScreen(Context ctx, Display display) {
29+
super(ctx, display);
30+
Log.d("RNExternalDisplayEvent", "ExternalDisplayScreen init");
31+
32+
}
33+
34+
@Override
35+
protected void onCreate(Bundle savedInstanceState) {
36+
Log.d("RNExternalDisplayEvent", "ExternalDisplayScreen onCreate");
37+
38+
super.onCreate(savedInstanceState);
39+
}
3440
}
3541

3642
@TargetApi(Build.VERSION_CODES.JELLY_BEAN_MR1)
3743
class ExternalDisplayHelper implements DisplayManager.DisplayListener {
38-
public static Map<String, Object> getScreenInfo(Display[] displays) {
39-
HashMap<String, Object> info = new HashMap<String, Object>();
40-
for (Display display : displays) {
41-
int displayId = display.getDisplayId();
42-
if (
43-
display.getDisplayId() == Display.DEFAULT_DISPLAY ||
44-
(display.getFlags() & Display.FLAG_PRESENTATION) == 0
45-
) {
46-
continue;
47-
}
48-
HashMap<String, Object> data = new HashMap<String, Object>();
49-
DisplayMetrics displayMetrics = new DisplayMetrics();
50-
display.getMetrics(displayMetrics);
51-
data.put("id", displayId);
52-
data.put("width", displayMetrics.widthPixels);
53-
data.put("height", displayMetrics.heightPixels);
54-
info.put(String.valueOf(display.getDisplayId()), data);
44+
private static final String TAG = "RNExternalDisplayEvent";
45+
private static ExternalDisplayHelper instance = null;
46+
private DisplayManager dm = null;
47+
private Listener listener = null;
48+
private Display displays = null;
49+
50+
// Private constructor to prevent direct instantiation
51+
private ExternalDisplayHelper(Context context, Listener listener) {
52+
this.listener = listener;
53+
dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
54+
if (dm != null) {
55+
dm.registerDisplayListener(this, null);
56+
} else {
57+
}
58+
}
59+
60+
// Method to initialize the singleton instance
61+
public static synchronized void initialize(Context context, Listener listener) {
62+
if (instance == null) {
63+
instance = new ExternalDisplayHelper(context.getApplicationContext(), listener);
64+
}
65+
}
66+
67+
// Method to get the singleton instance
68+
public static synchronized ExternalDisplayHelper getInstance() {
69+
if (instance == null) {
70+
throw new IllegalStateException("ExternalDisplayHelper is not initialized. Call initialize() first.");
71+
}
72+
return instance;
73+
}
74+
75+
// Method to clean up the singleton instance
76+
public static synchronized void destroy() {
77+
if (instance != null && instance.dm != null) {
78+
instance.dm.unregisterDisplayListener(instance);
79+
instance = null;
80+
}
81+
}
82+
public static Map<String, Object> getScreenInfo(Display[] displays) {
83+
HashMap<String, Object> info = new HashMap<>();
84+
for (Display display : displays) {
85+
int displayId = display.getDisplayId();
86+
if (
87+
display.getDisplayId() == Display.DEFAULT_DISPLAY ||
88+
(display.getFlags() & Display.FLAG_PRESENTATION) == 0
89+
) {
90+
continue;
91+
}
92+
HashMap<String, Object> data = new HashMap<>();
93+
DisplayMetrics displayMetrics = new DisplayMetrics();
94+
display.getMetrics(displayMetrics);
95+
data.put("id", displayId);
96+
data.put("width", displayMetrics.widthPixels);
97+
data.put("height", displayMetrics.heightPixels);
98+
info.put(String.valueOf(display.getDisplayId()), data);
99+
}
100+
return info;
101+
}
102+
103+
@Override
104+
public void onDisplayAdded(int displayId) {
105+
if (listener != null) {
106+
listener.onDisplayAdded(getDisplays(), displayId);
107+
}
108+
}
109+
110+
@Override
111+
public void onDisplayChanged(int displayId) {
112+
if (listener != null) {
113+
listener.onDisplayChanged(getDisplays(), displayId);
114+
}
115+
}
116+
117+
@Override
118+
public void onDisplayRemoved(int displayId) {
119+
if (listener != null) {
120+
listener.onDisplayRemoved(getDisplays(), displayId);
121+
}
122+
}
123+
124+
public Display getDisplay(int displayId) {
125+
if (dm != null) {
126+
return dm.getDisplay(displayId);
127+
}
128+
return null;
129+
}
130+
131+
public Display[] getDisplays() {
132+
if (dm != null) {
133+
return dm.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
134+
}
135+
return new Display[0];
136+
}
137+
138+
public interface Listener {
139+
void onDisplayAdded(Display[] displays, int displayId);
140+
void onDisplayChanged(Display[] displays, int displayId);
141+
void onDisplayRemoved(Display[] displays, int displayId);
55142
}
56-
return info;
57-
}
58-
59-
public interface Listener {
60-
void onDisplayAdded(Display[] displays, int displayId);
61-
void onDisplayChanged(Display[] displays, int displayId);
62-
void onDisplayRemoved(Display[] displays, int displayId);
63-
}
64-
65-
private Listener listener = null;
66-
private DisplayManager dm = null;
67-
private Display displays = null;
68-
69-
public ExternalDisplayHelper(Context context, Listener listener) {
70-
this.listener = listener;
71-
72-
dm = (DisplayManager) context.getSystemService(Context.DISPLAY_SERVICE);
73-
dm.registerDisplayListener(this, null);
74-
}
75-
76-
public Display getDisplay(int displayId) {
77-
return dm.getDisplay(displayId);
78-
}
79-
80-
public Display[] getDisplays() {
81-
return dm.getDisplays(DisplayManager.DISPLAY_CATEGORY_PRESENTATION);
82-
}
83-
84-
@Override
85-
public void onDisplayAdded(int displayId) {
86-
listener.onDisplayAdded(getDisplays(), displayId);
87-
}
88-
89-
@Override
90-
public void onDisplayChanged(int displayId) {
91-
listener.onDisplayChanged(getDisplays(), displayId);
92-
}
93-
94-
@Override
95-
public void onDisplayRemoved(int displayId) {
96-
listener.onDisplayRemoved(getDisplays(), displayId);
97-
}
98143
}
Lines changed: 54 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,16 @@
11
package com.externaldisplay;
22

33
import androidx.annotation.Nullable;
4+
45
import com.facebook.react.bridge.NativeModule;
56
import com.facebook.react.bridge.ReactApplicationContext;
67
import com.facebook.react.module.model.ReactModuleInfo;
78
import com.facebook.react.module.model.ReactModuleInfoProvider;
89
import com.facebook.react.TurboReactPackage;
910
import com.facebook.react.uimanager.ViewManager;
1011

12+
import android.util.Log;
13+
1114
import java.util.ArrayList;
1215
import java.util.Collections;
1316
import java.util.List;
@@ -16,55 +19,60 @@
1619

1720
import android.util.Log;
1821

22+
import com.externaldisplay.RNExternalDisplayManager;
23+
import com.externaldisplay.RNExternalDisplayModule;
24+
1925
public class RNExternalDisplayPackage extends TurboReactPackage {
26+
private static final String TAG = "RNExternalDisplayEvent";
2027

21-
@Override
22-
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
23-
List<ViewManager> viewManagers = new ArrayList<>();
24-
viewManagers.add(new RNExternalDisplayManager(reactContext));
25-
return viewManagers;
26-
}
2728

28-
@Nullable
29-
@Override
30-
public NativeModule getModule(String name, ReactApplicationContext reactContext) {
31-
if (name.equals(RNExternalDisplayModule.REACT_CLASS)) {
32-
return new com.externaldisplay.RNExternalDisplayModule(reactContext);
33-
} else {
34-
return null;
29+
@Override
30+
public List<ViewManager> createViewManagers(ReactApplicationContext reactContext) {
31+
List<ViewManager> viewManagers = new ArrayList<>();
32+
viewManagers.add(new RNExternalDisplayManager(reactContext));
33+
return viewManagers;
3534
}
36-
}
3735

38-
@Override
39-
public ReactModuleInfoProvider getReactModuleInfoProvider() {
40-
return () -> {
41-
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
42-
boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
43-
moduleInfos.put(
44-
RNExternalDisplayModule.REACT_CLASS,
45-
new ReactModuleInfo(
46-
RNExternalDisplayModule.REACT_CLASS,
47-
RNExternalDisplayModule.REACT_CLASS,
48-
false, // canOverrideExistingModule
49-
false, // needsEagerInit
50-
true, // hasConstants
51-
false, // isCxxModule
52-
isTurboModule // isTurboModule
53-
)
54-
);
55-
moduleInfos.put(
56-
RNExternalDisplayManager.REACT_CLASS,
57-
new ReactModuleInfo(
58-
RNExternalDisplayManager.REACT_CLASS,
59-
RNExternalDisplayManager.REACT_CLASS,
60-
false, // canOverrideExistingModule
61-
false, // needsEagerInit
62-
true, // hasConstants
63-
false, // isCxxModule
64-
isTurboModule // isTurboModule
65-
)
66-
);
67-
return moduleInfos;
68-
};
69-
}
36+
@Nullable
37+
@Override
38+
public NativeModule getModule(String name, ReactApplicationContext reactContext) {
39+
if (name.equals(RNExternalDisplayModule.REACT_CLASS)) {
40+
return new RNExternalDisplayModule(reactContext);
41+
} else {
42+
return null;
43+
}
44+
}
45+
46+
@Override
47+
public ReactModuleInfoProvider getReactModuleInfoProvider() {
48+
return () -> {
49+
final Map<String, ReactModuleInfo> moduleInfos = new HashMap<>();
50+
boolean isTurboModule = BuildConfig.IS_NEW_ARCHITECTURE_ENABLED;
51+
moduleInfos.put(
52+
RNExternalDisplayModule.REACT_CLASS,
53+
new ReactModuleInfo(
54+
RNExternalDisplayModule.REACT_CLASS,
55+
RNExternalDisplayModule.REACT_CLASS,
56+
false, // canOverrideExistingModule
57+
false, // needsEagerInit
58+
true, // hasConstants
59+
false, // isCxxModule
60+
isTurboModule // isTurboModule
61+
)
62+
);
63+
moduleInfos.put(
64+
RNExternalDisplayManager.REACT_CLASS,
65+
new ReactModuleInfo(
66+
RNExternalDisplayManager.REACT_CLASS,
67+
RNExternalDisplayManager.REACT_CLASS,
68+
false, // canOverrideExistingModule
69+
false, // needsEagerInit
70+
true, // hasConstants
71+
false, // isCxxModule
72+
isTurboModule // isTurboModule
73+
)
74+
);
75+
return moduleInfos;
76+
};
77+
}
7078
}

0 commit comments

Comments
 (0)