Add support for finding multiple views with NativeIds using a single listener
Reviewed By: mdvacca Differential Revision: D6735460 fbshipit-source-id: e038a68637a00fda7058fc82e253ae68cdf67c6e
This commit is contained in:
parent
71ec85f24c
commit
f5efc460ad
|
@ -2,16 +2,16 @@
|
||||||
|
|
||||||
package com.facebook.react.uimanager.util;
|
package com.facebook.react.uimanager.util;
|
||||||
|
|
||||||
import javax.annotation.Nullable;
|
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.ViewGroup;
|
import android.view.ViewGroup;
|
||||||
|
|
||||||
import com.facebook.react.R;
|
import com.facebook.react.R;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Iterator;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import javax.annotation.Nullable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds views in React Native view hierarchies
|
* Finds views in React Native view hierarchies
|
||||||
|
@ -19,6 +19,8 @@ import com.facebook.react.R;
|
||||||
public class ReactFindViewUtil {
|
public class ReactFindViewUtil {
|
||||||
|
|
||||||
private static final List<OnViewFoundListener> mOnViewFoundListeners = new ArrayList<>();
|
private static final List<OnViewFoundListener> mOnViewFoundListeners = new ArrayList<>();
|
||||||
|
private static final Map<OnMultipleViewsFoundListener, Set<String>>
|
||||||
|
mOnMultipleViewsFoundListener = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Callback to be invoked when a react native view has been found
|
* Callback to be invoked when a react native view has been found
|
||||||
|
@ -37,6 +39,18 @@ public class ReactFindViewUtil {
|
||||||
void onViewFound(View view);
|
void onViewFound(View view);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to be invoked when all react native views with geiven NativeIds have been found
|
||||||
|
*/
|
||||||
|
public interface OnMultipleViewsFoundListener{
|
||||||
|
|
||||||
|
void onViewFound(View view, String nativeId);
|
||||||
|
/**
|
||||||
|
* Called when all teh views have been found
|
||||||
|
* @param map
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Finds a view that is tagged with {@param nativeId} as its nativeID prop
|
* Finds a view that is tagged with {@param nativeId} as its nativeID prop
|
||||||
* under the {@param root} view hierarchy. Returns the view if found, null otherwise.
|
* under the {@param root} view hierarchy. Returns the view if found, null otherwise.
|
||||||
|
@ -90,6 +104,14 @@ public class ReactFindViewUtil {
|
||||||
mOnViewFoundListeners.remove(onViewFoundListener);
|
mOnViewFoundListeners.remove(onViewFoundListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void addViewsListener(OnMultipleViewsFoundListener listener, Set<String> ids) {
|
||||||
|
mOnMultipleViewsFoundListener.put(listener, ids);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void removeViewsListener(OnMultipleViewsFoundListener listener) {
|
||||||
|
mOnMultipleViewsFoundListener.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Invokes any listeners that are listening on this {@param view}'s native id
|
* Invokes any listeners that are listening on this {@param view}'s native id
|
||||||
*/
|
*/
|
||||||
|
@ -106,6 +128,21 @@ public class ReactFindViewUtil {
|
||||||
iterator.remove();
|
iterator.remove();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Iterator<Map.Entry<OnMultipleViewsFoundListener, Set<String>>>
|
||||||
|
viewIterator = mOnMultipleViewsFoundListener.entrySet().iterator();
|
||||||
|
while (viewIterator.hasNext()) {
|
||||||
|
Map.Entry<OnMultipleViewsFoundListener, Set<String>> entry =
|
||||||
|
viewIterator.next();
|
||||||
|
Set<String> nativeIds = entry.getValue();
|
||||||
|
if (nativeIds.contains(nativeId)) {
|
||||||
|
entry.getKey().onViewFound(view, nativeId);
|
||||||
|
nativeIds.remove(nativeId); // remove it from list of NativeIds to search for.
|
||||||
|
}
|
||||||
|
if (nativeIds.isEmpty()) {
|
||||||
|
viewIterator.remove();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static @Nullable String getNativeId(View view) {
|
private static @Nullable String getNativeId(View view) {
|
||||||
|
|
Loading…
Reference in New Issue