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.jsfunction 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.jsfunction 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.jsfunction 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();