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 ab4330cd..e7beda91 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 @@ -48,13 +48,8 @@ public class TaskerScriptEditActivity extends BaseActivity { @Override public void 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(); - } - }); + setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, mEditorView.getEditor().getText())); + TaskerScriptEditActivity.super.finish(); } } 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 05826e79..8b2059ac 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 @@ -2,15 +2,16 @@ package com.stardust.scriptdroid.ui.edit; import android.content.Context; import android.content.Intent; +import android.os.Bundle; import android.support.annotation.NonNull; import android.view.ActionMode; import android.view.Menu; import android.view.MenuItem; -import android.widget.Toolbar; import com.stardust.app.OnActivityResultDelegate; +import com.stardust.pio.PFiles; import com.stardust.scriptdroid.R; -import com.stardust.scriptdroid.model.script.ScriptFile; +import com.stardust.scriptdroid.storage.file.TmpScriptFiles; import com.stardust.scriptdroid.ui.BaseActivity; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; @@ -18,6 +19,13 @@ import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.EActivity; import org.androidannotations.annotations.ViewById; +import java.io.File; +import java.io.IOException; + +import io.reactivex.Observable; +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + 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_PATH; @@ -32,7 +40,7 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator(); @ViewById(R.id.editor_view) - EditorView mEditor; + EditorView mEditorView; private EditorMenu mEditorMenu; @@ -58,13 +66,13 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega @AfterViews void setUpViews() { - mEditor.handleIntent(getIntent()); - mEditorMenu = new EditorMenu(mEditor); + mEditorView.handleIntent(getIntent()); + mEditorMenu = new EditorMenu(mEditorView); setUpToolbar(); } private void setUpToolbar() { - BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditor.getName()); + BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName()); } @Override @@ -90,14 +98,14 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega @Override public void onBackPressed() { - if (!mEditor.onBackPressed()) { + if (!mEditorView.onBackPressed()) { super.onBackPressed(); } } @Override public void finish() { - if (mEditor.isTextChanged()) { + if (mEditorView.isTextChanged()) { showExitConfirmDialog(); return; } @@ -112,7 +120,7 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega .negativeText(R.string.text_save_and_exit) .neutralText(R.string.text_exit_directly) .onNegative((dialog, which) -> { - mEditor.saveFile(); + mEditorView.saveFile(); EditActivity.super.finish(); }) .onNeutral((dialog, which) -> EditActivity.super.finish()) @@ -134,4 +142,54 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega protected void onActivityResult(int requestCode, int resultCode, Intent data) { mMediator.onActivityResult(requestCode, resultCode, data); } + + @Override + protected void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + if (!mEditorView.isTextChanged()) { + return; + } + String text = mEditorView.getEditor().getText(); + if (text.length() < 256 * 1024) { + outState.putString("text", text); + } else { + File tmp = saveToTmpFile(text); + if (tmp != null) { + outState.putString("path", tmp.getPath()); + } + + } + } + + private File saveToTmpFile(String text) { + try { + File tmp = TmpScriptFiles.create(this); + Observable.just(text) + .observeOn(Schedulers.io()) + .subscribe(t -> PFiles.write(tmp, t)); + return tmp; + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } + + @Override + protected void onRestoreInstanceState(Bundle savedInstanceState) { + super.onRestoreInstanceState(savedInstanceState); + String text = savedInstanceState.getString("text"); + if (text != null) { + mEditorView.setRestoredText(text); + return; + } + String path = savedInstanceState.getString("path"); + if (path != null) { + Observable.just(path) + .observeOn(Schedulers.io()) + .map(PFiles::read) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(t -> mEditorView.getEditor().setText(t), Throwable::printStackTrace); + } + } + } 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 index 57d0654c..7d4a6106 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorMenu.java @@ -156,7 +156,7 @@ public class EditorMenu { } private void showInfo() { - Observable.zip(mEditor.getText(), mEditor.getLineCount(), (text, lineCount) -> { + Observable.zip(Observable.just(mEditor.getText()), mEditor.getLineCount(), (text, lineCount) -> { String size = PFiles.getHumanReadableSize(text.length()); return String.format(Locale.getDefault(), mContext.getString(R.string.format_editor_info), text.length(), lineCount, size); @@ -198,13 +198,8 @@ public class EditorMenu { } private void copyAll() { - mEditor.getText().observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer() { - @Override - public void accept(@NonNull String s) throws Exception { - ClipboardUtil.setClip(mContext, s); - Snackbar.make(mEditorView, R.string.text_already_copy_to_clip, Snackbar.LENGTH_SHORT).show(); - } - }); + ClipboardUtil.setClip(mContext, mEditor.getText()); + Snackbar.make(mEditorView, R.string.text_already_copy_to_clip, Snackbar.LENGTH_SHORT).show(); } 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 index c9ef5d4f..74c8fd9b 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/EditorView.java @@ -126,6 +126,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } } }; + private String mRestoredText; public EditorView(Context context) { super(context); @@ -178,6 +179,11 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } + public void setRestoredText(String text) { + mRestoredText = text; + mEditor.setText(text); + } + private void handleText(Intent intent) { String path = intent.getStringExtra(EXTRA_PATH); String content = intent.getStringExtra(EXTRA_CONTENT); @@ -209,6 +215,11 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } private void setInitialText(String text) { + if (mRestoredText != null) { + mEditor.setText(mRestoredText); + mRestoredText = null; + return; + } mEditor.setInitialText(text); } @@ -313,7 +324,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC } public Observable save() { - return mEditor.getText() + return Observable.just(mEditor.getText()) .observeOn(Schedulers.io()) .doOnNext(s -> PFiles.write(mFile, s)) .observeOn(AndroidSchedulers.mainThread()) @@ -499,4 +510,6 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC showManual(property.getUrl(), property.getKey()); } } + + } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java index 33e4e064..5be3ff7e 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditText.java @@ -22,6 +22,7 @@ import android.graphics.Canvas; import android.graphics.Color; import android.graphics.Paint; import android.graphics.Typeface; +import android.os.Parcelable; import android.support.v7.widget.AppCompatEditText; import android.text.Editable; import android.text.Layout; @@ -352,4 +353,5 @@ public class CodeEditText extends AppCompatEditText { } super.setSelection(index); } + } diff --git a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java index 0637399f..65aa55f4 100644 --- a/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java +++ b/app/src/main/java/com/stardust/scriptdroid/ui/edit/editor/CodeEditor.java @@ -311,8 +311,8 @@ public class CodeEditor extends HVScrollView { mCodeEditText.setSelection(mCodeEditText.getSelectionStart() + dCh); } - public Observable getText() { - return Observable.just(mCodeEditText.getText().toString()); + public String getText() { + return mCodeEditText.getText().toString(); } public Observable getSelection() {