JS and UI Interaction
Overview
- This chapter covers interaction between JS and UI elements
- JS modules that interact with UI are prefixed with
ui, e.g.ui.toast("msg")
How to Use
- In your project's
layoutfolder, create aui.jsfile with the following content:
function main() {
ui.toast("UI controlled by JS");
}
main();
- Load and display
main.xmlfrom the layout folder:
function main() {
ui.toast("UI controlled by JS");
ui.layout("Tab 1", "main.xml");
}
main();
- This displays the
main.xmllayout in a simple UI
Advanced Usage
- Example
ui.js:
/**
* Auto-generated by EasyClick development tools
*/
function main() {
ui.toast("UI toast function");
var set = ui.layout("Parameter Settings", "main.xml");
ui.layout("Other Notes", "main2.xml");
ui.logd("Set UI result: " + set);
// Switch toggle usage
var auto_env = ui.getViewValue(ui.auto_env);
ui.logd("Value of tag auto_env: " + auto_env);
// Switch checkedChange event
ui.setEvent(ui.auto_env, "checkedChange", function (view, isChecked) {
ui.logd("tag auto_env isChecked " + isChecked);
if (isChecked) {
startAutoEnv();
}
});
if (ui.isServiceOk()) {
ui.auto_env.setChecked(true);
} else {
ui.auto_env.setChecked(false);
}
// EditText usage
var name = ui.getViewValue(ui.name);
ui.logd("Value of tag name: " + name);
ui.name.setText("name field value");
// Spinner usage
var sex = ui.getViewValue(ui.sex);
ui.logd("Value of tag sex: " + sex);
// Spinner itemSelected event
ui.setEvent(ui.sex, "itemSelected", function (position, value) {
ui.logd("tag sex itemSelected " + value);
});
// RadioButton usage
var three = ui.getViewValue(ui.three);
ui.logd("Value of tag three: " + three);
// RadioButton checkedChange event
ui.setEvent(ui.three, "checkedChange", function (view, isChecked) {
ui.logd("tag three isChecked " + isChecked);
});
// CheckBox usage
var dance = ui.getViewValue(ui.dance);
ui.logd("Value of tag dance: " + dance);
// CheckBox checkedChange event
ui.setEvent(ui.dance, "checkedChange", function (view, isChecked) {
ui.logd("tag dance isChecked " + isChecked);
});
// saveAllBtn save parameters click event
ui.setEvent(ui.saveAllBtn, "click", function (view) {
var s = ui.saveAllConfig();
ui.logd("Save all parameters result " + s)
});
// System settings button
ui.setEvent(ui.systemSetting, "click", function (view) {
ui.openECSystemSetting();
});
// Start script button
ui.setEvent(ui.startBtn, "click", function (view) {
ui.start();
});
// Start environment button
ui.setEvent(ui.envBtn, "click", function (view) {
// Start environment async; on success update auto_env switch
startAutoEnv();
});
// Get all UI parameters
ui.logd("All UI parameters: " + ui.getConfigJSON());
// setViewValue examples (commented out)
// ui.setViewValue(ui.name, "set value");
// ui.setViewValue(ui.auto_env, false);
// ui.setViewValue(ui.sex, "Male|Female");
// ui.setViewValue(ui.three, true);
// ui.setViewValue(ui.dance, false)
// Temporary shared storage for variables and data
ui.putShareData("nameVar", ui.name);
ui.putShareData("value", "my value");
}
function startAutoEnv() {
ui.startEnvAsync(function (r) {
ui.logd("Start environment result: " + r);
ui.auto_env.setChecked(r);
});
}
main();
How Scripts Interact with JS
- The following code runs in
js/main.js:
function main() {
// Script reads UI objects — UI must be loaded first
// Reference UI objects directly
// Assume xml has tag=name EditText
// Read variables/data set in the UI module
logd(ui.getShareData("nameVar"))
logd(ui.getShareData("value"))
// Method 1: variable reference
// Reset JS variables
ui.resetUIVar()
// Log ui.name
logd("ui.name " + ui.name)
if (ui.name) {
// Run on UI main thread
getHandler().post(function () {
ui.name.setText("Fsdafsadfsa")
ui.logd("EditText content: " + ui.name.getEditableText());
});
}
sleep(2000);
// Method 2: findViewByTag
var name = ui.findViewByTag("name");
if (name) {
// Run on UI main thread
getHandler().post(function () {
name.setText("updated text")
ui.logd("EditText content: " + name.getEditableText());
});
}
sleep(5000);
}
main();
Message APIs
Toast Message toast
- Show a Toast message
- @param msg message
function main() {
ui.toast("UI controlled by JS");
}
main();
Debug Log logd
- Print debug log
- @param msg message to print
function main() {
ui.logd("debug message");
}
main();
Layout UI APIs
Set Layout layout
- Create a layout and set it on the current page
- @param name tab label name
- @param content layout file name in the layout folder, or raw XML content
- @return boolean true = success, false = failure
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.logd("Parameter Help create result: " + u1);
ui.logd("Other Notes create result: " + u2);
}
main();
Parse Layout parseView
- Parse layout and return
- @param content layout file name in the layout folder, or raw XML content
- @return View Android View object, or null if parsing fails
function main() {
// XML files are in the layout folder
var u1 = ui.parseView("main.xml");
ui.logd("Create result: " + u1);
}
main();
Reset UI Variables resetUIVar
- Convert all tags to UI properties for direct access
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.resetUIVar();
}
main();
Find View by Tag findViewByTag
- Find a view by tag
- @param tag tag value
- @return View native Android View object
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// Find view with tag=name
var nameView = ui.findViewByTag("name");
ui.logd("name view is:" + nameView);
}
main();
Save to Shared Storage putShareData
- Store data in shared storage for script use
- @param key key
- @param value value
- @return boolean true = success, false = failure
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// Save to shared storage
ui.putShareData("name", "temporary data");
}
main();
Read from Shared Storage getShareData
- Read data stored by the UI module from shared storage
- @param key key
- @return stored data
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// Read from shared storage
var d = ui.getShareData("name");
logd("d =" + d)
}
main();
Clear All Shared Storage clearAllShareData
- Clear all shared storage data
- @return true or false
function main() {
ui.clearAllShareData();
}
main();
Set Event setEvent
- Set an event handler
- @param view view to attach the event to, or its tag
- @param eventType event type: click, checkedChange (radio/checkbox state change), itemClick (list item click), itemSelected (list item selected)
- @param eventCallback event callback
- @return boolean true = success, false = failure
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// Spinner itemSelected event
ui.setEvent(ui.sex, "itemSelected", function (position, value) {
ui.logd("tag sex itemSelected " + value);
});
ui.setEvent(ui.dance, "checkedChange", function (view, isChecked) {
ui.logd("tag dance isChecked " + isChecked);
});
ui.setEvent(ui.startBtn, "click", function (view) {
ui.start();
});
}
main();
Get Root View getRootView
- Get root view object(s) — may be a collection on multi-tab pages
- @return list of View objects
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// Spinner itemSelected event
var views = ui.getRootView();
ui.logd("views " + views)
for (var i = 0; i < views.length; i++) {
var value = views[i];
ui.logd("view-" + value)
}
}
main();
Set View Value setViewValue
- Set view value
- @param tagOrView view tag or view object
- @param value string or boolean
- @return boolean true = success, false = failure
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// ui.name is the view object for tag=name in xml
ui.setViewValue(ui.name, "configured name")
}
main();
Get View Value getViewValue
- Get view value
- @param tagOrView view tag or view object
- @return string or boolean
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// ui.name is the view object for tag=name in xml
ui.setViewValue(ui.name, "configured name");
var v = ui.getViewValue(ui.name);
ui.logd("Value of name: " + v);
}
main();
Get All UI Config getConfigJSON
- Get all UI configuration
- @return JSON string
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.setViewValue(ui.name, "name value");
// Save all values
ui.saveAllConfig();
var data = ui.getConfigJSON();
ui.logd("data " + data);
data = JSON.parse(data);
// Log name — save first if empty
ui.logd(data.name);
}
main();
Get Single UI Config getConfig
- Get a single UI config item
- @param key config key
- @return string
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.setViewValue(ui.name, "name value");
// Save all values
ui.saveAllConfig();
// Save individual values
ui.saveConfig("sex", "Female");
ui.saveConfig("music", true);
var data = ui.getConfigJSON();
ui.logd("data " + data);
data = JSON.parse(data);
// Log name — save first if empty
ui.logd(data.name);
// Get single value
ui.logd(ui.getConfig("name"));
}
main();
Save All UI Config saveAllConfig
- Save all configuration based on configured tags
- @return boolean true = saved, false = failed
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.setViewValue(ui.name, "name value");
// Save all values
ui.saveAllConfig();
// Save individual values
ui.saveConfig("sex", "Female");
ui.saveConfig("music", true);
var data = ui.getConfigJSON();
ui.logd("data " + data);
data = JSON.parse(data);
// Log name — save first if empty
ui.logd(data.name);
}
main();
Save Single UI Config saveConfig
- Save a UI parameter value
- @param key UI key
- @param value UI value
- @return boolean true = success, false = failure
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.setViewValue(ui.name, "name value");
// Save all values
ui.saveAllConfig();
// Save individual values
ui.saveConfig("sex", "Female");
ui.saveConfig("music", true);
var data = ui.getConfigJSON();
ui.logd("data " + data);
data = JSON.parse(data);
// Log name — save first if empty
ui.logd(data.name);
}
main();
Remove All UI Config removeAllUIConfig
- Remove all configuration entries
- @return boolean true = success, false = failure
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
ui.setViewValue(ui.name, "name value");
// Remove all config entries
ui.removeAllUIConfig();
// Save individual values
ui.saveConfig("sex", "Female");
ui.saveConfig("music", true);
var data = ui.getConfigJSON();
ui.logd("data " + data);
data = JSON.parse(data);
// Log name — save first if empty
ui.logd(data.name);
}
main();
Load Image Resource resResAsDrawable
- Load a file from the IEC package res folder and return as Android Drawable
- @param path resource file path under res
- @return Drawable image object or null
function main() {
// XML files are in the layout folder
var u1 = ui.layout("Parameter Help", "main.xml");
var u2 = ui.layout("Other Notes", "main2.xml");
// checkbox.png is in the res folder
var bg = ui.resResAsDrawable("checkbox.png");
// Set dynamic background
ui.music.setBackgroundDrawable(bg);
// Set button drawable
ui.music.setButtonDrawable(bg);
}
main();
Dialogs
alert
- Alert dialog
- @param map e.g.
{"title":""}— fixed keys: - title — dialog title
- msg — message
- cancelText — cancel button text
- okText — OK button text
- cancelable — whether dismissible
- @param okBtnCallback OK button callback
- @param cancelBtnCallback cancel button callback
- @param dismissListener dialog dismiss callback
- @return boolean true = success, false = failure
function main() {
var p = {
"title": "Confirm",
"msg": "Are you sure?",
"cancelable": true,
"cancelText": "No",
"okText": "Yes"
};
ui.alert(p,
function (dialog, v) {
logd("ok btn click : ")
// Dismiss dialog
dialog.doDismiss();
return true;
},
function (dialog, v) {
logd("cancel btn click ")
// Dismiss dialog
dialog.doDismiss();
return true;
},
function () {
logd("mission btn click ")
return true;
});
}
main();
inputDialog
- inputDialog — input dialog
- @param map e.g.
{"title":""}— fixed keys: - title — dialog title
- msg — message
- cancelText — cancel button text
- okText — OK button text
- cancelable — whether dismissible
- @param okBtnCallback OK button callback
- @param cancelBtnCallback cancel button callback
- @param dismissListener dialog dismiss callback
- @return boolean true = success, false = failure
function main() {
var p = {
"title": "Confirm",
"msg": "Are you sure?",
"cancelable": true,
"cancelText": "No",
"okText": "Yes"
};
ui.inputDialog(p,
function (dialog, v, text) {
// text is the input string
logd("ok btn click : " + text)
// Dismiss dialog
dialog.doDismiss();
return true;
},
function (dialog, v, text) {
logd("cancel btn click " + text)
// Dismiss dialog
dialog.doDismiss();
return true;
},
function () {
logd("mission btn click ")
return true;
});
}
main();
customDialog
- Custom dialog
- @param params e.g.
{"cancelable":""}— fixed keys: - fullScreen — full screen
- cancelable — whether dismissible
- @param view native view
- @param onViewBind view bind callback
- @param dismissListener dialog dismiss callback
- @return boolean true = success, false = failure
function main() {
// Use native Android widgets
importPackage(android.widget)
var textView = new TextView(ui.getContext());
textView.setText("sdfasfsad");
// Or use a view parsed from XML
var textView = ui.parseView("main2.xml");
ui.customDialog({
"fullScreen": true,
"cancelable": true
},
textView,
function (dialog, v) {
// Access view and attach events here
}, function () {
logd("dsssss")
})
}
main();
Floating Window APIs
Floating Window Permission hasFloatViewPermission
- Whether floating window permission is granted
- @return boolean true = granted, false = denied
function main() {
var r = ui.hasFloatViewPermission();
if (!r) {
var req = ui.requestFloatViewPermission(10000);
ui.logd("Request floating window permission: " + req);
}
r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission: " + r);
}
main();
Request Floating Window Permission Async requestFloatViewPermissionAsync
- Request floating window permission asynchronously
- @param timeout timeout in milliseconds
- @param callback callback
- @return boolean true = granted, false = denied
function main() {
var r = ui.hasFloatViewPermission();
if (!r) {
ui.requestFloatViewPermissionAsync(20000, function (r) {
ui.logd("Request floating window permission: " + r);
});
}
r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission: " + r);
}
main();
Show Control Floating Window showCtrlWindow
- Show control floating window
- @return boolean true = success, false = failure
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission:" + r)
if (!r) {
return
}
// Show floating window
ui.showCtrlWindow();
ui.logd("Showing message")
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeCtrlWindow();
}, 3000);
}
main();
Close Control Floating Window closeCtrlWindow
- Close control floating window
- @return boolean true = success, false = failure
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission:" + r)
if (!r) {
return
}
// Show floating window
ui.showCtrlWindow();
ui.logd("Showing message")
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeCtrlWindow();
}, 3000);
}
main();
Add Control Floating Window Button addCtrlView
- Add start/stop floating window button
- Requires EC 6.0.0+
- @param tag button tag
- @param icon icon path under project res/, e.g. res/a.png
- @param width button width in dp — system default is 36
- @param height button height in dp — system default is 36
- @param index insert index — -1 append, 0 insert first
- @param onClickListener click callback
- @return boolean true = success, false = failure
function main() {
ui.toast("UI toast function");
var set = ui.layout("Parameter Settings", "main.xml");
ui.layout("Other Notes", "main2.xml");
ui.logd("Set UI result: " + set);
ui.showCtrlWindow()
// Use delay — showCtrlWindow is async
ui.run(1000, function () {
// Remove default control views
// Close floating panel button
ui.removeCtrlView("log_close_ctrl")
// Home button
ui.removeCtrlView("main_page_ctrl")
// Script start/stop button
ui.removeCtrlView("script_status_ctrl")
// Log window button
ui.removeCtrlView("log_window_ctrl")
// Exit script button
ui.removeCtrlView("system_power_ctrl")
// Add custom button
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
// Start script
ui.start();
})
})
ui.run(3000, function () {
// Remove all control views
ui.removeAllCtrlView()
})
ui.run(5000, function () {
// Reset to defaults
ui.resetDefaultCtrlView()
})
}
main();
Update Control Floating Window Button updateCtrlView
- Update start/stop floating window button
- Requires EC 6.6.0+
- @param tag button tag
- @param icon icon path under project res/, e.g. res/a.png
- @param onClickListener click callback
- @return boolean true = success, false = failure
function main() {
ui.toast("UI toast function");
var set = ui.layout("Parameter Settings", "main.xml");
ui.layout("Other Notes", "main2.xml");
ui.logd("Set UI result: " + set);
ui.showCtrlWindow()
// Use delay — showCtrlWindow is async
ui.run(1000, function () {
// Remove default control views
// Close floating panel button
ui.removeCtrlView("log_close_ctrl")
// Home button
ui.removeCtrlView("main_page_ctrl")
// Script start/stop button
ui.removeCtrlView("script_status_ctrl")
// Log window button
ui.removeCtrlView("log_window_ctrl")
// Exit script button
ui.removeCtrlView("system_power_ctrl")
// Add custom button
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
// Start script
ui.start();
})
})
ui.run(3000, function () {
// Update button action
ui.updateCtrlView("tag", "res/ab.png", function (v) {
logd("aaaa");
})
})
}
main();
Remove Control Floating Window Button removeCtrlView
- Remove start/stop floating window button
- Requires EC 6.0.0+
- @param tag button tag
- @return boolean true = success, false = failure
function main() {
ui.toast("UI toast function");
var set = ui.layout("Parameter Settings", "main.xml");
ui.layout("Other Notes", "main2.xml");
ui.logd("Set UI result: " + set);
ui.showCtrlWindow()
// Use delay — showCtrlWindow is async
ui.run(1000, function () {
// Remove default control views
// Close floating panel button
ui.removeCtrlView("log_close_ctrl")
// Home button
ui.removeCtrlView("main_page_ctrl")
// Script start/stop button
ui.removeCtrlView("script_status_ctrl")
// Log window button
ui.removeCtrlView("log_window_ctrl")
// Exit script button
ui.removeCtrlView("system_power_ctrl")
// Pause and resume
ui.removeCtrlView("pause_ctrl")
// Add custom button
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
// Start script
ui.start();
})
})
ui.run(3000, function () {
// Remove all control views
ui.removeAllCtrlView()
})
ui.run(5000, function () {
// Reset to defaults
ui.resetDefaultCtrlView()
})
}
main();
Remove All Control Floating Window Buttons removeAllCtrlView
- Remove all start/stop floating window buttons
- Requires EC 6.0.0+
- @return boolean true = success, false = failure
function main() {
ui.toast("UI toast function");
var set = ui.layout("Parameter Settings", "main.xml");
ui.layout("Other Notes", "main2.xml");
ui.logd("Set UI result: " + set);
ui.showCtrlWindow()
// Use delay — showCtrlWindow is async
ui.run(1000, function () {
// Remove default control views
// Close floating panel button
ui.removeCtrlView("log_close_ctrl")
// Home button
ui.removeCtrlView("main_page_ctrl")
// Script start/stop button
ui.removeCtrlView("script_status_ctrl")
// Log window button
ui.removeCtrlView("log_window_ctrl")
// Exit script button
ui.removeCtrlView("system_power_ctrl")
// Add custom button
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
// Start script
ui.start();
})
})
ui.run(3000, function () {
// Remove all control views
ui.removeAllCtrlView()
})
ui.run(5000, function () {
// Reset to defaults
ui.resetDefaultCtrlView()
})
}
main();
Reset Control Floating Window Buttons resetDefaultCtrlView
- Reset start/stop floating window buttons
- Requires EC 6.0.0+
- @return boolean true = success, false = failure
function main() {
ui.toast("UI toast function");
var set = ui.layout("Parameter Settings", "main.xml");
ui.layout("Other Notes", "main2.xml");
ui.logd("Set UI result: " + set);
ui.showCtrlWindow()
// Use delay — showCtrlWindow is async
ui.run(1000, function () {
// Remove default control views
// Close floating panel button
ui.removeCtrlView("log_close_ctrl")
// Home button
ui.removeCtrlView("main_page_ctrl")
// Script start/stop button
ui.removeCtrlView("script_status_ctrl")
// Log window button
ui.removeCtrlView("log_window_ctrl")
// Exit script button
ui.removeCtrlView("system_power_ctrl")
// Add custom button
ui.addCtrlView("tag", "res/a.png", 32, 32, 0, function (v) {
logd(v);
// Start script
ui.start();
})
})
ui.run(3000, function () {
// Remove all control views
ui.removeAllCtrlView()
})
ui.run(5000, function () {
// Reset to defaults
ui.resetDefaultCtrlView()
})
}
main();
Show Log Floating Window showLogWindow
- Show log floating window
- @return boolean true = success, false = failure
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission:" + r)
if (!r) {
return
}
// Show floating window
ui.showLogWindow();
ui.logd("Showing message")
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeLogWindow();
}, 3000);
}
main();
Close Log Floating Window closeLogWindow
- Close log floating window
- @return boolean true = success, false = failure
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission:" + r)
if (!r) {
return
}
// Show floating window
ui.showLogWindow();
ui.logd("Showing message")
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeLogWindow();
}, 3000);
}
main();
Show Script Pause Control Floating Window showScriptCtrlFloatView
- Show script pause control floating window
- Requires EC 10.0.0+
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission:" + r)
if (!r) {
return
}
// Show floating window
ui.showScriptCtrlFloatView();
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeScriptCtrlFloatView();
}, 3000);
}
main();
Close Script Pause Control Floating Window closeScriptCtrlFloatView
- Close script pause control floating window
- Requires EC 10.0.0+
function main() {
var r = ui.hasFloatViewPermission();
ui.logd("Has floating window permission:" + r)
if (!r) {
return
}
// Show floating window
ui.showScriptCtrlFloatView();
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeScriptCtrlFloatView();
}, 3000);
}
main();
Script Launch
Is Accessibility Mode isAccMode
- Whether running in accessibility mode
- @return boolean true = yes, false = no
function main() {
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
// Set running mode
ui.setRunningMode(1);
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
}
main();
Is Agent Mode isAgentMode
- Whether running in agent mode
- @return boolean true = yes, false = no
function main() {
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
// Set running mode
ui.setRunningMode(1);
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
}
main();
Is Automation Service Running isServiceOk
- Whether automation service is running
- @return boolean true = yes, false = no
function main() {
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
// Set running mode
ui.setRunningMode(1);
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
var ok = ui.isServiceOk();
if (!ok) {
ui.startEnvAsync(function (r) {
ui.logd("Start environment result: " + r);
});
}
}
main();
Set Running Mode setRunningMode
- Set running mode
- @param mode 1 = agent mode, 2 = accessibility mode
- @return boolean true = yes, false = no
function main() {
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
// Set running mode
ui.setRunningMode(1);
ui.logd("Accessibility mode: " + ui.isAccMode());
ui.logd("Agent mode: " + ui.isAgentMode());
}
main();
Start Automation Environment Async startEnvAsync
- Start automation environment
- @return boolean true = started, false = failed
function main() {
var ok = ui.isServiceOk();
if (!ok) {
ui.startEnvAsync(function (r) {
ui.logd("Start environment result: " + r);
});
}
}
main();
Start Script start
- Start script
- @return boolean true = started, false = failed
function main() {
ui.layout("Parameter Settings", "main.xml");
// XML has tag=startBtn button
// Start script button
ui.setEvent(ui.startBtn, "click", function (view) {
ui.start();
});
}
main();
Stop Script stopTask
- Stop script
- @return boolean true = started, false = failed
function main() {
ui.layout("Parameter Settings", "main.xml");
// XML has tag=stopBtn button
// Start script button
ui.setEvent(ui.stopBtn, "click", function (view) {
ui.stopTask();
});
}
main();
Set Script Pause or Resume setScriptPause
- Pause or resume script
- Requires EC 10.0.0+
- @param pause true = pause, false = resume
- @param timeout auto-resume delay in ms — 0 = wait for external resume, >0 = auto-resume after delay
- @return
{boolean}true = paused, false = running
function main() {
ui.layout("Parameter Settings", "main.xml");
// XML has tag=stopBtn button
// Start script button
ui.setEvent(ui.cbtn, "click", function (view) {
ui.setScriptPause(true, 0);
});
}
main();
Is Script Paused isScriptPause
- Whether script is paused
- Requires EC 10.0.0+
- @return
{boolean}true = paused
function main() {
ui.layout("Parameter Settings", "main.xml");
// Start script button
ui.setEvent(ui.cBtn, "click", function (view) {
// Toggle pause/resume on click
// Demo only
ui.setScriptPause(!ui.isScriptPause(), 0);
});
}
main();
Is Script Running isScriptRunning
- Whether script is running
- @return boolean true = started, false = failed
function main() {
ui.layout("Parameter Settings", "main.xml");
// XML has tag=startBtn button
logd("Running state -{}", ui.isScriptRunning())
}
main();
Scheduled Tasks
Start Scheduled Task startJob
- Start a scheduled script task
- @param tag unique task ID — use readConfigString("jobTaskTag") in script to identify the task
- @param execTime schedule time as 2020-04-17 19:20:00, or seconds as string e.g. "3" for 3 seconds later
- @param cancelBeforeRunning
- @return integer job ID
function main() {
var set = ui.layout("Parameter Settings", "main.xml");
// Scheduled task by datetime
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("Scheduled task by datetime:" + jobid)
// Run after N seconds
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("Run after seconds:" + jobid2)
var tags = ui.getAllJobTag();
ui.logd("Scheduled task tags:" + tags)
// Cancel tasks
ui.cancelAllJob();
// Cancel task by tag
ui.cancelJob("job2");
}
main();
Cancel Scheduled Task cancelJob
- Cancel task by tag
- @param tag tag
- @return boolean true = success, false = failure
function main() {
var set = ui.layout("Parameter Settings", "main.xml");
// Scheduled task by datetime
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("Scheduled task by datetime:" + jobid)
// Run after N seconds
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("Run after seconds:" + jobid2)
var tags = ui.getAllJobTag();
ui.logd("Scheduled task tags:" + tags)
// Cancel tasks
ui.cancelAllJob();
// Cancel task by tag
ui.cancelJob("job2");
}
main();
Cancel All Scheduled Tasks cancelAllJob
- Cancel all scheduled tasks
- @return boolean true = success, false = failure
function main() {
var set = ui.layout("Parameter Settings", "main.xml");
// Scheduled task by datetime
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("Scheduled task by datetime:" + jobid)
// Run after N seconds
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("Run after seconds:" + jobid2)
var tags = ui.getAllJobTag();
ui.logd("Scheduled task tags:" + tags)
// Cancel tasks
ui.cancelAllJob();
// Cancel task by tag
ui.cancelJob("job2");
}
main();
Get All Scheduled Task Tags getAllJobTag
- Get all scheduled task tags
- @return JSON string
function main() {
var set = ui.layout("Parameter Settings", "main.xml");
// Scheduled task by datetime
var time = "2020-05-15 15:47:00";
var tag = "job1";
var jobid = ui.startJob(tag, time, true);
ui.logd("Scheduled task by datetime:" + jobid)
// Run after N seconds
var time2 = "10";
var tag2 = "job2";
var jobid2 = ui.startJob(tag2, time2, false);
ui.logd("Run after seconds:" + jobid2)
var tags = ui.getAllJobTag();
ui.logd("Scheduled task tags:" + tags)
// Cancel tasks
ui.cancelAllJob();
// Cancel task by tag
ui.cancelJob("job2");
}
main();
Other Extensions
setAgentSupportNode Set Node Retrieval Mode in Agent Mode
- Set node retrieval mode in agent mode
- Only applies in agent mode
- EC Android 11.2.0+
- Call before starting agent service — modes 2 and 3 reduce detection signatures
- Mode 1 may trigger ruru detection of AccessibilityManager.isEnabled; modes 2+ do not
- Mode 1 has strongest node support; mode 2 is weaker; mode 3 disables nodes
- @param support 1 = accessibility-like, 2 = shell dump, 3 = disable node service
- @return
{boolean}true = success, false = failure
function main() {
ui.setAgentSupportNode("2");
}
main();
setWebViewType Switch WebView Engine
- Requires EC 5.16.0+
- Set WebView engine type — default is X5 browser
- @param type 1 = system WebView, 2 = X5 browser
- @return boolean true = success, false = failure
// Injection in ui.js
function main() {
ui.setWebViewType(2)
ui.layout("main", "main.html");
}
main();
registeH5Function Inject Extension Function into H5
- Inject a JS function into the web page for H5/script/HTML interoperability
- @param funcName injected function name
- @param callback callback — see common example
- @return boolean true = success, false = failure
// Injection in ui.js
function main() {
// Register new extension in UI
ui.registeH5Function("customFunction", function (data) {
logd("h5 call-" + data);
// Data returned to web page
return new Date().toString()
})
ui.layout("main", "main.html");
}
main();
Calling from the web page
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<button onclick="test()">Test Extension Function</button>
<script>
function test() {
// Call extension injected from ui.js
let d = window.ec.call('customFunction', JSON.stringify({'action': 'android.settings.SETTINGS'}));
console.log("ddd " + d)
}
</script>
</body>
</html>
unregisteH5Function Unregister H5 Injected JS Function
- Unregister an injected JS function from the web page
- @param funcName injected function name
- @return boolean true = success, false = failure
// Injection in ui.js
function main() {
// Register new extension in UI
ui.registeH5Function("customFunction", function (data) {
logd("h5 call-" + data);
})
ui.layout("main", "main.html");
ui.unregisteH5Function("customFunction");
}
main();
onActivityEvent Listen to Activity State
- Listen to Activity events for the UI
- @param eventType onResume, onPause, onStop, onDestroy, onActivityResult
- @param callback callback
function main() {
// Listen to Activity events
ui.onActivityEvent("onResume", function (eventType) {
// Check whether service is running
ui.logd("activity onResume " + ui.isServiceOk());
});
ui.onActivityEvent("onPause", function (eventType) {
ui.logd("activity onPause");
});
ui.onActivityEvent("onStop", function (eventType) {
ui.logd("activity onStop");
});
ui.onActivityEvent("onDestroy", function (eventType) {
ui.logd("activity onDestroy");
});
// See Android docs for parameters
// protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data)
ui.onActivityEvent("onActivityResult", function (requestCode, resultCode, data) {
ui.logd("activity onDestroy");
});
}
main();
getActivity UI Activity
- Get current Activity object
- @return Activity object or null
function main() {
var activity = ui.getActivity();
ui.logd("activity " + activity);
// Android context is available globally
importPackage(android.widget);
importPackage(android.graphics);
// Use Java objects directly
var tv = new android.widget.TextView(context);
tv.setText("Text from JS/Java interaction");
tv.setTextColor(Color.parseColor("#888888"))
activity.setContentView(tv);
}
main();
getHandler Native Handler
- Get current Handler object
- @return Handler object or null
function main() {
// Show floating window
ui.showLogWindow();
ui.logd("Showing message")
// Dismiss on UI thread after 3 seconds
ui.getHandler().postDelayed(function () {
ui.closeLogWindow();
}, 3000);
}
main();
run UI Thread Async Task
- Run on UI thread — equivalent to getHandler.post
- @param delayTime delay in ms — 0 runs immediately
- @param callback callback
function main() {
ui.run(30, function () {
logd("Fsdfsd");
})
sleep(1000)
}
main();
setECSystemConfig Set EC System Parameters
- Set EC system parameters
- @param params map e.g.
{"running_mode":"accessibility"}
{
"running_mode": "accessibility",
"auto_start_service": "Yes",
"volume_start_tc": "No",
"log_float_window": "No",
"ctrl_float_window": "No",
"service_start_run_script": "No"
}
- Parameter reference:
- running_mode: accessibility or agent
- auto_start_service: Yes or No — start service on boot
- log_float_window: Yes or No — show log floating window
- ctrl_float_window: Yes or No — show start/stop control floating window
- service_start_run_script: Yes or No — auto rerun script after service restart
- home_key_start_stop: Yes or No — triple-tap HOME to start/stop script
- @return boolean true = yes, false = no
function main() {
var m = {
"running_mode": "accessibility",
"auto_start_service": "Yes",
"log_float_window": "No",
"ctrl_float_window": "No"
};
ui.setECSystemConfig(m);
}
main();
openECSystemSetting Open EC System Settings
- Open EC system settings
- @return boolean true = success, false = failure
function main() {
ui.openECSystemSetting();
}
main();
openActivity Open Other Applications
- Open an Activity via map parameters
- @param map e.g.
{"action":""}— fixed keys: - action,
- uri, pkg, className, flag — remaining keys are extras
- @return boolean true = success, false = failure
function main() {
// Open APK installer
var m = {
"action": "android.intent.action.VIEW",
"uri": "file:///sdcard/a.apk",
"type": "application/vnd.android.package-archive"
};
var x = ui.openActivity(m);
ui.logd("x " + x);
var map = {
"uri": "xx://xx/live/6701887916223941379",
};
ui.openActivity(map);
}
main();