SafeAreaView.java 2.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package com.th3rdwave.safeareacontext;
  2. import android.annotation.SuppressLint;
  3. import android.content.Context;
  4. import android.view.ViewGroup;
  5. import android.view.ViewTreeObserver;
  6. import android.view.WindowManager;
  7. import com.facebook.infer.annotation.Assertions;
  8. import com.facebook.react.views.view.ReactViewGroup;
  9. import androidx.annotation.Nullable;
  10. @SuppressLint("ViewConstructor")
  11. public class SafeAreaView extends ReactViewGroup implements ViewTreeObserver.OnGlobalLayoutListener {
  12. public interface OnInsetsChangeListener {
  13. void onInsetsChange(SafeAreaView view, EdgeInsets insets, Rect frame);
  14. }
  15. private @Nullable OnInsetsChangeListener mInsetsChangeListener;
  16. private final WindowManager mWindowManager;
  17. private @Nullable EdgeInsets mLastInsets;
  18. private @Nullable Rect mLastFrame;
  19. public SafeAreaView(Context context, WindowManager windowManager) {
  20. super(context);
  21. mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
  22. }
  23. private void maybeUpdateInsets() {
  24. EdgeInsets edgeInsets = SafeAreaUtils.getSafeAreaInsets(mWindowManager, getRootView(), this);
  25. Rect frame = SafeAreaUtils.getFrame((ViewGroup) getRootView(), this);
  26. if (edgeInsets != null &&
  27. (mLastInsets == null ||
  28. mLastFrame == null ||
  29. !mLastInsets.equalsToEdgeInsets(edgeInsets) ||
  30. !mLastFrame.equalsToRect(frame))) {
  31. Assertions.assertNotNull(mInsetsChangeListener).onInsetsChange(this, edgeInsets, frame);
  32. mLastInsets = edgeInsets;
  33. mLastFrame = frame;
  34. }
  35. }
  36. @Override
  37. protected void onAttachedToWindow() {
  38. super.onAttachedToWindow();
  39. getViewTreeObserver().addOnGlobalLayoutListener(this);
  40. maybeUpdateInsets();
  41. }
  42. @Override
  43. protected void onDetachedFromWindow() {
  44. super.onDetachedFromWindow();
  45. getViewTreeObserver().removeOnGlobalLayoutListener(this);
  46. }
  47. @Override
  48. public void onGlobalLayout() {
  49. maybeUpdateInsets();
  50. }
  51. public void setOnInsetsChangeListener(OnInsetsChangeListener listener) {
  52. mInsetsChangeListener = listener;
  53. }
  54. }