react-native-navigation的迁移库

TitleBarButtonController.java 7.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183
  1. package com.reactnativenavigation.viewcontrollers;
  2. import android.annotation.SuppressLint;
  3. import android.app.Activity;
  4. import android.graphics.Color;
  5. import android.graphics.drawable.Drawable;
  6. import android.view.Menu;
  7. import android.view.MenuItem;
  8. import android.widget.ImageButton;
  9. import android.widget.TextView;
  10. import com.reactnativenavigation.parse.Options;
  11. import com.reactnativenavigation.parse.params.Button;
  12. import com.reactnativenavigation.parse.params.Text;
  13. import com.reactnativenavigation.react.events.ComponentType;
  14. import com.reactnativenavigation.utils.ArrayUtils;
  15. import com.reactnativenavigation.utils.ButtonPresenter;
  16. import com.reactnativenavigation.utils.ImageLoader;
  17. import com.reactnativenavigation.utils.ImageLoadingListenerAdapter;
  18. import com.reactnativenavigation.utils.UiUtils;
  19. import com.reactnativenavigation.utils.ViewUtils;
  20. import com.reactnativenavigation.viewcontrollers.button.IconResolver;
  21. import com.reactnativenavigation.viewcontrollers.viewcontrolleroverlay.ViewControllerOverlay;
  22. import com.reactnativenavigation.views.titlebar.TitleBarReactButtonView;
  23. import java.util.List;
  24. import androidx.annotation.NonNull;
  25. import androidx.annotation.RestrictTo;
  26. import androidx.appcompat.widget.ActionMenuView;
  27. import androidx.appcompat.widget.Toolbar;
  28. import androidx.core.view.MenuItemCompat;
  29. public class TitleBarButtonController extends ViewController<TitleBarReactButtonView> implements MenuItem.OnMenuItemClickListener {
  30. public interface OnClickListener {
  31. void onPress(String buttonId);
  32. }
  33. private final IconResolver navigationIconResolver;
  34. private ButtonPresenter optionsPresenter;
  35. private final Button button;
  36. private final ReactViewCreator viewCreator;
  37. private TitleBarButtonController.OnClickListener onPressListener;
  38. private Drawable icon;
  39. @RestrictTo(RestrictTo.Scope.TESTS)
  40. public Button getButton() {
  41. return button;
  42. }
  43. public String getButtonInstanceId() {
  44. return button.instanceId;
  45. }
  46. public TitleBarButtonController(Activity activity,
  47. IconResolver navigationIconResolver,
  48. ButtonPresenter optionsPresenter,
  49. Button button,
  50. ReactViewCreator viewCreator,
  51. OnClickListener onClickListener) {
  52. super(activity, button.id, new YellowBoxDelegate(), new Options(), new ViewControllerOverlay(activity));
  53. this.navigationIconResolver = navigationIconResolver;
  54. this.optionsPresenter = optionsPresenter;
  55. this.button = button;
  56. this.viewCreator = viewCreator;
  57. this.onPressListener = onClickListener;
  58. }
  59. @SuppressLint("MissingSuperCall")
  60. @Override
  61. public void onViewAppeared() {
  62. getView().sendComponentStart(ComponentType.Button);
  63. }
  64. @SuppressLint("MissingSuperCall")
  65. @Override
  66. public void onViewDisappear() {
  67. getView().sendComponentStop(ComponentType.Button);
  68. }
  69. @Override
  70. public boolean isRendered() {
  71. return !button.component.componentId.hasValue() || super.isRendered();
  72. }
  73. @Override
  74. public void sendOnNavigationButtonPressed(String buttonId) {
  75. getView().sendOnNavigationButtonPressed(buttonId);
  76. }
  77. @NonNull
  78. @Override
  79. protected TitleBarReactButtonView createView() {
  80. view = (TitleBarReactButtonView) viewCreator.create(getActivity(), button.component.componentId.get(), button.component.name.get());
  81. return (TitleBarReactButtonView) view.asView();
  82. }
  83. @Override
  84. public boolean onMenuItemClick(MenuItem item) {
  85. onPressListener.onPress(button.id);
  86. return true;
  87. }
  88. public void applyNavigationIcon(Toolbar toolbar) {
  89. navigationIconResolver.resolve(button, icon -> {
  90. setIconColor(icon);
  91. toolbar.setNavigationOnClickListener(view -> onPressListener.onPress(button.id));
  92. toolbar.setNavigationIcon(icon);
  93. setLeftButtonTestId(toolbar);
  94. if (button.accessibilityLabel.hasValue()) toolbar.setNavigationContentDescription(button.accessibilityLabel.get());
  95. });
  96. }
  97. private void setLeftButtonTestId(Toolbar toolbar) {
  98. if (!button.testId.hasValue()) return;
  99. toolbar.post(() -> {
  100. ImageButton leftButton = ViewUtils.findChildByClass(toolbar, ImageButton.class);
  101. if (leftButton != null) {
  102. leftButton.setTag(button.testId.get());
  103. }
  104. });
  105. }
  106. public void addToMenu(Toolbar toolbar, int position) {
  107. MenuItem menuItem = toolbar.getMenu().add(Menu.NONE, position, position, button.text.get(""));
  108. if (button.showAsAction.hasValue()) menuItem.setShowAsAction(button.showAsAction.get());
  109. menuItem.setEnabled(button.enabled.isTrueOrUndefined());
  110. menuItem.setOnMenuItemClickListener(this);
  111. if (button.hasComponent()) {
  112. menuItem.setActionView(getView());
  113. if (button.accessibilityLabel.hasValue()) getView().setContentDescription(button.accessibilityLabel.get());
  114. } else {
  115. if (button.accessibilityLabel.hasValue()) MenuItemCompat.setContentDescription(menuItem, button.accessibilityLabel.get());
  116. if (button.hasIcon()) {
  117. loadIcon(new ImageLoadingListenerAdapter() {
  118. @Override
  119. public void onComplete(@NonNull Drawable icon) {
  120. TitleBarButtonController.this.icon = icon;
  121. setIconColor(icon);
  122. menuItem.setIcon(icon);
  123. }
  124. });
  125. } else {
  126. optionsPresenter.setTextColor();
  127. if (button.fontSize.hasValue()) optionsPresenter.setFontSize(menuItem);
  128. optionsPresenter.setTypeFace(button.fontFamily);
  129. }
  130. }
  131. setTestId(toolbar, button.testId);
  132. }
  133. private void loadIcon(ImageLoader.ImagesLoadingListener callback) {
  134. navigationIconResolver.resolve(button, callback::onComplete);
  135. }
  136. private void setIconColor(Drawable icon) {
  137. if (button.disableIconTint.isTrue()) return;
  138. if (button.enabled.isTrueOrUndefined() && button.color.hasValue()) {
  139. optionsPresenter.tint(icon, button.color.get());
  140. } else if (button.enabled.isFalse()) {
  141. optionsPresenter.tint(icon, button.disabledColor.get(Color.LTGRAY));
  142. }
  143. }
  144. private void setTestId(Toolbar toolbar, Text testId) {
  145. if (!testId.hasValue()) return;
  146. UiUtils.runOnPreDrawOnce(toolbar, () -> {
  147. if (button.hasComponent() && view != null) {
  148. view.setTag(testId.get());
  149. }
  150. ActionMenuView buttonsLayout = ViewUtils.findChildByClass(toolbar, ActionMenuView.class);
  151. List<TextView> buttons = ViewUtils.findChildrenByClass(buttonsLayout, TextView.class);
  152. for (TextView view : buttons) {
  153. if (button.text.hasValue() && button.text.get().equals(view.getText().toString())) {
  154. view.setTag(testId.get());
  155. } else if (button.icon.hasValue() && ArrayUtils.contains(view.getCompoundDrawables(), icon)) {
  156. view.setTag(testId.get());
  157. }
  158. }
  159. });
  160. }
  161. }