修复 悬浮窗布局分析"复制成功"的信息被遮挡的问题
This commit is contained in:
@@ -9,15 +9,13 @@ import android.os.Looper;
|
|||||||
import android.support.v4.content.LocalBroadcastManager;
|
import android.support.v4.content.LocalBroadcastManager;
|
||||||
|
|
||||||
import com.stardust.app.GlobalAppContext;
|
import com.stardust.app.GlobalAppContext;
|
||||||
import com.stardust.autojs.core.console.GlobalStardustConsole;
|
import com.stardust.autojs.core.console.GlobalConsole;
|
||||||
import com.stardust.autojs.runtime.ScriptRuntime;
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
|
import com.stardust.autojs.runtime.accessibility.AccessibilityConfig;
|
||||||
import com.stardust.autojs.runtime.api.AppUtils;
|
import com.stardust.autojs.runtime.api.AppUtils;
|
||||||
import com.stardust.autojs.runtime.exception.ScriptException;
|
import com.stardust.autojs.runtime.exception.ScriptException;
|
||||||
import com.stardust.autojs.runtime.api.Console;
|
|
||||||
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
||||||
|
|
||||||
import org.autojs.autojs.App;
|
|
||||||
import org.autojs.autojs.BuildConfig;
|
import org.autojs.autojs.BuildConfig;
|
||||||
import org.autojs.autojs.Pref;
|
import org.autojs.autojs.Pref;
|
||||||
import org.autojs.autojs.R;
|
import org.autojs.autojs.R;
|
||||||
@@ -28,10 +26,8 @@ import org.autojs.autojs.ui.floating.FullScreenFloatyWindow;
|
|||||||
import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow;
|
import org.autojs.autojs.ui.floating.layoutinspector.LayoutBoundsFloatyWindow;
|
||||||
import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow;
|
import org.autojs.autojs.ui.floating.layoutinspector.LayoutHierarchyFloatyWindow;
|
||||||
import org.autojs.autojs.ui.log.LogActivity_;
|
import org.autojs.autojs.ui.log.LogActivity_;
|
||||||
import org.autojs.autojs.ui.settings.SettingsActivity;
|
|
||||||
import org.autojs.autojs.ui.settings.SettingsActivity_;
|
import org.autojs.autojs.ui.settings.SettingsActivity_;
|
||||||
|
|
||||||
import com.stardust.concurrent.VolatileBox;
|
|
||||||
import com.stardust.view.accessibility.AccessibilityService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.view.accessibility.LayoutInspector;
|
import com.stardust.view.accessibility.LayoutInspector;
|
||||||
import com.stardust.view.accessibility.NodeInfo;
|
import com.stardust.view.accessibility.NodeInfo;
|
||||||
@@ -114,8 +110,8 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected GlobalStardustConsole createGlobalConsole() {
|
protected GlobalConsole createGlobalConsole() {
|
||||||
return new GlobalStardustConsole(getUiHandler()) {
|
return new GlobalConsole(getUiHandler()) {
|
||||||
@Override
|
@Override
|
||||||
public String println(int level, CharSequence charSequence) {
|
public String println(int level, CharSequence charSequence) {
|
||||||
String log = super.println(level, charSequence);
|
String log = super.println(level, charSequence);
|
||||||
|
|||||||
@@ -1,179 +0,0 @@
|
|||||||
package org.autojs.autojs.ui.floating.layoutinspector;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
import android.support.annotation.Nullable;
|
|
||||||
import android.support.v7.widget.LinearLayoutManager;
|
|
||||||
import android.support.v7.widget.RecyclerView;
|
|
||||||
import android.util.AttributeSet;
|
|
||||||
import android.view.LayoutInflater;
|
|
||||||
import android.view.View;
|
|
||||||
import android.view.ViewGroup;
|
|
||||||
import android.widget.TextView;
|
|
||||||
import android.widget.Toast;
|
|
||||||
|
|
||||||
import org.autojs.autojs.R;
|
|
||||||
|
|
||||||
import com.stardust.view.accessibility.NodeInfo;
|
|
||||||
import com.stardust.util.ClipboardUtil;
|
|
||||||
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration;
|
|
||||||
|
|
||||||
import java.lang.reflect.Field;
|
|
||||||
import java.util.Arrays;
|
|
||||||
|
|
||||||
import butterknife.BindView;
|
|
||||||
import butterknife.ButterKnife;
|
|
||||||
import butterknife.OnClick;
|
|
||||||
import butterknife.Optional;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Created by Stardust on 2017/3/10.
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class NodeInfoView extends RecyclerView {
|
|
||||||
|
|
||||||
private static final String[] FIELD_NAMES = {
|
|
||||||
"id",
|
|
||||||
"idHex",
|
|
||||||
"fullId",
|
|
||||||
"bounds",
|
|
||||||
"depth",
|
|
||||||
"desc",
|
|
||||||
"className",
|
|
||||||
"packageName",
|
|
||||||
"text",
|
|
||||||
"drawingOrder",
|
|
||||||
"accessibilityFocused",
|
|
||||||
"checked",
|
|
||||||
"clickable",
|
|
||||||
"contextClickable",
|
|
||||||
"dismissable",
|
|
||||||
"editable",
|
|
||||||
"enabled",
|
|
||||||
"focusable",
|
|
||||||
"indexInParent",
|
|
||||||
"longClickable",
|
|
||||||
"row",
|
|
||||||
"rowCount",
|
|
||||||
"rowSpan",
|
|
||||||
"column",
|
|
||||||
"columnCount",
|
|
||||||
"columnSpan",
|
|
||||||
"selected",
|
|
||||||
"scrollable",
|
|
||||||
};
|
|
||||||
private static final Field[] FIELDS = new Field[FIELD_NAMES.length];
|
|
||||||
|
|
||||||
static {
|
|
||||||
Arrays.sort(FIELD_NAMES);
|
|
||||||
for (int i = 0; i < FIELD_NAMES.length; i++) {
|
|
||||||
try {
|
|
||||||
FIELDS[i] = NodeInfo.class.getDeclaredField(FIELD_NAMES[i]);
|
|
||||||
} catch (NoSuchFieldException e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private String[][] mData = new String[FIELDS.length + 1][2];
|
|
||||||
|
|
||||||
public NodeInfoView(Context context) {
|
|
||||||
super(context);
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public NodeInfoView(Context context, @Nullable AttributeSet attrs) {
|
|
||||||
super(context, attrs);
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public NodeInfoView(Context context, @Nullable AttributeSet attrs, int defStyle) {
|
|
||||||
super(context, attrs, defStyle);
|
|
||||||
init();
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setNodeInfo(NodeInfo nodeInfo) {
|
|
||||||
for (int i = 0; i < FIELDS.length; i++) {
|
|
||||||
try {
|
|
||||||
Object value = FIELDS[i].get(nodeInfo);
|
|
||||||
mData[i + 1][1] = value == null ? "" : value.toString();
|
|
||||||
} catch (Exception e) {
|
|
||||||
throw new RuntimeException(e);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
getAdapter().notifyDataSetChanged();
|
|
||||||
}
|
|
||||||
|
|
||||||
private void init() {
|
|
||||||
initData();
|
|
||||||
setAdapter(new Adapter());
|
|
||||||
setLayoutManager(new LinearLayoutManager(getContext()));
|
|
||||||
addItemDecoration(new HorizontalDividerItemDecoration.Builder(getContext())
|
|
||||||
.color(0x1e000000)
|
|
||||||
.size(2)
|
|
||||||
.build());
|
|
||||||
}
|
|
||||||
|
|
||||||
private void initData() {
|
|
||||||
mData[0][0] = getResources().getString(R.string.text_attribute);
|
|
||||||
mData[0][1] = getResources().getString(R.string.text_value);
|
|
||||||
for (int i = 1; i < mData.length; i++) {
|
|
||||||
mData[i][0] = FIELD_NAMES[i - 1];
|
|
||||||
mData[i][1] = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private class Adapter extends RecyclerView.Adapter<ViewHolder> {
|
|
||||||
|
|
||||||
final int VIEW_TYPE_HEADER = 0;
|
|
||||||
final int VIEW_TYPE_ITEM = 1;
|
|
||||||
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
|
||||||
int layoutRes = viewType == VIEW_TYPE_HEADER ? R.layout.node_info_view_header : R.layout.node_info_view_item;
|
|
||||||
return new ViewHolder(LayoutInflater.from(parent.getContext()).inflate(layoutRes, parent, false));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onBindViewHolder(ViewHolder holder, int position) {
|
|
||||||
holder.attrName.setText(mData[position][0]);
|
|
||||||
holder.attrValue.setText(mData[position][1]);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemCount() {
|
|
||||||
return mData.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getItemViewType(int position) {
|
|
||||||
return position == 0 ? VIEW_TYPE_HEADER : VIEW_TYPE_ITEM;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class ViewHolder extends RecyclerView.ViewHolder {
|
|
||||||
|
|
||||||
|
|
||||||
@BindView(R.id.name)
|
|
||||||
TextView attrName;
|
|
||||||
|
|
||||||
@BindView(R.id.value)
|
|
||||||
TextView attrValue;
|
|
||||||
|
|
||||||
public ViewHolder(View itemView) {
|
|
||||||
super(itemView);
|
|
||||||
ButterKnife.bind(this, itemView);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Optional
|
|
||||||
@OnClick(R.id.item)
|
|
||||||
void onItemClick() {
|
|
||||||
int pos = getAdapterPosition();
|
|
||||||
if (pos < 1 || pos >= mData.length)
|
|
||||||
return;
|
|
||||||
ClipboardUtil.setClip(getContext(), mData[pos][0] + " = " + mData[pos][1]);
|
|
||||||
Toast.makeText(getContext(), R.string.text_already_copy_to_clip, Toast.LENGTH_SHORT).show();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
package org.autojs.autojs.ui.floating.layoutinspector
|
||||||
|
|
||||||
|
import android.content.Context
|
||||||
|
import android.support.design.widget.Snackbar
|
||||||
|
import android.support.v7.widget.LinearLayoutManager
|
||||||
|
import android.support.v7.widget.RecyclerView
|
||||||
|
import android.util.AttributeSet
|
||||||
|
import android.view.LayoutInflater
|
||||||
|
import android.view.View
|
||||||
|
import android.view.ViewGroup
|
||||||
|
import android.widget.TextView
|
||||||
|
import butterknife.BindView
|
||||||
|
import com.stardust.util.ClipboardUtil
|
||||||
|
import com.stardust.util.sortedArrayOf
|
||||||
|
import com.stardust.view.accessibility.NodeInfo
|
||||||
|
import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration
|
||||||
|
import org.autojs.autojs.R
|
||||||
|
import java.lang.reflect.Field
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Created by Stardust on 2017/3/10.
|
||||||
|
*/
|
||||||
|
|
||||||
|
class NodeInfoView : RecyclerView {
|
||||||
|
|
||||||
|
private val mData = Array(FIELDS.size + 1) { Array(2) { "" } }
|
||||||
|
|
||||||
|
constructor(context: Context) : super(context) {
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(context: Context, attrs: AttributeSet?) : super(context, attrs) {
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
|
||||||
|
constructor(context: Context, attrs: AttributeSet?, defStyle: Int) : super(context, attrs, defStyle) {
|
||||||
|
init()
|
||||||
|
}
|
||||||
|
|
||||||
|
fun setNodeInfo(nodeInfo: NodeInfo) {
|
||||||
|
for (i in FIELDS.indices) {
|
||||||
|
try {
|
||||||
|
val value = FIELDS[i].get(nodeInfo)
|
||||||
|
mData[i + 1][1] = value?.toString() ?: ""
|
||||||
|
} catch (e: Exception) {
|
||||||
|
throw RuntimeException(e)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
adapter!!.notifyDataSetChanged()
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun init() {
|
||||||
|
initData()
|
||||||
|
adapter = Adapter()
|
||||||
|
layoutManager = LinearLayoutManager(context)
|
||||||
|
addItemDecoration(HorizontalDividerItemDecoration.Builder(context)
|
||||||
|
.color(0x1e000000)
|
||||||
|
.size(2)
|
||||||
|
.build())
|
||||||
|
}
|
||||||
|
|
||||||
|
private fun initData() {
|
||||||
|
mData[0][0] = resources.getString(R.string.text_attribute)
|
||||||
|
mData[0][1] = resources.getString(R.string.text_value)
|
||||||
|
for (i in 1 until mData.size) {
|
||||||
|
mData[i][0] = FIELD_NAMES[i - 1]
|
||||||
|
mData[i][1] = ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private inner class Adapter : RecyclerView.Adapter<ViewHolder>() {
|
||||||
|
|
||||||
|
internal val VIEW_TYPE_HEADER = 0
|
||||||
|
internal val VIEW_TYPE_ITEM = 1
|
||||||
|
|
||||||
|
|
||||||
|
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
|
||||||
|
val layoutRes = if (viewType == VIEW_TYPE_HEADER) R.layout.node_info_view_header else R.layout.node_info_view_item
|
||||||
|
return ViewHolder(LayoutInflater.from(parent.context).inflate(layoutRes, parent, false))
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
|
||||||
|
holder.attrName.text = mData[position][0]
|
||||||
|
holder.attrValue.text = mData[position][1]
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemCount(): Int {
|
||||||
|
return mData.size
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun getItemViewType(position: Int): Int {
|
||||||
|
return if (position == 0) VIEW_TYPE_HEADER else VIEW_TYPE_ITEM
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
|
||||||
|
|
||||||
|
@BindView(R.id.name)
|
||||||
|
val attrName: TextView = itemView.findViewById(R.id.name)
|
||||||
|
|
||||||
|
val attrValue: TextView = itemView.findViewById(R.id.value)
|
||||||
|
|
||||||
|
init {
|
||||||
|
itemView.setOnClickListener {
|
||||||
|
val pos = adapterPosition
|
||||||
|
if (pos < 1 || pos >= mData.size)
|
||||||
|
return@setOnClickListener
|
||||||
|
ClipboardUtil.setClip(context, mData[pos][0] + " = " + mData[pos][1])
|
||||||
|
Snackbar.make(this@NodeInfoView, R.string.text_already_copy_to_clip, Snackbar.LENGTH_SHORT).show()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
companion object {
|
||||||
|
|
||||||
|
private val FIELD_NAMES = sortedArrayOf(
|
||||||
|
"id",
|
||||||
|
"idHex",
|
||||||
|
"fullId",
|
||||||
|
"bounds",
|
||||||
|
"depth",
|
||||||
|
"desc",
|
||||||
|
"className",
|
||||||
|
"packageName",
|
||||||
|
"text",
|
||||||
|
"drawingOrder",
|
||||||
|
"accessibilityFocused",
|
||||||
|
"checked",
|
||||||
|
"clickable",
|
||||||
|
"contextClickable",
|
||||||
|
"dismissable",
|
||||||
|
"editable",
|
||||||
|
"enabled",
|
||||||
|
"focusable",
|
||||||
|
"indexInParent",
|
||||||
|
"longClickable",
|
||||||
|
"row",
|
||||||
|
"rowCount",
|
||||||
|
"rowSpan",
|
||||||
|
"column",
|
||||||
|
"columnCount",
|
||||||
|
"columnSpan",
|
||||||
|
"selected",
|
||||||
|
"scrollable")
|
||||||
|
private val FIELDS = Array<Field>(FIELD_NAMES.size) {
|
||||||
|
val field = NodeInfo::class.java.getDeclaredField(FIELD_NAMES[it])
|
||||||
|
field.isAccessible = true
|
||||||
|
field
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -5,7 +5,7 @@ import android.support.annotation.Nullable;
|
|||||||
import android.view.View;
|
import android.view.View;
|
||||||
|
|
||||||
import com.stardust.autojs.core.console.ConsoleView;
|
import com.stardust.autojs.core.console.ConsoleView;
|
||||||
import com.stardust.autojs.core.console.StardustConsole;
|
import com.stardust.autojs.core.console.ConsoleImpl;
|
||||||
|
|
||||||
import org.androidannotations.annotations.AfterViews;
|
import org.androidannotations.annotations.AfterViews;
|
||||||
import org.androidannotations.annotations.Click;
|
import org.androidannotations.annotations.Click;
|
||||||
@@ -21,7 +21,7 @@ public class LogActivity extends BaseActivity {
|
|||||||
@ViewById(R.id.console)
|
@ViewById(R.id.console)
|
||||||
ConsoleView mConsoleView;
|
ConsoleView mConsoleView;
|
||||||
|
|
||||||
private StardustConsole mStardustConsole;
|
private ConsoleImpl mConsoleImpl;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
protected void onCreate(@Nullable Bundle savedInstanceState) {
|
||||||
@@ -32,13 +32,13 @@ public class LogActivity extends BaseActivity {
|
|||||||
@AfterViews
|
@AfterViews
|
||||||
void setupViews() {
|
void setupViews() {
|
||||||
setToolbarAsBack(getString(R.string.text_log));
|
setToolbarAsBack(getString(R.string.text_log));
|
||||||
mStardustConsole = AutoJs.getInstance().getGlobalConsole();
|
mConsoleImpl = AutoJs.getInstance().getGlobalConsole();
|
||||||
mConsoleView.setConsole(mStardustConsole);
|
mConsoleView.setConsole(mConsoleImpl);
|
||||||
mConsoleView.findViewById(R.id.input_container).setVisibility(View.GONE);
|
mConsoleView.findViewById(R.id.input_container).setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Click(R.id.fab)
|
@Click(R.id.fab)
|
||||||
void clearConsole() {
|
void clearConsole() {
|
||||||
mStardustConsole.clear();
|
mConsoleImpl.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ module.exports = function(__runtime__, scope){
|
|||||||
}
|
}
|
||||||
|
|
||||||
engines.myEngine = function(){
|
engines.myEngine = function(){
|
||||||
var engine = Object.create(rtEngines.myEngine());
|
var engine = rtEngines.myEngine();
|
||||||
if(!execArgv){
|
if(!execArgv){
|
||||||
execArgv = {};
|
execArgv = {};
|
||||||
var iter = engine.getTag("execution.config").getArguments().entrySet().iterator();
|
var iter = engine.getTag("execution.config").getArguments().entrySet().iterator();
|
||||||
@@ -26,8 +26,8 @@ module.exports = function(__runtime__, scope){
|
|||||||
var entry = iter.next();
|
var entry = iter.next();
|
||||||
execArgv[entry.getKey()] = entry.getValue();
|
execArgv[entry.getKey()] = entry.getValue();
|
||||||
}
|
}
|
||||||
|
engine.execArgv = execArgv;
|
||||||
}
|
}
|
||||||
engine.execArgv = execArgv;
|
|
||||||
return engine;
|
return engine;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import android.support.annotation.RequiresApi;
|
|||||||
import com.stardust.app.OnActivityResultDelegate;
|
import com.stardust.app.OnActivityResultDelegate;
|
||||||
import com.stardust.app.SimpleActivityLifecycleCallbacks;
|
import com.stardust.app.SimpleActivityLifecycleCallbacks;
|
||||||
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
|
import com.stardust.autojs.core.accessibility.AccessibilityBridge;
|
||||||
import com.stardust.autojs.core.console.GlobalStardustConsole;
|
import com.stardust.autojs.core.console.GlobalConsole;
|
||||||
import com.stardust.autojs.core.console.StardustConsole;
|
import com.stardust.autojs.core.console.ConsoleImpl;
|
||||||
import com.stardust.autojs.core.image.capture.ScreenCaptureRequestActivity;
|
import com.stardust.autojs.core.image.capture.ScreenCaptureRequestActivity;
|
||||||
import com.stardust.autojs.core.image.capture.ScreenCaptureRequester;
|
import com.stardust.autojs.core.image.capture.ScreenCaptureRequester;
|
||||||
import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder;
|
import com.stardust.autojs.core.record.accessibility.AccessibilityActionRecorder;
|
||||||
@@ -35,11 +35,7 @@ import com.stardust.view.accessibility.AccessibilityService;
|
|||||||
import com.stardust.view.accessibility.LayoutInspector;
|
import com.stardust.view.accessibility.LayoutInspector;
|
||||||
|
|
||||||
import org.mozilla.javascript.ContextFactory;
|
import org.mozilla.javascript.ContextFactory;
|
||||||
import org.mozilla.javascript.RhinoException;
|
|
||||||
import org.mozilla.javascript.Scriptable;
|
|
||||||
import org.mozilla.javascript.WrappedException;
|
import org.mozilla.javascript.WrappedException;
|
||||||
import org.opencv.android.BaseLoaderCallback;
|
|
||||||
import org.opencv.android.OpenCVLoader;
|
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
|
||||||
@@ -60,7 +56,7 @@ public abstract class AutoJs {
|
|||||||
private final AccessibilityInfoProvider mAccessibilityInfoProvider;
|
private final AccessibilityInfoProvider mAccessibilityInfoProvider;
|
||||||
private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl();
|
private final ScreenCaptureRequester mScreenCaptureRequester = new ScreenCaptureRequesterImpl();
|
||||||
private final ScriptEngineService mScriptEngineService;
|
private final ScriptEngineService mScriptEngineService;
|
||||||
private final GlobalStardustConsole mGlobalConsole;
|
private final GlobalConsole mGlobalConsole;
|
||||||
|
|
||||||
|
|
||||||
protected AutoJs(final Application application) {
|
protected AutoJs(final Application application) {
|
||||||
@@ -81,8 +77,8 @@ public abstract class AutoJs {
|
|||||||
return new AppUtils(mContext);
|
return new AppUtils(mContext);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected GlobalStardustConsole createGlobalConsole() {
|
protected GlobalConsole createGlobalConsole() {
|
||||||
return new GlobalStardustConsole(mUiHandler);
|
return new GlobalConsole(mUiHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void init() {
|
protected void init() {
|
||||||
@@ -134,7 +130,7 @@ public abstract class AutoJs {
|
|||||||
|
|
||||||
protected ScriptRuntime createRuntime() {
|
protected ScriptRuntime createRuntime() {
|
||||||
return new ScriptRuntime.Builder()
|
return new ScriptRuntime.Builder()
|
||||||
.setConsole(new StardustConsole(mUiHandler, mGlobalConsole))
|
.setConsole(new ConsoleImpl(mUiHandler, mGlobalConsole))
|
||||||
.setScreenCaptureRequester(mScreenCaptureRequester)
|
.setScreenCaptureRequester(mScreenCaptureRequester)
|
||||||
.setAccessibilityBridge(new AccessibilityBridgeImpl(mUiHandler))
|
.setAccessibilityBridge(new AccessibilityBridgeImpl(mUiHandler))
|
||||||
.setUiHandler(mUiHandler)
|
.setUiHandler(mUiHandler)
|
||||||
@@ -187,7 +183,7 @@ public abstract class AutoJs {
|
|||||||
return mLayoutInspector;
|
return mLayoutInspector;
|
||||||
}
|
}
|
||||||
|
|
||||||
public GlobalStardustConsole getGlobalConsole() {
|
public GlobalConsole getGlobalConsole() {
|
||||||
return mGlobalConsole;
|
return mGlobalConsole;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.content.Context;
|
|||||||
import android.content.ContextWrapper;
|
import android.content.ContextWrapper;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.view.ContextThemeWrapper;
|
import android.view.ContextThemeWrapper;
|
||||||
import android.view.MotionEvent;
|
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
import android.widget.TextView;
|
import android.widget.TextView;
|
||||||
@@ -25,11 +24,11 @@ public class ConsoleFloaty extends ResizableExpandableFloaty.AbstractResizableEx
|
|||||||
private ContextWrapper mContextWrapper;
|
private ContextWrapper mContextWrapper;
|
||||||
private View mResizer, mMoveCursor;
|
private View mResizer, mMoveCursor;
|
||||||
private TextView mTitleView;
|
private TextView mTitleView;
|
||||||
private StardustConsole mConsole;
|
private ConsoleImpl mConsole;
|
||||||
private CharSequence mTitle;
|
private CharSequence mTitle;
|
||||||
private View mExpandedView;
|
private View mExpandedView;
|
||||||
|
|
||||||
public ConsoleFloaty(StardustConsole console) {
|
public ConsoleFloaty(ConsoleImpl console) {
|
||||||
mConsole = console;
|
mConsole = console;
|
||||||
setShouldRequestFocusWhenExpand(false);
|
setShouldRequestFocusWhenExpand(false);
|
||||||
setInitialX(100);
|
setInitialX(100);
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import android.content.Context;
|
|||||||
import android.content.Intent;
|
import android.content.Intent;
|
||||||
import android.support.annotation.NonNull;
|
import android.support.annotation.NonNull;
|
||||||
import android.support.annotation.Nullable;
|
import android.support.annotation.Nullable;
|
||||||
import android.util.Log;
|
|
||||||
import android.view.WindowManager;
|
import android.view.WindowManager;
|
||||||
|
|
||||||
import com.stardust.autojs.R;
|
import com.stardust.autojs.R;
|
||||||
@@ -14,42 +13,37 @@ 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.autojs.runtime.exception.ScriptInterruptedException;
|
||||||
import com.stardust.autojs.util.FloatingPermission;
|
import com.stardust.autojs.util.FloatingPermission;
|
||||||
import com.stardust.concurrent.ConcurrentArrayList;
|
|
||||||
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.util.ViewUtil;
|
import com.stardust.util.ViewUtil;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
|
||||||
import java.io.StringWriter;
|
|
||||||
import java.lang.ref.WeakReference;
|
import java.lang.ref.WeakReference;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
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 java.util.concurrent.atomic.AtomicInteger;
|
||||||
|
|
||||||
import ezy.assist.compat.SettingsCompat;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2017/5/2.
|
* Created by Stardust on 2017/5/2.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class StardustConsole extends AbstractConsole {
|
public class ConsoleImpl extends AbstractConsole {
|
||||||
|
|
||||||
public static class Log implements Comparable<Log> {
|
public static class LogEntry implements Comparable<LogEntry> {
|
||||||
|
|
||||||
public int id;
|
public int id;
|
||||||
public int level;
|
public int level;
|
||||||
public CharSequence content;
|
public CharSequence content;
|
||||||
public boolean newLine = false;
|
public boolean newLine = false;
|
||||||
|
|
||||||
public Log(int id, int level, CharSequence content) {
|
public LogEntry(int id, int level, CharSequence content) {
|
||||||
this.id = id;
|
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) {
|
public LogEntry(int id, int level, CharSequence content, boolean newLine) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.level = level;
|
this.level = level;
|
||||||
this.content = content;
|
this.content = content;
|
||||||
@@ -57,20 +51,20 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compareTo(@NonNull Log o) {
|
public int compareTo(@NonNull LogEntry o) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface LogListener {
|
public interface LogListener {
|
||||||
void onNewLog(Log log);
|
void onNewLog(LogEntry logEntry);
|
||||||
|
|
||||||
void onLogClear();
|
void onLogClear();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Object WINDOW_SHOW_LOCK = new Object();
|
private final Object WINDOW_SHOW_LOCK = new Object();
|
||||||
private final Console mGlobalConsole;
|
private final Console mGlobalConsole;
|
||||||
private final ArrayList<Log> mLogs = new ArrayList<>();
|
private final ArrayList<LogEntry> mLogEntries = new ArrayList<>();
|
||||||
private AtomicInteger mIdCounter = new AtomicInteger(0);
|
private AtomicInteger mIdCounter = new AtomicInteger(0);
|
||||||
private ResizableExpandableFloatyWindow mFloatyWindow;
|
private ResizableExpandableFloatyWindow mFloatyWindow;
|
||||||
private ConsoleFloaty mConsoleFloaty;
|
private ConsoleFloaty mConsoleFloaty;
|
||||||
@@ -81,11 +75,11 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
private volatile boolean mShown = false;
|
private volatile boolean mShown = false;
|
||||||
private int mX, mY;
|
private int mX, mY;
|
||||||
|
|
||||||
public StardustConsole(UiHandler uiHandler) {
|
public ConsoleImpl(UiHandler uiHandler) {
|
||||||
this(uiHandler, null);
|
this(uiHandler, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public StardustConsole(UiHandler uiHandler, Console globalConsole) {
|
public ConsoleImpl(UiHandler uiHandler, Console globalConsole) {
|
||||||
mUiHandler = uiHandler;
|
mUiHandler = uiHandler;
|
||||||
mConsoleFloaty = new ConsoleFloaty(this);
|
mConsoleFloaty = new ConsoleFloaty(this);
|
||||||
mGlobalConsole = globalConsole;
|
mGlobalConsole = globalConsole;
|
||||||
@@ -116,8 +110,8 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
mLogListener = new WeakReference<>(logListener);
|
mLogListener = new WeakReference<>(logListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public ArrayList<Log> getAllLogs() {
|
public ArrayList<LogEntry> getAllLogs() {
|
||||||
return mLogs;
|
return mLogEntries;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void printAllStackTrace(Throwable t) {
|
public void printAllStackTrace(Throwable t) {
|
||||||
@@ -130,15 +124,15 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String println(int level, CharSequence charSequence) {
|
public String println(int level, CharSequence charSequence) {
|
||||||
Log log = new Log(mIdCounter.getAndIncrement(), level, charSequence, true);
|
LogEntry logEntry = new LogEntry(mIdCounter.getAndIncrement(), level, charSequence, true);
|
||||||
synchronized (mLogs) {
|
synchronized (mLogEntries) {
|
||||||
mLogs.add(log);
|
mLogEntries.add(logEntry);
|
||||||
}
|
}
|
||||||
if (mGlobalConsole != null) {
|
if (mGlobalConsole != null) {
|
||||||
mGlobalConsole.println(level, charSequence);
|
mGlobalConsole.println(level, charSequence);
|
||||||
}
|
}
|
||||||
if (mLogListener != null && mLogListener.get() != null) {
|
if (mLogListener != null && mLogListener.get() != null) {
|
||||||
mLogListener.get().onNewLog(log);
|
mLogListener.get().onNewLog(logEntry);
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -152,8 +146,8 @@ public class StardustConsole extends AbstractConsole {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void clear() {
|
public void clear() {
|
||||||
synchronized (mLogs) {
|
synchronized (mLogEntries) {
|
||||||
mLogs.clear();
|
mLogEntries.clear();
|
||||||
}
|
}
|
||||||
if (mLogListener != null && mLogListener.get() != null) {
|
if (mLogListener != null && mLogListener.get() != null) {
|
||||||
mLogListener.get().onLogClear();
|
mLogListener.get().onLogClear();
|
||||||
@@ -30,7 +30,7 @@ import java.util.Map;
|
|||||||
* <p>
|
* <p>
|
||||||
* TODO: 优化为无锁形式
|
* TODO: 优化为无锁形式
|
||||||
*/
|
*/
|
||||||
public class ConsoleView extends FrameLayout implements StardustConsole.LogListener {
|
public class ConsoleView extends FrameLayout implements ConsoleImpl.LogListener {
|
||||||
|
|
||||||
private static final Map<Integer, Integer> ATTRS = new MapBuilder<Integer, Integer>()
|
private static final Map<Integer, Integer> ATTRS = new MapBuilder<Integer, Integer>()
|
||||||
.put(R.styleable.ConsoleView_color_verbose, Log.VERBOSE)
|
.put(R.styleable.ConsoleView_color_verbose, Log.VERBOSE)
|
||||||
@@ -52,13 +52,13 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
|
|||||||
|
|
||||||
private static final int REFRESH_INTERVAL = 100;
|
private static final int REFRESH_INTERVAL = 100;
|
||||||
private SparseArray<Integer> mColors = COLORS.clone();
|
private SparseArray<Integer> mColors = COLORS.clone();
|
||||||
private StardustConsole mConsole;
|
private ConsoleImpl mConsole;
|
||||||
private RecyclerView mLogListRecyclerView;
|
private RecyclerView mLogListRecyclerView;
|
||||||
private EditText mEditText;
|
private EditText mEditText;
|
||||||
private ResizableExpandableFloatyWindow mWindow;
|
private ResizableExpandableFloatyWindow mWindow;
|
||||||
private LinearLayout mInputContainer;
|
private LinearLayout mInputContainer;
|
||||||
private boolean mShouldStopRefresh = false;
|
private boolean mShouldStopRefresh = false;
|
||||||
private ArrayList<StardustConsole.Log> mLogs = new ArrayList<>();
|
private ArrayList<ConsoleImpl.LogEntry> mLogEntries = new ArrayList<>();
|
||||||
|
|
||||||
public ConsoleView(Context context) {
|
public ConsoleView(Context context) {
|
||||||
super(context);
|
super(context);
|
||||||
@@ -128,13 +128,13 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
|
|||||||
mInputContainer.setOnClickListener(listener);
|
mInputContainer.setOnClickListener(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setConsole(StardustConsole console) {
|
public void setConsole(ConsoleImpl console) {
|
||||||
mConsole = console;
|
mConsole = console;
|
||||||
mConsole.setConsoleView(this);
|
mConsole.setConsoleView(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onNewLog(StardustConsole.Log log) {
|
public void onNewLog(ConsoleImpl.LogEntry logEntry) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -163,7 +163,7 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
|
|||||||
@Override
|
@Override
|
||||||
public void onLogClear() {
|
public void onLogClear() {
|
||||||
post(() -> {
|
post(() -> {
|
||||||
mLogs.clear();
|
mLogEntries.clear();
|
||||||
mLogListRecyclerView.getAdapter().notifyDataSetChanged();
|
mLogListRecyclerView.getAdapter().notifyDataSetChanged();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -171,10 +171,10 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
|
|||||||
private void refreshLog() {
|
private void refreshLog() {
|
||||||
if (mConsole == null)
|
if (mConsole == null)
|
||||||
return;
|
return;
|
||||||
int oldSize = mLogs.size();
|
int oldSize = mLogEntries.size();
|
||||||
ArrayList<StardustConsole.Log> logs = mConsole.getAllLogs();
|
ArrayList<ConsoleImpl.LogEntry> logEntries = mConsole.getAllLogs();
|
||||||
synchronized (mConsole.getAllLogs()) {
|
synchronized (mConsole.getAllLogs()) {
|
||||||
final int size = logs.size();
|
final int size = logEntries.size();
|
||||||
if (size == 0) {
|
if (size == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -182,10 +182,10 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (oldSize == 0) {
|
if (oldSize == 0) {
|
||||||
mLogs.addAll(logs);
|
mLogEntries.addAll(logEntries);
|
||||||
} else {
|
} else {
|
||||||
for (int i = oldSize; i < size; i++) {
|
for (int i = oldSize; i < size; i++) {
|
||||||
mLogs.add(logs.get(i));
|
mLogEntries.add(logEntries.get(i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
mLogListRecyclerView.getAdapter().notifyItemRangeInserted(oldSize, size - 1);
|
mLogListRecyclerView.getAdapter().notifyItemRangeInserted(oldSize, size - 1);
|
||||||
@@ -224,14 +224,14 @@ public class ConsoleView extends FrameLayout implements StardustConsole.LogListe
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onBindViewHolder(ViewHolder holder, int position) {
|
public void onBindViewHolder(ViewHolder holder, int position) {
|
||||||
StardustConsole.Log log = mLogs.get(position);
|
ConsoleImpl.LogEntry logEntry = mLogEntries.get(position);
|
||||||
holder.textView.setText(log.content);
|
holder.textView.setText(logEntry.content);
|
||||||
holder.textView.setTextColor(mColors.get(log.level));
|
holder.textView.setTextColor(mColors.get(logEntry.level));
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getItemCount() {
|
public int getItemCount() {
|
||||||
return mLogs.size();
|
return mLogEntries.size();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,11 +15,12 @@ import java.util.Locale;
|
|||||||
* Created by Stardust on 2017/10/22.
|
* Created by Stardust on 2017/10/22.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class GlobalStardustConsole extends StardustConsole {
|
public class GlobalConsole extends ConsoleImpl {
|
||||||
|
private static final String LOG_tAG = "GlobalConsole";
|
||||||
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
|
private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("HH:mm:ss.SSS", Locale.getDefault());
|
||||||
private static final Logger LOGGER = Logger.getLogger(GlobalStardustConsole.class);
|
private static final Logger LOGGER = Logger.getLogger(GlobalConsole.class);
|
||||||
|
|
||||||
public GlobalStardustConsole(UiHandler uiHandler) {
|
public GlobalConsole(UiHandler uiHandler) {
|
||||||
super(uiHandler);
|
super(uiHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ public class GlobalStardustConsole extends StardustConsole {
|
|||||||
String log = String.format(Locale.getDefault(), "%s/%s: %s",
|
String log = String.format(Locale.getDefault(), "%s/%s: %s",
|
||||||
DATE_FORMAT.format(new Date()), getLevelChar(level), charSequence.toString());
|
DATE_FORMAT.format(new Date()), getLevelChar(level), charSequence.toString());
|
||||||
LOGGER.log(toLog4jLevel(level), log);
|
LOGGER.log(toLog4jLevel(level), log);
|
||||||
|
android.util.Log.d(LOG_tAG, log);
|
||||||
super.println(level, log);
|
super.println(level, log);
|
||||||
return log;
|
return log;
|
||||||
}
|
}
|
||||||
9
common/src/main/java/com/stardust/util/Array.kt
Normal file
9
common/src/main/java/com/stardust/util/Array.kt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
package com.stardust.util
|
||||||
|
|
||||||
|
import java.util.*
|
||||||
|
|
||||||
|
inline fun <reified T> sortedArrayOf(vararg elements: T): Array<T> {
|
||||||
|
val a = arrayOf(*elements)
|
||||||
|
Arrays.sort(a)
|
||||||
|
return a
|
||||||
|
}
|
||||||
@@ -11,7 +11,7 @@ import android.view.View;
|
|||||||
import com.stardust.auojs.inrt.autojs.AutoJs;
|
import com.stardust.auojs.inrt.autojs.AutoJs;
|
||||||
import com.stardust.auojs.inrt.launch.GlobalProjectLauncher;
|
import com.stardust.auojs.inrt.launch.GlobalProjectLauncher;
|
||||||
import com.stardust.autojs.core.console.ConsoleView;
|
import com.stardust.autojs.core.console.ConsoleView;
|
||||||
import com.stardust.autojs.core.console.StardustConsole;
|
import com.stardust.autojs.core.console.ConsoleImpl;
|
||||||
|
|
||||||
public class LogActivity extends AppCompatActivity {
|
public class LogActivity extends AppCompatActivity {
|
||||||
|
|
||||||
@@ -32,7 +32,7 @@ public class LogActivity extends AppCompatActivity {
|
|||||||
Toolbar toolbar = findViewById(R.id.toolbar);
|
Toolbar toolbar = findViewById(R.id.toolbar);
|
||||||
setSupportActionBar(toolbar);
|
setSupportActionBar(toolbar);
|
||||||
ConsoleView consoleView = findViewById(R.id.console);
|
ConsoleView consoleView = findViewById(R.id.console);
|
||||||
consoleView.setConsole((StardustConsole) AutoJs.getInstance().getGlobalConsole());
|
consoleView.setConsole((ConsoleImpl) AutoJs.getInstance().getGlobalConsole());
|
||||||
consoleView.findViewById(R.id.input_container).setVisibility(View.GONE);
|
consoleView.findViewById(R.id.input_container).setVisibility(View.GONE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user