SafeAreaView.java 1.9KB

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