fix: console lagged with too many logs

This commit is contained in:
hyb1996
2017-10-22 18:33:12 +08:00
parent deda91e6b1
commit 38740657b8
19 changed files with 227 additions and 315 deletions

View File

@@ -108,8 +108,6 @@ dependencies {
compile 'com.github.atlassian:commonmark-java:commonmark-parent-0.9.0' compile 'com.github.atlassian:commonmark-java:commonmark-parent-0.9.0'
// AlipayZeroSdk // AlipayZeroSdk
compile 'moe.feng:AlipayZeroSdk:1.1' compile 'moe.feng:AlipayZeroSdk:1.1'
// Console
compile 'com.jraska:console:0.4.3'
// Android issue reporter (a github issue reporter) // Android issue reporter (a github issue reporter)
compile('com.heinrichreimersoftware:android-issue-reporter:1.3.1', { compile('com.heinrichreimersoftware:android-issue-reporter:1.3.1', {
exclude group: 'com.afollestad.material-dialogs' exclude group: 'com.afollestad.material-dialogs'
@@ -142,8 +140,6 @@ dependencies {
// Tasker Plugin // Tasker Plugin
compile 'com.twofortyfouram:android-plugin-client-sdk-for-locale:[4.0.2, 5.0[' 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.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', { compile('com.afollestad.material-dialogs:commons:0.9.2.3', {
exclude group: 'com.android.support' exclude group: 'com.android.support'
}) })

View File

@@ -77,7 +77,6 @@
<activity <activity
android:name=".ui.settings.SettingsActivity_" android:name=".ui.settings.SettingsActivity_"
android:theme="@style/AppTheme.Settings"/> android:theme="@style/AppTheme.Settings"/>
<activity android:name=".ui.console.LogActivity_"/>
<activity android:name=".ui.error.ErrorReportActivity"/> <activity android:name=".ui.error.ErrorReportActivity"/>
<activity android:name=".ui.help.LocalWebViewActivity"/> <activity android:name=".ui.help.LocalWebViewActivity"/>
<activity android:name=".external.tasker.TaskerScriptEditActivity_"/> <activity android:name=".external.tasker.TaskerScriptEditActivity_"/>

View File

@@ -17,6 +17,8 @@ import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.engine.ScriptEngineManager; import com.stardust.autojs.engine.ScriptEngineManager;
import com.stardust.autojs.core.accessibility.AccessibilityBridge; import com.stardust.autojs.core.accessibility.AccessibilityBridge;
import com.stardust.autojs.runtime.ScriptRuntime; 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.exception.ScriptException;
import com.stardust.autojs.runtime.api.AbstractShell; import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils; 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.autojs.core.record.accessibility.AccessibilityActionRecorder;
import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityService;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool; import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.console.JraskaConsole;
import com.stardust.view.accessibility.LayoutInspector; import com.stardust.view.accessibility.LayoutInspector;
import com.stardust.view.accessibility.NotificationListener; import com.stardust.view.accessibility.NotificationListener;
@@ -76,7 +77,7 @@ public class AutoJs {
mContext = context; mContext = context;
mUiHandler = new UiHandler(context); mUiHandler = new UiHandler(context);
mAppUtils = new AppUtils(context); mAppUtils = new AppUtils(context);
mGlobalConsole = new JraskaConsole(); mGlobalConsole = new GlobalStardustConsole(mUiHandler);
mNotificationObserver = new NotificationListener.Observer(context); mNotificationObserver = new NotificationListener.Observer(context);
mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager()); mAccessibilityInfoProvider = new AccessibilityInfoProvider(context.getPackageManager());
mScriptEngineService = buildScriptEngineService(); mScriptEngineService = buildScriptEngineService();
@@ -169,6 +170,9 @@ public class AutoJs {
return mLayoutInspector; return mLayoutInspector;
} }
public Console getGlobalConsole() {
return mGlobalConsole;
}
public ScriptEngineService getScriptEngineService() { public ScriptEngineService getScriptEngineService() {
return mScriptEngineService; return mScriptEngineService;

View File

@@ -3,9 +3,11 @@ package com.stardust.scriptdroid.network.download;
import android.content.Context; import android.content.Context;
import java.io.File; import java.io.File;
import java.net.URLDecoder;
import io.reactivex.Observable; import io.reactivex.Observable;
import io.reactivex.subjects.PublishSubject; import io.reactivex.subjects.PublishSubject;
import retrofit2.http.Url;
import zlc.season.rxdownload3.RxDownload; import zlc.season.rxdownload3.RxDownload;
import zlc.season.rxdownload3.core.Failed; import zlc.season.rxdownload3.core.Failed;
import zlc.season.rxdownload3.core.Mission; import zlc.season.rxdownload3.core.Mission;
@@ -39,7 +41,7 @@ public class DownloadManager {
if (i < 0) { if (i < 0) {
i = url.lastIndexOf('/'); i = url.lastIndexOf('/');
} }
return url.substring(i + 1); return URLDecoder.decode(url.substring(i + 1));
} }
public Observable<Integer> download(String url, String path) { public Observable<Integer> download(String url, String path) {

View File

@@ -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<Integer> COLORS = new SparseArrayEntries<Integer>()
.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<String> TAGS = new SparseArrayEntries<String>()
.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) {
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -19,6 +19,7 @@ import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.accessibility.AccessibilityService; import com.stardust.scriptdroid.accessibility.AccessibilityService;
import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.autojs.record.GlobalRecorder; import com.stardust.scriptdroid.autojs.record.GlobalRecorder;
import com.stardust.scriptdroid.io.StorageFileProvider;
import com.stardust.scriptdroid.model.script.ScriptFile; import com.stardust.scriptdroid.model.script.ScriptFile;
import com.stardust.scriptdroid.tool.AccessibilityServiceTool; import com.stardust.scriptdroid.tool.AccessibilityServiceTool;
import com.stardust.scriptdroid.ui.floating.layoutinspector.LayoutBoundsFloatyWindow; import com.stardust.scriptdroid.ui.floating.layoutinspector.LayoutBoundsFloatyWindow;
@@ -122,6 +123,7 @@ public class CircularMenu implements Recorder.OnStateChangedListener {
void showScriptList() { void showScriptList() {
mWindow.collapse(); mWindow.collapse();
ScriptListView listView = new ScriptListView(mContext); ScriptListView listView = new ScriptListView(mContext);
listView.setStorageFileProvider(StorageFileProvider.getDefault());
listView.setDirectorySpanSize(2); listView.setDirectorySpanSize(2);
final MaterialDialog dialog = new ThemeColorMaterialDialogBuilder(mContext) final MaterialDialog dialog = new ThemeColorMaterialDialogBuilder(mContext)
.title(R.string.text_run_script) .title(R.string.text_run_script)

View File

@@ -206,12 +206,14 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
mActivityResultMediator.onActivityResult(requestCode, resultCode, data); mActivityResultMediator.onActivityResult(requestCode, resultCode, data);
} }
@RequiresApi(api = Build.VERSION_CODES.M)
@Override @Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (Arrays.asList(permissions).contains(Manifest.permission.READ_EXTERNAL_STORAGE) int i = Arrays.asList(permissions).indexOf(Manifest.permission.READ_EXTERNAL_STORAGE);
&& checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) { if (i < 0) {
return;
}
if (grantResults[i] == PackageManager.PERMISSION_GRANTED) {
StorageFileProvider.getDefault().notifyStoragePermissionGranted(); StorageFileProvider.getDefault().notifyStoragePermissionGranted();
} }
} }

View File

@@ -1,24 +1,16 @@
package com.stardust.scriptdroid.ui.main.task; 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.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.support.v4.widget.SwipeRefreshLayout;
import android.view.MenuItem; import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.widget.PopupMenu; import android.widget.PopupMenu;
import android.widget.TextView; 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.R;
import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.ui.console.LogView;
import com.stardust.scriptdroid.ui.main.ViewPagerFragment; import com.stardust.scriptdroid.ui.main.ViewPagerFragment;
import com.stardust.widget.SimpleAdapterDataObserver; import com.stardust.widget.SimpleAdapterDataObserver;
@@ -27,8 +19,6 @@ import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.EFragment;
import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.ViewById;
import butterknife.OnClick;
/** /**
* Created by Stardust on 2017/3/24. * Created by Stardust on 2017/3/24.
*/ */
@@ -47,15 +37,17 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
@ViewById(R.id.task_manager_view) @ViewById(R.id.task_manager_view)
View mTaskManagerView; View mTaskManagerView;
@ViewById(R.id.log)
View mLogView;
@ViewById(R.id.spinner) @ViewById(R.id.spinner)
View mSpinner; View mSpinner;
@ViewById(R.id.spinner_current_item) @ViewById(R.id.spinner_current_item)
TextView mSpinnerCurrentItem; TextView mSpinnerCurrentItem;
@ViewById(R.id.console)
ConsoleView mConsoleView;
private StardustConsole mStardustConsole;
public TaskManagerFragment() { public TaskManagerFragment() {
super(45); super(45);
} }
@@ -66,6 +58,8 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
init(); init();
final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0; final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE); mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
mStardustConsole = (StardustConsole) AutoJs.getInstance().getGlobalConsole();
mConsoleView.setConsole(mStardustConsole);
} }
private void init() { private void init() {
@@ -74,29 +68,20 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
@Override @Override
public void onSomethingChanged() { public void onSomethingChanged() {
final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0; final boolean noRunningScript = mTaskListRecyclerView.getAdapter().getItemCount() == 0;
mTaskListRecyclerView.postDelayed(new Runnable() { mTaskListRecyclerView.postDelayed(() -> {
@Override if (mNoRunningScriptNotice == null)
public void run() { return;
if (mNoRunningScriptNotice == null) mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
return;
mNoRunningScriptNotice.setVisibility(noRunningScript ? View.VISIBLE : View.GONE);
}
}, 150); }, 150);
} }
}); });
mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { mSwipeRefreshLayout.setOnRefreshListener(() -> {
@Override mTaskListRecyclerView.updateEngineList();
public void onRefresh() { mTaskListRecyclerView.postDelayed(() -> {
mTaskListRecyclerView.updateEngineList(); if (mSwipeRefreshLayout != null)
mTaskListRecyclerView.postDelayed(new Runnable() { mSwipeRefreshLayout.setRefreshing(false);
@Override }, 800);
public void run() {
if (mSwipeRefreshLayout != null)
mSwipeRefreshLayout.setRefreshing(false);
}
}, 800);
}
}); });
} }
@@ -121,12 +106,12 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
private void showLog() { private void showLog() {
mTaskManagerView.setVisibility(View.GONE); mTaskManagerView.setVisibility(View.GONE);
mLogView.setVisibility(View.VISIBLE); mConsoleView.setVisibility(View.VISIBLE);
mSpinnerCurrentItem.setText(R.string.text_log); mSpinnerCurrentItem.setText(R.string.text_log);
} }
private void showTaskManager() { private void showTaskManager() {
mLogView.setVisibility(View.GONE); mConsoleView.setVisibility(View.GONE);
mTaskManagerView.setVisibility(View.VISIBLE); mTaskManagerView.setVisibility(View.VISIBLE);
mSpinnerCurrentItem.setText(R.string.text_task_manage); mSpinnerCurrentItem.setText(R.string.text_task_manage);
} }
@@ -134,8 +119,8 @@ public class TaskManagerFragment extends ViewPagerFragment implements PopupMenu.
@Override @Override
protected void onFabClick(FloatingActionButton fab) { protected void onFabClick(FloatingActionButton fab) {
if (mLogView.getVisibility() == View.VISIBLE) { if (mConsoleView.getVisibility() == View.VISIBLE) {
Console.clear(); mStardustConsole.clear();
} else { } else {
AutoJs.getInstance().getScriptEngineService().stopAll(); AutoJs.getInstance().getScriptEngineService().stopAll();
} }

View File

@@ -20,7 +20,7 @@
</android.support.design.widget.AppBarLayout> </android.support.design.widget.AppBarLayout>
<com.stardust.scriptdroid.ui.console.LogView <com.stardust.autojs.runtime.console.ConsoleView
android:id="@+id/console" android:id="@+id/console"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent"/> android:layout_height="match_parent"/>

View File

@@ -67,21 +67,13 @@
android:textSize="16sp"/> android:textSize="16sp"/>
</FrameLayout> </FrameLayout>
<com.stardust.autojs.runtime.console.ConsoleView
<android.support.v4.widget.NestedScrollView android:id="@+id/console"
android:id="@+id/log"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:background="@android:color/white" android:background="@android:color/white"
android:paddingLeft="6dp" android:paddingLeft="6dp"
android:visibility="gone"> android:visibility="gone"/>
<com.stardust.scriptdroid.ui.console.LogView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"/>
</android.support.v4.widget.NestedScrollView>
</FrameLayout> </FrameLayout>

View File

@@ -1,4 +1,4 @@
package com.stardust.auojs.inrt.rt; package com.stardust.autojs.runtime.api;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;

View File

@@ -2,24 +2,21 @@ package com.stardust.autojs.runtime.console;
import android.content.Context; import android.content.Context;
import android.support.annotation.Nullable; import android.support.annotation.Nullable;
import android.text.Spannable; import android.support.v7.widget.LinearLayoutManager;
import android.text.SpannableString; import android.support.v7.widget.RecyclerView;
import android.text.Spanned;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ForegroundColorSpan;
import android.util.AttributeSet; import android.util.AttributeSet;
import android.util.Log; import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.ViewGroup;
import android.widget.Button; import android.widget.Button;
import android.widget.EditText; import android.widget.EditText;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.LinearLayout; import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView; import android.widget.TextView;
import com.stardust.autojs.R; import com.stardust.autojs.R;
import com.stardust.autojs.runtime.console.StardustConsole;
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
import com.stardust.util.SparseArrayEntries; import com.stardust.util.SparseArrayEntries;
@@ -31,7 +28,7 @@ import java.util.List;
*/ */
public class ConsoleView extends FrameLayout implements StardustConsole.LogListener { public class ConsoleView extends FrameLayout implements StardustConsole.LogListener {
private static final SparseArray<Integer> COLORS = new SparseArrayEntries<Integer>() static final SparseArray<Integer> COLORS = new SparseArrayEntries<Integer>()
.entry(Log.VERBOSE, 0xdfc0c0c0) .entry(Log.VERBOSE, 0xdfc0c0c0)
.entry(Log.DEBUG, 0xdfffffff) .entry(Log.DEBUG, 0xdfffffff)
.entry(Log.INFO, 0xff64dd17) .entry(Log.INFO, 0xff64dd17)
@@ -40,12 +37,15 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
.entry(Log.ASSERT, 0xffff534e) .entry(Log.ASSERT, 0xffff534e)
.sparseArray(); .sparseArray();
private static final int REFRESH_INTERVAL = 100;
private SparseArray<Integer> mColors = COLORS;
private StardustConsole mConsole; private StardustConsole mConsole;
private TextView mTextView; private RecyclerView mLogListRecyclerView;
private EditText mEditText; private EditText mEditText;
private ResizableExpandableFloatyWindow mWindow; private ResizableExpandableFloatyWindow mWindow;
private LinearLayout mInputContainer; private LinearLayout mInputContainer;
private ScrollView mContentContainer; private boolean mShouldStopRefresh = false;
private ArrayList<StardustConsole.Log> mLogs = new ArrayList<>();
public ConsoleView(Context context) { public ConsoleView(Context context) {
super(context); super(context);
@@ -62,11 +62,16 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
init(); init();
} }
public void setColors(SparseArray<Integer> colors) {
mColors = colors;
}
private void init() { private void init() {
inflate(getContext(), R.layout.console_view, this); inflate(getContext(), R.layout.console_view, this);
mTextView = (TextView) findViewById(R.id.content); mLogListRecyclerView = (RecyclerView) findViewById(R.id.log_list);
mTextView.setMovementMethod(new ScrollingMovementMethod()); LinearLayoutManager manager = new LinearLayoutManager(getContext());
mContentContainer = (ScrollView) findViewById(R.id.content_container); mLogListRecyclerView.setLayoutManager(manager);
mLogListRecyclerView.setAdapter(new Adapter());
initEditText(); initEditText();
initSubmitButton(); initSubmitButton();
} }
@@ -115,68 +120,63 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
@Override @Override
public void onNewLog(StardustConsole.Log log) { public void onNewLog(StardustConsole.Log log) {
log(log.level, log.content);
} }
private void log(int level, CharSequence log) { @Override
int color = getColorForLevel(level); protected void onAttachedToWindow() {
final Spannable spannable = buildColorSpannable(log, color); super.onAttachedToWindow();
post(new Runnable() { mShouldStopRefresh = false;
postDelayed(new Runnable() {
@Override @Override
public void run() { public void run() {
mTextView.append(spannable); refreshLog();
mContentContainer.fullScroll(View.FOCUS_DOWN); if (!mShouldStopRefresh) {
mEditText.requestFocus(); postDelayed(this, REFRESH_INTERVAL);
}
} }
}, REFRESH_INTERVAL);
});
} }
private Spannable buildColorSpannable(CharSequence log, int color) { @Override
Spannable spannable = new SpannableString(log); protected void onDetachedFromWindow() {
spannable.setSpan(new ForegroundColorSpan(color), 0, log.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE); super.onDetachedFromWindow();
return spannable; mShouldStopRefresh = true;
} }
private int getColorForLevel(int level) {
return COLORS.get(level);
}
@Override @Override
public void onLogClear() { public void onLogClear() {
post(new Runnable() { post(new Runnable() {
@Override @Override
public void run() { 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() { private void refreshLog() {
if (mConsole != null) { if (mConsole == null)
mTextView.setText(""); return;
final List<StardustConsole.Log> logs = new ArrayList<>(mConsole.getLogs()); int oldSize = mLogs.size();
post(new Runnable() { ArrayList<StardustConsole.Log> logs = mConsole.getAllLogs();
@Override final int size = logs.size();
public void run() { if (size == 0) {
for (StardustConsole.Log log : logs) { return;
int color = getColorForLevel(log.level);
final Spannable spannable = buildColorSpannable(log.content, color);
mTextView.append(spannable);
}
mContentContainer.fullScroll(View.FOCUS_DOWN);
mEditText.requestFocus();
}
});
} }
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) { 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<ViewHolder> {
@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();
}
}
} }

View File

@@ -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<Integer> 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 "";
}
}

View File

@@ -5,19 +5,22 @@ import android.content.Intent;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.view.WindowManager; import android.view.WindowManager;
import com.stardust.autojs.R;
import com.stardust.autojs.annotation.ScriptInterface; 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.AbstractConsole;
import com.stardust.autojs.runtime.api.Console; import com.stardust.autojs.runtime.api.Console;
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
import com.stardust.enhancedfloaty.FloatyService; import com.stardust.enhancedfloaty.FloatyService;
import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow; import com.stardust.enhancedfloaty.ResizableExpandableFloatyWindow;
import com.stardust.util.UiHandler; import com.stardust.util.UiHandler;
import com.stardust.autojs.R;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List; import java.util.List;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.concurrent.atomic.AtomicInteger;
import ezy.assist.compat.SettingsCompat; import ezy.assist.compat.SettingsCompat;
@@ -27,15 +30,30 @@ import ezy.assist.compat.SettingsCompat;
public class StardustConsole extends AbstractConsole { public class StardustConsole extends AbstractConsole {
public static class Log { public static class Log implements Comparable<Log> {
public int id;
public int level; public int level;
public CharSequence content; 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.level = level;
this.content = content; 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 { public interface LogListener {
@@ -45,7 +63,8 @@ public class StardustConsole extends AbstractConsole {
} }
private final Console mGlobalConsole; private final Console mGlobalConsole;
private List<Log> mLogs = new ArrayList<>(); private final ArrayList<Log> mLogs = new ArrayList<>();
private AtomicInteger mIdCounter = new AtomicInteger(0);
private ResizableExpandableFloatyWindow mFloatyWindow; private ResizableExpandableFloatyWindow mFloatyWindow;
private ConsoleFloaty mConsoleFloaty; private ConsoleFloaty mConsoleFloaty;
private LogListener mLogListener; private LogListener mLogListener;
@@ -83,13 +102,13 @@ public class StardustConsole extends AbstractConsole {
mLogListener = logListener; mLogListener = logListener;
} }
public List<Log> getLogs() { public ArrayList<Log> getAllLogs() {
return mLogs; return mLogs;
} }
@Override @Override
public void println(int level, CharSequence charSequence) { 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); mLogs.add(log);
if (mGlobalConsole != null) { if (mGlobalConsole != null) {
mGlobalConsole.println(level, charSequence); mGlobalConsole.println(level, charSequence);
@@ -102,7 +121,7 @@ public class StardustConsole extends AbstractConsole {
@Override @Override
public void write(int level, CharSequence charSequence) { public void write(int level, CharSequence charSequence) {
Log log = new Log(level, charSequence); Log log = new Log(mIdCounter.getAndIncrement(), level, charSequence);
mLogs.add(log); mLogs.add(log);
if (mGlobalConsole != null) { if (mGlobalConsole != null) {
mGlobalConsole.print(level, charSequence); mGlobalConsole.print(level, charSequence);

View File

@@ -6,22 +6,11 @@
android:animateLayoutChanges="true" android:animateLayoutChanges="true"
android:orientation="vertical"> android:orientation="vertical">
<ScrollView <android.support.v7.widget.RecyclerView
android:id="@+id/content_container" android:id="@+id/log_list"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="0dp" android:layout_height="0dp"
android:layout_weight="1"> android:layout_weight="1"/>
<TextView
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="16dp"
android:paddingLeft="3dp"
android:textIsSelectable="true"
android:textSize="14sp"
tools:text="12345\n678\n9\n0"/>
</ScrollView>
<LinearLayout <LinearLayout
android:id="@+id/input_container" android:id="@+id/input_container"

View File

@@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="15sp">
</TextView>

View File

@@ -24,6 +24,7 @@ import com.stardust.autojs.runtime.ScriptRuntime;
import com.stardust.autojs.runtime.api.AbstractShell; import com.stardust.autojs.runtime.api.AbstractShell;
import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.api.AppUtils;
import com.stardust.autojs.runtime.api.Console; 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.Shell;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity; import com.stardust.autojs.runtime.api.image.ScreenCaptureRequestActivity;
import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester; import com.stardust.autojs.runtime.api.image.ScreenCaptureRequester;