Files
AutoJs6/app/src/main/assets/modules/__toast__.js

120 lines
4.8 KiB
JavaScript

// noinspection JSUnusedLocalSymbols,UnnecessaryLocalVariableJS
/**
* @param {org.autojs.autojs.runtime.ScriptRuntime} scriptRuntime
* @param {org.mozilla.javascript.Scriptable | global} scope
* @return {Internal.Toast}
*/
module.exports = function (scriptRuntime, scope) {
const ScriptToast = org.autojs.autojs.runtime.api.ScriptToast;
let _ = {
uiHandler: runtime.getUiHandler(),
ToastCtor: (/* @IIFE */ () => {
/**
* @implements Internal.Toast
*/
const ToastCtor = function () {
// @Caution by SuperMonster003 on Oct 11, 2022.
// ! android.widget.Toast.makeText() doesn't work well on Android API Level 28 (Android 9) [P].
// ! There hasn't been a solution for this so far.
// ! Tested devices:
// ! 1. SONY XPERIA XZ1 Compact (G8441)
// ! 2. Android Studio AVD (Android 9.0 x86)
/** @global */
const toast = function (msg, isLong, isForcible) {
let $ = {
badge: {
long: /^l(ong)?$/i,
short: /^s(hort)?$/i,
forcible: /^f(orcible)?$/i,
},
toast() {
this.init(arguments);
this.show();
},
init() {
this.message = isNullish(msg) ? '' : String(msg);
this.isLong = this.parseIsLong(isLong);
this.isForcible = this.parseIsForcible(isForcible);
},
parseIsLong(o) {
let def = typeof this.isLong === 'boolean' ? this.isLong : false;
if (typeof o === 'boolean') {
return o;
}
if (typeof o === 'number') {
return Boolean(o);
}
if (typeof o === 'string') {
if (this.badge.long.test(o)) {
return true;
}
if (this.badge.short.test(o)) {
return false;
}
if (this.badge.forcible.test(o)) {
this.isForcible = true;
return def;
}
throw Error(`Invalid param: {name: isLong, value: ${o}, type: ${species(o)}.`);
}
return def;
},
parseIsForcible(o) {
let def = typeof this.isForcible === 'boolean' ? this.isForcible : false;
if (typeof o === 'boolean') {
return o;
}
if (typeof o === 'number') {
return Boolean(o);
}
if (typeof o === 'string') {
if (this.badge.forcible.test(o)) {
return true;
}
if (this.badge.long.test(o)) {
this.isLong = true;
return def;
}
if (this.badge.short.test(o)) {
this.isLong = false;
return def;
}
throw Error(`Invalid param: {name: isForcible, value: ${o}, type: ${species(o)}.`);
}
return def;
},
show() {
if ($.isForcible) {
ToastCtor.prototype.dismissAll();
}
scriptRuntime.uiHandler.toast($.message, $.isLong);
},
};
$.toast();
};
return Object.assign(toast, ToastCtor.prototype);
};
ToastCtor.prototype = {
constructor: ToastCtor,
dismissAll() {
runtime.uiHandler.dismissAllToasts();
},
};
return ToastCtor;
})(),
};
/**
* @type {Internal.Toast}
*/
const toast = new _.ToastCtor();
return toast;
};