2
2
3
3
package com .facebook .react .uimanager .util ;
4
4
5
- import javax .annotation .Nullable ;
6
-
7
- import java .util .ArrayList ;
8
- import java .util .Iterator ;
9
- import java .util .List ;
10
-
11
5
import android .view .View ;
12
6
import android .view .ViewGroup ;
13
-
14
7
import com .facebook .react .R ;
8
+ import java .util .ArrayList ;
9
+ import java .util .HashMap ;
10
+ import java .util .Iterator ;
11
+ import java .util .List ;
12
+ import java .util .Map ;
13
+ import java .util .Set ;
14
+ import javax .annotation .Nullable ;
15
15
16
16
/**
17
17
* Finds views in React Native view hierarchies
18
18
*/
19
19
public class ReactFindViewUtil {
20
20
21
21
private static final List <OnViewFoundListener > mOnViewFoundListeners = new ArrayList <>();
22
+ private static final Map <OnMultipleViewsFoundListener , Set <String >>
23
+ mOnMultipleViewsFoundListener = new HashMap <>();
22
24
23
25
/**
24
26
* Callback to be invoked when a react native view has been found
@@ -37,6 +39,18 @@ public interface OnViewFoundListener {
37
39
void onViewFound (View view );
38
40
}
39
41
42
+ /**
43
+ * Callback to be invoked when all react native views with geiven NativeIds have been found
44
+ */
45
+ public interface OnMultipleViewsFoundListener {
46
+
47
+ void onViewFound (View view , String nativeId );
48
+ /**
49
+ * Called when all teh views have been found
50
+ * @param map
51
+ */
52
+ }
53
+
40
54
/**
41
55
* Finds a view that is tagged with {@param nativeId} as its nativeID prop
42
56
* under the {@param root} view hierarchy. Returns the view if found, null otherwise.
@@ -90,6 +104,14 @@ public static void removeViewListener(OnViewFoundListener onViewFoundListener) {
90
104
mOnViewFoundListeners .remove (onViewFoundListener );
91
105
}
92
106
107
+ public static void addViewsListener (OnMultipleViewsFoundListener listener , Set <String > ids ) {
108
+ mOnMultipleViewsFoundListener .put (listener , ids );
109
+ }
110
+
111
+ public static void removeViewsListener (OnMultipleViewsFoundListener listener ) {
112
+ mOnMultipleViewsFoundListener .remove (listener );
113
+ }
114
+
93
115
/**
94
116
* Invokes any listeners that are listening on this {@param view}'s native id
95
117
*/
@@ -106,6 +128,21 @@ public static void notifyViewRendered(View view) {
106
128
iterator .remove ();
107
129
}
108
130
}
131
+
132
+ Iterator <Map .Entry <OnMultipleViewsFoundListener , Set <String >>>
133
+ viewIterator = mOnMultipleViewsFoundListener .entrySet ().iterator ();
134
+ while (viewIterator .hasNext ()) {
135
+ Map .Entry <OnMultipleViewsFoundListener , Set <String >> entry =
136
+ viewIterator .next ();
137
+ Set <String > nativeIds = entry .getValue ();
138
+ if (nativeIds .contains (nativeId )) {
139
+ entry .getKey ().onViewFound (view , nativeId );
140
+ nativeIds .remove (nativeId ); // remove it from list of NativeIds to search for.
141
+ }
142
+ if (nativeIds .isEmpty ()) {
143
+ viewIterator .remove ();
144
+ }
145
+ }
109
146
}
110
147
111
148
private static @ Nullable String getNativeId (View view ) {
0 commit comments