From e5e1b567e754365758ace1ee6659883a0510b8d7 Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Fri, 7 Sep 2018 12:36:13 +0800 Subject: [PATCH] refactor(ui): toolbar menu design; --- .idea/caches/build_file_checksums.ser | Bin 733 -> 733 bytes .../autojs/autojs/ui/edit/EditActivity.java | 8 + .../org/autojs/autojs/ui/edit/EditorView.java | 172 +++++++++++++----- .../ui/edit/toolbar/DebugToolbarFragment.java | 44 +++++ .../edit/toolbar/NormalToolbarFragment.java | 20 ++ .../edit/toolbar/SearchToolbarFragment.java | 31 ++++ .../ui/edit/toolbar/ToolbarFragment.java | 75 ++++++++ .../org/autojs/autojs/ui/main/task/Task.java | 44 ++--- .../autojs/autojs/ui/main/task/TaskGroup.java | 17 +- .../ui/main/task/TaskListRecyclerView.java | 54 +++--- app/src/main/res/layout/editor_view.xml | 84 +-------- .../res/layout/fragment_normal_toolbar.xml | 40 ++++ .../res/layout/fragment_search_toolbar.xml | 39 ++++ .../stardust/autojs/ScriptEngineService.java | 32 +++- .../stardust/autojs/engine/ScriptEngine.java | 17 +- .../autojs/engine/ScriptEngineProxy.java | 10 + .../execution/RunnableScriptExecution.java | 1 + .../autojs/execution/ScriptExecution.java | 29 +++ .../runtime/exception/ScriptException.java | 3 + 19 files changed, 528 insertions(+), 192 deletions(-) create mode 100644 app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java create mode 100644 app/src/main/java/org/autojs/autojs/ui/edit/toolbar/NormalToolbarFragment.java create mode 100644 app/src/main/java/org/autojs/autojs/ui/edit/toolbar/SearchToolbarFragment.java create mode 100644 app/src/main/java/org/autojs/autojs/ui/edit/toolbar/ToolbarFragment.java create mode 100644 app/src/main/res/layout/fragment_normal_toolbar.xml create mode 100644 app/src/main/res/layout/fragment_search_toolbar.xml diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index bf0552a3748826e28d512c2bc09b1d261dd17de6..8b8733f2c30dfc579eb647f514a3b5b38d166bdf 100644 GIT binary patch delta 99 zcmV-p0G$8b1>FUZmjz|9lz|43oOckED#;AeOyE2o0 F0$)cuFMt35 delta 99 zcmV-p0G$8b1>FUZmjz^~!1pqdoOcjkmD=lg2Z=s;mJoA+df#-DBLS2UYF1)gdYXM; zH;kl~lH7I(lg9yh5WrW009uZzuHD#=cTasVw3AQ*9uQ PFiles.read(file)) @@ -225,7 +231,13 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC private void setMenuItemStatus(int id, boolean enabled) { - findViewById(id).setEnabled(enabled); + ToolbarFragment fragment = (ToolbarFragment) getActivity().getSupportFragmentManager() + .findFragmentById(R.id.toolbar_menu); + if (fragment == null) { + mNormalToolbar.setMenuItemStatus(id, enabled); + } else { + fragment.setMenuItemStatus(id, enabled); + } } @@ -238,9 +250,15 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC setMenuItemStatus(R.id.save, false); mDocsWebView.getWebView().getSettings().setDisplayZoomControls(true); mDocsWebView.getWebView().loadUrl(Pref.getDocumentationUrl() + "index.html"); - Themes.getCurrent(getContext()). - observeOn(AndroidSchedulers.mainThread()) + Themes.getCurrent(getContext()) + .observeOn(AndroidSchedulers.mainThread()) .subscribe(this::setTheme); + initNormalToolbar(); + } + + private void initNormalToolbar() { + mNormalToolbar.setOnMenuItemClickListener(this); + showNormalToolbar(); } private void setUpFunctionsKeyboard() { @@ -299,8 +317,36 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC return false; } + @Override + public void onToolbarMenuItemClick(int id) { + switch (id) { + case R.id.run: + runAndSaveFileIfNeeded(); + break; + case R.id.save: + saveFile(); + break; + case R.id.undo: + undo(); + break; + case R.id.redo: + redo(); + break; + case R.id.replace: + replace(); + break; + case R.id.find_next: + findNext(); + break; + case R.id.find_prev: + findPrev(); + break; + case R.id.cancel_search: + cancelSearch(); + break; + } + } - @Click(R.id.run) public void runAndSaveFileIfNeeded() { save().observeOn(AndroidSchedulers.mainThread()) .subscribe(s -> run()); @@ -308,17 +354,15 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC public void run() { Snackbar.make(this, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); - mScriptExecution = Scripts.runWithBroadcastSender(mFile); + mScriptExecutionId = Scripts.runWithBroadcastSender(mFile).getId(); setMenuItemStatus(R.id.run, false); } - @Click(R.id.undo) public void undo() { mEditor.undo(); } - @Click(R.id.redo) public void redo() { mEditor.redo(); } @@ -335,32 +379,49 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } public void forceStop() { - if (mScriptExecution != null) { - mScriptExecution.getEngine().forceStop(); + doWithCurrentEngine(ScriptEngine::forceStop); + } + + private void doWithCurrentEngine(Callback callback) { + ScriptExecution execution = AutoJs.getInstance().getScriptEngineService().getScriptExecution(mScriptExecutionId); + if (execution != null) { + ScriptEngine engine = execution.getEngine(); + if (engine != null) { + callback.call(engine); + } } } - @Click(R.id.save) public void saveFile() { save().subscribe(); } - @Click(R.id.find_next) void findNext() { mEditor.findNext(); } - @Click(R.id.find_prev) void findPrev() { mEditor.findPrev(); } - @Click(R.id.cancel) void cancelSearch() { - mToolbarSwitcher.showFirst(); + showNormalToolbar(); + } + + private void showNormalToolbar() { + getActivity().getSupportFragmentManager().beginTransaction() + .replace(R.id.toolbar_menu, mNormalToolbar) + .commit(); + } + + FragmentActivity getActivity() { + Context context = getContext(); + while (!(context instanceof Activity) && context instanceof ContextWrapper) { + context = ((ContextWrapper) context).getBaseContext(); + } + return (FragmentActivity) context; } - @Click(R.id.replace) void replace() { mEditor.replaceSelection(); } @@ -374,9 +435,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } public void showConsole() { - if (mScriptExecution != null) { - ((JavaScriptEngine) mScriptExecution.getEngine()).getRuntime().console.show(); - } + doWithCurrentEngine(engine -> ((JavaScriptEngine) engine).getRuntime().console.show()); } public void openByOtherApps() { @@ -433,14 +492,22 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC public void find(String keywords, boolean usingRegex) { mEditor.find(keywords, usingRegex); - mReplaceMenuItem.setVisibility(GONE); - mToolbarSwitcher.showSecond(); + showSearchToolbar(false); + } + + private void showSearchToolbar(boolean showReplaceItem) { + SearchToolbarFragment searchToolbarFragment = SearchToolbarFragment_.builder() + .arg(SearchToolbarFragment.ARGUMENT_SHOW_REPLACE_ITEM, showReplaceItem) + .build(); + searchToolbarFragment.setOnMenuItemClickListener(this); + getActivity().getSupportFragmentManager().beginTransaction() + .replace(R.id.toolbar_menu, searchToolbarFragment) + .commit(); } public void replace(String keywords, String replacement, boolean usingRegex) { mEditor.replace(keywords, replacement, usingRegex); - mReplaceMenuItem.setVisibility(VISIBLE); - mToolbarSwitcher.showSecond(); + showSearchToolbar(true); } public void replaceAll(String keywords, String replacement, boolean usingRegex) { @@ -511,5 +578,26 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } } + public int getScriptExecutionId() { + return mScriptExecutionId; + } + @Nullable + @Override + protected Parcelable onSaveInstanceState() { + Bundle bundle = new Bundle(); + Parcelable superData = super.onSaveInstanceState(); + bundle.putParcelable("super_data", superData); + bundle.putInt("script_execution_id", mScriptExecutionId); + return bundle; + } + + @Override + protected void onRestoreInstanceState(Parcelable state) { + Bundle bundle = (Bundle) state; + Parcelable superData = bundle.getParcelable("super_data"); + mScriptExecutionId = bundle.getInt("script_execution_id", ScriptExecution.NO_ID); + super.onRestoreInstanceState(superData); + setMenuItemStatus(R.id.run, mScriptExecutionId == ScriptExecution.NO_ID); + } } diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java new file mode 100644 index 00000000..535fc072 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/DebugToolbarFragment.java @@ -0,0 +1,44 @@ +package org.autojs.autojs.ui.edit.toolbar; + +import android.os.Looper; +import android.util.Log; + +import org.mozilla.javascript.ContextFactory; +import org.mozilla.javascript.tools.debugger.Dim; +import org.mozilla.javascript.tools.debugger.GuiCallback; + +public class DebugToolbarFragment implements GuiCallback { + + private Dim mDim; + + public void attachDebugger(){ + mDim.attachTo(ContextFactory.getGlobal()); + } + + public void deattchDebugger(){ + mDim.detach(); + } + + public void breakpoint(){ + mDim.setGuiCallback(this); + } + + @Override + public void updateSourceText(Dim.SourceInfo sourceInfo) { + } + + @Override + public void enterInterrupt(Dim.StackFrame stackFrame, String s, String s1) { + + } + + @Override + public boolean isGuiEventThread() { + return Looper.getMainLooper() == Looper.myLooper(); + } + + @Override + public void dispatchNextGuiEvent() throws InterruptedException { + + } +} diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/NormalToolbarFragment.java b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/NormalToolbarFragment.java new file mode 100644 index 00000000..1f718d2f --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/NormalToolbarFragment.java @@ -0,0 +1,20 @@ +package org.autojs.autojs.ui.edit.toolbar; + +import android.support.v4.app.Fragment; + +import org.androidannotations.annotations.Click; +import org.androidannotations.annotations.EFragment; +import org.autojs.autojs.R; + +import java.util.Arrays; +import java.util.List; + +@EFragment(R.layout.fragment_normal_toolbar) +public class NormalToolbarFragment extends ToolbarFragment { + + + @Override + public List getMenuItemIds() { + return Arrays.asList(R.id.run, R.id.undo, R.id.redo, R.id.save); + } +} diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/SearchToolbarFragment.java b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/SearchToolbarFragment.java new file mode 100644 index 00000000..ac947588 --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/SearchToolbarFragment.java @@ -0,0 +1,31 @@ +package org.autojs.autojs.ui.edit.toolbar; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.view.View; + +import org.androidannotations.annotations.EFragment; +import org.autojs.autojs.R; + +import java.util.Arrays; +import java.util.List; + +@EFragment(R.layout.fragment_search_toolbar) +public class SearchToolbarFragment extends ToolbarFragment { + + public static final String ARGUMENT_SHOW_REPLACE_ITEM = "show_replace_item"; + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + boolean showReplaceItem = getArguments().getBoolean(ARGUMENT_SHOW_REPLACE_ITEM, false); + view.findViewById(R.id.replace).setVisibility(showReplaceItem ? View.VISIBLE : View.GONE); + } + + @Override + public List getMenuItemIds() { + return Arrays.asList(R.id.replace, R.id.find_next, R.id.find_prev, R.id.cancel_search); + } + +} diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/ToolbarFragment.java b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/ToolbarFragment.java new file mode 100644 index 00000000..1dcd814b --- /dev/null +++ b/app/src/main/java/org/autojs/autojs/ui/edit/toolbar/ToolbarFragment.java @@ -0,0 +1,75 @@ +package org.autojs.autojs.ui.edit.toolbar; + +import android.os.Bundle; +import android.support.annotation.Nullable; +import android.support.v4.app.Fragment; +import android.util.SparseBooleanArray; +import android.view.View; + +import java.util.List; + +public abstract class ToolbarFragment extends Fragment implements View.OnClickListener { + + public interface OnMenuItemClickListener { + void onToolbarMenuItemClick(int id); + } + + private OnMenuItemClickListener mOnMenuItemClickListener; + private List mMenuItemIds; + private SparseBooleanArray mMenuItemStatus = new SparseBooleanArray(); + + public void setOnMenuItemClickListener(OnMenuItemClickListener listener) { + mOnMenuItemClickListener = listener; + } + + public abstract List getMenuItemIds(); + + @Override + public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + updateMenuItemStatus(); + } + + private void updateMenuItemStatus() { + View rootView = getView(); + if (rootView == null) { + return; + } + if (mMenuItemIds == null) { + mMenuItemIds = getMenuItemIds(); + } + for (int id : mMenuItemIds) { + View view = rootView.findViewById(id); + view.setOnClickListener(this); + view.setEnabled(mMenuItemStatus.get(id, view.isEnabled())); + } + } + + + @Override + public void onClick(View view) { + if (mOnMenuItemClickListener != null) { + mOnMenuItemClickListener.onToolbarMenuItemClick(view.getId()); + } + } + + public void setMenuItemStatus(int id, boolean enabled) { + if (mMenuItemIds == null) { + mMenuItemIds = getMenuItemIds(); + } + if (!mMenuItemIds.contains(id)) { + return; + } + mMenuItemStatus.put(id, enabled); + View rootView = getView(); + if (rootView == null) { + return; + } + View view = rootView.findViewById(id); + if (view == null) { + return; + } + view.setEnabled(enabled); + } + +} diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java b/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java index 9e59665c..f1ae6097 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/Task.java @@ -1,18 +1,13 @@ package org.autojs.autojs.ui.main.task; -import android.os.Parcel; -import android.os.Parcelable; - import com.stardust.app.GlobalAppContext; -import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.ScriptEngine; -import com.stardust.autojs.engine.ScriptEngineFactory; +import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.script.AutoFileSource; import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; -import com.stardust.pio.PFile; import com.stardust.pio.PFiles; -import org.autojs.autojs.App; + import org.autojs.autojs.R; import org.autojs.autojs.timing.TimedTask; import org.autojs.autojs.timing.TimedTaskManager; @@ -23,7 +18,7 @@ import org.joda.time.format.DateTimeFormat; * Created by Stardust on 2017/11/28. */ -public abstract class Task { +public abstract class Task { public abstract String getName(); @@ -78,46 +73,37 @@ public abstract class Task { } public static class RunningTask extends Task { - private final ScriptEngine mScriptEngine; + private final ScriptExecution mScriptExecution; - public RunningTask(ScriptEngine scriptEngine) { - mScriptEngine = scriptEngine; + public RunningTask(ScriptExecution scriptExecution) { + mScriptExecution = scriptExecution; } - public ScriptEngine getScriptEngine() { - return mScriptEngine; + public ScriptExecution getScriptExecution() { + return mScriptExecution; } @Override public String getName() { - ScriptSource source = (ScriptSource) mScriptEngine.getTag(ScriptEngine.TAG_SOURCE); - if (source == null) { - return null; - } - return source.getName(); + return mScriptExecution.getSource().getName(); } @Override public String getDesc() { - ScriptSource source = (ScriptSource) mScriptEngine.getTag(ScriptEngine.TAG_SOURCE); - if (source == null) { - return null; - } - return source.toString(); + return mScriptExecution.getSource().toString(); } @Override public void cancel() { - mScriptEngine.forceStop(); + ScriptEngine engine = mScriptExecution.getEngine(); + if (engine != null) { + engine.forceStop(); + } } @Override public String getEngineName() { - ScriptSource source = (ScriptSource) mScriptEngine.getTag(ScriptEngine.TAG_SOURCE); - if (source == null) { - return null; - } - return source.getEngineName(); + return mScriptExecution.getSource().getEngineName(); } } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java index 2ff28001..a1aef3d6 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskGroup.java @@ -4,12 +4,15 @@ import android.content.Context; import com.bignerdranch.expandablerecyclerview.model.Parent; import com.stardust.autojs.engine.ScriptEngine; +import com.stardust.autojs.execution.ScriptExecution; + import org.autojs.autojs.R; import org.autojs.autojs.autojs.AutoJs; import org.autojs.autojs.timing.TimedTask; import org.autojs.autojs.timing.TimedTaskManager; import java.util.ArrayList; +import java.util.Collection; import java.util.List; import java.util.Set; @@ -98,20 +101,20 @@ public abstract class TaskGroup implements Parent { @Override public void refresh() { - Set scriptEngines = AutoJs.getInstance().getScriptEngineService().getEngines(); + Collection executions = AutoJs.getInstance().getScriptEngineService().getScriptExecutions(); mTasks.clear(); - for (ScriptEngine engine : scriptEngines) { - mTasks.add(new Task.RunningTask(engine)); + for (ScriptExecution execution : executions) { + mTasks.add(new Task.RunningTask(execution)); } } - public int addTask(ScriptEngine engine) { + public int addTask(ScriptExecution engine) { int pos = mTasks.size(); mTasks.add(new Task.RunningTask(engine)); return pos; } - public int removeTask(ScriptEngine engine) { + public int removeTask(ScriptExecution engine) { int i = indexOf(engine); if (i >= 0) { mTasks.remove(i); @@ -119,9 +122,9 @@ public abstract class TaskGroup implements Parent { return i; } - public int indexOf(ScriptEngine engine) { + public int indexOf(ScriptExecution engine) { for (int i = 0; i < mTasks.size(); i++) { - if (((Task.RunningTask) mTasks.get(i)).getScriptEngine().equals(engine)) { + if (((Task.RunningTask) mTasks.get(i)).getScriptExecution().equals(engine)) { return i; } } diff --git a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java index b716490f..3c9c7fe7 100644 --- a/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java +++ b/app/src/main/java/org/autojs/autojs/ui/main/task/TaskListRecyclerView.java @@ -12,6 +12,7 @@ import android.view.View; import android.view.ViewGroup; import android.widget.ImageView; import android.widget.TextView; + import com.stardust.autojs.workground.WrapContentLinearLayoutManager; import com.bignerdranch.expandablerecyclerview.ChildViewHolder; @@ -25,6 +26,7 @@ import com.stardust.autojs.execution.ScriptExecutionListener; import com.stardust.autojs.execution.SimpleScriptExecutionListener; import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.script.AutoFileSource; + import org.autojs.autojs.R; import org.autojs.autojs.autojs.AutoJs; import org.autojs.autojs.storage.database.ModelChange; @@ -32,6 +34,7 @@ import org.autojs.autojs.timing.TaskReceiver; import org.autojs.autojs.timing.TimedTask; import org.autojs.autojs.timing.TimedTaskManager; import org.autojs.autojs.ui.timing.TimedTaskSettingActivity_; + import com.yqritc.recyclerviewflexibledivider.HorizontalDividerItemDecoration; import java.util.ArrayList; @@ -47,7 +50,7 @@ import io.reactivex.disposables.Disposable; * Created by Stardust on 2017/3/24. */ -public class TaskListRecyclerView extends ThemeColorRecyclerView implements ScriptEngineManager.EngineLifecycleCallback { +public class TaskListRecyclerView extends ThemeColorRecyclerView { private static final String LOG_TAG = "TaskListRecyclerView"; @@ -61,15 +64,26 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri private ScriptExecutionListener mScriptExecutionListener = new SimpleScriptExecutionListener() { @Override public void onStart(final ScriptExecution execution) { - post(() -> { - int position = mRunningTaskGroup.indexOf(execution.getEngine()); - if (position >= 0) { - mAdapter.notifyChildChanged(0, position); - } else { - refresh(); - } - }); + mAdapter.notifyChildInserted(0, mRunningTaskGroup.addTask(execution)); + } + @Override + public void onSuccess(ScriptExecution execution, Object result) { + onFinish(execution); + } + + @Override + public void onException(ScriptExecution execution, Exception e) { + onFinish(execution); + } + + private void onFinish(ScriptExecution execution){ + final int i = mRunningTaskGroup.removeTask(execution); + if (i >= 0) { + mAdapter.notifyChildRemoved(0, i); + } else { + refresh(); + } } }; @@ -116,7 +130,6 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri @Override protected void onAttachedToWindow() { super.onAttachedToWindow(); - mScriptEngineService.registerEngineLifecycleCallback(this); AutoJs.getInstance().getScriptEngineService().registerGlobalScriptExecutionListener(mScriptExecutionListener); mTimedTaskChangeDisposable = TimedTaskManager.getInstance().getTimeTaskChanges() .observeOn(AndroidSchedulers.mainThread()) @@ -134,7 +147,6 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - mScriptEngineService.unregisterEngineLifecycleCallback(this); AutoJs.getInstance().getScriptEngineService().unregisterGlobalScriptExecutionListener(mScriptExecutionListener); mTimedTaskChangeDisposable.dispose(); } @@ -162,26 +174,6 @@ public class TaskListRecyclerView extends ThemeColorRecyclerView implements Scri } } - @Override - public void onEngineCreate(final ScriptEngine engine) { - post(() -> - mAdapter.notifyChildInserted(0, mRunningTaskGroup.addTask(engine)) - ); - } - - @Override - public void onEngineRemove(final ScriptEngine engine) { - post(() -> { - final int i = mRunningTaskGroup.removeTask(engine); - if (i >= 0) { - mAdapter.notifyChildRemoved(0, i); - } else { - refresh(); - } - - }); - } - private class Adapter extends ExpandableRecyclerAdapter { public Adapter(@NonNull List parentList) { diff --git a/app/src/main/res/layout/editor_view.xml b/app/src/main/res/layout/editor_view.xml index c1808bf7..29112e7c 100644 --- a/app/src/main/res/layout/editor_view.xml +++ b/app/src/main/res/layout/editor_view.xml @@ -19,89 +19,11 @@ android:title="@string/_app_name" app:popupTheme="@style/AppTheme.PopupOverlay"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:layout_gravity="right"/> diff --git a/app/src/main/res/layout/fragment_normal_toolbar.xml b/app/src/main/res/layout/fragment_normal_toolbar.xml new file mode 100644 index 00000000..a5ca5924 --- /dev/null +++ b/app/src/main/res/layout/fragment_normal_toolbar.xml @@ -0,0 +1,40 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/app/src/main/res/layout/fragment_search_toolbar.xml b/app/src/main/res/layout/fragment_search_toolbar.xml new file mode 100644 index 00000000..7c829637 --- /dev/null +++ b/app/src/main/res/layout/fragment_search_toolbar.xml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java index ffc41460..03c50b48 100644 --- a/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java +++ b/autojs/src/main/java/com/stardust/autojs/ScriptEngineService.java @@ -1,6 +1,7 @@ package com.stardust.autojs; import android.content.Context; +import android.support.annotation.Nullable; import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.ScriptEngine; @@ -30,6 +31,9 @@ import java.io.IOException; import java.io.PipedReader; import java.io.PipedWriter; import java.io.PrintWriter; +import java.util.Collection; +import java.util.Collections; +import java.util.LinkedHashMap; import java.util.LinkedHashSet; import java.util.Set; @@ -83,8 +87,16 @@ public class ScriptEngineService { private UiHandler mUiHandler; private final Console mGlobalConsole; private final ScriptEngineManager mScriptEngineManager; - private final EngineLifecycleObserver mEngineLifecycleObserver = new EngineLifecycleObserver(); + private final EngineLifecycleObserver mEngineLifecycleObserver = new EngineLifecycleObserver() { + + @Override + public void onEngineRemove(ScriptEngine engine) { + mScriptExecutions.remove(engine.getId()); + super.onEngineRemove(engine); + } + }; private ScriptExecutionObserver mScriptExecutionObserver = new ScriptExecutionObserver(); + private LinkedHashMap mScriptExecutions = new LinkedHashMap<>(); ScriptEngineService(ScriptEngineServiceBuilder builder) { mUiHandler = builder.mUiHandler; @@ -119,6 +131,12 @@ public class ScriptEngineService { } public ScriptExecution execute(ScriptExecutionTask task) { + ScriptExecution execution = executeInternal(task); + mScriptExecutions.put(execution.getId(), execution); + return execution; + } + + private ScriptExecution executeInternal(ScriptExecutionTask task) { if (task.getListener() != null) { task.setExecutionListener(new ScriptExecutionObserver.Wrapper(mScriptExecutionObserver, task.getListener())); } else { @@ -185,6 +203,18 @@ public class ScriptEngineService { return mScriptEngineManager.getEngines(); } + public Collection getScriptExecutions() { + return mScriptExecutions.values(); + } + + @Nullable + public ScriptExecution getScriptExecution(int id) { + if(id == ScriptExecution.NO_ID){ + return null; + } + return mScriptExecutions.get(id); + } + private static class EngineLifecycleObserver implements ScriptEngineManager.EngineLifecycleCallback { private final Set mEngineLifecycleCallbacks = new LinkedHashSet<>(); diff --git a/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java b/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java index 010a304e..ec08c4ac 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngine.java @@ -2,11 +2,13 @@ package com.stardust.autojs.engine; import android.support.annotation.CallSuper; +import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.script.ScriptSource; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; /** * Created by Stardust on 2017/4/2. @@ -46,6 +48,9 @@ public interface ScriptEngine { Exception getUncaughtException(); + void setId(int id); + + int getId(); /** * @hide @@ -68,7 +73,7 @@ public interface ScriptEngine { private OnDestroyListener mOnDestroyListener; private boolean mDestroyed = false; private Exception mUncaughtException; - + private volatile AtomicInteger mId = new AtomicInteger(ScriptExecution.NO_ID); @Override public synchronized void setTag(String key, Object value) { @@ -116,5 +121,15 @@ public interface ScriptEngine { public Exception getUncaughtException() { return mUncaughtException; } + + @Override + public void setId(int id) { + mId.compareAndSet(ScriptExecution.NO_ID, id); + } + + @Override + public int getId() { + return mId.get(); + } } } diff --git a/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngineProxy.java b/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngineProxy.java index d59e68ac..298b2323 100644 --- a/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngineProxy.java +++ b/autojs/src/main/java/com/stardust/autojs/engine/ScriptEngineProxy.java @@ -77,4 +77,14 @@ public class ScriptEngineProxy implements ScriptEngine