From 8c59b5376274be14414549c02203104c8e41c87a Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Fri, 16 Dec 2016 14:36:31 +0100 Subject: [PATCH 1/3] Remove old QuickMedia code that could be problematic --- .../wordpress/android/ui/posts/EditPostActivity.java | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java index 45ec27d86978..d0b3a4fc5a85 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java @@ -1624,11 +1624,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { } catch (OutOfMemoryError e) { AppLog.e(T.POSTS, e); } - } else if (TextUtils.isEmpty(mEditorFragment.getContent())) { - // TODO: check if it was mQuickMediaType > -1 - // Quick Photo was cancelled, delete post and finish activity - WordPress.wpDB.deletePost(getPost()); - finish(); } break; case RequestCodes.VIDEO_LIBRARY: @@ -1641,11 +1636,6 @@ public void onActivityResult(int requestCode, int resultCode, Intent data) { if (!addMedia(capturedVideoUri)) { ToastUtils.showToast(this, R.string.gallery_error, Duration.SHORT); } - } else if (TextUtils.isEmpty(mEditorFragment.getContent())) { - // TODO: check if it was mQuickMediaType > -1 - // Quick Photo was cancelled, delete post and finish activity - WordPress.wpDB.deletePost(getPost()); - finish(); } break; } From 943ef6625b665deeeb179ea1110b380e008e8dba Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Fri, 16 Dec 2016 14:54:35 +0100 Subject: [PATCH 2/3] Fix an issue in the Hybrid editor that could lead to an empty post title and content on save --- .../android/ui/posts/EditPostActivity.java | 48 +++++++++++++++---- .../android/editor/EditorFragment.java | 31 ++++++++---- .../editor/EditorFragmentAbstract.java | 5 +- 3 files changed, 64 insertions(+), 20 deletions(-) diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java index d0b3a4fc5a85..bebcf6cf7d58 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java @@ -56,6 +56,7 @@ import org.wordpress.android.analytics.AnalyticsTracker; import org.wordpress.android.analytics.AnalyticsTracker.Stat; import org.wordpress.android.editor.EditorFragment; +import org.wordpress.android.editor.EditorFragment.IllegalEditorStateException; import org.wordpress.android.editor.EditorFragmentAbstract; import org.wordpress.android.editor.EditorFragmentAbstract.EditorFragmentListener; import org.wordpress.android.editor.EditorFragmentAbstract.EditorDragAndDropListener; @@ -360,7 +361,12 @@ public void run() { new Thread(new Runnable() { @Override public void run() { - updatePostObject(true); + try { + updatePostObject(true); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "Impossible to save the post, we weren't able to update it."); + return; + } savePostToDb(); if (mHandler != null) { mHandler.postDelayed(mAutoSave, AUTOSAVE_INTERVAL_MILLIS); @@ -636,7 +642,12 @@ public void onClick(DialogInterface dialog, int id) { new Thread(new Runnable() { @Override public void run() { - updatePostObject(false); + try { + updatePostObject(false); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "Impossible to save and publish the post, we weren't able to update it."); + return; + } savePostToDb(); // If the post is empty, don't publish @@ -769,7 +780,7 @@ private void trackEditorCreatedPost(String action, Intent intent) { ); } - private synchronized void updatePostObject(boolean isAutosave) { + private synchronized void updatePostObject(boolean isAutosave) throws IllegalEditorStateException { if (mPost == null) { AppLog.e(AppLog.T.POSTS, "Attempted to save an invalid Post."); return; @@ -795,7 +806,12 @@ private void savePostAsync(final AfterSavePostListener listener) { new Thread(new Runnable() { @Override public void run() { - updatePostObject(false); + try { + updatePostObject(false); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "Impossible to save the post, we weren't able to update it."); + return; + } savePostToDb(); if (listener != null) { listener.onPostSave(); @@ -844,7 +860,12 @@ private class SaveAndFinishTask extends AsyncTask { @Override protected Boolean doInBackground(Void... params) { // Fetch post title and content from editor fields and update the Post object - updatePostObject(false); + try { + updatePostObject(false); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "Impossible to save the post, we weren't able to update it."); + return false; + } if (mEditorFragment != null && mPost.hasEmptyContentFields()) { // new and empty post? delete it @@ -865,7 +886,12 @@ protected Boolean doInBackground(Void... params) { updatePostContentNewEditor(false, mPost.getTitle(), mPost.getContent()); savePostToDb(); } else { - updatePostObject(false); + try { + updatePostObject(false); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "Impossible to save the post, we weren't able to update it."); + return false; + } savePostToDb(); } } @@ -1307,7 +1333,7 @@ private void prepareMediaPost() { /** * Updates post object with content of this fragment */ - public void updatePostContent(boolean isAutoSave) { + public void updatePostContent(boolean isAutoSave) throws IllegalEditorStateException { Post post = getPost(); if (post == null) { @@ -1866,8 +1892,12 @@ private void handleGalleryImageUploadedLegacyEditor(Long galleryId, String local // needed by the legacy editor to save local drafts postContent = new SpannableStringBuilder(mEditorFragment.getSpannedContent()); } else { - postContent = new SpannableStringBuilder(StringUtils.notNullStr((String) - mEditorFragment.getContent())); + try { + postContent = new SpannableStringBuilder(StringUtils.notNullStr((String) mEditorFragment.getContent())); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "Impossible to handle gallery upload, we weren't able to get content from the post"); + return; + } } int selectionStart = 0; int selectionEnd = postContent.length(); diff --git a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java index 9ff8df7d8133..2bad025a834b 100755 --- a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java +++ b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java @@ -68,6 +68,11 @@ public class EditorFragment extends EditorFragmentAbstract implements View.OnClickListener, View.OnTouchListener, OnJsEditorStateChangedListener, OnImeBackListener, EditorWebViewAbstract.AuthHeaderRequestListener, EditorMediaUploadListener { + + public class IllegalEditorStateException extends Exception { + + } + private static final String ARG_PARAM_TITLE = "param_title"; private static final String ARG_PARAM_CONTENT = "param_content"; @@ -423,8 +428,12 @@ public void setUserVisibleHint(boolean isVisibleToUser) { @Override public void onSaveInstanceState(Bundle outState) { - outState.putCharSequence(KEY_TITLE, getTitle()); - outState.putCharSequence(KEY_CONTENT, getContent()); + try { + outState.putCharSequence(KEY_TITLE, getTitle()); + outState.putCharSequence(KEY_CONTENT, getContent()); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "onSaveInstanceState: unable to get title or content"); + } } private ActionBar getActionBar() { @@ -636,9 +645,13 @@ public void run() { } // Update mTitle and mContentHtml with the latest state from the ZSSEditor - getTitle(); - getContent(); - + try { + getTitle(); + getContent(); + } catch (IllegalEditorStateException e) { + AppLog.e(T.EDITOR, "toggleHtmlMode: unable to get title or content"); + return; + } getActivity().runOnUiThread(new Runnable() { @Override public void run() { @@ -922,9 +935,9 @@ public void setContent(CharSequence text) { * where possible. */ @Override - public CharSequence getTitle() { + public CharSequence getTitle() throws IllegalEditorStateException { if (!isAdded()) { - return ""; + throw new IllegalEditorStateException(); } if (mSourceView != null && mSourceView.getVisibility() == View.VISIBLE) { @@ -961,9 +974,9 @@ public void run() { * where possible. */ @Override - public CharSequence getContent() { + public CharSequence getContent() throws IllegalEditorStateException { if (!isAdded()) { - return ""; + throw new IllegalEditorStateException(); } if (mSourceView != null && mSourceView.getVisibility() == View.VISIBLE) { diff --git a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java index ba15d036ab45..dcb3f2b8ef64 100644 --- a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java +++ b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java @@ -9,6 +9,7 @@ import com.android.volley.toolbox.ImageLoader; +import org.wordpress.android.editor.EditorFragment.IllegalEditorStateException; import org.wordpress.android.util.helpers.MediaFile; import org.wordpress.android.util.helpers.MediaGallery; @@ -18,8 +19,8 @@ public abstract class EditorFragmentAbstract extends Fragment { public abstract void setTitle(CharSequence text); public abstract void setContent(CharSequence text); - public abstract CharSequence getTitle(); - public abstract CharSequence getContent(); + public abstract CharSequence getTitle() throws IllegalEditorStateException; + public abstract CharSequence getContent() throws IllegalEditorStateException; public abstract void appendMediaFile(MediaFile mediaFile, String imageUrl, ImageLoader imageLoader); public abstract void appendGallery(MediaGallery mediaGallery); public abstract void setUrlForVideoPressId(String videoPressId, String url, String posterUrl); From e3baf0fb4a7c7cf544e00e078e55078763ad4294 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Fri, 16 Dec 2016 16:30:59 +0100 Subject: [PATCH 3/3] Fix EditorFragmentTest after adding getContent exception throw --- .../EditorFragmentTest.java | 14 ++++++++++---- .../wordpress/android/editor/EditorFragment.java | 6 ++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/libs/editor/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java b/libs/editor/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java index a955f0a9827b..54c1f831957e 100644 --- a/libs/editor/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java +++ b/libs/editor/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java @@ -5,6 +5,8 @@ import android.view.View; import android.widget.ToggleButton; +import org.wordpress.android.editor.EditorFragment.IllegalEditorStateException; + import java.util.HashMap; import java.util.Map; import java.util.concurrent.CountDownLatch; @@ -99,7 +101,7 @@ public void testFormatBarToggledOnSelectedFieldChanged() { assertTrue(htmlButton.isEnabled()); } - public void testHtmlModeToggleTextTransfer() throws InterruptedException { + public void testHtmlModeToggleTextTransfer() throws InterruptedException, IllegalEditorStateException { waitForOnDomLoaded(); final View view = mFragment.getView(); @@ -148,8 +150,12 @@ public void run() { contentText.setText("new content"); // Check that getTitle() and getContent() return latest version even in HTML mode - assertEquals("new title", mFragment.getTitle()); - assertEquals("new content", mFragment.getContent()); + try { + assertEquals("new title", mFragment.getTitle()); + assertEquals("new content", mFragment.getContent()); + } catch (IllegalEditorStateException e) { + throw new RuntimeException(); + } htmlButton.performClick(); // Turn off HTML mode @@ -174,4 +180,4 @@ private void waitForOnDomLoaded() { } } } -} \ No newline at end of file +} diff --git a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java index 2bad025a834b..81b2588e9433 100755 --- a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java +++ b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java @@ -650,6 +650,12 @@ public void run() { getContent(); } catch (IllegalEditorStateException e) { AppLog.e(T.EDITOR, "toggleHtmlMode: unable to get title or content"); + getActivity().runOnUiThread(new Runnable() { + @Override + public void run() { + toggleButton.setChecked(false); + } + }); return; } getActivity().runOnUiThread(new Runnable() {