react-native-navigation的迁移库

BottomTabPresenter.java 6.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package com.reactnativenavigation.presentation;
  2. import android.content.Context;
  3. import android.graphics.drawable.Drawable;
  4. import android.support.annotation.NonNull;
  5. import android.support.v4.content.ContextCompat;
  6. import com.aurelhubert.ahbottomnavigation.notification.AHNotification;
  7. import com.reactnativenavigation.parse.BottomTabOptions;
  8. import com.reactnativenavigation.parse.DotIndicatorOptions;
  9. import com.reactnativenavigation.parse.Options;
  10. import com.reactnativenavigation.utils.ImageLoader;
  11. import com.reactnativenavigation.utils.ImageLoadingListenerAdapter;
  12. import com.reactnativenavigation.viewcontrollers.ViewController;
  13. import com.reactnativenavigation.viewcontrollers.bottomtabs.BottomTabFinder;
  14. import com.reactnativenavigation.views.BottomTabs;
  15. import com.reactnativenavigation.views.Component;
  16. import java.util.List;
  17. import static com.reactnativenavigation.utils.UiUtils.dpToPx;
  18. public class BottomTabPresenter {
  19. private final Context context;
  20. private ImageLoader imageLoader;
  21. private Options defaultOptions;
  22. private final BottomTabFinder bottomTabFinder;
  23. private BottomTabs bottomTabs;
  24. private final int defaultSelectedTextColor;
  25. private final int defaultTextColor;
  26. private final List<ViewController> tabs;
  27. private final int defaultDotIndicatorSize;
  28. public BottomTabPresenter(Context context, List<ViewController> tabs, ImageLoader imageLoader, Options defaultOptions) {
  29. this.tabs = tabs;
  30. this.context = context;
  31. this.bottomTabFinder = new BottomTabFinder(tabs);
  32. this.imageLoader = imageLoader;
  33. this.defaultOptions = defaultOptions;
  34. defaultSelectedTextColor = defaultOptions.bottomTabOptions.selectedIconColor.get(ContextCompat.getColor(context, com.aurelhubert.ahbottomnavigation.R.color.colorBottomNavigationAccent));
  35. defaultTextColor = defaultOptions.bottomTabOptions.iconColor.get(ContextCompat.getColor(context, com.aurelhubert.ahbottomnavigation.R.color.colorBottomNavigationInactive));
  36. defaultDotIndicatorSize = dpToPx(context, 6);
  37. }
  38. public void setDefaultOptions(Options defaultOptions) {
  39. this.defaultOptions = defaultOptions;
  40. }
  41. public void bindView(BottomTabs bottomTabs) {
  42. this.bottomTabs = bottomTabs;
  43. }
  44. public void applyOptions() {
  45. for (int i = 0; i < tabs.size(); i++) {
  46. BottomTabOptions tab = tabs.get(i).resolveCurrentOptions(defaultOptions).bottomTabOptions;
  47. bottomTabs.setTitleTypeface(i, tab.fontFamily);
  48. bottomTabs.setIconActiveColor(i, tab.selectedIconColor.get(null));
  49. bottomTabs.setIconInactiveColor(i, tab.iconColor.get(null));
  50. bottomTabs.setTitleActiveColor(i, tab.selectedTextColor.get(null));
  51. bottomTabs.setTitleInactiveColor(i, tab.textColor.get(null));
  52. bottomTabs.setTitleInactiveTextSizeInSp(i, tab.fontSize.hasValue() ? Float.valueOf(tab.fontSize.get()) : null);
  53. bottomTabs.setTitleActiveTextSizeInSp(i, tab.selectedFontSize.hasValue() ? Float.valueOf(tab.selectedFontSize.get()) : null);
  54. if (tab.testId.hasValue()) bottomTabs.setTag(i, tab.testId.get());
  55. if (shouldApplyDot(tab)) applyDotIndicator(i, tab.dotIndicator); else applyBadge(i, tab);
  56. }
  57. }
  58. public void mergeChildOptions(Options options, Component child) {
  59. int index = bottomTabFinder.findByComponent(child);
  60. if (index >= 0) {
  61. BottomTabOptions tab = options.bottomTabOptions;
  62. if (tab.fontFamily != null) bottomTabs.setTitleTypeface(index, tab.fontFamily);
  63. if (tab.selectedIconColor.hasValue()) bottomTabs.setIconActiveColor(index, tab.selectedIconColor.get());
  64. if (tab.iconColor.hasValue()) bottomTabs.setIconInactiveColor(index, tab.iconColor.get());
  65. if (tab.selectedTextColor.hasValue()) bottomTabs.setTitleActiveColor(index, tab.selectedTextColor.get());
  66. if (tab.textColor.hasValue()) bottomTabs.setTitleInactiveColor(index, tab.textColor.get());
  67. if (tab.text.hasValue()) bottomTabs.setText(index, tab.text.get());
  68. if (tab.icon.hasValue()) imageLoader.loadIcon(context, tab.icon.get(), new ImageLoadingListenerAdapter() {
  69. @Override
  70. public void onComplete(@NonNull Drawable drawable) {
  71. bottomTabs.setIcon(index, drawable);
  72. }
  73. });
  74. if (tab.testId.hasValue()) bottomTabs.setTag(index, tab.testId.get());
  75. if (shouldApplyDot(tab)) mergeDotIndicator(index, tab.dotIndicator); else mergeBadge(index, tab);
  76. }
  77. }
  78. private void applyDotIndicator(int tabIndex, DotIndicatorOptions dotIndicator) {
  79. AHNotification.Builder builder = new AHNotification.Builder()
  80. .setText("")
  81. .setBackgroundColor(dotIndicator.color.get(null))
  82. .setSize(dotIndicator.size.get(defaultDotIndicatorSize));
  83. bottomTabs.setNotification(builder.build(), tabIndex);
  84. }
  85. private void applyBadge(int tabIndex, BottomTabOptions tab) {
  86. AHNotification.Builder builder = new AHNotification.Builder()
  87. .setText(tab.badge.get(""))
  88. .setBackgroundColor(tab.badgeColor.get(null));
  89. bottomTabs.setNotification(builder.build(), tabIndex);
  90. }
  91. private void mergeBadge(int index, BottomTabOptions tab) {
  92. if (!tab.badge.hasValue()) return;
  93. AHNotification.Builder builder = new AHNotification.Builder();
  94. if (tab.badge.hasValue()) builder.setText(tab.badge.get());
  95. if (tab.badgeColor.hasValue()) builder.setBackgroundColor(tab.badgeColor.get());
  96. bottomTabs.setNotification(builder.build(), index);
  97. }
  98. private void mergeDotIndicator(int index, DotIndicatorOptions dotIndicator) {
  99. AHNotification.Builder builder = new AHNotification.Builder();
  100. if (dotIndicator.color.hasValue()) builder.setBackgroundColor(dotIndicator.color.get());
  101. builder.setSize(dotIndicator.visible.isFalse() ? 0 : dotIndicator.size.get(defaultDotIndicatorSize));
  102. AHNotification notification = builder.build();
  103. if (notification.hasValue()) bottomTabs.setNotification(notification, index);
  104. }
  105. private boolean shouldApplyDot(BottomTabOptions tab) {
  106. return tab.dotIndicator.visible.hasValue() && !tab.badge.hasValue();
  107. }
  108. }