fix issues of Tasker Plugin Pref Editor

This commit is contained in:
hyb1996
2017-09-28 13:45:27 +08:00
parent 2138d4ef32
commit 0fa8c110fc
18 changed files with 489 additions and 494 deletions

View File

@@ -9,8 +9,8 @@ android {
applicationId "com.stardust.scriptdroid" applicationId "com.stardust.scriptdroid"
minSdkVersion 17 minSdkVersion 17
targetSdkVersion 23 targetSdkVersion 23
versionCode 203 versionCode 204
versionName "3.0.0 Alpha4" versionName "3.0.0 Alpha5"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
multiDexEnabled true multiDexEnabled true
ndk { ndk {

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -21,6 +21,9 @@ import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click; import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.EActivity;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_CONTENT;
/** /**
* Created by Stardust on 2017/3/27. * Created by Stardust on 2017/3/27.
*/ */
@@ -115,7 +118,7 @@ public class TaskPrefEditActivity extends AbstractAppCompatPluginActivity {
@Override @Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) { if (resultCode == RESULT_OK) {
mPreExecuteScript = data.getStringExtra(TaskerScriptEditActivity.EXTRA_CONTENT); mPreExecuteScript = data.getStringExtra(EXTRA_CONTENT);
} }
} }
} }

View File

