diff --git a/app/build.gradle b/app/build.gradle
index 793741b1..fa98bbfe 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -64,9 +64,7 @@ dependencies {
compile(name:'920-file_explorer-release', ext:'aar'){
transitive = true
}
- compile(name:'920-app-debug', ext:'aar'){
- transitive = true
- }
+ compile(name:'920-app-debug', ext:'aar')
}
diff --git a/app/libs/920-app-debug.aar b/app/libs/920-app-debug.aar
index aa73dbf9..7904d534 100644
Binary files a/app/libs/920-app-debug.aar and b/app/libs/920-app-debug.aar differ
diff --git a/app/libs/920-styles-debug.aar b/app/libs/920-styles-debug.aar
index 97afc95b..6633b951 100644
Binary files a/app/libs/920-styles-debug.aar and b/app/libs/920-styles-debug.aar differ
diff --git a/app/libs/920-styles-release.aar b/app/libs/920-styles-release.aar
new file mode 100644
index 00000000..aada017f
Binary files /dev/null and b/app/libs/920-styles-release.aar differ
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9385ba85..da1a281e 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -72,7 +72,9 @@
android:resource="@xml/provider_paths"/>
-
+
+
+
\ No newline at end of file
diff --git a/app/src/main/java/com/stardust/scriptdroid/EditActivity.java b/app/src/main/java/com/stardust/scriptdroid/EditActivity.java
new file mode 100644
index 00000000..94c29bf1
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/EditActivity.java
@@ -0,0 +1,287 @@
+package com.stardust.scriptdroid;
+
+import android.content.Context;
+import android.content.Intent;
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.design.widget.Snackbar;
+import android.support.v7.widget.Toolbar;
+import android.util.SparseArray;
+import android.view.View;
+
+import com.afollestad.materialdialogs.DialogAction;
+import com.afollestad.materialdialogs.MaterialDialog;
+import com.afollestad.materialdialogs.folderselector.FolderChooserDialog;
+import com.jecelyin.editor.v2.Pref;
+import com.jecelyin.editor.v2.common.Command;
+import com.jecelyin.editor.v2.common.SaveListener;
+import com.jecelyin.editor.v2.ui.EditorDelegate;
+import com.jecelyin.editor.v2.ui.IActivity;
+import com.jecelyin.editor.v2.ui.TabManager;
+import com.jecelyin.editor.v2.view.EditorView;
+import com.jecelyin.editor.v2.view.menu.MenuDef;
+import com.stardust.scriptdroid.droid.Droid;
+import com.stardust.scriptdroid.widget.ToolbarMenuItem;
+import com.stardust.util.SparseArrayEntries;
+
+import java.io.File;
+
+/**
+ * Created by Stardust on 2017/1/29.
+ */
+
+public class EditActivity extends IActivity {
+
+
+ public static void editFile(Context context, String path) {
+ editFile(context, null, path);
+ }
+
+ public static void editFile(Context context, String name, String path) {
+ context.startActivity(new Intent(context, EditActivity.class)
+ .putExtra("path", path)
+ .putExtra("name", name));
+ }
+
+ private String mName;
+ private File mFile;
+ private View mView;
+ private EditorDelegate mEditorDelegate;
+ private ToolbarMenuItem mSaveMenuItem, mRedoMenuItem, mUndoMenuItem, mRunMenuItem;
+ private SparseArray mMenuMap;
+
+ public void onCreate(Bundle b) {
+ super.onCreate(b);
+ handleIntent();
+ setUpUI();
+ setUpEditor();
+ }
+
+ private void setUpEditor() {
+ if (mFile != null) {
+ Pref.getInstance(this).setReadOnly(false);
+ mEditorDelegate = new EditorDelegate(0, mFile, 0, null);
+ EditorView editorView = (EditorView) findViewById(R.id.editor);
+ mEditorDelegate.setEditorView(editorView);
+ }
+ }
+
+ private void setUpUI() {
+ setTheme(R.style.EditorTheme);
+ mView = View.inflate(this, R.layout.activity_edit, null);
+ setContentView(mView);
+ initMenuItem();
+ setUpToolbar();
+ setUpListener();
+ }
+
+ private void initMenuItem() {
+ mRedoMenuItem = (ToolbarMenuItem) findViewById(R.id.redo);
+ mUndoMenuItem = (ToolbarMenuItem) findViewById(R.id.undo);
+ mSaveMenuItem = (ToolbarMenuItem) findViewById(R.id.save);
+ mRunMenuItem = (ToolbarMenuItem) findViewById(R.id.run);
+ mMenuMap = new SparseArrayEntries()
+ .entry(com.jecelyin.editor.v2.R.id.m_redo, mRedoMenuItem)
+ .entry(com.jecelyin.editor.v2.R.id.m_undo, mUndoMenuItem)
+ .entry(com.jecelyin.editor.v2.R.id.m_save, mSaveMenuItem)
+ .entry(R.id.run, mRunMenuItem)
+ .sparseArray();
+ }
+
+ private void setUpListener() {
+ mUndoMenuItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ undo();
+ }
+ });
+ mRedoMenuItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ redo();
+ }
+ });
+ mSaveMenuItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ saveFile(false, null);
+ }
+ });
+ mRunMenuItem.setOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ if (mEditorDelegate.isChanged()) {
+ saveFile(false, new SaveListener() {
+ @Override
+ public void onSaved() {
+ run();
+ }
+ });
+ } else {
+ run();
+ }
+
+ }
+ });
+ }
+
+ private void run() {
+ Snackbar.make(mView, "开始运行", Snackbar.LENGTH_SHORT).show();
+ setMenuStatus(R.id.run, MenuDef.STATUS_DISABLED);
+ Droid.getInstance().runScriptFile(mFile, new Droid.OnRunFinishedListener() {
+ @Override
+ public void onRunFinished(Object result, final Exception e) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ setMenuStatus(R.id.run, MenuDef.STATUS_NORMAL);
+ if (e != null)
+ Snackbar.make(mView, "错误: " + e.getMessage(), Snackbar.LENGTH_INDEFINITE).show();
+ }
+ });
+ }
+ });
+ }
+
+ private void handleIntent() {
+ String path = getIntent().getStringExtra("path");
+ mName = getIntent().getStringExtra("name");
+ if (path == null) {
+ finish();
+ } else {
+ mFile = new File(path);
+ if (mName == null) {
+ mName = mFile.getName();
+ }
+ }
+ }
+
+ private void setUpToolbar() {
+ Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
+ toolbar.setTitle(mName);
+ setSupportActionBar(toolbar);
+ if (getSupportActionBar() != null) {
+ toolbar.setNavigationOnClickListener(new View.OnClickListener() {
+ @Override
+ public void onClick(View v) {
+ finish();
+ }
+ });
+ getSupportActionBar().setDisplayHomeAsUpEnabled(true);
+ }
+ }
+
+ private void saveFile(boolean toast, SaveListener listener) {
+ Command command = new Command(Command.CommandEnum.SAVE);
+ command.args = new Bundle();
+ command.args.putBoolean("is_cluster", !toast);
+ command.object = listener;
+ mEditorDelegate.doCommand(command);
+ }
+
+ private void undo() {
+ Command command = new Command(Command.CommandEnum.UNDO);
+ mEditorDelegate.doCommand(command);
+ }
+
+ private void redo() {
+ Command command = new Command(Command.CommandEnum.REDO);
+ mEditorDelegate.doCommand(command);
+ }
+
+ @Override
+ public void startPickPathActivity(String s, String s1) {
+
+ }
+
+ @Override
+ public void finish() {
+ if (mEditorDelegate.isChanged()) {
+ showExitConfirmDialog();
+ } else {
+ super.finish();
+ }
+ }
+
+ private void showExitConfirmDialog() {
+ new MaterialDialog.Builder(this)
+ .title(R.string.text_alert)
+ .content(R.string.edit_exit_without_save_warn)
+ .positiveText(R.string.text_cancel)
+ .negativeText(R.string.text_save_and_exit)
+ .neutralText(R.string.text_exit_directly )
+ .onNegative(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ saveFile(true, null);
+ EditActivity.super.finish();
+ }
+ })
+ .onNeutral(new MaterialDialog.SingleButtonCallback() {
+ @Override
+ public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
+ EditActivity.super.finish();
+ }
+ })
+ .show();
+ }
+
+ @Override
+ public void doNextCommand() {
+
+ }
+
+
+ public void setMenuStatus(int menuResId, int status) {
+ ToolbarMenuItem menuItem = mMenuMap.get(menuResId);
+ if (menuItem == null)
+ return;
+ boolean disabled = status == MenuDef.STATUS_DISABLED;
+ menuItem.setEnabled(!disabled);
+ }
+
+
+ @Override
+ public void onDocumentChanged(int i) {
+
+ }
+
+ @Override
+ public void doCommand(Command command) {
+
+ }
+
+ @Override
+ public void openFile(String s, String s1, int i) {
+
+ }
+
+ @Override
+ public void setFindFolderCallback(FolderChooserDialog.FolderCallback folderCallback) {
+
+ }
+
+ @Override
+ public TabManager getTabManager() {
+ return null;
+ }
+
+ @Override
+ public void insertText(CharSequence charSequence) {
+
+ }
+
+ @Override
+ public void onFolderSelection(@NonNull FolderChooserDialog dialog, @NonNull File folder) {
+
+ }
+
+ protected void onDestroy() {
+ try {
+ super.onDestroy();
+ } catch (Exception ignored) {
+
+ }
+ }
+
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/MainActivity.java
index 212e35b0..4a1f081f 100644
--- a/app/src/main/java/com/stardust/scriptdroid/MainActivity.java
+++ b/app/src/main/java/com/stardust/scriptdroid/MainActivity.java
@@ -3,9 +3,12 @@ package com.stardust.scriptdroid;
import android.Manifest;
import android.content.ActivityNotFoundException;
import android.content.Intent;
+import android.os.Build;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
+import android.support.v4.widget.DrawerLayout;
+import android.support.v7.app.ActionBarDrawerToggle;
import android.support.v7.widget.Toolbar;
import android.text.InputType;
import android.view.Menu;
@@ -14,7 +17,6 @@ import android.view.View;
import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;
-import com.jecelyin.editor.v2.core.widget.JecEditText;
import com.stardust.scriptdroid.droid.runtime.action.ActionPerformService;
import com.stardust.scriptdroid.droid.script.file.ScriptFile;
import com.stardust.scriptdroid.droid.script.file.ScriptFileList;
@@ -38,6 +40,7 @@ public class MainActivity extends BaseActivity {
private ScriptListRecyclerView mScriptListRecyclerView;
private ScriptFileList mScriptFileList;
private FileChooser mFileChooser;
+ private DrawerLayout mDrawerLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
@@ -48,22 +51,17 @@ public class MainActivity extends BaseActivity {
setUpFileChooser();
checkPermissions();
-
- }
-
- public void onStart() {
- super.onStart();
}
private void checkPermissions() {
checkPermission(Manifest.permission.READ_EXTERNAL_STORAGE);
goToAccessibilityPermissionSettingIfDisabled();
- JecEditText jecEditText = new JecEditText(this);
}
private void goToAccessibilityPermissionSettingIfDisabled() {
if (!AccessibilityServiceUtils.isAccessibilityServiceEnabled(this, ActionPerformService.class)) {
new MaterialDialog.Builder(this)
+ .title(R.string.text_alert)
.content(R.string.explain_accessibility_permission)
.positiveText(R.string.text_go_to_setting)
.negativeText(R.string.text_cancel)
@@ -110,6 +108,7 @@ public class MainActivity extends BaseActivity {
mView = View.inflate(this, R.layout.activity_main, null);
setContentView(mView);
mSlidingUpPanel = $(R.id.bottom_menu);
+ mDrawerLayout = $(R.id.drawer_layout);
setUpToolbar();
setUpScriptList();
@@ -119,8 +118,12 @@ public class MainActivity extends BaseActivity {
private void setUpToolbar() {
Toolbar toolbar = $(R.id.toolbar);
setSupportActionBar(toolbar);
- toolbar.setNavigationIcon(R.drawable.ic_script_droid_40);
toolbar.setTitle(R.string.app_name);
+
+ ActionBarDrawerToggle drawerToggle = new ActionBarDrawerToggle(this, mDrawerLayout, toolbar, R.string.text_drawer_open,
+ R.string.text_drawer_close);
+ drawerToggle.syncState();
+ mDrawerLayout.addDrawerListener(drawerToggle);
}
private void setUpScriptList() {
@@ -204,7 +207,7 @@ public class MainActivity extends BaseActivity {
.entry(R.id.action_test, new Runnable() {
@Override
public void run() {
- startActivity(new Intent(MainActivity.this, TestActivity.class));
+ startActivity(new Intent(MainActivity.this, EditActivity.class));
}
})
.map();
@@ -216,7 +219,7 @@ public class MainActivity extends BaseActivity {
}
private void disableAccessibilityService() {
- if (ActionPerformService.getInstance() != null) {
+ if (ActionPerformService.getInstance() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
ActionPerformService.getInstance().disableSelf();
}
Snackbar.make(mView, R.string.text_service_disabled, Snackbar.LENGTH_SHORT).show();
diff --git a/app/src/main/java/com/stardust/scriptdroid/TestActivity.java b/app/src/main/java/com/stardust/scriptdroid/TestActivity.java
deleted file mode 100644
index 0b6a4c24..00000000
--- a/app/src/main/java/com/stardust/scriptdroid/TestActivity.java
+++ /dev/null
@@ -1,61 +0,0 @@
-package com.stardust.scriptdroid;
-
-import android.os.Bundle;
-
-import com.jecelyin.editor.v2.Pref;
-import com.jecelyin.editor.v2.common.Command;
-import com.jecelyin.editor.v2.ui.EditorDelegate;
-import com.jecelyin.editor.v2.ui.IActivity;
-import com.jecelyin.editor.v2.ui.TabManager;
-import com.jecelyin.editor.v2.view.EditorView;
-
-/**
- * Created by Stardust on 2017/1/29.
- */
-
-public class TestActivity extends BaseActivity implements IActivity{
-
- public void onCreate(Bundle b) {
- super.onCreate(b);
- Pref.getInstance(this).setTheme(0);
- setContentView(R.layout.edit_layout);
- EditorDelegate editorDelegate = new EditorDelegate(0, "Hello 920 Editor", "Hello 920");
- EditorView editorView = $(R.id.editor);
- editorDelegate.setEditorView(editorView);
- }
-
- @Override
- public void startPickPathActivity(String s, String s1) {
-
- }
-
- @Override
- public void doNextCommand() {
-
- }
-
- @Override
- public TabManager getTabManager() {
- return null;
- }
-
- @Override
- public void setMenuStatus(int i, int i1) {
-
- }
-
- @Override
- public void onDocumentChanged(int i) {
-
- }
-
- @Override
- public void doCommand(Command command) {
-
- }
-
- @Override
- public void openFile(String s, String s1, int i) {
-
- }
-}
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java b/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
index e575b6f9..8f963f0e 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/Droid.java
@@ -14,8 +14,20 @@ import java.io.FileNotFoundException;
public class Droid {
+ public interface OnRunFinishedListener {
+ void onRunFinished(Object result, Exception e);
+ }
+
private static final DroidRuntime RUNTIME = DroidRuntime.getRuntime();
private static final JavaScriptEngine JAVA_SCRIPT_ENGINE = new GBJDuktapeJavaScriptEngine(RUNTIME);
+ private static final OnRunFinishedListener DEFAULT_LISTENER = new OnRunFinishedListener() {
+ @Override
+ public void onRunFinished(Object result, Exception e) {
+ if (e != null) {
+ RUNTIME.toast("错误: " + e.getMessage());
+ }
+ }
+ };
private static Droid instance = new Droid();
protected Droid() {
@@ -31,18 +43,30 @@ public class Droid {
runScript(FileUtils.readString(file));
}
+ public void runScriptFile(File file, OnRunFinishedListener listener) {
+ checkFile(file);
+ runScript(FileUtils.readString(file), listener);
+ }
+
+ private void runScript(String script) {
+ runScript(script, null);
+ }
+
public void runScriptFile(String path) {
runScriptFile(new File(path));
}
- public void runScript(final String script) {
+ public void runScript(final String script, OnRunFinishedListener listener) {
+ if (listener == null)
+ listener = DEFAULT_LISTENER;
+ final OnRunFinishedListener finalListener = listener;
new Thread(new Runnable() {
@Override
public void run() {
try {
- JAVA_SCRIPT_ENGINE.execute(script);
+ finalListener.onRunFinished(JAVA_SCRIPT_ENGINE.execute(script), null);
} catch (Exception e) {
- RUNTIME.toast("错误" + e.getMessage());
+ finalListener.onRunFinished(null, e);
}
}
}).start();
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java
index 4aa261e6..57947200 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/DroidRuntime.java
@@ -9,6 +9,7 @@ import android.view.accessibility.AccessibilityNodeInfo;
import android.widget.Toast;
import com.stardust.scriptdroid.App;
+import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.droid.runtime.action.Action;
import com.stardust.scriptdroid.droid.runtime.action.ActionFactory;
import com.stardust.scriptdroid.droid.runtime.action.ActionPerformService;
@@ -101,11 +102,11 @@ public class DroidRuntime implements IDroidRuntime {
return performAction(target.createAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD));
}
- public boolean scrollAllUp(){
+ public boolean scrollAllUp() {
return performAction(ActionFactory.createScrollAllAction(AccessibilityNodeInfo.ACTION_SCROLL_BACKWARD));
}
- public boolean scrollAllDown(){
+ public boolean scrollAllDown() {
return performAction(ActionFactory.createScrollAllAction(AccessibilityNodeInfo.ACTION_SCROLL_FORWARD));
}
@@ -132,8 +133,8 @@ public class DroidRuntime implements IDroidRuntime {
private boolean performAction(Action action) {
if (ActionPerformService.getInstance() == null) {
- toast("没有权限");
- return false;
+ toast(App.getApp().getString(R.string.text_no_accessibility_permission));
+ throw new PermissionDeniedException(App.getApp().getString(R.string.text_no_accessibility_permission));
}
ActionPerformService.setAction(action);
synchronized (mLock) {
@@ -159,7 +160,7 @@ public class DroidRuntime implements IDroidRuntime {
@Override
public void sleep(long millis) {
- try{
+ try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/runtime/PermissionDeniedException.java b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/PermissionDeniedException.java
new file mode 100644
index 00000000..cea2ac8e
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/runtime/PermissionDeniedException.java
@@ -0,0 +1,10 @@
+package com.stardust.scriptdroid.droid.runtime;
+
+/**
+ * Created by Stardust on 2017/1/29.
+ */
+public class PermissionDeniedException extends RuntimeException {
+ public PermissionDeniedException(String message) {
+ super(message);
+ }
+}
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java b/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java
index 59b04fa8..6f177331 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/script/DuktapeJavaScriptEngine.java
@@ -30,8 +30,8 @@ public class DuktapeJavaScriptEngine implements JavaScriptEngine {
@Override
- public void execute(String script) {
- mDuktape.evaluate(script);
+ public Object execute(String script) {
+ return mDuktape.evaluate(script);
}
public void set(String varName, Class c, T value) {
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java b/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java
index 884e45a2..b87ab208 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/script/GBJDuktapeJavaScriptEngine.java
@@ -22,7 +22,11 @@ public class GBJDuktapeJavaScriptEngine implements JavaScriptEngine {
public GBJDuktapeJavaScriptEngine(IDroidRuntime runtime) {
setRuntime(runtime);
mDuktapeEngine.put("context", App.getApp());
- execute(init);
+ try {
+ execute(init);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
private void setRuntime(IDroidRuntime runtime) {
@@ -30,12 +34,8 @@ public class GBJDuktapeJavaScriptEngine implements JavaScriptEngine {
}
@Override
- public void execute(String script) {
- try {
- mDuktapeEngine.execute(JSTransformer.parse(new StringReader(script)));
- } catch (IOException e) {
- e.printStackTrace();
- }
+ public Object execute(String script) throws IOException {
+ return mDuktapeEngine.execute(JSTransformer.parse(new StringReader(script)));
}
@Override
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/script/JavaScriptEngine.java b/app/src/main/java/com/stardust/scriptdroid/droid/script/JavaScriptEngine.java
index 53bce244..64baf1ea 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/script/JavaScriptEngine.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/script/JavaScriptEngine.java
@@ -3,13 +3,15 @@ package com.stardust.scriptdroid.droid.script;
import com.stardust.scriptdroid.App;
import com.stardust.scriptdroid.droid.script.file.AssetScript;
+import java.io.IOException;
+
/**
* Created by Stardust on 2017/1/27.
*/
public interface JavaScriptEngine {
- void execute(String script);
+ Object execute(String script) throws IOException;
void set(String varName, Class c, T value);
diff --git a/app/src/main/java/com/stardust/scriptdroid/droid/script/file/ScriptFile.java b/app/src/main/java/com/stardust/scriptdroid/droid/script/file/ScriptFile.java
index e5c9ff97..6d6c2690 100644
--- a/app/src/main/java/com/stardust/scriptdroid/droid/script/file/ScriptFile.java
+++ b/app/src/main/java/com/stardust/scriptdroid/droid/script/file/ScriptFile.java
@@ -23,7 +23,7 @@ public class ScriptFile {
this.path = path;
}
- public void run(Context context) {
+ public void run() {
Droid.getInstance().runScriptFile(toFile());
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java b/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java
index 8d21a3bd..eadd7ca2 100644
--- a/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java
+++ b/app/src/main/java/com/stardust/scriptdroid/ui/ScriptListRecyclerView.java
@@ -167,7 +167,7 @@ public class ScriptListRecyclerView extends RecyclerView {
}
private static void loadScriptFileOperations() {
- ClassTool.loadClasses(Run.class, Edit.class, Rename.class, CreateShortcut.class, Remove.class, Delete.class);
+ ClassTool.loadClasses(Run.class, Rename.class, OpenByOtherApp.class, CreateShortcut.class, Remove.class, Delete.class);
}
}
diff --git a/app/src/main/java/com/stardust/scriptdroid/widget/ToolbarMenuItem.java b/app/src/main/java/com/stardust/scriptdroid/widget/ToolbarMenuItem.java
new file mode 100644
index 00000000..d4cee21b
--- /dev/null
+++ b/app/src/main/java/com/stardust/scriptdroid/widget/ToolbarMenuItem.java
@@ -0,0 +1,90 @@
+package com.stardust.scriptdroid.widget;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.content.res.TypedArray;
+import android.graphics.Color;
+import android.graphics.PorterDuff;
+import android.graphics.drawable.Drawable;
+import android.os.Build;
+import android.util.AttributeSet;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.stardust.scriptdroid.R;
+
+/**
+ * Created by Stardust on 2017/1/29.
+ */
+
+public class ToolbarMenuItem extends LinearLayout {
+
+ private static final int COLOR_DISABLED = 0X77e0e0e0;
+ private ImageView mImageView;
+ private TextView mTextView;
+ private Drawable mEnabledDrawable, mDisabledDrawable;
+
+ public ToolbarMenuItem(Context context, AttributeSet attrs) {
+ super(context, attrs);
+ init(attrs);
+ }
+
+ public ToolbarMenuItem(Context context, AttributeSet attrs, int defStyleAttr) {
+ super(context, attrs, defStyleAttr);
+ init(attrs);
+ }
+
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ public ToolbarMenuItem(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
+ super(context, attrs, defStyleAttr, defStyleRes);
+ init(attrs);
+ }
+
+ private void init(AttributeSet attrs) {
+ inflate(getContext(), R.layout.toolbar_menu_item, this);
+ TypedArray a = getContext().obtainStyledAttributes(attrs, R.styleable.ToolbarMenuItem);
+ String text = a.getString(R.styleable.ToolbarMenuItem_text);
+ int iconResId = a.getResourceId(R.styleable.ToolbarMenuItem_icon, 0);
+ int iconColor = a.getColor(R.styleable.ToolbarMenuItem_icon_color, Color.TRANSPARENT);
+ a.recycle();
+ mImageView = (ImageView) findViewById(R.id.icon);
+ mTextView = (TextView) findViewById(R.id.text);
+ mTextView.setText(text);
+ mImageView.setImageResource(iconResId);
+ if (iconColor != Color.TRANSPARENT) {
+ mImageView.setImageDrawable(convertDrawableToGrayScale(mImageView.getDrawable(), iconColor));
+ }
+ }
+
+ @Override
+ public void setEnabled(boolean enabled) {
+ if (enabled == isEnabled())
+ return;
+ super.setEnabled(enabled);
+ ensureEnabledDrawable();
+ ensureDisabledDrawable();
+ mImageView.setImageDrawable(enabled ? mEnabledDrawable : mDisabledDrawable);
+ mTextView.setTextColor(enabled ? Color.WHITE : COLOR_DISABLED);
+ }
+
+ private void ensureDisabledDrawable() {
+ if (mDisabledDrawable == null) {
+ mDisabledDrawable = convertDrawableToGrayScale(mEnabledDrawable, COLOR_DISABLED);
+ }
+ }
+
+ private void ensureEnabledDrawable() {
+ if (mEnabledDrawable == null) {
+ mEnabledDrawable = mImageView.getDrawable();
+ }
+ }
+
+ public static Drawable convertDrawableToGrayScale(Drawable drawable, int color) {
+ if (drawable == null || drawable.getConstantState() == null)
+ return null;
+ Drawable res = drawable.getConstantState().newDrawable().mutate();
+ res.setColorFilter(color, PorterDuff.Mode.SRC_IN);
+ return res;
+ }
+}
diff --git a/app/src/main/res/drawable/ic_open_in_new_green_48dp.png b/app/src/main/res/drawable/ic_open_in_new_green_48dp.png
new file mode 100644
index 00000000..e006ffe3
Binary files /dev/null and b/app/src/main/res/drawable/ic_open_in_new_green_48dp.png differ
diff --git a/app/src/main/res/drawable/ic_play_arrow_green_48dp.png b/app/src/main/res/drawable/ic_play_arrow_green_48dp.png
new file mode 100644
index 00000000..8c018dcc
Binary files /dev/null and b/app/src/main/res/drawable/ic_play_arrow_green_48dp.png differ
diff --git a/app/src/main/res/drawable/ic_play_arrow_white_48dp.png b/app/src/main/res/drawable/ic_play_arrow_white_48dp.png
new file mode 100644
index 00000000..a3c80e73
Binary files /dev/null and b/app/src/main/res/drawable/ic_play_arrow_white_48dp.png differ
diff --git a/app/src/main/res/drawable/ic_redo_white_48dp.png b/app/src/main/res/drawable/ic_redo_white_48dp.png
new file mode 100644
index 00000000..0be14803
Binary files /dev/null and b/app/src/main/res/drawable/ic_redo_white_48dp.png differ
diff --git a/app/src/main/res/drawable/ic_save_white_48dp.png b/app/src/main/res/drawable/ic_save_white_48dp.png
new file mode 100644
index 00000000..adda0957
Binary files /dev/null and b/app/src/main/res/drawable/ic_save_white_48dp.png differ
diff --git a/app/src/main/res/drawable/ic_undo_white_48dp.png b/app/src/main/res/drawable/ic_undo_white_48dp.png
new file mode 100644
index 00000000..c4c28d0a
Binary files /dev/null and b/app/src/main/res/drawable/ic_undo_white_48dp.png differ
diff --git a/app/src/main/res/drawable/slide_menu_img.png b/app/src/main/res/drawable/slide_menu_img.png
new file mode 100644
index 00000000..4f4fc654
Binary files /dev/null and b/app/src/main/res/drawable/slide_menu_img.png differ
diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml
new file mode 100644
index 00000000..ad4ad5a0
--- /dev/null
+++ b/app/src/main/res/layout/activity_edit.xml
@@ -0,0 +1,67 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 2c90e0f3..c4160dc2 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -1,97 +1,110 @@
-
+
-
-
-
-
-
-
-
-
-
-
+ android:layout_height="wrap_content"
+ android:theme="@style/AppTheme.AppBarOverlay">
+
+
+
+
+
+
+
+
+ android:orientation="horizontal">
-
-
+ android:orientation="vertical">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
+
-
-
-
-
-
-
-
-
-
diff --git a/app/src/main/res/layout/edit_layout.xml b/app/src/main/res/layout/content_edit.xml
similarity index 85%
rename from app/src/main/res/layout/edit_layout.xml
rename to app/src/main/res/layout/content_edit.xml
index e8c2daff..0d4787fd 100644
--- a/app/src/main/res/layout/edit_layout.xml
+++ b/app/src/main/res/layout/content_edit.xml
@@ -1,14 +1,18 @@
+ android:orientation="vertical"
+ tools:showIn="@layout/activity_edit">
+ android:layout_height="match_parent"
+ android:paddingTop="?android:attr/actionBarSize">
+
diff --git a/app/src/main/res/layout/slide_menu.xml b/app/src/main/res/layout/slide_menu.xml
new file mode 100644
index 00000000..9ffd009a
--- /dev/null
+++ b/app/src/main/res/layout/slide_menu.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/layout/toolbar_menu_item.xml b/app/src/main/res/layout/toolbar_menu_item.xml
new file mode 100644
index 00000000..7a7b1513
--- /dev/null
+++ b/app/src/main/res/layout/toolbar_menu_item.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/app/src/main/res/menu/menu_editor.xml b/app/src/main/res/menu/menu_editor.xml
new file mode 100644
index 00000000..91d0934f
--- /dev/null
+++ b/app/src/main/res/menu/menu_editor.xml
@@ -0,0 +1,26 @@
+
+
\ No newline at end of file
diff --git a/app/src/main/res/values/attrs.xml b/app/src/main/res/values/attrs.xml
index 9ee8f7d7..94f0073d 100644
--- a/app/src/main/res/values/attrs.xml
+++ b/app/src/main/res/values/attrs.xml
@@ -1,6 +1,47 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
4dp
@@ -12,7 +53,33 @@
0dp
0dp
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index f7f31270..0573ae1e 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -18,4 +18,15 @@
文件不存在
无文件读写权限
内嵌920测试
+ 辅助性服务未启动
+ 关闭侧拉菜单
+ 打开侧拉菜单
+ 撤销
+ 重做
+ 保存
+ 运行
+ 提示
+ 内容尚未保存,您确定要退出吗?
+ 保存并退出
+ 直接退出
diff --git a/app/src/main/res/values/theme_editor.xml b/app/src/main/res/values/theme_editor.xml
new file mode 100644
index 00000000..8451d599
--- /dev/null
+++ b/app/src/main/res/values/theme_editor.xml
@@ -0,0 +1,85 @@
+
+
+ #009688
+
+
+
+
+
\ No newline at end of file