react-native-navigation的迁移库

ChildController.java 3.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. package com.reactnativenavigation.viewcontrollers;
  2. import android.app.Activity;
  3. import android.view.View;
  4. import android.view.ViewGroup;
  5. import com.reactnativenavigation.parse.Options;
  6. import com.reactnativenavigation.presentation.Presenter;
  7. import com.reactnativenavigation.utils.StatusBarUtils;
  8. import com.reactnativenavigation.viewcontrollers.navigator.Navigator;
  9. import com.reactnativenavigation.viewcontrollers.viewcontrolleroverlay.ViewControllerOverlay;
  10. import com.reactnativenavigation.views.Component;
  11. import androidx.annotation.CallSuper;
  12. import androidx.core.view.ViewCompat;
  13. import androidx.core.view.WindowInsetsCompat;
  14. public abstract class ChildController<T extends ViewGroup> extends ViewController<T> {
  15. private final Presenter presenter;
  16. private final ChildControllersRegistry childRegistry;
  17. public ChildControllersRegistry getChildRegistry() {
  18. return childRegistry;
  19. }
  20. public ChildController(Activity activity, ChildControllersRegistry childRegistry, String id, Presenter presenter, Options initialOptions) {
  21. super(activity, id, new NoOpYellowBoxDelegate(), initialOptions, new ViewControllerOverlay(activity));
  22. this.presenter = presenter;
  23. this.childRegistry = childRegistry;
  24. }
  25. @Override
  26. public T getView() {
  27. if (view == null) {
  28. super.getView();
  29. view.setFitsSystemWindows(true);
  30. ViewCompat.setOnApplyWindowInsetsListener(view, this::onApplyWindowInsets);
  31. }
  32. return view;
  33. }
  34. @Override
  35. @CallSuper
  36. public void setDefaultOptions(Options defaultOptions) {
  37. presenter.setDefaultOptions(defaultOptions);
  38. }
  39. @Override
  40. public void onViewAppeared() {
  41. super.onViewAppeared();
  42. childRegistry.onViewAppeared(this);
  43. }
  44. @Override
  45. public void onViewDisappear() {
  46. super.onViewDisappear();
  47. childRegistry.onViewDisappear(this);
  48. }
  49. public void onViewBroughtToFront() {
  50. presenter.onViewBroughtToFront(resolveCurrentOptions());
  51. }
  52. @Override
  53. public void applyOptions(Options options) {
  54. super.applyOptions(options);
  55. Options resolvedOptions = resolveCurrentOptions();
  56. presenter.applyOptions(this, resolvedOptions);
  57. }
  58. @Override
  59. public void mergeOptions(Options options) {
  60. if (options == Options.EMPTY) return;
  61. if (isViewShown()) presenter.mergeOptions(getView(), options);
  62. super.mergeOptions(options);
  63. performOnParentController(parentController -> parentController.mergeChildOptions(options, this));
  64. }
  65. @Override
  66. public void destroy() {
  67. if (!isDestroyed() && getView() instanceof Component) {
  68. performOnParentController(parent -> parent.onChildDestroyed(this));
  69. }
  70. super.destroy();
  71. childRegistry.onChildDestroyed(this);
  72. }
  73. protected boolean isRoot() {
  74. return getParentController() == null &&
  75. !(this instanceof Navigator) &&
  76. getView().getParent() != null;
  77. }
  78. private WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) {
  79. StatusBarUtils.saveStatusBarHeight(insets.getSystemWindowInsetTop());
  80. return applyWindowInsets(findController(view), insets);
  81. }
  82. protected WindowInsetsCompat applyWindowInsets(ViewController view, WindowInsetsCompat insets) {
  83. return insets.replaceSystemWindowInsets(
  84. insets.getSystemWindowInsetLeft(),
  85. 0,
  86. insets.getSystemWindowInsetRight(),
  87. insets.getSystemWindowInsetBottom()
  88. );
  89. }
  90. }