From 08654b8f90fbe9e93b2614474157b8684848201f Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Tue, 9 May 2017 00:58:16 +0800 Subject: [PATCH] add console.rawInput, app.intent --- app/build.gradle | 2 +- .../java/com/stardust/NodeTest.java | 344 ++++++++++++++++++ .../androidTest/java/com/stardust/Test.java | 10 - app/src/main/AndroidManifest.xml | 2 +- app/src/main/assets/js/autojs_init.js | 4 - .../main/assets/sample/控制台/控制台示例.js | 8 + .../main/assets/sample/控制台/终端模拟器.js | 13 + .../{打开QQ谁赞过我.js => 批量删除空间留言.js} | 0 .../java/com/stardust/scriptdroid/App.java | 5 + .../autojs/api/BlockedMaterialDialog.java | 14 +- .../scriptdroid/autojs/api/Shell.java | 44 ++- .../layout_inspector/LayoutInspector.java | 3 + .../record/inputevent/InputEventRecorder.java | 2 +- .../scriptdroid/ui/console/ConsoleFloaty.java | 14 +- .../scriptdroid/ui/console/ConsoleView.java | 81 +++-- .../scriptdroid/ui/console/JraskaConsole.java | 2 +- ...{ConsoleActivity.java => LogActivity.java} | 2 +- .../ui/console/StardustConsole.java | 56 +++ .../ui/edit/ViewSampleActivity.java | 1 - .../edit/sidemenu/EditSideMenuFragment.java | 4 +- .../ui/main/SlideMenuFragment.java | 4 +- app/src/main/res/layout/activity_console.xml | 2 +- app/src/main/res/layout/console_view.xml | 60 ++- app/src/main/res/values/styles.xml | 4 + .../src/main/assets/javascript_engine_init.js | 17 +- autojs/src/main/assets/modules/app.js | 43 +++ .../stardust/autojs/ScriptEngineService.java | 1 + .../autojs/runtime/ScriptRuntime.java | 2 + .../autojs/runtime/api/UiSelector.java | 3 + .../java/com/stardust/automator/UiObject.java | 5 +- .../automator/UiObjectCollection.java | 1 + 31 files changed, 663 insertions(+), 90 deletions(-) create mode 100644 app/src/androidTest/java/com/stardust/NodeTest.java delete mode 100644 app/src/androidTest/java/com/stardust/Test.java create mode 100644 app/src/main/assets/sample/控制台/控制台示例.js create mode 100644 app/src/main/assets/sample/控制台/终端模拟器.js rename app/src/main/assets/sample/需要Root权限的自动操作/{打开QQ谁赞过我.js => 批量删除空间留言.js} (100%) rename app/src/main/java/com/stardust/scriptdroid/ui/console/{ConsoleActivity.java => LogActivity.java} (97%) create mode 100644 autojs/src/main/assets/modules/app.js diff --git a/app/build.gradle b/app/build.gradle index 8673b867..4d4e1fd4 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -107,7 +107,7 @@ dependencies { compile 'me.zhanghai.android.materialprogressbar:library:1.3.0' compile group: 'com.twofortyfouram', name: 'android-plugin-client-sdk-for-locale', version: '[4.0.2, 5.0[' compile 'com.android.volley:volley:1.0.0' - compile 'com.github.hyb1996:EnhancedFloaty:0.15' + compile 'com.github.hyb1996:EnhancedFloaty:0.16' compile 'com.flurry.android:analytics:7.0.0@aar' compile 'com.pushtorefresh.storio:sqlite:1.12.3' compile 'com.android.support:multidex:1.0.1' diff --git a/app/src/androidTest/java/com/stardust/NodeTest.java b/app/src/androidTest/java/com/stardust/NodeTest.java new file mode 100644 index 00000000..291ba1f2 --- /dev/null +++ b/app/src/androidTest/java/com/stardust/NodeTest.java @@ -0,0 +1,344 @@ +package com.stardust; + +/** + * Created by Stardust on 2017/5/8. + */ + +// Copyright (c) 2014 Tom Zhou + + +import java.nio.ByteBuffer; +import java.util.ArrayList; +import java.util.Hashtable; +import java.util.List; +import java.util.Map; + +import android.support.test.filters.SmallTest; +import android.util.Log; + +import com.iwebpp.node.EventEmitter.Listener; +import com.iwebpp.node.NodeContext; +import com.iwebpp.node.NodeContext.TimeoutListener; +import com.iwebpp.node.http.ClientRequest; +import com.iwebpp.node.http.ClientRequest.upgradeListener; +import com.iwebpp.node.http.HttpServer; +import com.iwebpp.node.http.HttpServer.clientErrorListener; +import com.iwebpp.node.http.http; +import com.iwebpp.node.http.IncomingMessage; +import com.iwebpp.node.http.ReqOptions; +import com.iwebpp.node.http.ServerResponse; +import com.iwebpp.node.net.AbstractSocket; +import com.iwebpp.node.stream.Writable.WriteCB; + +import org.junit.*; + +import static org.junit.Assert.fail; + +@SmallTest +public final class NodeTest { + private static final String TAG = "HttpTest"; + private NodeContext ctx; + + @Test + public void testListening() throws Exception { + HttpServer srv; + final int port = 6188; + srv = new HttpServer(ctx); + + srv.listen(port, "127.0.0.1", 4000, new HttpServer.ListeningCallback() { + + @Override + public void onListening() throws Exception { + Log.d(TAG, "http server listening on " + port); + } + }); + Thread.sleep(8000); + } + + @org.junit.Test + public void testConnection() throws Exception { + final int port = 6288; + final HttpServer srv = new HttpServer(ctx, new HttpServer.requestListener() { + + @Override + public void onRequest(IncomingMessage req, ServerResponse res) + throws Exception { + Log.d(TAG, "got reqeust, headers: " + req.headers()); + + Map> headers = new Hashtable>(); + headers.put("content-type", new ArrayList()); + headers.get("content-type").add("text/plain"); + ///headers.put("te", new LinkedList()); + ///headers.get("te").add("chunk"); + + res.writeHead(200, headers); + ///for (int i = 0; i < 10; i ++) + res.write("Hello Tom", "utf-8", new WriteCB() { + + @Override + public void writeDone(String error) throws Exception { + Log.d(TAG, "http res.write done"); + fail("http res.write done"); + } + + }); + + res.end(null, null, null); + ; + + } + + }); + + srv.onClientError(new clientErrorListener() { + + @Override + public void onClientError(String exception, AbstractSocket socket) throws Exception { + Log.e(TAG, "client error: " + exception + "@" + socket); + fail("client error: " + exception + "@" + socket); + } + + }); + + srv.listen(port, "0.0.0.0", 10, new HttpServer.ListeningCallback() { + + @Override + public void onListening() throws Exception { + Log.d(TAG, "http server listening on " + port); + } + }); + } + + @org.junit.Test + public void testUpgrade() throws Exception { + final String host = "192.188.1.100"; + final int port = 6668; + + // client + ReqOptions ropt = new ReqOptions(); + ropt.hostname = host; + ropt.port = port; + ropt.method = "GET"; + ropt.path = "/"; + + ropt.headers.put("Connection", new ArrayList()); + ropt.headers.get("Connection").add("Upgrade"); + + ropt.headers.put("Upgrade", new ArrayList()); + ropt.headers.get("Upgrade").add("websocket"); + + ropt.headers.put("Host", new ArrayList()); + ropt.headers.get("Host").add("192.188.1.100:6668"); + + ropt.headers.put("Origin", new ArrayList()); + ropt.headers.get("Origin").add("http://192.188.1.100:6668"); + + ropt.headers.put("Sec-WebSocket-Version", new ArrayList()); + ropt.headers.get("Sec-WebSocket-Version").add("13"); + + ropt.headers.put("Sec-WebSocket-Key", new ArrayList()); + ropt.headers.get("Sec-WebSocket-Key").add("MTMtVHVlIE9jdCAwNyAxMzozNzoyMiBHTVQrMDg6MDAgMjAxNA=="); + + ClientRequest req = http.request(ctx, ropt, new ClientRequest.responseListener() { + + @Override + public void onResponse(IncomingMessage res) throws Exception { + Log.d(TAG, "STATUS: " + res.statusCode()); + Log.d(TAG, "HEADERS: " + res.getHeaders()); + + res.setEncoding("utf-8"); + res.on("data", new Listener() { + + @Override + public void onEvent(Object chunk) throws Exception { + Log.d(TAG, "BODY: " + chunk); + + } + + }); + } + + }); + + req.onceUpgrade(new upgradeListener() { + + @Override + public void onUpgrade(IncomingMessage res, + AbstractSocket socket, ByteBuffer head) + throws Exception { + Log.d(TAG, "got upgrade: " + res.toString()); + } + + }); + + req.on("error", new Listener() { + + @Override + public void onEvent(Object e) throws Exception { + Log.d(TAG, "problem with request: " + e); + fail("problem with request: " + e); + } + + }); + + req.end(null, null, null); + + } + + @org.junit.Test + public void testConnect() throws Exception { + final String host = "192.188.1.100"; + final int port = 51680; + + // client + ReqOptions ropt = new ReqOptions(); + ropt.hostname = host; + ropt.port = port; + ropt.method = "PUT"; + ropt.path = "/"; + ///ropt.keepAlive = true; + ///ropt.keepAliveMsecs = 10000; + + ClientRequest req = http.request(ctx, ropt, new ClientRequest.responseListener() { + + @Override + public void onResponse(IncomingMessage res) throws Exception { + Log.d(TAG, "STATUS: " + res.statusCode()); + Log.d(TAG, "HEADERS: " + res.getHeaders()); + + res.setEncoding("utf-8"); + res.on("data", new Listener() { + + @Override + public void onEvent(Object chunk) throws Exception { + Log.d(TAG, "BODY: " + chunk); + + } + + }); + } + + }); + + req.on("error", new Listener() { + + @Override + public void onEvent(Object e) throws Exception { + Log.d(TAG, "problem with request: " + e); + fail("problem with request: " + e); + } + + }); + + // write data to request body + for (int i = 0; i < 8; i++) + req.write("data" + i + "\n", "utf-8", null); + + req.end(null, null, null); + + } + + @org.junit.Test + public void testConnectPair() throws Exception { + final int port = 6688; + + final HttpServer srv = http.createServer(ctx, new HttpServer.requestListener() { + + @Override + public void onRequest(IncomingMessage req, ServerResponse res) + throws Exception { + Log.d(TAG, "got reqeust, headers: " + req.headers()); + + Map> headers = new Hashtable>(); + headers.put("content-type", new ArrayList()); + headers.get("content-type").add("text/plain"); + ///headers.put("te", new ArrayList()); + ///headers.get("te").add("chunk"); + + res.writeHead(200, headers); + res.write("Hello Tom", "utf-8", new WriteCB() { + + @Override + public void writeDone(String error) throws Exception { + Log.d(TAG, "http res.write done"); + fail("http res.write done"); + } + + }); + + res.end(null, null, null); + + } + + }); + + srv.listen(port, "0.0.0.0", 1, new HttpServer.ListeningCallback() { + + @Override + public void onListening() throws Exception { + Log.d(TAG, "http server listening on " + port); + } + + }); + + // client + final ReqOptions ropt = new ReqOptions(); + ropt.hostname = "localhost"; // IP address instead localhost + ropt.port = port; + ropt.method = "GET"; + ropt.path = "/"; + + // defer 2s to connect + ctx.setTimeout(new TimeoutListener() { + + @Override + public void onTimeout() throws Exception { + + ClientRequest req = http.request(ctx, ropt, new ClientRequest.responseListener() { + + @Override + public void onResponse(IncomingMessage res) throws Exception { + Log.d(TAG, "STATUS: " + res.statusCode()); + Log.d(TAG, "HEADERS: " + res.getHeaders()); + + res.setEncoding("utf-8"); + + res.on("data", new Listener() { + + @Override + public void onEvent(Object chunk) throws Exception { + Log.d(TAG, "BODY: " + chunk); + + } + + }); + } + + }); + + req.on("error", new Listener() { + + @Override + public void onEvent(Object e) throws Exception { + Log.d(TAG, "problem with request: " + e); + fail("problem with request: " + e); + } + + }); + + // write data to request body + ///req.write("data\n", "utf-8", null); + ///req.write("data\n", "utf-8", null); + req.end(null, null, null); + } + + }, 2000); + + } + + + @Before + public void setUp() throws Exception { + this.ctx = new NodeContext(); + } +} \ No newline at end of file diff --git a/app/src/androidTest/java/com/stardust/Test.java b/app/src/androidTest/java/com/stardust/Test.java deleted file mode 100644 index 51c25330..00000000 --- a/app/src/androidTest/java/com/stardust/Test.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.stardust; - -/** - * Created by Stardust on 2017/3/8. - */ - -public class Test { - - -} diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index ad5ec37c..d922f1c7 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -76,7 +76,7 @@ - + diff --git a/app/src/main/assets/js/autojs_init.js b/app/src/main/assets/js/autojs_init.js index 11d8aca7..4133a2f9 100644 --- a/app/src/main/assets/js/autojs_init.js +++ b/app/src/main/assets/js/autojs_init.js @@ -45,10 +45,6 @@ var rawInput = function(title, prefill){ return dialogs.rawInput(title, prefill); } -var input = function(title, prefill){ - return dialogs.input(title, prefill); -} - var alert = function(title, prefill){ dialogs.alert(title, prefill); } diff --git a/app/src/main/assets/sample/控制台/控制台示例.js b/app/src/main/assets/sample/控制台/控制台示例.js new file mode 100644 index 00000000..6af4d3e4 --- /dev/null +++ b/app/src/main/assets/sample/控制台/控制台示例.js @@ -0,0 +1,8 @@ +//显示控制台 +console.show(); + +console.verbose("这是灰色"); +console.log("这是黑色"); +console.info("这是红色"); +console.warn("这是蓝色"); +console.error("这是绿色=_="); diff --git a/app/src/main/assets/sample/控制台/终端模拟器.js b/app/src/main/assets/sample/控制台/终端模拟器.js new file mode 100644 index 00000000..951fc3a2 --- /dev/null +++ b/app/src/main/assets/sample/控制台/终端模拟器.js @@ -0,0 +1,13 @@ +var sh = new Shell(); +sh.setCallback({ + onNewLine: function(str){ + console.log(str); + } +}) +console.show(); +console.info("请输入要运行命令:"); +do { + var cmd = console.rawInput(); + sh.exec(cmd); +}while(cmd != "exit"); +sh.exit(); \ No newline at end of file diff --git a/app/src/main/assets/sample/需要Root权限的自动操作/打开QQ谁赞过我.js b/app/src/main/assets/sample/需要Root权限的自动操作/批量删除空间留言.js similarity index 100% rename from app/src/main/assets/sample/需要Root权限的自动操作/打开QQ谁赞过我.js rename to app/src/main/assets/sample/需要Root权限的自动操作/批量删除空间留言.js diff --git a/app/src/main/java/com/stardust/scriptdroid/App.java b/app/src/main/java/com/stardust/scriptdroid/App.java index 13dff026..2dfedee5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/App.java +++ b/app/src/main/java/com/stardust/scriptdroid/App.java @@ -6,7 +6,12 @@ import android.content.IntentFilter; import android.os.Bundle; import android.support.annotation.Keep; import android.support.multidex.MultiDexApplication; +import android.util.Log; +import com.iwebpp.node.NodeContext; +import com.iwebpp.node.http.ClientRequest; +import com.iwebpp.node.http.IncomingMessage; +import com.iwebpp.node.http.http; import com.squareup.leakcanary.LeakCanary; import com.stardust.app.SimpleActivityLifecycleCallbacks; import com.stardust.app.VolumeChangeObserver; diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java b/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java index bc14aaf7..31e919a5 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/api/BlockedMaterialDialog.java @@ -2,6 +2,7 @@ package com.stardust.scriptdroid.autojs.api; import android.app.Activity; import android.content.Context; +import android.content.ContextWrapper; import android.content.DialogInterface; import android.support.annotation.NonNull; import android.support.annotation.Nullable; @@ -24,12 +25,23 @@ public class BlockedMaterialDialog extends MaterialDialog { @Override public void show() { - if (!(getContext() instanceof Activity)) { + if (!isActivityContext(getContext())) { getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); } super.show(); } + private boolean isActivityContext(Context context) { + if (context == null) + return false; + if (context instanceof Activity) + return true; + if (context instanceof ContextWrapper) { + return isActivityContext(((ContextWrapper) context).getBaseContext()); + } + return false; + } + public static class Builder extends MaterialDialog.Builder { diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/api/Shell.java b/app/src/main/java/com/stardust/scriptdroid/autojs/api/Shell.java index c36f0757..42b5300d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/autojs/api/Shell.java +++ b/app/src/main/java/com/stardust/scriptdroid/autojs/api/Shell.java @@ -11,6 +11,7 @@ import com.stardust.lang.ThreadCompat; import com.stardust.pio.UncheckedIOException; import com.stardust.scriptdroid.App; import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.tool.UpdateChecker; import java.io.BufferedReader; import java.io.IOException; @@ -30,13 +31,39 @@ import jackpal.androidterm.util.TermSettings; public class Shell extends AbstractShell implements AutoCloseable { public interface Callback { - void onNewLine(String str); + + void onOutput(String str); + + void onNewLine(String line); void onInitialized(); void onInterrupted(InterruptedException e); } + public static class SimpleCallback implements Callback { + + @Override + public void onOutput(String str) { + + } + + @Override + public void onNewLine(String str) { + + } + + @Override + public void onInitialized() { + + } + + @Override + public void onInterrupted(InterruptedException e) { + + } + } + private static final String TAG = "Shell"; private TermSession mTermSession; @@ -191,20 +218,19 @@ public class Shell extends AbstractShell implements AutoCloseable { private void onNewLine(String line) { Log.d(TAG, line); - if (mInitialized) { - if (mCallback != null) { - mCallback.onNewLine(line); - } - } else { + if (!mInitialized) { if (isRoot() && line.endsWith(" $ su")) { notifyInitialized(); return; } - if (!isRoot() && line.endsWith(" $ ")) { + if (!isRoot() && line.endsWith(" $ sh")) { notifyInitialized(); return; } } + if (mCallback != null) { + mCallback.onNewLine(line); + } if (mWaitingExit && line.endsWith(" exit")) { notifyExit(); } @@ -214,7 +240,11 @@ public class Shell extends AbstractShell implements AutoCloseable { @Override protected void processInput(byte[] data, int offset, int count) { try { + if (mCallback != null) { + mCallback.onOutput(new String(data, offset, count)); + } mOutputStream.write(data, offset, count); + } catch (IOException e) { throw new UncheckedIOException(e); } diff --git a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java index f1e64b2f..44b7e1c7 100644 --- a/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java +++ b/app/src/main/java/com/stardust/scriptdroid/layout_inspector/LayoutInspector.java @@ -15,8 +15,11 @@ import java.util.concurrent.Executors; /** * Created by Stardust on 2017/3/10. + * */ +// TODO: 2017/5/8 + public class LayoutInspector { private volatile NodeInfo mCapture; diff --git a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java index 51fa9bad..ff74118f 100644 --- a/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java +++ b/app/src/main/java/com/stardust/scriptdroid/record/inputevent/InputEventRecorder.java @@ -22,7 +22,7 @@ public class InputEventRecorder extends Recorder.AbstractRecorder { public void listen() { mShell = new Shell(true); - mShell.setCallback(new Shell.Callback() { + mShell.setCallback(new Shell.SimpleCallback() { @Override public void onNewLine(String str) { if (mShell.isInitialized()) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleFloaty.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleFloaty.java index fc1428bc..4e26dd0d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleFloaty.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleFloaty.java @@ -55,9 +55,8 @@ public class ConsoleFloaty extends ResizableExpandableFloaty.AbstractResizableEx public View inflateExpandedView(FloatyService service, ResizableExpandableFloatyWindow window) { ensureContextWrapper(service); View view = View.inflate(mContextWrapper, R.layout.floating_console_expand, null); - ((ConsoleView) view.findViewById(R.id.console)).setConsole(mConsole); setListeners(view, window); - initConsoleTitle(view); + setUpConsole(view, window); setInitialMeasure(view); return view; } @@ -79,6 +78,17 @@ public class ConsoleFloaty extends ResizableExpandableFloaty.AbstractResizableEx } private void setListeners(final View view, final ResizableExpandableFloatyWindow window) { + setWindowOperationIconListeners(view, window); + } + + private void setUpConsole(View view, ResizableExpandableFloatyWindow window) { + ConsoleView consoleView = (ConsoleView) view.findViewById(R.id.console); + consoleView.setConsole(mConsole); + consoleView.setWindow(window); + initConsoleTitle(view); + } + + private void setWindowOperationIconListeners(View view, final ResizableExpandableFloatyWindow window) { view.findViewById(R.id.close).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java index ba0e9a06..ad9ea2e6 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleView.java @@ -1,9 +1,7 @@ package com.stardust.scriptdroid.ui.console; import android.content.Context; -import android.support.annotation.IntDef; import android.support.annotation.Nullable; -import android.support.v7.widget.AppCompatTextView; import android.text.Spannable; import android.text.SpannableString; import android.text.Spanned; @@ -13,26 +11,22 @@ import android.util.AttributeSet; import android.util.Log; import android.util.SparseArray; import android.view.View; -import android.view.WindowManager; -import android.view.inputmethod.InputMethodManager; +import android.widget.Button; import android.widget.EditText; +import android.widget.FrameLayout; import android.widget.LinearLayout; +import android.widget.ScrollView; import android.widget.TextView; +import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.scriptdroid.R; -import com.stardust.util.MapEntries; import com.stardust.util.SparseArrayEntries; -import java.io.Closeable; -import java.io.InputStream; -import java.util.HashMap; -import java.util.Map; - /** * Created by Stardust on 2017/5/2. */ -public class ConsoleView extends LinearLayout implements StardustConsole.LogListener { +public class ConsoleView extends FrameLayout implements StardustConsole.LogListener { private static final SparseArray COLORS = new SparseArrayEntries() .entry(Log.VERBOSE, 0xdfc0c0c0) @@ -46,6 +40,9 @@ public class ConsoleView extends LinearLayout implements StardustConsole.LogList private StardustConsole mConsole; private TextView mTextView; private EditText mEditText; + private ResizableExpandableFloatyWindow mWindow; + private LinearLayout mInputContainer; + private ScrollView mContentContainer; public ConsoleView(Context context) { super(context); @@ -64,26 +61,43 @@ public class ConsoleView extends LinearLayout implements StardustConsole.LogList private void init() { inflate(getContext(), R.layout.console_view, this); - mTextView = (TextView) findViewById(R.id.textView); + mTextView = (TextView) findViewById(R.id.content); + mTextView.setMovementMethod(new ScrollingMovementMethod()); + mContentContainer = (ScrollView) findViewById(R.id.content_container); + initEditText(); + initSubmitButton(); } - private void initEditText() { - //mEditText = (EditText) findViewById(R.id.ediText); - mEditText.setFocusableInTouchMode(true); - mTextView.setMovementMethod(new ScrollingMovementMethod()); - setOnClickListener(new OnClickListener() { + private void initSubmitButton() { + final Button submit = (Button) findViewById(R.id.submit); + submit.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { - mEditText.requestFocus(); - InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE); - imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0); + CharSequence input = mEditText.getText(); + submitInput(input); } }); } + private void submitInput(CharSequence input) { + if (android.text.TextUtils.isEmpty(input)) { + return; + } + if (mConsole.submitInput(input)) { + mEditText.setText(""); + mEditText.requestFocus(); + } + } + + private void initEditText() { + mEditText = (EditText) findViewById(R.id.input); + mEditText.setFocusableInTouchMode(true); + mInputContainer = (LinearLayout) findViewById(R.id.input_container); + } + public void setConsole(StardustConsole console) { mConsole = console; - mConsole.setLogListener(this); + mConsole.setConsoleView(this); } @Override @@ -99,20 +113,12 @@ public class ConsoleView extends LinearLayout implements StardustConsole.LogList @Override public void run() { mTextView.append(spannable); + mContentContainer.fullScroll(View.FOCUS_DOWN); } }); } - private void scrollToBottom() { - mTextView.post(new Runnable() { - @Override - public void run() { - mTextView.scrollTo(0, mTextView.getLayout().getLineTop(mTextView.getLineCount())); - } - }); - } - private Spannable buildColorSpannable(CharSequence log, int color) { Spannable spannable = new SpannableString(log); spannable.setSpan(new ForegroundColorSpan(color), 0, log.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); @@ -144,4 +150,19 @@ public class ConsoleView extends LinearLayout implements StardustConsole.LogList } } } + + public void setWindow(ResizableExpandableFloatyWindow window) { + mWindow = window; + } + + public void showEditText() { + post(new Runnable() { + @Override + public void run() { + mWindow.requestWindowFocus(); + mInputContainer.setVisibility(VISIBLE); + mEditText.requestFocus(); + } + }); + } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java index 257309b9..2ffce35d 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java @@ -67,7 +67,7 @@ public class JraskaConsole extends AbstractConsole { @Override public void show() { - App.getApp().startActivity(new Intent(App.getApp(), ConsoleActivity.class) + App.getApp().startActivity(new Intent(App.getApp(), LogActivity.class) .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java similarity index 97% rename from app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java rename to app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java index b9813ecc..728e05cf 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/ConsoleActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java @@ -17,7 +17,7 @@ import com.stardust.scriptdroid.R; * Created by Stardust on 2017/2/12. */ -public class ConsoleActivity extends BaseActivity { +public class LogActivity extends BaseActivity { @Override protected void onCreate(@Nullable Bundle savedInstanceState) { diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java index 236bbdf5..3cb659a3 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/console/StardustConsole.java @@ -2,18 +2,24 @@ package com.stardust.scriptdroid.ui.console; import android.content.Context; import android.content.Intent; +import android.support.annotation.NonNull; import android.view.WindowManager; +import com.stardust.autojs.runtime.ScriptInterface; +import com.stardust.autojs.runtime.ScriptInterruptedException; import com.stardust.autojs.runtime.api.AbstractConsole; import com.stardust.autojs.runtime.api.Console; import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.autojs.api.VolatileBox; import com.stardust.util.UiHandler; import java.util.ArrayList; import java.util.List; +import java.util.concurrent.ArrayBlockingQueue; +import java.util.concurrent.BlockingQueue; /** * Created by Stardust on 2017/5/2. @@ -44,6 +50,10 @@ public class StardustConsole extends AbstractConsole { private ConsoleFloaty mConsoleFloaty; private LogListener mLogListener; private UiHandler mUiHandler; + //private volatile VolatileBox mInput = new VolatileBox<>(""); + private BlockingQueue mInput = new ArrayBlockingQueue<>(1); + private ConsoleView mConsoleView; + private volatile boolean mShown = false; public StardustConsole(UiHandler uiHandler) { mUiHandler = uiHandler; @@ -51,6 +61,14 @@ public class StardustConsole extends AbstractConsole { mFloatyWindow = new ResizableExpandableFloatyWindow(mConsoleFloaty); } + public void setConsoleView(ConsoleView consoleView) { + mConsoleView = consoleView; + setLogListener(consoleView); + synchronized (this) { + this.notify(); + } + } + public void setLogListener(LogListener logListener) { mLogListener = logListener; } @@ -92,6 +110,7 @@ public class StardustConsole extends AbstractConsole { } } }); + mShown = true; } private void startFloatyService() { @@ -106,6 +125,43 @@ public class StardustConsole extends AbstractConsole { } catch (IllegalArgumentException ignored) { } + mShown = false; + } + + @ScriptInterface + public String rawInput() { + if (mConsoleView == null) { + if (!mShown) { + show(); + } + waitConsoleView(); + } + mConsoleView.showEditText(); + try { + return mInput.take(); + } catch (InterruptedException e) { + throw new ScriptInterruptedException(); + } + } + + private void waitConsoleView() { + synchronized (this) { + try { + this.wait(); + } catch (InterruptedException e) { + throw new ScriptInterruptedException(); + } + } + } + + @ScriptInterface + public String rawInput(Object data, Object... param) { + log(data, param); + return rawInput(); + } + + boolean submitInput(@NonNull CharSequence input) { + return mInput.offer(input.toString()); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java index 46e26667..c456ce6e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/ViewSampleActivity.java @@ -22,7 +22,6 @@ import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.script.sample.Sample; import com.stardust.scriptdroid.ui.BaseActivity; -import com.stardust.scriptdroid.ui.console.ConsoleActivity; import com.stardust.scriptdroid.ui.edit.editor920.Editor920Activity; import com.stardust.scriptdroid.ui.edit.editor920.Editor920Utils; import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java index da9caea3..30ae5468 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/sidemenu/EditSideMenuFragment.java @@ -14,7 +14,7 @@ import com.stardust.scriptdroid.external.floating_window.FloatingWindowManger; import com.stardust.scriptdroid.external.floating_window.menu.HoverMenuService; import com.stardust.view.ViewBinding; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.ui.console.ConsoleActivity; +import com.stardust.scriptdroid.ui.console.LogActivity; import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; import com.stardust.view.ViewBinder; @@ -92,7 +92,7 @@ public class EditSideMenuFragment extends Fragment { @ViewBinding.Click(R.id.console) private void startConsoleActivity() { - startActivity(new Intent(getContext(), ConsoleActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + startActivity(new Intent(getContext(), LogActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } @ViewBinding.Check(R.id.sw_floating_window) diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java index a41c42a2..53aa6207 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/SlideMenuFragment.java @@ -17,7 +17,7 @@ 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.tool.AccessibilityServiceTool; -import com.stardust.scriptdroid.ui.console.ConsoleActivity; +import com.stardust.scriptdroid.ui.console.LogActivity; import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; import com.stardust.util.UnderuseExecutors; import com.stardust.view.ViewBinder; @@ -99,7 +99,7 @@ public class SlideMenuFragment extends Fragment { @ViewBinding.Click(R.id.console) private void startConsoleActivity() { - startActivity(new Intent(getContext(), ConsoleActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + startActivity(new Intent(getContext(), LogActivity.class).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); } @ViewBinding.Click(R.id.syntax_and_api) diff --git a/app/src/main/res/layout/activity_console.xml b/app/src/main/res/layout/activity_console.xml index 7ba1cab7..05162188 100644 --- a/app/src/main/res/layout/activity_console.xml +++ b/app/src/main/res/layout/activity_console.xml @@ -22,7 +22,7 @@ diff --git a/app/src/main/res/layout/console_view.xml b/app/src/main/res/layout/console_view.xml index ba164bb5..7ada24ae 100644 --- a/app/src/main/res/layout/console_view.xml +++ b/app/src/main/res/layout/console_view.xml @@ -1,16 +1,52 @@ - + - + android:layout_height="0dp" + android:layout_weight="1"> - \ No newline at end of file + + + + + + + +