optimize module floaty and add two samples
This commit is contained in:
32
app/src/main/assets/sample/悬浮窗/动态悬浮文字.js
Normal file
32
app/src/main/assets/sample/悬浮窗/动态悬浮文字.js
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
var window = floaty.window(
|
||||||
|
<frame gravity="center">
|
||||||
|
<text id="text" textSize="16sp" textColor="#f44336"/>
|
||||||
|
</frame>
|
||||||
|
);
|
||||||
|
|
||||||
|
window.text.click(()=>{
|
||||||
|
window.setAdjustEnabled(!window.isAdjustEnabled());
|
||||||
|
});
|
||||||
|
|
||||||
|
setInterval(()=>{
|
||||||
|
//对控件的操作需要在UI线程中执行
|
||||||
|
ui.run(function(){
|
||||||
|
window.text.setText(dynamicText());
|
||||||
|
});
|
||||||
|
}, 1000);
|
||||||
|
|
||||||
|
function dynamicText(){
|
||||||
|
var date = new Date();
|
||||||
|
var str = util.format("时间: %d:%d:%d\n", date.getHours(), date.getMinutes(), date.getSeconds());
|
||||||
|
str += util.format("内存使用量: %d%%\n", getMemoryUsage());
|
||||||
|
str += "当前活动: " + currentActivity() + "\n";
|
||||||
|
str += "当前包名: " + currentPackage();
|
||||||
|
return str;
|
||||||
|
}
|
||||||
|
|
||||||
|
//获取内存使用率
|
||||||
|
function getMemoryUsage(){
|
||||||
|
var usage = (100 * device.getAvailMem() / device.getTotalMem());
|
||||||
|
//保留一位小数
|
||||||
|
return Math.round(usage * 10) / 10;
|
||||||
|
}
|
||||||
11
app/src/main/assets/sample/悬浮窗/悬浮文字.js
Normal file
11
app/src/main/assets/sample/悬浮窗/悬浮文字.js
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
var window = floaty.window(
|
||||||
|
<frame gravity="center">
|
||||||
|
<text id="text" text="点击可调整位置" textSize="16sp"/>
|
||||||
|
</frame>
|
||||||
|
);
|
||||||
|
|
||||||
|
window.text.click(()=>{
|
||||||
|
window.setAdjustEnabled(!window.isAdjustEnabled());
|
||||||
|
});
|
||||||
|
|
||||||
|
setInterval(()=>{}, 1000);
|
||||||
@@ -9,6 +9,8 @@ module.exports = function(__runtime__, scope){
|
|||||||
return wrap(__runtime__.floaty.window(layout));
|
return wrap(__runtime__.floaty.window(layout));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
floaty.__view_cache__ = {};
|
||||||
|
|
||||||
function wrap(window){
|
function wrap(window){
|
||||||
var proxyObject = new com.stardust.autojs.rhino.ProxyJavaObject(scope, window, window.getClass());
|
var proxyObject = new com.stardust.autojs.rhino.ProxyJavaObject(scope, window, window.getClass());
|
||||||
proxyObject.__proxy__ = {
|
proxyObject.__proxy__ = {
|
||||||
@@ -18,12 +20,16 @@ module.exports = function(__runtime__, scope){
|
|||||||
get: function(name) {
|
get: function(name) {
|
||||||
var value = window[name];
|
var value = window[name];
|
||||||
if(typeof(value) == 'undefined'){
|
if(typeof(value) == 'undefined'){
|
||||||
value = window.getView(name);
|
value = floaty.__view_cache__[name];
|
||||||
|
if(!value){
|
||||||
|
value = window.getView(name);
|
||||||
|
if(value){
|
||||||
|
value = ui.__decorate__(value);
|
||||||
|
floaty.__view_cache__[name] = value;
|
||||||
|
}
|
||||||
|
}
|
||||||
if(!value){
|
if(!value){
|
||||||
value = undefined;
|
value = undefined;
|
||||||
}else{
|
|
||||||
value = scope.ui.__decorate__(value);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return value;
|
return value;
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ module.exports = function(__runtime__, scope){
|
|||||||
}
|
}
|
||||||
|
|
||||||
ui.run = function(action){
|
ui.run = function(action){
|
||||||
activity.runOnUiThread(action);
|
__runtime__.uiHandler.post(action);
|
||||||
}
|
}
|
||||||
|
|
||||||
ui.nonUi = function(action){
|
ui.nonUi = function(action){
|
||||||
|
|||||||
@@ -158,11 +158,13 @@ public class ScriptRuntime {
|
|||||||
@ScriptVariable
|
@ScriptVariable
|
||||||
public final Floaty floaty;
|
public final Floaty floaty;
|
||||||
|
|
||||||
|
@ScriptVariable
|
||||||
|
public UiHandler uiHandler;
|
||||||
|
|
||||||
private Images images;
|
private Images images;
|
||||||
|
|
||||||
private static WeakReference<Context> applicationContext;
|
private static WeakReference<Context> applicationContext;
|
||||||
private Map<String, Object> mProperties = new ConcurrentHashMap<>();
|
private Map<String, Object> mProperties = new ConcurrentHashMap<>();
|
||||||
private UiHandler mUiHandler;
|
|
||||||
private AbstractShell mRootShell;
|
private AbstractShell mRootShell;
|
||||||
private Supplier<AbstractShell> mShellSupplier;
|
private Supplier<AbstractShell> mShellSupplier;
|
||||||
private ScreenMetrics mScreenMetrics = new ScreenMetrics();
|
private ScreenMetrics mScreenMetrics = new ScreenMetrics();
|
||||||
@@ -170,23 +172,23 @@ public class ScriptRuntime {
|
|||||||
|
|
||||||
protected ScriptRuntime(Builder builder) {
|
protected ScriptRuntime(Builder builder) {
|
||||||
app = builder.mAppUtils;
|
app = builder.mAppUtils;
|
||||||
mUiHandler = builder.mUiHandler;
|
uiHandler = builder.mUiHandler;
|
||||||
console = builder.mConsole;
|
console = builder.mConsole;
|
||||||
accessibilityBridge = builder.mAccessibilityBridge;
|
accessibilityBridge = builder.mAccessibilityBridge;
|
||||||
mShellSupplier = builder.mShellSupplier;
|
mShellSupplier = builder.mShellSupplier;
|
||||||
ui = new UI(mUiHandler.getContext());
|
ui = new UI(uiHandler.getContext());
|
||||||
this.automator = new SimpleActionAutomator(accessibilityBridge, this);
|
this.automator = new SimpleActionAutomator(accessibilityBridge, this);
|
||||||
automator.setScreenMetrics(mScreenMetrics);
|
automator.setScreenMetrics(mScreenMetrics);
|
||||||
this.info = accessibilityBridge.getInfoProvider();
|
this.info = accessibilityBridge.getInfoProvider();
|
||||||
Context context = mUiHandler.getContext();
|
Context context = uiHandler.getContext();
|
||||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||||||
images = new Images(context, this, builder.mScreenCaptureRequester);
|
images = new Images(context, this, builder.mScreenCaptureRequester);
|
||||||
}
|
}
|
||||||
engines = new Engines(builder.mEngineService);
|
engines = new Engines(builder.mEngineService);
|
||||||
dialogs = new Dialogs(app, mUiHandler, bridges);
|
dialogs = new Dialogs(app, uiHandler, bridges);
|
||||||
threads = new Threads(this);
|
threads = new Threads(this);
|
||||||
device = new Device(mUiHandler.getContext());
|
device = new Device(uiHandler.getContext());
|
||||||
floaty = new Floaty(mUiHandler, ui);
|
floaty = new Floaty(uiHandler, ui);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void init() {
|
public void init() {
|
||||||
@@ -194,7 +196,7 @@ public class ScriptRuntime {
|
|||||||
throw new IllegalStateException("already initialized");
|
throw new IllegalStateException("already initialized");
|
||||||
timers = new Timers(bridges);
|
timers = new Timers(bridges);
|
||||||
loopers = new Loopers(this);
|
loopers = new Loopers(this);
|
||||||
events = new Events(mUiHandler.getContext(), accessibilityBridge, bridges, loopers);
|
events = new Events(uiHandler.getContext(), accessibilityBridge, bridges, loopers);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setApplicationContext(Context context) {
|
public static void setApplicationContext(Context context) {
|
||||||
@@ -209,7 +211,7 @@ public class ScriptRuntime {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public UiHandler getUiHandler() {
|
public UiHandler getUiHandler() {
|
||||||
return mUiHandler;
|
return uiHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
public AccessibilityBridge getAccessibilityBridge() {
|
public AccessibilityBridge getAccessibilityBridge() {
|
||||||
@@ -217,7 +219,7 @@ public class ScriptRuntime {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void toast(final String text) {
|
public void toast(final String text) {
|
||||||
mUiHandler.toast(text);
|
uiHandler.toast(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void sleep(long millis) {
|
public void sleep(long millis) {
|
||||||
@@ -230,12 +232,12 @@ public class ScriptRuntime {
|
|||||||
|
|
||||||
public void setClip(final String text) {
|
public void setClip(final String text) {
|
||||||
if (Looper.myLooper() == Looper.getMainLooper()) {
|
if (Looper.myLooper() == Looper.getMainLooper()) {
|
||||||
ClipboardUtil.setClip(mUiHandler.getContext(), text);
|
ClipboardUtil.setClip(uiHandler.getContext(), text);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
VolatileDispose<Object> dispose = new VolatileDispose<>();
|
VolatileDispose<Object> dispose = new VolatileDispose<>();
|
||||||
mUiHandler.post(() -> {
|
uiHandler.post(() -> {
|
||||||
ClipboardUtil.setClip(mUiHandler.getContext(), text);
|
ClipboardUtil.setClip(uiHandler.getContext(), text);
|
||||||
dispose.setAndNotify(text);
|
dispose.setAndNotify(text);
|
||||||
});
|
});
|
||||||
dispose.blockedGet();
|
dispose.blockedGet();
|
||||||
@@ -243,13 +245,13 @@ public class ScriptRuntime {
|
|||||||
|
|
||||||
public String getClip() {
|
public String getClip() {
|
||||||
if (Looper.myLooper() == Looper.getMainLooper()) {
|
if (Looper.myLooper() == Looper.getMainLooper()) {
|
||||||
return ClipboardUtil.getClipOrEmpty(mUiHandler.getContext()).toString();
|
return ClipboardUtil.getClipOrEmpty(uiHandler.getContext()).toString();
|
||||||
}
|
}
|
||||||
final VolatileDispose<String> clip = new VolatileDispose<>();
|
final VolatileDispose<String> clip = new VolatileDispose<>();
|
||||||
mUiHandler.post(new Runnable() {
|
uiHandler.post(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
clip.setAndNotify(ClipboardUtil.getClipOrEmpty(mUiHandler.getContext()).toString());
|
clip.setAndNotify(ClipboardUtil.getClipOrEmpty(uiHandler.getContext()).toString());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return clip.blockedGetOrThrow(ScriptInterruptedException.class);
|
return clip.blockedGetOrThrow(ScriptInterruptedException.class);
|
||||||
@@ -282,7 +284,7 @@ public class ScriptRuntime {
|
|||||||
|
|
||||||
public void requiresApi(int i) {
|
public void requiresApi(int i) {
|
||||||
if (Build.VERSION.SDK_INT < i) {
|
if (Build.VERSION.SDK_INT < i) {
|
||||||
throw new ScriptException(mUiHandler.getContext().getString(R.string.text_requires_sdk_version_to_run_the_script) + SdkVersionUtil.sdkIntToString(i));
|
throw new ScriptException(uiHandler.getContext().getString(R.string.text_requires_sdk_version_to_run_the_script) + SdkVersionUtil.sdkIntToString(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.stardust.autojs.runtime.api;
|
|||||||
|
|
||||||
import android.Manifest;
|
import android.Manifest;
|
||||||
import android.annotation.SuppressLint;
|
import android.annotation.SuppressLint;
|
||||||
|
import android.app.ActivityManager;
|
||||||
import android.app.AlarmManager;
|
import android.app.AlarmManager;
|
||||||
import android.content.Context;
|
import android.content.Context;
|
||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
@@ -178,6 +179,22 @@ public class Device {
|
|||||||
return Math.round(battery * 10) / 10;
|
return Math.round(battery * 10) / 10;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public long getTotalMem(){
|
||||||
|
ActivityManager activityManager = getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
|
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
|
||||||
|
activityManager.getMemoryInfo(info);
|
||||||
|
return info.totalMem;
|
||||||
|
}
|
||||||
|
|
||||||
|
public long getAvailMem(){
|
||||||
|
ActivityManager activityManager = getSystemService(Context.ACTIVITY_SERVICE);
|
||||||
|
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
|
||||||
|
activityManager.getMemoryInfo(info);
|
||||||
|
return info.availMem;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
public boolean isCharging() {
|
public boolean isCharging() {
|
||||||
Intent intent = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
Intent intent = mContext.registerReceiver(null, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
|
||||||
if (intent == null) {
|
if (intent == null) {
|
||||||
|
|||||||
@@ -11,8 +11,11 @@ import com.stardust.autojs.core.floaty.FloatyWindow;
|
|||||||
import com.stardust.autojs.core.ui.JsLayoutInflater;
|
import com.stardust.autojs.core.ui.JsLayoutInflater;
|
||||||
import com.stardust.autojs.core.ui.JsViewHelper;
|
import com.stardust.autojs.core.ui.JsViewHelper;
|
||||||
import com.stardust.autojs.rhino.ProxyObject;
|
import com.stardust.autojs.rhino.ProxyObject;
|
||||||
|
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
||||||
|
import com.stardust.concurrent.VolatileDispose;
|
||||||
import com.stardust.enhancedfloaty.FloatyService;
|
import com.stardust.enhancedfloaty.FloatyService;
|
||||||
import com.stardust.util.UiHandler;
|
import com.stardust.util.UiHandler;
|
||||||
|
import com.stardust.util.ViewUtil;
|
||||||
|
|
||||||
import org.mozilla.javascript.NativeJavaObject;
|
import org.mozilla.javascript.NativeJavaObject;
|
||||||
import org.mozilla.javascript.Scriptable;
|
import org.mozilla.javascript.Scriptable;
|
||||||
@@ -53,7 +56,13 @@ public class Floaty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private View inflate(String xml) {
|
private View inflate(String xml) {
|
||||||
return mJsLayoutInflater.inflate(mContext, xml);
|
if (Looper.getMainLooper() == Looper.myLooper()) {
|
||||||
|
return mJsLayoutInflater.inflate(mContext, xml);
|
||||||
|
} else {
|
||||||
|
VolatileDispose<View> dispose = new VolatileDispose<>();
|
||||||
|
mUiHandler.post(() -> dispose.setAndNotify(mJsLayoutInflater.inflate(mContext, xml)));
|
||||||
|
return dispose.blockedGetOrThrow(ScriptInterruptedException.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void closeAll() {
|
public void closeAll() {
|
||||||
@@ -87,18 +96,9 @@ public class Floaty {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public View getView(String id) {
|
public View getView(String id) {
|
||||||
View v = mViewCache.get(id);
|
return JsViewHelper.findViewByStringId(mView, id);
|
||||||
if (v != null) {
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
v = JsViewHelper.findViewByStringId(mView, id);
|
|
||||||
if (v != null) {
|
|
||||||
mViewCache.put(id, v);
|
|
||||||
return v;
|
|
||||||
} else {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getX() {
|
public int getX() {
|
||||||
return mWindow.getWindowBridge().getX();
|
return mWindow.getWindowBridge().getX();
|
||||||
}
|
}
|
||||||
@@ -119,7 +119,10 @@ public class Floaty {
|
|||||||
if (Looper.myLooper() == Looper.getMainLooper()) {
|
if (Looper.myLooper() == Looper.getMainLooper()) {
|
||||||
mWindow.getWindowBridge().updateMeasure(w, h);
|
mWindow.getWindowBridge().updateMeasure(w, h);
|
||||||
} else {
|
} else {
|
||||||
mUiHandler.post(() -> mWindow.getWindowBridge().updateMeasure(w, h));
|
mUiHandler.post(() -> {
|
||||||
|
ViewUtil.setViewMeasure(mView, w, h);
|
||||||
|
mWindow.getWindowBridge().updateMeasure(w, h);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user