fix(autojs): bridges.call() convert boolean to java.lang.Boolean

This commit is contained in:
hyb1996
2018-04-18 16:36:40 +08:00
parent 278cfd2272
commit 97198ad668
7 changed files with 771 additions and 105 deletions

View File

@@ -24,44 +24,7 @@ runtime.init();
global.device = runtime.device;
//设置JavaScriptBridges用于与Java层的交互和数据转换
runtime.bridges.setBridges({
call: function(func, target, args){
var arr = [];
var len = args.length;
for(var i = 0; i < len; i++){
arr.push(args[i]);
}
return func.apply(target, arr);
},
asArray: function(list){
var arr = [];
for(var i = 0; i < list.size(); i++){
arr.push(list.get(i));
}
for(var key in list){
if(typeof(key) == 'number')
continue;
var v = list[key];
if(typeof(v) == 'function'){
arr[key] = v.bind(list);
}else{
arr[key] = v;
}
}
return arr;
},
toArray: function(iterable){
var iterator = iterable.iterator();
var arr = [];
while(iterator.hasNext()){
arr.push(iterator.next());
}
return arr;
},
toString: function(o){
return String(o);
}
});
runtime.bridges.setBridges(require('__bridges__.js'));
//一些内部函数
global.__asGlobal__ = function(obj, functions){
@@ -88,8 +51,9 @@ runtime.init();
}
};
//初始化一般模块
//初始化全局函数
require("__globals__")(runtime, global);
//初始化一般模块
(function(scope){
var modules = ['app', 'automator', 'console', 'dialogs', 'io', 'selector', 'shell', 'web', 'ui',
"images", "timers", "threads", "events", "engines", "RootAutomator", "http", "storages", "floaty",

View File

@@ -0,0 +1,63 @@
var bridges = {};
bridges.call = function (func, target, args) {
var arr = [];
var len = args.length;
for (var i = 0; i < len; i++) {
arr.push(wrap(args[i]));
}
return func.apply(target, arr);
};
function wrap(value){
if(!(typeof(value) == 'object' && 'getClass' in value && util.isFunction(value.getClass))){
return value;
}
var c = value.getClass();
if(!('getName' in c && util.isFunction(c.getName))){
return value;
}
var name = c.getName();
if(name == 'java.lang.Boolean'){
return Boolean(value);
}
//TODO: is is necessary?
if(name == 'java.lang.Integer' || name == 'java.lang.Long' || name == 'java.lang.Double'
|| name == 'java.lang.Float'){
return Number(value);
}
return value;
}
bridges.asArray = function (list) {
var arr = [];
for (var i = 0; i < list.size(); i++) {
arr.push(list.get(i));
}
for (var key in list) {
if (typeof (key) == 'number')
continue;
var v = list[key];
if (typeof (v) == 'function') {
arr[key] = v.bind(list);
} else {
arr[key] = v;
}
}
return arr;
};
bridges.toArray = function (iterable) {
var iterator = iterable.iterator();
var arr = [];
while (iterator.hasNext()) {
arr.push(iterator.next());
}
return arr;
};
bridges.toString = function (o) {
return String(o);
};
module.exports = bridges;

View File

@@ -119,9 +119,7 @@ module.exports = function(__runtime__, scope){
"negative": {method: "negativeText"},
"negativeColor": {adapter: parseColor},
"cancelable": null,
"canceledOnTouchOutside": null,
"checkBoxPrompt": null,
"checkBoxChecked": null
"canceledOnTouchOutside": null
};
dialogs.build = function(properties){
@@ -133,16 +131,16 @@ module.exports = function(__runtime__, scope){
applyDialogProperty(builder, name, properties[name]);
}
applyOtherDialogProperties(builder, properties);
return ui.run(()=> builder.build());
return ui.run(()=> builder.buildDialog());
}
function applyDialogProperty(builder, name, value){
if(!propertySetters.hasOwnProperty(name)){
return;
}
var propertySetter = propertySetters[name];
if(propertySetter == null){
propertySetter = {method: name};
var propertySetter = propertySetters[name] || {};
if(propertySetter.method == undefined){
propertySetter.method = name;
}
if(propertySetter.adapter){
value = propertySetter.adapter(value);
@@ -155,25 +153,28 @@ module.exports = function(__runtime__, scope){
builder.input(wrapNonNullString(properties.inputHint), wrapNonNullString(properties.inputPrefill),
function(dialog, input){
input = input.toString();
dialog.emit("input_change", dialog, input);
}, true);
builder.emit("input_change", dialog, input);
})
.alwaysCallInputCallback();
}
if(properties.items != undefined){
var itemsSelectMode = properties.itemSelectMode;
var itemsSelectMode = properties.itemsSelectMode;
if(itemsSelectMode == undefined || itemsSelectMode == 'select'){
builder.itemsCallback(function(dialog, view, position, text){
dialog.emit("item_select", position, text.toString(), dialog);
});
}else if(itemsSelectMode == 'singleChoice'){
}else if(itemsSelectMode == 'single'){
builder.itemsCallbackSingleChoice(properties.itemsSelectedIndex == undefined ? -1 : properties.itemsSelectedIndex,
function(dialog, view, which, text){
dialog.emit("single_choice", which, text.toString(), dialog)
dialog.emit("single_choice", which, text.toString(), dialog);
return true;
});
}else if(itemsSelectMode == 'multiChoice'){
builder.itemsCallbackMultiChoice(properties.itemsSelectedIndex == undefined ? -1 : properties.itemsSelectedIndex,
}else if(itemsSelectMode == 'multi'){
builder.itemsCallbackMultiChoice(properties.itemsSelectedIndex == undefined ? null : properties.itemsSelectedIndex,
function(dialog, view, indices, texts){
dialog.emit("multi_choice", toJsArray(indices, (l, i)=> parseInt(l.get(i)),
toJsArray(texts, (l, i)=> l.get(i).toString())), dialog);
return true;
});
}else{
throw new Error("unknown itemsSelecteMode " + itemsSelectMode);
@@ -182,8 +183,14 @@ module.exports = function(__runtime__, scope){
if(properties.progress != undefined){
var progress = properties.progress;
var indeterminate = (progress.max == -1);
builder.progress(indeterminate, progress.max, progress.showMinMax);
builder.progressIndeterminateStyle(progress.horizontal);
builder.progress(indeterminate, progress.max, !!progress.showMinMax);
builder.progressIndeterminateStyle(!!progress.horizontal);
}
if(properties.checkBoxPrompt != undefined || properties.checkBoxChecked != undefined){
builder.checkBoxPrompt(wrapNonNullString(properties.checkBoxPrompt), !!properties.checkBoxChecked,
function(view, checked){
builder.emit("check", checked, builder.getDialog());
});
}
}