fix(ui): app crash when editor cannot open file

This commit is contained in:
hyb1996
2018-09-13 16:52:38 +08:00
parent 4fe8e4add4
commit 0281563077
6 changed files with 59 additions and 39 deletions

View File

@@ -1,9 +1,12 @@
package org.autojs.autojs.external.tasker; package org.autojs.autojs.external.tasker;
import android.annotation.SuppressLint;
import android.app.Activity; import android.app.Activity;
import android.content.Intent; import android.content.Intent;
import android.widget.Toast;
import org.autojs.autojs.R; import org.autojs.autojs.R;
import org.autojs.autojs.tool.EmptyObservers;
import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.ui.edit.EditorView; import org.autojs.autojs.ui.edit.EditorView;
@@ -11,6 +14,7 @@ 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.android.schedulers.AndroidSchedulers;
import io.reactivex.annotations.NonNull; import io.reactivex.annotations.NonNull;
import io.reactivex.functions.Consumer; import io.reactivex.functions.Consumer;
@@ -37,11 +41,18 @@ public class TaskerScriptEditActivity extends BaseActivity {
@ViewById(R.id.editor_view) @ViewById(R.id.editor_view)
EditorView mEditorView; EditorView mEditorView;
@SuppressLint("CheckResult")
@AfterViews @AfterViews
void setUpViews() { void setUpViews() {
mEditorView.handleIntent(getIntent() mEditorView.handleIntent(getIntent()
.putExtra(EXTRA_RUN_ENABLED, false) .putExtra(EXTRA_RUN_ENABLED, false)
.putExtra(EXTRA_SAVE_ENABLED, false)); .putExtra(EXTRA_SAVE_ENABLED, false))
.observeOn(AndroidSchedulers.mainThread())
.subscribe(EmptyObservers.consumer(),
ex -> {
Toast.makeText(TaskerScriptEditActivity.this, ex.getMessage(), Toast.LENGTH_LONG).show();
finish();
});
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName()); BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName());
} }

View File

