From a8171f50deb368d4c3862b85f79e503198cb1b11 Mon Sep 17 00:00:00 2001 From: David Allison <62114487+david-allison-1@users.noreply.github.com> Date: Mon, 20 Apr 2020 11:19:37 +0100 Subject: [PATCH] Visual Editor: Handle Activity destruction --- .../activity/VisualEditorActivity.java | 46 +++++++++++++++++-- .../com/ichi2/utils/LargeObjectStorage.java | 5 ++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/VisualEditorActivity.java b/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/VisualEditorActivity.java index ba2ec0ad01d5..51e68741c910 100644 --- a/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/VisualEditorActivity.java +++ b/AnkiDroid/src/main/java/com/ichi2/anki/multimediacard/activity/VisualEditorActivity.java @@ -34,6 +34,7 @@ import com.ichi2.utils.AssetReader; import com.ichi2.utils.JSONObject; import com.ichi2.utils.LargeObjectStorage; +import com.ichi2.utils.LargeObjectStorage.StorageData; import com.ichi2.utils.LargeObjectStorage.StorageKey; import com.ichi2.utils.WebViewDebugging; import com.jaredrummler.android.colorpicker.ColorPickerDialog; @@ -42,6 +43,7 @@ import java.io.File; import java.io.IOException; +import java.io.Serializable; import java.util.Arrays; import java.util.List; import java.util.Locale; @@ -103,7 +105,7 @@ protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.visual_editor); - if (!setFieldsOnStartup()) { + if (!setFieldsOnStartup(savedInstanceState)) { failStartingVisualEditor(); return; } @@ -376,17 +378,23 @@ private void handleSelectionChanged(SelectionType selectionType) { } - private boolean setFieldsOnStartup() { + private boolean setFieldsOnStartup(Bundle savedInstanceState) { + + tryDeserializeSavedState(savedInstanceState); Bundle extras = this.getIntent().getExtras(); if (extras == null) { Timber.w("No Extras in Bundle"); return false; } - mCurrentText = mLargeObjectStorage.getSingleInstance(STORAGE_CURRENT_FIELD, extras); + if (mCurrentText == null) { + mCurrentText = mLargeObjectStorage.getSingleInstance(STORAGE_CURRENT_FIELD, extras); + } Integer index = (Integer) extras.getSerializable(VisualEditorActivity.EXTRA_FIELD_INDEX); - this.mFields = mLargeObjectStorage.getSingleInstance (STORAGE_EXTRA_FIELDS, extras); + if (mFields == null) { + this.mFields = mLargeObjectStorage.getSingleInstance (STORAGE_EXTRA_FIELDS, extras); + } Long modelId = (Long) extras.getSerializable(VisualEditorActivity.EXTRA_MODEL_ID); if (mCurrentText == null) { @@ -419,6 +427,19 @@ private boolean setFieldsOnStartup() { } + private void tryDeserializeSavedState(@Nullable Bundle savedInstanceState) { + if (savedInstanceState == null) { + return; + } + if (mLargeObjectStorage.hasKey(STORAGE_CURRENT_FIELD, savedInstanceState)) { + mCurrentText = mLargeObjectStorage.getSingleInstance(STORAGE_CURRENT_FIELD, savedInstanceState); + } + if (mLargeObjectStorage.hasKey(STORAGE_EXTRA_FIELDS, savedInstanceState)) { + mFields = mLargeObjectStorage.getSingleInstance(STORAGE_EXTRA_FIELDS, savedInstanceState); + } + } + + private void failStartingVisualEditor() { UIUtils.showThemedToast(this, "Unable to start visual editor", false); finishCancel(); @@ -601,6 +622,23 @@ private void resetSelectionType() { } + @Override + protected void onSaveInstanceState(@NonNull Bundle outState) { + super.onSaveInstanceState(outState); + storeDataNoException(outState, STORAGE_CURRENT_FIELD.asData(mCurrentText)); + storeDataNoException(outState, STORAGE_EXTRA_FIELDS.asData(mFields)); + } + + + private void storeDataNoException(@NonNull Bundle outState, StorageData data) { + try { + mLargeObjectStorage.storeSingleInstance(data, outState); + } catch (Exception e) { + Timber.e(e, "failed to store '%s'", STORAGE_CURRENT_FIELD.getBundleKey()); + } + } + + private void finishWithSuccess() { IField f = new TextField(); f.setText(mCurrentText); diff --git a/AnkiDroid/src/main/java/com/ichi2/utils/LargeObjectStorage.java b/AnkiDroid/src/main/java/com/ichi2/utils/LargeObjectStorage.java index 382b522e3ed5..7bf3626b6dca 100644 --- a/AnkiDroid/src/main/java/com/ichi2/utils/LargeObjectStorage.java +++ b/AnkiDroid/src/main/java/com/ichi2/utils/LargeObjectStorage.java @@ -98,6 +98,11 @@ public T getSingleInstance(StorageKey key, Bundle bu } + public boolean hasKey(StorageKey storageCurrentField, Bundle bundle) { + return bundle != null && bundle.containsKey(storageCurrentField.getBundleKey()); + } + + public static class StorageData { private final StorageKey mKey; private final T mData;