@@ -9,6 +9,7 @@ import android.widget.TextView;
import com.stardust.scriptdroid.R; import com.stardust.scriptdroid.R;
import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.scriptdroid.ui.BaseActivity;
import com.stardust.scriptdroid.ui.edit.EditorView;
import com.stardust.theme.ThemeColorManager; import com.stardust.theme.ThemeColorManager;
import com.stardust.widget.ToolbarMenuItem; import com.stardust.widget.ToolbarMenuItem;
@@ -16,59 +17,50 @@ import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById; 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. * Created by Stardust on 2017/4/5.
*/ */
@EActivity(R.layout.activity_tasker_script_edit) @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 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) { public static void edit(Activity activity, String title, String summary, String content) {
activity.startActivityForResult(new Intent(activity, TaskerScriptEditActivity_.class) activity.startActivityForResult(new Intent(activity, TaskerScriptEditActivity_.class)
.putExtra(EXTRA_CONTENT, content) .putExtra(EXTRA_CONTENT, content)
.putExtra("summary", summary) .putExtra("summary", summary)
.putExtra("title", title), REQUEST_CODE); .putExtra(EXTRA_NAME, title), REQUEST_CODE);
} }
private String mTitle, mSummary; @ViewById(R.id.editor_view)
@ViewById(R.id.redo) EditorView mEditorView;
ToolbarMenuItem mRedo;
@ViewById(R.id.undo)
ToolbarMenuItem mUndo;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// setTheme(R.style.EditorTheme);
handleIntent(getIntent());
}
@AfterViews @AfterViews
void setUpViews() { void setUpViews() {
((TextView) findViewById(R.id.summary)).setText(mSummary); mEditorView.handleIntent(getIntent()
ThemeColorManager.addActivityStatusBar(this); .putExtra(EXTRA_RUN_ENABLED, false)
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mTitle); .putExtra(EXTRA_SAVE_ENABLED, false));
setUpEditor(); 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 @Override
public void finish() { public void finish() {
super.finish(); mEditorView.getEditor().getText().subscribe(new Consumer<String>() {
@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) {
}
} }

View File

@@ -26,11 +26,10 @@ import static android.content.pm.PackageManager.PERMISSION_GRANTED;
* Created by Stardust on 2017/1/23. * 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; protected static final int PERMISSION_REQUEST_CODE = 11186;
private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer();
@Override @Override
protected void onCreate(@Nullable Bundle savedInstanceState) { protected void onCreate(@Nullable Bundle savedInstanceState) {
@@ -80,17 +79,6 @@ public abstract class BaseActivity extends AppCompatActivity implements BackPres
setToolbarAsBack(this, R.id.toolbar, title); 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) { public static void setToolbarAsBack(final AppCompatActivity activity, int id, String title) {
Toolbar toolbar = (Toolbar) activity.findViewById(id); Toolbar toolbar = (Toolbar) activity.findViewById(id);
toolbar.setTitle(title); toolbar.setTitle(title);
@@ -112,8 +100,4 @@ public abstract class BaseActivity extends AppCompatActivity implements BackPres
super.onRequestPermissionsResult(requestCode, permissions, grantResults); super.onRequestPermissionsResult(requestCode, permissions, grantResults);
} }
@Override
public BackPressedHandler.Observer getBackPressedObserver() {
return mBackPressObserver;
}
} }

View File

@@ -1,100 +1,41 @@
package com.stardust.scriptdroid.ui.edit; package com.stardust.scriptdroid.ui.edit;
import android.content.BroadcastReceiver;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle; import android.os.Bundle;
import android.preference.PreferenceManager;
import android.support.annotation.NonNull; import android.support.annotation.NonNull;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; 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.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog; 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.R;
import com.stardust.scriptdroid.autojs.AutoJs;
import com.stardust.scriptdroid.script.ScriptFile; import com.stardust.scriptdroid.script.ScriptFile;
import com.stardust.scriptdroid.script.Scripts;
import com.stardust.scriptdroid.ui.BaseActivity; 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.edit.completion.InputMethodEnhanceBar;
import com.stardust.scriptdroid.ui.help.HelpCatalogueActivity;
import com.stardust.theme.ThemeColorManager;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.AfterViews;
import org.androidannotations.annotations.Click;
import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.ViewById;
import java.io.File; import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME;
import java.util.ArrayList; import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_PATH;
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;
/** /**
* Created by Stardust on 2017/1/29. * Created by Stardust on 2017/1/29.
*/ */
@EActivity(R.layout.activity_edit) @EActivity(R.layout.activity_edit)
public class EditActivity extends AppCompatActivity implements OnActivityResultDelegate.DelegateHost { public class EditActivity extends BaseActivity {
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";
@ViewById(R.id.content_view) @ViewById(R.id.editor_view)
View mView; EditorView mEditor;
@ViewById(R.id.editor)
CodeMirrorEditor mEditor;
@ViewById(R.id.input_method_enhance_bar) @ViewById(R.id.input_method_enhance_bar)
InputMethodEnhanceBar mInputMethodEnhanceBar; InputMethodEnhanceBar mInputMethodEnhanceBar;
private String mName; private EditorMenu mEditorMenu;
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));
}
public static void editFile(Context context, String path) { public static void editFile(Context context, String path) {
editFile(context, null, path); editFile(context, null, path);
@@ -113,117 +54,13 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD
@AfterViews @AfterViews
void setUpViews() { void setUpViews() {
ThemeColorManager.addActivityStatusBar(this); mEditor.handleIntent(getIntent());
mEditorMenu = new EditorMenu(mEditor);
setUpToolbar(); 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() { private void setUpToolbar() {
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mName); BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditor.getName());
}
@Click(R.id.run)
void runAndSaveFileIFNeeded() {
save().observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@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<String> save() {
return mEditor.getText()
.observeOn(Schedulers.io())
.doOnNext(new Consumer<String>() {
@Override
public void accept(@io.reactivex.annotations.NonNull String s) throws Exception {
PFile.write(mFile, s);
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<String>() {
@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();
} }
@Override @Override
@@ -234,81 +71,12 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) { return mEditorMenu.onOptionsItemSelected(item);
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();
} }
@Override @Override
public void finish() { public void finish() {
if (mTextChanged) { if (mEditor.isTextChanged()) {
showExitConfirmDialog(); showExitConfirmDialog();
return; return;
} }
@@ -325,7 +93,7 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD
.onNegative(new MaterialDialog.SingleButtonCallback() { .onNegative(new MaterialDialog.SingleButtonCallback() {
@Override @Override
public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) { public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
saveFile(); mEditor.saveFile();
EditActivity.super.finish(); EditActivity.super.finish();
} }
}) })
@@ -338,21 +106,9 @@ public class EditActivity extends AppCompatActivity implements OnActivityResultD
.show(); .show();
} }
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mActivityResultMediator.onActivityResult(requestCode, resultCode, data);
}
@Override
public OnActivityResultDelegate.Mediator getOnActivityResultDelegateMediator() {
return mActivityResultMediator;
}
@Override @Override
protected void onDestroy() { protected void onDestroy() {
super.onDestroy(); super.onDestroy();
unregisterReceiver(mOnRunFinishedReceiver);
} }
@Override @Override

View File

@@ -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();
}
}

