From ef2179c9ad736fa0e86269a88b23f58d3b252988 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Tue, 24 May 2016 17:37:15 +0200 Subject: [PATCH 1/4] fix wordpress-mobile/WordPress-Editor-Android#294: Block HTML mode until insert image or video has finished --- .../wordpress/android/editor/EditorFragment.java | 16 +++++++++++++++- .../android/editor/JsCallbackReceiver.java | 5 +++++ .../editor/OnJsEditorStateChangedListener.java | 1 + .../src/main/res/values/strings.xml | 1 + .../editor-common/assets/ZSSRichTextEditor.js | 2 ++ 5 files changed, 24 insertions(+), 1 deletion(-) 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 d219ce4bf8d0..be1788f0ac10 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 @@ -71,6 +71,7 @@ public class EditorFragment extends EditorFragmentAbstract implements View.OnCli private static final float TOOLBAR_ALPHA_ENABLED = 1; private static final float TOOLBAR_ALPHA_DISABLED = 0.5f; + public static final int MAX_ACTION_TIME_MS = 2000; private String mTitle = ""; private String mContentHtml = ""; @@ -106,6 +107,8 @@ public class EditorFragment extends EditorFragmentAbstract implements View.OnCli private final Map mTagToggleButtonMap = new HashMap<>(); + private long mActionStartedAt = -1; + public static EditorFragment newInstance(String title, String content) { EditorFragment fragment = new EditorFragment(); Bundle args = new Bundle(); @@ -442,10 +445,15 @@ private void toggleHtmlMode(final ToggleButton toggleButton) { mEditorFragmentListener.onTrackableEvent(TrackableEvent.HTML_BUTTON_TAPPED); + if (System.currentTimeMillis() - mActionStartedAt < MAX_ACTION_TIME_MS) { + toggleButton.setChecked(false); + ToastUtils.showToast(getActivity(), R.string.alert_html_mode_not_ready, ToastUtils.Duration.LONG); + return; + } + // Don't switch to HTML mode if currently uploading media if (!mUploadingMedia.isEmpty()) { toggleButton.setChecked(false); - ToastUtils.showToast(getActivity(), R.string.alert_html_toggle_uploading, ToastUtils.Duration.LONG); return; } @@ -843,6 +851,7 @@ public void run() { mWebView.execJavaScriptFromString("ZSSEditor.insertImage('" + safeMediaUrl + "', '" + mediaId + "');"); } + mActionStartedAt = System.currentTimeMillis(); } else { String id = mediaFile.getMediaId(); if (mediaFile.isVideo()) { @@ -1471,4 +1480,9 @@ private void applyFormattingHtmlMode(ToggleButton toggleButton, String tag) { mSourceViewContent.setSelection(selectionEnd + endTag.length()); } } + + @Override + public void onActionFinished() { + mActionStartedAt = -1; + } } diff --git a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java index f8e9989891fb..b8212fcefae2 100755 --- a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java +++ b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java @@ -40,6 +40,8 @@ public class JsCallbackReceiver { private static final String CALLBACK_RESPONSE_STRING = "callback-response-string"; + private static final String CALLBACK_ACTION_FINISHED = "callback-action-finished"; + private final OnJsEditorStateChangedListener mListener; private Set mPreviousStyleSet = new HashSet<>(); @@ -224,6 +226,9 @@ public void executeCallback(String callbackId, String params) { } mListener.onGetHtmlResponse(Utils.buildMapFromKeyValuePairs(responseDataSet)); break; + case CALLBACK_ACTION_FINISHED: + mListener.onActionFinished(); + break; default: AppLog.d(AppLog.T.EDITOR, "Unhandled callback: " + callbackId + ":" + params); } diff --git a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java index a412581901cb..ca8cbf514825 100755 --- a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java +++ b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java @@ -16,4 +16,5 @@ public interface OnJsEditorStateChangedListener { void onMediaReplaced(String mediaId); void onVideoPressInfoRequested(String videoId); void onGetHtmlResponse(Map responseArgs); + void onActionFinished(); } diff --git a/libs/editor/WordPressEditor/src/main/res/values/strings.xml b/libs/editor/WordPressEditor/src/main/res/values/strings.xml index 77dd9fb59ccd..a2691b6d3f9d 100644 --- a/libs/editor/WordPressEditor/src/main/res/values/strings.xml +++ b/libs/editor/WordPressEditor/src/main/res/values/strings.xml @@ -16,6 +16,7 @@ Can\'t insert media directly in HTML mode. Please switch back to visual mode. You are currently uploading media. Please wait until this completes. + HTML mode not ready, try again. Stop uploading? Stop Upload diff --git a/libs/editor/libs/editor-common/assets/ZSSRichTextEditor.js b/libs/editor/libs/editor-common/assets/ZSSRichTextEditor.js index ed54dd7244b0..30634cbd69ce 100755 --- a/libs/editor/libs/editor-common/assets/ZSSRichTextEditor.js +++ b/libs/editor/libs/editor-common/assets/ZSSRichTextEditor.js @@ -1205,6 +1205,7 @@ ZSSEditor.insertImage = function(url, remoteId, alt) { this.insertHTMLWrappedInParagraphTags(html); this.sendEnabledStyles(); + this.callback("callback-action-finished"); }; /** @@ -1516,6 +1517,7 @@ ZSSEditor.insertVideo = function(videoURL, posterURL, videopressID) { this.insertHTMLWrappedInParagraphTags(html); this.sendEnabledStyles(); + this.callback("callback-action-finished"); }; /** From 2d16b8a6914dab61f17e5b1f2405882a0618941c Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Tue, 24 May 2016 17:48:26 +0200 Subject: [PATCH 2/4] Don't allow publishing if insert image or insert video action in progress --- .../wordpress/android/ui/posts/EditPostActivity.java | 3 ++- .../org/wordpress/android/editor/EditorFragment.java | 12 +++++------- .../android/editor/EditorFragmentAbstract.java | 1 + .../android/editor/LegacyEditorFragment.java | 5 ++++- .../WordPressEditor/src/main/res/values/strings.xml | 1 - 5 files changed, 12 insertions(+), 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 2f952cb0e294..82c6f7cbc4c0 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 @@ -589,7 +589,8 @@ public boolean onOptionsItemSelected(final MenuItem item) { MediaUploadService mediaUploadService = MediaUploadService.getInstance(); // Disable format bar buttons while a media upload is in progress - if ((mediaUploadService != null && mediaUploadService.hasUploads()) || mEditorFragment.isUploadingMedia()) { + if ((mediaUploadService != null && mediaUploadService.hasUploads()) || mEditorFragment.isUploadingMedia() || + mEditorFragment.isActionInProgress()) { ToastUtils.showToast(this, R.string.editor_toast_uploading_please_wait, Duration.SHORT); return false; } 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 be1788f0ac10..9e38f041dd66 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 @@ -438,6 +438,10 @@ public void onClick(DialogInterface dialog, int which) { } } + public boolean isActionInProgress() { + return System.currentTimeMillis() - mActionStartedAt < MAX_ACTION_TIME_MS; + } + private void toggleHtmlMode(final ToggleButton toggleButton) { if (!isAdded()) { return; @@ -445,14 +449,8 @@ private void toggleHtmlMode(final ToggleButton toggleButton) { mEditorFragmentListener.onTrackableEvent(TrackableEvent.HTML_BUTTON_TAPPED); - if (System.currentTimeMillis() - mActionStartedAt < MAX_ACTION_TIME_MS) { - toggleButton.setChecked(false); - ToastUtils.showToast(getActivity(), R.string.alert_html_mode_not_ready, ToastUtils.Duration.LONG); - return; - } - // Don't switch to HTML mode if currently uploading media - if (!mUploadingMedia.isEmpty()) { + if (!mUploadingMedia.isEmpty() || isActionInProgress()) { toggleButton.setChecked(false); ToastUtils.showToast(getActivity(), R.string.alert_html_toggle_uploading, ToastUtils.Duration.LONG); return; 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 09605ec7b0f0..f7acd42135a9 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 @@ -21,6 +21,7 @@ public abstract class EditorFragmentAbstract extends Fragment { public abstract void appendGallery(MediaGallery mediaGallery); public abstract void setUrlForVideoPressId(String videoPressId, String url, String posterUrl); public abstract boolean isUploadingMedia(); + public abstract boolean isActionInProgress(); public abstract boolean hasFailedMediaUploads(); public abstract void removeAllFailedMediaUploads(); public abstract void setTitlePlaceholder(CharSequence text); diff --git a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java index 246082504cc7..65c6bf593fa9 100644 --- a/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java +++ b/libs/editor/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java @@ -1164,11 +1164,14 @@ public void removeAllFailedMediaUploads() {} @Override public void setTitlePlaceholder(CharSequence text) { - } @Override public void setContentPlaceholder(CharSequence text) { + } + @Override + public boolean isActionInProgress() { + return false; } } diff --git a/libs/editor/WordPressEditor/src/main/res/values/strings.xml b/libs/editor/WordPressEditor/src/main/res/values/strings.xml index a2691b6d3f9d..77dd9fb59ccd 100644 --- a/libs/editor/WordPressEditor/src/main/res/values/strings.xml +++ b/libs/editor/WordPressEditor/src/main/res/values/strings.xml @@ -16,7 +16,6 @@ Can\'t insert media directly in HTML mode. Please switch back to visual mode. You are currently uploading media. Please wait until this completes. - HTML mode not ready, try again. Stop uploading? Stop Upload From f4c10f7f730b4eaeab4017da78baad0168f298da Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Tue, 24 May 2016 17:58:07 +0200 Subject: [PATCH 3/4] fix editor tests --- .../wordpress/android/editor/EditorFragmentAbstractTest.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/libs/editor/WordPressEditor/src/test/java/org/wordpress/android/editor/EditorFragmentAbstractTest.java b/libs/editor/WordPressEditor/src/test/java/org/wordpress/android/editor/EditorFragmentAbstractTest.java index 46870bcbd1c0..d9e045b2954b 100644 --- a/libs/editor/WordPressEditor/src/test/java/org/wordpress/android/editor/EditorFragmentAbstractTest.java +++ b/libs/editor/WordPressEditor/src/test/java/org/wordpress/android/editor/EditorFragmentAbstractTest.java @@ -79,6 +79,11 @@ public boolean isUploadingMedia() { return false; } + @Override + public boolean isActionInProgress() { + return false; + } + @Override public boolean hasFailedMediaUploads() { return false; From ad467286a976b8c1d6cf4cd795437c389a492401 Mon Sep 17 00:00:00 2001 From: Maxime Biais Date: Thu, 26 May 2016 17:57:41 +0200 Subject: [PATCH 4/4] Block media button if action in progress --- .../java/org/wordpress/android/editor/EditorFragment.java | 7 ++++++- .../editor/WordPressEditor/src/main/res/values/strings.xml | 2 +- 2 files changed, 7 insertions(+), 2 deletions(-) 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 9e38f041dd66..bc4932e0a3d3 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 @@ -452,7 +452,7 @@ private void toggleHtmlMode(final ToggleButton toggleButton) { // Don't switch to HTML mode if currently uploading media if (!mUploadingMedia.isEmpty() || isActionInProgress()) { toggleButton.setChecked(false); - ToastUtils.showToast(getActivity(), R.string.alert_html_toggle_uploading, ToastUtils.Duration.LONG); + ToastUtils.showToast(getActivity(), R.string.alert_action_while_uploading, ToastUtils.Duration.LONG); return; } @@ -584,6 +584,11 @@ public void onClick(View v) { mEditorFragmentListener.onTrackableEvent(TrackableEvent.MEDIA_BUTTON_TAPPED); ((ToggleButton) v).setChecked(false); + if (isActionInProgress()) { + ToastUtils.showToast(getActivity(), R.string.alert_action_while_uploading, ToastUtils.Duration.LONG); + return; + } + if (mSourceView.getVisibility() == View.VISIBLE) { ToastUtils.showToast(getActivity(), R.string.alert_insert_image_html_mode, ToastUtils.Duration.LONG); } else { diff --git a/libs/editor/WordPressEditor/src/main/res/values/strings.xml b/libs/editor/WordPressEditor/src/main/res/values/strings.xml index 77dd9fb59ccd..555d32d29728 100644 --- a/libs/editor/WordPressEditor/src/main/res/values/strings.xml +++ b/libs/editor/WordPressEditor/src/main/res/values/strings.xml @@ -15,7 +15,7 @@ Uploading gallery… Can\'t insert media directly in HTML mode. Please switch back to visual mode. - You are currently uploading media. Please wait until this completes. + You are currently uploading media. Please wait until this completes. Stop uploading? Stop Upload