add sublime text plugin support

This commit is contained in:
hyb1996
2017-05-11 17:06:37 +08:00
parent 4f25582ce5
commit b12e26b797
51 changed files with 490 additions and 100 deletions

View File

@@ -2,6 +2,7 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.stardust.scriptdroid">
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.android.launcher.permission.INSTALL_SHORTCUT"/>

View File

@@ -74,7 +74,6 @@ public class App extends MultiDexApplication {
AutoJs.initInstance(this);
JsBeautifierFactory.initJsBeautify(this, "js/jsbeautify.js");
initVolumeChangeObserver();
startService(new Intent(this, AccessibilityWatchDogService.class));
}
private void initVolumeChangeObserver() {

View File

@@ -20,13 +20,12 @@ import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.Pref;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.api.Shell;
import com.stardust.scriptdroid.script.StorageScriptProvider;
import com.stardust.scriptdroid.ui.console.StardustConsole;
import com.stardust.util.Supplier;
import com.stardust.util.UiHandler;
import com.stardust.view.accessibility.AccessibilityInfoProvider;
import com.stardust.scriptdroid.layout_inspector.LayoutInspector;
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.LayoutInspector;
import com.stardust.scriptdroid.external.floating_window.menu.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.console.JraskaConsole;

View File

@@ -11,6 +11,7 @@ import android.view.WindowManager;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.autojs.runtime.api.internal.VolatileBox;
import com.stardust.util.UiHandler;
/**

View File

@@ -2,15 +2,13 @@ package com.stardust.scriptdroid.autojs.api;
import android.content.Context;
import android.content.ContextWrapper;
import android.content.DialogInterface;
import android.text.TextUtils;
import android.view.ContextThemeWrapper;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.autojs.runtime.ScriptInterface;
import com.stardust.autojs.runtime.ScriptInterruptedException;
import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.scriptdroid.App;
import com.stardust.autojs.runtime.api.internal.VolatileBox;
import com.stardust.scriptdroid.R;
import com.stardust.util.ArrayUtils;
import com.stardust.util.UiHandler;

View File

@@ -1,47 +0,0 @@
package com.stardust.scriptdroid.autojs.api;
import com.stardust.autojs.runtime.ScriptInterruptedException;
/**
* Created by Stardust on 2017/5/8.
*/
public class VolatileBox<T> {
private volatile T mValue;
public VolatileBox() {
}
public VolatileBox(T value) {
set(value);
}
public T get() {
return mValue;
}
public void set(T value) {
mValue = value;
}
public void setAndNotify(T value) {
mValue = value;
synchronized (this) {
notify();
}
}
public T blockedGet() {
synchronized (this) {
try {
this.wait();
} catch (InterruptedException e) {
throw new ScriptInterruptedException();
}
}
return mValue;
}
}

View File

@@ -6,18 +6,12 @@ import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Handler;
import android.support.annotation.IntDef;
import android.view.Gravity;
import android.view.View;
import android.view.WindowManager;
import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.enhancedfloaty.FloatyWindow;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.autojs.api.VolatileBox;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
/**
* Created by Stardust on 2017/5/9.

View File

@@ -20,7 +20,6 @@ import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger;
import com.stardust.scriptdroid.external.floating_window.menu.view.FloatingLayoutBoundsView;
import com.stardust.scriptdroid.external.floating_window.menu.view.FloatingLayoutHierarchyView;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.theme.ThemeColorManagerCompat;
import com.stardust.util.MessageEvent;

View File

@@ -12,7 +12,7 @@ import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.layout_inspector.LayoutInspector;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.LayoutInspector;
import com.stardust.util.ClipboardUtil;
import com.stardust.scriptdroid.ui.main.MainActivity;
import com.stardust.util.MessageEvent;

View File

@@ -15,17 +15,15 @@ import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.accessibility.AccessibilityEventHelper;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.record.inputevent.InputEventConverter;
import com.stardust.scriptdroid.record.inputevent.KeyObserver;
import com.stardust.scriptdroid.record.inputevent.TouchRecorder;
import com.stardust.scriptdroid.external.floating_window.menu.record.Recorder;
import com.stardust.scriptdroid.external.floating_window.menu.record.accessibility.AccessibilityActionRecorder;
import com.stardust.scriptdroid.external.floating_window.menu.record.inputevent.KeyObserver;
import com.stardust.scriptdroid.external.floating_window.menu.record.inputevent.TouchRecorder;
import com.stardust.scriptdroid.ui.main.MainActivity;
import com.stardust.util.MessageEvent;
import com.stardust.view.ViewBinder;
import com.stardust.view.ViewBinding;
import org.greenrobot.eventbus.EventBus;
import org.greenrobot.eventbus.Subscribe;
import io.mattcarroll.hover.Navigator;

View File

@@ -1,17 +1,12 @@
package com.stardust.scriptdroid.layout_inspector;
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector;
import android.accessibilityservice.AccessibilityService;
import android.util.Log;
import android.view.accessibility.AccessibilityEvent;
import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.util.UnderuseExecutors;
import com.stardust.view.accessibility.AccessibilityDelegate;
import java.util.Set;
import java.util.concurrent.Executor;
import java.util.concurrent.Executors;
/**
* Created by Stardust on 2017/3/10.

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.layout_inspector;
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector;
import android.graphics.Rect;
import android.support.annotation.Keep;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.layout_inspector.view;
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view;
import android.content.Context;
import android.graphics.Canvas;
@@ -12,12 +12,10 @@ import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.View;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
import com.stardust.util.ViewUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
/**

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.layout_inspector.view;
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view;
import android.content.Context;
import android.graphics.Canvas;
@@ -14,7 +14,7 @@ import android.widget.ListView;
import android.widget.TextView;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
import com.stardust.util.ViewUtil;
import com.stardust.widget.LevelBeamView;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.layout_inspector.view;
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view;
import android.content.Context;
import android.os.Build;
@@ -13,9 +13,7 @@ import android.widget.FrameLayout;
import android.widget.ViewSwitcher;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.layout_inspector.LayoutInspector;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
/**
* Created by Stardust on 2017/3/10.

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.layout_inspector.view;
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view;
import android.content.Context;
import android.graphics.Color;
@@ -10,7 +10,7 @@ import android.widget.TextView;
import android.widget.Toast;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
import com.stardust.util.ClipboardUtil;
import java.lang.reflect.Field;

View File

@@ -0,0 +1,12 @@
package com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
/**
* Created by Stardust on 2017/3/10.
*/
public interface OnNodeInfoSelectListener {
void onNodeSelect(NodeInfo info);
}

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record;
package com.stardust.scriptdroid.external.floating_window.menu.record;
import java.util.Arrays;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.accessibility;
package com.stardust.scriptdroid.external.floating_window.menu.record.accessibility;
import android.accessibilityservice.AccessibilityService;
import android.os.Build;
@@ -8,9 +8,8 @@ import android.view.accessibility.AccessibilityNodeInfo;
import com.stardust.automator.UiObject;
import com.stardust.automator.simple_action.FilterAction;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
import com.stardust.util.SparseArrayEntries;
import com.stardust.view.accessibility.AccessibilityNodeInfoAllocator;
import com.stardust.view.accessibility.AccessibilityNodeInfoHelper;
import org.greenrobot.eventbus.EventBus;

View File

@@ -1,9 +1,9 @@
package com.stardust.scriptdroid.record.accessibility;
package com.stardust.scriptdroid.external.floating_window.menu.record.accessibility;
import android.accessibilityservice.AccessibilityService;
import android.view.accessibility.AccessibilityEvent;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.external.floating_window.menu.record.Recorder;
import com.stardust.view.accessibility.AccessibilityDelegate;
import java.util.Arrays;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
/**
* Created by Stardust on 2017/3/7.

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
import android.support.annotation.NonNull;
import android.text.TextUtils;
@@ -7,12 +7,9 @@ import android.widget.Toast;
import com.flurry.android.FlurryAgent;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.external.floating_window.menu.record.Recorder;
import com.stardust.util.MapEntries;
import org.greenrobot.eventbus.EventBus;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

View File

@@ -1,7 +1,7 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
import com.stardust.scriptdroid.autojs.api.Shell;
import com.stardust.scriptdroid.record.Recorder;
import com.stardust.scriptdroid.external.floating_window.menu.record.Recorder;
/**
* Created by Stardust on 2017/3/6.

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
import android.support.annotation.NonNull;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
import android.support.annotation.NonNull;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
import android.support.annotation.NonNull;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
import android.support.annotation.NonNull;

View File

@@ -1,4 +1,4 @@
package com.stardust.scriptdroid.record.inputevent;
package com.stardust.scriptdroid.external.floating_window.menu.record.inputevent;
/**
* Created by Stardust on 2017/3/16.

View File

@@ -7,10 +7,10 @@ import android.view.WindowManager;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;
import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.layout_inspector.view.LayoutBoundsView;
import com.stardust.scriptdroid.layout_inspector.view.NodeInfoView;
import com.stardust.scriptdroid.layout_inspector.view.OnNodeInfoSelectListener;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.LayoutBoundsView;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.NodeInfoView;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.OnNodeInfoSelectListener;
import com.stardust.util.MessageEvent;
/**

View File

@@ -7,10 +7,10 @@ import android.view.WindowManager;
import com.afollestad.materialdialogs.MaterialDialog;
import com.afollestad.materialdialogs.Theme;
import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.layout_inspector.view.LayoutHierarchyView;
import com.stardust.scriptdroid.layout_inspector.view.NodeInfoView;
import com.stardust.scriptdroid.layout_inspector.view.OnNodeInfoSelectListener;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.NodeInfo;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.LayoutHierarchyView;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.NodeInfoView;
import com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.OnNodeInfoSelectListener;
import com.stardust.util.MessageEvent;
/**

View File

@@ -40,8 +40,4 @@ public class ImportIntentActivity extends BaseActivity {
finish();
}
private void startMainActivity() {
finish();
}
}

View File

@@ -44,7 +44,11 @@ public class RunIntentActivity extends Activity {
source = new StringScriptSource(script);
} else if (path != null && new PathChecker(this).checkAndToastError(path)) {
ScriptSource fileScriptSource = new FileScriptSource(path);
source = new SequenceScriptSource(fileScriptSource.getName(), new StringScriptSource(script), fileScriptSource);
if (script != null) {
source = new SequenceScriptSource(fileScriptSource.getName(), new StringScriptSource(script), fileScriptSource);
} else {
source = fileScriptSource;
}
directoryPath = new File(path).getParent();
}
if (source != null) {

View File

@@ -1,12 +0,0 @@
package com.stardust.scriptdroid.layout_inspector.view;
import com.stardust.scriptdroid.layout_inspector.NodeInfo;
/**
* Created by Stardust on 2017/3/10.
*/
public interface OnNodeInfoSelectListener {
void onNodeSelect(NodeInfo info);
}

View File

@@ -0,0 +1,12 @@
package com.stardust.scriptdroid.sublime_plugin_client;
import com.google.gson.JsonObject;
/**
* Created by Stardust on 2017/5/11.
*/
public interface Handler {
boolean handle(JsonObject data);
}

View File

@@ -0,0 +1,32 @@
package com.stardust.scriptdroid.sublime_plugin_client;
import com.google.gson.JsonObject;
import java.util.HashMap;
import java.util.Map;
/**
* Created by Stardust on 2017/5/11.
*/
public class Router implements Handler {
private Map<String, Handler> mHandlerMap = new HashMap<>();
private String mKey;
public Router(String key) {
mKey = key;
}
public Router handler(String value, Handler handler) {
mHandlerMap.put(value, handler);
return this;
}
@Override
public boolean handle(JsonObject data) {
Handler handler = mHandlerMap.get(data.get(mKey).getAsString());
return handler != null && handler.handle(data);
}
}

View File

@@ -0,0 +1,102 @@
package com.stardust.scriptdroid.sublime_plugin_client;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import com.stardust.util.UiHandler;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
/**
* Created by Stardust on 2017/5/10.
*/
public class SublimePluginClient {
private Socket mSocket;
private Handler mResponseHandler;
private String host;
private int port;
private OutputStream mOutputStream;
private UiHandler mUiHandler;
public SublimePluginClient(UiHandler handler, String host, int port) {
this.host = host;
this.port = port;
mUiHandler = handler;
}
public void setResponseHandler(Handler handler) {
mResponseHandler = handler;
}
public void listen() {
if (mSocket != null) {
throw new IllegalStateException("Socket listening ");
}
new Thread(new Runnable() {
@Override
public void run() {
try {
mSocket = new Socket(host, port);
mSocket.setTcpNoDelay(true);
mUiHandler.toast("Connected");
mOutputStream = mSocket.getOutputStream();
startReadLoop(mSocket.getInputStream());
} catch (IOException e) {
e.printStackTrace();
} finally {
tryClose();
}
}
}).start();
}
private void tryClose() {
try {
close();
} catch (IOException e) {
e.printStackTrace();
}
}
public void send(JsonObject object) throws IOException {
if (mSocket == null) {
throw new IllegalStateException("Socket is not listening ");
}
mOutputStream.write(object.toString().getBytes());
mOutputStream.write("\n".getBytes());
mOutputStream.flush();
}
public void close() throws IOException {
if (mSocket != null) {
mSocket.close();
mSocket = null;
mOutputStream = null;
mUiHandler.toast("Disconnected");
}
}
private void startReadLoop(InputStream stream) throws IOException {
byte[] buffer = new byte[8192];
while (!Thread.currentThread().isInterrupted()) {
int len = stream.read(buffer);
if (len <= 0) {
return;
}
if (mResponseHandler != null) {
String str = new String(buffer, 0, len);
JsonElement jsonElement = new JsonParser().parse(str);
JsonObject jsonObject = jsonElement.getAsJsonObject();
mResponseHandler.handle(jsonObject);
}
}
}
}

View File

@@ -0,0 +1,54 @@
package com.stardust.scriptdroid.sublime_plugin_client;
import com.google.gson.JsonObject;
import com.stardust.scriptdroid.autojs.AutoJs;
import java.io.IOException;
/**
* Created by Stardust on 2017/5/11.
*/
public class SublimePluginClientManager {
private static SublimePluginClient client;
public static boolean isConnected() {
return client != null;
}
public static void disconnectIfNeeded() {
if (!isConnected())
return;
disconnect();
}
public static void disconnect() {
try {
client.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
client = null;
}
}
public static void connect(String host) {
client = new SublimePluginClient(AutoJs.getInstance().getUiHandler(), host, 1209);
client.setResponseHandler(new SublimeResponseHandler());
client.listen();
}
public static void log(String log) {
if (!isConnected())
return;
JsonObject object = new JsonObject();
object.addProperty("type", "log");
object.addProperty("log", log);
try {
client.send(object);
} catch (IOException e) {
e.printStackTrace();
}
}
}

View File

@@ -0,0 +1,85 @@
package com.stardust.scriptdroid.sublime_plugin_client;
import android.text.TextUtils;
import android.util.SparseArray;
import com.google.gson.JsonObject;
import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.script.StringScriptSource;
import com.stardust.pio.PFile;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.script.Scripts;
/**
* Created by Stardust on 2017/5/11.
*/
public class SublimeResponseHandler implements Handler {
private Router mRouter = new Router("type")
.handler("command", new Router("command")
.handler("run", new Handler() {
@Override
public boolean handle(JsonObject data) {
String script = data.get("script").getAsString();
String name = data.get("name").getAsString();
int viewId = data.get("view_id").getAsInt();
runScript(viewId, name, script);
return false;
}
})
.handler("stop", new Handler() {
@Override
public boolean handle(JsonObject data) {
int viewId = data.get("view_id").getAsInt();
stopScript(viewId);
return true;
}
})
.handler("rerun", new Handler() {
@Override
public boolean handle(JsonObject data) {
int viewId = data.get("view_id").getAsInt();
String script = data.get("script").getAsString();
String name = data.get("name").getAsString();
stopScript(viewId);
runScript(viewId, name, script);
return false;
}
})
.handler("stopAll", new Handler() {
@Override
public boolean handle(JsonObject data) {
AutoJs.getInstance().getScriptEngineService().stopAllAndToast();
return false;
}
}));
private SparseArray<ScriptExecution> mScriptExecutions = new SparseArray<>();
@Override
public boolean handle(JsonObject data) {
return mRouter.handle(data);
}
private void runScript(int viewId, String name, String script) {
if (TextUtils.isEmpty(name)) {
name = "[" + viewId + "]";
} else {
name = PFile.getNameWithoutExtension(name);
}
mScriptExecutions.put(viewId, Scripts.run(new StringScriptSource("<remote>:" + name, script)));
}
private void stopScript(int viewId) {
ScriptExecution execution = mScriptExecutions.get(viewId);
if (execution != null) {
execution.getEngine().forceStop();
mScriptExecutions.delete(viewId);
}
}
}

View File

@@ -7,9 +7,12 @@ package com.stardust.scriptdroid.tool;
import android.content.Intent;
import android.util.Log;
import android.view.WindowManager;
import android.widget.Toast;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.R;
import com.stardust.util.IntentUtil;
import java.io.PrintWriter;
import java.io.StringWriter;
@@ -26,6 +29,11 @@ public class CrashHandler implements UncaughtExceptionHandler {
}
public void uncaughtException(Thread thread, Throwable ex) {
if (causedByBadWindowToken(ex)) {
Toast.makeText(App.getApp(), R.string.text_no_floating_window_permission, Toast.LENGTH_SHORT).show();
IntentUtil.goToAppDetailSettings(App.getApp());
return;
}
try {
Log.e(TAG, "Uncaught Exception", ex);
if (crashTooManyTimes())
@@ -38,6 +46,16 @@ public class CrashHandler implements UncaughtExceptionHandler {
}
}
private static boolean causedByBadWindowToken(Throwable e) {
while (e != null) {
if (e instanceof WindowManager.BadTokenException) {
return true;
}
e = e.getCause();
}
return false;
}
private void startErrorReportActivity(String msg, String detail) {
Intent intent = new Intent(App.getApp(), this.mErrorReportClass);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

View File

@@ -0,0 +1,24 @@
package com.stardust.scriptdroid.tool;
import android.content.Context;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.text.format.Formatter;
import java.net.InetAddress;
import static android.content.Context.WIFI_SERVICE;
/**
* Created by Stardust on 2017/5/11.
*/
public class WifiTool {
public static String getWifiAddress(Context context) {
WifiManager wifiMgr = (WifiManager) context.getApplicationContext().getSystemService(WIFI_SERVICE);
WifiInfo wifiInfo = wifiMgr.getConnectionInfo();
int ip = wifiInfo.getIpAddress();
return Formatter.formatIpAddress(ip);
}
}

View File

@@ -10,6 +10,7 @@ import android.util.SparseArray;
import com.jraska.console.Console;
import com.stardust.autojs.runtime.api.AbstractConsole;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.sublime_plugin_client.SublimePluginClientManager;
import com.stardust.util.SparseArrayEntries;
import com.stardust.util.TextUtils;
@@ -48,12 +49,14 @@ public class JraskaConsole extends AbstractConsole {
public void println(int level, CharSequence charSequence) {
Console.write(getLevelSpannable(level, getTag(level)));
Console.writeLine(getLevelSpannable(level, charSequence));
SublimePluginClientManager.log(getTag(level) + charSequence.toString());
}
@Override
public void write(int level, CharSequence data) {
Console.write(getLevelSpannable(level, getTag(level)));
Console.write(getLevelSpannable(level, data));
SublimePluginClientManager.log(getTag(level) + data.toString());
}
private CharSequence getTag(int level) {

View File

@@ -16,6 +16,7 @@ import android.support.v4.view.ViewPager;
import android.support.v4.widget.DrawerLayout;
import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Gravity;
import android.view.View;
import android.widget.ImageView;
@@ -24,6 +25,7 @@ import android.widget.Toast;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
import com.google.gson.JsonObject;
import com.stardust.app.FragmentPagerAdapterBuilder;
import com.stardust.app.NotAskAgainDialog;
import com.stardust.app.OnActivityResultDelegate;
@@ -36,6 +38,8 @@ import com.stardust.scriptdroid.script.ScriptFile;
import com.stardust.scriptdroid.script.StorageScriptProvider;
import com.stardust.scriptdroid.script.sample.Sample;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.scriptdroid.sublime_plugin_client.SublimePluginClient;
import com.stardust.scriptdroid.sublime_plugin_client.SublimeResponseHandler;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.tool.DrawableSaver;
import com.stardust.scriptdroid.ui.BaseActivity;

View File

@@ -2,6 +2,7 @@ package com.stardust.scriptdroid.ui.main;
import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.Snackbar;
import android.support.v4.app.FragmentActivity;
@@ -10,13 +11,16 @@ import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.app.Fragment;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger;
import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService;
import com.stardust.scriptdroid.service.AccessibilityWatchDogService;
import com.stardust.scriptdroid.sublime_plugin_client.SublimePluginClientManager;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.tool.WifiTool;
import com.stardust.scriptdroid.ui.console.LogActivity;
import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
import com.stardust.util.UnderuseExecutors;
@@ -42,6 +46,7 @@ public class SlideMenuFragment extends Fragment {
}
private SwitchCompat mAccessibilityServiceSwitch, mFloatingWindowSwitch;
private SwitchCompat mDebugSwith;
private Executor mExecutor = UnderuseExecutors.getExecutor();
@Override
@@ -94,6 +99,7 @@ public class SlideMenuFragment extends Fragment {
private void setUpSwitchCompat() {
mAccessibilityServiceSwitch = $(R.id.sw_auto_operate_service);
mFloatingWindowSwitch = $(R.id.sw_floating_window);
mDebugSwith = $(R.id.sw_debug);
}
@@ -135,6 +141,27 @@ public class SlideMenuFragment extends Fragment {
mFloatingWindowSwitch.toggle();
}
@ViewBinding.Click(R.id.debug)
private void toggleDebugSwitch() {
mDebugSwith.toggle();
}
@ViewBinding.Check(R.id.sw_debug)
private void setDebugEnabled(boolean enabled) {
if (enabled && !SublimePluginClientManager.isConnected()) {
new MaterialDialog.Builder(getActivity())
.title("服务器地址")
.input("", WifiTool.getWifiAddress(getActivity()), new MaterialDialog.InputCallback() {
@Override
public void onInput(@NonNull MaterialDialog dialog, CharSequence input) {
SublimePluginClientManager.connect(input.toString());
}
})
.show();
} else if (!enabled) {
SublimePluginClientManager.disconnectIfNeeded();
}
}
@ViewBinding.Click(R.id.stop_all_running_scripts)
private void stopAllRunningScripts() {

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -19,13 +19,13 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.stardust.scriptdroid.layout_inspector.view.NodeInfoView
<com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.NodeInfoView
android:id="@+id/node_info"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#ffffff"/>
<com.stardust.scriptdroid.layout_inspector.view.LayoutHierarchyView
<com.stardust.scriptdroid.external.floating_window.menu.layout_inspector.view.LayoutHierarchyView
android:id="@+id/bounds_view"
android:layout_width="match_parent"
android:layout_height="wrap_content"

View File

@@ -116,6 +116,39 @@
</RelativeLayout>
<RelativeLayout
android:id="@+id/debug"
android:layout_width="match_parent"
android:layout_height="52dp"
android:background="?selectableItemBackground"
android:gravity="center_vertical">
<com.stardust.theme.widget.ThemeColorImageViewCompat
android:id="@+id/icon_debug"
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_alignParentLeft="true"
android:layout_margin="16dp"
android:src="@drawable/ic_debug"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_toRightOf="@id/icon_debug"
android:gravity="center"
android:text="@string/debug"
android:textColor="@android:color/primary_text_light"/>
<com.stardust.theme.widget.ThemeColorSwitch
android:id="@+id/sw_debug"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentEnd="true"
android:layout_centerVertical="true"
android:layout_marginRight="16dp"/>
</RelativeLayout>
<LinearLayout
android:id="@+id/stop_all_running_scripts"
android:layout_width="match_parent"

View File

@@ -178,6 +178,7 @@
<string name="text_again_and_again">又双</string>
<string name="text_again_and_again_again">又双叒</string>
<string name="text_again_and_again_again_again">又双叒叕</string>
<string name="debug">连接调试服务器</string>
<string-array name="record_control_keys">
<item></item>