improve ui module

This commit is contained in:
hyb1996 2017-05-15 01:12:19 +08:00
parent 6102f6e8fe
commit a8a83dd2b5
9 changed files with 228 additions and 28 deletions

View File

@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid"
minSdkVersion 19
targetSdkVersion 23
versionCode 129
versionName "2.0.10c Beta"
versionCode 130
versionName "2.0.11 Alpha"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true
ndk {

View File

@ -19,6 +19,8 @@ import java.io.PipedReader;
import java.io.PipedWriter;
import java.io.Writer;
import java.nio.channels.Pipe;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
@ -50,20 +52,10 @@ public class ExampleUnitTest {
@Test
public void test() {
PipedInputStream inputStream = new PipedInputStream(1024);
try {
System.setIn(inputStream);
OutputStream outputStream = new PipedOutputStream(inputStream);
outputStream.write("(<xml id=\"foo\"></xml>).attributes()[0].name()\n".getBytes());
org.mozilla.javascript.tools.shell.Main.exec(new String[]{});
inputStream.close();
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
Matcher matcher = Pattern.compile("\\S+").matcher("001 华为 6800");
while (matcher.find()){
System.out.println(matcher.group());
}
org.mozilla.javascript.xmlimpl.XMLLibImpl
}
@Test

View File

@ -1,13 +1,20 @@
module.exports = function(__runtime__, scope){
var ui = Object(__runtime__.ui);
ui.layout = function(xml){
view = ui.inflate(activity, xml);
ui.setView(view);
}
ui.setView = function(view){
ui.view = view;
activity.setContentView(view);
}
ui.id = function(id){
return ui.view.getChildAt(0).id(id);
}
return ui;
}

View File

@ -9,6 +9,7 @@ import org.w3c.dom.Node;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
/**
* Created by Stardust on 2017/5/14.
@ -31,12 +32,12 @@ public interface AttributeHandler {
return handler != null && handler.handle(nodeName, attr, layoutXml);
}
public AttrNameRouter registerHandler(String attrName, AttributeHandler handler) {
public AttrNameRouter handler(String attrName, AttributeHandler handler) {
mHandlerMap.put(attrName, handler);
return this;
}
public AttrNameRouter setDefaultHandler(AttributeHandler defaultHandler) {
public AttrNameRouter defaultHandler(AttributeHandler defaultHandler) {
mDefaultHandler = defaultHandler;
return this;
}
@ -54,12 +55,12 @@ public interface AttributeHandler {
return true;
}
public MappedAttributeHandler putAttrNameMap(String oldAttrName, String newAttrName) {
public MappedAttributeHandler mapName(String oldAttrName, String newAttrName) {
mAttrNameMap.put(oldAttrName, newAttrName);
return this;
}
public MappedAttributeHandler putAttrValueMap(String attrName, String oldValue, String newValue) {
public MappedAttributeHandler mapValue(String attrName, String oldValue, String newValue) {
Map<String, String> valueMap = mAttrValueMap.get(attrName);
if (valueMap == null) {
valueMap = new HashMap<>();
@ -123,4 +124,66 @@ public interface AttributeHandler {
return dimen;
}
}
class OrientationHandler implements AttributeHandler {
@Override
public boolean handle(String nodeName, Node attr, StringBuilder layoutXml) {
if (attr.getNodeValue().equals("true")) {
layoutXml.append("android:orientation=\"vertical\"\n");
} else if (attr.getNodeValue().equals("false")) {
layoutXml.append("android:orientation=\"horizontal\"\n");
} else {
return false;
}
return true;
}
}
class MarginPaddingHandler implements AttributeHandler {
private String mAttrName;
public MarginPaddingHandler(String attrName) {
mAttrName = attrName;
}
@Override
public boolean handle(String nodeName, Node attr, StringBuilder layoutXml) {
String[] intervals = attr.getNodeName().split("[ ,]");
String[] dimens = new String[intervals.length];
for (int i = 0; i < intervals.length; i++) {
dimens[i] = DimenHandler.convertToAndroidDimen(intervals[i]);
}
String left, top, right, bottom;
switch (dimens.length) {
case 1:
left = top = right = bottom = dimens[0];
break;
case 2:
top = bottom = dimens[0];
left = right = dimens[1];
break;
case 3:
top = dimens[0];
left = right = dimens[1];
bottom = dimens[2];
break;
case 4:
top = dimens[0];
right = dimens[1];
bottom = dimens[2];
left = dimens[3];
break;
default:
return false;
}
layoutXml.append("android:").append(mAttrName).append("Top=\"").append(top).append("\"\n")
.append("android:").append(mAttrName).append("Right=\"").append(right).append("\"\n")
.append("android:").append(mAttrName).append("Bottom=\"").append(bottom).append("\"\n")
.append("android:").append(mAttrName).append("Left=\"").append(left).append("\"\n");
return true;
}
}
}

View File

@ -7,6 +7,7 @@ import android.view.View;
import android.widget.FrameLayout;
import com.nickandjerry.dynamiclayoutinflator.lib.DynamicLayoutInflator;
import com.stardust.autojs.runtime.api.ui.widget.JsFrameLayout;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserFactory;
@ -24,7 +25,7 @@ public class ConvertLayoutInflater implements JsLayoutInflater {
public View inflate(Context context, String xml) {
try {
String androidLayoutXml = XmlConverter.convertToAndroidLayout(xml);
FrameLayout root = new FrameLayout(context);
JsFrameLayout root = new JsFrameLayout(context);
DynamicLayoutInflator.inflate(context, androidLayoutXml, root);
return root;
} catch (Exception e) {

View File

@ -2,6 +2,8 @@ package com.stardust.autojs.runtime.api.ui;
import com.stardust.util.MapEntries;
import static com.stardust.autojs.runtime.api.ui.AttributeHandler.*;
import org.w3c.dom.Document;
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Node;
@ -24,20 +26,37 @@ import javax.xml.parsers.ParserConfigurationException;
public class XmlConverter {
private static final Map<String, String> NODE_NAME_MAP = new MapEntries<String, String>()
.entry("linear", "LinearLayout")
.entry("frame", "com.stardust.autojs.runtime.api.ui.widget.JsFrameLayout")
.entry("linear", "com.stardust.autojs.runtime.api.ui.widget.JsLinearLayout")
.entry("relative", "com.stardust.autojs.runtime.api.ui.widget.JsRelativeLayout")
.entry("button", "Button")
.entry("text", "TextView")
.entry("input", "EditText")
.entry("image", "ImageView")
.map();
private static final AttributeHandler ATTRIBUTE_HANDLER = new AttributeHandler.AttrNameRouter()
.registerHandler("w", new AttributeHandler.DimenHandler("width"))
.registerHandler("h", new AttributeHandler.DimenHandler("height"))
.registerHandler("id", new AttributeHandler.IdHandler())
.setDefaultHandler(new AttributeHandler.MappedAttributeHandler()
.putAttrNameMap("align", "layout_gravity")
.putAttrNameMap("bg", "background"));
.handler("w", new DimenHandler("width"))
.handler("h", new DimenHandler("height"))
.handler("size", new DimenHandler("textSize"))
.handler("id", new IdHandler())
.handler("vertical", new OrientationHandler())
.handler("margin", new MarginPaddingHandler("layout_margin"))
.handler("padding", new MarginPaddingHandler("padding"))
.handler("marginLeft", new DimenHandler("layout_marginLeft"))
.handler("marginRight", new DimenHandler("layout_marginRight"))
.handler("marginTop", new DimenHandler("layout_marginTop"))
.handler("marginBottom", new DimenHandler("layout_marginBottom"))
.handler("paddingLeft", new DimenHandler("paddingLeft"))
.handler("paddingRight", new DimenHandler("paddingRight"))
.handler("paddingTop", new DimenHandler("paddingTop"))
.handler("paddingBottom", new DimenHandler("paddingBottom"))
.defaultHandler(new MappedAttributeHandler()
.mapName("align", "layout_gravity")
.mapName("bg", "background")
.mapName("color", "textColor")
);
public static String convertToAndroidLayout(String xml) throws IOException, SAXException, ParserConfigurationException {
return convertToAndroidLayout(new InputSource(new StringReader(xml)));
@ -67,7 +86,7 @@ public class XmlConverter {
if (textContent == null || textContent.isEmpty()) {
return;
}
if (nodeName.equals("text") || nodeName.equals("button"))
if (nodeName.equals("text") || nodeName.equals("button") || nodeName.equals("input"))
layoutXml.append("android:text=\"").append(textContent).append("\"\n");
}

View File

@ -0,0 +1,41 @@
package com.stardust.autojs.runtime.api.ui.widget;
import android.content.Context;
import android.os.Build;
import android.support.annotation.AttrRes;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.support.annotation.StyleRes;
import android.util.AttributeSet;
import android.view.View;
import android.widget.FrameLayout;
import com.nickandjerry.dynamiclayoutinflator.lib.DynamicLayoutInflator;
/**
* Created by Stardust on 2017/5/14.
*/
public class JsFrameLayout extends FrameLayout {
public JsFrameLayout(@NonNull Context context) {
super(context);
}
public JsFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public JsFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public JsFrameLayout(@NonNull Context context, @Nullable AttributeSet attrs, @AttrRes int defStyleAttr, @StyleRes int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public View id(String id) {
return DynamicLayoutInflator.findViewByIdString(this, id);
}
}

View File

@ -0,0 +1,40 @@
package com.stardust.autojs.runtime.api.ui.widget;
import android.content.Context;
import android.os.Build;
import android.support.annotation.Nullable;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;
import com.nickandjerry.dynamiclayoutinflator.lib.DynamicLayoutInflator;
/**
* Created by Stardust on 2017/5/14.
*/
public class JsLinearLayout extends LinearLayout {
public JsLinearLayout(Context context) {
super(context);
}
public JsLinearLayout(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public JsLinearLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public JsLinearLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public View id(String id) {
return DynamicLayoutInflator.findViewByIdString(this, id);
}
}

View File

@ -0,0 +1,37 @@
package com.stardust.autojs.runtime.api.ui.widget;
import android.content.Context;
import android.os.Build;
import android.support.annotation.RequiresApi;
import android.util.AttributeSet;
import android.view.View;
import android.widget.RelativeLayout;
import com.nickandjerry.dynamiclayoutinflator.lib.DynamicLayoutInflator;
/**
* Created by Stardust on 2017/5/14.
*/
public class JsRelativeLayout extends RelativeLayout {
public JsRelativeLayout(Context context) {
super(context);
}
public JsRelativeLayout(Context context, AttributeSet attrs) {
super(context, attrs);
}
public JsRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public JsRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
super(context, attrs, defStyleAttr, defStyleRes);
}
public View id(String id) {
return DynamicLayoutInflator.findViewByIdString(this, id);
}
}