@@ -226,12 +226,7 @@ public class ScriptOperations {
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
public void delete(final ScriptFile scriptFile) { public void delete(final ScriptFile scriptFile) {
Observable.fromPublisher(new Publisher<Boolean>() { Observable.fromPublisher((Publisher<Boolean>) s -> s.onNext(PFiles.deleteRecursively(scriptFile))).subscribeOn(Schedulers.io())
@Override
public void subscribe(Subscriber<? super Boolean> s) {
s.onNext(PFiles.deleteRecursively(scriptFile));
}
}).subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(deleted -> { .subscribe(deleted -> {
showMessage(deleted ? R.string.text_already_delete : R.string.text_delete_failed); showMessage(deleted ? R.string.text_already_delete : R.string.text_delete_failed);

View File

@@ -1,5 +1,6 @@
package org.autojs.autojs.ui.edit; package org.autojs.autojs.ui.edit;
import android.annotation.SuppressLint;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle; import android.os.Bundle;
@@ -7,6 +8,7 @@ import android.support.annotation.NonNull;
import android.view.ActionMode; import android.view.ActionMode;
import android.view.Menu; import android.view.Menu;
import android.view.MenuItem; import android.view.MenuItem;
import android.widget.Toast;
import com.stardust.app.OnActivityResultDelegate; import com.stardust.app.OnActivityResultDelegate;
import com.stardust.autojs.core.permission.OnRequestPermissionsResultCallback; import com.stardust.autojs.core.permission.OnRequestPermissionsResultCallback;
@@ -17,6 +19,7 @@ import com.stardust.pio.PFiles;
import org.autojs.autojs.R; import org.autojs.autojs.R;
import org.autojs.autojs.storage.file.TmpScriptFiles; import org.autojs.autojs.storage.file.TmpScriptFiles;
import org.autojs.autojs.tool.EmptyObservers;
import org.autojs.autojs.ui.BaseActivity; import org.autojs.autojs.ui.BaseActivity;
import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder; import org.autojs.autojs.theme.dialog.ThemeColorMaterialDialogBuilder;
@@ -70,13 +73,27 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega
.putExtra(EXTRA_READ_ONLY, true)); .putExtra(EXTRA_READ_ONLY, true));
} }
@SuppressLint("CheckResult")
@AfterViews @AfterViews
void setUpViews() { void setUpViews() {
mEditorView.handleIntent(getIntent()); mEditorView.handleIntent(getIntent())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(EmptyObservers.consumer(),
ex -> onLoadFileError(ex.getMessage()));
mEditorMenu = new EditorMenu(mEditorView); mEditorMenu = new EditorMenu(mEditorView);
setUpToolbar(); setUpToolbar();
} }
private void onLoadFileError(String message) {
new ThemeColorMaterialDialogBuilder(this)
.title(getString(R.string.text_cannot_read_file))
.content(message)
.positiveText(R.string.text_exit)
.cancelable(false)
.onPositive((dialog, which) -> finish())
.show();
}
private void setUpToolbar() { private void setUpToolbar() {
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName()); BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName());
} }

View File

@@ -22,13 +22,11 @@ import android.view.Gravity;
import android.view.View; import android.view.View;
import android.widget.FrameLayout; import android.widget.FrameLayout;
import android.widget.ImageView; import android.widget.ImageView;
import android.widget.Toast;
import com.afollestad.materialdialogs.MaterialDialog; import com.afollestad.materialdialogs.MaterialDialog;
import com.stardust.autojs.engine.JavaScriptEngine; import com.stardust.autojs.engine.JavaScriptEngine;
import com.stardust.autojs.engine.ScriptEngine; import com.stardust.autojs.engine.ScriptEngine;
import com.stardust.autojs.execution.ScriptExecution; import com.stardust.autojs.execution.ScriptExecution;
import com.stardust.autojs.rhino.debug.Debugger;
import com.stardust.pio.PFiles; import com.stardust.pio.PFiles;
import com.stardust.util.BackPressedHandler; import com.stardust.util.BackPressedHandler;
import com.stardust.util.Callback; import com.stardust.util.Callback;
@@ -183,21 +181,23 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
return mFile; return mFile;
} }
public void handleIntent(Intent intent) { public Observable<String> handleIntent(Intent intent) {
mName = intent.getStringExtra(EXTRA_NAME); mName = intent.getStringExtra(EXTRA_NAME);
handleText(intent); return handleText(intent)
mReadOnly = intent.getBooleanExtra(EXTRA_READ_ONLY, false); .observeOn(AndroidSchedulers.mainThread())
boolean saveEnabled = intent.getBooleanExtra(EXTRA_SAVE_ENABLED, true); .doOnNext(str -> {
if (mReadOnly || !saveEnabled) { mReadOnly = intent.getBooleanExtra(EXTRA_READ_ONLY, false);
findViewById(R.id.save).setVisibility(View.GONE); boolean saveEnabled = intent.getBooleanExtra(EXTRA_SAVE_ENABLED, true);
} if (mReadOnly || !saveEnabled) {
if (!intent.getBooleanExtra(EXTRA_RUN_ENABLED, true)) { findViewById(R.id.save).setVisibility(View.GONE);
findViewById(R.id.run).setVisibility(GONE); }
} if (!intent.getBooleanExtra(EXTRA_RUN_ENABLED, true)) {
if (mReadOnly) { findViewById(R.id.run).setVisibility(GONE);
mEditor.setReadOnly(true); }
} if (mReadOnly) {
mEditor.setReadOnly(true);
}
});
} }
public void setRestoredText(String text) { public void setRestoredText(String text) {
@@ -205,37 +205,34 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
mEditor.setText(text); mEditor.setText(text);
} }
private void handleText(Intent intent) { private Observable<String> handleText(Intent intent) {
String path = intent.getStringExtra(EXTRA_PATH); String path = intent.getStringExtra(EXTRA_PATH);
String content = intent.getStringExtra(EXTRA_CONTENT); String content = intent.getStringExtra(EXTRA_CONTENT);
if (content != null) { if (content != null) {
setInitialText(content); setInitialText(content);
return Observable.just(content);
} else { } else {
if (path == null) { if (path == null) {
return; return Observable.error(new IllegalArgumentException("path and content is empty"));
} }
mFile = new File(path); mFile = new File(path);
if (mName == null) { if (mName == null) {
mName = mFile.getName(); mName = mFile.getName();
} }
loadFile(mFile); return loadFile(mFile);
} }
} }
@SuppressLint("CheckResult") @SuppressLint("CheckResult")
private void loadFile(final File file) { private Observable<String> loadFile(final File file) {
mEditor.setProgress(true); mEditor.setProgress(true);
Observable.fromCallable(() -> PFiles.read(file)) return Observable.fromCallable(() -> PFiles.read(file))
.subscribeOn(Schedulers.io()) .subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
.subscribe(s -> { .doOnNext(s -> {
setInitialText(s); setInitialText(s);
mEditor.setProgress(false); mEditor.setProgress(false);
}, err -> {
err.printStackTrace();
Toast.makeText(getContext(), getContext().getString(R.string.text_cannot_read_file, file.getPath()),
Toast.LENGTH_SHORT).show();
}); });
} }

