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 @Override
public void finish() { public void finish() {
mEditorView.getEditor().getText().subscribe(new Consumer<String>() { setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, mEditorView.getEditor().getText()));
@Override
public void accept(@NonNull String s) throws Exception {
setResult(RESULT_OK, new Intent().putExtra(EXTRA_CONTENT, s));
TaskerScriptEditActivity.super.finish(); TaskerScriptEditActivity.super.finish();
} }
});
}
} }

View File

@@ -2,15 +2,16 @@ package com.stardust.scriptdroid.ui.edit;
import android.content.Context; import android.content.Context;
import android.content.Intent; import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.NonNull; 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.Toolbar;
import com.stardust.app.OnActivityResultDelegate; import com.stardust.app.OnActivityResultDelegate;
import com.stardust.pio.PFiles;
import com.stardust.scriptdroid.R; 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.scriptdroid.ui.BaseActivity;
import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder; import com.stardust.theme.dialog.ThemeColorMaterialDialogBuilder;
@@ -18,6 +19,13 @@ 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 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_CONTENT;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME; import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_NAME;
import static com.stardust.scriptdroid.ui.edit.EditorView.EXTRA_PATH; 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(); private OnActivityResultDelegate.Mediator mMediator = new OnActivityResultDelegate.Mediator();
@ViewById(R.id.editor_view) @ViewById(R.id.editor_view)
EditorView mEditor; EditorView mEditorView;
private EditorMenu mEditorMenu; private EditorMenu mEditorMenu;
@@ -58,13 +66,13 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega
@AfterViews @AfterViews
void setUpViews() { void setUpViews() {
mEditor.handleIntent(getIntent()); mEditorView.handleIntent(getIntent());
mEditorMenu = new EditorMenu(mEditor); mEditorMenu = new EditorMenu(mEditorView);
setUpToolbar(); setUpToolbar();
} }
private void setUpToolbar() { private void setUpToolbar() {
BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditor.getName()); BaseActivity.setToolbarAsBack(this, R.id.toolbar, mEditorView.getName());
} }
@Override @Override
@@ -90,14 +98,14 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega
@Override @Override
public void onBackPressed() { public void onBackPressed() {
if (!mEditor.onBackPressed()) { if (!mEditorView.onBackPressed()) {
super.onBackPressed(); super.onBackPressed();
} }
} }
@Override @Override
public void finish() { public void finish() {
if (mEditor.isTextChanged()) { if (mEditorView.isTextChanged()) {
showExitConfirmDialog(); showExitConfirmDialog();
return; return;
} }
@@ -112,7 +120,7 @@ public class EditActivity extends BaseActivity implements OnActivityResultDelega
.negativeText(R.string.text_save_and_exit) .negativeText(R.string.text_save_and_exit)
.neutralText(R.string.text_exit_directly) .neutralText(R.string.text_exit_directly)
.onNegative((dialog, which) -> { .onNegative((dialog, which) -> {
mEditor.saveFile(); mEditorView.saveFile();
EditActivity.super.finish(); EditActivity.super.finish();
}) })
.onNeutral((dialog, which) -> 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) { protected void onActivityResult(int requestCode, int resultCode, Intent data) {
mMediator.onActivityResult(requestCode, resultCode, 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() { 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()); String size = PFiles.getHumanReadableSize(text.length());
return String.format(Locale.getDefault(), mContext.getString(R.string.format_editor_info), return String.format(Locale.getDefault(), mContext.getString(R.string.format_editor_info),
text.length(), lineCount, size); text.length(), lineCount, size);
@@ -198,14 +198,9 @@ public class EditorMenu {
} }
private void copyAll() { private void copyAll() {
mEditor.getText().observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<String>() { ClipboardUtil.setClip(mContext, mEditor.getText());
@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(); Snackbar.make(mEditorView, R.string.text_already_copy_to_clip, Snackbar.LENGTH_SHORT).show();
} }
});
}
private void showLog() { private void showLog() {

View File

@@ -126,6 +126,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
} }
} }
}; };
private String mRestoredText;
public EditorView(Context context) { public EditorView(Context context) {
super(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) { private void 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);
@@ -209,6 +215,11 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
} }
private void setInitialText(String text) { private void setInitialText(String text) {
if (mRestoredText != null) {
mEditor.setText(mRestoredText);
mRestoredText = null;
return;
}
mEditor.setInitialText(text); mEditor.setInitialText(text);
} }
@@ -313,7 +324,7 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
} }
public Observable<String> save() { public Observable<String> save() {
return mEditor.getText() return Observable.just(mEditor.getText())
.observeOn(Schedulers.io()) .observeOn(Schedulers.io())
.doOnNext(s -> PFiles.write(mFile, s)) .doOnNext(s -> PFiles.write(mFile, s))
.observeOn(AndroidSchedulers.mainThread()) .observeOn(AndroidSchedulers.mainThread())
@@ -499,4 +510,6 @@ public class EditorView extends FrameLayout implements CodeCompletionBar.OnHintC
showManual(property.getUrl(), property.getKey()); showManual(property.getUrl(), property.getKey());
} }
} }
} }

View File

@@ -22,6 +22,7 @@ import android.graphics.Canvas;
import android.graphics.Color; import android.graphics.Color;
import android.graphics.Paint; import android.graphics.Paint;
import android.graphics.Typeface; import android.graphics.Typeface;
import android.os.Parcelable;
import android.support.v7.widget.AppCompatEditText; import android.support.v7.widget.AppCompatEditText;
import android.text.Editable; import android.text.Editable;
import android.text.Layout; import android.text.Layout;
@@ -352,4 +353,5 @@ public class CodeEditText extends AppCompatEditText {
} }
super.setSelection(index); super.setSelection(index);
} }
} }

View File

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