From 38740657b8e6b712cacd16f4144ffa03b3b0efd0 Mon Sep 17 00:00:00 2001
From: hyb1996 <946994919@qq.com>
Date: Sun, 22 Oct 2017 18:33:12 +0800
Subject: [PATCH] fix: console lagged with too many logs
---
app/build.gradle | 4 -
app/src/main/AndroidManifest.xml | 1 -
.../stardust/scriptdroid/autojs/AutoJs.java | 8 +-
.../network/download/DownloadManager.java | 4 +-
.../scriptdroid/ui/console/JraskaConsole.java | 94 ------------
.../scriptdroid/ui/console/LogActivity.java | 42 ------
.../scriptdroid/ui/console/LogView.java | 41 ------
.../scriptdroid/ui/floating/CircularMenu.java | 2 +
.../scriptdroid/ui/main/MainActivity.java | 8 +-
.../ui/main/task/TaskManagerFragment.java | 61 +++-----
app/src/main/res/layout/activity_console.xml | 2 +-
.../main/res/layout/fragment_task_manager.xml | 14 +-
.../autojs/runtime/api}/NoOpConsole.java | 2 +-
.../autojs/runtime/console/ConsoleView.java | 138 +++++++++++-------
.../console/GlobalStardustConsole.java | 61 ++++++++
.../runtime/console/StardustConsole.java | 35 ++++-
autojs/src/main/res/layout/console_view.xml | 17 +--
.../src/main/res/layout/console_view_item.xml | 7 +
.../com/stardust/auojs/inrt/rt/AutoJs.java | 1 +
19 files changed, 227 insertions(+), 315 deletions(-)
delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java
delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java
delete mode 100644 app/src/main/java/com/stardust/scriptdroid/ui/console/LogView.java
rename {inrt/src/main/java/com/stardust/auojs/inrt/rt => autojs/src/main/java/com/stardust/autojs/runtime/api}/NoOpConsole.java (96%)
create mode 100644 autojs/src/main/java/com/stardust/autojs/runtime/console/GlobalStardustConsole.java
create mode 100644 autojs/src/main/res/layout/console_view_item.xml
diff --git a/app/build.gradle b/app/build.gradle
index 60416bd3..8c368da5 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -108,8 +108,6 @@ dependencies {
compile 'com.github.atlassian:commonmark-java:commonmark-parent-0.9.0'
// AlipayZeroSdk
compile 'moe.feng:AlipayZeroSdk:1.1'
- // Console
- compile 'com.jraska:console:0.4.3'
// Android issue reporter (a github issue reporter)
compile('com.heinrichreimersoftware:android-issue-reporter:1.3.1', {
exclude group: 'com.afollestad.material-dialogs'
@@ -142,8 +140,6 @@ dependencies {
// Tasker Plugin
compile 'com.twofortyfouram:android-plugin-client-sdk-for-locale:[4.0.2, 5.0['
compile 'com.flurry.android:analytics:7.0.0@aar'
- compile 'com.pushtorefresh.storio:sqlite:1.12.3'
- // 920 Text Editors
compile('com.afollestad.material-dialogs:commons:0.9.2.3', {
exclude group: 'com.android.support'
})
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 3a7457a1..92fa3a42 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -77,7 +77,6 @@
-
diff --git a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java
index 78df8d0a..0f6a2320 100644
--- a/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java
+++ b/app/src/main/java/com/stardust/scriptdroid/autojs/AutoJs.java
@@ -17,6 +17,8 @@ import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
import com.stardust.autojs.runtime.ScriptRuntime;
+import com.stardust.autojs.runtime.api.NoOpConsole;
+import com.stardust.autojs.runtime.console.GlobalStardustConsole;
import com.stardust.autojs.runtime.exception.ScriptException;
import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils;
@@ -38,7 +40,6 @@ import com.stardust.view.accessibility.AccessibilityInfoProvider;
import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder;
import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
-import com.stardust.scriptdroid.ui.console.JraskaConsole;
import com.stardust.view.accessibility.LayoutInspector;
import com.stardust.view.accessibility.NotificationListener;
@@ -76,7 +77,7 @@ public class AutoJs {
mContext = context;
mUiHandler = new UiHandler(context);
mAppUtils = new AppUtils(context);
- mGlobalConsole = new JraskaConsole();
+ mGlobalConsole = new GlobalStardustConsole(mUiHandler);
mNotificationObserver = new NotificationListener.Observer(context);
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
mScriptEngineService = buildScriptEngineService();
@@ -169,6 +170,9 @@ public class AutoJs {
return mLayoutInspector;
}
+ public Console getGlobalConsole() {
+ return mGlobalConsole;
+ }
public ScriptEngineService getScriptEngineService() {
return mScriptEngineService;
diff --git a/app/src/main/java/com/stardust/scriptdroid/network/download/DownloadManager.java b/app/src/main/java/com/stardust/scriptdroid/network/download/DownloadManager.java
index 777a70ec..118a9f5b 100644
--- a/app/src/main/java/com/stardust/scriptdroid/network/download/DownloadManager.java
+++ b/app/src/main/java/com/stardust/scriptdroid/network/download/DownloadManager.java
@@ -3,9 +3,11 @@ package com.stardust.scriptdroid.network.download;
import android.content.Context;
import java.io.File;
+import java.net.URLDecoder;
import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject;
+import retrofit2.http.Url;
import zlc.season.rxdownload3.RxDownload;
import zlc.season.rxdownload3.core.Failed;
import zlc.season.rxdownload3.core.Mission;
@@ -39,7 +41,7 @@ public class DownloadManager {
if (i < 0) {
i = url.lastIndexOf('/');
}
- return url.substring(i + 1);
+ return URLDecoder.decode(url.substring(i + 1));
}
public Observable download(String url, String path) {
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
deleted file mode 100644
index 8d260660..00000000
--- a/app/src/main/java/com/stardust/scriptdroid/ui/console/JraskaConsole.java
+++ /dev/null
@@ -1,94 +0,0 @@
-package com.stardust.scriptdroid.ui.console;
-
-import android.content.Intent;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
-import android.util.Log;
-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.SublimePluginService;
-import com.stardust.util.SparseArrayEntries;
-import com.stardust.util.TextUtils;
-
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-
-/**
- * Created by Stardust on 2017/4/2.
- */
-
-public class JraskaConsole extends AbstractConsole {
-
-
- private static final SparseArray COLORS = new SparseArrayEntries()
- .entry(Log.VERBOSE, 0xff909090)
- .entry(Log.DEBUG, 0xdf000000)
- .entry(Log.INFO, 0xdf4caf50)
- .entry(Log.WARN, 0xff2196f3)
- .entry(Log.ERROR, 0xffff534e)
- .entry(Log.ASSERT, 0xffff534e)
- .sparseArray();
-
- private static final SparseArray TAGS = new SparseArrayEntries()
- .entry(Log.VERBOSE, "V")
- .entry(Log.DEBUG, "D")
- .entry(Log.INFO, "I")
- .entry(Log.WARN, "W")
- .entry(Log.ERROR, "E")
- .entry(Log.ASSERT, "A")
- .sparseArray();
-
- private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS/", Locale.getDefault());
-
- @Override
- public void println(int level, CharSequence charSequence) {
- Console.write(getLevelSpannable(level, getTag(level)));
- Console.writeLine(getLevelSpannable(level, charSequence));
- SublimePluginService.log(getTag(level) + charSequence.toString());
- }
-
- @Override
- public void write(int level, CharSequence data) {
- Console.write(getLevelSpannable(level, getTag(level)));
- Console.write(getLevelSpannable(level, data));
- SublimePluginService.log(getTag(level) + data.toString());
- }
-
- private CharSequence getTag(int level) {
- return TextUtils.join("", DATE_FORMAT.format(new Date()), TAGS.get(level), ": ");
- }
-
- private SpannableString getLevelSpannable(int level, CharSequence charSequence) {
- SpannableString spannable = new SpannableString(charSequence);
- spannable.setSpan(new ForegroundColorSpan(COLORS.get(level)), 0, charSequence.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- return spannable;
- }
-
- @Override
- public void clear() {
- com.jraska.console.Console.clear();
- }
-
- @Override
- public void show() {
- App.getApp().startActivity(new Intent(App.getApp(), LogActivity_.class)
- .addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
- }
-
- @Override
- public void hide() {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void setTitle(CharSequence title) {
-
- }
-
-
-}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java
deleted file mode 100644
index f4e53803..00000000
--- a/app/src/main/java/com/stardust/scriptdroid/ui/console/LogActivity.java
+++ /dev/null
@@ -1,42 +0,0 @@
-package com.stardust.scriptdroid.ui.console;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
-import android.util.AttributeSet;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.widget.TextView;
-
-import com.stardust.scriptdroid.ui.BaseActivity;
-import com.jraska.console.Console;
-import com.stardust.scriptdroid.R;
-
-import org.androidannotations.annotations.AfterViews;
-import org.androidannotations.annotations.EActivity;
-
-/**
- * Created by Stardust on 2017/2/12.
- */
-@EActivity(R.layout.activity_console)
-public class LogActivity extends BaseActivity {
-
- @AfterViews
- void setUpUI() {
- setToolbarAsBack(getString(R.string.text_log));
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.menu_console, menu);
- return true;
- }
-
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- Console.clear();
- return super.onOptionsItemSelected(item);
- }
-
-}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/console/LogView.java b/app/src/main/java/com/stardust/scriptdroid/ui/console/LogView.java
deleted file mode 100644
index ad586018..00000000
--- a/app/src/main/java/com/stardust/scriptdroid/ui/console/LogView.java
+++ /dev/null
@@ -1,41 +0,0 @@
-package com.stardust.scriptdroid.ui.console;
-
-import android.content.Context;
-import android.graphics.Color;
-import android.util.AttributeSet;
-import android.widget.TextView;
-
-import com.jraska.console.Console;
-import com.stardust.scriptdroid.R;
-
-/**
- * Created by Stardust on 2017/8/22.
- */
-
-public class LogView extends Console {
-
- public LogView(Context context) {
- super(context);
- init();
- }
-
- public LogView(Context context, AttributeSet attrs) {
- super(context, attrs);
- init();
- }
-
- public LogView(Context context, AttributeSet attrs, int defStyleAttr) {
- super(context, attrs, defStyleAttr);
- init();
- }
-
- public LogView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
- super(context, attrs, defStyleAttr, defStyleRes);
- init();
- }
-
- private void init() {
- findViewById(R.id.console_scroll_view).setBackgroundColor(Color.WHITE);
- ((TextView) findViewById(R.id.console_text)).setTextIsSelectable(true);
- }
-}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/floating/CircularMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/floating/CircularMenu.java
index 82bb33d5..815be886 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/floating/CircularMenu.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/floating/CircularMenu.java
@@ -19,6 +19,7 @@ import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.accessibility.AccessibilityService;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.autojs.record.GlobalRecorder;
+import com.stardust.scriptdroid.io.StorageFileProvider;
import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.floating.layoutinspector.LayoutBoundsFloatyWindow;
@@ -122,6 +123,7 @@ public class CircularMenu implements Recorder.OnStateChangedListener {
void showScriptList() {
mWindow.collapse();
ScriptListView listView = new ScriptListView(mContext);
+ listView.setStorageFileProvider(StorageFileProvider.getDefault());
listView.setDirectorySpanSize(2);
final MaterialDialog dialog = new ThemeColorMaterialDialogBuilder(mContext)
.title(R.string.text_run_script)
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java
index fda2c7c6..febc149b 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java
@@ -206,12 +206,14 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
mActivityResultMediator.onActivityResult(requestCode, resultCode, data);
}
- @RequiresApi(api = Build.VERSION_CODES.M)
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
- if (Arrays.asList(permissions).contains(Manifest.permission.READ_EXTERNAL_STORAGE)
- && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
+ int i = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE);
+ if (i < 0) {
+ return;
+ }
+ if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
StorageFileProvider.getDefault().notifyStoragePermissionGranted();
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java
index be7a4c36..0aa68f15 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/task/TaskManagerFragment.java
@@ -1,24 +1,16 @@
package com.stardust.scriptdroid.ui.main.task;
-import android.animation.Animator;
-import android.animation.AnimatorListenerAdapter;
-import android.os.Bundle;
-import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
-import android.support.v4.app.Fragment;
-import android.support.v4.view.ViewPager;
-import android.support.v4.view.animation.FastOutSlowInInterpolator;
import android.support.v4.widget.SwipeRefreshLayout;
import android.view.MenuItem;
import android.view.View;
import android.widget.PopupMenu;
import android.widget.TextView;
-import android.widget.ViewAnimator;
-import com.jraska.console.Console;
+import com.stardust.autojs.runtime.console.ConsoleView;
+import com.stardust.autojs.runtime.console.StardustConsole;
import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.autojs.AutoJs;
-import com.stardust.scriptdroid.ui.console.LogView;
import com.stardust.scriptdroid.ui.main.ViewPagerFragment;
import com.stardust.widget.SimpleAdapterDataObserver;
@@ -27,8 +19,6 @@ import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.ViewById;
-import butterknife.OnClick;
-
/**
* Created by Stardust on 2017/3/24.
*/
@@ -47,15 +37,17 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
@ViewById(R.id.task_manager_view)
View mTaskManagerView;
- @ViewById(R.id.log)
- View mLogView;
-
@ViewById(R.id.spinner)
View mSpinner;
@ViewById(R.id.spinner_current_item)
TextView mSpinnerCurrentItem;
+ @ViewById(R.id.console)
+ ConsoleView mConsoleView;
+
+ private StardustConsole mStardustConsole;
+
public TaskManagerFragment() {
super(45);
}
@@ -66,6 +58,8 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
init();
final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
+ mStardustConsole = (StardustConsole) AutoJs.getInstance().getGlobalConsole();
+ mConsoleView.setConsole(mStardustConsole);
}
private void init() {
@@ -74,29 +68,20 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
@Override
public void onSomethingChanged() {
final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
- mTaskListRecyclerView.postDelayed(new Runnable() {
- @Override
- public void run() {
- if (mNoRunningScriptNotice == null)
- return;
- mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
- }
+ mTaskListRecyclerView.postDelayed(() -> {
+ if (mNoRunningScriptNotice == null)
+ return;
+ mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
}, 150);
}
});
- mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
- @Override
- public void onRefresh() {
- mTaskListRecyclerView.updateEngineList();
- mTaskListRecyclerView.postDelayed(new Runnable() {
- @Override
- public void run() {
- if (mSwipeRefreshLayout != null)
- mSwipeRefreshLayout.setRefreshing(false);
- }
- }, 800);
- }
+ mSwipeRefreshLayout.setOnRefreshListener(() -> {
+ mTaskListRecyclerView.updateEngineList();
+ mTaskListRecyclerView.postDelayed(() -> {
+ if (mSwipeRefreshLayout != null)
+ mSwipeRefreshLayout.setRefreshing(false);
+ }, 800);
});
}
@@ -121,12 +106,12 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
private void showLog() {
mTaskManagerView.setVisibility(View.GONE);
- mLogView.setVisibility(View.VISIBLE);
+ mConsoleView.setVisibility(View.VISIBLE);
mSpinnerCurrentItem.setText(R.string.text_log);
}
private void showTaskManager() {
- mLogView.setVisibility(View.GONE);
+ mConsoleView.setVisibility(View.GONE);
mTaskManagerView.setVisibility(View.VISIBLE);
mSpinnerCurrentItem.setText(R.string.text_task_manage);
}
@@ -134,8 +119,8 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
@Override
protected void onFabClick(FloatingActionButton fab) {
- if (mLogView.getVisibility() == View.VISIBLE) {
- Console.clear();
+ if (mConsoleView.getVisibility() == View.VISIBLE) {
+ mStardustConsole.clear();
} else {
AutoJs.getInstance().getScriptEngineService().stopAll();
}
diff --git a/app/src/main/res/layout/activity_console.xml b/app/src/main/res/layout/activity_console.xml
index cf95655f..81d66b4b 100644
--- a/app/src/main/res/layout/activity_console.xml
+++ b/app/src/main/res/layout/activity_console.xml
@@ -20,7 +20,7 @@
-
diff --git a/app/src/main/res/layout/fragment_task_manager.xml b/app/src/main/res/layout/fragment_task_manager.xml
index 17113533..acb17cad 100644
--- a/app/src/main/res/layout/fragment_task_manager.xml
+++ b/app/src/main/res/layout/fragment_task_manager.xml
@@ -67,21 +67,13 @@
android:textSize="16sp"/>
-
-
-
-
-
-
+ android:visibility="gone"/>
diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/rt/NoOpConsole.java b/autojs/src/main/java/com/stardust/autojs/runtime/api/NoOpConsole.java
similarity index 96%
rename from inrt/src/main/java/com/stardust/auojs/inrt/rt/NoOpConsole.java
rename to autojs/src/main/java/com/stardust/autojs/runtime/api/NoOpConsole.java
index 2aaa3b56..87c9574d 100644
--- a/inrt/src/main/java/com/stardust/auojs/inrt/rt/NoOpConsole.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/api/NoOpConsole.java
@@ -1,4 +1,4 @@
-package com.stardust.auojs.inrt.rt;
+package com.stardust.autojs.runtime.api;
import android.support.annotation.Nullable;
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/console/ConsoleView.java b/autojs/src/main/java/com/stardust/autojs/runtime/console/ConsoleView.java
index 0a8c2101..03ce004c 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/console/ConsoleView.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/console/ConsoleView.java
@@ -2,24 +2,21 @@ package com.stardust.autojs.runtime.console;
import android.content.Context;
import android.support.annotation.Nullable;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.Spanned;
-import android.text.method.ScrollingMovementMethod;
-import android.text.style.ForegroundColorSpan;
+import android.support.v7.widget.LinearLayoutManager;
+import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.util.Log;
import android.util.SparseArray;
+import android.view.LayoutInflater;
import android.view.View;
+import android.view.ViewGroup;
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.autojs.R;
-import com.stardust.autojs.runtime.console.StardustConsole;
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
import com.stardust.util.SparseArrayEntries;
@@ -31,7 +28,7 @@ import java.util.List;
*/
public class ConsoleView extends FrameLayout implements StardustConsole.LogListener {
- private static final SparseArray COLORS = new SparseArrayEntries()
+ static final SparseArray COLORS = new SparseArrayEntries()
.entry(Log.VERBOSE, 0xdfc0c0c0)
.entry(Log.DEBUG, 0xdfffffff)
.entry(Log.INFO, 0xff64dd17)
@@ -40,12 +37,15 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
.entry(Log.ASSERT, 0xffff534e)
.sparseArray();
+ private static final int REFRESH_INTERVAL = 100;
+ private SparseArray mColors = COLORS;
private StardustConsole mConsole;
- private TextView mTextView;
+ private RecyclerView mLogListRecyclerView;
private EditText mEditText;
private ResizableExpandableFloatyWindow mWindow;
private LinearLayout mInputContainer;
- private ScrollView mContentContainer;
+ private boolean mShouldStopRefresh = false;
+ private ArrayList mLogs = new ArrayList<>();
public ConsoleView(Context context) {
super(context);
@@ -62,11 +62,16 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
init();
}
+ public void setColors(SparseArray colors) {
+ mColors = colors;
+ }
+
private void init() {
inflate(getContext(), R.layout.console_view, this);
- mTextView = (TextView) findViewById(R.id.content);
- mTextView.setMovementMethod(new ScrollingMovementMethod());
- mContentContainer = (ScrollView) findViewById(R.id.content_container);
+ mLogListRecyclerView = (RecyclerView) findViewById(R.id.log_list);
+ LinearLayoutManager manager = new LinearLayoutManager(getContext());
+ mLogListRecyclerView.setLayoutManager(manager);
+ mLogListRecyclerView.setAdapter(new Adapter());
initEditText();
initSubmitButton();
}
@@ -115,68 +120,63 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
@Override
public void onNewLog(StardustConsole.Log log) {
- log(log.level, log.content);
+
}
- private void log(int level, CharSequence log) {
- int color = getColorForLevel(level);
- final Spannable spannable = buildColorSpannable(log, color);
- post(new Runnable() {
+ @Override
+ protected void onAttachedToWindow() {
+ super.onAttachedToWindow();
+ mShouldStopRefresh = false;
+ postDelayed(new Runnable() {
@Override
public void run() {
- mTextView.append(spannable);
- mContentContainer.fullScroll(View.FOCUS_DOWN);
- mEditText.requestFocus();
+ refreshLog();
+ if (!mShouldStopRefresh) {
+ postDelayed(this, REFRESH_INTERVAL);
+ }
}
-
- });
+ }, REFRESH_INTERVAL);
}
- private Spannable buildColorSpannable(CharSequence log, int color) {
- Spannable spannable = new SpannableString(log);
- spannable.setSpan(new ForegroundColorSpan(color), 0, log.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
- return spannable;
+ @Override
+ protected void onDetachedFromWindow() {
+ super.onDetachedFromWindow();
+ mShouldStopRefresh = true;
}
- private int getColorForLevel(int level) {
- return COLORS.get(level);
- }
@Override
public void onLogClear() {
post(new Runnable() {
@Override
public void run() {
- mTextView.setText("");
+ mLogs.clear();
+ mLogListRecyclerView.getAdapter().notifyDataSetChanged();
}
});
}
- @Override
- protected void onWindowVisibilityChanged(int visibility) {
- super.onWindowVisibilityChanged(visibility);
- if (visibility == VISIBLE) {
- refreshLog();
- }
- }
-
private void refreshLog() {
- if (mConsole != null) {
- mTextView.setText("");
- final List logs = new ArrayList<>(mConsole.getLogs());
- post(new Runnable() {
- @Override
- public void run() {
- for (StardustConsole.Log log : logs) {
- int color = getColorForLevel(log.level);
- final Spannable spannable = buildColorSpannable(log.content, color);
- mTextView.append(spannable);
- }
- mContentContainer.fullScroll(View.FOCUS_DOWN);
- mEditText.requestFocus();
- }
- });
+ if (mConsole == null)
+ return;
+ int oldSize = mLogs.size();
+ ArrayList logs = mConsole.getAllLogs();
+ final int size = logs.size();
+ if (size == 0) {
+ return;
}
+ if (oldSize >= size) {
+ return;
+ }
+ if (oldSize == 0) {
+ mLogs.addAll(logs);
+ } else {
+ for (int i = oldSize; i < size; i++) {
+ mLogs.add(logs.get(i));
+ }
+ }
+ mLogListRecyclerView.getAdapter().notifyItemRangeInserted(oldSize, size - 1);
+ mLogListRecyclerView.scrollToPosition(size - 1);
}
public void setWindow(ResizableExpandableFloatyWindow window) {
@@ -193,4 +193,34 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
}
});
}
+
+ private class ViewHolder extends RecyclerView.ViewHolder {
+
+ TextView textView;
+
+ public ViewHolder(View itemView) {
+ super(itemView);
+ textView = (TextView) itemView;
+ }
+ }
+
+ private class Adapter extends RecyclerView.Adapter {
+
+ @Override
+ public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+ return new ViewHolder(LayoutInflater.from(getContext()).inflate(R.layout.console_view_item, parent, false));
+ }
+
+ @Override
+ public void onBindViewHolder(ViewHolder holder, int position) {
+ StardustConsole.Log log = mLogs.get(position);
+ holder.textView.setText(log.content);
+ holder.textView.setTextColor(mColors.get(log.level));
+ }
+
+ @Override
+ public int getItemCount() {
+ return mLogs.size();
+ }
+ }
}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/console/GlobalStardustConsole.java b/autojs/src/main/java/com/stardust/autojs/runtime/console/GlobalStardustConsole.java
new file mode 100644
index 00000000..bb688274
--- /dev/null
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/console/GlobalStardustConsole.java
@@ -0,0 +1,61 @@
+package com.stardust.autojs.runtime.console;
+
+import android.graphics.Color;
+import android.util.Log;
+import android.util.SparseArray;
+
+import com.stardust.autojs.runtime.api.Console;
+import com.stardust.util.UiHandler;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * Created by Stardust on 2017/10/22.
+ */
+
+public class GlobalStardustConsole extends StardustConsole {
+ private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
+
+ private final SparseArray mColors;
+
+ public GlobalStardustConsole(UiHandler uiHandler) {
+ super(uiHandler);
+ mColors = ConsoleView.COLORS.clone();
+ mColors.put(android.util.Log.DEBUG, 0xcc000000);
+ }
+
+ @Override
+ public void setConsoleView(ConsoleView consoleView) {
+ super.setConsoleView(consoleView);
+ consoleView.setColors(mColors);
+ }
+
+ @Override
+ public void println(int level, CharSequence charSequence) {
+ charSequence = String.format(Locale.getDefault(), "%s/%s: %s",
+ DATE_FORMAT.format(new Date()), getLevelChar(level), charSequence.toString());
+ super.println(level, charSequence);
+ }
+
+ private String getLevelChar(int level) {
+ switch (level) {
+ case android.util.Log.VERBOSE:
+ return "V";
+ case android.util.Log.DEBUG:
+ return "D";
+ case android.util.Log.INFO:
+ return "I";
+ case android.util.Log.WARN:
+ return "W";
+ case android.util.Log.ERROR:
+ return "E";
+ case android.util.Log.ASSERT:
+ return "A";
+
+ }
+ return "";
+ }
+
+}
diff --git a/autojs/src/main/java/com/stardust/autojs/runtime/console/StardustConsole.java b/autojs/src/main/java/com/stardust/autojs/runtime/console/StardustConsole.java
index a0a693af..eaaa419c 100644
--- a/autojs/src/main/java/com/stardust/autojs/runtime/console/StardustConsole.java
+++ b/autojs/src/main/java/com/stardust/autojs/runtime/console/StardustConsole.java
@@ -5,19 +5,22 @@ import android.content.Intent;
import android.support.annotation.NonNull;
import android.view.WindowManager;
+import com.stardust.autojs.R;
import com.stardust.autojs.annotation.ScriptInterface;
-import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.autojs.runtime.api.AbstractConsole;
import com.stardust.autojs.runtime.api.Console;
+import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
import com.stardust.util.UiHandler;
-import com.stardust.autojs.R;
import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.atomic.AtomicInteger;
import ezy.assist.compat.SettingsCompat;
@@ -27,15 +30,30 @@ import ezy.assist.compat.SettingsCompat;
public class StardustConsole extends AbstractConsole {
- public static class Log {
+ public static class Log implements Comparable {
+ public int id;
public int level;
public CharSequence content;
+ public boolean newLine = false;
- public Log(int level, CharSequence content) {
+ public Log(int id, int level, CharSequence content) {
+ this.id = id;
this.level = level;
this.content = content;
}
+
+ public Log(int id, int level, CharSequence content, boolean newLine) {
+ this.id = id;
+ this.level = level;
+ this.content = content;
+ this.newLine = newLine;
+ }
+
+ @Override
+ public int compareTo(@NonNull Log o) {
+ return 0;
+ }
}
public interface LogListener {
@@ -45,7 +63,8 @@ public class StardustConsole extends AbstractConsole {
}
private final Console mGlobalConsole;
- private List mLogs = new ArrayList<>();
+ private final ArrayList mLogs = new ArrayList<>();
+ private AtomicInteger mIdCounter = new AtomicInteger(0);
private ResizableExpandableFloatyWindow mFloatyWindow;
private ConsoleFloaty mConsoleFloaty;
private LogListener mLogListener;
@@ -83,13 +102,13 @@ public class StardustConsole extends AbstractConsole {
mLogListener = logListener;
}
- public List getLogs() {
+ public ArrayList getAllLogs() {
return mLogs;
}
@Override
public void println(int level, CharSequence charSequence) {
- Log log = new Log(level, charSequence + "\n");
+ Log log = new Log(mIdCounter.getAndIncrement(), level, charSequence, true);
mLogs.add(log);
if (mGlobalConsole != null) {
mGlobalConsole.println(level, charSequence);
@@ -102,7 +121,7 @@ public class StardustConsole extends AbstractConsole {
@Override
public void write(int level, CharSequence charSequence) {
- Log log = new Log(level, charSequence);
+ Log log = new Log(mIdCounter.getAndIncrement(), level, charSequence);
mLogs.add(log);
if (mGlobalConsole != null) {
mGlobalConsole.print(level, charSequence);
diff --git a/autojs/src/main/res/layout/console_view.xml b/autojs/src/main/res/layout/console_view.xml
index 8c9a3e79..c2dd5579 100644
--- a/autojs/src/main/res/layout/console_view.xml
+++ b/autojs/src/main/res/layout/console_view.xml
@@ -6,22 +6,11 @@
android:animateLayoutChanges="true"
android:orientation="vertical">
-
-
-
-
+ android:layout_weight="1"/>
+
+
+
\ No newline at end of file
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 2e4a98c5..89eb6076 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
@@ -24,6 +24,7 @@ import com.stardust.autojs.runtime.ScriptRuntime;
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.NoOpConsole;
import com.stardust.autojs.runtime.api.Shell;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;