SafeAreaViewManager.java 2.6KB

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