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;