Skip to content

Commit 2ceed95

Browse files
AlanFosterfacebook-github-bot
authored andcommitted
Support flash scroll indicators for android
Summary: There is missing support for flash scroll indicators on Android. This PR adds this functionality. Ensured that the functionality works now within iOS _and_ Android ![flashindicators-ios](https://user-images.githubusercontent.com/1271782/29491236-80ecc062-854c-11e7-9562-bdfe03d505f9.gif) ![flashindicators-android](https://user-images.githubusercontent.com/1271782/29491238-826f321c-854c-11e7-955c-cd425afd05f8.gif) Closes #15566 Differential Revision: D5686942 Pulled By: shergin fbshipit-source-id: 40c8bfec47d660fe8108253bb9ba9fd16ff0d19c
1 parent 1a262a7 commit 2ceed95

File tree

6 files changed

+53
-42
lines changed

6 files changed

+53
-42
lines changed

Libraries/Components/ScrollResponder.js

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -467,12 +467,13 @@ var ScrollResponderMixin = {
467467

468468
/**
469469
* Displays the scroll indicators momentarily.
470-
*
471-
* @platform ios
472470
*/
473471
scrollResponderFlashScrollIndicators: function() {
474-
invariant(ScrollViewManager && ScrollViewManager.flashScrollIndicators, 'flashScrollIndicators is not implemented');
475-
ScrollViewManager.flashScrollIndicators(this.scrollResponderGetScrollableNode());
472+
UIManager.dispatchViewManagerCommand(
473+
this.scrollResponderGetScrollableNode(),
474+
UIManager.RCTScrollView.Commands.flashScrollIndicators,
475+
[]
476+
);
476477
},
477478

478479
/**

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollView.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,6 @@
99

1010
package com.facebook.react.views.scroll;
1111

12-
import javax.annotation.Nullable;
13-
1412
import android.annotation.TargetApi;
1513
import android.content.Context;
1614
import android.graphics.Canvas;
@@ -22,13 +20,13 @@
2220
import android.view.MotionEvent;
2321
import android.view.View;
2422
import android.widget.HorizontalScrollView;
25-
2623
import com.facebook.infer.annotation.Assertions;
2724
import com.facebook.react.uimanager.MeasureSpecAssertions;
28-
import com.facebook.react.uimanager.events.NativeGestureUtil;
2925
import com.facebook.react.uimanager.ReactClippingViewGroup;
3026
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
27+
import com.facebook.react.uimanager.events.NativeGestureUtil;
3128
import com.facebook.react.views.view.ReactViewBackgroundDrawable;
29+
import javax.annotation.Nullable;
3230

3331
/**
3432
* Similar to {@link ReactScrollView} but only supports horizontal scrolling.
@@ -92,6 +90,10 @@ public void setPagingEnabled(boolean pagingEnabled) {
9290
mPagingEnabled = pagingEnabled;
9391
}
9492

93+
public void flashScrollIndicators() {
94+
awakenScrollBars();
95+
}
96+
9597
@Override
9698
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
9799
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactHorizontalScrollViewManager.java

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,22 +9,19 @@
99

1010
package com.facebook.react.views.scroll;
1111

12-
import javax.annotation.Nullable;
13-
1412
import android.graphics.Color;
15-
import android.view.View;
16-
1713
import com.facebook.react.bridge.ReadableArray;
1814
import com.facebook.react.module.annotations.ReactModule;
1915
import com.facebook.react.uimanager.PixelUtil;
16+
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
2017
import com.facebook.react.uimanager.Spacing;
21-
import com.facebook.react.uimanager.ViewProps;
22-
import com.facebook.react.uimanager.annotations.ReactProp;
2318
import com.facebook.react.uimanager.ThemedReactContext;
2419
import com.facebook.react.uimanager.ViewGroupManager;
25-
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
20+
import com.facebook.react.uimanager.ViewProps;
21+
import com.facebook.react.uimanager.annotations.ReactProp;
2622
import com.facebook.react.uimanager.annotations.ReactPropGroup;
2723
import com.facebook.yoga.YogaConstants;
24+
import javax.annotation.Nullable;
2825

2926
/**
3027
* View manager for {@link ReactHorizontalScrollView} components.
@@ -124,10 +121,14 @@ public void receiveCommand(
124121
ReactScrollViewCommandHelper.receiveCommand(this, scrollView, commandId, args);
125122
}
126123

124+
@Override
125+
public void flashScrollIndicators(ReactHorizontalScrollView scrollView) {
126+
scrollView.flashScrollIndicators();
127+
}
128+
127129
@Override
128130
public void scrollTo(
129-
ReactHorizontalScrollView scrollView,
130-
ReactScrollViewCommandHelper.ScrollToCommandData data) {
131+
ReactHorizontalScrollView scrollView, ReactScrollViewCommandHelper.ScrollToCommandData data) {
131132
if (data.mAnimated) {
132133
scrollView.smoothScrollTo(data.mDestX, data.mDestY);
133134
} else {

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollView.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,6 @@
99

1010
package com.facebook.react.views.scroll;
1111

12-
import javax.annotation.Nullable;
13-
14-
import java.lang.reflect.Field;
15-
1612
import android.graphics.Canvas;
1713
import android.graphics.Color;
1814
import android.graphics.Rect;
@@ -25,15 +21,16 @@
2521
import android.view.ViewGroup;
2622
import android.widget.OverScroller;
2723
import android.widget.ScrollView;
28-
24+
import com.facebook.infer.annotation.Assertions;
2925
import com.facebook.react.bridge.ReactContext;
3026
import com.facebook.react.common.ReactConstants;
3127
import com.facebook.react.uimanager.MeasureSpecAssertions;
32-
import com.facebook.react.uimanager.events.NativeGestureUtil;
3328
import com.facebook.react.uimanager.ReactClippingViewGroup;
3429
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
35-
import com.facebook.infer.annotation.Assertions;
30+
import com.facebook.react.uimanager.events.NativeGestureUtil;
3631
import com.facebook.react.views.view.ReactViewBackgroundDrawable;
32+
import java.lang.reflect.Field;
33+
import javax.annotation.Nullable;
3734

3835
/**
3936
* A simple subclass of ScrollView that doesn't dispatch measure and layout to its children and has
@@ -121,6 +118,10 @@ public void setScrollEnabled(boolean scrollEnabled) {
121118
mScrollEnabled = scrollEnabled;
122119
}
123120

121+
public void flashScrollIndicators() {
122+
awakenScrollBars();
123+
}
124+
124125
@Override
125126
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
126127
MeasureSpecAssertions.assertExplicitMeasureSpec(widthMeasureSpec, heightMeasureSpec);

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewCommandHelper.java

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,12 @@
99

1010
package com.facebook.react.views.scroll;
1111

12-
import javax.annotation.Nullable;
13-
14-
import java.util.Map;
15-
16-
import com.facebook.react.bridge.ReadableArray;
17-
import com.facebook.react.uimanager.PixelUtil;
1812
import com.facebook.infer.annotation.Assertions;
13+
import com.facebook.react.bridge.ReadableArray;
1914
import com.facebook.react.common.MapBuilder;
15+
import com.facebook.react.uimanager.PixelUtil;
16+
import java.util.Map;
17+
import javax.annotation.Nullable;
2018

2119
/**
2220
* Helper for view managers to handle commands like 'scrollTo'.
@@ -26,10 +24,12 @@ public class ReactScrollViewCommandHelper {
2624

2725
public static final int COMMAND_SCROLL_TO = 1;
2826
public static final int COMMAND_SCROLL_TO_END = 2;
27+
public static final int COMMAND_FLASH_SCROLL_INDICATORS = 3;
2928

3029
public interface ScrollCommandHandler<T> {
3130
void scrollTo(T scrollView, ScrollToCommandData data);
3231
void scrollToEnd(T scrollView, ScrollToEndCommandData data);
32+
void flashScrollIndicators(T scrollView);
3333
}
3434

3535
public static class ScrollToCommandData {
@@ -58,7 +58,9 @@ public static Map<String,Integer> getCommandsMap() {
5858
"scrollTo",
5959
COMMAND_SCROLL_TO,
6060
"scrollToEnd",
61-
COMMAND_SCROLL_TO_END);
61+
COMMAND_SCROLL_TO_END,
62+
"flashScrollIndicators",
63+
COMMAND_FLASH_SCROLL_INDICATORS);
6264
}
6365

6466
public static <T> void receiveCommand(
@@ -82,6 +84,10 @@ public static <T> void receiveCommand(
8284
viewManager.scrollToEnd(scrollView, new ScrollToEndCommandData(animated));
8385
return;
8486
}
87+
case COMMAND_FLASH_SCROLL_INDICATORS:
88+
viewManager.flashScrollIndicators(scrollView);
89+
return;
90+
8591
default:
8692
throw new IllegalArgumentException(String.format(
8793
"Unsupported command %d received by %s.",

ReactAndroid/src/main/java/com/facebook/react/views/scroll/ReactScrollViewManager.java

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,21 @@
99

1010
package com.facebook.react.views.scroll;
1111

12-
import javax.annotation.Nullable;
13-
14-
import java.util.Map;
15-
1612
import android.graphics.Color;
17-
import android.view.View;
18-
1913
import com.facebook.react.bridge.ReadableArray;
2014
import com.facebook.react.common.MapBuilder;
2115
import com.facebook.react.module.annotations.ReactModule;
2216
import com.facebook.react.uimanager.PixelUtil;
17+
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
2318
import com.facebook.react.uimanager.Spacing;
24-
import com.facebook.react.uimanager.ViewProps;
25-
import com.facebook.react.uimanager.annotations.ReactProp;
2619
import com.facebook.react.uimanager.ThemedReactContext;
2720
import com.facebook.react.uimanager.ViewGroupManager;
28-
import com.facebook.react.uimanager.ReactClippingViewGroupHelper;
21+
import com.facebook.react.uimanager.ViewProps;
22+
import com.facebook.react.uimanager.annotations.ReactProp;
2923
import com.facebook.react.uimanager.annotations.ReactPropGroup;
3024
import com.facebook.yoga.YogaConstants;
25+
import java.util.Map;
26+
import javax.annotation.Nullable;
3127

3228
/**
3329
* View manager for {@link ReactScrollView} components.
@@ -138,10 +134,14 @@ public void receiveCommand(
138134
ReactScrollViewCommandHelper.receiveCommand(this, scrollView, commandId, args);
139135
}
140136

137+
@Override
138+
public void flashScrollIndicators(ReactScrollView scrollView) {
139+
scrollView.flashScrollIndicators();
140+
}
141+
141142
@Override
142143
public void scrollTo(
143-
ReactScrollView scrollView,
144-
ReactScrollViewCommandHelper.ScrollToCommandData data) {
144+
ReactScrollView scrollView, ReactScrollViewCommandHelper.ScrollToCommandData data) {
145145
if (data.mAnimated) {
146146
scrollView.smoothScrollTo(data.mDestX, data.mDestY);
147147
} else {

0 commit comments

Comments
 (0)