|
@@ -22,6 +22,56 @@ public class RctView extends FrameLayout {
|
22
|
22
|
|
23
|
23
|
private BottomTabActivity context;
|
24
|
24
|
private ReactRootView reactRootView;
|
|
25
|
+ private ScrollView scrollView;
|
|
26
|
+ private int lastScrollY = -1;
|
|
27
|
+ private final ViewTreeObserver.OnScrollChangedListener scrollChangedListener = new ViewTreeObserver.OnScrollChangedListener() {
|
|
28
|
+ @Override
|
|
29
|
+ public void onScrollChanged() {
|
|
30
|
+ if (!scrollView.getViewTreeObserver().isAlive()) {
|
|
31
|
+ return;
|
|
32
|
+ }
|
|
33
|
+
|
|
34
|
+ final int scrollY = scrollView.getScrollY();
|
|
35
|
+ if (scrollY != lastScrollY && // Scroll position changed
|
|
36
|
+ scrollY > 0 && // Ignore top overscroll
|
|
37
|
+ scrollY < (scrollView.getChildAt(0).getHeight() - scrollView.getHeight())) { // Ignore bottom overscroll
|
|
38
|
+ int direction = scrollY > lastScrollY ?
|
|
39
|
+ BottomNavigation.SCROLL_DIRECTION_DOWN :
|
|
40
|
+ BottomNavigation.SCROLL_DIRECTION_UP;
|
|
41
|
+ lastScrollY = scrollY;
|
|
42
|
+ context.onScrollChanged(direction);
|
|
43
|
+ }
|
|
44
|
+ }
|
|
45
|
+ };
|
|
46
|
+ private boolean isScrollEventListenerRegistered = false;
|
|
47
|
+
|
|
48
|
+ private final View.OnAttachStateChangeListener stateChangeListener =
|
|
49
|
+ new View.OnAttachStateChangeListener() {
|
|
50
|
+ @Override
|
|
51
|
+ public void onViewAttachedToWindow(View v) {
|
|
52
|
+ scrollView = getScrollView((ViewGroup) getParent());
|
|
53
|
+
|
|
54
|
+ if (scrollView != null && !isScrollEventListenerRegistered) {
|
|
55
|
+ addScrollListener();
|
|
56
|
+ }
|
|
57
|
+ }
|
|
58
|
+
|
|
59
|
+ @Override
|
|
60
|
+ public void onViewDetachedFromWindow(final View detachedView) {
|
|
61
|
+ removeScrollListener();
|
|
62
|
+
|
|
63
|
+ post(new Runnable() {
|
|
64
|
+ @Override
|
|
65
|
+ public void run() {
|
|
66
|
+ scrollView = getScrollView((ViewGroup) getParent());
|
|
67
|
+ if (scrollView != null && !isScrollEventListenerRegistered) {
|
|
68
|
+ isScrollEventListenerRegistered = true;
|
|
69
|
+ addScrollListener();
|
|
70
|
+ }
|
|
71
|
+ }
|
|
72
|
+ });
|
|
73
|
+ }
|
|
74
|
+ };
|
25
|
75
|
|
26
|
76
|
/**
|
27
|
77
|
* Interface used to run some code when the {@link ReactRootView} is visible.
|
|
@@ -40,16 +90,16 @@ public class RctView extends FrameLayout {
|
40
|
90
|
setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
41
|
91
|
|
42
|
92
|
final OnDisplayedListener onDisplayedListenerInternal = screen.bottomTabsHiddenOnScroll ?
|
43
|
|
- new OnDisplayedListener() {
|
44
|
|
- @Override
|
45
|
|
- public void onDisplayed() {
|
46
|
|
- if (onDisplayedListener != null) {
|
47
|
|
- onDisplayedListener.onDisplayed();
|
48
|
|
- }
|
49
|
|
-
|
50
|
|
- setupScrollViewWithBottomTabs();
|
|
93
|
+ new OnDisplayedListener() {
|
|
94
|
+ @Override
|
|
95
|
+ public void onDisplayed() {
|
|
96
|
+ if (onDisplayedListener != null) {
|
|
97
|
+ onDisplayedListener.onDisplayed();
|
51
|
98
|
}
|
52
|
|
- } : onDisplayedListener;
|
|
99
|
+
|
|
100
|
+ setupScrollViewWithBottomTabs();
|
|
101
|
+ }
|
|
102
|
+ } : onDisplayedListener;
|
53
|
103
|
|
54
|
104
|
reactRootView = new RnnReactRootView(ctx, onDisplayedListenerInternal);
|
55
|
105
|
reactRootView.setLayoutParams(new FrameLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
|
|
@@ -71,6 +121,28 @@ public class RctView extends FrameLayout {
|
71
|
121
|
return passProps;
|
72
|
122
|
}
|
73
|
123
|
|
|
124
|
+ private void setupScrollViewWithBottomTabs() {
|
|
125
|
+ scrollView = getScrollView((ViewGroup) getParent());
|
|
126
|
+ if (scrollView != null) {
|
|
127
|
+ context = (BottomTabActivity) getContext();
|
|
128
|
+ attachStateChangeListener(scrollView);
|
|
129
|
+ addScrollListener();
|
|
130
|
+ }
|
|
131
|
+ }
|
|
132
|
+
|
|
133
|
+
|
|
134
|
+ private void attachStateChangeListener(ScrollView scrollView) {
|
|
135
|
+ scrollView.addOnAttachStateChangeListener(stateChangeListener);
|
|
136
|
+ }
|
|
137
|
+
|
|
138
|
+ private void addScrollListener() {
|
|
139
|
+ scrollView.getViewTreeObserver().addOnScrollChangedListener(scrollChangedListener);
|
|
140
|
+ }
|
|
141
|
+
|
|
142
|
+ private void removeScrollListener() {
|
|
143
|
+ scrollView.getViewTreeObserver().removeOnScrollChangedListener(scrollChangedListener);
|
|
144
|
+ }
|
|
145
|
+
|
74
|
146
|
/**
|
75
|
147
|
* Must be called before view is removed from screen, but will be added again later. Setting mAttachScheduled
|
76
|
148
|
* to true will prevent the component from getting unmounted once view is detached from screen.
|