Skip to main content

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 layout folder, create a ui.js file with the following content:
function main() {
ui.toast("UI controlled by JS");
}

main();
  • Load and display main.xml from the layout folder:
function main() {
ui.toast("UI controlled by JS");
ui.layout("Tab 1", "main.xml");
}

main();
  • This displays the main.xml layout 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();