From d06171d5494339ea1daba83a8ae951a949c078d6 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 2 Dec 2017 21:06:01 +0800 Subject: [PATCH] add: module device --- .idea/modules.xml | 2 +- app/src/main/AndroidManifest.xml | 2 +- .../sample/设备与设备信息/获取设备信息.js | 21 ++ .../sample/设备与设备信息/调整设备亮度.js | 24 ++ .../sample/设备与设备信息/调整设备音量.js | 44 +++ .../stardust/scriptdroid/ui/BaseActivity.java | 3 +- autojs/src/main/AndroidManifest.xml | 5 +- .../src/main/assets/javascript_engine_init.js | 1 + .../autojs/runtime/ScriptRuntime.java | 5 + .../stardust/autojs/runtime/api/Device.java | 287 ++++++++++++++++++ autojs/src/main/res/values/strings.xml | 1 + .../java/com/stardust/util/IntentExtras.java | 4 +- .../com/stardust/auojs/inrt/rt/AutoJs.java | 37 +-- 13 files changed, 395 insertions(+), 41 deletions(-) create mode 100644 app/src/main/assets/sample/设备与设备信息/获取设备信息.js create mode 100644 app/src/main/assets/sample/设备与设备信息/调整设备亮度.js create mode 100644 app/src/main/assets/sample/设备与设备信息/调整设备音量.js create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/api/Device.java diff --git a/.idea/modules.xml b/.idea/modules.xml index 7e950955..4fac18b4 100644 --- a/.idea/modules.xml +++ b/.idea/modules.xml @@ -2,8 +2,8 @@ - + diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index d4f7aeb6..b52e5ac5 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -98,7 +98,7 @@ + android:theme="@android:style/Theme.NoDisplay"/> diff --git a/app/src/main/assets/sample/设备与设备信息/获取设备信息.js b/app/src/main/assets/sample/设备与设备信息/获取设备信息.js new file mode 100644 index 00000000..e198b4dd --- /dev/null +++ b/app/src/main/assets/sample/设备与设备信息/获取设备信息.js @@ -0,0 +1,21 @@ + +console.show(); + +var str = ""; +str += "屏幕宽度:" + device.width; +str += "\n屏幕高度:" + device.height; +str += "\nbuildId:" + device.buildId; +str += "\n主板:" + device.board; +str += "\n制造商:" + device.brand; +str += "\n型号:" + device.model; +str += "\n产品名称:" + device.product; +str += "\nbootloader版本:" + device.bootloader; +str += "\n硬件名称:" + device.hardware; +str += "\n唯一标识码:" + device.fingerprint; +str += "\nIMEI: " + device.getIMEI(); +str += "\nAndroidId: " + device.getAndroidId(); +str += "\nMac: " + device.getMacAddress(); +str += "\nAPI: " + device.sdkInt; +str += "\n电量: " + device.getBattery(); + +log(str); diff --git a/app/src/main/assets/sample/设备与设备信息/调整设备亮度.js b/app/src/main/assets/sample/设备与设备信息/调整设备亮度.js new file mode 100644 index 00000000..502fbe7f --- /dev/null +++ b/app/src/main/assets/sample/设备与设备信息/调整设备亮度.js @@ -0,0 +1,24 @@ +"ui"; + +ui.layout( + + + 亮度 + + +); + +//getBrightnessMode()返回亮度模式,1为自动亮度 +ui.auto.setChecked(device.getBrightnessMode()); +ui.auto.setOnCheckedChangeListener(function(v, checked){ + device.setBrightnessMode(checked ? 1: 0); +}); + +ui.brightness.setProgress(device.getBrightness()); +ui.brightness.setOnSeekBarChangeListener({ + onProgressChanged: function(seekbar, p, fromUser){ + if(fromUser){ + device.setBrightness(p); + } + } +}); \ No newline at end of file diff --git a/app/src/main/assets/sample/设备与设备信息/调整设备音量.js b/app/src/main/assets/sample/设备与设备信息/调整设备音量.js new file mode 100644 index 00000000..2e6fd5f8 --- /dev/null +++ b/app/src/main/assets/sample/设备与设备信息/调整设备音量.js @@ -0,0 +1,44 @@ +"ui"; + +ui.layout( + + 媒体音量 + + + 通知音量 + + + 闹钟音量 + + +); + +ui.music.setMax(device.getMusicMaxVolume()); +ui.music.setProgress(device.getMusicVolume()); +ui.music.setOnSeekBarChangeListener({ + onProgressChanged: function(seekbar, p, fromUser){ + if(fromUser){ + device.setMusicVolume(p); + } + } +}); + +ui.notification.setMax(device.getNotificationMaxVolume()); +ui.notification.setProgress(device.getAlarmVolume()); +ui.notification.setOnSeekBarChangeListener({ + onProgressChanged: function(seekbar, p, fromUser){ + if(fromUser){ + device.setNotificationVolume(p); + } + } +}); + +ui.alarm.setMax(device.getAlarmMaxVolume()); +ui.alarm.setProgress(device.getAlarmVolume()); +ui.alarm.setOnSeekBarChangeListener({ + onProgressChanged: function(seekbar, p, fromUser){ + if(fromUser){ + device.setAlarmVolume(p); + } + } +}); \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java index 297c9336..207d0923 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java @@ -9,6 +9,7 @@ import android.support.annotation.RequiresApi; import android.support.v7.app.AppCompatActivity; import android.support.v7.widget.Toolbar; import android.view.View; +import android.widget.SeekBar; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.network.VersionService; @@ -26,7 +27,7 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; * Created by Stardust on 2017/1/23. */ -public abstract class BaseActivity extends AppCompatActivity { +public abstract class BaseActivity extends AppCompatActivity { protected static final int PERMISSION_REQUEST_CODE = 11186; diff --git a/autojs/src/main/AndroidManifest.xml b/autojs/src/main/AndroidManifest.xml index 7f096fb3..aaf9e857 100644 --- a/autojs/src/main/AndroidManifest.xml +++ b/autojs/src/main/AndroidManifest.xml @@ -3,13 +3,16 @@ package="com.stardust.autojs" > + + + + - diff --git a/autojs/src/main/assets/javascript_engine_init.js b/autojs/src/main/assets/javascript_engine_init.js index 062f8a9f..b3d87d4c 100644 --- a/autojs/src/main/assets/javascript_engine_init.js +++ b/autojs/src/main/assets/javascript_engine_init.js @@ -49,6 +49,7 @@ var __that__ = this; var Promise = require('promise.js'); var JSON = require('__json2__.js'); var util = require('__util__.js'); +var device = __runtime__.device; var __asGlobal__ = function(obj, functions){ var len = functions.length; diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java index b9e8c056..5bff8ef3 100644 --- a/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java +++ b/autojs/src/main/java/com/stardust/autojs/runtime/ScriptRuntime.java @@ -13,6 +13,7 @@ import com.stardust.autojs.rhino.AndroidClassLoader; import com.stardust.autojs.runtime.api.AbstractShell; import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.Console; +import com.stardust.autojs.runtime.api.Device; import com.stardust.autojs.runtime.api.Engines; import com.stardust.autojs.runtime.api.Events; import com.stardust.autojs.runtime.api.Loopers; @@ -140,6 +141,9 @@ public class ScriptRuntime { @ScriptVariable public Timers timers; + @ScriptVariable + public Device device; + @ScriptVariable public final AccessibilityBridge accessibilityBridge; @@ -172,6 +176,7 @@ public class ScriptRuntime { } engines = new Engines(builder.mEngineService); dialogs = new Dialogs(app, mUiHandler, bridges); + device = new Device(mUiHandler.getContext()); } public void init() { diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/api/Device.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/Device.java new file mode 100644 index 00000000..d1b7f9a3 --- /dev/null +++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/Device.java @@ -0,0 +1,287 @@ +package com.stardust.autojs.runtime.api; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.app.AlarmManager; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.content.pm.PackageManager; +import android.media.AudioManager; +import android.net.wifi.WifiInfo; +import android.net.wifi.WifiManager; +import android.os.BatteryManager; +import android.os.Build; +import android.provider.Settings; +import android.support.annotation.NonNull; +import android.support.annotation.Nullable; +import android.support.v4.app.ActivityCompat; +import android.telephony.TelephonyManager; +import android.util.Log; + +import com.stardust.app.OnActivityResultDelegate; +import com.stardust.autojs.R; +import com.stardust.autojs.runtime.exception.ScriptException; +import com.stardust.pio.PFile; +import com.stardust.pio.PFiles; +import com.stardust.pio.UncheckedIOException; +import com.stardust.util.IntentUtil; +import com.stardust.util.ScreenMetrics; + +import java.io.BufferedReader; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.io.StringWriter; +import java.io.Writer; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.text.DecimalFormat; +import java.util.Collections; +import java.util.List; + +import ezy.assist.compat.SettingsCompat; + +/** + * Created by Stardust on 2017/12/2. + */ + +public class Device { + + public static final int width = ScreenMetrics.getDeviceScreenWidth(); + + public static final int height = ScreenMetrics.getDeviceScreenHeight(); + + public static final String buildId = Build.ID; + + public static final String buildDisplay = Build.DISPLAY; + + public static final String product = Build.PRODUCT; + + public static final String device = Build.DEVICE; + + public static final String board = Build.BOARD; + + public static final String brand = Build.BRAND; + + public static final String model = Build.MODEL; + + public static final String bootloader = Build.BOOTLOADER; + + public static final String hardware = Build.HARDWARE; + + public static final String fingerprint = Build.FINGERPRINT; + + public static final int sdkInt = Build.VERSION.SDK_INT; + + @SuppressLint("HardwareIds") + public static final String serial = Build.SERIAL; + + private Context mContext; + + public Device(Context context) { + mContext = context; + } + + @SuppressLint("HardwareIds") + @Nullable + public String getIMEI() { + try { + return ((TelephonyManager) mContext.getSystemService(Context.TELEPHONY_SERVICE)).getDeviceId(); + } catch (SecurityException e) { + return null; + } + } + + @SuppressLint("HardwareIds") + public String getAndroidId() { + return Settings.Secure.getString(mContext.getContentResolver(), Settings.Secure.ANDROID_ID); + } + + public int getBrightness() throws Settings.SettingNotFoundException { + return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS); + } + + public int getBrightnessMode() throws Settings.SettingNotFoundException { + return Settings.System.getInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE); + } + + public void setBrightness(int b) throws Settings.SettingNotFoundException { + checkWriteSettingsPermission(); + Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS, b); + } + + public void setBrightnessMode(int b) throws Settings.SettingNotFoundException { + checkWriteSettingsPermission(); + Settings.System.putInt(mContext.getContentResolver(), Settings.System.SCREEN_BRIGHTNESS_MODE, b); + } + + public int getMusicVolume() { + return ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .getStreamVolume(AudioManager.STREAM_MUSIC); + } + + public int getNotificationVolume() { + return ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .getStreamVolume(AudioManager.STREAM_NOTIFICATION); + } + + public int getAlarmVolume() { + return ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .getStreamVolume(AudioManager.STREAM_ALARM); + } + + public int getMusicMaxVolume() { + return ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .getStreamMaxVolume(AudioManager.STREAM_MUSIC); + } + + public int getNotificationMaxVolume() { + return ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .getStreamMaxVolume(AudioManager.STREAM_NOTIFICATION); + } + + public int getAlarmMaxVolume() { + return ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .getStreamMaxVolume(AudioManager.STREAM_ALARM); + } + + public void setMusicVolume(int i) { + checkWriteSettingsPermission(); + ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .setStreamVolume(AudioManager.STREAM_MUSIC, i, 0); + } + + public void setAlarmVolume(int i) { + checkWriteSettingsPermission(); + ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .setStreamVolume(AudioManager.STREAM_ALARM, i, 0); + } + + public void setNotificationVolume(int i) { + checkWriteSettingsPermission(); + ((AudioManager) getSystemService(Context.AUDIO_SERVICE)) + .setStreamVolume(AudioManager.STREAM_NOTIFICATION, i, 0); + } + + public float getBattery() { + Intent batteryIntent = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + if (batteryIntent == null) { + return -1; + } + int level = batteryIntent.getIntExtra(BatteryManager.EXTRA_LEVEL, -1); + int scale = batteryIntent.getIntExtra(BatteryManager.EXTRA_SCALE, -1); + float battery = ((float) level / scale) * 100.0f; + return Math.round(battery * 10) / 10; + } + + public boolean isCharging() { + Intent intent = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); + if (intent == null) { + throw new ScriptException("Cannot retrieve the battery state"); + } + int plugged = intent.getIntExtra(BatteryManager.EXTRA_PLUGGED, -1); + return plugged == BatteryManager.BATTERY_PLUGGED_AC || plugged == BatteryManager.BATTERY_PLUGGED_USB; + } + + private void checkWriteSettingsPermission() { + if (SettingsCompat.canWriteSettings(mContext)) { + return; + } + SettingsCompat.manageWriteSettings(mContext); + throw new SecurityException(mContext.getString(R.string.no_write_settings_permissin)); + } + + + // just to avoid warning of null pointer to make android studio happy.. + @NonNull + @SuppressWarnings("unchecked") + private T getSystemService(String service) { + Object systemService = mContext.getSystemService(service); + if (systemService == null) { + throw new RuntimeException("should never happen..." + service); + } + return (T) systemService; + } + + private static final String FAKE_MAC_ADDRESS = "02:00:00:00:00:00"; + + @SuppressLint("HardwareIds") + public String getMacAddress() throws Exception { + WifiManager wifiMan = (WifiManager) mContext.getApplicationContext().getSystemService(Context.WIFI_SERVICE); + if (wifiMan == null) { + return null; + } + WifiInfo wifiInf = wifiMan.getConnectionInfo(); + if (wifiInf == null) { + return getMacByFile(); + } + + String mac = wifiInf.getMacAddress(); + if (FAKE_MAC_ADDRESS.equals(mac)) { + mac = null; + } + if (mac == null) { + mac = getMacByInterface(); + if (mac == null) { + mac = getMacByFile(); + } + } + return mac; + } + + private static String getMacByInterface() throws SocketException { + List networkInterfaces = Collections.list(NetworkInterface.getNetworkInterfaces()); + for (NetworkInterface networkInterface : networkInterfaces) { + if (networkInterface.getName().equalsIgnoreCase("wlan0")) { + byte[] macBytes = networkInterface.getHardwareAddress(); + if (macBytes == null) { + return null; + } + + StringBuilder mac = new StringBuilder(); + for (byte b : macBytes) { + mac.append(String.format("%02X:", b)); + } + + if (mac.length() > 0) { + mac.deleteCharAt(mac.length() - 1); + } + return mac.toString(); + } + } + return null; + } + + private static String getMacByFile() throws Exception { + try { + return PFiles.read("/sys/class/net/wlan0/address"); + } catch (UncheckedIOException e) { + return null; + } + } + + @Override + public String toString() { + return "Device{" + + "width=" + width + + ", height=" + height + + ", buildId='" + buildId + '\'' + + ", buildDisplay='" + buildDisplay + '\'' + + ", product='" + product + '\'' + + ", device='" + device + '\'' + + ", board='" + board + '\'' + + ", brand='" + brand + '\'' + + ", model='" + model + '\'' + + ", bootloader='" + bootloader + '\'' + + ", hardware='" + hardware + '\'' + + ", fingerprint='" + fingerprint + '\'' + + ", serial='" + serial + '\'' + + ", sdkInt='" + sdkInt + '\'' + + '}'; + } + +} diff --git a/autojs/src/main/res/values/strings.xml b/autojs/src/main/res/values/strings.xml index e69468de..6da7f8ed 100644 --- a/autojs/src/main/res/values/strings.xml +++ b/autojs/src/main/res/values/strings.xml @@ -15,6 +15,7 @@ 使脚本自动操作(点击、长按、滑动等)所需,若关闭则只能执行不涉及自动操作的脚本。 AutoJs 按键监听未启用,请在软件设置中开启 + 沒有修改系統设置权限 diff --git a/common/src/main/java/com/stardust/util/IntentExtras.java b/common/src/main/java/com/stardust/util/IntentExtras.java index e3a65ec0..04391173 100644 --- a/common/src/main/java/com/stardust/util/IntentExtras.java +++ b/common/src/main/java/com/stardust/util/IntentExtras.java @@ -56,7 +56,7 @@ public class IntentExtras implements Serializable { @SuppressWarnings("unchecked") public T getAndClear(String key) { T value = (T) mMap.get(key); - clear(); + recycle(); return value; } @@ -70,7 +70,7 @@ public class IntentExtras implements Serializable { return intent; } - public void clear() { + public void recycle() { extraStore.remove(mId); mMap = null; } diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java b/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java index 85248f0b..05b3546e 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/rt/AutoJs.java @@ -1,48 +1,15 @@ package com.stardust.auojs.inrt.rt; -import android.app.Activity; import android.app.Application; import android.content.Context; -import android.os.Build; -import android.os.Bundle; -import android.support.annotation.Nullable; -import android.support.annotation.RequiresApi; +import android.widget.CheckBox; +import android.widget.CompoundButton; -import com.stardust.app.OnActivityResultDelegate; -import com.stardust.app.SimpleActivityLifecycleCallbacks; import com.stardust.auojs.inrt.App; import com.stardust.auojs.inrt.R; -import com.stardust.autojs.ScriptEngineService; -import com.stardust.autojs.ScriptEngineServiceBuilder; -import com.stardust.autojs.core.accessibility.AccessibilityBridge; -import com.stardust.autojs.core.console.GlobalStardustConsole; -import com.stardust.autojs.core.inputevent.InputEventObserver; -import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder; -import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; -import com.stardust.autojs.engine.RootAutomatorEngine; -import com.stardust.autojs.engine.ScriptEngine; -import com.stardust.autojs.engine.ScriptEngineManager; -import com.stardust.autojs.runtime.ScriptRuntime; -import com.stardust.autojs.runtime.api.AbstractShell; -import com.stardust.autojs.runtime.api.AppUtils; -import com.stardust.autojs.core.util.Shell; -import com.stardust.autojs.core.image.ScreenCaptureRequestActivity; -import com.stardust.autojs.core.image.ScreenCaptureRequester; -import com.stardust.autojs.core.console.StardustConsole; import com.stardust.autojs.runtime.exception.ScriptException; -import com.stardust.autojs.script.AutoFileSource; -import com.stardust.autojs.script.JavaScriptSource; -import com.stardust.util.ScreenMetrics; -import com.stardust.util.Supplier; -import com.stardust.util.UiHandler; -import com.stardust.view.accessibility.AccessibilityInfoProvider; -import com.stardust.view.accessibility.AccessibilityNotificationObserver; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityServiceUtils; -import com.stardust.view.accessibility.NotificationListener; - -import org.opencv.android.BaseLoaderCallback; -import org.opencv.android.OpenCVLoader; /**