react-native-navigation的迁移库

TopBarButtonController.java 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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.support.annotation.NonNull;
  7. import android.support.v7.widget.ActionMenuView;
  8. import android.support.v7.widget.Toolbar;
  9. import android.view.MenuItem;
  10. import android.widget.ImageButton;
  11. import android.widget.TextView;
  12. import com.reactnativenavigation.parse.Options;
  13. import com.reactnativenavigation.parse.params.Button;
  14. import com.reactnativenavigation.parse.params.Text;
  15. import com.reactnativenavigation.utils.ArrayUtils;
  16. import com.reactnativenavigation.utils.ButtonOptionsPresenter;
  17. import com.reactnativenavigation.utils.ImageLoader;
  18. import com.reactnativenavigation.utils.ImageLoadingListenerAdapter;
  19. import com.reactnativenavigation.utils.UiUtils;
  20. import com.reactnativenavigation.utils.ViewUtils;
  21. import com.reactnativenavigation.viewcontrollers.button.NavigationIconResolver;
  22. import com.reactnativenavigation.views.titlebar.TitleBarReactButtonView;
  23. import java.util.Collections;
  24. import java.util.List;
  25. public class TopBarButtonController extends ViewController<TitleBarReactButtonView> implements MenuItem.OnMenuItemClickListener {
  26. public interface OnClickListener {
  27. void onPress(String buttonId);
  28. }
  29. private final NavigationIconResolver navigationIconResolver;
  30. private final ImageLoader imageLoader;
  31. private ButtonOptionsPresenter optionsPresenter;
  32. private final Button button;
  33. private final ReactViewCreator viewCreator;
  34. private TopBarButtonController.OnClickListener onPressListener;
  35. private Drawable icon;
  36. public TopBarButtonController(Activity activity, NavigationIconResolver navigationIconResolver, ImageLoader imageLoader, ButtonOptionsPresenter optionsPresenter, Button button, ReactViewCreator viewCreator, OnClickListener onClickListener) {
  37. super(activity, button.id, new Options());
  38. this.navigationIconResolver = navigationIconResolver;
  39. this.imageLoader = imageLoader;
  40. this.optionsPresenter = optionsPresenter;
  41. this.button = button;
  42. this.viewCreator = viewCreator;
  43. this.onPressListener = onClickListener;
  44. }
  45. @SuppressLint("MissingSuperCall")
  46. @Override
  47. public void onViewAppeared() {
  48. view.sendComponentStart();
  49. }
  50. @SuppressLint("MissingSuperCall")
  51. @Override
  52. public void onViewDisappear() {
  53. view.sendComponentStop();
  54. }
  55. @Override
  56. public void sendOnNavigationButtonPressed(String buttonId) {
  57. getView().sendOnNavigationButtonPressed(buttonId);
  58. }
  59. @NonNull
  60. @Override
  61. protected TitleBarReactButtonView createView() {
  62. view = (TitleBarReactButtonView) viewCreator.create(getActivity(), button.component.componentId.get(), button.component.name.get());
  63. return (TitleBarReactButtonView) view.asView();
  64. }
  65. @Override
  66. public boolean onMenuItemClick(MenuItem item) {
  67. onPressListener.onPress(button.id);
  68. return true;
  69. }
  70. public void applyNavigationIcon(Toolbar toolbar) {
  71. navigationIconResolver.resolve(button, icon -> {
  72. setIconColor(icon);
  73. toolbar.setNavigationOnClickListener(view -> onPressListener.onPress(button.id));
  74. toolbar.setNavigationIcon(icon);
  75. setLeftButtonTestId(toolbar);
  76. });
  77. }
  78. private void setLeftButtonTestId(Toolbar toolbar) {
  79. if (!button.testId.hasValue()) return;
  80. toolbar.post(() -> {
  81. ImageButton leftButton = ViewUtils.findChildByClass(toolbar, ImageButton.class);
  82. if (leftButton != null) {
  83. leftButton.setTag(button.testId.get());
  84. }
  85. });
  86. }
  87. public void addToMenu(Toolbar toolbar, int position) {
  88. MenuItem menuItem = toolbar.getMenu().add(0, position, position, button.text.get(""));
  89. if (button.showAsAction.hasValue()) menuItem.setShowAsAction(button.showAsAction.get());
  90. menuItem.setEnabled(button.enabled.isTrueOrUndefined());
  91. menuItem.setOnMenuItemClickListener(this);
  92. if (button.hasComponent()) {
  93. menuItem.setActionView(getView());
  94. } else {
  95. if (button.hasIcon()) {
  96. loadIcon(new ImageLoadingListenerAdapter() {
  97. @Override
  98. public void onComplete(@NonNull List<Drawable> icons) {
  99. Drawable icon = icons.get(0);
  100. TopBarButtonController.this.icon = icon;
  101. setIconColor(icon);
  102. menuItem.setIcon(icon);
  103. }
  104. });
  105. } else {
  106. optionsPresenter.setTextColor();
  107. if (button.fontSize.hasValue()) optionsPresenter.setFontSize(menuItem);
  108. optionsPresenter.setTypeFace(button.fontFamily);
  109. }
  110. }
  111. setTestId(toolbar, button.testId);
  112. }
  113. private void loadIcon(ImageLoader.ImagesLoadingListener callback) {
  114. imageLoader.loadIcons(getActivity(), Collections.singletonList(button.icon.get()), callback);
  115. }
  116. private void setIconColor(Drawable icon) {
  117. if (button.disableIconTint.isTrue()) return;
  118. if (button.enabled.isTrueOrUndefined() && button.color.hasValue()) {
  119. optionsPresenter.tint(icon, button.color.get());
  120. } else if (button.enabled.isFalse()) {
  121. optionsPresenter.tint(icon, button.disabledColor.get(Color.LTGRAY));
  122. }
  123. }
  124. private void setTestId(Toolbar toolbar, Text testId) {
  125. if (!testId.hasValue()) return;
  126. UiUtils.runOnPreDrawOnce(toolbar, () -> {
  127. ActionMenuView buttonsLayout = ViewUtils.findChildByClass(toolbar, ActionMenuView.class);
  128. List<TextView> buttons = ViewUtils.findChildrenByClass(buttonsLayout, TextView.class);
  129. for (TextView view : buttons) {
  130. if (button.text.hasValue() && button.text.get().equals(view.getText().toString())) {
  131. view.setTag(testId.get());
  132. } else if (button.icon.hasValue() && ArrayUtils.contains(view.getCompoundDrawables(), icon)) {
  133. view.setTag(testId.get());
  134. }
  135. }
  136. });
  137. }
  138. }