add: simple code generation

This commit is contained in:
hyb1996
2017-11-06 23:45:36 +08:00
parent 0b884f5747
commit 7c1decdc04
18 changed files with 822 additions and 40 deletions

View File

@@ -1,10 +0,0 @@
package com.stardust.autojs.codegeneration;
/**
* Created by Stardust on 2017/8/4.
*/
public class AutoScriptGenerator {
}

View File

@@ -0,0 +1,226 @@
package com.stardust.autojs.codegeneration;
import android.graphics.Rect;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import com.stardust.automator.UiObject;
import com.stardust.automator.UiObjectCollection;
import com.stardust.view.accessibility.NodeInfo;
/**
* Created by Stardust on 2017/11/5.
*/
public class ReadOnlyUiObject extends UiObject {
private NodeInfo mNodeInfo;
private boolean mUsingId;
private boolean mUsingText;
private boolean mUsingDesc;
public ReadOnlyUiObject(NodeInfo info) {
super(info, info.depth);
mNodeInfo = info;
}
@Nullable
@Override
public UiObject child(int i) {
return new ReadOnlyUiObject(mNodeInfo.getChildren().get(i));
}
@Override
public int childCount() {
return mNodeInfo.getChildren().size();
}
@Override
public int getChildCount() {
return childCount();
}
@Override
public String className() {
return mNodeInfo.className.toString();
}
@Override
public CharSequence getClassName() {
return className();
}
@Override
public String packageName() {
return mNodeInfo.packageName.toString();
}
@Override
public CharSequence getPackageName() {
return packageName();
}
@Override
public String id() {
return mNodeInfo.id;
}
@Override
public String desc() {
return mNodeInfo.desc;
}
@Override
public String getViewIdResourceName() {
return id();
}
@Override
public CharSequence getContentDescription() {
return desc();
}
@Override
public Rect bounds() {
return mNodeInfo.getBoundsInScreen();
}
@Override
public Rect boundsInParent() {
return mNodeInfo.getBoundsInParent();
}
@Override
public int drawingOrder() {
return mNodeInfo.drawingOrder;
}
@NonNull
@Override
public String text() {
return mNodeInfo.text;
}
@Override
public CharSequence getText() {
return text();
}
@Override
public AccessibilityNodeInfoCompat getChild(int index) {
return child(index);
}
@Override
public int getDrawingOrder() {
return drawingOrder();
}
@Override
public void getBoundsInParent(Rect outBounds) {
outBounds.set(mNodeInfo.getBoundsInParent());
}
@Override
public void getBoundsInScreen(Rect outBounds) {
outBounds.set(mNodeInfo.getBoundsInScreen());
}
@Override
public int depth() {
return mNodeInfo.depth;
}
@Override
public boolean checkable() {
return mNodeInfo.checkable;
}
@Override
public boolean checked() {
return mNodeInfo.checked;
}
@Override
public boolean focusable() {
return mNodeInfo.focusable;
}
@Override
public boolean focused() {
return mNodeInfo.focused;
}
@Override
public boolean visibleToUser() {
return mNodeInfo.visibleToUser;
}
@Override
public boolean accessibilityFocused() {
return mNodeInfo.accessibilityFocused;
}
@Override
public boolean selected() {
return mNodeInfo.selected;
}
@Override
public boolean clickable() {
return mNodeInfo.clickable;
}
@Override
public boolean longClickable() {
return mNodeInfo.longClickable;
}
@Override
public boolean enabled() {
return mNodeInfo.enabled;
}
@Override
public boolean scrollable() {
return mNodeInfo.scrollable;
}
@Override
public int row() {
return mNodeInfo.row;
}
@Override
public int column() {
return mNodeInfo.column;
}
@Override
public int rowSpan() {
return mNodeInfo.rowSpan;
}
@Override
public int columnSpan() {
return mNodeInfo.columnSpan;
}
@Override
public int rowCount() {
return mNodeInfo.rowCount;
}
@Override
public int columnCount() {
return mNodeInfo.columnCount;
}
@Override
public void recycle() {
}
}

View File