View File

@@ -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<String>() {
@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<String> save() {
return mEditor.getText()
.observeOn(Schedulers.io())
.doOnNext(new Consumer<String>() {
@Override
public void accept(@io.reactivex.annotations.NonNull String s) throws Exception {
PFile.write(mFile, s);
}
})
.observeOn(AndroidSchedulers.mainThread())
.doOnNext(new Consumer<String>() {
@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;
}
}

View File

@@ -48,7 +48,7 @@ import org.androidannotations.annotations.EActivity;
import org.androidannotations.annotations.ViewById; import org.androidannotations.annotations.ViewById;
@EActivity(R.layout.activity_main) @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"; private static final String LOG_TAG = "MainActivity";
@@ -64,6 +64,7 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter; private FragmentPagerAdapterBuilder.StoredFragmentPagerAdapter mPagerAdapter;
private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator(); private OnActivityResultDelegate.Mediator mActivityResultMediator = new OnActivityResultDelegate.Mediator();
private VersionGuard mVersionGuard; private VersionGuard mVersionGuard;
private BackPressedHandler.Observer mBackPressObserver = new BackPressedHandler.Observer();
@Override @Override
@@ -99,8 +100,8 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
private void registerBackPressHandlers() { private void registerBackPressHandlers() {
registerBackPressedHandler(new DrawerAutoClose(mDrawerLayout, Gravity.START)); mBackPressObserver.registerHandler(new DrawerAutoClose(mDrawerLayout, Gravity.START));
registerBackPressedHandler(new BackPressedHandler.DoublePressExit(this, R.string.text_press_again_to_exit)); mBackPressObserver.registerHandler(new BackPressedHandler.DoublePressExit(this, R.string.text_press_again_to_exit));
} }
private void checkPermissions() { private void checkPermissions() {
@@ -228,4 +229,17 @@ public class MainActivity extends BaseActivity implements OnActivityResultDelega
return mActivityResultMediator; return mActivityResultMediator;
} }
@Override
public void onBackPressed() {
if (!mBackPressObserver.onBackPressed(this)) {
super.onBackPressed();
}
}
@Override
public BackPressedHandler.Observer getBackPressedObserver() {
return mBackPressObserver;
}
} }

View File

