Appium java client has some features based on [Java 8 Functional interfaces](https://www.oreilly.com/learning/java-8-functional-interfaces).
# Conditions
```java
io.appium.java_client.functions.AppiumFunction
```
It extends
```java
java.util.function.Function
```
and
```java
com.google.common.base.Function
```
to make end user available to use _org.openqa.selenium.support.ui.Wait_. There is additional interface
```java
io.appium.java_client.functions.ExpectedCondition
```
which extends
```java
io.appium.java_client.functions.AppiumFunction
```
and
```java
org.openqa.selenium.support.ui.ExpectedCondition
```
This feature provides the ability to create complex condition of the waiting for something.
```java
//waiting for elements
private final AppiumFunction> searchingFunction = input -> {
List result = input.findElements(By.tagName("a"));
if (result.size() > 0) {
return result;
}
return null;
};
//waiting for some context using regular expression pattern
private final AppiumFunction contextFunction = input -> {
Set contexts = driver.getContextHandles();
String current = driver.getContext();
contexts.forEach(context -> {
Matcher m = input.matcher(context);
if (m.find()) {
driver.context(context);
}
});
if (!current.equals(driver.getContext())) {
return driver;
}
return null;
};
```
## using one function as pre-condition
```java
@Test public void tezt() {
....
Wait wait = new FluentWait<>(Pattern.compile("WEBVIEW"))
.withTimeout(30, TimeUnit.SECONDS);
List elements = wait.until(searchingFunction.compose(contextFunction));
....
}
```
## using one function as post-condition
```java
import org.openqa.selenium.support.ui.FluentWait;
import org.openqa.selenium.support.ui.Wait;
@Test public void tezt() {
....
Wait wait = new FluentWait<>(Pattern.compile("WEBVIEW"))
.withTimeout(30, TimeUnit.SECONDS);
List elements = wait.until(contextFunction.andThen(searchingFunction));
....
}
```
# Touch action supplier
[About touch actions](https://github.com/appium/java-client/blob/master/docs/Touch-actions.md)
You can use suppliers to declare touch/multitouch actions for some screens/tests. Also it is possible to
create gesture libraries/utils using suppliers. Appium java client provides this interface
```java
io.appium.java_client.functions.ActionSupplier
```
## Samples
```java
private final ActionSupplier horizontalSwipe = () -> {
driver.findElementById("io.appium.android.apis:id/gallery");
AndroidElement gallery = driver.findElementById("io.appium.android.apis:id/gallery");
List images = gallery
.findElementsByClassName("android.widget.ImageView");
Point location = gallery.getLocation();
Point center = gallery.getCenter();
return new TouchAction(driver).press(images.get(2), -10, center.y - location.y)
.waitAction(2000).moveTo(gallery, 10, center.y - location.y).release();
};
private final ActionSupplier verticalSwiping = () ->
new TouchAction(driver).press(driver.findElementByAccessibilityId("Gallery"))
.waitAction(2000).moveTo(driver.findElementByAccessibilityId("Auto Complete")).release();
@Test public void tezt() {
...
horizontalSwipe.get().perform();
...
verticalSwiping.get().perform();
...
}
```
```java
public class GestureUtils {
public static ActionSupplier swipe(final AppiumDriver> driver, final params) {
return () -> {
new TouchAction(driver).press(params)
.waitAction(params).moveTo(params).release();
};
}
}
public class SomeTest {
@Test public void tezt() {
...
GestureUtils.swipe(driver, params).get().perform();
...
}
}
```