@@ -0,0 +1,149 @@
package com.stardust.autojs.codegeneration;
import android.support.v4.view.accessibility.AccessibilityNodeInfoCompat;
import com.stardust.automator.UiGlobalSelector;
import com.stardust.util.Consumer;
import com.stardust.view.accessibility.NodeInfo;
/**
* Created by Stardust on 2017/8/4.
*/
public class UiSelectorGenerator {
public static final int UNTIL_FIND = 0;
public static final int FIND_ONE = 1;
public static final int WAIT_FOR = 2;
public static final int EXISTS = 3;
private ReadOnlyUiObject mRoot;
private ReadOnlyUiObject mTarget;
private boolean mUsingId = true;
private boolean mUsingDesc = true;
private boolean mUsingText = true;
private UiGlobalSelector mUiGlobalSelector;
private int mSearchMode = FIND_ONE;
private int mAction = -1;
public UiSelectorGenerator(NodeInfo root, NodeInfo target) {
this(new ReadOnlyUiObject(root), new ReadOnlyUiObject(target));
}
public UiSelectorGenerator(ReadOnlyUiObject root, ReadOnlyUiObject target) {
mRoot = root;
mTarget = target;
}
public void setSearchMode(int searchMode) {
mSearchMode = searchMode;
}
public void setAction(int action) {
mAction = action;
}
public void setUsingId(boolean usingId) {
mUsingId = usingId;
}
public void setUsingDesc(boolean usingDesc) {
mUsingDesc = usingDesc;
}
public void setUsingText(boolean usingText) {
mUsingText = usingText;
}
private boolean tryWithStringCondition(String name, String value, Consumer<String> condition, StringBuilder code) {
if (value == null || value.isEmpty())
return false;
code.append('.').append(name).append("(\"").append(value).append("\")");
condition.accept(value);
return isConditionEnough();
}
private boolean tryWithIntCondition(String name, int value, Consumer<Integer> condition, StringBuilder code) {
code.append('.').append(name).append('(').append(value).append(')');
condition.accept(value);
return isConditionEnough();
}
private boolean isConditionEnough() {
if (mSearchMode == UNTIL_FIND) {
return !mUiGlobalSelector.findAndReturnList(mRoot).isEmpty();
} else {
return mUiGlobalSelector.findAndReturnList(mRoot).size() == 1;
}
}
public String generate() {
String selector = generateSelector();
if (selector == null) {
return null;
}
//remove '.'
selector = selector.substring(1);
if (mSearchMode == WAIT_FOR) {
return selector + ".waitFor()";
}
if (mSearchMode == EXISTS) {
return "if(" + selector + ".exists()){\n \n}";
}
String action = getAction();
if (action == null) {
return selector;
} else {
return selector + action;
}
}
private String getAction() {
switch (mAction) {
case AccessibilityNodeInfoCompat.ACTION_CLICK:
return ".click()";
case AccessibilityNodeInfoCompat.ACTION_LONG_CLICK:
return ".longClick()";
case AccessibilityNodeInfoCompat.ACTION_SCROLL_BACKWARD:
return ".scrollBackward()";
case AccessibilityNodeInfoCompat.ACTION_SCROLL_FORWARD:
return ".scrollForward()";
case AccessibilityNodeInfoCompat.ACTION_SET_TEXT:
return ".setText(\"\")";
}
return null;
}
private String generateSelector() {
mUiGlobalSelector = new UiGlobalSelector();
StringBuilder code = new StringBuilder();
if (mUsingId &&
tryWithStringCondition("id", mTarget.id(), mUiGlobalSelector::id, code)) {
return code.toString();
}
if (tryWithIntCondition("depth", mTarget.depth(), mUiGlobalSelector::depth, code)) {
return code.toString();
}
if (tryWithStringCondition("className", mTarget.className(), mUiGlobalSelector::className, code)) {
return code.toString();
}
if (mUsingText &&
tryWithStringCondition("text", mTarget.text(), mUiGlobalSelector::text, code)) {
return code.toString();
}
if (mUsingDesc &&
tryWithStringCondition("desc", mTarget.desc(), mUiGlobalSelector::desc, code)) {
return code.toString();
}
return null;
}
}