/
SafeAreaProviderManager.java
87 lines (72 loc) · 2.68 KB
/
SafeAreaProviderManager.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package versioned.host.exp.exponent.modules.api.safeareacontext;
import android.app.Activity;
import android.view.View;
import android.view.ViewGroup;
import com.facebook.react.bridge.ReactApplicationContext;
import com.facebook.react.common.MapBuilder;
import com.facebook.react.uimanager.ThemedReactContext;
import com.facebook.react.uimanager.UIManagerModule;
import com.facebook.react.uimanager.ViewGroupManager;
import com.facebook.react.uimanager.events.EventDispatcher;
import java.util.Map;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
public class SafeAreaProviderManager extends ViewGroupManager<SafeAreaProvider> {
private final ReactApplicationContext mContext;
public SafeAreaProviderManager(ReactApplicationContext context) {
super();
mContext = context;
}
@Override
@NonNull
public String getName() {
return "RNCSafeAreaProvider";
}
@Override
@NonNull
public SafeAreaProvider createViewInstance(@NonNull ThemedReactContext context) {
return new SafeAreaProvider(context);
}
@Override
protected void addEventEmitters(@NonNull ThemedReactContext reactContext, @NonNull final SafeAreaProvider view) {
final EventDispatcher dispatcher =
reactContext.getNativeModule(UIManagerModule.class).getEventDispatcher();
view.setOnInsetsChangeListener(new SafeAreaProvider.OnInsetsChangeListener() {
@Override
public void onInsetsChange(SafeAreaProvider view, EdgeInsets insets, Rect frame) {
dispatcher.dispatchEvent(new InsetsChangeEvent(view.getId(), insets, frame));
}
});
}
@Override
public Map<String, Object> getExportedCustomDirectEventTypeConstants() {
return MapBuilder.<String, Object>builder()
.put(InsetsChangeEvent.EVENT_NAME, MapBuilder.of("registrationName", "onInsetsChange"))
.build();
}
@Nullable
@Override
public Map<String, Object> getExportedViewConstants() {
Activity activity = mContext.getCurrentActivity();
if (activity == null) {
return null;
}
ViewGroup decorView = (ViewGroup) activity.getWindow().getDecorView();
if (decorView == null) {
return null;
}
View contentView = decorView.findViewById(android.R.id.content);
EdgeInsets insets = SafeAreaUtils.getSafeAreaInsets(decorView, contentView);
Rect frame = SafeAreaUtils.getFrame(decorView, contentView);
if (insets == null || frame == null) {
return null;
}
return MapBuilder.<String, Object>of(
"initialWindowMetrics",
MapBuilder.<String, Object>of(
"insets",
SerializationUtils.edgeInsetsToJavaMap(insets),
"frame",
SerializationUtils.rectToJavaMap(frame)));
}
}