6.0.1 - Alpha - 增加全局Polyfill及扩展对象

This commit is contained in:
SuperMonster003
2021-12-05 10:40:13 +08:00
parent 99a1d8490f
commit 98cf339cce
34 changed files with 664 additions and 941 deletions

View File

@@ -115,6 +115,13 @@ android {
buildConfigField "String", "APP_SINCE_DATE", "\"${versions.appSinceDate}\""
}
}
applicationVariants.all { variant ->
variant.mergeAssetsProvider.configure {
doLast {
delete(fileTree(dir: outputDir, includes: ['declarations/**']))
}
}
}
}
repositories {
@@ -138,7 +145,7 @@ dependencies {
// Android supports
implementation "androidx.appcompat:appcompat:1.4.0"
implementation "androidx.cardview:cardview:1.0.0"
implementation "com.google.android.material:material:1.5.0-beta01"
implementation "com.google.android.material:material:1.6.0-alpha01"
implementation "androidx.multidex:multidex:2.0.1"
// Material Dialogs

View File

@@ -4,6 +4,18 @@
******
# v6.0.1 Alpha
###### 2021/12/05
* `新增` polyfill (Object.getOwnPropertyDescriptors)
* `新增` polyfill (Array.prototype.flat)
* `新增` isInteger/isNullish/isPlainObject/isPrimitive/isReference
* `优化` 扩展global.sleep支持随机范围/负数兼容
* `优化` 扩展global.toast支持时长控制/强制覆盖控制/dismiss方法
* `优化` 包名对象全局化 (okhttp3/androidx/de)
* `优化` 升级 Android Material 版本 1.5.0-beta01 -> 1.6.0-alpha01
# v6.0.0
###### 2021/12/01

View File

@@ -49,7 +49,7 @@ public abstract class LayoutInspectTileService extends TileService implements La
public void onClick() {
super.onClick();
Log.d(getClass().getName(), "onClick");
sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
// sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));
if (AccessibilityService.Companion.getInstance() == null) {
Toast.makeText(this, R.string.text_no_accessibility_permission_to_capture, Toast.LENGTH_SHORT).show();
AccessibilityServiceTool.goToAccessibilitySetting();
@@ -83,7 +83,6 @@ public abstract class LayoutInspectTileService extends TileService implements La
inactive();
}
});
}
protected abstract FullScreenFloatyWindow onCreateWindow(NodeInfo capture);

View File

