diff --git a/.idea/caches/build_file_checksums.ser b/.idea/caches/build_file_checksums.ser index bf0552a3..8b8733f2 100644 Binary files a/.idea/caches/build_file_checksums.ser and b/.idea/caches/build_file_checksums.ser differ diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java index 4751adef..e751d2ab 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditActivity.java @@ -12,6 +12,7 @@ import com.stardust.app.OnActivityResultDelegate; import com.stardust.autojs.core.permission.OnRequestPermissionsResultCallback; import com.stardust.autojs.core.permission.PermissionRequestProxyActivity; import com.stardust.autojs.core.permission.RequestPermissionCallbacks; +import com.stardust.autojs.execution.ScriptExecution; import com.stardust.pio.PFiles; import org.autojs.autojs.R; @@ -91,6 +92,13 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega return mEditorMenu.onOptionsItemSelected(item); } + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + boolean isScriptRunning = mEditorView.getScriptExecutionId() != ScriptExecution.NO_ID; + MenuItem forceStopItem = menu.findItem(R.id.action_force_stop); + forceStopItem.setEnabled(isScriptRunning); + return super.onPrepareOptionsMenu(menu); + } @Override public void onActionModeStarted(ActionMode mode) { diff --git a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java index 67e3fcce..46b0489a 100644 --- a/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java +++ b/app/src/main/java/org/autojs/autojs/ui/edit/EditorView.java @@ -1,12 +1,17 @@ package org.autojs.autojs.ui.edit; +import android.annotation.SuppressLint; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; +import android.content.ContextWrapper; import android.content.Intent; import android.content.IntentFilter; +import android.os.Bundle; +import android.os.Parcelable; import android.support.annotation.Nullable; import android.support.design.widget.Snackbar; +import android.support.v4.app.FragmentActivity; import android.support.v4.widget.DrawerLayout; import android.text.TextUtils; import android.util.AttributeSet; @@ -18,36 +23,41 @@ import android.widget.Toast; import com.afollestad.materialdialogs.MaterialDialog; import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.execution.ScriptExecution; import com.stardust.pio.PFiles; +import com.stardust.util.BackPressedHandler; +import com.stardust.util.Callback; +import com.stardust.util.ViewUtils; + +import org.androidannotations.annotations.AfterViews; +import org.androidannotations.annotations.EViewGroup; +import org.androidannotations.annotations.ViewById; import org.autojs.autojs.Pref; import org.autojs.autojs.R; +import org.autojs.autojs.autojs.AutoJs; import org.autojs.autojs.model.autocomplete.AutoCompletion; import org.autojs.autojs.model.autocomplete.CodeCompletion; +import org.autojs.autojs.model.autocomplete.CodeCompletions; +import org.autojs.autojs.model.autocomplete.Symbols; import org.autojs.autojs.model.indices.Module; import org.autojs.autojs.model.indices.Property; import org.autojs.autojs.model.script.Scripts; import org.autojs.autojs.ui.doc.ManualDialog; -import org.autojs.autojs.model.autocomplete.CodeCompletions; import org.autojs.autojs.ui.edit.completion.CodeCompletionBar; -import org.autojs.autojs.model.autocomplete.Symbols; import org.autojs.autojs.ui.edit.editor.CodeEditor; import org.autojs.autojs.ui.edit.keyboard.FunctionsKeyboardHelper; import org.autojs.autojs.ui.edit.keyboard.FunctionsKeyboardView; import org.autojs.autojs.ui.edit.theme.Theme; import org.autojs.autojs.ui.edit.theme.Themes; +import org.autojs.autojs.ui.edit.toolbar.NormalToolbarFragment; +import org.autojs.autojs.ui.edit.toolbar.NormalToolbarFragment_; +import org.autojs.autojs.ui.edit.toolbar.SearchToolbarFragment; +import org.autojs.autojs.ui.edit.toolbar.SearchToolbarFragment_; +import org.autojs.autojs.ui.edit.toolbar.ToolbarFragment; import org.autojs.autojs.ui.log.LogActivity_; import org.autojs.autojs.ui.widget.EWebView; import org.autojs.autojs.ui.widget.SimpleTextWatcher; -import org.autojs.autojs.ui.widget.ToolbarMenuItem; -import com.stardust.util.BackPressedHandler; -import com.stardust.util.ViewUtils; -import com.stardust.widget.ViewSwitcher; - -import org.androidannotations.annotations.AfterViews; -import org.androidannotations.annotations.Click; -import org.androidannotations.annotations.EViewGroup; -import org.androidannotations.annotations.ViewById; import java.io.File; import java.util.List; @@ -62,7 +72,7 @@ import static org.autojs.autojs.model.script.Scripts.ACTION_ON_EXECUTION_FINISHE * Created by Stardust on 2017/9/28. */ @EViewGroup(R.layout.editor_view) -public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintClickListener, FunctionsKeyboardView.ClickCallback { +public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintClickListener, FunctionsKeyboardView.ClickCallback, ToolbarFragment.OnMenuItemClickListener { public static final String EXTRA_PATH = "path"; public static final String EXTRA_NAME = "name"; @@ -77,12 +87,6 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC @ViewById(R.id.code_completion_bar) CodeCompletionBar mCodeCompletionBar; - @ViewById(R.id.toolbar_switcher) - ViewSwitcher mToolbarSwitcher; - - @ViewById(R.id.replace) - ToolbarMenuItem mReplaceMenuItem; - @ViewById(R.id.input_method_enhance_bar) View mInputMethodEnhanceBar; @@ -104,7 +108,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC private String mName; private File mFile; private boolean mReadOnly = false; - private ScriptExecution mScriptExecution; + private int mScriptExecutionId; private AutoCompletion mAutoCompletion; private Theme mEditorTheme; private FunctionsKeyboardHelper mFunctionsKeyboardHelper; @@ -112,7 +116,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC @Override public void onReceive(Context context, Intent intent) { if (ACTION_ON_EXECUTION_FINISHED.equals(intent.getAction())) { - mScriptExecution = null; + mScriptExecutionId = ScriptExecution.NO_ID; setMenuItemStatus(R.id.run, true); String msg = intent.getStringExtra(Scripts.EXTRA_EXCEPTION_MESSAGE); int line = intent.getIntExtra(Scripts.EXTRA_EXCEPTION_LINE_NUMBER, -1); @@ -127,6 +131,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } }; private String mRestoredText; + private NormalToolbarFragment mNormalToolbar = new NormalToolbarFragment_(); public EditorView(Context context) { super(context); @@ -199,6 +204,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } + @SuppressLint("CheckResult") private void loadFile(final File file) { mEditor.setProgress(true); Observable.fromCallable(() -> 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