feat(editor): auto restore text after screen orientation changed

This commit is contained in:
hyb1996
2018-04-01 15:03:08 +08:00
parent e31297794d
commit 2a8b0ce3e0
6 changed files with 90 additions and 27 deletions

View File

@@ -48,13 +48,8 @@ public class TaskerScriptEditActivity extends BaseActivity {
@Override
public void 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();
}
});
setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, mEditorView.getEditor().getText()));
TaskerScriptEditActivity.super.finish();
}
}

View File

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

View File

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

View File

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

View File

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

View File

@@ -311,8 +311,8 @@ public class CodeEditor extends HVScrollView {
mCodeEditText.setSelection(mCodeEditText.getSelectionStart() + dCh);
}
public Observable<String> getText() {
return Observable.just(mCodeEditText.getText().toString());
public String getText() {
return mCodeEditText.getText().toString();
}
public Observable<String> getSelection() {