@@ -5,6 +5,7 @@ import android.content.Context;
import android.text.TextUtils;
import com.stardust.app.GlobalAppContext;
import org.autojs.autojs.Pref;
import org.autojs.autojs.R;
@@ -35,7 +36,7 @@ public class AccessibilityServiceTool {
public static void goToAccessibilitySetting() {
Context context = GlobalAppContext.get();
if (Pref.isFirstGoToAccessibilitySetting()) {
GlobalAppContext.toast(context.getString(R.string.text_please_choose) + context.getString(R.string.app_name));
GlobalAppContext.toast(context.getString(R.string.text_please_choose) + " " + context.getString(R.string.app_name));
}
try {
AccessibilityServiceUtils.INSTANCE.goToAccessibilitySetting(context);
@@ -44,16 +45,18 @@ public class AccessibilityServiceTool {
}
}
private static final String cmd = "enabled=$(settings get secure enabled_accessibility_services)\n" +
"pkg=%s\n" +
"if [[ $enabled == *$pkg* ]]\n" +
"then\n" +
"echo already_enabled\n" +
"else\n" +
"enabled=$pkg:$enabled\n" +
"settings put secure enabled_accessibility_services $enabled\n" +
"fi\n" +
"settings put secure accessibility_enabled 1";
private static final String cmd = """
enabled=$(settings get secure enabled_accessibility_services)
pkg=%s
if [[ $enabled == *$pkg* ]]
then
echo already_enabled
else
enabled=$pkg:$enabled
settings put secure enabled_accessibility_services $enabled
fi
settings put secure accessibility_enabled 1
""";
public static boolean enableAccessibilityServiceByRoot(Class<? extends android.accessibilityservice.AccessibilityService> accessibilityService) {
String serviceName = GlobalAppContext.get().getPackageName() + "/" + accessibilityService.getName();

View File

@@ -18,13 +18,15 @@ public class RootTool {
}
}
private static final String cmd = "enabled=$(settings get system pointer_location)\n" +
"if [[ $enabled == 1 ]]\n" +
"then\n" +
"settings put system pointer_location 0\n" +
"else\n" +
"settings put system pointer_location 1\n" +
"fi\n";
private static final String cmd = """
enabled=$(settings get system pointer_location)
if [[ $enabled == 1 ]]
then
settings put system pointer_location 0
else
settings put system pointer_location 1
fi
""";
public static void togglePointerLocation() {
try {

View File

@@ -1,136 +0,0 @@
package org.autojs.autojs.tool;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import java.math.BigDecimal;
import java.math.BigInteger;
public class SafeJsonElement extends JsonElement {
private final JsonElement mJsonElement;
public SafeJsonElement(JsonElement jsonElement) {
mJsonElement = jsonElement;
}
@Override
public JsonElement deepCopy() {
return null;
}
@Override
public boolean isJsonArray() {
return mJsonElement.isJsonArray();
}
@Override
public boolean isJsonObject() {
return mJsonElement.isJsonObject();
}
@Override
public boolean isJsonPrimitive() {
return mJsonElement.isJsonPrimitive();
}
@Override
public boolean isJsonNull() {
return mJsonElement.isJsonNull();
}
public JsonObject getAsJsonObject() {
return mJsonElement.getAsJsonObject();
}
public SafeJsonObject getAsSafeJsonObject() {
try {
return new SafeJsonObject(mJsonElement.getAsJsonObject());
} catch (Exception e) {
return null;
}
}
@Override
public JsonArray getAsJsonArray() {
return mJsonElement.getAsJsonArray();
}
@Override
public JsonPrimitive getAsJsonPrimitive() {
return mJsonElement.getAsJsonPrimitive();
}
@Override
public JsonNull getAsJsonNull() {
return mJsonElement.getAsJsonNull();
}
@Override
public boolean getAsBoolean() {
return mJsonElement.getAsBoolean();
}
@Override
public Number getAsNumber() {
return mJsonElement.getAsNumber();
}
@Override
public String getAsString() {
return mJsonElement.getAsString();
}
@Override
public double getAsDouble() {
return mJsonElement.getAsDouble();
}
@Override
public float getAsFloat() {
return mJsonElement.getAsFloat();
}
@Override
public long getAsLong() {
return mJsonElement.getAsLong();
}
@Override
public int getAsInt() {
return mJsonElement.getAsInt();
}
@Override
public byte getAsByte() {
return mJsonElement.getAsByte();
}
@Override
public char getAsCharacter() {
return mJsonElement.getAsCharacter();
}
@Override
public BigDecimal getAsBigDecimal() {
return mJsonElement.getAsBigDecimal();
}
@Override
public BigInteger getAsBigInteger() {
return mJsonElement.getAsBigInteger();
}
@Override
public short getAsShort() {
return mJsonElement.getAsShort();
}
@Override
public String toString() {
return mJsonElement.toString();
}
}

View File

@@ -1,161 +0,0 @@
package org.autojs.autojs.tool;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonNull;
import com.google.gson.JsonObject;
import com.google.gson.JsonPrimitive;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Map;
import java.util.Set;
public class SafeJsonObject extends JsonElement {
private final JsonObject mJsonObject;
public SafeJsonObject(JsonObject jsonObject) {
mJsonObject = jsonObject;
}
public JsonObject deepCopy() {
return mJsonObject.deepCopy();
}
public void add(String property, JsonElement value) {
mJsonObject.add(property, value);
}
public JsonElement remove(String property) {
return mJsonObject.remove(property);
}
public void addProperty(String property, String value) {
mJsonObject.addProperty(property, value);
}
public void addProperty(String property, Number value) {
mJsonObject.addProperty(property, value);
}
public void addProperty(String property, Boolean value) {
mJsonObject.addProperty(property, value);
}
public void addProperty(String property, Character value) {
mJsonObject.addProperty(property, value);
}
public Set<Map.Entry<String, JsonElement>> entrySet() {
return mJsonObject.entrySet();
}
public Set<String> keySet() {
return mJsonObject.keySet();
}
public int size() {
return mJsonObject.size();
}
public boolean has(String memberName) {
return mJsonObject.has(memberName);
}
public JsonElement get(String memberName) {
return mJsonObject.get(memberName);
}
public JsonPrimitive getAsJsonPrimitive(String memberName) {
return mJsonObject.getAsJsonPrimitive(memberName);
}
public JsonArray getAsJsonArray(String memberName) {
return mJsonObject.getAsJsonArray(memberName);
}
public JsonObject getAsJsonObject(String memberName) {
return mJsonObject.getAsJsonObject(memberName);
}
public boolean isJsonArray() {
return mJsonObject.isJsonArray();
}
public boolean isJsonObject() {
return mJsonObject.isJsonObject();
}
public boolean isJsonPrimitive() {
return mJsonObject.isJsonPrimitive();
}
public boolean isJsonNull() {
return mJsonObject.isJsonNull();
}
public JsonObject getAsJsonObject() {
return mJsonObject.getAsJsonObject();
}
public JsonArray getAsJsonArray() {
return mJsonObject.getAsJsonArray();
}
public JsonPrimitive getAsJsonPrimitive() {
return mJsonObject.getAsJsonPrimitive();
}
public JsonNull getAsJsonNull() {
return mJsonObject.getAsJsonNull();
}
public boolean getAsBoolean() {
return mJsonObject.getAsBoolean();
}
public Number getAsNumber() {
return mJsonObject.getAsNumber();
}
public String getAsString() {
return mJsonObject.getAsString();
}
public double getAsDouble() {
return mJsonObject.getAsDouble();
}
public float getAsFloat() {
return mJsonObject.getAsFloat();
}
public long getAsLong() {
return mJsonObject.getAsLong();
}
public int getAsInt() {
return mJsonObject.getAsInt();
}
public byte getAsByte() {
return mJsonObject.getAsByte();
}
public char getAsCharacter() {
return mJsonObject.getAsCharacter();
}
public BigDecimal getAsBigDecimal() {
return mJsonObject.getAsBigDecimal();
}
public BigInteger getAsBigInteger() {
return mJsonObject.getAsBigInteger();
}
public short getAsShort() {
return mJsonObject.getAsShort();
}
}

View File

@@ -2,36 +2,36 @@ package org.autojs.autojs.tool;
import android.content.Context;
import android.net.DhcpInfo;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.format.Formatter;
import android.util.Log;
import java.math.BigInteger;
import java.net.InetAddress;
import static android.content.Context.WIFI_SERVICE;
import java.net.UnknownHostException;
import java.nio.ByteOrder;
/**
* Created by Stardust on 2017/5/11.
*/
public class WifiTool {
public static String getWifiAddress(Context context) {
WifiManager wifiMgr = (WifiManager) context.getApplicationContext().getSystemService(WIFI_SERVICE);
if(wifiMgr == null){
return null;
public static String getRouterIp(Context context) {
byte[] ipAddressByte = getIpAddressByte(context);
try {
return InetAddress.getByAddress(ipAddressByte).getHostAddress();
} catch (UnknownHostException e) {
Log.e(WifiTool.class.getSimpleName(), "Error getting Hotspot IP address ", e);
return "0.0.0.0";
}
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
return Formatter.formatIpAddress(ip);
}
public static String getRouterIp(Context context){
WifiManager wifiService = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
if(wifiService == null){
return null;
private static byte[] getIpAddressByte(Context context) {
WifiManager manager = (WifiManager) context.getApplicationContext().getSystemService(Context.WIFI_SERVICE);
DhcpInfo dhcp = manager.getDhcpInfo();
int ipAddress = dhcp.gateway;
if (ByteOrder.nativeOrder().equals(ByteOrder.LITTLE_ENDIAN)) {
ipAddress = Integer.reverseBytes(ipAddress);
}
DhcpInfo dhcpInfo = wifiService.getDhcpInfo();
return Formatter.formatIpAddress(dhcpInfo.gateway);
return BigInteger.valueOf(ipAddress).toByteArray();
}
}

View File

@@ -155,15 +155,14 @@ public class CircularMenu implements Recorder.OnStateChangedListener, LayoutInsp
mWindow.collapse();
if (!RootTool.isRootAvailable()) {
DialogUtils.showDialog(new NotAskAgainDialog.Builder(mContext, "CircularMenu.root")
.title(R.string.text_device_not_rooted)
.content(R.string.prompt_device_not_rooted)
.neutralText(R.string.text_device_rooted)
.positiveText(R.string.ok)
.onNeutral(((dialog, which) -> mRecorder.start()))
.title(R.string.text_no_root_access)
.content(R.string.no_root_access_for_record)
.negativeText(R.string.text_quit)
.positiveText(R.string.text_insist_on_record)
.onPositive(((dialog, which) -> mRecorder.start()))
.build());
} else {
mRecorder.start();
}
}

View File

@@ -155,9 +155,7 @@ public class DrawerFragment extends androidx.fragment.app.Fragment {
if (checked && !isAccessibilityServiceEnabled) {
enableAccessibilityService();
} else if (!checked && isAccessibilityServiceEnabled) {
if (!AccessibilityService.Companion.disable()) {
AccessibilityServiceTool.goToAccessibilitySetting();
}
disableAccessibilityService();
}
}
@@ -177,26 +175,27 @@ public class DrawerFragment extends androidx.fragment.app.Fragment {
}
boolean checked = holder.getSwitchCompat().isChecked();
if (checked && !enabled) {
if (new NotAskAgainDialog.Builder(context, "DrawerFragment.usage_stats")
.title(R.string.text_usage_stats_permission)
.content(R.string.description_usage_stats_permission)
.positiveText(R.string.ok)
.dismissListener(dialog -> {
if (context != null) {
IntentUtil.requestAppUsagePermission(context);
}
})
.show() == null) {
if (context != null) {
IntentUtil.requestAppUsagePermission(context);
}
if (getUsageStatsDialog(context) == null) {
syncSwitchState();
}
}
if (!checked && enabled) {
} else if (!checked && enabled) {
IntentUtil.requestAppUsagePermission(context);
}
}
private MaterialDialog getUsageStatsDialog(Context context) {
return new NotAskAgainDialog.Builder(context, "DrawerFragment.usage_stats")
.title(R.string.text_usage_stats_permission)
.content(R.string.description_usage_stats_permission)
.positiveText(R.string.ok)
.dismissListener(dialog -> {
if (context != null) {
IntentUtil.requestAppUsagePermission(context);
}
})
.show();
}
void showOrDismissFloatingWindow(DrawerMenuItemViewHolder holder) {
boolean isFloatingWindowShowing = FloatyWindowManger.isCircularMenuShowing();
boolean checked = holder.getSwitchCompat().isChecked();
@@ -273,6 +272,7 @@ public class DrawerFragment extends androidx.fragment.app.Fragment {
private boolean hasWriteSecureSettingsAccess() {
Context context = getContext();
if (context != null) {
@SuppressLint("WrongConstant")
int checkVal = context.checkCallingOrSelfPermission(WRITE_SECURE_SETTINGS_PERMISSION);
return checkVal == PackageManager.PERMISSION_GRANTED;
}
@@ -373,7 +373,7 @@ public class DrawerFragment extends androidx.fragment.app.Fragment {
Observable.fromCallable(() -> Pref.shouldEnableAccessibilityServiceByRoot() && !isAccessibilityServiceEnabled())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(needed -> {
if (needed) {
if (needed && RootTool.isRootAvailable()) {
enableAccessibilityServiceByRoot();
}
});
@@ -457,11 +457,17 @@ public class DrawerFragment extends androidx.fragment.app.Fragment {
}
private void enableAccessibilityService() {
if (!Pref.shouldEnableAccessibilityServiceByRoot()) {
if (Pref.shouldEnableAccessibilityServiceByRoot() && RootTool.isRootAvailable()) {
enableAccessibilityServiceByRoot();
} else {
AccessibilityServiceTool.goToAccessibilitySetting();
}
}
private void disableAccessibilityService() {
if (!AccessibilityService.Companion.disable()) {
AccessibilityServiceTool.goToAccessibilitySetting();
return;
}
enableAccessibilityServiceByRoot();
}
@SuppressLint("CheckResult")

View File

@@ -62,7 +62,7 @@
<string name="text_error">Error</string>
<string name="text_copy_debug_info">Copy debugging log</string>
<string name="text_it_is_the_developer_of_app">This is a software developer(。・・)</string>
<string name="text_please_choose">Please choose </string>
<string name="text_please_choose">Please choose</string>
<string name="text_crash">Crash~ o(≧□≦)o</string>
<string name="crash_feedback">(ಥ _ ಥ)Exit or submit a bug report or copy debugging log to the developer(≧∇≦)ノ</string>
<string name="text_clear">Clear</string>
@@ -182,6 +182,7 @@
<string name="text_stable_mode">Stable mode</string>
<string name="text_foreground_service">Foreground service</string>
<string name="text_usage_stats_permission">Usage stats access</string>
<string name="description_usage_stats_permission">Provides access to device usage history and statistics which results in currentPackage() a more accurate result</string>
<string name="text_volume_down_control">Volume down control</string>
<string name="text_task">Task</string>
<string name="text_next_run_time">Next</string>
@@ -238,6 +239,7 @@
<string name="text_time">Time</string>
<string name="text_size">Size</string>
<string name="text_type">Type</string>
<string name="text_icon">Icon</string>
<string name="text_js_file">*.js file</string>
<string name="text_notification_permission">Notification access</string>
<string name="text_permission">Permission</string>
@@ -253,4 +255,8 @@
<string name="text_failed">Failed</string>
<string name="mt_color_picker_title">Color picker</string>
<string name="mt_custom">Custom</string>
<string name="text_no_root_access">No root access</string>
<string name="no_root_access_for_record">Auto.js has no root access to record a script. Continue?</string>
<string name="text_insist_on_record">Record</string>
<string name="text_quit">Quit</string>
</resources>

View File

@@ -311,9 +311,9 @@
<string name="format_default_package_name" formatted="true">com.example.script%d</string>
<string name="text_should_not_be_empty">不能为空</string>
<string name="text_icon">图标</string>
<string name="text_device_not_rooted">设备没有root</string>
<string name="prompt_device_not_rooted">监测到您的设备没有root, 录制脚本需root权限, 是否继续?</string>
<string name="text_device_rooted">仍要录制</string>
<string name="text_no_root_access">root权限</string>
<string name="no_root_access_for_record">Auto.js无root权限, 录制脚本需root权限, 是否继续录制</string>
<string name="text_insist_on_record">录制</string>
<string name="nodebb_error_invalid_login_credentials">无效的登录凭证</string>
<string name="nodebb_error_change_password_error_length">密码太短</string>
<string name="nodebb_error_email_taken">邮箱已被占用</string>
@@ -393,7 +393,7 @@
<string name="text_run_on_package_update">应用更新时</string>
<string name="text_run_on_headset_plug">耳机插拔时</string>
<string name="text_run_on_time_tick">每分钟一次</string>
<string name="text_run_on_config_change">某些设置(屏幕方向,地区等)更改时</string>
<string name="text_run_on_config_change">某些设置 (屏幕方向, 地区等) 更改时</string>
<string name="error_pattern_syntax">正则表达式错误</string>
<string name="text_invalid_package_name">非法包名</string>
<string name="error_cannot_rename">重命名失败</string>
@@ -403,7 +403,7 @@
<string name="key_night_mode">key_night_mode</string>
<string name="text_run_on_startup">Auto.js启动时</string>
<string name="text_usage_stats_permission">查看使用情况权限</string>
<string name="description_usage_stats_permission">通过\"查看使用情况\"权限可获取本设备过去使用应用的情况从而使获取当前应用(currentPackage)更准确</string>
<string name="description_usage_stats_permission">通过\"查看使用情况\"权限可获取本设备过去使用应用的情况, 从而使\"获取当前应用\" (currentPackage) 结果更准确</string>
<string name="text_open_with">打开方式</string>
<string name="text_root">Root</string>
<string name="text_no_root">免Root</string>
@@ -421,4 +421,5 @@
<string name="text_failed">失败</string>
<string name="mt_color_picker_title">选择颜色</string>
<string name="mt_custom">自定义</string>
<string name="text_quit">放弃</string>
</resources>

View File

@@ -82,7 +82,7 @@
<string name="text_assist_clip">点击定位剪贴板</string>
<string name="text_script_stopped">Script stopped</string>
<string name="assist_mode_notice">(不会翻译)\"点击区域辅助服务\"是在要点击的区域不是文本时使用的,参见\"语法与API\"。\"点击区域辅助服务\"只有在\"自动操作服务\"开启时才有效。</string>
<string name="text_please_choose">Please choose</string>
<string name="text_please_choose">请选择</string>
<string name="text_crash">崩溃了o(≧□≦)o</string>
<string name="crash_feedback">(不会翻译)点击\"退出\"退出程序(ಥ _ ಥ)或者提交错误报告或者复制调试信息反馈给开发者(≧∇≦)ノ</string>
<string name="text_cannot_create_dialog_when_app_invisible">无法在后台显示弹框,脚本已停止运行</string>