View File

@@ -218,12 +218,12 @@ public class ScriptListView extends ThemeColorSwipeRefreshLayout implements Swip
public boolean onMenuItemClick(MenuItem item) { public boolean onMenuItemClick(MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.rename: case R.id.rename:
new ScriptOperations(getContext(), this) new ScriptOperations(getContext(), this, getCurrentDirectory())
.rename(mSelectedScriptFile) .rename(mSelectedScriptFile)
.subscribe(); .subscribe();
break; break;
case R.id.delete: case R.id.delete:
new ScriptOperations(getContext(), this) new ScriptOperations(getContext(), this, getCurrentDirectory())
.delete(mSelectedScriptFile); .delete(mSelectedScriptFile);
break; break;
case R.id.run_repeatedly: case R.id.run_repeatedly:
@@ -232,7 +232,7 @@ public class ScriptListView extends ThemeColorSwipeRefreshLayout implements Swip
notifyOperated(); notifyOperated();
break; break;
case R.id.create_shortcut: case R.id.create_shortcut:
new ScriptOperations(getContext(), this) new ScriptOperations(getContext(), this, getCurrentDirectory())
.createShortcut(mSelectedScriptFile); .createShortcut(mSelectedScriptFile);
break; break;
case R.id.open_by_other_apps: case R.id.open_by_other_apps:
@@ -244,7 +244,7 @@ public class ScriptListView extends ThemeColorSwipeRefreshLayout implements Swip
notifyOperated(); notifyOperated();
break; break;
case R.id.timed_task: case R.id.timed_task:
new ScriptOperations(getContext(), this) new ScriptOperations(getContext(), this, getCurrentDirectory())
.timedTask(mSelectedScriptFile); .timedTask(mSelectedScriptFile);
notifyOperated(); notifyOperated();
break; break;

View File

@@ -271,7 +271,7 @@
<string name="text_reset_to_initial_content">重置为初始内容</string> <string name="text_reset_to_initial_content">重置为初始内容</string>
<string name="text_reset_fail">重置失败</string> <string name="text_reset_fail">重置失败</string>
<string name="text_reset_succeed">重置成功</string> <string name="text_reset_succeed">重置成功</string>
<string name="text_cannot_read_file" formatted="true">无法读取文件: %s</string> <string name="text_cannot_read_file">无法读取文件</string>
<string name="text_service">服务</string> <string name="text_service">服务</string>
<string name="text_notification_permission">通知权限</string> <string name="text_notification_permission">通知权限</string>