package com.stardust.automator;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.util.Consumer;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.*;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_CONTEXT_CLICK;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_DOWN;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_LEFT;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_RIGHT;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_TO_POSITION;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SCROLL_UP;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SET_PROGRESS;
import static android.support.v4.view.accessibility.AccessibilityNodeInfoCompat.AccessibilityActionCompat.ACTION_SHOW_ON_SCREEN;
/**
* Created by Stardust on 2017/3/9.
*/
public class UiObjectCollection {
public static final UiObjectCollection EMPTY = UiObjectCollection.of(Collections.<UiObject>emptyList());
public static UiObjectCollection ofCompat(List<AccessibilityNodeInfoCompat> list) {
return new UiObjectCollection(UiObject.compatListToUiObjectList(list));
}
public static UiObjectCollection ofInfo(List<AccessibilityNodeInfo> list) {
List<UiObject> compatList = new ArrayList<>(list.size());
for (AccessibilityNodeInfo nodeInfo : list) {
compatList.add(new UiObject(nodeInfo));
}
return new UiObjectCollection(compatList);
}
public static UiObjectCollection of(List<UiObject> list) {
return new UiObjectCollection(list);
}
private List<UiObject> mNodes;
private UiObjectCollection(List<UiObject> list) {
mNodes = list;
}
public boolean performAction(int action) {
boolean fail = false;
for (UiObject node : mNodes) {
if (!node.performAction(action)) {
fail = true;
}
}
return !fail;
}
public boolean performAction(int action, ActionArgument... arguments) {
boolean fail = false;
Bundle bundle = argumentsToBundle(arguments);
for (UiObject node : mNodes) {
if (!node.performAction(action, bundle)) {
fail = true;
}
}
return !fail;
}
private Bundle argumentsToBundle(ActionArgument[] arguments) {
Bundle bundle = new Bundle();
for (ActionArgument arg : arguments) {
arg.putIn(bundle);
}
return bundle;
}
public boolean click() {
return performAction(ACTION_CLICK);
}
public boolean longClick() {
return performAction(ACTION_LONG_CLICK);
}
public boolean accessibilityFocus() {
return performAction(ACTION_ACCESSIBILITY_FOCUS);
}
public boolean clearAccessibilityFocus() {
return performAction(ACTION_CLEAR_ACCESSIBILITY_FOCUS);
}
public boolean focus() {
return performAction(ACTION_FOCUS);
}
public boolean clearFocus() {
return performAction(ACTION_CLEAR_FOCUS);
}
public boolean copy() {
return performAction(ACTION_COPY);
}
public boolean paste() {
return performAction(ACTION_PASTE);
}
public boolean select() {
return performAction(ACTION_SELECT);
}
public boolean cut() {
return performAction(ACTION_CUT);
}
public boolean collapse() {
return performAction(ACTION_COLLAPSE);
}
public boolean expand() {
return performAction(ACTION_EXPAND);
}
public boolean dismiss() {
return performAction(ACTION_DISMISS);
}
public boolean show() {
return performAction(ACTION_SHOW_ON_SCREEN.getId());
}
public boolean scrollForward() {
return performAction(ACTION_SCROLL_FORWARD);
}
public boolean scrollBackward() {
return performAction(ACTION_SCROLL_BACKWARD);
}
public boolean scrollUp() {
return performAction(ACTION_SCROLL_UP.getId());
}
public boolean scrollDown() {
return performAction(ACTION_SCROLL_DOWN.getId());
}
public boolean scrollLeft() {
return performAction(ACTION_SCROLL_LEFT.getId());
}
public boolean scrollRight() {
return performAction(ACTION_SCROLL_RIGHT.getId());
}
public boolean contextClick() {
return performAction(ACTION_CONTEXT_CLICK.getId());
}
public boolean setSelection(int s, int e) {
return performAction(ACTION_SET_SELECTION,
new ActionArgument.IntActionArgument(ACTION_ARGUMENT_SELECTION_START_INT, s),
new ActionArgument.IntActionArgument(ACTION_ARGUMENT_SELECTION_END_INT, e));
}
public boolean setText(CharSequence text) {
return performAction(ACTION_SET_TEXT,
new ActionArgument.CharSequenceActionArgument(ACTION_ARGUMENT_SET_TEXT_CHARSEQUENCE, text));
}
public boolean setProgress(float value) {
return performAction(ACTION_SET_PROGRESS.getId(),
new ActionArgument.FloatActionArgument(ACTION_ARGUMENT_PROGRESS_VALUE, value));
}
public boolean scrollTo(int row, int column) {
return performAction(ACTION_SCROLL_TO_POSITION.getId(),
new ActionArgument.IntActionArgument(ACTION_ARGUMENT_ROW_INT, row),
new ActionArgument.IntActionArgument(ACTION_ARGUMENT_COLUMN_INT, column));
}
public UiObject get(int i) {
return mNodes.get(i);
}
public int size() {
return mNodes.size();
}
public UiObjectCollection each(Consumer<UiObject> consumer) {
for (UiObject uiObject : mNodes) {
consumer.accept(uiObject);
}
return this;
}
public UiObjectCollection find(UiGlobalSelector selector) {
List<UiObject> list = new ArrayList<>();
for (UiObject object : mNodes) {
list.addAll(selector.findOf(object).mNodes);
}
return of(list);
}
@Nullable
public UiObject findOne(UiGlobalSelector selector) {
for (UiObject object : mNodes) {
UiObject result = selector.findOneOf(object);
if (result != null)
return result;
}
return null;
}
public boolean empty() {
return size() == 0;
}
public boolean nonEmpty() {
return size() != 0;
}
}