@@ -109,7 +109,7 @@ public class MyScriptListFragment extends ViewPagerFragment implements BackPress
@Override @Override
public boolean onBackPressed(Activity activity) { public boolean onBackPressed(Activity activity) {
if (mFloatingActionMenu != null && mFloatingActionMenu.isExpanded()) { if (mFloatingActionMenu != null && mFloatingActionMenu.isExpanded()) {
mFloatingActionMenu.expand(); mFloatingActionMenu.collapse();
return true; return true;
} }
return false; return false;

View File

@@ -85,7 +85,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
initScriptListRecyclerView(); initScriptListRecyclerView();
mStorageFileProvider = StorageFileProvider.getDefault(); mStorageFileProvider = StorageFileProvider.getDefault();
setCurrentDirectory(mStorageFileProvider.getInitialDirectory()); setCurrentDirectory(mStorageFileProvider.getInitialDirectory());
mStorageFileProvider.registerDirectoryChangeListener(this); //mStorageFileProvider.registerDirectoryChangeListener(this);
} }
private void initScriptListRecyclerView() { private void initScriptListRecyclerView() {
@@ -175,7 +175,7 @@ public class ScriptListView extends SwipeRefreshLayout implements SwipeRefreshLa
@Override @Override
protected void onDetachedFromWindow() { protected void onDetachedFromWindow() {
super.onDetachedFromWindow(); super.onDetachedFromWindow();
mStorageFileProvider.unregisterDirectoryChangeListener(this); // mStorageFileProvider.unregisterDirectoryChangeListener(this);
} }
private class ScriptListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private class ScriptListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

View File

@@ -1,88 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <com.stardust.scriptdroid.ui.edit.EditorView_
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/editor_view"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/content_view"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"/>
android:orientation="vertical"
tools:context="com.stardust.scriptdroid.ui.edit.EditActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<com.stardust.theme.widget.ThemeColorToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:title="@string/_app_name"
app:popupTheme="@style/AppTheme.PopupOverlay">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:orientation="horizontal">
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/run"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_play_arrow_white_48dp"
app:icon_color="@android:color/white"
app:text="@string/text_run"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/undo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_undo_white_48dp"
app:text="@string/text_undo"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/redo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_redo_white_48dp"
app:text="@string/text_redo"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/save"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_save_white_48dp"
app:text="@string/text_save"/>
</LinearLayout>
</com.stardust.theme.widget.ThemeColorToolbar>
</android.support.design.widget.AppBarLayout>
<com.stardust.scriptdroid.ui.edit.CodeMirrorEditor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:background="@null"
android:bufferType="spannable"
android:cursorVisible="true"
android:gravity="top|start"
android:text=""
android:textCursorDrawable="@null"
android:textIsSelectable="true"/>
<com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar
android:id="@+id/input_method_enhance_bar"
android:layout_width="match_parent"
android:layout_height="35dp"
android:background="#e7ebec"/>
</LinearLayout>

View File

@@ -1,71 +1,7 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<LinearLayout <com.stardust.scriptdroid.ui.edit.EditorView_
xmlns:android="http://schemas.android.com/apk/res/android" xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" android:id="@+id/editor_view"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"/>
android:orientation="vertical"
tools:context="com.stardust.scriptdroid.ui.edit.EditActivity">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<com.stardust.theme.widget.ThemeColorToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
app:popupTheme="@style/AppTheme.PopupOverlay"
app:title="@string/_app_name">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:orientation="horizontal"
android:paddingRight="8dp">
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/undo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_undo_white_48dp"
app:text="@string/text_undo"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/redo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_redo_white_48dp"
app:text="@string/text_redo"/>
</LinearLayout>
</com.stardust.theme.widget.ThemeColorToolbar>
<TextView
android:id="@+id/summary"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignBottom="@+id/toolbar"
android:layout_marginLeft="72dp"
android:textColor="@android:color/white"
android:textSize="10sp"
tools:text="@string/summary_pre_execute_script"/>
</RelativeLayout>
</android.support.design.widget.AppBarLayout>
<include layout="@layout/content_edit"/>
</LinearLayout>

View File

@@ -1,29 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#ffffffff"
android:orientation="vertical"
tools:showIn="@layout/activity_edit">
<com.stardust.scriptdroid.ui.edit.CodeMirrorEditor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@null"
android:bufferType="spannable"
android:cursorVisible="true"
android:gravity="top|start"
android:text=""
android:textCursorDrawable="@null"
android:textIsSelectable="true"/>
<com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar
android:id="@+id/input_method_enhance_bar"
android:layout_width="match_parent"
android:layout_height="35dp"
android:background="#e7ebec"/>
</LinearLayout>

View File

@@ -0,0 +1,76 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.design.widget.AppBarLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:theme="@style/AppTheme.AppBarOverlay">
<com.stardust.theme.widget.ThemeColorToolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:title="@string/_app_name"
app:popupTheme="@style/AppTheme.PopupOverlay">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="right"
android:orientation="horizontal">
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/run"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_play_arrow_white_48dp"
app:icon_color="@android:color/white"
app:text="@string/text_run"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/undo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_undo_white_48dp"
app:text="@string/text_undo"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/redo"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_redo_white_48dp"
app:text="@string/text_redo"/>
<com.stardust.widget.ToolbarMenuItem
android:id="@+id/save"
android:layout_width="40dp"
android:layout_height="match_parent"
app:icon="@drawable/ic_save_white_48dp"
app:text="@string/text_save"/>
</LinearLayout>
</com.stardust.theme.widget.ThemeColorToolbar>
</android.support.design.widget.AppBarLayout>
<com.stardust.scriptdroid.ui.edit.CodeMirrorEditor
android:id="@+id/editor"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"/>
<com.stardust.scriptdroid.ui.edit.completion.InputMethodEnhanceBar
android:id="@+id/input_method_enhance_bar"
android:layout_width="match_parent"
android:layout_height="35dp"
android:background="#e7ebec"/>
</LinearLayout>