diff --git a/app/build.gradle b/app/build.gradle index b3511299..a5498ff0 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -9,8 +9,8 @@ android { applicationId "com.stardust.scriptdroid" minSdkVersion 17 targetSdkVersion 23 - versionCode 203 - versionName "3.0.0 Alpha4" + versionCode 204 + versionName "3.0.0 Alpha5" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" multiDexEnabled true ndk { diff --git a/app/libs/920-app-debug.aar b/app/libs/920-app-debug.aar deleted file mode 100644 index 8e62ad84..00000000 Binary files a/app/libs/920-app-debug.aar and /dev/null differ diff --git a/app/libs/920-common-release.aar b/app/libs/920-common-release.aar deleted file mode 100644 index d2e091b6..00000000 Binary files a/app/libs/920-common-release.aar and /dev/null differ diff --git a/app/libs/920-file_explorer-release.aar b/app/libs/920-file_explorer-release.aar deleted file mode 100644 index cd7f9361..00000000 Binary files a/app/libs/920-file_explorer-release.aar and /dev/null differ diff --git a/app/libs/920-styles-release.aar b/app/libs/920-styles-release.aar deleted file mode 100644 index 2c4cb56d..00000000 Binary files a/app/libs/920-styles-release.aar and /dev/null differ diff --git a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java index 2fe00588..a4edbc11 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskPrefEditActivity.java @@ -21,6 +21,9 @@ import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT; + + /** * Created by Stardust on 2017/3/27. */ @@ -115,7 +118,7 @@ public class TaskPrefEditActivity extends AbstractAppCompatPluginActivity { @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { if (resultCode == RESULT_OK) { - mPreExecuteScript = data.getStringExtra(TaskerScriptEditActivity.EXTRA_CONTENT); + mPreExecuteScript = data.getStringExtra(EXTRA_CONTENT); } } } diff --git a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskerScriptEditActivity.java b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskerScriptEditActivity.java index 27e620a5..e25fed9a 100644 --- a/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskerScriptEditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/external/tasker/TaskerScriptEditActivity.java @@ -9,6 +9,7 @@ import android.widget.TextView; import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.ui.BaseActivity; +import com.stardust.scriptdroid.ui.edit.EditorView; import com.stardust.theme.ThemeColorManager; import com.stardust.widget.ToolbarMenuItem; @@ -16,59 +17,50 @@ import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; +import io.reactivex.annotations.NonNull; +import io.reactivex.functions.Consumer; + +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_RUN_ENABLED; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_SAVE_ENABLED; + /** * Created by Stardust on 2017/4/5. */ @EActivity(R.layout.activity_tasker_script_edit) -public class TaskerScriptEditActivity extends AppCompatActivity { +public class TaskerScriptEditActivity extends BaseActivity { public static final int REQUEST_CODE = "Love you. Can we go back?".hashCode() >> 16; - public static final String EXTRA_CONTENT = "Still Love Eating 17.4.5"; public static void edit(Activity activity, String title, String summary, String content) { activity.startActivityForResult(new Intent(activity, TaskerScriptEditActivity_.class) .putExtra(EXTRA_CONTENT, content) .putExtra("summary", summary) - .putExtra("title", title), REQUEST_CODE); + .putExtra(EXTRA_NAME, title), REQUEST_CODE); } - private String mTitle, mSummary; - @ViewById(R.id.redo) - ToolbarMenuItem mRedo; - @ViewById(R.id.undo) - ToolbarMenuItem mUndo; - - @Override - protected void onCreate(@Nullable Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - // setTheme(R.style.EditorTheme); - handleIntent(getIntent()); - } + @ViewById(R.id.editor_view) + EditorView mEditorView; @AfterViews void setUpViews() { - ((TextView) findViewById(R.id.summary)).setText(mSummary); - ThemeColorManager.addActivityStatusBar(this); - BaseActivity.setToolbarAsBack(this, R.id.toolbar, mTitle); - setUpEditor(); + mEditorView.handleIntent(getIntent() + .putExtra(EXTRA_RUN_ENABLED, false) + .putExtra(EXTRA_SAVE_ENABLED, false)); + BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName()); } - private void handleIntent(Intent intent) { - mTitle = intent.getStringExtra("title"); - mSummary = intent.getStringExtra("summary"); - String content = intent.getStringExtra(EXTRA_CONTENT); - } - - private void setUpEditor() { - - } @Override public void finish() { - super.finish(); + mEditorView.getEditor().getText().subscribe(new Consumer() { + @Override + public void accept(@NonNull String s) throws Exception { + setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, s)); + TaskerScriptEditActivity.super.finish(); + } + }); } - public void setMenuStatus(int menuResId, int status) { - - } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java index c8102d3d..297c9336 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/BaseActivity.java @@ -26,11 +26,10 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED; * Created by Stardust on 2017/1/23. */ -public abstract class BaseActivity extends AppCompatActivity implements BackPressedHandler.HostActivity { +public abstract class BaseActivity extends AppCompatActivity { protected static final int PERMISSION_REQUEST_CODE = 11186; - private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer(); @Override protected void onCreate(@Nullable Bundle savedInstanceState) { @@ -80,17 +79,6 @@ public abstract class BaseActivity extends AppCompatActivity implements BackPres setToolbarAsBack(this, R.id.toolbar, title); } - public void registerBackPressedHandler(BackPressedHandler handler) { - mBackPressObserver.registerHandler(handler); - } - - @Override - public void onBackPressed() { - if (!mBackPressObserver.onBackPressed(this)) { - super.onBackPressed(); - } - } - public static void setToolbarAsBack(final AppCompatActivity activity, int id, String title) { Toolbar toolbar = (Toolbar) activity.findViewById(id); toolbar.setTitle(title); @@ -112,8 +100,4 @@ public abstract class BaseActivity extends AppCompatActivity implements BackPres super.onRequestPermissionsResult(requestCode, permissions, grantResults); } - @Override - public BackPressedHandler.Observer getBackPressedObserver() { - return mBackPressObserver; - } } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java index b17fe040..cd5b0e0c 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditActivity.java @@ -1,100 +1,41 @@ package com.stardust.scriptdroid.ui.edit; -import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; -import android.content.IntentFilter; import android.os.Bundle; -import android.preference.PreferenceManager; import android.support.annotation.NonNull; -import android.support.design.widget.Snackbar; -import android.support.v7.app.AppCompatActivity; import android.view.Menu; import android.view.MenuItem; -import android.view.View; -import android.view.WindowManager; -import android.widget.TextView; import com.afollestad.materialdialogs.DialogAction; import com.afollestad.materialdialogs.MaterialDialog; -import com.stardust.app.OnActivityResultDelegate; -import com.stardust.autojs.engine.JavaScriptEngine; -import com.stardust.autojs.execution.ScriptExecution; -import com.stardust.autojs.script.JavaScriptFileSource; -import com.stardust.pio.PFile; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.autojs.AutoJs; import com.stardust.scriptdroid.script.ScriptFile; -import com.stardust.scriptdroid.script.Scripts; import com.stardust.scriptdroid.ui.BaseActivity; -import com.stardust.scriptdroid.ui.edit.completion.CodeCompletions; import com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar; -import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity; -import com.stardust.theme.ThemeColorManager; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import org.androidannotations.annotations.AfterViews; -import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.List; - -import io.reactivex.Observable; -import io.reactivex.android.schedulers.AndroidSchedulers; -import io.reactivex.functions.Consumer; -import io.reactivex.schedulers.Schedulers; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME; +import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_PATH; /** * Created by Stardust on 2017/1/29. */ @EActivity(R.layout.activity_edit) -public class EditActivity extends AppCompatActivity implements OnActivityResultDelegate.DelegateHost { - - public static final String EXTRA_PATH = "Still Love Eating 17.4.5"; - private static final String EXTRA_NAME = "Still love you 17.6.29 But....(ಥ_ಥ)"; - private static final String KEY_EDITOR_THEME = "I really really really really love you dee"; +public class EditActivity extends BaseActivity { - @ViewById(R.id.content_view) - View mView; - - @ViewById(R.id.editor) - CodeMirrorEditor mEditor; + @ViewById(R.id.editor_view) + EditorView mEditor; @ViewById(R.id.input_method_enhance_bar) InputMethodEnhanceBar mInputMethodEnhanceBar; - private String mName; - private File mFile; - private boolean mReadOnly = false; - private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator(); - private BroadcastReceiver mOnRunFinishedReceiver = new BroadcastReceiver() { - @Override - public void onReceive(Context context, Intent intent) { - if (intent.getAction().equals(Scripts.ACTION_ON_EXECUTION_FINISHED)) { - mScriptExecution = null; - setMenuItemStatus(R.id.run, true); - String msg = intent.getStringExtra(Scripts.EXTRA_EXCEPTION_MESSAGE); - if (msg != null) { - Snackbar.make(mView, getString(R.string.text_error) + ": " + msg, Snackbar.LENGTH_LONG).show(); - } - } - } - }; - - - private ScriptExecution mScriptExecution; - private boolean mTextChanged = false; - - public void onCreate(Bundle b) { - super.onCreate(b); - registerReceiver(mOnRunFinishedReceiver, new IntentFilter(Scripts.ACTION_ON_EXECUTION_FINISHED)); - } + private EditorMenu mEditorMenu; public static void editFile(Context context, String path) { editFile(context, null, path); @@ -113,117 +54,13 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD @AfterViews void setUpViews() { - ThemeColorManager.addActivityStatusBar(this); + mEditor.handleIntent(getIntent()); + mEditorMenu = new EditorMenu(mEditor); setUpToolbar(); - setUpEditor(); - handleIntent(getIntent()); - setMenuItemStatus(R.id.save, false); - } - - private void handleIntent(Intent intent) { - String path = intent.getStringExtra(EXTRA_PATH); - mName = intent.getStringExtra(EXTRA_NAME); - mReadOnly = intent.getBooleanExtra("readOnly", false); - boolean saveEnabled = intent.getBooleanExtra("saveEnabled", true); - if (mReadOnly || !saveEnabled) { - findViewById(R.id.save).setVisibility(View.GONE); - } - String content = intent.getStringExtra("content"); - if (content != null) { - mEditor.setText(content); - } else { - mFile = new File(path); - if (mName == null) { - mName = mFile.getName(); - } - mEditor.setText(PFile.read(mFile)); - } - } - - private void setUpEditor() { - mEditor.setTheme(PreferenceManager.getDefaultSharedPreferences(EditActivity.this) - .getString(KEY_EDITOR_THEME, mEditor.getTheme())); - mEditor.setCallback(new CodeMirrorEditor.Callback() { - @Override - public void onChange() { - mTextChanged = true; - setMenuItemStatus(R.id.save, true); - } - - @Override - public void updateCodeCompletion(int fromLine, int fromCh, int toLine, int toCh, final String[] list) { - mInputMethodEnhanceBar.setCodeCompletions(new CodeCompletions( - new CodeCompletions.Pos(fromLine, fromCh), - new CodeCompletions.Pos(toLine, toCh), - Arrays.asList(list) - )); - } - }); - mInputMethodEnhanceBar.setOnHintClickListener(new InputMethodEnhanceBar.OnHintClickListener() { - @Override - public void onHintClick(CodeCompletions completions, int pos) { - mEditor.replace(completions.getHints().get(pos), completions.getFrom().line, completions.getFrom().ch, - completions.getTo().line, completions.getTo().ch); - } - }); - } private void setUpToolbar() { - BaseActivity.setToolbarAsBack(this, R.id.toolbar, mName); - } - - @Click(R.id.run) - void runAndSaveFileIFNeeded() { - save().observeOn(AndroidSchedulers.mainThread()) - .subscribe(new Consumer() { - @Override - public void accept(@io.reactivex.annotations.NonNull String s) throws Exception { - run(); - } - }); - } - - private void run() { - Snackbar.make(mView, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); - mScriptExecution = Scripts.runWithBroadcastSender(new JavaScriptFileSource(mName, mFile), mFile.getParent()); - setMenuItemStatus(R.id.run, false); - } - - - @Click(R.id.undo) - void undo() { - mEditor.undo(); - } - - @Click(R.id.redo) - void redo() { - mEditor.redo(); - } - - public Observable save() { - return mEditor.getText() - .observeOn(Schedulers.io()) - .doOnNext(new Consumer() { - @Override - public void accept(@io.reactivex.annotations.NonNull String s) throws Exception { - PFile.write(mFile, s); - } - }) - .observeOn(AndroidSchedulers.mainThread()) - .doOnNext(new Consumer() { - @Override - public void accept(@io.reactivex.annotations.NonNull String s) throws Exception { - mTextChanged = false; - setMenuItemStatus(R.id.save, false); - } - }); - } - - - @Click(R.id.save) - void saveFile() { - save().subscribe(); + BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditor.getName()); } @Override @@ -234,81 +71,12 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD @Override public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - case R.id.action_console: - showConsole(); - return true; - case R.id.action_log: - showLog(); - return true; - case R.id.action_editor_theme: - selectEditorTheme(); - return true; - case R.id.action_beautify: - beautifyCode(); - return true; - case R.id.action_open_by_other_apps: - openByOtherApps(); - return true; - case R.id.action_force_stop: - forceStop(); - return true; - } - return super.onOptionsItemSelected(item); - } - - private void setMenuItemStatus(int id, boolean enabled) { - findViewById(id).setEnabled(enabled); - } - - private void showLog() { - AutoJs.getInstance().getScriptEngineService().getGlobalConsole().show(); - } - - private void showConsole() { - if (mScriptExecution != null) { - ((JavaScriptEngine) mScriptExecution.getEngine()).getRuntime().console.show(); - } - } - - - private void selectEditorTheme() { - String[] themes = mEditor.getAvailableThemes(); - int i = Arrays.asList(themes).indexOf(mEditor.getTheme()); - new MaterialDialog.Builder(this) - .items((CharSequence[]) themes) - .itemsCallbackSingleChoice(i, new MaterialDialog.ListCallbackSingleChoice() { - @Override - public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { - PreferenceManager.getDefaultSharedPreferences(EditActivity.this).edit() - .putString(KEY_EDITOR_THEME, text.toString()) - .apply(); - mEditor.setTheme(text.toString()); - return true; - } - }) - .show(); - } - - - private void forceStop() { - if (mScriptExecution != null) { - mScriptExecution.getEngine().forceStop(); - } - } - - private void openByOtherApps() { - if (mFile != null) - Scripts.openByOtherApps(mFile); - } - - private void beautifyCode() { - mEditor.beautifyCode(); + return mEditorMenu.onOptionsItemSelected(item); } @Override public void finish() { - if (mTextChanged) { + if (mEditor.isTextChanged()) { showExitConfirmDialog(); return; } @@ -325,7 +93,7 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD .onNegative(new MaterialDialog.SingleButtonCallback() { @Override public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { - saveFile(); + mEditor.saveFile(); EditActivity.super.finish(); } }) @@ -338,21 +106,9 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD .show(); } - - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - mActivityResultMediator.onActivityResult(requestCode, resultCode, data); - } - - @Override - public OnActivityResultDelegate.Mediator getOnActivityResultDelegateMediator() { - return mActivityResultMediator; - } - @Override protected void onDestroy() { super.onDestroy(); - unregisterReceiver(mOnRunFinishedReceiver); } @Override diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java new file mode 100644 index 00000000..7ecd8af7 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java @@ -0,0 +1,68 @@ +package com.stardust.scriptdroid.ui.edit; + +import android.view.MenuItem; + +import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.autojs.AutoJs; +import com.stardust.scriptdroid.script.Scripts; + +/** + * Created by Stardust on 2017/9/28. + */ + +public class EditorMenu { + + private EditorView mEditorView; + + public EditorMenu(EditorView editor) { + mEditorView = editor; + } + + public boolean onOptionsItemSelected(MenuItem item) { + switch (item.getItemId()) { + case R.id.action_console: + showConsole(); + return true; + case R.id.action_log: + showLog(); + return true; + case R.id.action_editor_theme: + mEditorView.selectEditorTheme(); + return true; + case R.id.action_beautify: + beautifyCode(); + return true; + case R.id.action_open_by_other_apps: + openByOtherApps(); + return true; + case R.id.action_force_stop: + forceStop(); + return true; + } + return false; + } + + + private void showLog() { + AutoJs.getInstance().getScriptEngineService().getGlobalConsole().show(); + } + + private void showConsole() { + mEditorView.showConsole(); + } + + + private void forceStop() { + mEditorView.forceStop(); + } + + private void openByOtherApps() { + mEditorView.openByOtherApps(); + } + + private void beautifyCode() { + mEditorView.beautifyCode(); + } + +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java new file mode 100644 index 00000000..7e6b2001 --- /dev/null +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java @@ -0,0 +1,276 @@ +package com.stardust.scriptdroid.ui.edit; + +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; +import android.preference.PreferenceManager; +import android.support.annotation.Nullable; +import android.support.design.widget.Snackbar; +import android.util.AttributeSet; +import android.view.View; +import android.widget.FrameLayout; + +import com.afollestad.materialdialogs.MaterialDialog; +import com.stardust.autojs.engine.JavaScriptEngine; +import com.stardust.autojs.execution.ScriptExecution; +import com.stardust.autojs.script.JavaScriptFileSource; +import com.stardust.pio.PFile; +import com.stardust.scriptdroid.R; +import com.stardust.scriptdroid.script.Scripts; +import com.stardust.scriptdroid.ui.edit.completion.CodeCompletions; +import com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar; + +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.Arrays; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.functions.Consumer; +import io.reactivex.schedulers.Schedulers; + +import static com.stardust.scriptdroid.script.Scripts.ACTION_ON_EXECUTION_FINISHED; + +/** + * Created by Stardust on 2017/9/28. + */ +@EViewGroup(R.layout.editor_view) +public class EditorView extends FrameLayout { + + public static final String EXTRA_PATH = "Still Love Eating 17.4.5"; + public static final String EXTRA_NAME = "Still love you 17.6.29 But....(ಥ_ಥ)"; + public static final String EXTRA_CONTENT = "It's hard..............."; + public static final String EXTRA_READ_ONLY = "Miss you more every day、、、"; + public static final String EXTRA_SAVE_ENABLED = "But you won't...but you won't..."; + public static final String EXTRA_RUN_ENABLED = "Love you with my life...really...17.9.28"; + + @ViewById(R.id.editor) + CodeMirrorEditor mEditor; + + @ViewById(R.id.input_method_enhance_bar) + InputMethodEnhanceBar mInputMethodEnhanceBar; + + private static final String KEY_EDITOR_THEME = "我...深爱着...你呀...17.9.28"; + + private String mName; + private File mFile; + private boolean mReadOnly = false; + + private ScriptExecution mScriptExecution; + private boolean mTextChanged = false; + private BroadcastReceiver mOnRunFinishedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + if (intent.getAction().equals(ACTION_ON_EXECUTION_FINISHED)) { + mScriptExecution = null; + setMenuItemStatus(R.id.run, true); + String msg = intent.getStringExtra(Scripts.EXTRA_EXCEPTION_MESSAGE); + if (msg != null) { + Snackbar.make(EditorView.this, getResources().getString(R.string.text_error) + ": " + msg, Snackbar.LENGTH_LONG).show(); + } + } + } + }; + + private void setMenuItemStatus(int id, boolean enabled) { + findViewById(id).setEnabled(enabled); + } + + + public EditorView(Context context) { + super(context); + } + + public EditorView(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + } + + public EditorView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + @Override + protected void onAttachedToWindow() { + super.onAttachedToWindow(); + getContext().registerReceiver(mOnRunFinishedReceiver, new IntentFilter(ACTION_ON_EXECUTION_FINISHED)); + } + + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + getContext().unregisterReceiver(mOnRunFinishedReceiver); + } + + public void handleIntent(Intent intent) { + mName = intent.getStringExtra(EXTRA_NAME); + handleText(intent); + mReadOnly = intent.getBooleanExtra(EXTRA_READ_ONLY, false); + boolean saveEnabled = intent.getBooleanExtra(EXTRA_SAVE_ENABLED, true); + if (mReadOnly || !saveEnabled) { + findViewById(R.id.save).setVisibility(View.GONE); + } + if (!intent.getBooleanExtra(EXTRA_RUN_ENABLED, true)) { + findViewById(R.id.run).setVisibility(GONE); + } + + } + + private void handleText(Intent intent) { + String path = intent.getStringExtra(EXTRA_PATH); + String content = intent.getStringExtra(EXTRA_CONTENT); + if (content != null) { + mEditor.setText(content); + } else { + mFile = new File(path); + if (mName == null) { + mName = mFile.getName(); + } + mEditor.setText(PFile.read(mFile)); + } + } + + @AfterViews + void init() { + setUpEditor(); + } + + private void setUpEditor() { + mEditor.setTheme(PreferenceManager.getDefaultSharedPreferences(getContext()) + .getString(KEY_EDITOR_THEME, mEditor.getTheme())); + mEditor.setCallback(new CodeMirrorEditor.Callback() { + @Override + public void onChange() { + mTextChanged = true; + setMenuItemStatus(R.id.save, true); + } + + + @Override + public void updateCodeCompletion(int fromLine, int fromCh, int toLine, int toCh, final String[] list) { + mInputMethodEnhanceBar.setCodeCompletions(new CodeCompletions( + new CodeCompletions.Pos(fromLine, fromCh), + new CodeCompletions.Pos(toLine, toCh), + Arrays.asList(list) + )); + } + }); + mInputMethodEnhanceBar.setOnHintClickListener(new InputMethodEnhanceBar.OnHintClickListener() { + @Override + public void onHintClick(CodeCompletions completions, int pos) { + mEditor.replace(completions.getHints().get(pos), completions.getFrom().line, completions.getFrom().ch, + completions.getTo().line, completions.getTo().ch); + } + }); + + } + + + @Click(R.id.run) + public void runAndSaveFileIfNeeded() { + save().observeOn(AndroidSchedulers.mainThread()) + .subscribe(new Consumer() { + @Override + public void accept(@io.reactivex.annotations.NonNull String s) throws Exception { + run(); + } + }); + } + + public void run() { + Snackbar.make(this, R.string.text_start_running, Snackbar.LENGTH_SHORT).show(); + mScriptExecution = Scripts.runWithBroadcastSender(new JavaScriptFileSource(mName, mFile), mFile.getParent()); + setMenuItemStatus(R.id.run, false); + } + + + @Click(R.id.undo) + public void undo() { + mEditor.undo(); + } + + @Click(R.id.redo) + public void redo() { + mEditor.redo(); + } + + public Observable save() { + return mEditor.getText() + .observeOn(Schedulers.io()) + .doOnNext(new Consumer() { + @Override + public void accept(@io.reactivex.annotations.NonNull String s) throws Exception { + PFile.write(mFile, s); + } + }) + .observeOn(AndroidSchedulers.mainThread()) + .doOnNext(new Consumer() { + @Override + public void accept(@io.reactivex.annotations.NonNull String s) throws Exception { + mTextChanged = false; + setMenuItemStatus(R.id.save, false); + } + }); + } + + public void forceStop() { + if (mScriptExecution != null) { + mScriptExecution.getEngine().forceStop(); + } + } + + @Click(R.id.save) + public void saveFile() { + save().subscribe(); + } + + public String getName() { + return mName; + } + + public boolean isTextChanged() { + return mTextChanged; + } + + public void showConsole() { + if (mScriptExecution != null) { + ((JavaScriptEngine) mScriptExecution.getEngine()).getRuntime().console.show(); + } + } + + public void openByOtherApps() { + if (mFile != null) + Scripts.openByOtherApps(mFile); + } + + public void beautifyCode() { + mEditor.beautifyCode(); + } + + public void selectEditorTheme() { + String[] themes = mEditor.getAvailableThemes(); + int i = Arrays.asList(themes).indexOf(mEditor.getTheme()); + new MaterialDialog.Builder(getContext()) + .title(R.string.text_editor_theme) + .items((CharSequence[]) themes) + .itemsCallbackSingleChoice(i, new MaterialDialog.ListCallbackSingleChoice() { + @Override + public boolean onSelection(MaterialDialog dialog, View itemView, int which, CharSequence text) { + PreferenceManager.getDefaultSharedPreferences(getContext()).edit() + .putString(KEY_EDITOR_THEME, text.toString()) + .apply(); + mEditor.setTheme(text.toString()); + return true; + } + }) + .show(); + } + + public CodeMirrorEditor getEditor() { + return mEditor; + } +} diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java index edba880c..0c38a784 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/MainActivity.java @@ -48,7 +48,7 @@ import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; @EActivity(R.layout.activity_main) -public class MainActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost { +public class MainActivity extends BaseActivity implements OnActivityResultDelegate.DelegateHost, BackPressedHandler.HostActivity { private static final String LOG_TAG = "MainActivity"; @@ -64,6 +64,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter; private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator(); private VersionGuard mVersionGuard; + private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer(); @Override @@ -99,8 +100,8 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega private void registerBackPressHandlers() { - registerBackPressedHandler(new DrawerAutoClose(mDrawerLayout, Gravity.START)); - registerBackPressedHandler(new BackPressedHandler.DoublePressExit(this, R.string.text_press_again_to_exit)); + mBackPressObserver.registerHandler(new DrawerAutoClose(mDrawerLayout, Gravity.START)); + mBackPressObserver.registerHandler(new BackPressedHandler.DoublePressExit(this, R.string.text_press_again_to_exit)); } private void checkPermissions() { @@ -228,4 +229,17 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega return mActivityResultMediator; } + + @Override + public void onBackPressed() { + if (!mBackPressObserver.onBackPressed(this)) { + super.onBackPressed(); + } + } + + @Override + public BackPressedHandler.Observer getBackPressedObserver() { + return mBackPressObserver; + } + } \ No newline at end of file diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/MyScriptListFragment.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/MyScriptListFragment.java index 7b0a16a9..6861fad3 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/MyScriptListFragment.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/MyScriptListFragment.java @@ -109,7 +109,7 @@ public class MyScriptListFragment extends ViewPagerFragment implements BackPress @Override public boolean onBackPressed(Activity activity) { if (mFloatingActionMenu != null && mFloatingActionMenu.isExpanded()) { - mFloatingActionMenu.expand(); + mFloatingActionMenu.collapse(); return true; } return false; diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java index 884aca51..07653aae 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/main/scripts/ScriptListView.java @@ -85,7 +85,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa initScriptListRecyclerView(); mStorageFileProvider = StorageFileProvider.getDefault(); setCurrentDirectory(mStorageFileProvider.getInitialDirectory()); - mStorageFileProvider.registerDirectoryChangeListener(this); + //mStorageFileProvider.registerDirectoryChangeListener(this); } private void initScriptListRecyclerView() { @@ -175,7 +175,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa @Override protected void onDetachedFromWindow() { super.onDetachedFromWindow(); - mStorageFileProvider.unregisterDirectoryChangeListener(this); + // mStorageFileProvider.unregisterDirectoryChangeListener(this); } private class ScriptListAdapter extends RecyclerView.Adapter { diff --git a/app/src/main/res/layout/activity_edit.xml b/app/src/main/res/layout/activity_edit.xml index 1712a577..cfce38e9 100644 --- a/app/src/main/res/layout/activity_edit.xml +++ b/app/src/main/res/layout/activity_edit.xml @@ -1,88 +1,7 @@ - + android:layout_height="match_parent"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/activity_tasker_script_edit.xml b/app/src/main/res/layout/activity_tasker_script_edit.xml index 5f8bc869..cfce38e9 100644 --- a/app/src/main/res/layout/activity_tasker_script_edit.xml +++ b/app/src/main/res/layout/activity_tasker_script_edit.xml @@ -1,71 +1,7 @@ - + android:layout_height="match_parent"/> - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/app/src/main/res/layout/content_edit.xml b/app/src/main/res/layout/content_edit.xml deleted file mode 100644 index 1238d124..00000000 --- a/app/src/main/res/layout/content_edit.xml +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/layout/editor_view.xml b/app/src/main/res/layout/editor_view.xml new file mode 100644 index 00000000..cd9035e8 --- /dev/null +++ b/app/src/main/res/layout/editor_view.xml @@ -0,0 +1,76 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file