From 9eaf95842954e90dbb01618e932ce1560ba1f5f6 Mon Sep 17 00:00:00 2001 From: Alex Forcier Date: Mon, 15 Jun 2015 08:00:45 -0400 Subject: [PATCH 1/8] Squashed 'libs/editor/' changes from aec6410..77cb2fb 77cb2fb Merge pull request #162 from wordpress-mobile/issue/19-integrate-editor-wpandroid 39ea8ca Updated target sdk and support libraries to 22 50437ce Gradle version bump a756e1f Merge branch 'develop' into issue/19-integrate-editor-wpandroid 5c9e419 Merge pull request #153 from wordpress-mobile/issue/127-blockquote-fixes e3a2560 Switched editor layout from LinearLayout to RelativeLayout e6f7bb3 Added debug logging for callback-response-string in JsCallbackReceiver f1cf184 Added callback-response-string callback check to JsCallbackReceiverTest 3a1a158 Merge branch 'develop' into issue/19-integrate-editor-wpandroid c6af228 Removed duplicate drawables (added by mistake in earlier merge from main WPAndroid project) ff78748 Print a debug log whenever getTitle() and getContent() are called from the UI thread 6692740 Updated EditorFragment.getTitle() and getContent() to never return null aed719f Added Android Studio's captures/ folder to .gitignore 34854be Merge pull request #154 from wordpress-mobile/issue/122-scroll-fixes 855d545 Changed new editor frag layout to linear f31b6c2 Updated getAncestorElementForSettingBlockquote... 6bcf90a Fixed an issue where empty field contents would be turned into a 'null' literal string 4102f09 Fixed issue where CountDownLatches weren't always being called in EditorFragment.onGetHtmlResponse() f6091bc Added a toggle for action bar auto-hiding inside onConfigurationChanged for EditorFragment c17b0e0 Implemented getTitle() and getContent() for EditorFragment ca18067 Added support for retrieving the contents of the title and content fields from JavaScript d2bf496 Changed Utils.buildMapFromKeyValuePairs() to only treat the first = as a delimiter bf0f787 Added missing backslash in strings.xml 3f975f8 Merge branch 'develop' into issue/19-integrate-editor-wpandroid 38effc2 Fixed NPE caused by missing null check in Utils.escapeHtml() c6ec3aa Extracted test content loading code from EditorFragment to MainExampleActivity 56306f4 Selected JS ports from iOS 60f0509 Merge branch 'develop' of github.com:wordpress-mobile/WordPress-Editor-Android into issue/127-blockquote-fixes db547f6 Merge pull request #147 from wordpress-mobile/issue/130-landscape-viewport 6d80fbc Removed integration test exclusion from build.gradle a335a99 Updated README to reflect new test setup 35fab19 Moved integration tests to /src/androidTest/ f493649 Merge pull request #146 from maxme/issue/fix-travis-build a2a64f1 move tests from WordPressEditor/src/androidTest to WordPressEditor/src/test and remove unused DrawerLayoutImpl.file 2b1c6a1 fix compile issue by updating robolectric gradle plugin to 1.1.0 9ede8d9 SDK package refinements for travis. c502e01 travis.yml tweaks 98e8e7b Updated ANDROID_HOME path in travis.yml 562d444 Switched to older style travis setup ec31e41 Updated rangy to 1.3 873abaa Updated EditorFragment to only hide the action bar on landscape mode 6b92d5c Added a workaround to fix Travis failing for MockEditorActivity 0fce2f9 Changed MockEditorActivity to extend ActionBarActivity 41965b8 Merge branch 'develop' into issue/130-landscape-viewport 567abd0 Handled hiding and showing the action bar when the keyboard is shown and hidden (respectively) ac66521 Hide the action bar in the editor fragment 46586df Merge pull request #143 from wordpress-mobile/issue/128-integration-tests 1b253ba Merge pull request #141 from wordpress-mobile/issue/139-tablet-padding 52e8fbb Updated the README with information on integration tests 05c09d2 Added checks for all buttons states to testFormatBarToggledOnSelectedFieldChanged() 7a73e7c Added a test class for the ZSSEditor c6ef596 Renamed tests manifest entry for MockEditorActivity d39585a Added some integration tests for EditorFragment c3ea838 Added an EditorFragmentForTests class, overriding certain EditorFragment methods for more testing support 0dbbd5f Added a mock EditorActivity to attach an EditorFragment to for testing 88a202d Renamed JsCallbackHandlerTest to JsCallbackReceiverTest to match the class being tested 0a5dd94 Modified gradle build file to support integration tests 06c24ff Added extra padding between format bar buttons on screens over 800dp wide 8f88f67 Moved tablet padding rules to a separate css file f24d87d Merge branch 'develop' into issue/139-tablet-padding e40225a Removed duplicate import f820758 Merge commit '40e798bf739c94adbc7aa9156ded0a5ad28dc462' into develop 1bba03f update to wputils 1.6.0 2d2bd8e Update wpeditor ec1855d Increased editor side padding for tablets 40e798b Merge pull request #140 from wordpress-mobile/issue/18-format-bar-tablet 904cf27 Use a placeholder image when thumbnail can't be decoded d3bd3f8 Removing potential race condition with WP image loading threads. db80eef WP library images and local images working. f7bbaab Local images are maintained after fragment is re-created. a0e0615 Returning to the post editor won't crash if Activity was destroyed. 2fe6c3f Merge branch 'develop' into issue/18-format-bar-tablet 8a1bf41 Merge pull request #138 from wordpress-mobile/issue/124-separate-files 559b7d8 Style updates. 9b89d36 Added support for strikethrough tag in EditorFragment efcde28 Added editor layout for tablets (sw600dp) 5e59531 Added selector for strikethrough button 3bf29a2 Added bigger HTML button drawables for tablet format bar 9239f92 Removed a lot of inline JS/CSS from the main editor html file. 64b83d3 Merge pull request #136 from wordpress-mobile/issue/132-formatbar-keyboard-old-api 2d7c9c4 Moved some WebView config code from EditorFragment to EditorWebViewAbstract c5882ba Merge remote-tracking branch 'remotes/origin/develop' into issue/132-formatbar-keyboard-old-api 0699bb6 Suppressed NewApi lint check for EditorWebView.execJavaScriptFromString 8d5b424 Added compatibility WebView for API<19 with custom method for executing JS 4478cf3 Merge pull request #133 from wordpress-mobile/issue/10-format-bar-phone ba3c137 Pulled the EditorWebView layout element into a separate file b4a21f4 Modified EditorWebView to use WebView.evaluateJavascript on API>=19 ef8b078 Added EditorWebViewAbstract and replaced EditorWebView usage in EditorFragment 50524b9 Moved the format bar's left margin inside the scrollview 0d2a713 Shrank HTML button and tightened its margins baa00c8 Removed unnecessary HTML button code f144a88 Linked up format bar buttons to ZSSEditor methods 570ae57 Added unit test for Utils.buildMapFromKeyValuePairs bbba60a Added partial support for the callback-selection-changed JS callback bb8c537 Added format bar buttons and dividers to editor layout 6e340ac Renamed format button highlighted underline dimens 315bb50 Relabeled legacy editor color assets 14c3938 Added new format bar icons and selectors 8303e45 Renamed legacy editor button selectors and images 6195fe0 Merge pull request #129 from wordpress-mobile/issue/23-extract-callback-handler 228a563 Qualified Utils static imports in UtilsTest 418d4b3 Some EditorFragment cleanup db3bd70 Added units tests for Utils 53821d7 Added units tests for JsCallbackHandler 862e533 Added some callback placeholders to JsCallbackReceiver with logging b746221 Renamed callback classes for clarity bedf027 Merge branch 'develop' into issue/23-extract-callback-handler eaa2f17 Merge pull request #21 from wordpress-mobile/feature/test-framework 5346958 Added a lint rule ignoring the 'InvalidPackage' check for Robolectric 83c3108 Added notes and logging for some currently unused JS callbacks 4c2f2d1 Downgrading plugin, tests aren't working with the new tools. 17ec76c Updating robolectric-gradle-plugin and the Android gradle build plugin. 201f7e7 Merge branch 'develop' into feature/test-framework abcf3e3 Moved some utility methods from EditorFragment to Utils 7f336ea Added a WebView sublcass, EditorWebView, and switched the editor to use that b7be242 Added handling for the "callback-selection-style" JS callback e9c6401 Updated onDomLoaded() to enable multiline support for the content field f1f933b Moved JsCallbackHandler to its own file 5da8d79 Added example format bar with bold button ea71291 Fix #2406 - Load media file in the background fc5f50d Merge pull request #22 from wordpress-mobile/feature/14-main-editor 3666662 Cleaned up EditorFragment 9645409 Changed project license from MIT to GPLv2 cfa2fe4 Fixed issue with JavaScript not loading on API<19 32591e0 Switched WebChromeClient onConsoleMessage to use debug log messages instead of error 10b5506 Updated to use build tools 21.1.2 54d20a7 Added title to editor example content 124981c Added travis build status to README 200efb8 Adding Robolectric test framework and JaCoCo code coverage reports. ef0e582 README cleanup d16a6d5 Set default activity for example application 23fd043 Updated README with build instructions for Windows (fixes assets symlink) 87c8911 Added @SuppressLint for web debugging a5e31e8 Changed WordPress-Utils-Android dependency to maven artifact 88f29c5 JS to Java callback proof of concept d2aa4f3 Updated ZSSRichTextEditor to latest version ced12ea Auto-load an example HTML file in editor dd66e62 Updated common editor files and imported editor HTML file from iOS efa02b7 fix gallery placeholder icon a6b5ecf Tapping a media gallery span opens gallery editor. 912f81a Adding missing override annotation. 58c9ae7 Using isVideo to determine if a file is a video. 1721d30 enable gallery handling 3ca1d97 remove unused code 9c806b5 first step at introducing the new media picker 94e0f77 rename and update editor colors 1b3b384 Merge branch 'develop' into feature/modularize-editor f6ef4ce fix local draft style saving by introducing an awful "getSpannedContent()" method :( 8f9d5e4 EditLinkActivity is now independent from the EditPostActivity 1d7067e add local draft / remote post example d33a9be make the legacy editor works in the example project 6f0d297 LegacyEditorFragment now lives in the editor subproject 777635b split MediaUtils in MediaUtils and WordPressMediaUtils - remove references to WordPress.java in MediaUtils 0c60b07 move WPUnderlineSpan.java and MediaGalleryImageSpan.java to WPUtils 11e6f7f use setFeaturedImageSupported instead of using WordPress.getCurrentBlog().isFeaturedImageCapable() fb3a66d appendMediaFile now able to load local media 068e0df reenable appendMedia in LegacyEditorFragment d847975 split methods to be usable on MediaFile instead of WPImageSpan 8978cb1 move WPEditImageSpan bitmap loading to the constructor 8141509 move WPImageSpan and MediaFile to WPUtils - also create a WPEditImageSpan class 839f755 first step to remove getContentEditText/getTitleEditText git-subtree-dir: libs/editor git-subtree-split: 77cb2fb13d1df4e392670f763bcb12d57d2fe851 --- .gitignore | 4 + .travis.yml | 8 +- LICENSE-MIT | 21 - LICENSE.md | 264 ++++ README.md | 40 +- WordPressEditor/build.gradle | 79 +- WordPressEditor/lint.xml | 6 + .../src/androidTest/AndroidManifest.xml | 11 + .../EditorFragmentForTests.java | 45 + .../EditorFragmentTest.java | 108 ++ .../MockActivity.java | 7 + .../MockEditorActivity.java | 53 + .../TestingUtils.java | 14 + .../ZssEditorTest.java | 107 ++ WordPressEditor/src/main/AndroidManifest.xml | 4 +- .../android/editor/EditorFragment.java | 381 ++++-- .../editor/EditorFragmentAbstract.java | 78 +- .../android/editor/EditorWebView.java | 23 + .../android/editor/EditorWebViewAbstract.java | 79 ++ .../editor/EditorWebViewCompatibility.java | 115 ++ .../android/editor/JsCallbackReceiver.java | 100 ++ .../android/editor/LegacyEditorFragment.java | 1116 ++++++++++++++++- .../OnJsEditorStateChangedListener.java | 10 + .../org/wordpress/android/editor/Utils.java | 116 ++ .../editor/legacy/EditLinkActivity.java | 75 ++ .../editor/legacy/WPEditImageSpan.java | 72 ++ .../main/res/drawable-hdpi/ab_icon_edit.png | Bin 0 -> 1340 bytes .../drawable-hdpi/format_bar_button_bold.png | Bin 0 -> 2393 bytes .../format_bar_button_bold_highlighted.png | Bin 0 -> 2263 bytes .../drawable-hdpi/format_bar_button_html.png | Bin 0 -> 837 bytes .../format_bar_button_html_highlighted.png | Bin 0 -> 788 bytes .../format_bar_button_italic.png | Bin 0 -> 2051 bytes .../format_bar_button_italic_highlighted.png | Bin 0 -> 1966 bytes .../drawable-hdpi/format_bar_button_link.png | Bin 0 -> 2762 bytes .../format_bar_button_link_highlighted.png | Bin 0 -> 2600 bytes .../drawable-hdpi/format_bar_button_media.png | Bin 0 -> 2667 bytes .../format_bar_button_media_highlighted.png | Bin 0 -> 2521 bytes .../drawable-hdpi/format_bar_button_more.png | Bin 0 -> 1529 bytes .../format_bar_button_more_highlighted.png | Bin 0 -> 1488 bytes .../drawable-hdpi/format_bar_button_ol.png | Bin 0 -> 2307 bytes .../format_bar_button_ol_highlighted.png | Bin 0 -> 2205 bytes .../drawable-hdpi/format_bar_button_quote.png | Bin 0 -> 2989 bytes .../format_bar_button_quote_highlighted.png | Bin 0 -> 2838 bytes .../format_bar_button_strikethrough.png | Bin 0 -> 2630 bytes ...t_bar_button_strikethrough_highlighted.png | Bin 0 -> 2494 bytes .../drawable-hdpi/format_bar_button_ul.png | Bin 0 -> 2030 bytes .../format_bar_button_ul_highlighted.png | Bin 0 -> 1943 bytes ...ks.png => legacy_dashicon_admin_links.png} | Bin ...g => legacy_dashicon_admin_links_grey.png} | Bin ...ld.png => legacy_dashicon_editor_bold.png} | Bin ...g => legacy_dashicon_editor_bold_grey.png} | Bin ... => legacy_dashicon_editor_insertmore.png} | Bin ...egacy_dashicon_editor_insertmore_grey.png} | Bin ....png => legacy_dashicon_editor_italic.png} | Bin ...=> legacy_dashicon_editor_italic_grey.png} | Bin ... legacy_dashicon_editor_strikethrough.png} | Bin ...cy_dashicon_editor_strikethrough_grey.png} | Bin ...g => legacy_dashicon_editor_underline.png} | Bin ...legacy_dashicon_editor_underline_grey.png} | Bin ...legacy_dashicon_format_image_big_grey.png} | Bin ...e.png => legacy_dashicon_format_quote.png} | Bin ... => legacy_dashicon_format_quote_grey.png} | Bin .../legacy_icon_mediagallery_placeholder.png | Bin 0 -> 2404 bytes .../res/drawable-hdpi/media_movieclip.png | Bin 0 -> 4208 bytes .../format_bar_button_html.png | Bin 0 -> 723 bytes .../format_bar_button_html_highlighted.png | Bin 0 -> 828 bytes .../format_bar_button_html.png | Bin 0 -> 1105 bytes .../format_bar_button_html_highlighted.png | Bin 0 -> 882 bytes .../format_bar_button_html.png | Bin 0 -> 1600 bytes .../format_bar_button_html_highlighted.png | Bin 0 -> 1482 bytes .../main/res/drawable-xhdpi/ab_icon_edit.png | Bin 0 -> 1439 bytes .../drawable-xhdpi/format_bar_button_bold.png | Bin 0 -> 1217 bytes .../format_bar_button_bold_highlighted.png | Bin 0 -> 1137 bytes .../drawable-xhdpi/format_bar_button_html.png | Bin 0 -> 870 bytes .../format_bar_button_html_highlighted.png | Bin 0 -> 824 bytes .../format_bar_button_italic.png | Bin 0 -> 1008 bytes .../format_bar_button_italic_highlighted.png | Bin 0 -> 927 bytes .../drawable-xhdpi/format_bar_button_link.png | Bin 0 -> 1797 bytes .../format_bar_button_link_highlighted.png | Bin 0 -> 1659 bytes .../format_bar_button_media.png | Bin 0 -> 1103 bytes .../format_bar_button_media_highlighted.png | Bin 0 -> 1021 bytes .../drawable-xhdpi/format_bar_button_more.png | Bin 0 -> 386 bytes .../format_bar_button_more_highlighted.png | Bin 0 -> 377 bytes .../drawable-xhdpi/format_bar_button_ol.png | Bin 0 -> 1332 bytes .../format_bar_button_ol_highlighted.png | Bin 0 -> 1255 bytes .../format_bar_button_quote.png | Bin 0 -> 1903 bytes .../format_bar_button_quote_highlighted.png | Bin 0 -> 1745 bytes .../format_bar_button_strikethrough.png | Bin 0 -> 1372 bytes ...t_bar_button_strikethrough_highlighted.png | Bin 0 -> 1267 bytes .../drawable-xhdpi/format_bar_button_ul.png | Bin 0 -> 920 bytes .../format_bar_button_ul_highlighted.png | Bin 0 -> 858 bytes ...ks.png => legacy_dashicon_admin_links.png} | Bin ...g => legacy_dashicon_admin_links_grey.png} | Bin ...ld.png => legacy_dashicon_editor_bold.png} | Bin ...g => legacy_dashicon_editor_bold_grey.png} | Bin ... => legacy_dashicon_editor_insertmore.png} | Bin ...egacy_dashicon_editor_insertmore_grey.png} | Bin ....png => legacy_dashicon_editor_italic.png} | Bin ...=> legacy_dashicon_editor_italic_grey.png} | Bin ... legacy_dashicon_editor_strikethrough.png} | Bin ...cy_dashicon_editor_strikethrough_grey.png} | Bin ...g => legacy_dashicon_editor_underline.png} | Bin ...legacy_dashicon_editor_underline_grey.png} | Bin ...legacy_dashicon_format_image_big_grey.png} | Bin ...e.png => legacy_dashicon_format_quote.png} | Bin ... => legacy_dashicon_format_quote_grey.png} | Bin .../legacy_icon_mediagallery_placeholder.png | Bin 0 -> 2774 bytes .../res/drawable-xhdpi/media_movieclip.png | Bin 0 -> 4292 bytes .../main/res/drawable-xxhdpi/ab_icon_edit.png | Bin 0 -> 1713 bytes .../format_bar_button_bold.png | Bin 0 -> 1842 bytes .../format_bar_button_bold_highlighted.png | Bin 0 -> 1705 bytes .../format_bar_button_html.png | Bin 0 -> 1395 bytes .../format_bar_button_html_highlighted.png | Bin 0 -> 1341 bytes .../format_bar_button_italic.png | Bin 0 -> 1604 bytes .../format_bar_button_italic_highlighted.png | Bin 0 -> 1498 bytes .../format_bar_button_link.png | Bin 0 -> 2707 bytes .../format_bar_button_link_highlighted.png | Bin 0 -> 2483 bytes .../format_bar_button_media.png | Bin 0 -> 1678 bytes .../format_bar_button_media_highlighted.png | Bin 0 -> 1587 bytes .../format_bar_button_more.png | Bin 0 -> 588 bytes .../format_bar_button_more_highlighted.png | Bin 0 -> 578 bytes .../drawable-xxhdpi/format_bar_button_ol.png | Bin 0 -> 1971 bytes .../format_bar_button_ol_highlighted.png | Bin 0 -> 1847 bytes .../format_bar_button_quote.png | Bin 0 -> 2951 bytes .../format_bar_button_quote_highlighted.png | Bin 0 -> 2698 bytes .../format_bar_button_strikethrough.png | Bin 0 -> 2095 bytes ...t_bar_button_strikethrough_highlighted.png | Bin 0 -> 1932 bytes .../drawable-xxhdpi/format_bar_button_ul.png | Bin 0 -> 1452 bytes .../format_bar_button_ul_highlighted.png | Bin 0 -> 1354 bytes ...ks.png => legacy_dashicon_admin_links.png} | Bin ...g => legacy_dashicon_admin_links_grey.png} | Bin ...ld.png => legacy_dashicon_editor_bold.png} | Bin ...g => legacy_dashicon_editor_bold_grey.png} | Bin ... => legacy_dashicon_editor_insertmore.png} | Bin ...egacy_dashicon_editor_insertmore_grey.png} | Bin ....png => legacy_dashicon_editor_italic.png} | Bin ...=> legacy_dashicon_editor_italic_grey.png} | Bin ... legacy_dashicon_editor_strikethrough.png} | Bin ...cy_dashicon_editor_strikethrough_grey.png} | Bin ...g => legacy_dashicon_editor_underline.png} | Bin ...legacy_dashicon_editor_underline_grey.png} | Bin ...legacy_dashicon_format_image_big_grey.png} | Bin ...e.png => legacy_dashicon_format_quote.png} | Bin ... => legacy_dashicon_format_quote_grey.png} | Bin .../legacy_icon_mediagallery_placeholder.png | Bin 0 -> 3826 bytes .../res/drawable-xxhdpi/media_movieclip.png | Bin 0 -> 2240 bytes .../format_bar_button_bold_selected_state.xml | 16 +- .../format_bar_button_bold_selector.xml | 6 +- ...ormat_bar_button_highlighted_underline.xml | 6 + .../format_bar_button_html_selected_state.xml | 16 + .../format_bar_button_html_selector.xml | 10 + ...ormat_bar_button_italic_selected_state.xml | 16 +- .../format_bar_button_italic_selector.xml | 6 +- .../format_bar_button_link_selected_state.xml | 16 +- .../format_bar_button_link_selector.xml | 6 +- ...format_bar_button_media_selected_state.xml | 16 +- .../format_bar_button_media_selector.xml | 6 +- .../format_bar_button_ol_selected_state.xml | 16 + .../format_bar_button_ol_selector.xml | 10 + ...format_bar_button_quote_selected_state.xml | 16 +- .../format_bar_button_quote_selector.xml | 8 +- ...ar_button_strikethrough_selected_state.xml | 16 + ...rmat_bar_button_strikethrough_selector.xml | 10 + .../format_bar_button_ul_selected_state.xml | 16 + .../format_bar_button_ul_selector.xml | 10 + ...format_bar_button_bold_selected_state.xml} | 6 +- ...egacy_format_bar_button_bold_selector.xml} | 6 +- ...ormat_bar_button_italic_selected_state.xml | 12 + ...gacy_format_bar_button_italic_selector.xml | 8 + ...format_bar_button_link_selected_state.xml} | 6 +- ...egacy_format_bar_button_link_selector.xml} | 6 +- ...ormat_bar_button_media_selected_state.xml} | 6 +- ...gacy_format_bar_button_media_selector.xml} | 8 +- ..._format_bar_button_more_selected_state.xml | 12 + ...legacy_format_bar_button_more_selector.xml | 8 + ...format_bar_button_quote_selected_state.xml | 12 + ...egacy_format_bar_button_quote_selector.xml | 8 + ...ormat_bar_button_strike_selected_state.xml | 12 + ...gacy_format_bar_button_strike_selector.xml | 8 + ...at_bar_button_underline_selected_state.xml | 12 + ...y_format_bar_button_underline_selector.xml | 8 + .../src/main/res/drawable/list_divider.xml | 4 +- .../drawable/pressed_background_wordpress.xml | 2 +- .../res/layout-sw600dp/fragment_editor.xml | 134 ++ .../main/res/layout-v19/editor_webview.xml | 6 + .../src/main/res/layout/alert_create_link.xml | 42 + .../main/res/layout/alert_image_options.xml | 81 ++ .../src/main/res/layout/editor_webview.xml | 6 + .../res/layout/fragment_edit_post_content.xml | 22 +- .../src/main/res/layout/fragment_editor.xml | 122 +- .../src/main/res/values-w1280dp/layouts.xml | 4 + .../src/main/res/values-w800dp/dimens.xml | 5 + .../src/main/res/values/colors.xml | 14 +- .../src/main/res/values/dimens.xml | 21 +- .../src/main/res/values/layouts.xml | 4 + .../src/main/res/values/strings.xml | 25 + .../src/main/res/values/styles.xml | 30 + .../src/main/res/values/wp_colors.xml | 5 + .../android/editor/ApplicationTest.java | 0 .../editor/EditorFragmentAbstractTest.java | 77 ++ .../editor/JsCallbackReceiverTest.java | 99 ++ .../wordpress/android/editor/UtilsTest.java | 124 ++ example/build.gradle | 6 +- example/src/main/AndroidManifest.xml | 6 +- .../example/EditorExampleActivity.java | 43 +- .../example/MainExampleActivity.java | 33 +- .../src/main/res/layout/activity_example.xml | 14 +- .../res/layout/activity_legacy_editor.xml | 2 +- example/src/main/res/values/strings.xml | 11 +- .../editor-common/assets/ZSSRichTextEditor.js | 1054 ++++++++++++---- libs/editor-common/assets/android-editor.html | 39 +- libs/editor-common/assets/editor-android.css | 13 + libs/editor-common/assets/editor.css | 303 +++++ .../editor-common/assets/example-content.html | 53 + libs/editor-common/assets/jquery-2.0.3.min.js | 6 - libs/editor-common/assets/jquery-2.1.3.min.js | 4 + .../assets/jquery.mobile-events.min.js | 0 libs/editor-common/assets/js-beautifier.js | 766 +++++++++++ .../assets/rangy-classapplier.js | 15 + libs/editor-common/assets/rangy-core.js | 11 + .../assets/rangy-cssclassapplier.js | 32 + .../editor-common/assets/rangy-highlighter.js | 12 + .../assets/rangy-selectionsaverestore.js | 15 + libs/editor-common/assets/rangy-serializer.js | 16 + libs/editor-common/assets/rangy-textrange.js | 32 + libs/editor-common/assets/wpload.js | 108 ++ libs/editor-common/assets/wpsave.js | 113 ++ 227 files changed, 6353 insertions(+), 477 deletions(-) delete mode 100644 LICENSE-MIT create mode 100644 LICENSE.md create mode 100644 WordPressEditor/lint.xml create mode 100644 WordPressEditor/src/androidTest/AndroidManifest.xml create mode 100644 WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentForTests.java create mode 100644 WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java create mode 100644 WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockActivity.java create mode 100644 WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockEditorActivity.java create mode 100644 WordPressEditor/src/androidTest/java/org.wordpress.android.editor/TestingUtils.java create mode 100644 WordPressEditor/src/androidTest/java/org.wordpress.android.editor/ZssEditorTest.java mode change 100644 => 100755 WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java create mode 100644 WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebView.java create mode 100644 WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewAbstract.java create mode 100644 WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewCompatibility.java create mode 100755 WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java create mode 100755 WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java create mode 100644 WordPressEditor/src/main/java/org/wordpress/android/editor/Utils.java create mode 100644 WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/EditLinkActivity.java create mode 100644 WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/WPEditImageSpan.java create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/ab_icon_edit.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_bold.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_bold_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_html.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_html_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_italic.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_italic_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_link.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_link_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_media.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_media_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_more.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_more_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ol.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ol_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_quote.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_quote_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_strikethrough.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_strikethrough_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ul.png create mode 100755 WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ul_highlighted.png rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_admin_links.png => legacy_dashicon_admin_links.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_admin_links_grey.png => legacy_dashicon_admin_links_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_bold.png => legacy_dashicon_editor_bold.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_bold_grey.png => legacy_dashicon_editor_bold_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_insertmore.png => legacy_dashicon_editor_insertmore.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_insertmore_grey.png => legacy_dashicon_editor_insertmore_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_italic.png => legacy_dashicon_editor_italic.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_italic_grey.png => legacy_dashicon_editor_italic_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_strikethrough.png => legacy_dashicon_editor_strikethrough.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_strikethrough_grey.png => legacy_dashicon_editor_strikethrough_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_underline.png => legacy_dashicon_editor_underline.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_editor_underline_grey.png => legacy_dashicon_editor_underline_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_format_image_big_grey.png => legacy_dashicon_format_image_big_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_format_quote.png => legacy_dashicon_format_quote.png} (100%) rename WordPressEditor/src/main/res/drawable-hdpi/{dashicon_format_quote_grey.png => legacy_dashicon_format_quote_grey.png} (100%) create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/legacy_icon_mediagallery_placeholder.png create mode 100644 WordPressEditor/src/main/res/drawable-hdpi/media_movieclip.png create mode 100644 WordPressEditor/src/main/res/drawable-sw600dp-hdpi/format_bar_button_html.png create mode 100644 WordPressEditor/src/main/res/drawable-sw600dp-hdpi/format_bar_button_html_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-sw600dp-xhdpi/format_bar_button_html.png create mode 100644 WordPressEditor/src/main/res/drawable-sw600dp-xhdpi/format_bar_button_html_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-sw600dp-xxhdpi/format_bar_button_html.png create mode 100644 WordPressEditor/src/main/res/drawable-sw600dp-xxhdpi/format_bar_button_html_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/ab_icon_edit.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_bold.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_bold_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_html.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_html_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_italic.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_italic_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_link.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_link_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_media.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_media_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_more.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_more_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_ol.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_ol_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_quote.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_quote_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_strikethrough.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_strikethrough_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_ul.png create mode 100755 WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_ul_highlighted.png rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_admin_links.png => legacy_dashicon_admin_links.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_admin_links_grey.png => legacy_dashicon_admin_links_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_bold.png => legacy_dashicon_editor_bold.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_bold_grey.png => legacy_dashicon_editor_bold_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_insertmore.png => legacy_dashicon_editor_insertmore.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_insertmore_grey.png => legacy_dashicon_editor_insertmore_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_italic.png => legacy_dashicon_editor_italic.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_italic_grey.png => legacy_dashicon_editor_italic_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_strikethrough.png => legacy_dashicon_editor_strikethrough.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_strikethrough_grey.png => legacy_dashicon_editor_strikethrough_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_underline.png => legacy_dashicon_editor_underline.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_editor_underline_grey.png => legacy_dashicon_editor_underline_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_format_image_big_grey.png => legacy_dashicon_format_image_big_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_format_quote.png => legacy_dashicon_format_quote.png} (100%) rename WordPressEditor/src/main/res/drawable-xhdpi/{dashicon_format_quote_grey.png => legacy_dashicon_format_quote_grey.png} (100%) create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/legacy_icon_mediagallery_placeholder.png create mode 100644 WordPressEditor/src/main/res/drawable-xhdpi/media_movieclip.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/ab_icon_edit.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_bold.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_bold_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_html.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_html_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_italic.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_italic_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_link.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_link_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_media.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_media_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_more.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_more_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ol.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ol_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_quote.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_quote_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_strikethrough.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_strikethrough_highlighted.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ul.png create mode 100755 WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ul_highlighted.png rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_admin_links.png => legacy_dashicon_admin_links.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_admin_links_grey.png => legacy_dashicon_admin_links_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_bold.png => legacy_dashicon_editor_bold.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_bold_grey.png => legacy_dashicon_editor_bold_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_insertmore.png => legacy_dashicon_editor_insertmore.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_insertmore_grey.png => legacy_dashicon_editor_insertmore_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_italic.png => legacy_dashicon_editor_italic.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_italic_grey.png => legacy_dashicon_editor_italic_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_strikethrough.png => legacy_dashicon_editor_strikethrough.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_strikethrough_grey.png => legacy_dashicon_editor_strikethrough_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_underline.png => legacy_dashicon_editor_underline.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_editor_underline_grey.png => legacy_dashicon_editor_underline_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_format_image_big_grey.png => legacy_dashicon_format_image_big_grey.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_format_quote.png => legacy_dashicon_format_quote.png} (100%) rename WordPressEditor/src/main/res/drawable-xxhdpi/{dashicon_format_quote_grey.png => legacy_dashicon_format_quote_grey.png} (100%) create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/legacy_icon_mediagallery_placeholder.png create mode 100644 WordPressEditor/src/main/res/drawable-xxhdpi/media_movieclip.png mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_bold_selected_state.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_bold_selector.xml create mode 100644 WordPressEditor/src/main/res/drawable/format_bar_button_highlighted_underline.xml create mode 100755 WordPressEditor/src/main/res/drawable/format_bar_button_html_selected_state.xml create mode 100755 WordPressEditor/src/main/res/drawable/format_bar_button_html_selector.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_italic_selected_state.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_italic_selector.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_link_selected_state.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_link_selector.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_media_selected_state.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_media_selector.xml create mode 100755 WordPressEditor/src/main/res/drawable/format_bar_button_ol_selected_state.xml create mode 100755 WordPressEditor/src/main/res/drawable/format_bar_button_ol_selector.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_quote_selected_state.xml mode change 100644 => 100755 WordPressEditor/src/main/res/drawable/format_bar_button_quote_selector.xml create mode 100644 WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selected_state.xml create mode 100644 WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selector.xml create mode 100755 WordPressEditor/src/main/res/drawable/format_bar_button_ul_selected_state.xml create mode 100755 WordPressEditor/src/main/res/drawable/format_bar_button_ul_selector.xml rename WordPressEditor/src/main/res/drawable/{format_bar_button_more_selected_state.xml => legacy_format_bar_button_bold_selected_state.xml} (50%) rename WordPressEditor/src/main/res/drawable/{format_bar_button_strike_selector.xml => legacy_format_bar_button_bold_selector.xml} (55%) create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selected_state.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selector.xml rename WordPressEditor/src/main/res/drawable/{format_bar_button_strike_selected_state.xml => legacy_format_bar_button_link_selected_state.xml} (50%) rename WordPressEditor/src/main/res/drawable/{format_bar_button_underline_selector.xml => legacy_format_bar_button_link_selector.xml} (55%) rename WordPressEditor/src/main/res/drawable/{format_bar_button_underline_selected_state.xml => legacy_format_bar_button_media_selected_state.xml} (52%) rename WordPressEditor/src/main/res/drawable/{format_bar_button_more_selector.xml => legacy_format_bar_button_media_selector.xml} (56%) create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selected_state.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selector.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selected_state.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selector.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selected_state.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selector.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selected_state.xml create mode 100644 WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selector.xml create mode 100644 WordPressEditor/src/main/res/layout-sw600dp/fragment_editor.xml create mode 100644 WordPressEditor/src/main/res/layout-v19/editor_webview.xml create mode 100644 WordPressEditor/src/main/res/layout/alert_create_link.xml create mode 100644 WordPressEditor/src/main/res/layout/alert_image_options.xml create mode 100644 WordPressEditor/src/main/res/layout/editor_webview.xml mode change 100644 => 100755 WordPressEditor/src/main/res/layout/fragment_editor.xml create mode 100644 WordPressEditor/src/main/res/values-w1280dp/layouts.xml create mode 100644 WordPressEditor/src/main/res/values-w800dp/dimens.xml mode change 100644 => 100755 WordPressEditor/src/main/res/values/colors.xml create mode 100644 WordPressEditor/src/main/res/values/layouts.xml mode change 100644 => 100755 WordPressEditor/src/main/res/values/styles.xml create mode 100644 WordPressEditor/src/main/res/values/wp_colors.xml rename WordPressEditor/src/{androidTest => test}/java/org/wordpress/android/editor/ApplicationTest.java (100%) create mode 100644 WordPressEditor/src/test/java/org/wordpress/android/editor/EditorFragmentAbstractTest.java create mode 100644 WordPressEditor/src/test/java/org/wordpress/android/editor/JsCallbackReceiverTest.java create mode 100644 WordPressEditor/src/test/java/org/wordpress/android/editor/UtilsTest.java mode change 100644 => 100755 libs/editor-common/assets/ZSSRichTextEditor.js mode change 100644 => 100755 libs/editor-common/assets/android-editor.html create mode 100644 libs/editor-common/assets/editor-android.css create mode 100644 libs/editor-common/assets/editor.css create mode 100644 libs/editor-common/assets/example-content.html delete mode 100644 libs/editor-common/assets/jquery-2.0.3.min.js create mode 100644 libs/editor-common/assets/jquery-2.1.3.min.js mode change 100644 => 100755 libs/editor-common/assets/jquery.mobile-events.min.js create mode 100644 libs/editor-common/assets/js-beautifier.js create mode 100755 libs/editor-common/assets/rangy-classapplier.js create mode 100755 libs/editor-common/assets/rangy-core.js create mode 100644 libs/editor-common/assets/rangy-cssclassapplier.js create mode 100755 libs/editor-common/assets/rangy-highlighter.js create mode 100755 libs/editor-common/assets/rangy-selectionsaverestore.js create mode 100755 libs/editor-common/assets/rangy-serializer.js create mode 100755 libs/editor-common/assets/rangy-textrange.js create mode 100644 libs/editor-common/assets/wpload.js create mode 100644 libs/editor-common/assets/wpsave.js diff --git a/.gitignore b/.gitignore index cd6a3d9b15d8..1cbbb457376f 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ bin/ gen/ build/ */build/ +captures/ # Local configuration file (sdk path, etc) local.properties @@ -46,3 +47,6 @@ WordPress/src/main/res/values/com_crashlytics_export_strings.xml # Monkey runner settings *.pyc + +# libs +libs/utils diff --git a/.travis.yml b/.travis.yml index 797aec1f8a69..a656dc434d94 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,10 @@ jdk: oraclejdk7 android: components: - - build-tools-21.1.1 - - android-19 + - extra-android-m2repository + - extra-android-support + - build-tools-22.0.1 + - android-22 env: global: @@ -13,4 +15,4 @@ env: - ANDROID_TARGET=android-14 script: - - ./gradlew -PdisablePreDex build + - ./gradlew build diff --git a/LICENSE-MIT b/LICENSE-MIT deleted file mode 100644 index 63ecc8b97bb5..000000000000 --- a/LICENSE-MIT +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2013 Automattic Inc. - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. \ No newline at end of file diff --git a/LICENSE.md b/LICENSE.md new file mode 100644 index 000000000000..0671f06ac7c3 --- /dev/null +++ b/LICENSE.md @@ -0,0 +1,264 @@ +The GNU General Public License, Version 2, June 1991 (GPLv2) +============================================================ + +> Copyright (C) 1989, 1991 Free Software Foundation, Inc. +> 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + +Everyone is permitted to copy and distribute verbatim copies of this license +document, but changing it is not allowed. + + +Preamble +-------- + +The licenses for most software are designed to take away your freedom to share +and change it. By contrast, the GNU General Public License is intended to +guarantee your freedom to share and change free software--to make sure the +software is free for all its users. This General Public License applies to most +of the Free Software Foundation's software and to any other program whose +authors commit to using it. (Some other Free Software Foundation software is +covered by the GNU Library General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not price. Our +General Public Licenses are designed to make sure that you have the freedom to +distribute copies of free software (and charge for this service if you wish), +that you receive source code or can get it if you want it, that you can change +the software or use pieces of it in new free programs; and that you know you can +do these things. + +To protect your rights, we need to make restrictions that forbid anyone to deny +you these rights or to ask you to surrender the rights. These restrictions +translate to certain responsibilities for you if you distribute copies of the +software, or if you modify it. + +For example, if you distribute copies of such a program, whether gratis or for a +fee, you must give the recipients all the rights that you have. You must make +sure that they, too, receive or can get the source code. And you must show them +these terms so they know their rights. + +We protect your rights with two steps: (1) copyright the software, and (2) offer +you this license which gives you legal permission to copy, distribute and/or +modify the software. + +Also, for each author's protection and ours, we want to make certain that +everyone understands that there is no warranty for this free software. If the +software is modified by someone else and passed on, we want its recipients to +know that what they have is not the original, so that any problems introduced by +others will not reflect on the original authors' reputations. + +Finally, any free program is threatened constantly by software patents. We wish +to avoid the danger that redistributors of a free program will individually +obtain patent licenses, in effect making the program proprietary. To prevent +this, we have made it clear that any patent must be licensed for everyone's free +use or not licensed at all. + +The precise terms and conditions for copying, distribution and modification +follow. + + +Terms And Conditions For Copying, Distribution And Modification +--------------------------------------------------------------- + +**0.** This License applies to any program or other work which contains a notice +placed by the copyright holder saying it may be distributed under the terms of +this General Public License. The "Program", below, refers to any such program or +work, and a "work based on the Program" means either the Program or any +derivative work under copyright law: that is to say, a work containing the +Program or a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is included without +limitation in the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not covered by +this License; they are outside its scope. The act of running the Program is not +restricted, and the output from the Program is covered only if its contents +constitute a work based on the Program (independent of having been made by +running the Program). Whether that is true depends on what the Program does. + +**1.** You may copy and distribute verbatim copies of the Program's source code +as you receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice and +disclaimer of warranty; keep intact all the notices that refer to this License +and to the absence of any warranty; and give any other recipients of the Program +a copy of this License along with the Program. + +You may charge a fee for the physical act of transferring a copy, and you may at +your option offer warranty protection in exchange for a fee. + +**2.** You may modify your copy or copies of the Program or any portion of it, +thus forming a work based on the Program, and copy and distribute such +modifications or work under the terms of Section 1 above, provided that you also +meet all of these conditions: + +* **a)** You must cause the modified files to carry prominent notices stating + that you changed the files and the date of any change. + +* **b)** You must cause any work that you distribute or publish, that in whole + or in part contains or is derived from the Program or any part thereof, to + be licensed as a whole at no charge to all third parties under the terms of + this License. + +* **c)** If the modified program normally reads commands interactively when + run, you must cause it, when started running for such interactive use in the + most ordinary way, to print or display an announcement including an + appropriate copyright notice and a notice that there is no warranty (or + else, saying that you provide a warranty) and that users may redistribute + the program under these conditions, and telling the user how to view a copy + of this License. (Exception: if the Program itself is interactive but does + not normally print such an announcement, your work based on the Program is + not required to print an announcement.) + +These requirements apply to the modified work as a whole. If identifiable +sections of that work are not derived from the Program, and can be reasonably +considered independent and separate works in themselves, then this License, and +its terms, do not apply to those sections when you distribute them as separate +works. But when you distribute the same sections as part of a whole which is a +work based on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the entire whole, +and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest your +rights to work written entirely by you; rather, the intent is to exercise the +right to control the distribution of derivative or collective works based on the +Program. + +In addition, mere aggregation of another work not based on the Program with the +Program (or with a work based on the Program) on a volume of a storage or +distribution medium does not bring the other work under the scope of this +License. + +**3.** You may copy and distribute the Program (or a work based on it, under +Section 2) in object code or executable form under the terms of Sections 1 and 2 +above provided that you also do one of the following: + +* **a)** Accompany it with the complete corresponding machine-readable source + code, which must be distributed under the terms of Sections 1 and 2 above on + a medium customarily used for software interchange; or, + +* **b)** Accompany it with a written offer, valid for at least three years, to + give any third party, for a charge no more than your cost of physically + performing source distribution, a complete machine-readable copy of the + corresponding source code, to be distributed under the terms of Sections 1 + and 2 above on a medium customarily used for software interchange; or, + +* **c)** Accompany it with the information you received as to the offer to + distribute corresponding source code. (This alternative is allowed only for + noncommercial distribution and only if you received the program in object + code or executable form with such an offer, in accord with Subsection b + above.) + +The source code for a work means the preferred form of the work for making +modifications to it. For an executable work, complete source code means all the +source code for all modules it contains, plus any associated interface +definition files, plus the scripts used to control compilation and installation +of the executable. However, as a special exception, the source code distributed +need not include anything that is normally distributed (in either source or +binary form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component itself +accompanies the executable. + +If distribution of executable or object code is made by offering access to copy +from a designated place, then offering equivalent access to copy the source code +from the same place counts as distribution of the source code, even though third +parties are not compelled to copy the source along with the object code. + +**4.** You may not copy, modify, sublicense, or distribute the Program except as +expressly provided under this License. Any attempt otherwise to copy, modify, +sublicense or distribute the Program is void, and will automatically terminate +your rights under this License. However, parties who have received copies, or +rights, from you under this License will not have their licenses terminated so +long as such parties remain in full compliance. + +**5.** You are not required to accept this License, since you have not signed +it. However, nothing else grants you permission to modify or distribute the +Program or its derivative works. These actions are prohibited by law if you do +not accept this License. Therefore, by modifying or distributing the Program (or +any work based on the Program), you indicate your acceptance of this License to +do so, and all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +**6.** Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the original +licensor to copy, distribute or modify the Program subject to these terms and +conditions. You may not impose any further restrictions on the recipients' +exercise of the rights granted herein. You are not responsible for enforcing +compliance by third parties to this License. + +**7.** If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), conditions +are imposed on you (whether by court order, agreement or otherwise) that +contradict the conditions of this License, they do not excuse you from the +conditions of this License. If you cannot distribute so as to satisfy +simultaneously your obligations under this License and any other pertinent +obligations, then as a consequence you may not distribute the Program at all. +For example, if a patent license would not permit royalty-free redistribution of +the Program by all those who receive copies directly or indirectly through you, +then the only way you could satisfy both it and this License would be to refrain +entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under any +particular circumstance, the balance of the section is intended to apply and the +section as a whole is intended to apply in other circumstances. + +It is not the purpose of this section to induce you to infringe any patents or +other property right claims or to contest validity of any such claims; this +section has the sole purpose of protecting the integrity of the free software +distribution system, which is implemented by public license practices. Many +people have made generous contributions to the wide range of software +distributed through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing to +distribute software through any other system and a licensee cannot impose that +choice. + +This section is intended to make thoroughly clear what is believed to be a +consequence of the rest of this License. + +**8.** If the distribution and/or use of the Program is restricted in certain +countries either by patents or by copyrighted interfaces, the original copyright +holder who places the Program under this License may add an explicit +geographical distribution limitation excluding those countries, so that +distribution is permitted only in or among countries not thus excluded. In such +case, this License incorporates the limitation as if written in the body of this +License. + +**9.** The Free Software Foundation may publish revised and/or new versions of +the General Public License from time to time. Such new versions will be similar +in spirit to the present version, but may differ in detail to address new +problems or concerns. + +Each version is given a distinguishing version number. If the Program specifies +a version number of this License which applies to it and "any later version", +you have the option of following the terms and conditions either of that version +or of any later version published by the Free Software Foundation. If the +Program does not specify a version number of this License, you may choose any +version ever published by the Free Software Foundation. + +**10.** If you wish to incorporate parts of the Program into other free programs +whose distribution conditions are different, write to the author to ask for +permission. For software which is copyrighted by the Free Software Foundation, +write to the Free Software Foundation; we sometimes make exceptions for this. +Our decision will be guided by the two goals of preserving the free status of +all derivatives of our free software and of promoting the sharing and reuse of +software generally. + + +No Warranty +----------- + +**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR +THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE +STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM +"AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, +BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A +PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR +INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA +BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER +OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. diff --git a/README.md b/README.md index 80a0172530d0..a3781d021ea1 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,39 @@ -# WordPress-Android-Editor +# WordPress-Editor-Android # -## Introduction +[![Build Status](https://travis-ci.org/wordpress-mobile/WordPress-Editor-Android.svg?branch=develop)](https://travis-ci.org/wordpress-mobile/WordPress-Editor-Android) -The WordPress-Android-Editor is the text editor used in the [WordPress Android app](https://github.com/wordpress-mobile/WordPress-Android) to create and edit pages & posts. In short it's a simple, straightforward way to visually edit HTML. +## Introduction ## -## LICENSE +WordPress-Editor-Android is the text editor used in the [WordPress Android app](https://github.com/wordpress-mobile/WordPress-Android) to create and edit pages & posts. In short it's a simple, straightforward way to visually edit HTML. -This library is licensed under[MIT](LICENSE-MIT) +## Build Instructions ## + +Post-checkout instructions for Windows, necessary to convert the assets symlink to a Windows symlink: + +From git bash, inside the cloned project root: + + $ rm WordPressEditor/src/main/assets + $ git ls-files --deleted -z | git update-index --assume-unchanged -z --stdin + +Then, from a Windows command prompt: + + mklink /D [PROJECT_ROOT]\WordPressEditor\src\main\assets %PROJECT_ROOT%\libs\editor-common\assets + +Finally, update `[PROJECT_ROOT]\.git\info\exclude` to ignore the symlink locally: + + # assets symlink + WordPressEditor/src/main/assets + +## Testing ## + +This project has both unit testing and integration testing, maintained and run separately. + +Unit testing is done with the [Robolectric framework](http://robolectric.org/). To run unit tests simply run `gradlew testDebug`. Code coverage reports can be generated via [JaCoCo.](http://www.eclemma.org/jacoco/) To generate them locally run `gradlew jacocoTestReport`. + +Integration testing is done with the [Android testing framework](http://developer.android.com/tools/testing/testing_android.html). To run integration tests run `gradlew connectedAndroidTest`. + +Add new unit tests to `src/test/java/` and integration tests to `stc/androidTest/java/`. + +## LICENSE ## + +WordPress-Editor-Android is an Open Source project covered by the [GNU General Public License version 2](LICENSE.md). diff --git a/WordPressEditor/build.gradle b/WordPressEditor/build.gradle index f1b71cea54ed..5cec6ee06feb 100644 --- a/WordPressEditor/build.gradle +++ b/WordPressEditor/build.gradle @@ -3,11 +3,14 @@ buildscript { mavenCentral() } dependencies { - classpath 'com.android.tools.build:gradle:1.0.0' + classpath 'com.android.tools.build:gradle:1.2.3' + classpath 'org.robolectric:robolectric-gradle-plugin:1.1.0' } } apply plugin: 'com.android.library' +apply plugin: 'org.robolectric' +apply plugin: 'jacoco' apply plugin: 'maven' apply plugin: 'signing' @@ -18,14 +21,14 @@ repositories { android { publishNonDefault true - compileSdkVersion 21 - buildToolsVersion "21.1.1" + compileSdkVersion 22 + buildToolsVersion "22.0.1" defaultConfig { versionCode 1 versionName "1.0" minSdkVersion 14 - targetSdkVersion 21 + targetSdkVersion 22 } buildTypes { release { @@ -33,13 +36,33 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + // Avoid 'duplicate files during packaging of APK' errors + packagingOptions { + exclude 'LICENSE.txt' + exclude 'META-INF/LICENSE.txt' + exclude 'META-INF/LICENSE' + exclude 'META-INF/NOTICE' + exclude 'META-INF/NOTICE.txt' + } } dependencies { - compile 'com.android.support:appcompat-v7:21.0.+' - compile 'com.android.support:support-v4:21.0.+' + compile 'com.android.support:appcompat-v7:22.2.0' + compile 'com.android.support:support-v4:22.2.0' compile 'org.wordpress:analytics:1.0.0' - compile 'org.wordpress:utils:1.3.0' + compile 'org.wordpress:utils:1.6.0' + + // Test libraries + testCompile 'junit:junit:4.11' + testCompile 'org.mockito:mockito-core:1.10.19' + testCompile 'org.robolectric:robolectric:2.4' + + // Workaround for IDE bug + // http://stackoverflow.com/questions/22246183/android-studio-doesnt-recognize-espresso-classes + provided 'junit:junit:4.11' + provided 'org.mockito:mockito-core:1.10.19' + provided 'org.robolectric:robolectric:2.4' } signing { @@ -97,3 +120,45 @@ uploadArchives { } } } + +// +// Testing and code coverage +// + +android.testOptions.unitTests.all { + include '**/*Test.class' + exclude '**/ApplicationTest.class' +} + +jacoco { + toolVersion = "0.7.1.201405082137" +} + +// Use these to define which classes to include and exclude from code coverage analysis +def coverageSourceDirs = [ 'src/main/java' ] +def coverageExclusions = [ '**/R.class', + '**/R$*.class', + '**/*$ViewInjector*.*', + '**/BuildConfig.*', + '**/Manifest*.*', + '**/Legacy**.class', + '**/legacy/**/*.class' ] + +task jacocoTestReport(type: JacocoReport, dependsOn: "testDebug") { + group = "Reporting" + description = "Generate Jacoco coverage reports" + + classDirectories = fileTree( + dir: 'build/intermediates/classes/debug', + excludes: coverageExclusions + ) + + additionalSourceDirs = files(coverageSourceDirs) + sourceDirectories = files(coverageSourceDirs) + executionData = files('build/jacoco/testDebug.exec') + + reports { + xml.enabled = true + html.enabled = true + } +} diff --git a/WordPressEditor/lint.xml b/WordPressEditor/lint.xml new file mode 100644 index 000000000000..b7b4876d98b8 --- /dev/null +++ b/WordPressEditor/lint.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/androidTest/AndroidManifest.xml b/WordPressEditor/src/androidTest/AndroidManifest.xml new file mode 100644 index 000000000000..e05834c605df --- /dev/null +++ b/WordPressEditor/src/androidTest/AndroidManifest.xml @@ -0,0 +1,11 @@ + + + + + + > + diff --git a/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentForTests.java b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentForTests.java new file mode 100644 index 000000000000..c06ffb8c892e --- /dev/null +++ b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentForTests.java @@ -0,0 +1,45 @@ +package org.wordpress.android.editor; + +import android.os.Bundle; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import org.wordpress.android.editor.EditorFragment; +import org.wordpress.android.editor.EditorWebViewAbstract; +import org.wordpress.android.editor.R; + +import java.util.Map; + +public class EditorFragmentForTests extends EditorFragment { + protected EditorWebViewAbstract mWebView; + + protected boolean mInitCalled = false; + protected boolean mDomLoaded = false; + protected boolean mOnSelectionStyleChangedCalled = false; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View view = super.onCreateView(inflater, container, savedInstanceState); + mWebView = (EditorWebViewAbstract) view.findViewById(R.id.webview); + return view; + } + + @Override + protected void initJsEditor() { + super.initJsEditor(); + mInitCalled = true; + } + + @Override + public void onDomLoaded() { + super.onDomLoaded(); + mDomLoaded = true; + } + + @Override + public void onSelectionStyleChanged(final Map changeMap) { + super.onSelectionStyleChanged(changeMap); + mOnSelectionStyleChangedCalled = true; + } +} diff --git a/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java new file mode 100644 index 000000000000..955f455b71c8 --- /dev/null +++ b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/EditorFragmentTest.java @@ -0,0 +1,108 @@ +package org.wordpress.android.editor; + +import android.app.Activity; +import android.test.ActivityInstrumentationTestCase2; +import android.view.View; +import android.widget.ToggleButton; + +import org.wordpress.android.editor.R; + +import java.util.HashMap; +import java.util.Map; + +import static org.wordpress.android.editor.TestingUtils.waitFor; + +public class EditorFragmentTest extends ActivityInstrumentationTestCase2 { + private Activity mActivity; + private EditorFragmentForTests mFragment; + + public EditorFragmentTest() { + super(MockEditorActivity.class); + } + + @Override + protected void setUp() throws Exception { + super.setUp(); + mActivity = getActivity(); + mFragment = (EditorFragmentForTests) mActivity.getFragmentManager().findFragmentByTag("editorFragment"); + } + + public void testDomLoadedCallbackReceived() { + // initJsEditor() should have been called on setup + assertTrue(mFragment.mInitCalled); + + long start = System.currentTimeMillis(); + while(!mFragment.mDomLoaded) { + waitFor(10); + if (System.currentTimeMillis() - start > 5000) { + throw(new RuntimeException("Callback wait timed out")); + } + } + + // The JS editor should have sent out a callback when the DOM loaded, triggering onDomLoaded() + assertTrue(mFragment.mDomLoaded); + } + + public void testFormatBarToggledOnSelectedFieldChanged() { + Map selectionArgs = new HashMap<>(); + + selectionArgs.put("id", "zss_field_title"); + mFragment.onSelectionChanged(selectionArgs); + + waitFor(100); + + View view = mFragment.getView(); + + if (view == null) { + throw(new IllegalStateException("Fragment view is empty")); + } + + // The formatting buttons should be disabled while the title field is selected + ToggleButton mediaButton = (ToggleButton) view.findViewById(R.id.format_bar_button_media); + ToggleButton boldButton = (ToggleButton) view.findViewById(R.id.format_bar_button_bold); + ToggleButton italicButton = (ToggleButton) view.findViewById(R.id.format_bar_button_italic); + ToggleButton quoteButton = (ToggleButton) view.findViewById(R.id.format_bar_button_quote); + ToggleButton ulButton = (ToggleButton) view.findViewById(R.id.format_bar_button_ul); + ToggleButton olButton = (ToggleButton) view.findViewById(R.id.format_bar_button_ol); + ToggleButton linkButton = (ToggleButton) view.findViewById(R.id.format_bar_button_link); + ToggleButton strikethroughButton = (ToggleButton) view.findViewById(R.id.format_bar_button_strikethrough); + + assertFalse(mediaButton.isEnabled()); + assertFalse(boldButton.isEnabled()); + assertFalse(italicButton.isEnabled()); + assertFalse(quoteButton.isEnabled()); + assertFalse(ulButton.isEnabled()); + assertFalse(olButton.isEnabled()); + assertFalse(linkButton.isEnabled()); + + if (strikethroughButton != null) { + assertFalse(strikethroughButton.isEnabled()); + } + + // The HTML button should always be enabled + ToggleButton htmlButton = (ToggleButton) view.findViewById(R.id.format_bar_button_html); + assertTrue(htmlButton.isEnabled()); + + selectionArgs.clear(); + selectionArgs.put("id", "zss_field_content"); + mFragment.onSelectionChanged(selectionArgs); + + waitFor(100); + + // The formatting buttons should be enabled while the content field is selected + assertTrue(mediaButton.isEnabled()); + assertTrue(boldButton.isEnabled()); + assertTrue(italicButton.isEnabled()); + assertTrue(quoteButton.isEnabled()); + assertTrue(ulButton.isEnabled()); + assertTrue(olButton.isEnabled()); + assertTrue(linkButton.isEnabled()); + + if (strikethroughButton != null) { + assertTrue(strikethroughButton.isEnabled()); + } + + // The HTML button should always be enabled + assertTrue(htmlButton.isEnabled()); + } +} \ No newline at end of file diff --git a/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockActivity.java b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockActivity.java new file mode 100644 index 000000000000..d22446aee553 --- /dev/null +++ b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockActivity.java @@ -0,0 +1,7 @@ +package org.wordpress.android.editor; + +import android.app.Activity; + +public class MockActivity extends Activity { + +} diff --git a/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockEditorActivity.java b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockEditorActivity.java new file mode 100644 index 000000000000..b09ce03970fe --- /dev/null +++ b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/MockEditorActivity.java @@ -0,0 +1,53 @@ +package org.wordpress.android.editor; + +import android.app.FragmentManager; +import android.app.FragmentTransaction; +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.widget.LinearLayout; + +import org.wordpress.android.editor.EditorFragment; +import org.wordpress.android.editor.EditorFragmentAbstract; +import org.wordpress.android.util.helpers.MediaFile; + +public class MockEditorActivity extends ActionBarActivity implements EditorFragmentAbstract.EditorFragmentListener { + public static final int LAYOUT_ID = 999; + + @SuppressWarnings("ResourceType") + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + LinearLayout linearLayout = new LinearLayout(this); + linearLayout.setId(LAYOUT_ID); + setContentView(linearLayout); + + FragmentManager fragmentManager = getFragmentManager(); + FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); + + EditorFragment fragment = new EditorFragmentForTests(); + fragmentTransaction.add(linearLayout.getId(), fragment, "editorFragment"); + fragmentTransaction.commit(); + } + + @Override + public void onEditorFragmentInitialized() { + + } + + @Override + public void onSettingsClicked() { + + } + + @Override + public void onAddMediaClicked() { + + } + + @Override + public void saveMediaFile(MediaFile mediaFile) { + + } +} + diff --git a/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/TestingUtils.java b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/TestingUtils.java new file mode 100644 index 000000000000..e51cba6bafd2 --- /dev/null +++ b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/TestingUtils.java @@ -0,0 +1,14 @@ +package org.wordpress.android.editor; + +import org.wordpress.android.util.AppLog; + +public class TestingUtils { + + static public void waitFor(long milliseconds) { + try { + Thread.sleep(milliseconds); + } catch(InterruptedException e) { + AppLog.e(AppLog.T.EDITOR, "Thread interrupted"); + } + } +} diff --git a/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/ZssEditorTest.java b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/ZssEditorTest.java new file mode 100644 index 000000000000..f25d937e1c99 --- /dev/null +++ b/WordPressEditor/src/androidTest/java/org.wordpress.android.editor/ZssEditorTest.java @@ -0,0 +1,107 @@ +package org.wordpress.android.editor; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.app.Instrumentation; +import android.test.ActivityInstrumentationTestCase2; +import android.webkit.JavascriptInterface; + +import org.wordpress.android.editor.EditorWebView; +import org.wordpress.android.editor.EditorWebViewAbstract; +import org.wordpress.android.editor.Utils; + +import java.util.HashSet; +import java.util.Set; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; + +/** + * Tests for the ZSSEditor inside an EditorWebViewAbstract, with no UI. + */ +public class ZssEditorTest extends ActivityInstrumentationTestCase2 { + private static final String JS_CALLBACK_HANDLER = "nativeCallbackHandler"; + + private Instrumentation mInstrumentation; + private EditorWebViewAbstract mWebView; + + private CountDownLatch mSetUpLatch; + + private TestMethod mTestMethod; + private CountDownLatch mCallbackLatch; + private CountDownLatch mDomLoadedCallbackLatch; + private Set mCallbackSet; + + private enum TestMethod { + INIT + } + + public ZssEditorTest() { + super(MockActivity.class); + } + + @SuppressLint("AddJavascriptInterface") + @Override + protected void setUp() throws Exception { + super.setUp(); + mInstrumentation = getInstrumentation(); + Activity activity = getActivity(); + mSetUpLatch = new CountDownLatch(1); + mDomLoadedCallbackLatch = new CountDownLatch(1); + + mSetUpLatch.countDown(); + + final String htmlEditor = Utils.getHtmlFromFile(activity, "android-editor.html"); + activity.runOnUiThread(new Runnable() { + @Override + public void run() { + mWebView = new EditorWebView(mInstrumentation.getContext(), null); + mWebView.addJavascriptInterface(new MockJsCallbackReceiver(), JS_CALLBACK_HANDLER); + mWebView.loadDataWithBaseURL("file:///android_asset/", htmlEditor, "text/html", "utf-8", ""); + mSetUpLatch.countDown(); + } + }); + } + + public void testInitialization() throws InterruptedException { + // Wait for setUp() to finish initializing the WebView + mSetUpLatch.await(); + + // Identify this method to the MockJsCallbackReceiver + mTestMethod = TestMethod.INIT; + + // Expecting three startup callbacks from the ZSS editor + mCallbackLatch = new CountDownLatch(3); + mCallbackSet = new HashSet<>(); + boolean callbacksReceived = mCallbackLatch.await(5, TimeUnit.SECONDS); + assertTrue(callbacksReceived); + + Set expectedSet = new HashSet<>(); + expectedSet.add("callback-new-field:id=zss_field_title"); + expectedSet.add("callback-new-field:id=zss_field_content"); + expectedSet.add("callback-dom-loaded:undefined"); + + assertEquals(expectedSet, mCallbackSet); + } + + private class MockJsCallbackReceiver { + @JavascriptInterface + public void executeCallback(String callbackId, String params) { + if (callbackId.equals("callback-dom-loaded")) { + // Notify test methods that the dom has loaded + mDomLoadedCallbackLatch.countDown(); + } + + // Handle callbacks and count down latches according to the currently running test + switch(mTestMethod) { + case INIT: + if (callbackId.equals("callback-new-field") || callbackId.equals("callback-dom-loaded")) { + mCallbackSet.add(callbackId + ":" + params); + mCallbackLatch.countDown(); + } + break; + default: + throw(new RuntimeException("Unknown calling method")); + } + } + } +} diff --git a/WordPressEditor/src/main/AndroidManifest.xml b/WordPressEditor/src/main/AndroidManifest.xml index a450a0b8b95f..fcade320900d 100644 --- a/WordPressEditor/src/main/AndroidManifest.xml +++ b/WordPressEditor/src/main/AndroidManifest.xml @@ -1,5 +1,7 @@ - + + + > diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java old mode 100644 new mode 100755 index b14ab2adde8f..793a4e7ed823 --- a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragment.java @@ -1,33 +1,65 @@ package org.wordpress.android.editor; import android.annotation.SuppressLint; -import android.content.res.AssetManager; +import android.content.res.Configuration; +import android.os.Build; import android.os.Bundle; +import android.os.Looper; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; +import android.text.Spanned; import android.view.LayoutInflater; +import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; -import android.webkit.ConsoleMessage; -import android.webkit.JsResult; -import android.webkit.WebChromeClient; -import android.webkit.WebSettings; import android.webkit.WebView; -import android.webkit.WebViewClient; +import android.widget.ToggleButton; + +import com.android.volley.toolbox.ImageLoader; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.AppLog.T; +import org.wordpress.android.util.StringUtils; +import org.wordpress.android.util.helpers.MediaFile; +import org.wordpress.android.util.helpers.MediaGallery; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.Map; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.TimeUnit; -public class EditorFragment extends EditorFragmentAbstract { +public class EditorFragment extends EditorFragmentAbstract implements View.OnClickListener, View.OnTouchListener, + OnJsEditorStateChangedListener { private static final String ARG_PARAM_TITLE = "param_title"; private static final String ARG_PARAM_CONTENT = "param_content"; - private String mParamTitle; - private String mParamContent; - private WebView mWebView; + private static final String JS_CALLBACK_HANDLER = "nativeCallbackHandler"; + + private static final String TAG_FORMAT_BAR_BUTTON_MEDIA = "media"; + private static final String TAG_FORMAT_BAR_BUTTON_BOLD = "bold"; + private static final String TAG_FORMAT_BAR_BUTTON_ITALIC = "italic"; + private static final String TAG_FORMAT_BAR_BUTTON_QUOTE = "blockquote"; + private static final String TAG_FORMAT_BAR_BUTTON_UL = "unorderedList"; + private static final String TAG_FORMAT_BAR_BUTTON_OL = "orderedList"; + private static final String TAG_FORMAT_BAR_BUTTON_LINK = "link"; + private static final String TAG_FORMAT_BAR_BUTTON_STRIKETHROUGH = "strikeThrough"; + + private static final float TOOLBAR_ALPHA_ENABLED = 1; + private static final float TOOLBAR_ALPHA_DISABLED = 0.5f; + + private String mTitle = ""; + private String mContentHtml = ""; + + private ActionBarActivity mActivity; + private EditorWebViewAbstract mWebView; + private ActionBar mActionBar; + + private boolean mHideActionBarOnSoftKeyboardUp; + + private CountDownLatch mGetTitleCountDownLatch; + private CountDownLatch mGetContentCountDownLatch; + + private final Map mTagToggleButtonMap = new HashMap<>(); public static EditorFragment newInstance(String title, String content) { EditorFragment fragment = new EditorFragment(); @@ -44,18 +76,72 @@ public EditorFragment() { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (getArguments() != null) { - mParamTitle = getArguments().getString(ARG_PARAM_TITLE); - mParamContent = getArguments().getString(ARG_PARAM_CONTENT); - } + mActivity = (ActionBarActivity) getActivity(); + mActionBar = mActivity.getSupportActionBar(); } @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, - Bundle savedInstanceState) { + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_editor, container, false); - mWebView = (WebView) view.findViewById(R.id.webview); - initWebView(); + + mWebView = (EditorWebViewAbstract) view.findViewById(R.id.webview); + + mWebView.setOnTouchListener(this); + + // Setup hiding the action bar when the soft keyboard is displayed for narrow viewports + if (getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE + && !getResources().getBoolean(R.bool.is_large_tablet_landscape)) { + mHideActionBarOnSoftKeyboardUp = true; + } + + // Intercept back key presses while the keyboard is up, and reveal the action bar + mWebView.setOnImeBackListener(new EditorWebViewAbstract.OnImeBackListener() { + @Override + public void onImeBack() { + if (mHideActionBarOnSoftKeyboardUp && mActionBar != null && !mActionBar.isShowing()) { + mActionBar.show(); + } + } + }); + + mEditorFragmentListener.onEditorFragmentInitialized(); + + initJsEditor(); + + ToggleButton mediaButton = (ToggleButton) view.findViewById(R.id.format_bar_button_media); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_MEDIA, mediaButton); + + ToggleButton boldButton = (ToggleButton) view.findViewById(R.id.format_bar_button_bold); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_BOLD, boldButton); + + ToggleButton italicButton = (ToggleButton) view.findViewById(R.id.format_bar_button_italic); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_ITALIC, italicButton); + + ToggleButton quoteButton = (ToggleButton) view.findViewById(R.id.format_bar_button_quote); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_QUOTE, quoteButton); + + ToggleButton ulButton = (ToggleButton) view.findViewById(R.id.format_bar_button_ul); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_UL, ulButton); + + ToggleButton olButton = (ToggleButton) view.findViewById(R.id.format_bar_button_ol); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_OL, olButton); + + ToggleButton linkButton = (ToggleButton) view.findViewById(R.id.format_bar_button_link); + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_LINK, linkButton); + + // Tablet-only + ToggleButton strikethroughButton = (ToggleButton) view.findViewById(R.id.format_bar_button_strikethrough); + if (strikethroughButton != null) { + mTagToggleButtonMap.put(TAG_FORMAT_BAR_BUTTON_STRIKETHROUGH, strikethroughButton); + } + + ToggleButton htmlButton = (ToggleButton) view.findViewById(R.id.format_bar_button_html); + htmlButton.setOnClickListener(this); + + for (ToggleButton button : mTagToggleButtonMap.values()) { + button.setOnClickListener(this); + } + return view; } @@ -64,83 +150,234 @@ public void onDetach() { super.onDetach(); } - @SuppressLint("SetJavaScriptEnabled") - private void initWebView() { - WebSettings webSettings = mWebView.getSettings(); - webSettings.setJavaScriptEnabled(true); - webSettings.setDefaultTextEncodingName("utf-8"); - mWebView.setWebViewClient(new WebViewClient() { - public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { - AppLog.e(T.EDITOR, description); - } - }); - mWebView.setWebChromeClient(new WebChromeClient() { - public boolean onConsoleMessage(ConsoleMessage cm) { - AppLog.e(T.EDITOR, cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId()); - return true; - } + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); - @Override - public boolean onJsAlert(WebView view, String url, String message, JsResult result) { - AppLog.e(T.EDITOR, message); - return true; - } + // Toggle action bar auto-hiding for the new orientation + if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE + && !getResources().getBoolean(R.bool.is_large_tablet_landscape)) { + mHideActionBarOnSoftKeyboardUp = true; + } else { + mHideActionBarOnSoftKeyboardUp = false; + } + } + + protected void initJsEditor() { + String htmlEditor = Utils.getHtmlFromFile(mActivity, "android-editor.html"); + + mWebView.addJavascriptInterface(new JsCallbackReceiver(this), JS_CALLBACK_HANDLER); - @Override - public void onConsoleMessage(String message, int lineNumber, String sourceId) { - AppLog.e(T.EDITOR, message + " -- from line " + lineNumber + " of " + sourceId); - } - }); - String htmlEditor = getHtmlEditor(); mWebView.loadDataWithBaseURL("file:///android_asset/", htmlEditor, "text/html", "utf-8", ""); + + enableWebDebugging(true); } - private String getStringFromAsset(String filename) throws IOException { - if (!isAdded()) { - return null; + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.format_bar_button_bold) { + mWebView.execJavaScriptFromString("ZSSEditor.setBold();"); + } else if (id == R.id.format_bar_button_italic) { + mWebView.execJavaScriptFromString("ZSSEditor.setItalic();"); + } else if (id == R.id.format_bar_button_strikethrough) { + mWebView.execJavaScriptFromString("ZSSEditor.setStrikeThrough();"); + } else if (id == R.id.format_bar_button_quote) { + mWebView.execJavaScriptFromString("ZSSEditor.setBlockquote();"); + } else if (id == R.id.format_bar_button_ul) { + mWebView.execJavaScriptFromString("ZSSEditor.setUnorderedList();"); + } else if (id == R.id.format_bar_button_ol) { + mWebView.execJavaScriptFromString("ZSSEditor.setOrderedList();"); + } else if (id == R.id.format_bar_button_media) { + // TODO: Handle inserting media + ((ToggleButton) v).setChecked(false); + } else if (id == R.id.format_bar_button_link) { + // TODO: Handle inserting a link + ((ToggleButton) v).setChecked(false); + } else if (id == R.id.format_bar_button_html) { + // TODO: Handle HTML mode toggling + ((ToggleButton) v).setChecked(false); } - AssetManager assetManager = getActivity().getAssets(); - InputStream in = assetManager.open(filename); - InputStreamReader is = new InputStreamReader(in); - StringBuilder sb = new StringBuilder(); - BufferedReader br = new BufferedReader(is); - String read = br.readLine(); - while (read != null) { - sb.append(read); - sb.append('\n'); - read = br.readLine(); + } + + @Override + public boolean onTouch(View view, MotionEvent event) { + if (mHideActionBarOnSoftKeyboardUp && event.getAction() == MotionEvent.ACTION_UP) { + // If the WebView has received a touch event, the keyboard will be displayed and the action bar should hide + if (isAdded() && mActionBar != null && mActionBar.isShowing()) { + mActionBar.hide(); + return false; + } } - return sb.toString(); + return false; } - private String getHtmlEditor() { - try { - return getStringFromAsset("android-editor.html"); - } catch (IOException e) { - AppLog.e(T.EDITOR, e.getMessage()); - return null; + @SuppressLint("NewApi") + private void enableWebDebugging(boolean enable) { + if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { + AppLog.i(T.EDITOR, "Enabling web debugging"); + WebView.setWebContentsDebuggingEnabled(enable); } } @Override public void setTitle(CharSequence text) { - // TODO + mTitle = text.toString(); } @Override public void setContent(CharSequence text) { - // TODO + mContentHtml = text.toString(); } + /** + * Returns the contents of the title field from the JavaScript editor. Should be called from a background thread + * where possible. + */ @Override public CharSequence getTitle() { - // TODO - return null; + if (Looper.myLooper() == Looper.getMainLooper()) { + AppLog.d(T.EDITOR, "getTitle() called from UI thread"); + } + + mGetTitleCountDownLatch = new CountDownLatch(1); + + // All WebView methods must be called from the UI thread + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mWebView.execJavaScriptFromString("ZSSEditor.getField('zss_field_title').getHTMLForCallback();"); + } + }); + + try { + mGetTitleCountDownLatch.await(1, TimeUnit.SECONDS); + } catch (InterruptedException e) { + AppLog.e(T.EDITOR, e); + Thread.currentThread().interrupt(); + } + + return StringUtils.notNullStr(mTitle); } + /** + * Returns the contents of the content field from the JavaScript editor. Should be called from a background thread + * where possible. + */ @Override public CharSequence getContent() { + if (Looper.myLooper() == Looper.getMainLooper()) { + AppLog.d(T.EDITOR, "getContent() called from UI thread"); + } + + mGetContentCountDownLatch = new CountDownLatch(1); + + // All WebView methods must be called from the UI thread + mActivity.runOnUiThread(new Runnable() { + @Override + public void run() { + mWebView.execJavaScriptFromString("ZSSEditor.getField('zss_field_content').getHTMLForCallback();"); + } + }); + + try { + mGetContentCountDownLatch.await(1, TimeUnit.SECONDS); + } catch (InterruptedException e) { + AppLog.e(T.EDITOR, e); + Thread.currentThread().interrupt(); + } + + return StringUtils.notNullStr(mContentHtml); + } + + @Override + public void appendMediaFile(MediaFile mediaFile, String imageUrl, ImageLoader imageLoader) { + // TODO + } + + @Override + public void appendGallery(MediaGallery mediaGallery) { // TODO + } + + @Override + public Spanned getSpannedContent() { return null; } + + public void onDomLoaded() { + mWebView.post(new Runnable() { + public void run() { + mWebView.execJavaScriptFromString("ZSSEditor.getField('zss_field_content').setMultiline('true');"); + + // Load title and content into ZSSEditor + mWebView.execJavaScriptFromString("ZSSEditor.getField('zss_field_title').setHTML('" + + Utils.escapeHtml(mTitle) + "');"); + mWebView.execJavaScriptFromString("ZSSEditor.getField('zss_field_content').setHTML('" + + Utils.escapeHtml(mContentHtml) + "');"); + + if (mHideActionBarOnSoftKeyboardUp) { + mActionBar.hide(); + } + } + }); + } + + public void onSelectionStyleChanged(final Map changeMap) { + mWebView.post(new Runnable() { + public void run() { + for (Map.Entry entry : changeMap.entrySet()) { + // Handle toggling format bar style buttons + ToggleButton button = mTagToggleButtonMap.get(entry.getKey()); + if (button != null) { + button.setChecked(entry.getValue()); + } + } + } + }); + } + + public void onSelectionChanged(final Map selectionArgs) { + final String focusedFieldId = selectionArgs.get("id"); // The field now in focus + mWebView.post(new Runnable() { + @Override + public void run() { + if (!focusedFieldId.isEmpty()) { + switch(focusedFieldId) { + case "zss_field_title": + updateToolbarEnabledState(false); + break; + case "zss_field_content": + updateToolbarEnabledState(true); + break; + } + } + } + }); + } + + public void onGetHtmlResponse(Map inputArgs) { + String fieldId = inputArgs.get("id"); + String fieldContents = inputArgs.get("contents"); + if (!fieldId.isEmpty()) { + switch (fieldId) { + case "zss_field_title": + mTitle = fieldContents; + mGetTitleCountDownLatch.countDown(); + break; + case "zss_field_content": + mContentHtml = fieldContents; + mGetContentCountDownLatch.countDown(); + break; + } + } + } + + void updateToolbarEnabledState(boolean enabled) { + float alpha = (enabled ? TOOLBAR_ALPHA_ENABLED : TOOLBAR_ALPHA_DISABLED); + for(ToggleButton button : mTagToggleButtonMap.values()) { + button.setEnabled(enabled); + button.setAlpha(alpha); + } + } } diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java index c7d437f95125..75dd0e5bdc89 100644 --- a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorFragmentAbstract.java @@ -2,14 +2,33 @@ import android.app.Activity; import android.app.Fragment; +import android.os.Bundle; + +import android.text.Spanned; + +import com.android.volley.toolbox.ImageLoader; + +import org.wordpress.android.util.helpers.MediaFile; +import org.wordpress.android.util.helpers.MediaGallery; 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 void appendMediaFile(MediaFile mediaFile, String imageUrl, ImageLoader imageLoader); + public abstract void appendGallery(MediaGallery mediaGallery); + + // TODO: remove this as soon as we can (we'll need to drop the legacy editor or fix html2spanned translation) + public abstract Spanned getSpannedContent(); + + private static final String FEATURED_IMAGE_SUPPORT_KEY = "featured-image-supported"; + private static final String FEATURED_IMAGE_WIDTH_KEY = "featured-image-width"; protected EditorFragmentListener mEditorFragmentListener; + protected boolean mFeaturedImageSupported; + protected String mBlogSettingMaxImageWidth; + protected ImageLoader mImageLoader; @Override public void onAttach(Activity activity) { @@ -21,8 +40,65 @@ public void onAttach(Activity activity) { } } + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + outState.putBoolean(FEATURED_IMAGE_SUPPORT_KEY, mFeaturedImageSupported); + outState.putString(FEATURED_IMAGE_WIDTH_KEY, mBlogSettingMaxImageWidth); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + if (savedInstanceState != null) { + if (savedInstanceState.containsKey(FEATURED_IMAGE_SUPPORT_KEY)) { + mFeaturedImageSupported = savedInstanceState.getBoolean(FEATURED_IMAGE_SUPPORT_KEY); + } + if (savedInstanceState.containsKey(FEATURED_IMAGE_WIDTH_KEY)) { + mBlogSettingMaxImageWidth = savedInstanceState.getString(FEATURED_IMAGE_WIDTH_KEY); + } + } + } + + public void setImageLoader(ImageLoader imageLoader) { + mImageLoader = imageLoader; + } + + public void setFeaturedImageSupported(boolean featuredImageSupported) { + mFeaturedImageSupported = featuredImageSupported; + } + + public void setBlogSettingMaxImageWidth(String blogSettingMaxImageWidth) { + mBlogSettingMaxImageWidth = blogSettingMaxImageWidth; + } + + /** + * Called by the activity when back button is pressed. + */ + public boolean onBackPressed() { + return false; + } + + /** + * The editor may need to differentiate local draft and published articles + * + * @param isLocalDraft edited post is a local draft + */ + public void setLocalDraft(boolean isLocalDraft) { + // Not unused in the new editor + } + + /** + * Callbacks used to communicate with the parent Activity + */ public interface EditorFragmentListener { + public void onEditorFragmentInitialized(); public void onSettingsClicked(); - public void onAddMediaButtonClicked(); + public void onAddMediaClicked(); + // TODO: remove saveMediaFile, it's currently needed for the legacy editor - we should have something like + // "EditorFragmentAbstract.getFeaturedImage()" returning the remote id + public void saveMediaFile(MediaFile mediaFile); } } diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebView.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebView.java new file mode 100644 index 000000000000..f9daf0485b09 --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebView.java @@ -0,0 +1,23 @@ +package org.wordpress.android.editor; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Build; +import android.util.AttributeSet; + +public class EditorWebView extends EditorWebViewAbstract { + + public EditorWebView(Context context, AttributeSet attrs) { + super(context, attrs); + } + + @SuppressLint("NewApi") + public void execJavaScriptFromString(String javaScript) { + if (Build.VERSION.SDK_INT >= 19) { + this.evaluateJavascript(javaScript, null); + } else { + this.loadUrl("javascript:" + javaScript); + } + } + +} \ No newline at end of file diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewAbstract.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewAbstract.java new file mode 100644 index 000000000000..902e51854fd0 --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewAbstract.java @@ -0,0 +1,79 @@ +package org.wordpress.android.editor; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.support.annotation.NonNull; +import android.util.AttributeSet; +import android.view.KeyEvent; +import android.webkit.ConsoleMessage; +import android.webkit.JsResult; +import android.webkit.WebChromeClient; +import android.webkit.WebSettings; +import android.webkit.WebView; +import android.webkit.WebViewClient; + +import org.wordpress.android.util.AppLog; + +/** + * A text editor WebView with support for JavaScript execution. + */ +public abstract class EditorWebViewAbstract extends WebView { + public abstract void execJavaScriptFromString(String javaScript); + + private OnImeBackListener mOnImeBackListener; + + public EditorWebViewAbstract(Context context, AttributeSet attrs) { + super(context, attrs); + configureWebView(); + } + + @SuppressLint("SetJavaScriptEnabled") + private void configureWebView() { + WebSettings webSettings = this.getSettings(); + webSettings.setJavaScriptEnabled(true); + webSettings.setDefaultTextEncodingName("utf-8"); + + this.setWebViewClient(new WebViewClient() { + public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { + AppLog.e(AppLog.T.EDITOR, description); + } + }); + + this.setWebChromeClient(new WebChromeClient() { + @Override + public boolean onConsoleMessage(@NonNull ConsoleMessage cm) { + AppLog.d(AppLog.T.EDITOR, cm.message() + " -- From line " + cm.lineNumber() + " of " + cm.sourceId()); + return true; + } + + @Override + public boolean onJsAlert(WebView view, String url, String message, JsResult result) { + AppLog.d(AppLog.T.EDITOR, message); + return true; + } + }); + } + + @Override + public boolean onCheckIsTextEditor() { + return true; + } + + public void setOnImeBackListener(OnImeBackListener listener) { + mOnImeBackListener = listener; + } + + @Override + public boolean onKeyPreIme(int keyCode, KeyEvent event) { + if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_UP) { + if (mOnImeBackListener != null) { + mOnImeBackListener.onImeBack(); + } + } + return super.onKeyPreIme(keyCode, event); + } + + public interface OnImeBackListener { + void onImeBack(); + } +} diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewCompatibility.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewCompatibility.java new file mode 100644 index 000000000000..714f87ac8763 --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/EditorWebViewCompatibility.java @@ -0,0 +1,115 @@ +package org.wordpress.android.editor; + +import android.content.Context; +import android.os.Build; +import android.os.Message; +import android.util.AttributeSet; +import android.webkit.WebView; + +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.AppLog.T; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + *

Compatibility EditorWebView for pre-Chromium WebView (API<19). Provides a custom method for executing + * JavaScript, {@link #loadJavaScript(String)}, instead of {@link WebView#loadUrl(String)}. This is needed because + * WebView#loadUrl(String) on API<19 eventually calls WebViewClassic#hideSoftKeyboard(), + * hiding the keyboard whenever JavaScript is executed.

+ * + *

This class uses reflection to access the normally inaccessible WebViewCore#sendMessage(Message) + * and use it to execute JavaScript, sidestepping WebView#loadUrl(String) and the keyboard issue.

+ */ +@SuppressWarnings("TryWithIdenticalCatches") +public class EditorWebViewCompatibility extends EditorWebViewAbstract { + private static final int EXECUTE_JS = 194; // WebViewCore internal JS message code + + private Object mWebViewCore; + private Method mSendMessageMethod; + + public EditorWebViewCompatibility(Context context, AttributeSet attrs) { + super(context, attrs); + try { + this.initReflection(); + } catch (ReflectionException e) { + AppLog.e(T.EDITOR, e); + handleReflectionFailure(); + } + } + + private void initReflection() throws ReflectionException { + Object webViewProvider; + + try { + if (Build.VERSION.SDK_INT >= 16) { + // On API >= 16, the WebViewCore instance is not defined inside WebView itself but inside a + // WebViewClassic (implementation of WebViewProvider), referenced from the WebView as mProvider + + // Access WebViewClassic object + Field webViewProviderField = WebView.class.getDeclaredField("mProvider"); + webViewProviderField.setAccessible(true); + webViewProvider = webViewProviderField.get(this); + + // Access WebViewCore object + Field webViewCoreField = webViewProvider.getClass().getDeclaredField("mWebViewCore"); + webViewCoreField.setAccessible(true); + mWebViewCore = webViewCoreField.get(webViewProvider); + } else { + // On API < 16, the WebViewCore is directly accessible from the WebView + + // Access WebViewCore object + Field webViewCoreField = WebView.class.getDeclaredField("mWebViewCore"); + webViewCoreField.setAccessible(true); + mWebViewCore = webViewCoreField.get(this); + } + + // Access WebViewCore#sendMessage(Message) method + if (mWebViewCore != null) { + mSendMessageMethod = mWebViewCore.getClass().getDeclaredMethod("sendMessage", Message.class); + mSendMessageMethod.setAccessible(true); + } + } catch (NoSuchFieldException e) { + throw new ReflectionException(e); + } catch (NoSuchMethodException e) { + throw new ReflectionException(e); + } catch (IllegalAccessException e) { + throw new ReflectionException(e); + } + } + + private void loadJavaScript(final String javaScript) throws ReflectionException { + if (mSendMessageMethod == null) { + initReflection(); + } else { + Message jsMessage = Message.obtain(null, EXECUTE_JS, javaScript); + try { + mSendMessageMethod.invoke(mWebViewCore, jsMessage); + } catch (InvocationTargetException e) { + throw new ReflectionException(e); + } catch (IllegalAccessException e) { + throw new ReflectionException(e); + } + } + } + + public void execJavaScriptFromString(String javaScript) { + try { + loadJavaScript(javaScript); + } catch(ReflectionException e) { + AppLog.e(T.EDITOR, e); + handleReflectionFailure(); + } + } + + private void handleReflectionFailure() { + // TODO: Fallback to legacy editor and pass the error to analytics + } + + public class ReflectionException extends Exception { + public ReflectionException(Throwable cause) { + super(cause); + } + } +} \ No newline at end of file diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java new file mode 100755 index 000000000000..6467927c1ffa --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/JsCallbackReceiver.java @@ -0,0 +1,100 @@ +package org.wordpress.android.editor; + +import android.webkit.JavascriptInterface; + +import org.wordpress.android.util.AppLog; + +import java.util.HashSet; +import java.util.Set; + +public class JsCallbackReceiver { + private static final String JS_CALLBACK_DELIMITER = "~"; + + private static final String CALLBACK_DOM_LOADED = "callback-dom-loaded"; + private static final String CALLBACK_NEW_FIELD = "callback-new-field"; + + private static final String CALLBACK_INPUT = "callback-input"; + private static final String CALLBACK_SELECTION_CHANGED = "callback-selection-changed"; + private static final String CALLBACK_SELECTION_STYLE = "callback-selection-style"; + + private static final String CALLBACK_FOCUS_IN = "callback-focus-in"; + private static final String CALLBACK_FOCUS_OUT = "callback-focus-out"; + + private static final String CALLBACK_IMAGE_REPLACED = "callback-image-replaced"; + private static final String CALLBACK_IMAGE_TAP = "callback-image-tap"; + private static final String CALLBACK_LINK_TAP = "callback-link-tap"; + + private static final String CALLBACK_LOG = "callback-log"; + + private static final String CALLBACK_RESPONSE_STRING = "callback-response-string"; + + private final OnJsEditorStateChangedListener mListener; + + private Set mPreviousStyleSet = new HashSet<>(); + + public JsCallbackReceiver(EditorFragmentAbstract editorFragmentAbstract) { + mListener = (OnJsEditorStateChangedListener) editorFragmentAbstract; + } + + @JavascriptInterface + public void executeCallback(String callbackId, String params) { + switch (callbackId) { + case CALLBACK_DOM_LOADED: + mListener.onDomLoaded(); + break; + case CALLBACK_SELECTION_STYLE: + // Compare the new styles to the previous ones, and notify the JsCallbackListener of the changeset + Set newStyleSet = Utils.splitDelimitedString(params, JS_CALLBACK_DELIMITER); + mListener.onSelectionStyleChanged(Utils.getChangeMapFromSets(mPreviousStyleSet, + newStyleSet)); + mPreviousStyleSet = newStyleSet; + break; + case CALLBACK_SELECTION_CHANGED: + // Called for changes to the field in current focus and for changes made to selection + // (includes moving the caret without selecting text) + // TODO: Possibly needed for handling WebView scrolling when caret moves (from iOS) + Set selectionKeyValueSet = Utils.splitDelimitedString(params, JS_CALLBACK_DELIMITER); + mListener.onSelectionChanged(Utils.buildMapFromKeyValuePairs(selectionKeyValueSet)); + break; + case CALLBACK_INPUT: + // Called on key press + // TODO: Possibly needed for handling WebView scrolling when caret moves (from iOS) + break; + case CALLBACK_FOCUS_IN: + // TODO: Needed to handle displaying/graying the format bar when focus changes between the title and content + AppLog.d(AppLog.T.EDITOR, "Focus in callback received"); + break; + case CALLBACK_FOCUS_OUT: + // TODO: Needed to handle displaying/graying the format bar when focus changes between the title and content + AppLog.d(AppLog.T.EDITOR, "Focus out callback received"); + break; + case CALLBACK_NEW_FIELD: + // TODO: Used for logging/testing purposes on iOS + AppLog.d(AppLog.T.EDITOR, "New field created, " + params); + break; + case CALLBACK_IMAGE_REPLACED: + // TODO: Notifies that image upload has finished and that the local url was replaced by the remote url in the ZSS editor + AppLog.d(AppLog.T.EDITOR, "Image replaced, " + params); + break; + case CALLBACK_IMAGE_TAP: + // TODO: Notifies that an image was tapped + AppLog.d(AppLog.T.EDITOR, "Image tapped, " + params); + break; + case CALLBACK_LINK_TAP: + // TODO: Notifies that a link was tapped + AppLog.d(AppLog.T.EDITOR, "Link tapped, " + params); + break; + case CALLBACK_LOG: + // Strip 'msg=' from beginning of string + AppLog.d(AppLog.T.EDITOR, callbackId + ": " + params.substring(4)); + break; + case CALLBACK_RESPONSE_STRING: + AppLog.d(AppLog.T.EDITOR, callbackId + ": " + params); + Set responseKeyValueSet = Utils.splitDelimitedString(params, JS_CALLBACK_DELIMITER); + mListener.onGetHtmlResponse(Utils.buildMapFromKeyValuePairs(responseKeyValueSet)); + break; + default: + AppLog.d(AppLog.T.EDITOR, "Unhandled callback: " + callbackId + ":" + params); + } + } +} diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java index 958c27d7441e..467a6ea372cf 100644 --- a/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/LegacyEditorFragment.java @@ -1,7 +1,1119 @@ package org.wordpress.android.editor; -import android.app.Fragment; +import android.app.AlertDialog; +import android.content.Context; +import android.content.DialogInterface; +import android.content.Intent; +import android.content.res.Configuration; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Typeface; +import android.net.Uri; +import android.os.Bundle; +import android.os.Handler; +import android.os.Looper; +import android.os.Parcelable; +import android.support.v7.app.ActionBar; +import android.support.v7.app.ActionBarActivity; +import android.text.Editable; +import android.text.Layout; +import android.text.Selection; +import android.text.Spannable; +import android.text.Spanned; +import android.text.TextUtils; +import android.text.TextWatcher; +import android.text.method.ArrowKeyMovementMethod; +import android.text.style.AlignmentSpan; +import android.text.style.QuoteSpan; +import android.text.style.StrikethroughSpan; +import android.text.style.StyleSpan; +import android.text.style.URLSpan; +import android.view.KeyEvent; +import android.view.LayoutInflater; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.ViewTreeObserver; +import android.view.WindowManager; +import android.view.animation.AlphaAnimation; +import android.view.animation.Animation; +import android.view.inputmethod.EditorInfo; +import android.view.inputmethod.InputMethodManager; +import android.webkit.URLUtil; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; +import android.widget.ToggleButton; -public class LegacyEditorFragment extends Fragment { +import com.android.volley.VolleyError; +import com.android.volley.toolbox.ImageLoader; +import org.wordpress.android.analytics.AnalyticsTracker; +import org.wordpress.android.analytics.AnalyticsTracker.Stat; +import org.wordpress.android.editor.legacy.EditLinkActivity; +import org.wordpress.android.editor.legacy.WPEditImageSpan; +import org.wordpress.android.util.AppLog; +import org.wordpress.android.util.AppLog.T; +import org.wordpress.android.util.DisplayUtils; +import org.wordpress.android.util.ImageUtils; +import org.wordpress.android.util.MediaUtils; +import org.wordpress.android.util.helpers.MediaFile; +import org.wordpress.android.util.helpers.MediaGallery; +import org.wordpress.android.util.helpers.MediaGalleryImageSpan; +import org.wordpress.android.util.helpers.WPImageSpan; +import org.wordpress.android.util.helpers.WPUnderlineSpan; +import org.wordpress.android.util.widgets.WPEditText; + +public class LegacyEditorFragment extends EditorFragmentAbstract implements TextWatcher, + WPEditText.OnSelectionChangedListener, View.OnTouchListener { + public static final int ACTIVITY_REQUEST_CODE_CREATE_LINK = 4; + public static final String ACTION_MEDIA_GALLERY_TOUCHED = "MEDIA_GALLERY_TOUCHED"; + public static final String EXTRA_MEDIA_GALLERY = "EXTRA_MEDIA_GALLERY"; + + private static final int MIN_THUMBNAIL_WIDTH = 200; + private static final int CONTENT_ANIMATION_DURATION = 250; + private static final String KEY_IMAGE_SPANS = "image-spans"; + private static final String KEY_START = "start"; + private static final String KEY_END = "end"; + private static final String KEY_CONTENT = "content"; + private static final String TAG_FORMAT_BAR_BUTTON_STRONG = "strong"; + private static final String TAG_FORMAT_BAR_BUTTON_EM = "em"; + private static final String TAG_FORMAT_BAR_BUTTON_UNDERLINE = "u"; + private static final String TAG_FORMAT_BAR_BUTTON_STRIKE = "strike"; + private static final String TAG_FORMAT_BAR_BUTTON_QUOTE = "blockquote"; + + private ActionBarActivity mActivity; + private View mRootView; + private WPEditText mContentEditText; + private EditText mTitleEditText; + private ToggleButton mBoldToggleButton, mEmToggleButton, mBquoteToggleButton; + private ToggleButton mUnderlineToggleButton, mStrikeToggleButton; + private LinearLayout mFormatBar, mPostContentLinearLayout, mPostSettingsLinearLayout; + private boolean mIsBackspace; + private boolean mScrollDetected; + private boolean mIsLocalDraft; + + private int mStyleStart, mSelectionStart, mSelectionEnd, mFullViewBottom; + private int mLastPosition = -1; + private CharSequence mTitle; + private CharSequence mContent; + + private float mLastYPos = 0; + + @Override + public boolean onBackPressed() { + // leave full screen mode back button is pressed + if (getActivity().getActionBar() != null && !getActivity().getActionBar().isShowing()) { + setContentEditingModeVisible(false); + return true; + } + return false; + } + + @Override + public CharSequence getTitle() { + if (mTitleEditText != null) { + return mTitleEditText.getText().toString(); + } + return mTitle; + } + + @Override + public CharSequence getContent() { + if (mContentEditText != null) { + return mContentEditText.getText().toString(); + } + return mContent; + } + + @Override + public void setTitle(CharSequence text) { + mTitle = text; + if (mTitleEditText != null) { + mTitleEditText.setText(text); + } else { + // TODO + } + } + + @Override + public void setContent(CharSequence text) { + mContent = text; + if (mContentEditText != null) { + mContentEditText.setText(text); + mContentEditText.setSelection(mSelectionStart, mSelectionEnd); + } else { + // TODO + } + } + + @Override + public Spanned getSpannedContent() { + return mContentEditText.getText(); + } + + public void setLocalDraft(boolean isLocalDraft) { + mIsLocalDraft = isLocalDraft; + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + mActivity = (ActionBarActivity) getActivity(); + + final ViewGroup rootView = (ViewGroup) inflater.inflate(R.layout.fragment_edit_post_content, container, false); + + mFormatBar = (LinearLayout) rootView.findViewById(R.id.format_bar); + mTitleEditText = (EditText) rootView.findViewById(R.id.post_title); + mTitleEditText.setText(mTitle); + mTitleEditText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + // Go to full screen editor when 'next' button is tapped on soft keyboard + if (actionId == EditorInfo.IME_ACTION_NEXT && isAdded() && mActivity.getSupportActionBar() != null && + mActivity.getSupportActionBar().isShowing()) { + setContentEditingModeVisible(true); + } + return false; + } + }); + + mContentEditText = (WPEditText) rootView.findViewById(R.id.post_content); + mContentEditText.setText(mContent); + + mPostContentLinearLayout = (LinearLayout) rootView.findViewById(R.id.post_content_wrapper); + mPostSettingsLinearLayout = (LinearLayout) rootView.findViewById(R.id.post_settings_wrapper); + Button postSettingsButton = (Button) rootView.findViewById(R.id.post_settings_button); + postSettingsButton.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + mEditorFragmentListener.onSettingsClicked(); + } + }); + mBoldToggleButton = (ToggleButton) rootView.findViewById(R.id.bold); + mEmToggleButton = (ToggleButton) rootView.findViewById(R.id.em); + mBquoteToggleButton = (ToggleButton) rootView.findViewById(R.id.bquote); + mUnderlineToggleButton = (ToggleButton) rootView.findViewById(R.id.underline); + mStrikeToggleButton = (ToggleButton) rootView.findViewById(R.id.strike); + Button addPictureButton = (Button) rootView.findViewById(R.id.addPictureButton); + Button linkButton = (Button) rootView.findViewById(R.id.link); + Button moreButton = (Button) rootView.findViewById(R.id.more); + + registerForContextMenu(addPictureButton); + mContentEditText = (WPEditText) rootView.findViewById(R.id.post_content); + mContentEditText.setOnSelectionChangedListener(this); + mContentEditText.setOnTouchListener(this); + mContentEditText.addTextChangedListener(this); + mContentEditText.setOnEditTextImeBackListener(new WPEditText.EditTextImeBackListener() { + @Override + public void onImeBack(WPEditText ctrl, String text) { + // Go back to regular editor if IME keyboard is dismissed + // Bottom comparison is there to ensure that the keyboard is actually showing + if (mRootView.getBottom() < mFullViewBottom && isAdded() && mActivity.getSupportActionBar() != null + && !mActivity.getSupportActionBar().isShowing()) { + setContentEditingModeVisible(false); + } + } + }); + addPictureButton.setOnClickListener(mFormatBarButtonClickListener); + mBoldToggleButton.setOnClickListener(mFormatBarButtonClickListener); + linkButton.setOnClickListener(mFormatBarButtonClickListener); + mEmToggleButton.setOnClickListener(mFormatBarButtonClickListener); + mUnderlineToggleButton.setOnClickListener(mFormatBarButtonClickListener); + mStrikeToggleButton.setOnClickListener(mFormatBarButtonClickListener); + mBquoteToggleButton.setOnClickListener(mFormatBarButtonClickListener); + moreButton.setOnClickListener(mFormatBarButtonClickListener); + mEditorFragmentListener.onEditorFragmentInitialized(); + + if (savedInstanceState != null) { + Parcelable[] spans = savedInstanceState.getParcelableArray(KEY_IMAGE_SPANS); + + mContent = savedInstanceState.getString(KEY_CONTENT, ""); + mContentEditText.setText(mContent); + mContentEditText.setSelection(savedInstanceState.getInt(KEY_START, 0), + savedInstanceState.getInt(KEY_END, 0)); + + if (spans != null && spans.length > 0) { + for (Parcelable s : spans) { + WPImageSpan editSpan = (WPImageSpan)s; + addMediaFile(editSpan.getMediaFile(), editSpan.getMediaFile().getFilePath(), + mImageLoader, editSpan.getStartPosition(), editSpan.getEndPosition()); + } + } + } + + return rootView; + } + + @Override + public void onViewCreated(View view, Bundle savedInstanceState) { + super.onViewCreated(view, savedInstanceState); + mRootView = view; + mRootView.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener); + } + + private ViewTreeObserver.OnGlobalLayoutListener mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() { + public void onGlobalLayout() { + mRootView.getViewTreeObserver().removeGlobalOnLayoutListener(this); + mFullViewBottom = mRootView.getBottom(); + } + }; + + public void setContentEditingModeVisible(boolean isVisible) { + if (!isAdded()) { + return; + } + ActionBar actionBar = mActivity.getSupportActionBar(); + if (isVisible) { + Animation fadeAnimation = new AlphaAnimation(1, 0); + fadeAnimation.setDuration(CONTENT_ANIMATION_DURATION); + fadeAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + mTitleEditText.setVisibility(View.GONE); + } + + @Override + public void onAnimationEnd(Animation animation) { + mPostSettingsLinearLayout.setVisibility(View.GONE); + mFormatBar.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + + mPostContentLinearLayout.startAnimation(fadeAnimation); + if (actionBar != null) { + actionBar.hide(); + } + } else { + mTitleEditText.setVisibility(View.VISIBLE); + mFormatBar.setVisibility(View.GONE); + Animation fadeAnimation = new AlphaAnimation(0, 1); + fadeAnimation.setDuration(CONTENT_ANIMATION_DURATION); + fadeAnimation.setAnimationListener(new Animation.AnimationListener() { + @Override + public void onAnimationStart(Animation animation) { + } + + @Override + public void onAnimationEnd(Animation animation) { + mPostSettingsLinearLayout.setVisibility(View.VISIBLE); + } + + @Override + public void onAnimationRepeat(Animation animation) { + } + }); + mPostContentLinearLayout.startAnimation(fadeAnimation); + mActivity.invalidateOptionsMenu(); + if (actionBar != null) { + actionBar.show(); + } + } + } + + @Override + public void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + + if (requestCode == LegacyEditorFragment.ACTIVITY_REQUEST_CODE_CREATE_LINK) { + Bundle extras = data.getExtras(); + if (extras == null) { + return; + } + String linkURL = extras.getString("linkURL"); + String linkText = extras.getString("linkText"); + createLinkFromSelection(linkURL, linkText); + } + } + + public boolean hasEmptyContentFields() { + return TextUtils.isEmpty(mTitleEditText.getText()) && TextUtils.isEmpty(mContentEditText.getText()); + } + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + mFullViewBottom = mRootView.getBottom(); + } + + private void createLinkFromSelection(String linkURL, String linkText) { + try { + if (linkURL != null && !linkURL.equals("http://") && !linkURL.equals("")) { + if (mSelectionStart > mSelectionEnd) { + int temp = mSelectionEnd; + mSelectionEnd = mSelectionStart; + mSelectionStart = temp; + } + Editable editable = mContentEditText.getText(); + if (editable == null) { + return; + } + if (mIsLocalDraft) { + if (linkText == null) { + if (mSelectionStart < mSelectionEnd) { + editable.delete(mSelectionStart, mSelectionEnd); + } + editable.insert(mSelectionStart, linkURL); + editable.setSpan(new URLSpan(linkURL), mSelectionStart, mSelectionStart + linkURL.length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + mContentEditText.setSelection(mSelectionStart + linkURL.length()); + } else { + if (mSelectionStart < mSelectionEnd) { + editable.delete(mSelectionStart, mSelectionEnd); + } + editable.insert(mSelectionStart, linkText); + editable.setSpan(new URLSpan(linkURL), mSelectionStart, mSelectionStart + linkText.length(), + Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + mContentEditText.setSelection(mSelectionStart + linkText.length()); + } + } else { + if (linkText == null) { + if (mSelectionStart < mSelectionEnd) { + editable.delete(mSelectionStart, mSelectionEnd); + } + String urlHTML = "" + linkURL + ""; + editable.insert(mSelectionStart, urlHTML); + mContentEditText.setSelection(mSelectionStart + urlHTML.length()); + } else { + if (mSelectionStart < mSelectionEnd) { + editable.delete(mSelectionStart, mSelectionEnd); + } + String urlHTML = "" + linkText + ""; + editable.insert(mSelectionStart, urlHTML); + mContentEditText.setSelection(mSelectionStart + urlHTML.length()); + } + } + } + } catch (RuntimeException e) { + AppLog.e(T.POSTS, e); + } + } + + /** + * Formatting bar + */ + private View.OnClickListener mFormatBarButtonClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + int id = v.getId(); + if (id == R.id.bold) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_BOLD); + onFormatButtonClick(mBoldToggleButton, TAG_FORMAT_BAR_BUTTON_STRONG); + } else if (id == R.id.em) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_ITALIC); + onFormatButtonClick(mEmToggleButton, TAG_FORMAT_BAR_BUTTON_EM); + } else if (id == R.id.underline) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_UNDERLINE); + onFormatButtonClick(mUnderlineToggleButton, TAG_FORMAT_BAR_BUTTON_UNDERLINE); + } else if (id == R.id.strike) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_STRIKETHROUGH); + onFormatButtonClick(mStrikeToggleButton, TAG_FORMAT_BAR_BUTTON_STRIKE); + } else if (id == R.id.bquote) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_BLOCKQUOTE); + onFormatButtonClick(mBquoteToggleButton, TAG_FORMAT_BAR_BUTTON_QUOTE); + } else if (id == R.id.more) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_MORE); + mSelectionEnd = mContentEditText.getSelectionEnd(); + Editable str = mContentEditText.getText(); + if (str != null) { + if (mSelectionEnd > str.length()) + mSelectionEnd = str.length(); + str.insert(mSelectionEnd, "\n\n"); + } + } else if (id == R.id.link) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_LINK); + mSelectionStart = mContentEditText.getSelectionStart(); + mStyleStart = mSelectionStart; + mSelectionEnd = mContentEditText.getSelectionEnd(); + if (mSelectionStart > mSelectionEnd) { + int temp = mSelectionEnd; + mSelectionEnd = mSelectionStart; + mSelectionStart = temp; + } + Intent i = new Intent(getActivity(), EditLinkActivity.class); + if (mSelectionEnd > mSelectionStart) { + if (mContentEditText.getText() != null) { + String selectedText = mContentEditText.getText().subSequence(mSelectionStart, mSelectionEnd).toString(); + i.putExtra("selectedText", selectedText); + } + } + startActivityForResult(i, ACTIVITY_REQUEST_CODE_CREATE_LINK); + } else if (id == R.id.addPictureButton) { + AnalyticsTracker.track(Stat.EDITOR_TAPPED_IMAGE); + mEditorFragmentListener.onAddMediaClicked(); + } + } + }; + + private WPEditImageSpan createWPEditImageSpanLocal(Context context, MediaFile mediaFile) { + Uri imageUri = Uri.parse(mediaFile.getFilePath()); + Bitmap thumbnailBitmap; + if (MediaUtils.isVideo(imageUri.toString())) { + thumbnailBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.media_movieclip); + } else { + thumbnailBitmap = ImageUtils.getWPImageSpanThumbnailFromFilePath(context, imageUri.getEncodedPath(), + ImageUtils.getMaximumThumbnailWidthForEditor(context)); + if (thumbnailBitmap == null) { + // Use a placeholder in case thumbnail can't be decoded (OOM for instance) + thumbnailBitmap = BitmapFactory.decodeResource(context.getResources(), + R.drawable.legacy_dashicon_format_image_big_grey); + } + } + WPEditImageSpan imageSpan = new WPEditImageSpan(context, thumbnailBitmap, imageUri); + mediaFile.setWidth(MediaUtils.getMinimumImageWidth(context, imageUri, mBlogSettingMaxImageWidth)); + return imageSpan; + } + + private WPEditImageSpan createWPEditImageSpanRemote(Context context, MediaFile mediaFile) { + int drawable = mediaFile.isVideo() ? R.drawable.media_movieclip : R.drawable.legacy_dashicon_format_image_big_grey; + Uri uri = Uri.parse(mediaFile.getFileURL()); + WPEditImageSpan imageSpan = new WPEditImageSpan(context, drawable, uri); + imageSpan.setMediaFile(mediaFile); + return imageSpan; + } + + private WPEditImageSpan createWPEditImageSpan(Context context, MediaFile mediaFile) { + if (!URLUtil.isNetworkUrl(mediaFile.getFileURL())) { + return createWPEditImageSpanLocal(context, mediaFile); + } else { + return createWPEditImageSpanRemote(context, mediaFile); + } + } + + /** + * Applies formatting to selected text, or marks the entry for a new text style + * at the current cursor position + * @param toggleButton button from formatting bar + * @param tag HTML tag name for text style + */ + private void onFormatButtonClick(ToggleButton toggleButton, String tag) { + Spannable s = mContentEditText.getText(); + if (s == null) + return; + int selectionStart = mContentEditText.getSelectionStart(); + mStyleStart = selectionStart; + int selectionEnd = mContentEditText.getSelectionEnd(); + + if (selectionStart > selectionEnd) { + int temp = selectionEnd; + selectionEnd = selectionStart; + selectionStart = temp; + } + + Class styleClass = null; + if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG) || tag.equals(TAG_FORMAT_BAR_BUTTON_EM)) + styleClass = StyleSpan.class; + else if (tag.equals(TAG_FORMAT_BAR_BUTTON_UNDERLINE)) + styleClass = WPUnderlineSpan.class; + else if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRIKE)) + styleClass = StrikethroughSpan.class; + else if (tag.equals(TAG_FORMAT_BAR_BUTTON_QUOTE)) + styleClass = QuoteSpan.class; + + if (styleClass == null) + return; + + Object[] allSpans = s.getSpans(selectionStart, selectionEnd, styleClass); + boolean textIsSelected = selectionEnd > selectionStart; + if (mIsLocalDraft) { + // Local drafts can use the rich text editor. Yay! + boolean shouldAddSpan = true; + for (Object span : allSpans) { + if (span instanceof StyleSpan) { + StyleSpan styleSpan = (StyleSpan)span; + if ((styleSpan.getStyle() == Typeface.BOLD && !tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG)) + || (styleSpan.getStyle() == Typeface.ITALIC && !tag.equals(TAG_FORMAT_BAR_BUTTON_EM))) { + continue; + } + } + if (!toggleButton.isChecked() && textIsSelected) { + // If span exists and text is selected, remove the span + s.removeSpan(span); + shouldAddSpan = false; + break; + } else if (!toggleButton.isChecked()) { + // Remove span at cursor point if button isn't checked + Object[] spans = s.getSpans(mStyleStart - 1, mStyleStart, styleClass); + for (Object removeSpan : spans) { + selectionStart = s.getSpanStart(removeSpan); + selectionEnd = s.getSpanEnd(removeSpan); + s.removeSpan(removeSpan); + } + } + } + + if (shouldAddSpan) { + if (tag.equals(TAG_FORMAT_BAR_BUTTON_STRONG)) { + s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } else if (tag.equals(TAG_FORMAT_BAR_BUTTON_EM)) { + s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } else { + try { + s.setSpan(styleClass.newInstance(), selectionStart, selectionEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + } catch (java.lang.InstantiationException e) { + AppLog.e(T.POSTS, e); + } catch (IllegalAccessException e) { + AppLog.e(T.POSTS, e); + } + } + } + } else { + // Add HTML tags when editing an existing post + String startTag = "<" + tag + ">"; + String endTag = ""; + Editable content = mContentEditText.getText(); + if (textIsSelected) { + content.insert(selectionStart, startTag); + content.insert(selectionEnd + startTag.length(), endTag); + toggleButton.setChecked(false); + mContentEditText.setSelection(selectionEnd + startTag.length() + endTag.length()); + } else if (toggleButton.isChecked()) { + content.insert(selectionStart, startTag); + mContentEditText.setSelection(selectionEnd + startTag.length()); + } else if (!toggleButton.isChecked()) { + content.insert(selectionEnd, endTag); + mContentEditText.setSelection(selectionEnd + endTag.length()); + } + } + } + + /** + * Rich Text Editor + */ + public void showImageSettings(final View alertView, final EditText titleText, + final EditText caption, final EditText imageWidthText, + final CheckBox featuredCheckBox, final CheckBox featuredInPostCheckBox, + final int maxWidth, final Spinner alignmentSpinner, final WPImageSpan imageSpan) { + AlertDialog.Builder builder = new AlertDialog.Builder(getActivity()); + builder.setTitle(getString(R.string.image_settings)); + builder.setView(alertView); + builder.setPositiveButton(getString(android.R.string.ok), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + String title = (titleText.getText() != null) ? titleText.getText().toString() : ""; + MediaFile mediaFile = imageSpan.getMediaFile(); + if (mediaFile == null) { + return; + } + mediaFile.setTitle(title); + mediaFile.setHorizontalAlignment(alignmentSpinner.getSelectedItemPosition()); + mediaFile.setWidth(getEditTextIntegerClamped(imageWidthText, 10, maxWidth)); + String captionText = (caption.getText() != null) ? caption.getText().toString() : ""; + mediaFile.setCaption(captionText); + mediaFile.setFeatured(featuredCheckBox.isChecked()); + if (featuredCheckBox.isChecked()) { + // remove featured flag from all other images + Spannable contentSpannable = mContentEditText.getText(); + WPImageSpan[] imageSpans = + contentSpannable.getSpans(0, contentSpannable.length(), WPImageSpan.class); + if (imageSpans.length > 1) { + for (WPImageSpan postImageSpan : imageSpans) { + if (postImageSpan != imageSpan) { + MediaFile postMediaFile = postImageSpan.getMediaFile(); + postMediaFile.setFeatured(false); + postMediaFile.setFeaturedInPost(false); + // TODO: remove this + mEditorFragmentListener.saveMediaFile(postMediaFile); + } + } + } + } + mediaFile.setFeaturedInPost(featuredInPostCheckBox.isChecked()); + // TODO: remove this + mEditorFragmentListener.saveMediaFile(mediaFile); + } + }); + builder.setNegativeButton(getString(android.R.string.cancel), new DialogInterface.OnClickListener() { + public void onClick(DialogInterface dialog, int whichButton) { + dialog.dismiss(); + } + }); + AlertDialog alertDialog = builder.create(); + alertDialog.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); + alertDialog.show(); + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + float pos = event.getY(); + + if (event.getAction() == 0) + mLastYPos = pos; + + if (event.getAction() > 1) { + int scrollThreshold = DisplayUtils.dpToPx(getActivity(), 2); + if (((mLastYPos - pos) > scrollThreshold) || ((pos - mLastYPos) > scrollThreshold)) + mScrollDetected = true; + } + + mLastYPos = pos; + + if (event.getAction() == MotionEvent.ACTION_UP) { + if (isAdded() && mActivity.getSupportActionBar() != null && mActivity.getSupportActionBar().isShowing()) { + setContentEditingModeVisible(true); + return false; + } + } + + if (event.getAction() == MotionEvent.ACTION_UP && !mScrollDetected) { + Layout layout = ((TextView) v).getLayout(); + int x = (int) event.getX(); + int y = (int) event.getY(); + + x += v.getScrollX(); + y += v.getScrollY(); + if (layout != null) { + int line = layout.getLineForVertical(y); + int charPosition = layout.getOffsetForHorizontal(line, x); + + Spannable spannable = mContentEditText.getText(); + if (spannable == null) { + return false; + } + // check if image span was tapped + WPImageSpan[] imageSpans = spannable.getSpans(charPosition, charPosition, WPImageSpan.class); + + if (imageSpans.length != 0) { + final WPImageSpan imageSpan = imageSpans[0]; + MediaFile mediaFile = imageSpan.getMediaFile(); + if (mediaFile == null) + return false; + if (!mediaFile.isVideo()) { + LayoutInflater factory = LayoutInflater.from(getActivity()); + final View alertView = factory.inflate(R.layout.alert_image_options, null); + if (alertView == null) + return false; + final EditText imageWidthText = (EditText) alertView.findViewById(R.id.imageWidthText); + final EditText titleText = (EditText) alertView.findViewById(R.id.title); + final EditText caption = (EditText) alertView.findViewById(R.id.caption); + final CheckBox featuredCheckBox = (CheckBox) alertView.findViewById(R.id.featuredImage); + final CheckBox featuredInPostCheckBox = (CheckBox) alertView.findViewById(R.id.featuredInPost); + + // show featured image checkboxes if supported + if (mFeaturedImageSupported) { + featuredCheckBox.setVisibility(View.VISIBLE); + featuredInPostCheckBox.setVisibility(View.VISIBLE); + } + + featuredCheckBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) { + featuredInPostCheckBox.setVisibility(View.VISIBLE); + } else { + featuredInPostCheckBox.setVisibility(View.GONE); + } + + } + }); + + final SeekBar seekBar = (SeekBar) alertView.findViewById(R.id.imageWidth); + final Spinner alignmentSpinner = (Spinner) alertView.findViewById(R.id.alignment_spinner); + ArrayAdapter adapter = + ArrayAdapter.createFromResource(getActivity(), R.array.alignment_array, + android.R.layout.simple_spinner_item); + adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); + alignmentSpinner.setAdapter(adapter); + + imageWidthText.setText(String.valueOf(mediaFile.getWidth()) + "px"); + seekBar.setProgress(mediaFile.getWidth()); + titleText.setText(mediaFile.getTitle()); + caption.setText(mediaFile.getCaption()); + featuredCheckBox.setChecked(mediaFile.isFeatured()); + + if (mediaFile.isFeatured()) { + featuredInPostCheckBox.setVisibility(View.VISIBLE); + } else { + featuredInPostCheckBox.setVisibility(View.GONE); + } + + featuredInPostCheckBox.setChecked(mediaFile.isFeaturedInPost()); + + alignmentSpinner.setSelection(mediaFile.getHorizontalAlignment(), true); + + final int maxWidth = MediaUtils.getMinimumImageWidth(getActivity(), + imageSpan.getImageSource(), mBlogSettingMaxImageWidth); + seekBar.setMax(maxWidth / 10); + if (mediaFile.getWidth() != 0) { + seekBar.setProgress(mediaFile.getWidth() / 10); + } + seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + if (progress == 0) { + progress = 1; + } + imageWidthText.setText(progress * 10 + "px"); + } + }); + + imageWidthText.setOnFocusChangeListener(new View.OnFocusChangeListener() { + @Override + public void onFocusChange(View v, boolean hasFocus) { + if (hasFocus) { + imageWidthText.setText(""); + } + } + }); + + imageWidthText.setOnEditorActionListener(new TextView.OnEditorActionListener() { + @Override + public boolean onEditorAction(TextView v, int actionId, KeyEvent event) { + int width = getEditTextIntegerClamped(imageWidthText, 10, maxWidth); + seekBar.setProgress(width / 10); + imageWidthText.setSelection((String.valueOf(width).length())); + + InputMethodManager imm = (InputMethodManager) getActivity() + .getSystemService(Context.INPUT_METHOD_SERVICE); + imm.hideSoftInputFromWindow(imageWidthText.getWindowToken(), + InputMethodManager.RESULT_UNCHANGED_SHOWN); + + return true; + } + }); + + showImageSettings(alertView, titleText, caption, imageWidthText, featuredCheckBox, + featuredInPostCheckBox, maxWidth, alignmentSpinner, imageSpan); + mScrollDetected = false; + return true; + } + + } else { + mContentEditText.setMovementMethod(ArrowKeyMovementMethod.getInstance()); + int selectionStart = mContentEditText.getSelectionStart(); + if (selectionStart >= 0 && mContentEditText.getSelectionEnd() >= selectionStart) + mContentEditText.setSelection(selectionStart, mContentEditText.getSelectionEnd()); + } + + // get media gallery spans + MediaGalleryImageSpan[] gallerySpans = spannable.getSpans(charPosition, charPosition, MediaGalleryImageSpan.class); + if (gallerySpans.length > 0) { + final MediaGalleryImageSpan gallerySpan = gallerySpans[0]; + Intent intent = new Intent(ACTION_MEDIA_GALLERY_TOUCHED); + intent.putExtra(EXTRA_MEDIA_GALLERY, gallerySpan.getMediaGallery()); + mActivity.sendBroadcast(intent); + } + } + } else if (event.getAction() == 1) { + mScrollDetected = false; + } + return false; + } + + @Override + public void afterTextChanged(Editable s) { + int position = Selection.getSelectionStart(mContentEditText.getText()); + if ((mIsBackspace && position != 1) || mLastPosition == position || !mIsLocalDraft) + return; + + if (position < 0) { + position = 0; + } + mLastPosition = position; + if (position > 0) { + if (mStyleStart > position) { + mStyleStart = position - 1; + } + + boolean shouldBold = mBoldToggleButton.isChecked(); + boolean shouldEm = mEmToggleButton.isChecked(); + boolean shouldUnderline = mUnderlineToggleButton.isChecked(); + boolean shouldStrike = mStrikeToggleButton.isChecked(); + boolean shouldQuote = mBquoteToggleButton.isChecked(); + + Object[] allSpans = s.getSpans(mStyleStart, position, Object.class); + for (Object span : allSpans) { + if (span instanceof StyleSpan) { + StyleSpan styleSpan = (StyleSpan) span; + if (styleSpan.getStyle() == Typeface.BOLD) + shouldBold = false; + else if (styleSpan.getStyle() == Typeface.ITALIC) + shouldEm = false; + } else if (span instanceof WPUnderlineSpan) { + shouldUnderline = false; + } else if (span instanceof StrikethroughSpan) { + shouldStrike = false; + } else if (span instanceof QuoteSpan) { + shouldQuote = false; + } + } + + if (shouldBold) + s.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + if (shouldEm) + s.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + if (shouldUnderline) + s.setSpan(new WPUnderlineSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + if (shouldStrike) + s.setSpan(new StrikethroughSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + if (shouldQuote) + s.setSpan(new QuoteSpan(), mStyleStart, position, Spannable.SPAN_INCLUSIVE_INCLUSIVE); + } + } + + @Override + public void beforeTextChanged(CharSequence s, int start, int count, int after) { + mIsBackspace = (count - after == 1) || (s.length() == 0); + } + + @Override + public void onTextChanged(CharSequence s, int start, int before, int count) { + } + + @Override + public void onSelectionChanged() { + if (!mIsLocalDraft) { + return; + } + + final Spannable s = mContentEditText.getText(); + if (s == null) + return; + // set toggle buttons if cursor is inside of a matching span + mStyleStart = mContentEditText.getSelectionStart(); + Object[] spans = s.getSpans(mContentEditText.getSelectionStart(), mContentEditText.getSelectionStart(), Object.class); + + mBoldToggleButton.setChecked(false); + mEmToggleButton.setChecked(false); + mBquoteToggleButton.setChecked(false); + mUnderlineToggleButton.setChecked(false); + mStrikeToggleButton.setChecked(false); + for (Object span : spans) { + if (span instanceof StyleSpan) { + StyleSpan ss = (StyleSpan) span; + if (ss.getStyle() == android.graphics.Typeface.BOLD) { + mBoldToggleButton.setChecked(true); + } + if (ss.getStyle() == android.graphics.Typeface.ITALIC) { + mEmToggleButton.setChecked(true); + } + } + if (span instanceof QuoteSpan) { + mBquoteToggleButton.setChecked(true); + } + if (span instanceof WPUnderlineSpan) { + mUnderlineToggleButton.setChecked(true); + } + if (span instanceof StrikethroughSpan) { + mStrikeToggleButton.setChecked(true); + } + } + } + + private int getEditTextIntegerClamped(EditText editText, int min, int max) { + int width = 10; + try { + if (editText.getText() != null) + width = Integer.parseInt(editText.getText().toString().replace("px", "")); + } catch (NumberFormatException e) { + AppLog.e(T.POSTS, e); + } + width = Math.min(max, Math.max(width, min)); + return width; + } + + private void loadWPImageSpanThumbnail(MediaFile mediaFile, String imageURL, ImageLoader imageLoader) { + if (mediaFile == null || imageURL == null) { + return; + } + final String mediaId = mediaFile.getMediaId(); + if (mediaId == null) { + return; + } + + final int maxThumbWidth = ImageUtils.getMaximumThumbnailWidthForEditor(getActivity()); + + imageLoader.get(imageURL, new ImageLoader.ImageListener() { + @Override + public void onErrorResponse(VolleyError arg0) { + } + + @Override + public void onResponse(ImageLoader.ImageContainer container, boolean arg1) { + Bitmap downloadedBitmap = container.getBitmap(); + if (downloadedBitmap == null) { + // no bitmap downloaded from the server. + return; + } + + if (downloadedBitmap.getWidth() < MIN_THUMBNAIL_WIDTH) { + // Picture is too small. Show the placeholder in this case. + return; + } + + Bitmap resizedBitmap; + // resize the downloaded bitmap + resizedBitmap = ImageUtils.getScaledBitmapAtLongestSide(downloadedBitmap, maxThumbWidth); + + if (resizedBitmap == null) { + return; + } + + final EditText editText = mContentEditText; + Editable s = editText.getText(); + if (s == null) { + return; + } + WPImageSpan[] spans = s.getSpans(0, s.length(), WPImageSpan.class); + if (spans.length != 0) { + for (WPImageSpan is : spans) { + MediaFile mediaFile = is.getMediaFile(); + if (mediaFile == null) { + continue; + } + if (mediaId.equals(mediaFile.getMediaId()) && !is.isNetworkImageLoaded()) { + // replace the existing span with a new one with the correct image, re-add + // it to the same position. + int spanStart = is.getStartPosition(); + int spanEnd = is.getEndPosition(); + WPEditImageSpan imageSpan = new WPEditImageSpan(getActivity(), resizedBitmap, + is.getImageSource()); + imageSpan.setMediaFile(is.getMediaFile()); + imageSpan.setNetworkImageLoaded(true); + imageSpan.setPosition(spanStart, spanEnd); + s.removeSpan(is); + s.setSpan(imageSpan, spanStart, spanEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + break; + } + } + } + } + }, 0, 0); + } + + @Override + public void onSaveInstanceState(Bundle outState) { + super.onSaveInstanceState(outState); + + WPImageSpan[] spans = mContentEditText.getText().getSpans(0, mContentEditText.getText().length(), WPEditImageSpan.class); + + if (spans != null && spans.length > 0) { + outState.putParcelableArray(KEY_IMAGE_SPANS, spans); + } + + outState.putInt(KEY_START, mContentEditText.getSelectionStart()); + outState.putInt(KEY_END, mContentEditText.getSelectionEnd()); + outState.putString(KEY_CONTENT, mContentEditText.getText().toString()); + } + + public void addMediaFile(final MediaFile mediaFile, final String imageUrl, final ImageLoader imageLoader, final int start, final int end) { + mediaFile.setFileURL(imageUrl); + mediaFile.setFilePath(imageUrl); + final WPEditImageSpan imageSpan = createWPEditImageSpan(mActivity, mediaFile); + mEditorFragmentListener.saveMediaFile(mediaFile); + imageSpan.setMediaFile(mediaFile); + + Handler handler = new Handler(Looper.getMainLooper()); + final Runnable r = new Runnable() { + @Override + public void run() { + // Insert the WPImageSpan in the content field + int selectionStart = start; + int selectionEnd = end; + + if (selectionStart > selectionEnd) { + int temp = selectionEnd; + selectionEnd = selectionStart; + selectionStart = temp; + } + + imageSpan.setPosition(selectionStart, selectionEnd); + + int line, column = 0; + if (mContentEditText.getLayout() != null) { + line = mContentEditText.getLayout().getLineForOffset(selectionStart); + column = selectionStart - mContentEditText.getLayout().getLineStart(line); + } + + Editable s = mContentEditText.getText(); + if (s == null) { + return; + } + + WPImageSpan[] imageSpans = s.getSpans(selectionStart, selectionEnd, WPImageSpan.class); + if (imageSpans.length != 0) { + // insert a few line breaks if the cursor is already on an image + s.insert(selectionEnd, "\n\n"); + selectionStart = selectionStart + 2; + selectionEnd = selectionEnd + 2; + } else if (column != 0) { + // insert one line break if the cursor is not at the first column + s.insert(selectionEnd, "\n"); + selectionStart = selectionStart + 1; + selectionEnd = selectionEnd + 1; + } + + s.insert(selectionStart, " "); + s.setSpan(imageSpan, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER); + s.setSpan(as, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + s.insert(selectionEnd + 1, "\n\n"); + + // Fetch and replace the WPImageSpan if it's a remote media + if (imageLoader != null && URLUtil.isNetworkUrl(imageUrl)) { + loadWPImageSpanThumbnail(mediaFile, imageUrl, imageLoader); + } + } + }; + handler.postDelayed(r, 1); + } + + @Override + public void appendMediaFile(final MediaFile mediaFile, final String imageUrl, final ImageLoader imageLoader) { + addMediaFile(mediaFile, imageUrl, imageLoader, mContentEditText.getSelectionStart(), mContentEditText.getSelectionEnd()); + } + + @Override + public void appendGallery(MediaGallery mediaGallery) { + Editable editableText = mContentEditText.getText(); + if (editableText == null) { + return; + } + + int selectionStart = mContentEditText.getSelectionStart(); + int selectionEnd = mContentEditText.getSelectionEnd(); + + if (selectionStart > selectionEnd) { + int temp = selectionEnd; + selectionEnd = selectionStart; + selectionStart = temp; + } + + int line, column = 0; + if (mContentEditText.getLayout() != null) { + line = mContentEditText.getLayout().getLineForOffset(selectionStart); + column = mContentEditText.getSelectionStart() - mContentEditText.getLayout().getLineStart(line); + } + + if (column != 0) { + // insert one line break if the cursor is not at the first column + editableText.insert(selectionEnd, "\n"); + selectionStart = selectionStart + 1; + selectionEnd = selectionEnd + 1; + } + + editableText.insert(selectionStart, " "); + MediaGalleryImageSpan is = new MediaGalleryImageSpan(getActivity(), mediaGallery, + R.drawable.legacy_icon_mediagallery_placeholder); + editableText.setSpan(is, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER); + editableText.setSpan(as, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + editableText.insert(selectionEnd + 1, "\n\n"); + } } diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java new file mode 100755 index 000000000000..215e6a2ce1eb --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/OnJsEditorStateChangedListener.java @@ -0,0 +1,10 @@ +package org.wordpress.android.editor; + +import java.util.Map; + +public interface OnJsEditorStateChangedListener { + void onDomLoaded(); + void onSelectionChanged(Map selectionArgs); + void onSelectionStyleChanged(Map changeSet); + void onGetHtmlResponse(Map responseArgs); +} diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/Utils.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/Utils.java new file mode 100644 index 000000000000..f32e058fd6f4 --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/Utils.java @@ -0,0 +1,116 @@ +package org.wordpress.android.editor; + +import android.app.Activity; +import android.content.res.AssetManager; + +import org.wordpress.android.util.AppLog; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.StringTokenizer; + +public class Utils { + + public static String getHtmlFromFile(Activity activity, String filename) { + try { + AssetManager assetManager = activity.getAssets(); + InputStream in = assetManager.open(filename); + return getStringFromInputStream(in); + } catch (IOException e) { + AppLog.e(AppLog.T.EDITOR, e.getMessage()); + return null; + } + } + + public static String getStringFromInputStream(InputStream inputStream) throws IOException { + InputStreamReader is = new InputStreamReader(inputStream); + StringBuilder sb = new StringBuilder(); + BufferedReader br = new BufferedReader(is); + String read = br.readLine(); + while (read != null) { + sb.append(read); + sb.append('\n'); + read = br.readLine(); + } + return sb.toString(); + } + + public static String escapeHtml(String html) { + if (html != null) { + html = html.replace("\\", "\\\\"); + html = html.replace("\"", "\\\""); + html = html.replace("'", "\\'"); + html = html.replace("\r", "\\r"); + html = html.replace("\n", "\\n"); + } + return html; + } + + /** + * Splits a delimited string into a set of strings. + * @param string the delimited string to split + * @param delimiter the string delimiter + */ + public static Set splitDelimitedString(String string, String delimiter) { + Set splitString = new HashSet<>(); + + StringTokenizer stringTokenizer = new StringTokenizer(string, delimiter); + while (stringTokenizer.hasMoreTokens()) { + splitString.add(stringTokenizer.nextToken()); + } + + return splitString; + } + + /** + * Accepts a set of strings, each string being a key-value pair (id=5, + * name=content-filed). Returns a map of all the key-value pairs in the set. + * @param keyValueSet the set of key-value pair strings + */ + public static Map buildMapFromKeyValuePairs(Set keyValueSet) { + Map selectionArgs = new HashMap<>(); + for (String pair : keyValueSet) { + int delimLoc = pair.indexOf("="); + if (delimLoc != -1) { + selectionArgs.put(pair.substring(0, delimLoc), pair.substring(delimLoc + 1)); + } + } + return selectionArgs; + } + + /** + * Compares two Sets and returns a Map of elements not contained in both + * Sets. Elements contained in oldSet but not in newSet will be marked + * false in the returned map; the converse will be marked true. + * @param oldSet the older of the two Sets + * @param newSet the newer of the two Sets + * @param type of element stored in the Sets + * @return a Map containing the difference between oldSet and newSet, and whether the + * element was added (true) or removed (false) in newSet + */ + public static Map getChangeMapFromSets(Set oldSet, Set newSet) { + Map changeMap = new HashMap<>(); + + Set additions = new HashSet<>(newSet); + additions.removeAll(oldSet); + + Set removals = new HashSet<>(oldSet); + removals.removeAll(newSet); + + for (E s : additions) { + changeMap.put(s, true); + } + + for (E s : removals) { + changeMap.put(s, false); + } + + return changeMap; + } +} diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/EditLinkActivity.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/EditLinkActivity.java new file mode 100644 index 000000000000..452da8e85550 --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/EditLinkActivity.java @@ -0,0 +1,75 @@ +package org.wordpress.android.editor.legacy; + +import android.content.Intent; +import android.os.Bundle; +import android.support.v7.app.ActionBarActivity; +import android.view.View; +import android.widget.Button; +import android.widget.EditText; + +import org.wordpress.android.editor.R; + +public class EditLinkActivity extends ActionBarActivity { + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + + setContentView(R.layout.alert_create_link); + + Bundle extras = getIntent().getExtras(); + if (extras != null) { + String selectedText = extras.getString("selectedText"); + if (selectedText != null) { + EditText linkTextET = (EditText) findViewById(R.id.linkText); + linkTextET.setText(selectedText); + } + } + + final Button cancelButton = (Button) findViewById(R.id.cancel); + final Button okButton = (Button) findViewById(R.id.ok); + + final EditText urlEditText = (EditText) findViewById(R.id.linkURL); + urlEditText.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if (urlEditText.getText().toString().equals("")) { + urlEditText.setText("http://"); + urlEditText.setSelection(7); + } + } + + }); + + okButton.setOnClickListener(new Button.OnClickListener() { + public void onClick(View v) { + EditText linkURLET = (EditText) findViewById(R.id.linkURL); + String linkURL = linkURLET.getText().toString(); + + EditText linkTextET = (EditText) findViewById(R.id.linkText); + String linkText = linkTextET.getText().toString(); + + Bundle bundle = new Bundle(); + bundle.putString("linkURL", linkURL); + if (!linkText.equals("")) { + bundle.putString("linkText", linkText); + } + + Intent mIntent = new Intent(); + mIntent.putExtras(bundle); + setResult(RESULT_OK, mIntent); + finish(); + } + }); + + cancelButton.setOnClickListener(new Button.OnClickListener() { + public void onClick(View v) { + Intent mIntent = new Intent(); + setResult(RESULT_CANCELED, mIntent); + finish(); + } + }); + + // select end of url + urlEditText.performClick(); + } +} diff --git a/WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/WPEditImageSpan.java b/WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/WPEditImageSpan.java new file mode 100644 index 000000000000..edf21d8fa001 --- /dev/null +++ b/WordPressEditor/src/main/java/org/wordpress/android/editor/legacy/WPEditImageSpan.java @@ -0,0 +1,72 @@ +package org.wordpress.android.editor.legacy; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.Canvas; +import android.graphics.Color; +import android.graphics.Paint; +import android.net.Uri; +import android.os.Parcel; +import android.os.Parcelable; + +import org.wordpress.android.editor.R; +import org.wordpress.android.util.helpers.MediaFile; +import org.wordpress.android.util.helpers.WPImageSpan; + +public class WPEditImageSpan extends WPImageSpan { + private Bitmap mEditIconBitmap; + + protected WPEditImageSpan() { + super(); + } + + public WPEditImageSpan(Context context, Bitmap b, Uri src) { + super(context, b, src); + init(context); + } + + public WPEditImageSpan(Context context, int resId, Uri src) { + super(context, resId, src); + init(context); + } + + private void init(Context context) { + mEditIconBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.ab_icon_edit); + } + + @Override + public void draw(Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, + Paint paint) { + super.draw(canvas, text, start, end, x, top, y, bottom, paint); + + if (!mMediaFile.isVideo()) { + // Add 'edit' icon at bottom right of image + int width = getSize(paint, text, start, end, paint.getFontMetricsInt()); + float editIconXPosition = (x + width) - mEditIconBitmap.getWidth(); + float editIconYPosition = bottom - mEditIconBitmap.getHeight(); + + // Add a black background with a bit of alpha + Paint bgPaint = new Paint(); + bgPaint.setColor(Color.argb(200, 0, 0, 0)); + canvas.drawRect(editIconXPosition, editIconYPosition, editIconXPosition + mEditIconBitmap.getWidth(), + editIconYPosition + mEditIconBitmap.getHeight(), bgPaint); + + // Add the icon to the canvas + canvas.drawBitmap(mEditIconBitmap, editIconXPosition, editIconYPosition, paint); + } + } + + public static final Parcelable.Creator CREATOR = new Parcelable.Creator() { + public WPEditImageSpan createFromParcel(Parcel in) { + WPEditImageSpan editSpan = new WPEditImageSpan(); + editSpan.setupFromParcel(in); + + return editSpan; + } + + public WPEditImageSpan[] newArray(int size) { + return new WPEditImageSpan[size]; + } + }; +} diff --git a/WordPressEditor/src/main/res/drawable-hdpi/ab_icon_edit.png b/WordPressEditor/src/main/res/drawable-hdpi/ab_icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..4b8f443e1f18c806bbe38235808840d6a80f9c18 GIT binary patch literal 1340 zcmeAS@N?(olHy`uVBq!ia0vp^1|ZDA1|-9oezpTC$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%qp275hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|81#=KlDb#X~hD#E>34K5C;EJ)Q4 zN-fSWElLJPT$(b-ssbzLqSVBa{GyQj{2W*)24v)y-fM)1rW~Nw~n7EodnYucfIyqVz8oC-gxfr{;nz|SmSQxok zx;a_E^t$9Hm*%GCmB93-AoM!n)C)=sxdlL*T~doO%TiO^it=+6z@E0s#O)RfoaRCG zrr>sqB~HEiK*#8Vq82HtVM4(417gAxE|3FH`l)%q^j-u^*qiuL9y2g7uJd$p45_&F zW@exliy=?j?MI*E68tuZe~@Z=ALsC~_9Mfl_m51)YQ*^!_Ek6SY!H_a_E>o3-5a0D zX0ka8ret#e{_A@wE$yv|Z`$c+XO6Aqe!;Y>;lJL2sNJg?-!9yn=zsq9M}|9=9RIm; z56qjlT~VRo{>2M@^S+7&)jWIF@^s(CM9Tv${0rH&jGd%kUeS8Y$Y*or zxV7AKmUY%scoaQVvnDT}O literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_bold.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..89c3fdaaf1a9404686d0a28f0a18d234f77b83d5 GIT binary patch literal 2393 zcmZuzc|6qJ9{wTQV6v4pjZu?P%wQ%xk;R2;h@YLC69B}*03hKH09X-139|qYi3EUo zk}!({04j`gw_G=bq#1UE2mp{#+6WP#5CgJ*=&=9;RtQ7L z785vUw^0ClJrUewbVf4HGJSUS%`HvGl;#XP10udWK2txxT z;U~!KP&x#3QOG&!XSQM+kTKEcNYNw zB!ld6SdZi4@4bn^%C?#neExL%+h$UwZTfz|RV*t#U0rShxBDApQ%tU>vfMCkmBba( z{?a(9%6^`_0(Bl$y}+hDzq%dnA=k@MO>@vd>!DPY_V_k$k3P|E{9>Uq`e^+@#Q8hZ zm&0~Vmo4zu7uM11#k>9N9ZYi>kY`rh#6QHOB^ALtH0^`{39dPFsMsSSdvt2<{hc}V ziP%_FU0)1xr|y`~s_%H%V=I*^i=z9|cZd6}Pr0@{vGqr5KUme7%MYPURW%edRkYCh9 zp-5F3ncVcu)VN{gPI4qtPFDmu${M?%7`9 zZA+5=qWK1@i_;^giE^PUNn?@LViD&8&+Z7WF)Nnz>sFpqA(lVbOE2R+T%y+ba+5%2 zf5v=1^tfoT13#h&JK~%uC`{zN9Zu2a1n{R&`gA_L+#yg_Bd1`X@{qjTv)f(Z(`-!h zyLpY3=L+7n(F#YWZzB*c=^k8@`i215=K7Ri?e+Gpkk8dNck!}z@Eq); z)}D5o6JqNyr~8WH#hoV-%_7mZS02f@aHU1uQvT88{3hJnC3iS6bz;f#^EbGxxoG6U zI+SWI+C|(9R88fz&?{xRGK9FLAo8?LhG+DynCRq z56sEUTL$Zvb1F}vhpr5ddVXM5-p5`Vr5#GMt8n$>EuPvO8h3s~YkHq&mwM99n#Ji# zExlTqdf9;Kt~o)TIU=aaeG4l2bmS#rI?LG7!WP%T zW4BEr^7^X|`z4Ed2Y0v3z}SI_Sv~Hb9b1M=ic4;j7>&^n%k>S40aX8aJG~j=c+tF|f4wZa?7A*&cmxQa7TUEbu* zYgW<$yWSp<8X(A1UFC>Fw7={4jJF7sUeNU>%G4?YLhj9x087A@yw~^_k@ho5OJrTs z>gz)v4a>(S$hA$))n`}=gwq;Gae1jNuWZNX)G&b`Pv%q)I|HUz4*Vi4 zOQOnZX_IE-k_3ain3eb}>*Y=R=4xwAzBO7ZZ!YD)qY0f49vy?rPux=!kFwzvO^yOp zuf}^3GJ@Qy9sT)OT5ImIdvQv^Oz(d0v9MTC%E-6=suI6uayZ@;+wJys%O%?69^HLM zY^PP{cY(oLmXg|?o(IHdCK6ynL#dm$S;YPIci9?KwczleFB9$Ab-_Yvsa8#VfOjuz zA~;woyEZke1^jXF$e0?DxS6#$x}e6L5Et`xE|R$J2f`d5(5oGnczNllVY&LeQ==&C zd78txlRZm6{*jynU^dbh&hR1<$MsHsXrd$I`wSHlEYxYa#x}sQnFBS&{n=T~I8jr& z2F#mw@u{MvR|h$JjsmrA07%!sqtS%62?8sQJ>^lDyGtE*EAcsf|oIquC%xHtI-n;vS)c-bp(oGq|g zkhvHF2})G)MVx9=y3!7w0d#M!^{}!uc==Y7F>sKt(&g-IFtYk@Wn&V4nV_B!RZ69q zj3{wTYpM4#wC{ce_XzauH*dp&Y8*?nIbqEBH-*w5j7!cYMh#xZ)yIyD>r$Lo4$L{ zUA_76C4lzbc0S`R!ILS|`HVN-$x~jqz2dXV^cX(;s#Qlklf{aipV*Q{AXfR}^(;{h zvXx!4*3ZYoGc)8D3Ekh}Q%~ZX7v`K^phmkJ((t&bqu<{r+%1s%ntwIkpssCHKeMg8 zp_BvPMdA3i5ziz;OW7kff`&Gp<+Q8HXDMBKG+jPYAx11LW35QCWV_v2(7H&vV)6fb d+ZN+rb^RsaVuscpDsFt40DD_JuHKrI^e-FN8V&#e literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_bold_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_bold_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..3ccf0a48b808f9f1b4c4052ab92136253297bbc1 GIT binary patch literal 2263 zcmZ8jc|6oxAN~yqgM_Tzn#rDJ#*$^mI(AvImgS{kGL~TmGt7*oJ0v2h%gxqsDPG%^ zEO#ohYr6)KEF;^9RF)SZE_G+Bw|6<8&-X0PdA`qczUQBF(p{WwMZj`k002bn?X285 zqcJxG4sv?r-gq=;I1r3-LIFVib)mfgKF%77v2$|*fH-9Uprru7E(fA50zixw0K7+Y zvho2yI+EV($`ulfwDTqcfRF??KtLf~1^__bp&ni&FDFMNh7bV@xIhRDf>9zOIc$zG z1<9F41d#%ul!$OV5lJzT|H?pe=3E#q5B*9Z;Y{ScoLr!mgy`fO73{>)DiyEvJOL))bmekFd3vxvev*rARkfyt)sRpK&rhX3lM#XhInF z)MMc?0@$h&7Y$XrinXieEJ-tOe1vjQMvi#dkr~%}30os-AscjN@rPk|mVUaVk|)Y9 z(RY4xTsw&Q;U3_0aB6yxj+d;~^^5b@t=#oWHBL|#;M++mDN(E(o^u^rcBS>^XjrzM zM~bq++lj9rMvU=8I?XBN{jpx37IJ49t1{M;``HWFr=D&*&kR0?Wm~vvuJ8rpI#|j> z*!(gxb8vA{F!D@@NW1dBIj&VCNQITUTmlX5(6W`aQ(zKKHO%Lg`MrSe?Ms{wD{qr3 ze#AdDNyEhwz$4JduU}g(`yth%a6`)t==u5)RzwY@$TVCr>V|fv(8=-r*Y@HIP=Ku& z!4w@45ok=Fc;JZ86?QGC+d&k*h|MPz9!|yLYD*n9#XBh6INf)>tf8Y zyxArfzO={Sz^CP5UYU>58C%Ds-U!J==eXtHZpxZ6YRj^aqw!>$zuIjQHJ#;Figx;)fBZptODSNWVubz#>+sdNwd`|A2MCT`wTao|Mh2= zOd`qy+csD}BhgA+{GIQEVQxP}EA6slb=L~ov>vi>fFIlag0!i34|Lo8&GcqVZH%z~ zUnR$o?MHQ)vv(l7Ubv_ewpu(j*hc4@o#)d`&DSoe%5CF6Q&|wBW+llC$pzT_F$xXA zbf~?XUlz+!d@h^QV|LWlok4cEn7vY)6=jj`id-EWeHFv{apS<2#pqnWP+9Ad|# z6eyv#C#Mn2enBH8O{QK3qt9YNs4p7RN^F4yYxv@thQ2oB=g-LV_xA+ ziTu|M3wk*j*$w&rPmb;10m)1u*>YVr7B79DCDv(VBCqRFd6o3eid`{3w#EGCS-)u)g7+j|I;=u*|3ihYW3=!)u%P zz>#Zxl2qC+#0xuDRO8;Y4Uf`6x(<4biEEux=})8ZjdDE7iZNG!aG>4z|yq%@o0RM~VYa@#8NZ+37Gu?5;o*UEB zHfomk$E~XSFV?71B-;Ik+C{U*=Ib8vF~8&_iwoq89g=s(ci!xDXiU|dN$Qi%OMm;h z;|OF_eGwBEU%8~#9QOIHZ%3E;B}wl0!QR^0>aGPk`ELj4 B>~;VE literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_html.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_html.png new file mode 100644 index 0000000000000000000000000000000000000000..4d7e90d5b8c8b958d56ca378e8e6a55308f037ed GIT binary patch literal 837 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSK$uZf!>a)(C{f}XQ4*Y=R#Ki=l*&+$n3-3imzP?iV4`QBXPVk-l*+)sblB6y zF(kwJ?KIyE5kryV*SFn@+M>JSN2Ai-j(aQ{+0S=zHN9}nf3$Ra6ju{FKl8T9OSXoJ z@43Ri>aOP{+5KHpw$4tm5?fjk;b`NrR^C?Q#lguORnqZoGoz+164}Q0sqVv#v-OjF z{=H8%n(QpV;)sG&oHsb_nCV$M%VV$Z#H0naJdY*_x0TwqvP*ZGq-&U`EG%d{)K(|A zuJ!-iDX+_(y-u_4fB$>yy5)U`er%r7UcFc&Dy{UCdRgE?>rbsglXLYYmn5?`;lKYAG%z9Mk-%>p*$k^E-TzyX6H}nh*R&%di1l^?jcv~OVKQl={#a=ZTAl_@u>vygm`V3 z_#kMXN$~vURX4n>6GNVJZI(M@SF%&CtgTIIP1@l;OZBUK9>=PuuYP_+d;X^689d(t z5|=srcG>Z6zOjwaoEFP@e~k~HF=l^T=FPn7PD>7SK%+x>%Kds4T@NUaO6+Zb^;Adsu}n1p$5%j)cqSBDLro1E@S zj1bWYvTuDJv6QjRPUqf+cS=E}hl{IOf4#C>zeo6;;oO;A&ZYOALi=LA9S+S55d6_? zrsKQZmS^F8p08hye%{`^cBavvg@&irv*m$&_PxY8N%j`NuZYPIhkEy}jp zAoZgzB-{Qy8@u*tVa;PZ<1=M6#OhCPsdcw5SmF5pn9D5YbyuHo`_Hoav~>QYCl-Fb z?_WH=8v9x6`Hz2G&%$TTtxn{wnYQi7et~WAvqaES(BmgX_Zd|#ob0Rq{(cEC$uoGm L`njxgN@xNAwN7z+ literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_html_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_html_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..508f9f312cabeba27f07f2477cab676dedb50345 GIT binary patch literal 788 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 W2N6!(0|$$LMdt%<4%PbufBqLT;aUU$ literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_link.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_link.png new file mode 100644 index 0000000000000000000000000000000000000000..78f957d3f0919e4bc0c5f3d419a048a00b1f092d GIT binary patch literal 2762 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 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_media.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_media.png new file mode 100644 index 0000000000000000000000000000000000000000..48ae074cea8a451c3b14f1d497c6b809f83944d2 GIT binary patch literal 2667 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 A9RL6T literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_media_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_media_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..8a3730116c218e3d8d88c2066df56cb94d8073c4 GIT binary patch literal 2521 zcmY*bc|6oxAO6XfL6*3rxI>7H8CjdbbcYdR%@{Rf>|=(p%*Yr9Q??2%LdaOMRJV)B zR(7{2H_L>mL3AtIy@X20mUmR|z3+QIpYK_o^L(G@e9u4Uq?~ZHmINt*005B0*r2ie z(QGGni|~8I=13TS5b{Skpa7uys`#dlFn2>+V^vYQz`#C(HK9<;ui?p*?}E_>cRfe z=BJwNpa`chDw*%RqmMjd_Ko>}*bg5w*pB)C9Oiqa-%x(3NRS!qpKC*c?As3!06=sW zgGS*3gy#t!$vD>o+l4WUW1KBq@oS0jU?06 zv89j4W>&Y&W+a^LtA%{U9?K?cNZWz4e}Tm3sSBLGHcgFH`r}Bq{eeGV*C#B_h;5n} z-pwpZpJ=^>6-jAvqMI9ATKu-&Usmt-qCD@n0(zi>1aX)NOSc3@$v|0i2Q2lpWy`5q+|$Rd6ym zr~J`P8nZdBm_tWUG4&3o^!hTI7_Rim(-^xnVsCn_k=MdwiUc>~)!PgvxsiIY*6+@G zSC3aVw&Kpa3^Cj348yvprhQAa7q{+f-u;|1kCc}Jof>z1@JaiWCoNI93R9+*@(z@R zrK^5kIOIR1>EBN(G!p6^hC)Qa3KAPnClr>cA3E)^+PNRBQ}0=h%lq;I!OJ>YvJS!swzyrXx-%aw+d| zNqhVpdPmLPq``afLD`SGeFgd;xono<(8;hM$UduU!)EX@P{w3mWK^Aa0P9nqd_dkF ze4&(Qa;G8!O1V?)12XLOek8H$hPp{1?m`aOVu+S-xT_@vHC2i19e$o$kR^8Cv1!Eh z`O-qhjcPa0h9gIz{B}%@Q`^>GvRl*i%9)itXB);Fh|}X|kHKE^*dzIzv}kq~9@hF= zV7?Z8tshcv|H*{MXm)gVe-#I3)W0<9y{R)f_S@YDRe&yVpQ-Wdo*~V`# z*Yu|Miu(0C4-7EVB$&8Zf7|)gcVL(36Ph_^cAqq8mzp7HqDgg*Cn9W1{G|&Tk-;-z ziE@(O6`6i-?CO^TVvU>%*|K}q^_ve&RYu3Ze%v!noxsfZt*Xe3N{q-U$5-=$5sCmE zkrNSeV+B)r%?~zH?`Y-z^8-dB>SFgT9r%}fUIdqi+Pq{x1>bH68#_FyU~bEN)y=IO z2-=8hT;L5OR4=O*{GGU9dF4vkOC7|+miT_TTk< zrH->+@S?A46D~Su-Vx$d24hGTp=8+-n?>cHs~~d%LUi$0m8X?PBUAtZSqfVvow%EN z+rTvQo~K5`Sx_f)S=#>ns78e?=PFnI!sPXG4vP`RN7ZLYp|AoJ4Nyc}m z;c_#hC;(n9Nu5foc`u4l^lNJD@l{{KRBK7~(@tY*M^;^ahfP0kxBr|5DFP{Tz+nBf z?5rv`L>5&ux%hUZA#8=bS06Iz5iDq;q`eL2DtdEQJ0sLwm1Vk~iB>CQPg2h4qkp%J zXr(B1&WvskjOb6VB%=d$>*fOQ^2UR4W35?M*5z-zK|*U)z8anuAJ%eeJgJ?Fj7y=tVJ?cXh#?Z8v(5MLAQtO;j`!@M?sA6imcVX11l;1hlol7% zw&mFP`cJ+hUL7d@*;K1gyfVg3NNLX{5xvFYtuYYfJ-sn((4-*{laho}6V|4a0p{`)j#Iy!aZK+tZvP1HqdLbAIX+W0)KXL-9^pJ(xRnxGWP^;qM3O#EHwetE2uCD} zl^NC>`4bbDeZORXq+kx`5eSc`b9J6`j#Xhii_5@+&!p;W@W95jh IwD3;&57&}xg#Z8m literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_more.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_more.png new file mode 100644 index 0000000000000000000000000000000000000000..f96fd5d76d47b1b95e3f4e517c47c98f1952eae3 GIT binary patch literal 1529 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xg+bv0i>ry1t>MrKP@sk-m|UE>MMTab;dfVufyAu`tKo-FP#GNIXX$YJ0ilN>DdQcxEqi?8Zpbs}2sMQ7}YUN*)nF_QSWWJrD z4Ok_L7}OpceURlyj)C|TEDH3h9hZ$hJlO2Gd=9Bc0wayf)5S3)gY|9X?xHIOB6}z8 zy_cePx^2VE#xqM6EPSBt;dq!m=b(clv#O}E!_%(g@&+a%0ZV~W9(4`Vlz3T^^1^`UC&$^$nVX)P$R$ce z2K|2e`~3C;$>k0Q^$N`77?(^suz=O6wyNy^x1v*Pmj-Y?nf~fl=&oKt9nBl7KVP4p zlmDfm`q;B`Pp2xieLJJ`=g+_1g42@UckW%KFI7F`Y$V%mkv9kb{bOv%3b}k^+a|lH z89winbW-lHrS&rV?OYOa@8b!zgHgA=--?}o_2Zr7!6}mG=V(_|FU-28+|;GndS1ll zp}el-;<&jlcCJz>G)UPLdfqDG%Yl3r--I*VHs__icQ|!4SbUrM*Z7cC!m*$C-d$tk z+Z^-y`_ip@R|%%@Bt3Z{5PtQmRqnCZ1ztk?qGx5W{d*E9BA&OsjLX6@fBLJZuMBL8 z44znU$m_^V`@QSe{UC*q9ny#A>($5ZS$EgwT-CW&dArzI98#AV3oiCsWU~ahD(pSH zV!x=-Hs_R7pL>k5HH^jY{gRCH7yI3`cyQG9Y3XhslfBPkRj+*J2;sMR>B^LSAZ_Dc zR;y2Kb516UBz@xJI~;z~XXod#lGDc+>*vPWRX$j`^V`#Nf6hJoW%FFlLvumxPp+K& zb!X>V6?PrWy_sn|t?l9JoOwm!KAE9C%;(lTmU+74U(vb3-|h!5mAD={n9n2T!HFzb?*G5PR%WumbC~^#Rqd+$AS(yBx_Le{9K}O6y&z zj~jO1U8gYV@QL^w|HH=@+pRtPYliE+DPsF9KL-$o)O-kz%+{O$9H#kZoQ&Oa>3JjpLE_UKtl&6&zS zt4uDSf=ljf|7xkdbj;gvfdB&a5NES^-f%Jg#M z+}^K!@5Qg*P>kKG|M<1ymSyP)*>As3DO=9y@VcSU@5tX59O0^hM>lTRW`4l`5r>6$ zQ8cqc)!A!&L9?1wZ{B?3|J&8^{9c~cjYR<`rfiiEJN9(JLhHxx(`*mTF?Os>mdWs0 zDptgx{AJ$PiHF&}PDINcW4ye5UQ4uN_oOEkK7EFQ?}d*a{1?~VVU)M(icJsmGX7|W z{sy~xm3S5d#raQGSjxXN@YXb(delWorzo&Svixkq+K1cZxB19yc)F$T)!*>>-o9=p iz7}H3jQ?Ah>KR%hSnuxoav%*nl literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_more_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_more_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..9ab4487bf14cf766304b05279321bc01d0520761 GIT binary patch literal 1488 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw1|+Ti+$;i8Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xg+bv0i>ry1t>MrKP@sk-m|UE>MMTab;dfVufyAu`tKo-FP#GNIXX$YJ0ilN>DdQcxEqi?8Zpbs}2sMQ7}YUN*)nF_QSWWJrD z4Ok_L7}OpceURlyj)C|TEDH3h9hZ$hJlO2Gd=9BcGB7Yd^mK6y$zXjOxjXN+fr#xA z`L4zteuBF-cv4@NiB@}_-&3BrXAwjA940@;%-|1=J3~oU-!(C97^6SdG#_&?w+>sqZbG3i>AJN_3FP5 z<5a;ww`I{?k4oRF6?{uRcYkN|)KgNcYz{OShd4FXMI5^NpeN{j@zJTrRAeq3^1pdU z=BCdrjeZ|9kL$>_}IW2-Mp3`h< zrk(Au&UE{J$L7KN>WeMvx7J*|b>Qd8wo^+(@7->BA+ufGZv&^BUhK(9?bCl&N*O=% zle%PW&R>x;|JaHWt$!!Wz6wp0*)2Jvu-^Ai&)Fr6e~Uji$jh!y?J(TdfBA5}%TMly z8(ccw9ln-cmHTPf?D=bXvwyPEyCsr$feN>8doj0n(gN*my~l2e$IPF=P_Fsdigk~g z^YffNapw{y-Fx}q@(iH!(k#z)>lwR#JT3UNsCwg$D?!I(mv>iYrmne|`@?eSv}egT z?&}7}SwE4BGm@)oQ1{C?G;5oCwZf{9#~np|<`18qX6B!L=x}z_ZF{9h=Qd8Oth{y5 z$HQ+iM|fa<joefrxK zPgXRY-mAMi>3sr+*{!*uzkPq{a~=KjtjpQpwPkuBpBVRZ{Y7uz8>BO)Mm*Vc%PV%u zYvxA^@mHVC6m73O@G1KIiYpg)xTm{sy%@G?s{PHmsT(FOE)NWE;4C-$H!bXQ!_#)% zJq>^U2-XU|aC#f~`Q_Sq(I>X*wJI(?sWsuCmflUxN7r82hfe@1Q;yfMe0=;;M|A0= spYQ8G@4OPDcKtGH27}}`o$XBZ3^Ueu&MLBvY6X>>p00i_>zopr0O0X}0RR91 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ol.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ol.png new file mode 100644 index 0000000000000000000000000000000000000000..8d04760317740a5ea8a50963656790b4ed3211a4 GIT binary patch literal 2307 zcmZ8jc|6qJ9{w?!7*xi-yct7CnWZen7-TGi389RwnUQ5^#x~4YL)Nlg$@20lG4_2a zYgy7}O|K=4XrV$WMM`x?b-VYz=leO^bDr<>obUPTBv~If6^6(_000oio8eAyXUulz z2XjZAt;Ye}iOfZdMKe zNc!cs*=!35_?Zy{0YFf6yYm2l=1Tzp50Pr;z;GZ~>bUvR5acty6n6xR=Er4ojafR} zCC!~dhOua8>47>dJ@^lX4tKo`BjKqHOyRTj5E?jX)uPYjaaE z+o+CJ0M(uAyseK#V}3CI5BueVL2jG>&t-mA`UB;biiKd1zn={YvFuSH0>Dl&JkHS0 zYsU&P;;fjl*p)QS^wLKVgwL2qRMC4)yM}Hf<5zGt^?4<2Bw_v{Mf-?Uc z9HM*9c07688S-{T?pWlS^y)t%M@OhkP0^cqHtmv??aFB}oih?zp&kv!t%HBi~%gvMHRO>SPTW)@IO^|QraL^sh2z-(k}kqs|1 z4`eN^SXP>#FIn<2#iGN$Du{nWRH#lF^Fgh@(_WDqroL^`RHH4KGSl3{0@` z;327}pS=s;hhZav`glR_V6Xg_Sm5P11e$A?>di#0v&2&&CH2*7iX$H7&+6)vb*oB> z!^cByt)l6Q7}j+yw_O>$kkNRG<;9Q9F@O=xtEtpRi*FW6gx#mHTDCqsSQxoW_72V!7rv3 zD9LuVNdk@I(-o6uZN5PlKz`*!=wni&X*1Gst?ki`s8Ni0(u@b2 zZOWPulK<|efE;f1xEzCBsGc19dba>3ReOw2(l8V2kCaZ1?kK34w`60qU%xo6N2v=;Lusi*rHp;(ejIb~?0w1@HT|AUl88c1zD8r}JE0 zpiNoRSphr8kcrWbQFE$*5#A>^{7QyP8m@R7OFwqLIicKC>b#`Y%&bY6AkhkXe8pXQuM%&#wFE<=XnBUkHJdl-$0f|gUJ34sj?Ydxo$f%8g5_Y)%x-`-@ zVYfub(>TV{`c_h2UYZ&{q0>ZMAbdPuSZ$>!7EGIdEx7KqJ7!X0vX>S1vEky#;;DJZ zlonNyJDYMPCUBm~3)mWHd& zQ(XA|NW6a4et9`b?#dPOB8cTZIezQKV%V$5udNUIXWDWb(<@EBZ|pu6#fg}ioUNDA z{ba#b)i`CfZ-7*$M0zq3Ad<-M~?3s)VtKO!?Z7NRii*)Unarv5D(;`dw%Us;>(+ZtMpJK=oDYNAQ6dCWd<^LwjB?=ULtqPe;D!Z}O9gwX&XTJlvQ z`%Oh9Q5y7Cfw=pDy=PBk$;mvw+e+V(M9}kI^jkIiBID<+w3~zUmX5nkK1?YFv)SYl zf}(n;VU2cjCYVC(LHPzzbB!N`e<-5}S>pvy6~xT20wxM;L^GMRM*w8fuF`(%#8t+=5tRRjGipFNg06&+b>`Lo3S_Sj7} mF2QP@HoC&|kBDAEuObs7am05WMJ?N34ZQJjT+K03%)bFjkN_?K literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ol_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ol_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..201c5bd1aac6273815b8794c15387ab5aefc2bb2 GIT binary patch literal 2205 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 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_quote_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_quote_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..d2ece2f507dbefd6b1a4d60771198229e410ccf2 GIT binary patch literal 2838 zcmZuzc{~&DAKwVgS-FO=W+=3cLfcpo(O2&KK4w^$V`GRcXRc^Db5)e9GNQGL97XOg z%9W9{a^&bBN&Keo_xJt%ey`W>d0x-;e%_z=`}2AJdQvRRjD+~5`2hfc&{<;xE6%F3 zJNEK&X7tv0C}-K@t7obQ0Mum)Yxar33&_699ls4n&;;0K$*}z=8)S zDjxul3@&ZY1O@dsIgF#ENFv!Y;wX`% z@R!KHbqw$%Tqq%!Ob8-Ec6B|yg2KqUQ0T7FKkctP$poMOI1x#Im&GX%v3rA1ha(aH zXmdh!c2Tr>C;`uL-qpvd>-=W^5B9f@4r15*zmoZ@(%&ejR4l&^;-6>3@}Fx{cH}&~ z@>v5t8$X^U2mf?eTXDCapGYfAMzI}1>iG#6mrooHTJ=1^*bj5(W8^e_ja|jR( zvM;rvlGHiY-;i|PKpDFi)Uh30y=6&1D^KyO>qf+Ti9#Fpx1Q=iHWv3!c8*{8d9QJW zN%|NwP`tSj5*|9Bo7pt#HqDT`uw!mDqxZxsxmV5J zjO7!BT{DW3vgk)Xb+ZmjgX0aeTc6!2)LzfBidC?)J2JX{9CU&QHNDdwRo#2Hb%SBm zQ=mPQ6DC?)UZ#K%6v~^f4PtIqovQIA?996Xd-gO8k74o;Zne$eoY%hfKA0FfT-W#` zM*j?^{=*tGRN@2Jy1PC)=EhSN3T?n_TT|J4*1m#QXfQ9~a*kSGIh~S@k}Xm_$@?nP zs@Vc2YP~w~`nyM*r8HFd>Uz^{o^LsIbaNFhEwEHUWupYO&kE@8a=VePiTnv*SIvC1>r$P9OXMoQg+dcLV zSmdqsu*F|5R+#4R@Gmtl;S=Q0jXsOxzPiz0Iz{7nei1^uZ+kd{mZF~QyGz7;V)bc-H2MMOu2=biCc+?acX^M3Q~84 zN~UM8T#`XLO!vj(ySca=e0#H4!|s1z`xOJ%m;Rs>Gmm%Pd-T>_!M~4jM1{<)7F|HY zcSg`(OPba_GHJ=}7U*KLlW{*j&o+Uby+)0=34kL)+2_zeb}m+zBJ35dEPE&_mt;locp!!suD32H(u(PF8R*h(XrI9>nEMxdJD`-@7W77ar&j- zk@LQ3^8Pxlzbyq5`#p0dJg3V!$6Uipw6^k$-F@ky))c(B%!#tZS;V&r1^9U@Y$i9s2_mdOEmLIxEsJdk%B!kan?xzxy#+%pcZ9#T$~7O6a_)*(i#E}Vaj^`=tc>`(GktEdta9#Nz@K*;NA;cw zS!ByQi?N;Yi{9|hd=r-z2z**xPumHsmhYw!wZY5iZo^5@<=z?On|-}`ge4&?5!L=c z4esE??hOz62`@G&UCX_6 zr_|MyfI9_wEpYpWW#Wk6Z&u<$>J93P>8 z_33W|3bI9o+eD5U4PGCxY6zDUA7Q2SJN<%K=!?|K#OCj=W8Q@u-0{ zcX+f4-Yr~m^X2+k@T2rij2Yj?Cn{AS8=YJTaz}2oxO(beG4b(H$hkr^rb)Dv1bw=) zal<3>9n1*w(DGs2BayqvX+A0(r)QOJH z>YVqdRg2c9QPs2aApD#1M4N!3_jYt}Xp)|n$g3J?S-eS9%k3nYrKv6DR~zQtyevdZ znyTsupUtV$Qz*qmZhI4M?)obF;{3-kpKUoK%-v=&SlaBV0~V`F)|A!6X|*X|He()` z=6u?-!QqK#wad0Fzu-e*?o(1ARmGECHo?y-D_vc5<&6eKbgHI7xwX*?PPcP4xPw8}d3KWe*pQ*ccYFpVPFz zV1YA&d+Ji0#%=FRwIl`EZ#8C?wlJ7@&soRJ^w^23vbKr$au7Lije3TeT=wyTXEMekUqru^YlNV+R)h2&Pnh{WH`C`U zNi`*#8jn%7+R=h5?KfMr=%MieYQYP@)a|&?GoRdz}H+KdIxU&+!Xt)MeDJ+-}^^>GrXkrqaYDW)d9>l uQLOtN&4OvK3!CZ-|KCp}{n8GMdxtlZ+=0-O$@;qc`#fuCW^iBMBko^(j29FD literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_strikethrough.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_strikethrough.png new file mode 100644 index 0000000000000000000000000000000000000000..19e4f6bb5458ec519d1918ee06d5cd3f7894534f GIT binary patch literal 2630 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 HY8&}40}r`@ literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_strikethrough_highlighted.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_strikethrough_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..50b45a58caaf5de952d2f1594351d19663e2ec5b GIT binary patch literal 2494 zcmY*bdpy(YAOFgwa*2cHGBk6UuuV6|);KP68!|&KLv8M1n@u%B&Pu=B(ven%(8XOs zj@zl+<5j=NWl=JhNVLQ%Bk`L$zka{-yk4K@@_yc*_xt%g|2$6${)oMtw7N6^0CJ8F zSb}K8Y{d>KQIB39rHclMP%9TJ0I127Stm(~){sC4f(rn|=>tI0c>q`wK}mA}aMA<- z=8ucAt^Xr?*zI|D76Z^1|?A{dgh=T|dsD(5H z0>RLOLeK=P-QVe=l{qvlCWeMaB2S+_jW~S(L8XTx_n}ZIq{)8d{{3(f1I~!0#E_V9 z3Pb0I$bWUP!Hht9I4vfeN`Y+YlE~DPG3HR{meJ4l0zt75jy+6is%c$ePnrE+&Qe8&PtV%31Af}UNI#P38&6+R0D4+ z$IoS5&yGu5YU}KTA>|QN9K@|KsT8|UUy+F~?{0xq!6QeXpbjK%=GE~LdH65J5jRm+ zBKuGWHrEAbH={Ok6uaPD%gW!q#cQO98#KHg}?h1tIT$r?J>Bb&grmx?$P{J`_6D? zd03*yUcm$0JjpidQBU@$Ju(6Pc==%QjFj+K0DR19{9HEwx+CFa7Vaq&wl6m?D3_+_ zKLF=Z!%YXyYS3H*#4bjg@*k@8flIw112>$S$vq6YrWt8vOKUu`=kkyQteVZDR3*2> zRi3P0I_hqC_!VpS!0&H&ffYMi*^q{9l_50;?nNZm(=B*}9N)*7(A)JR6ZR_Y=PTeQ zf0CiSc06arM?tCZfTEZ)AWl=?wh!;Z-+_kFtw-Z@jq?2rJ*L#@P5@N5(vff-KHx@- zSG-k9(6yNjP*>&1&!{fjXiv~6d#c2qjx;3hz;G*G*M>`!{dmHU~y|4U}Z&}~fx1ccY zSf%8RXCY7L786wW)E>+eh6P@YpC85YUn@4$WXbLFH#Q$kQ+?KIYxE|^wDIG;22$5y z_bi>VsF$ld{#v1{sufFR6!HH0{DfCa@pocg8ownzs|p?)w<^|klLybs>Q13^7G?;= z*rtW5N8DZxnB!xgyRgwh$@|STVGQNNc(G*5hZ8v5*A`ly+8N>@zlL06;RzMhqGrs%w>3F@%z{IEu}w}CPI zE_5F*Na+(8oSqhj3mT{9=Pi|WC{0VNtH&}Y2XB`z;>8bh+wHuHR&>Akd3WDFZ~7Z^ zrfJdrZiSz#W_-~Ie(yJ6m$Ja5tz#^n@mYmQsf=~O6_52SscE8d`4yH0; z?(!a(%lnS!fg{`BxAC(zRUVaM-W~KDeILKIq`z0g!XSh61DB! zW1HH^H(jj&9@RMc5w7*80@XhrG5bVp2r8`E=C1+P^f(?{-5ALqB1znFRD#pv3j72R zoZ~@z574wn=W$dWd9&+SnZ%u!8U|v@kZE`Kk<7=}FN90VK4GXach)yNuTbQlQCU*I zAIlhAHhnt~U&u>uR+F22>9o_kCcOeojHFE#ZL*Sgi368Xg&>U~?Tp95&hxJzm==>g zU(r-YU-w%0f@f+(|K{$`UzUBH!Oymf4<5Rq@xb%->Wt055Cx@6cQJK<(7$uAoxdZZG5Xa4W*P^+Pshd7fTMNt4gwE0$&x zgGj#TjJyIA5dV4@1g51$4K=(^x_Xn>3^_BHlgJ*5y7dk6Dup>q1%AD8R=)U!@3w%t z6p$uu+!b;nX8lOzSxrwSthPb<(%Jr!)@B=-k%OK|QR z!;qEIsjn~Jv1x9+H-Qz74UlNBl!W5!Ru#;SvJI`c;1x{&T)e%C?ds#N=E5L`BFra$8d+SgcN>hZ`zw?ol_YpOE>$; zdNcA<$7R*L*;2#~CH++axtibJ3q&pR3e2=Z-X7_9moYnch!^n9*yhe3_a9i3DH|uS zt~^taZu{&D;UmUH3W@vl&C)$Pm-ks2y5*d*k_WXap2*J;+xyze%GmzvT0b7lf4-ot cpVWoh^%em6f6tL7wth*Dwnwmct&g+*11pGOI{*Lx literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ul.png b/WordPressEditor/src/main/res/drawable-hdpi/format_bar_button_ul.png new file mode 100644 index 0000000000000000000000000000000000000000..b4ce71ee686d5708890290c06483c0fef65363d9 GIT binary patch literal 2030 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 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_admin_links.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_admin_links.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_admin_links.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_admin_links.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_admin_links_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_admin_links_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_admin_links_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_admin_links_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_bold.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_bold.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_bold.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_bold.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_bold_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_bold_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_insertmore.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_insertmore.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_insertmore_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_insertmore_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_italic.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_italic.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_italic.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_italic.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_italic_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_italic_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_strikethrough.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_strikethrough.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_strikethrough_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_strikethrough_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_underline.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_underline.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_underline.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_underline.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_underline_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_editor_underline_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_format_image_big_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_format_image_big_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_format_quote.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_format_quote.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_format_quote.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_format_quote.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/dashicon_format_quote_grey.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_format_quote_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-hdpi/dashicon_format_quote_grey.png rename to WordPressEditor/src/main/res/drawable-hdpi/legacy_dashicon_format_quote_grey.png diff --git a/WordPressEditor/src/main/res/drawable-hdpi/legacy_icon_mediagallery_placeholder.png b/WordPressEditor/src/main/res/drawable-hdpi/legacy_icon_mediagallery_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..9e2b6e4123ac99e4a8a7a52d57593bad779d067e GIT binary patch literal 2404 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 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-sw600dp-xhdpi/format_bar_button_html.png b/WordPressEditor/src/main/res/drawable-sw600dp-xhdpi/format_bar_button_html.png new file mode 100644 index 0000000000000000000000000000000000000000..ce40ac2d053755a931d081ae27c90469fc9c353e GIT binary patch literal 1105 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-HD>VBz+3aSW+o zd^^K8Lo{6E`1zUUYNdjrw_3$wHR>K5+EsY5Y~j8c5?i`%oiHwZx=2G$XJg>}X-?dF zlRDyG9Mg*`6jsj)+cwo{(((>h#kz$F*|VB7GIoE^Ui56Q`S+@K-O7^-os6zketh`< zQ1$nD{nh8@%74#p<6vcRU?2zGvt+WFB)C=P?Vo!;G*4S?PxjrUyvE-<+uhW#-tUN3 zZ2Zp4?=N4vb<@G;@!wq&x9D!Wwf&mvdg=RnkN=aH9qNC*`frZ)$KTVgp0u~Uxq9}k z^L~$G{ulY{>HEvv+@tmL!ermQ$1Sam*Khv1EO+wX;^e_*#Nz<=GBzn_l3d)F)d?Cj}EyG5I$=A0ARym9uskJAOu9{6wF^X1m6 z+=CLIJ|w@pU$f)fi>Hb8H#cs3wR^$&3r6Lh>tC_k_KSC)Uq3H?b8*$aGhg~$%~mft zb@_N?bRk>6w%O!7>5jFp|5&DUYn~9B{P_Cun|gr_CBf7Fs?N;S=1Vt{mvETrbL`rZ zuKHj5qGj+Frn%$|dJGGyF*}Ktp>w~Dxmrb`vG={L;DqTu!KPPRzCMBF6hqigGGMU+a8ZI`!oS$5Vf^x9dDU zW)K~-Ym?FMAD{odv77mKt6F={`W3(DpN!nH_mE2U?bPD8e|G!S96K_#{F3&|kf-ta z*2fDzDxE#>u&K8#Htp{AHCLABe13ZIMEoa)%cUnjGoAb6wsguDAvw{c#w83A3__tg zKUHPEHa7p8wutkYoaB|?PrE!t`~Sq({@M0jZo%q1lk?`wpM3q+{k)vMNbbWe{81ZQ znq8Dm71c`ZllifB`JIZhlGVq3)h7SkAonc$#Mbo5-13I|=dj38Mf2 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-sw600dp-xhdpi/format_bar_button_html_highlighted.png b/WordPressEditor/src/main/res/drawable-sw600dp-xhdpi/format_bar_button_html_highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..bfad2c98dc0030e0384d68feed9e6f470516ad63 GIT binary patch literal 882 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)Ea{HEjtmSN`?>!lvI6;>1s;*b z3=DjSL74G){)!Z!phSslL`iUdT1k0gQ7S`0VrE{6US4X6f{C7io@r{UQ7Qui(+5u% z$B>G+w>NAvL>xufKTLPwY2sScBxo~7KTOmQd&E7z z@NU+;cV@*cHGX%iroMJF-`)2+|LqMKZTmfU*B*M^F1zR3^iwCcmEt520)K589M_qe~4 z(e9r@{({53QFRqJ)|Ows$9=u&eq-h=!I!U?h-w(Ai%(Z9! z@M30On$#pzNkK4Mu4eg6|+tHd0CsRW3Ck))sO#3&QPvbs5+Hq z;IJ^Sc&^{dx^>4`CG1^d8s^$?ou4x=e@N;#8^m(t8DG;~NAQF1|juFz)fR+O3@ZGwaHjucV*d z9Trr%>iW5v#~GUI{!Lp_SJ;1__p0@)Dbl|7n;FwyDh54!?fz}oFU7Amu}M`N1_!^i zdqf)CIhXx*xwrqeU3^SFQ?@ZrRye@IQ6R-)ad!VN9v`FW44;oSUkT0eUb`nQIqu5; zTmSblXJ3z~wcn+5z>2wNpOmQFmY|2F+Fz$e#cYq-a(1!hPVw%a>(y@0X^foy{Cd=O zo$1+q&)uJ&Q~8ydy=>>j?)u6av(VR7XsHdz4HooeGB~ujVTHfV50I>}iazil|$+g?fl&X1x)R9sc0mP92N=CbO;^H0vcE~Lxv_=*`dvGw6RXCZ(OemK?op7W|*JT5d_5zK=XC7{x00TS{z0DCn6z+V_8 zAZLf}L5=dPAK$Wa4ncmoJ>I|<%7o@V^v73NR+hWR87aNJ4qKi!BASmF2d zoAR;I-cqMgUM8QFMeX{nldUo0W%3Wwv=p|tRi~SKg)vaO@aY?DEYHQp;Q*SLrp{yE zOgPIuW;`xv-3}(jTbiOH-Vp=`p+{IHdB(}^JY>U@sYx$U^}vRk1qsDX5mk>ALG@ll zJ@qVRBaN3^kkm#`i#*^$&f+#9m;+o%T?J9Lu64>tJ24l#dO0_aQ`kC1( z^Pz(F>>U=Jl^s#voBI^@Xd-~1klAPME#`lvPe(-_fikQB`u$ZGHH-p+b!jxHc|0z( znP6J=EFB9sW9zXqQqz(-~um=I7#&hboHBLqK#kRvPX$aCB!^y4=xKp zy!CIYRo2OL{>O*2hxtc*4S*9%MV zpDF7zm%Q>=zq(Q*tB!sVeTCo2;1#8Pd9# z>~_Rcaztf>8^qBF_M28*pIR-8pQD=IELQ>xN|3&z!A5RyWd{pk_9X&tOJ!d&g z>cPcSz)Y)9u%oTmq-Hi|UhJC*IWF2fXSqEMTYI(mQun!4{B8s3rottQTKXb|{>Vo8 zN(5N|W!6d>wS$qd@+Sm1r@*q;V~$Avohj`10g+o8d1GwovTzO4o+3paua%1&2{uIN z9H#E^SQBw@5>n{a#YK)AAW6Okj+g}CAFpuwaxe>KAp;`_ZLY2Cub zmt4__z6dXew16xxw7Xb6l~=a`aOc6rwwpF_mH8*^Au)coDe_yrt7hU*yf!a)z_sx)ekZ^gMr?SZ?C<4)fK;( sL=bm120cpMfUEw(0n`B8Bp58I^Y_IJJ7fgA?_L7H5stENu=7d(4_K4YzW@LL literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-sw600dp-xxhdpi/format_bar_button_html_highlighted.png b/WordPressEditor/src/main/res/drawable-sw600dp-xxhdpi/format_bar_button_html_highlighted.png new file mode 100644 index 0000000000000000000000000000000000000000..6770c73a2337c3973eafa5212ff3ce18758b3fa0 GIT binary patch literal 1482 zcmchXi$4cUGO8Ip#tIweSspw0N8Eirzwh_^AN;Nc1)x9%<^})&0E9l_7ra^W zzvyq>v`3V?WHUO+!6+X9PYn4A0O;kQ{k*Yc9hEHb5+nrDH8&>1FjQ7Qe=nvymPjI+ zOw;Qa=GJw2P;9=_Co6Kpt-O5_Y!KG36dMFK&dJAb0h#cFwBASz=U83#6^XBrBly(b z({}L^TV(&3cv`%<>1o~@#I+fpHbUmi@~@*AnMf@u!U(Uw`*(ou|D%#*oj1}oHq(jk z9BLUs4&AZ6ng_RkvV-;3jz@L+;-=xz4QV^~51W^{q~;6YgC;KNmR~x4X9Gcf^HHseP5hD9sseV_8T2uqi`=d&lAD*(AobOeM{4 zgEL*zZfk1Et`N<8o{%%stJkb9G(y6lv1d?!WKHZ66UQA$A)(E^4&ql_CE<=`{!p(r zoREr|ZDJ+xXVMc*Sts80Q7H@|@`clcV|)#$^0T=`%K^9CLN^M7+tDY4;x=F{`we4e zd(H$Z*5Zn6yUsljFDbgcEBCok`x3R{ z(C*qEb4NnZM_^0}q>#b05i%ZzgLr$69|FY-Q zYOQ5M#Kli5T#UTp=+m>Xj*h-kXmQ>;>9CgFRhR->pn`Mg924g&SA@#)g}t3)1!f*> z)T$_mpk{yteB06SXUw@jNq)df*04^Q+PM zrNGGVN3Jf66SH)Cj72wMyg*?y!r0*m4AV2jBPlg3FT-jZY0dcHp+G)eeOs=Rrc!`7 zNcUf$`f@&-4L|9laN@Lz<~{4}Q=^i*2;WNL9v+5Gzna5c6{ zGFiN6R5zW{rmhoGD1}f_lTv+0voiaeWZ;kpMhtdaQmy$uOne|uk4ntM7JtAK-VL!T z%C;))S(q%$oDr-lYw!pgQCWj~B)*#j3dof58sipM?_XbYb#b8H>o3hy)Z5>TdweZC zEomiql81qGG8v5{KlBctt48;qUvHRKoR88WnHBJ5$<288(n+j za|*Gnf@DhN7DWF&6{Q(u7r9@ELU(VY#YJz|3ur4yK+TOQ1e(?t*&AOK7c-^PuT=C8 zV0n?mKwR79ARw#!+of<=@8_{^&0!mAoU!f56Ds~VT`P;(NssZD-DYZQ!3$?w1Op4S z+-z}q_d;O3Vy#p=kF#r%d${tJ3X`cxi}^IpK0FDzVO5)0!x}xTT%RiLRt;8KsAA^= sM%${Q?WgQbb++t03ixmJfd-p3)X%peLM*RVZ=N#%eJsF_=W{OmA2v9oUH||9 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/ab_icon_edit.png b/WordPressEditor/src/main/res/drawable-xhdpi/ab_icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..46d12a96d135f50c2a82fc64d1eeba95f290bad5 GIT binary patch literal 1439 zcmeAS@N?(olHy`uVBq!ia0vp^4j|0I1|(Ny7TyC=k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m{l@EB1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`f(~1RD^r68eAMwS&*t9 zlvO-#2=9ZF3nBND}m`vLFhHXsTY(OatnYqyQCInmZhe+73JqDfIV%MiQ6rPIL(9V zO~LIJBb<8mfsWA!MJ-ZP!-Rn82gHOYTp$OY^i%VI>AeV;u%FHqT*Sb@B84fc2+5QU1aZpQW)C)Lw!Xr~^ci-FY z_miwoc10}>y|=n{=bWprYV1~&V$Tal9@cMA%{cU-ddJz^ zvx31*YCQLESuOtRx#265KI6g#-L!o!4uSt_fq5dAOPL0oQz2hV&mYOc95db7}DL&wm}1z9G)IW=+G<1IIab zT-|G1&@^95VM%H2)fG#4>|GnmZym1KCSG}Q?NUDZUluZ3p0R&z*!dz~qW{K+ll`9= z<3BJaKmPIbcAfo!V3CD?Kdod+%5Sd!pnP`XIWhI+_io2uSys!($nM{sp^<33t=XB; z&b49tbF&ErTYFtu?OYvXwHt+MvV?ffUQ+z(Y*MpQrNU6SX7`r8GbhOIdm=PLh4E3R zQq8$(GlH46n)a(Y1fKs^%n>kU^ImNOGxy#W|5e#?)odE8ZtmN{FzG`vrvkV9Eao8n tKfPKt8Jc@uOtAOqV1PtgMByJU0|v2)%%|6Rd+CCTOix!omvv4FO#mwk0=57E literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_bold.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..255d97743526632067f9a1b3b057294ff8089b24 GIT binary patch literal 1217 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-HD>V5#q_WfA(cA1wehsWRU%1_G|*l9#1Z~FD5TjG*K zW)xRb|D*HUeg(K5nZKrsLoA+)mG@srNWeue6}60__ma=I^}bnGeg0k9`MdX|(-LnM zr#(Ak`T6ag&)c~b^c59YS{eidn4BCqI2dtpdTN;>)(P;->~uK#rIjQ9Mx6jhJ40r} z>F+yg*hRi5hQz$e`1vNy@L$s=UflyVjLMH{|GD*r`vu(1J^S(b&o|ANRxglYe>=Tn z8FS$A6WV{()4#7<@cZ*;`N)R%OiHs3Jbia=@!occtecNDtJ~i*ZI4m7G<#Ryx4i9d z%+~KVWWLZHqWt#%yCYNmKe^>zR4`$vG?hM6^Vs8Jp-_#1&6_oPyJ9(cwY)O2*J`d` zF(u-AtNHZQJyw&=?PS=QgWXNes;`aaTqwzLEL9>kv_dZC;G%gtg$Y*!7`}AtZA^RU zeXa7n^&h*Nr7By`xYl-s$KNj$zNBMc?|8!bGl#fPOm+4j9igYE*WGfexw)xR#6dr! zYi0Jb2NNsoG#;0!6){xqtI1+IaeSY9&f;D(v8fZ8Io8cf?wS8#UtoTuq;10y?Ts&& zJ}94jYumYU)6I7SSN^MrJA5vA@7q6_Oe-vv>vXoRPrB9q%*-ux#j!7q$3+$`UdR@^ zozLU!v*2TH_x4F_*N{2W>GFC~=*zk$y>>O`t&8)QvRm)s`cvF_Vyn&ePL3Plp`kl< z@48!_x;UG;IMDG=^TVU%>tg;`OtUS zYU}CUb$)04_*cz&dO=4?m2IshGyk<~EA!2cJYMhpB{bx-M|wiklCJIM(erICKCe1= zXPwt%_Bfu)GCzXLw#*5gT=8}8G4BFfg>#?2HQh9mEM4U4{FndR#vK1Pn*&{y4r113 zf7hH`u;;hKrQ{|{dWC@Zxb0UqyiSDp8P&1b>+pXcm98Dw%^%jQp8}( zQuDgzYD*KpF0a~N-&hq!r4>EN@n!-nLJcAKf4&(@xD37)gZ>%PIu z+*eM;LY`_b_n!S|yu;+*)G%HSzhSv!Q00-JN}Ub$bLZY|A;uMM$~c_=w13$vn?1W~PxRb5W{h0Qvm1Hds%rgNs1#=T{ylfw zf5v&=_qNzG3$|IV|Mm0B#q-*4obNIJYg@6-f91TAy5i4=7BWosj^W0cpHXu9AMXdc Xu~${^c&xQ;V*mnAS3j3^P6VA1w;aSW+o zd^_8*L&ROA?f>=7GgaNp4JED#h=+*uv^{xr_02g)jwS&Y{dqnjJ?$)uXW#5y9@BK% zN?=o$!jl)Sik2??LY7`$hE%af|BP)`Z{+xX^q+jgvM1ly zUAey`Zt^!#f!^d5|0ivkUwKmhfQ5<6^@A2|&jSu7ybPOD8C9jPdwk{Z)HtpW0$D#~ zf3L0%me)^WC}*_e>Uhq5g3E1He52*(3M2Usfp@m)&)A+^@<;i0-s3-KWg8rq*wy#x zpW7=XzQwn;j$zW99Sgm-nla67fB9>g*{`j4m#%(0&&*oLu+96EPPUe^c)ZKUciJl| z^PB#z{nT??L+q&9>VnBHV+DI!TVHPd#Au+k@8Q;R7txTD|3C1$t$x3tQFv3P%lX+G zl}^P3*IuEkE?F!U1;cjhu(ht1Zoq{gRhfy~OXYp|IPr)Bl$n1>UQvIO-gD z%H+vU%ifP&tDP9dvRbUfJd5^5^lb<`6@BdYrsf&JB8%3m&c7q`X>yUWz4nFq`((OG z)1)g3x@J7km{`Dix0T=7&M3p;2TzV`Yn@|xIH&yn+Qn1Nd?V|^5~2eyc~(q{nEreJ zd85+GqE&h89S%v|3^7aia_E$L^Qli(_Om_G1AlM2DdVXB_F(nWdh24--S_g=A2`0T z>Qilsc-|xHp4hi_I)4AP+|N6_{}B98=zGT-)0N&!)=ju=`mFC^>5N%Fd~)ok&hqS> zIpL_~47+SQ8-A1fyi;Fko#Za}*4yD67Ohy6<}z7h&mNZfdsOGUT-JZ)x!k_)lOUV- zbXCuP4wJGzi(5RKeqqO6-JOrm>D*$cZ*>1>9T0(Eb**__re%%0hDyEh@cPfw>^KvL8^T;Xz-vHY*wYql>h<$ut)`Sg>u z$&&>c72n;sf1}pSYdb^Os_qLJGE;q18Vx-Txh}r9$jCll>G;o=PkyZb_`LA^>&c?m z+3&~qTfLv8@~id6kD2>=w{A?Cz~69C`_}raRj+4AtvwnTw21S|rFPQYg zmM5)J$#^@1kgV&@5*^O;XtQE=g@+c?_;WV1s;!(~W5Yc8+_tTEr|gk_fB3?I8GqD% z{JL_>b9YdAxWdW!TtU7?t3R~Oxx~WGGxIR_g54XKma|@2vP6F}(@Xx7jP;Yg^+((& qma@Li_Md4XaT(D|A(iPr<6*bETaKQ$ISVX97(8A5T-G@yGywoFg9J7J literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_html.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_html.png new file mode 100644 index 0000000000000000000000000000000000000000..73f29b97d78f0ad49372b005fe83245b04d8a084 GIT binary patch literal 870 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqf`b4rt6+Ajv*CsZ*QE>zMLSz{=skVx%dtXf2|6^(g#OpuTVcYxoLT0{Xvm~ z&D$F%bf28POKhsIfzON``|__DsDBBF{ghVtugUSFiHoZXdzZor3xTOSf7!%FZQ9w~ zY!v;s?m^;{lfRY!UfSXv40I4C=uJ&f$l4rIaI>sbqv+qh9kI$&?36<+3NP~Zf7%$V zwe?cPJjywa+;cfQkqkI%<`Mm;Wj9Ff&F}AY!_Wxc^F4 zk8Ine8}oY)J}P_nd3V?S+AHsySLxQXi9OGdYyL)jU6{xz+k3O~D(6|Jo_-N9 znO&l0`L5K}AF?*-ytH3g+)%qEFJ0B-`hD-$-VfWRSAE*G_$Kq5r3>sX9<7@ZZuBGS zK11`qQ}eVc++LSo-cufOJoE2eU%3VLx!U`UZQs2268jtd@QU?;QyaO?AD_Ql-}v2+ zzIufNPk#!nWIIuPagOFH8}>Ga=@JU9}-!s!`<=*qN?+9$KJDmMlu1#Fm>e%N!Q?H#kB6eH*<9c)5;=4Pazl(eI*;FTN n&wB@vtw#?tVy3BC@mgQG1zi~L6}-Lv0wnF}>gTe~DWM4fQhJMA literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_html_highlighted.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_html_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..1dc4d75f24631fe31323bcac1ffc8272269a0bf6 GIT binary patch literal 824 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-D$|SkfJR9T^xl z_H+M9WCij$3p^r=85sBugD~Uq{1qucL5ULAh?3y^w370~qEv>0#LT=By}Z;C1rt33 zJ=4@yqf`b4rj?#9jv*CsZ*QFU7D<$0`>_7+rcE6u{6tGSgFal+T@`#`<$}o<;u8c* zUZ}BDXFi*o8}4ON@G@X}(-Iz=oE4wX_55W@?Bo+t6;u^*3 zS!W~v!|2>^Ahhm({Km@31q-;6u&(v>(W}#sa&KAjaovusKCI~h!9{`cTYtA+ijsMM zV_Usuep0vW@G(TP1O|@5yJ}&sb+(zg3XMd*MV&wu%XjfQ)-#kTG)bl-Py8-MYh{C5mKzr^RGX$W%C)YNhGMU zonVl*ajDv1>8?$l#D6`mY%uuOlIbWUxtSduRc2WmRj7&J$o}FGgv-zOFHb1 nblz(8+%$hm2PO#PnrJ_x{X>0)y3ib8!e;Pv^>bP0l+XkKl?{6M literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_italic.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_italic.png new file mode 100644 index 0000000000000000000000000000000000000000..cc784480f19425dc0e714c4f6dc76cc3d9f8f1d2 GIT binary patch literal 1008 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�ijp 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 FV1m(s52gSB literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_media.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_media.png new file mode 100644 index 0000000000000000000000000000000000000000..c0fa0b66a5e6185b39d0eec977de3a1e88c195f9 GIT binary patch literal 1103 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 N;OXk;vd$@?2>^W-lhptK literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_more_highlighted.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_more_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..575698bb7ca3a039667ab7cd2f648b896217e0cc GIT binary patch literal 377 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 z zP4+soLvU+k&8o?S>TcH1m~wDTog`R>9;CFr=c=T<8=_^L>R#qH*%&&+x``JB{oi^% z;sQgZnmX^yvvDH~(M_f2dj{XU71cLjv?k%Q1kO-+#n}2|`wBQ>IBPN@plI2L#qlaX zUB^MJV%0A~B5iM<^0XT5_FR(M*3IR<Jf7>_>5Y_*;WMm8z|E( zH!FJAp@)IG4p+UCgO_{yh8EhGrCmW*!f))VWRjF5|AAsvLpqrTd+cTfb%?Ri*WMGi zHuTKMqjzqgYC_9?aK4fuwN5`h_8BrhUmqtvYIC=vMSZHRC%vW{Me0{qqoyiP0g|6u z=Lk=CGbTaeh@+7|iT>!i^0J;BVq1jD_~!nLRJn{M)Z2EiC57u69U!HsO`*8UDXq}3 zno#!v^fo7xg3xpu;wz49DKPyCSf(q97c?sX$$0iHfjr}HaaRhPJDOnhfeF=#Fo8RP z8bSjftwH%-q;xDPvhJETejkfVRuS|q*Eh^W8H7~#4}wa{=+b|11~t4PV2Iu`3;4;B zTbn1C4g0&65keic2wL#>;^>dXVc^+KtejQ&)%vq|Kq4`6dc$L&R2rIpY8_j^o!Piz ze3{&TY>eIK#i5l4IJ)cS*vB4LWPK=6D7@S_momqVvx9=Sik`u#SvY)6b05&kzj1!Y zfTv-qrW3*}!Oldtgu(8+G2;r6g%o0P0h0oS7Bu!BUJcxqgdt-4E)up|%D?vi)~j&< zAKD3yPss^Nz=pnNJjD&(^zf|+HrYe>FsYG)oUJVo* z_4CQ46Hk?oSddn&7K!mLRAr}l;d`f5124{N&56NFiD9o#7SF8bXM#F=Z7kLN z*>j&K>>Erq^h5iqzD5a6TNz)H)6gphV5uBOvBR1BXEk zm`8`#p7!;{%gf;b8*>IuFVidONx@^tH^J=H(cyxdaItB2PW9+rkw}F9VCG2f07Tl@ z@|437w|(=BLziS9=KF$E;M`uJK^{XezKv3#3bugKw>0^Ubem&D6OvwWrRkH}?fbBa zQ;BU8c6eOh<`pm!BziSqX%M~neur^dxnNnZ%rh(RTF-)~01 zr-0_ehnQ+cEo<1=hd1L=_s?uwR~QlL*2!B}=xt$Uw^+wVJ|)9i;E`vLw$7V=gK@ok zHdgA#>4pKc^jqf6J=33WzdC8Q_{-RmM)MhOlAb9upN(jm`p<=fn)D=I?LVeFWy+~O z2Tr8qS-pmsUP&w5=X5ISF>-fK*8DHlGHs2ii0h=GPWJI6UeU z2>TjY*}hlyEcA_|>5mO%i;p{;nF`V#<5we-cm~gYgxUQ&dj5|T%O>p_s7P0jZH_DJ Q_$?@aKI)00BZII17dz{aH2?qr literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_quote_highlighted.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_quote_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..09d16fbb37bdf134803c73cb74742e7e3cbed26c GIT binary patch literal 1745 zcma*o`6CmI1IO_(Hpf^SJ(~<;t`K66JNFrnBRrm{xjmj|#Tw7!elqu!FWQVz%aJQh z&Q;FGm224JDAy!}a*QdI>goF*JU@KiuRr0F>FR7JCUQ;$004+N*jr!uuIv9N1p3}w z*umrP@I_p)vji~4QCk22DBHo>!Xuh*hvs`j(gyXSyL*XWuvTGENMN1s4h&)vs^}IP z7Yg}31IGWiDm*@aNDh;a!&}?;A9~x9Kpr_Ti3Bbb2~!yKWBvw^-**d?tVbqUW?Uf^ z;uhNX^?TU6OB~krE~;ZpnYFvO_w{Y_RLNYi;I_Z;FZ_jxN`C(ZRiV6I94?~b2)XPB zEcNH*m7Y-9B|C>|x6XY)J6R?K)Up??3YL(GCB}o8OHTy(MH{9qKTqZr8CNo*sVojE zXh3h=?1ZS0e&0f8-?O9gZ}v+$zlhHoK~25{!>HrS3f^Ov)+Okg_2`u3s*g;0>rO55 zCf0gD5<6zJF(rKl1vET#ublT%z|0%;K=+8C#kCZ}*K6iR5`qn;p}AWv;8;hTb@w#rFa4r4l~1 zmNd^vC-0JgG%lcg*&I>V!owRBGQoOntc`Pj{x&Ty%|uk#T^Puc`WAX3YGLBHy^>xb z+nM<(#;7^V?#)pPF`YoPI!=qYxxZ@*S|&^i1*6$NE8?jEgZ;7(!^i!Dev&!rST}6k zEUw9x8^4xTeT2?d7SSVDgWF`KN%!yCJtIvehZ}o1E<}qzCDz!+EG>Q%(wW9ZnvW=< zp9@fB2WazhM761ngHzC-bnk~?sBcBrM~ds6f{0EC$F29S!*EPjDR=F{7?8}n2yYl& z%UXrhg~jH7>ueG+>o%PE%CBB^Lg9n6#TD^gkS9pbV(=>}Zq#f$knCyH;uP02q=Yv# zDF7!ki2<2BdQC50X?xHqgl~kS(my)#E<@ZlR)5DuYvojea$@nm(d3rf4q~}aqbD*} zmWsW0wU97-J|PK}60K*y^OAkbiSgxCgE~Fv2ef~FlSjGPq$_4Qy-(&RunM;a>n^qS z8lzE}^Up+HvSH#uf=5P5lO`Ot5%`6;0+1w3n;L?cD#7b!SR_u1B;TS8X{r2WEFISUNj;~UwtivU@T=M|S&P*vG-n-}%o)#xEXLGusw*i$ zsX$U6W@ONIR;)P+5tS9jj;V{C6a27c_%<%nI0hIB>^~95Mod7AP+qt1Xq(|4&^+7o zeh(kfFV17}rDO+WD4qbYwxNM`mBT*rw;Pb*vM$1O{!r8zxXb2V#72Ng7lQ>$r z7TlAKqJOLZ%U#VzV(-fyGmNOx^;9@l-$8`Kv!K+zH*(q^E(Z)VuzrAXfPgp6*nL!w>a ztPavS%oW30Lr9Y2xE%S0F~0iJ&0AU*c|NJzj|F!KjZAZdgS>4YFQ?PI2>A4!tf9!> z|E8->(UvQ-A#Lw`{xVm_&5UF6kwe|V9&;%3tEA+@n$+VrDeea7>tAV!riUjs@EYx? zN)xZ7F@7iIT<(1vpPbmBO)14k*%12x%tGL}@Bpdk!$~iTpIj>wC1sUksuEec)A1A? z@A)<*tzWq9@n~k*#DS>b z>AYdbhw3zKZ5Vhnq?`lniQ%7oO?fWD3F#~2;OJJ`UNF?L2mVArgYUoa8U#C*gKJVj U=fmQ?zJC<%kSNlxC>iS&l1{K-@_=61OIbE6UuD zdhYExE;Yn)W)Nzc8YfulrKw$=_Xphb+z+46`@H|an}~O@laq!^0{|fBV2^X%C;s0Z zJh1-^#f|EHfI?mEtbrPix)1;)l^t+c0tF;y-u_v`=19znD3V=%6p6Id2j&xYr*T3@~r=qEfG-!a!AV|H&&y6#STXME027rlXCtepkoM|sz0jGk z(6Z&COG|gMe5GbAviSDGcALqaxz+rdB4SZjfHY*ZGW^)vT*4Lgr5TX4O#3|zshHY! zix3WfYY@R?rM@svDE0qdlGsk5PAz$Yx zC2Jq6kmJAOujvP;Z*QlncX~*2{PjP5*DiK0xz#p{F?ErlzxSp!H%szXW}?8E$u0H2 zANBF?h?th;K8lxgnxDgIb5+Z)4QwCQUzGSyK$^gvJY@ z5xdu1%c>%ETfNQ>n1Q}}M$^PjLi4{_o0~jEQw%>&PA>CYft7K`cm&@}1);D}n~9mz zBqcidq^7e?s@=505K&5=QzMoV$SF2%QIp269m#XAOx2?!;2f)plv#oniglk(F5?sY z8#lNh`G{{~H18xeyb)B>r1|WA?qV^yk63-ttCI^-&Z!X<8YS~mP?{X^!B zrguB?(TA}CP6%LCV1|^c6u#H#d33L4Ba0)|=3#NQn=6dVpraH2!nEFO);5sq9X{a) zzy2|>5cR=BZ%vCyc?(;+!K&LfN_ZpEpz)gv$Au5l=*&JyNHfYFYF9yD*@_%$wck=(*nXX|kj>)U1eNS36`Ma_hw@aq~? zR-+p^XIKi~Y?ZrG(~=sm9sHQzhX>?OXDV<KB)_+bPms*(qoAX6r z8wpFo18tJ8PgC&~EXr@edtFIS8r^7UqJqrsLt>@g4XibCWhfS`u8zUZ?UZbH7HySM zQSsyV!_*v!rH?~)4-D<4T~;H&`g%Y{950>=ANg8HD$V6MhUJ)*PD<*G5T%?m4;hMs zTUvgpJC#PhPymrnn^&F89ZcLz613qbqKZ?`h^xEtd%WCRwLeVIGX`VHajgGU9qm}i ZH%O^9$rsijYS_;u;9%o|tFiWp`v(gah4}yg literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_strikethrough_highlighted.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_strikethrough_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..241292d3e3bdf46591cd47dbb93a305eac169cd3 GIT binary patch literal 1267 zcmVPx(tw}^dRCodHnq6pIMHI*XXS4Ze#VUdHK~z#|MXU&ZAXsdZ75qR@(L(Tpwp3H2 z2qJzE>$@i1l!AG(YJKrV@>Hz&(T8L=)X+j-D+Ot5t@b5QY*!na-FuJc#%wm5JF}Z) z=ia-7GZ1#>oS8G{{4#Ur-kAY3DFG#*1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9 zfD%vwN?`31pr#6Ocwzv|pWA(+OW54I34P?*>%^-`#oJw--kA5*uEBTUeEyl*b>h`F z55S@P0}}c}^~2}4>eq>{M)Lq9ug>V3hr;|6h9LsYw`<^Xv3^m;H}4Y^8m0l{B& z5})~vYEg2f<^Xu5&?g8sgfK826IkDeC8_;hPXo`9e^0FrI-;A5baKwOd-8*#Pp z;u2{h#pD4FpV%tXcbg&lYv{Z=k4;^9nZ|{X-p89ESptIO0ixJ%jGOQi1|BY=Z|kh+ zkB90o_u}BhJt29_f@A@X{?;zfxZUQMgXiCTB2@BaS@2s*eiSAP@cQMQGJQK2Gnva1 zJhZj{upnR866F1bawW3|ho;t5it*=?1qk2#?#DER_qJVG!12zGX@E{Gl*<|BTTz^S zsa#CrH#vaW{1yqg#~3u>yO2D!Xi6_uvY+T;k{m#v`(@+6yqQ6*;b&e-UTI8;@d&b$ z51LdeQvz$BfO!fv68F$JH_|-vw)-D<8gp{bz{p9((}4nPkh2185TG_!0?86^x+2vK z<-m#Cz_WkIw{MHF9?`q_DD#<7w^TSh{;}BkWT|+rOgM+Z%of=Ki{)(~zGom8U$eps zBImUEOT$R1#a@@O86%TV7@I{PjAsNgr*I&5PCnhb%`wnf**v|!N_Tg`Jc6cs8C^NT zDHeOUv#L$GKy*|_^9$u-l)v!+%;ukj=lvXIAl0_1g!cAs+0pr{TJF9S&lL78+g9%5 znYYMk6mOV!x*hi!J;0G)Hj2;BJNCQ2IYvLm*t}rXZ@ugq(E}_M_sFxab=e-ds>pmh zF65qdWzJ?NZBw|D`}V0ssZY_-G1^dHGuOY6_Rkq@@Z6cnQKQb0Fxo{VJKiIw8##-w zKH6Hk@qW)Gi+*|H?8MXX_(x;q;9Zc@cVYkb^G3Y`VYE}&qkVQC>3GBN0^=X{21lM3 zjr{~W-sBA!b&iD50X#GnoVM+>`^jI~bt}*i`SR6ax5c~{V`th{U~xrNqXRg5W0!nh zbeO%NX>@J~9~_x0*OyZ3*9eY6jfuPP`*e+eq_NSmh0y^FUL$OY=$pA)2R8jm<%5r1 zmSfNGC8V+)FSU=H$haSW+o ze0$qI<4S-G`-ksww=VG|#ct_dv0`!agGJ4gwgm`?pAWiq`wq*&i}wcaLDd$yN(YbTv|!aXH`ZpLFAX z*fSCKnB&oLs|7Ev?3Fe4n%eexZ@Bri^vY5rs5sHs>l=H-%PyY-kq{ZLHy?x`RSAUz1G(LXFC3$;Zqg6=Bu97lfM=H3+=4$ zi!v6v`S{wYm)u>K3b{<3y%Uzs+`0G5-}cv&k6(^VON^hsF0SNmekOCq zHrq~yzUlE_KVLn)w_cs|%c8tYNgbX!mDh6?Uk-_vDOmI8*N&jC+q+gg)N5b9+3sD@ znT@BJ-(4427_xHin(ME5i`x@psv^&Pzc=yB%?l^fCTD;BEO!4`?yTwhtN80a{_)<^ zf3m>7^!)3`UoRH?w%2iGJgP42@v^P@fd<$AHETbrs+f4(s zb9-;UT4uQI<<3*dRmH}){{l28zCJMbOGL2DhM>rd$Lz0*Kk{FzUZ+yBA>T8q@W98S(ktq_1aC{f z-Enl`{(SX6b+UfFN9y7&0?vFd@mMCZU;NwDQ#Ykw%za*=`={@``T0LVG1WWfZe98( zhv#CVG?VQfcK|o%sKzHX4^)CLf;oeKE7aal^~=(&wcM>St{Jp&_Gk*R#Hu<5xF7{sb&= d;~mp}h6mRfgy(Zjx(Li_44$rjF6*2UngHmDu4(`P literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_ul_highlighted.png b/WordPressEditor/src/main/res/drawable-xhdpi/format_bar_button_ul_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..f303ce361c3a4b1ea38c881f1354220910d4114b GIT binary patch literal 858 zcmeAS@N?(olHy`uVBq!ia0vp^0U*r51|<6gKdl8)jKx9jP7LeL$-HD>U>5OoaSW+o ze0$qI<4S-G`-k`X=}Tp~N>@%^(XqJs!J=l>SeC+#Wd)_eEbi6qQ@gm_bLYlrb>;Cr zl8<3w-zj{{b(g2LMpyB4r?(21?wv0$7tnt;iTS?uQHp@ z4<50;Wn`|Ld)KFSvg~*5ta^SMtEi*jw{pMRSEl8tSl~Q!gPb=12NuTv^bc)BK{VbCc|> z&Q694;v%wzl#9b4@%@#z^a&P|VJvWx5A z_#1cC-_~@;Q>%&3YISGszT2sDZHF#Xs4z`iGLe@xY(W^Q0+VeoYIb6Mw<&;$Tg CfQs_~ literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_admin_links.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_admin_links.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_admin_links.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_admin_links.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_admin_links_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_admin_links_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_bold.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_bold.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_bold.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_bold.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_bold_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_bold_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_insertmore.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_insertmore.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_insertmore_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_insertmore_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_italic.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_italic.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_italic.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_italic.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_italic_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_italic_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_strikethrough.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_strikethrough.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_strikethrough_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_strikethrough_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_underline.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_underline.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_underline.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_underline.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_underline_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_editor_underline_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_format_image_big_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_format_image_big_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_format_quote.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_format_quote.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_format_quote.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_format_quote.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_format_quote_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.png rename to WordPressEditor/src/main/res/drawable-xhdpi/legacy_dashicon_format_quote_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/legacy_icon_mediagallery_placeholder.png b/WordPressEditor/src/main/res/drawable-xhdpi/legacy_icon_mediagallery_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..f3fe14ad3cf79c36ef0dc1b81d43b024367b672d GIT binary patch literal 2774 zcmaJ?dt6d?8$ZoW%~{!MV&x2JX=Z?EijZguDrA@!OxwyNI2I!~3@{Ni&FrF;+SJU{ zG{gI{%T`UNR$AHYO$%#nnowTDrkLW5#NMN;wm;t9^Eu~t`+T48b3MN&Il$j{fyr_c z000)ysFWahu7kg;#)j}{k~Fgeo|cKd!^FW*q&S)>1OZPrv8G6M zpB|8Rzw)izF_^kME#{H`(v8kBkM>)28?9b7^w^;P%k9Gk>UrvuR_RL1$|5x3x><&n zA=@Yg=vG&>6L~w!BF^0@RTw-ngh8atnLs?iRcONgxYbxxoVPoy`=_D}E9U;$xdCaS zQ|7hznD)AY$f!ecf59guZ#@}VXTMv-+9khtCjG3fWdc4#nW^3U^3Y3psp4R$BG+Qw zwQql3)nat~=8i}80*ila0Dzk-Du(VgC(aiwT<~dv>B*^Irgn9Tpj1M*8BkCmzqnjr z)14(sMSQxk_m4LBtpy^bTJqhNufvU)%&#d)cmn8=4Gc2B+8k1xQ-OnBP3hc9M zr!G=Pv@ez)DJxo_Ad9oYiF9Fy!Zt71B2d@F1LcZ?7hgwm)uC`Sr1B$xycLz{{^U)5 z`AYi$?3dBU&nM%z9fSN0(!)>bGy6qW=Ddqts@_dIPklFCy61ZBysiscYby2$tLjkv z5Wir$gK@pBNFVa^jn@v!O;F;9`RHkuwz%d-dHG*-=;2duS>VqeUyhm-)ufLRp5D)$ z8Z>XXxT>;n=kr~XEO&~!cS&zhsIK19&b+KpAw$;nOvD}R$Q_%$4aisK{RtFUI^}6? z+9|gB+W|lR*<*%nEF0m;CwOZbW)f^yH$HHc@08la^{KBV;~BaOzmYokJvBzO52T&n zs=LhhKe1Zh(8h}<9M0C&c2+`U+cNE8`#NX|ZOE{F2+@02lJ|MsISgr&N4dbJ-!)53 zPx0_6&Q^_$0v&Zx8%?We`!0=-Rhjgs;uI4-(u6RUY&b`pbM|rVOp2ttN}KHXW_w0| z(NVkCy35}WV*LMtw_(U{v_NbuheWLE>RmfS=ifp-A!-< zF_>Y1sN&t#PoCA}4_sk1Yvy-7{pQ(&V>kQ9$F{~743@eSl<^x^Hpj+ypVKCD71*yj ztFJwKRZ&-Y=k$Qyf2{Q8`TDTBHpmQ7W3%Y-KJuAXt@8;;KT(pxRQ63D3Rgc}eA#25 z&oQoOQ;tSuAKy1MWU=n>1^0Y%i`G5JKY=Ez=Y%ier7IDX-;)mvTH3|yG{N#TL{8a= z;`w-sY2AS`E%ogUJr2hKEB@1Z2Yo)M>lTh8O-stQ#nisq7U+cTH;b-}yEoy#2@0D2 z+Tn$*P7_-5O~)^SF_OymoL_;V&9v_O%%?Ri#iY>g&9y8R@!09Dt~a6Rs2+jifS8s37a7Xz&N=xd6m z+O@RM7k+Y;zQ}7xm|BV6et)86s}3$`$UgSB`zIUpyV!=`K2HN45yw4Ih; z4^&4lR#wM)=**H%%Mp)Ms9MpKyQefM4Xp}RFLtkq-BN7Z=$ox6*BThNCN>TA$?Qq^ zit|g|qqa4-8S;n4>1EwT25EWA|9vIF>q`m8i(NzanHvjEa>0F{)cV~USaaMpWNr4m z-6QKe=QnlPV^hYt30;0n*&VgMx$e05TY+VLus?A=hdQ#X!Q+LeJpQ?>8xxCs?LE1y zbgBB+qngn#3Pnj5)9}=t*qN--uGWyzD`y!}A@0NS&tpALr#wMw} zbf#)q^4nWo8VB!5|DIe0R(s6U?Ul{UhJ^?5nW-LAM@!nt!*F-7ma5g2N7Ad|UXf)5 z_lkK9FJ!F`O0=eK2cM5lm%u&6*u9-W+p=gO#g>$1brcUA*nSU1qO6{-uxsnLv^92a z4W(_ldZcjF4Q8lct2Ho#fOM;y+t^_b;9Gd$*dIjoGKt|WpIoB4d^|x5oNHPkKeEQ2 z6gT#KLlz0okRGjS#)n7^&w2`CW(Y9GY)A2IUjgJs0))Cch9WI&=FTjM06uRl8FA*6 QM9t=h=Iu|Z@`_0OFKX`GYybcN literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xhdpi/media_movieclip.png b/WordPressEditor/src/main/res/drawable-xhdpi/media_movieclip.png new file mode 100644 index 0000000000000000000000000000000000000000..d1dfae9ea3f6cdeff9b41e13c65c3d7be4925a2d GIT binary patch literal 4292 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 Y0qAJy+KkBSZcP9>nuZ#65c}8v1AH>}TmS$7 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/ab_icon_edit.png b/WordPressEditor/src/main/res/drawable-xxhdpi/ab_icon_edit.png new file mode 100644 index 0000000000000000000000000000000000000000..8c5d06a797da637d59ae18111edeb2c5e27d246d GIT binary patch literal 1713 zcmaJ?2~ZPf6y6OHb^mWt=PAhlv{5@02ggbj)i(b5|af2CL5E51QE?(#R6)z zwIgV)c4(`Js8g*+i@=1^mUgJr@fuMmPDLFKQ$d5A-5_8)Q@XRe|NGy(?|bk4@7vj; z_%$o1Gv+V=0GJ-L3QMF`mFt1rsrSQDOBl8IlQIRFM5K`xwFw6#T4FN}$LQ7Rcp|RW z=5B4oBLKiHP?xMA74kS#L+Dv*R}9OlH&SQ-h={Zr)tW4vgg4{qI)ey#_I)h^>$D8?H-KuRSJZamSWX-lLO}G|`TmeT|QHns1lWN$i-(oPMRuMABi&D1B%|_s{ z5Hd@Iye>*1kB6fO6AlYle5QuO<-$TCiyI;k3c1T*9*4_gbEsR$WgNfzrE)61D+fpGSQ!0Wp{)*?O<*er@Kggjwzm zf8V(>2n?1q^Dar39!F$oQjv-t{KEgnY1NsFo;Bjt4Z;<+eW|HBda$6RGjwZl(|55w z*UULRuX^W)#X*f-UCx%Wyl2|bZW7fiUYuSGfKVL*fC@SclmK*&#rxIFrh&iIzb%35&O1B; zd{ox{T|N*za|f3O{%L1RVe$L@wZ9(@^tHQbKN$5Ko}KSD9LHD`A~y7g-7X(-Ui#9< zPCHZ>**l0pi@?G{c9D;_cSTGxo3DS9K5oxDYoyCdH>V711kpZ28wSwQUJ`m78Un7Drr_|;ox#% zZm>PJKZy7-m(e!QcG)2ZtzKgN8eKPfB{z3vM~GrrR4X99s-|JX!9ieDy8RDj01oObEHPv7lK|-F1`J zZ>!;HKR<3$Jv?&G7uFrj_AV#`*EOK3uY)Suoh4U#y0@?GNL#sSe(urkz0;bneH_YL zccaAT(&Lk-7St;r&34e%4#+zys>$Nh;oGZrIad3G)I1lseTbZB%c}0m@Hl{#2A-K4 zUE8q%IDo~6{*igKkX89$WaiVW7s~US+Os|@EMC;-*0cYy+=G^ik)DjyD1dez5(9q!R_o$hO3)p!?H(DPaX!)P`iaEI)?jC) Hs)D}(fCYyo literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_bold.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_bold.png new file mode 100644 index 0000000000000000000000000000000000000000..435049aee0eef449ff6be61232a0dc7af6897ba3 GIT binary patch literal 1842 zcmb_d`7;{`1C6e#4Ze=lDuN(VN1d&!rGg?M1gSdeY|)}rh})o~;wb70x`|TPy3Z;> zs;XUgvd*~UCL6U_RRsO){tY|xj(Ich$2aqmt1{=M*O zeEQBFPV01s)_}9qoV1nTM=$Z`MJkjY+P*NVH~I7wU7jIYD1g7|uqrx?ZlyK(aNc8& zAfl_k`@c`sh4!G6*w2=;I(>AmwX+WpdEn4UQL9TlPmG1GA}PqWJ%?!AJ7>+$+!Fkg z*tmd+vbv06%fgU_3PIrtAs+T}UeMW8QHPVZlKdThTD%@(kOX#mrJrx&O}p!k&F$-b zKtZOLcjFq^o;2k}wIxOkZRn;5AOUKRmq|dF$;#rDUrxEY1C=Au;npxFiR%ggb zgrgxOM>c@}z<^;(q?Q2p@HE;q^@$fHBS=^Kjrc^{i*yfRMr-gw4;wDKXW_h_*4>UR z3?#o4$Mtb$Tj0l8*m<7$XsjCpldeAFKHj}$?eFCX4P$+s(9B2eUYO5!W`E-PzytTJB!22NC8g{0D)S%MY!H6U?VgkQ!MOU&6U4*uTN=6e zAPp^3&HOjJ`3zdx*Oj~BT#j&&COb|Kv2*zL=#h@Y*Wn*>VK}}n#^@y}LU-V1)~c|? znX_B0J!c9UeOuko`=Q#s`T(EUc(4WCSJYrXGgn`#(XK?M2-o>IG5UMFB_(TCxvJw#PV}ysgqly10tY{Q-)W|79p2bx|uB#7c=!`Lex;PT^c4Tw*jdI;s^h zT5W5Nbtf7v2I$Mn7Pn6aHN zz^Zr$#eVBIilW_1Z;qVdPe(veyQFSdYm0_w{erOT>8nRcf;Vy&HMFpI?tC0`nQ>NDW$-D&6Ad=BM7HoZJ3fq#?SP*G+;5Noxs zJ@QxN0A+-EsxflvpI}F)#T1mx1UpZlnsBl9E)+Gvr2s6u-uk}+IIgp<K_Tm1o4(?@8MADz-zEd|+dIPr1s=lpru{%z z#Pj0LN<1Yd=S03F7!g_B;xUp`+F>%}(z{aD<9E31r?-f&t)A{YKx#EoQu>=gH3VgS zI)lWXeZTQJ8R=&A<8Qs64=uN;N|@Om7!kFv_*<%$0}EV_8yU0Y%ncArG6z~Z{0AS% zCGmvN3Ik#{SGbNj$3C+=?QfPmsmk%rn7B4*+O z=T2SrH&dUsJy)hmD(aJaA#A1ITIQ%s^}0t^Z1DcNoG2%*`%2B*u`5lZPv*!mxQ6p> zfnsAEB#{H=UFJ<1RH><2HJxO57-AtKhZuSvcq8%{$d7*iYIAb6CYY_4Fupl0pf

2Y%>M#G}9Twkd{+!8B9|Q~v2kW2tzSb3siVQZk`x|hWW&B|;3lSmY zV$Y2y##tI}e&b_kBACb)zL;HYx{h>=KWKQ3AQXn~TWic5Q3%0c`P!Q!Pk%DCx(oN?dd{Tw%tkTEC@2 z?R!ZBf!6UYtPvBf!~S2>Xn)PT<>D^lW*a~tU}Z&L#bL?BwJzBlcX(Q`PqFKnl@eHn zxRyB9Z!t>%)hzSc;8-(a^aVMXjAi&H7ZCq#M9{+zHQCVyN literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_bold_highlighted.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_bold_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..db0116bcfcc3afdac41cd466d841f2662ca1654d GIT binary patch literal 1705 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 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_html_highlighted.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_html_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..db0c60415725d34db23480d668be7f7a41dab2c9 GIT binary patch literal 1341 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 CccWGS literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_link.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_link.png new file mode 100644 index 0000000000000000000000000000000000000000..f08f26ddd165b54d0810b2083874ce0895d1c311 GIT binary patch literal 2707 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 J*KXsV@h>kl23i0B literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_link_highlighted.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_link_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..2accfc4d4067bae3af376d59c3eaaccf94eeff9f GIT binary patch literal 2483 zcmb`J`#%#31IF2s+w08CEyXIL9$P^>yZfCW|BtztqI=w%=|G@d-dA^_Lm*?~R_~cx6v6B!}5EBp(kZ`cKcKyku z|4HQdPd5zFpZE#EI9EGMfu^^oRs{q^qa3U)+>->?%WwQ8Z6iIjj1RgcDG1K#JC=~Y znLC21f=c%FiMtb2{lPifMdvO0o|5Upm-d6gPAk}$NafqQn?2pc22Vv5(CjVGCaI`v z!*U6>m%V1MF(1K}*B;M43hM3-3&V8Ray@kBr%+QKi@j;Ryn0@}uK?Q8Ttr0h%;{rU z>5`Iwe=nE^gDHdEsKQ%#ebpE+{DP)ermpM;}v zBd|dL?w9vE=1C6*%CKqP8$*qf{dQIBI#y74>1A+f7kn9`9wJKEj*^*(p9-WBj%o#AUG9SKwZcHrm+;26M)h1dXwfI$bgxUx#K@*K0-}o@7 zLAa|7yLxG=sjVZiq63MYFEP^}0G z+F|KznB(_`La(#!QG;>rMxQjnI`Q^>Q&z^L9UDKE``1~O&k~qwnQXeKvigB3aSZ5- zq^61&bWkpk?Ga6u==A}-)LK+?exo`DO=)ru6aHaLP3U0I%Ygs!Ni=We8T z+~|Ffx{Y+(SWC-X>P2(o>flC{+sWXLz^dH*Ofvm9l#uZ5CxC97MC&Zb;;8ekZIFo& z(r1h3`N>4#;9#k?;6Yn^EkC_S02Qw#AAGZ4zHKf0^H95Xi8ac3^sZ7gaqkKJhuPU*_t@uObth-)?1C77>?zQ>F(8#k9R~r_^pU?P> z>%V`g%&Ps%`21UXe2V?TH~WS4nKAI zCj09oUrEUtD&}>7lFoH{lE>PlIVKd3rJ?IyWaRD(#dx*0Ai9v~`Qq;d)0%F0zF3(K zR+7(MMPbL6ii@szD>?g?<>9D=Q1Vn4IR%b8j_GThPP|L=;E6JSFCTa_h4q@; z_g7+Bu~h@KhT#DA)=^gTBlkM;Le4$Xaq2!CmIm}pg6HGnp^ZNLFYlt&kN_|B&rXB( zdlHHFb`V?XEw1!M=ius_1hJ_^P_mFLjqc`;&vS}GdS7`y>a}lN<^@56m+uS=i&J4R zWl=lbx_)v7&oCOu+`Hr2T~5D6{Uylq?UN&86S_@R$HiBUB&jx)a}WBd~1m`CU0(ikQ|-)<{OVVWoIOFTX9FupO2&{gF7 zU9fA`iWt?aJptezBP5n!b&MQ}G)N~fV5ZCIYtIN@9P?{5wO~xF&w^_zGZB~2BeAPE z3TdnV6(-Io^LE5`jwm#zc*}niWpB>DOHB%KJKvV3_y+Q7Gv-}(a)uVcdFN?`+MmED z1vp?{-T^j2&GZ7PGGik%{+94SD_1b|tHsrcU%XR%|8DW@K+4KV=hsrrQ1^FE$s)l= zGc}N)3x`jXO(M*q<22e4hjZF*V}N1nh_6!6y@!C#6v zO80Hichqq(gWHR0A&qrLv9g_V(;ss=J@1lTVysay0ATy|M@q(tdHOvI=4xm|#p;ij ztx-jQHPw(E>Y`h{*Cr!}PL1{ZjqtN#2hwWmncs;gdxECqD~M1BxiZRusLz`sKgo8T zm1uS>Pb{ErNJ+gpFau)H8Q!p+fV)699Jk7rLmQrm^yQo(b>~Y}Q%o`8xt@f$Pj1td zJRfArP)SYccV4)HLK($A!kV`j;#;3RU9CQuEZ2Fr`y#jG5oXZ_=krl@3aiQuHpHud2qQr zal#Ji4uY;Zp)g%T8EbhTH8{-bSLxt@jq!Cn8XPM^7@z^MnKJihn3H@ydrgjOHdQUr8 z>&LwL2GY;_kCWewXI@Dyc^*PTVqQ}~2;hqt?-nhAygoW>dvtFES^Ll>GmkFPf30ty z;Ol%|sf`GGed*bba-v(@Dj4V3dgWyEZ9u<9ix!}8k^Q%67x=VReA3yes`WHoJ12c} ykZDah#WYy3DKt2sDe}(0dq)1>CaHP*hhTJ@$aSK$_4>~jCg5P>V%=mJnDGxiTZz*E literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_media.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_media.png new file mode 100644 index 0000000000000000000000000000000000000000..3be85757cf71dafc9fd4addeab70f62d9d7d183c GIT binary patch literal 1678 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 C62{>G literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_more.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_more.png new file mode 100644 index 0000000000000000000000000000000000000000..34e74b09deb1905cd18a106f6a2c6ad8780e9fea GIT binary patch literal 588 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL`2bFtK^MIEGX( zzP)qN_izA@!^H*(R<%aegvovvJR4LKgxWYy)z7=~!*Z3btex_kUC;k5Xo?VvXWywRzbU$usN4aelpfU9?XcIt=V{cNtdiv z!I`yZryR%)I?5+%@$6cf*8{VaN$p%R#o5NH1+zmoI`0rLn;{G z-Z|*&lqk>|XfSP2Yesm8gX*@0tr0vD*WUX-u+l%Ha{OtxG0*ec5+-td`#1y?92yuH znOMkYENDHj@u=wY_uk#stNJZ!?e2bG`pfp_b#I3Uaki({3+|Y+<+@X2^;eDkZV!qs z#c{K~ySn&~RO4ySYF&{X;r*YoS@hK3ZVkYx_^>IO+YZ>X%=?!vtdie9dRwJazi^gpA}RS?72L$D^@$x8P*ox-PrAs~MqhBV#vz|9ACul^$2qHP)az$N!W&w=J7)#Y4sR`AXetO(FqE<|w*G#p51)LwaAWaZJ@wJyL! O!QkoY=d#Wzp$Py!d)55_ literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ol.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ol.png new file mode 100644 index 0000000000000000000000000000000000000000..074aa098be6b5a9ffdc4a18325eefd0216680bf7 GIT binary patch literal 1971 zcmb`I`#TegAIE1+hK82rG?(Kp);(I}>tNO*RIa(Ksf4AmtkCckV#>+&xMUYPM7c~! zn`5qp7^6*@JC$3EEi#3}(es=?;XKdl^LhXJ`8==B^L*}~cg8>z;0gc$0Ahc}&Sg6z ze-?P>b~pDwA=nNXk_*Nb!0gfZ0szPn?CosaB4rln!8cUhRo{vq4YF#k0I0S{9a@tn z5L^nk>*DMVv!gB6_QSIFfFk{9?Yq|Or*`0CZ2D5-FAp;gw>Mf}X}z~!1Or-uck_ev zxq7Gfn85X5-Ym{>;qd`ZcTUb|WlBWQR+j0i`OBHj&A(QA8b|>qASD%m%zs0z0cbYI z_jbA(AxJ64@Coe;&DoF#amy9|I{Ad?eOTrVLO-7OxXr=0YQR)gB)QkT!h3wj$^zaRd&A5J34ZwUz5zG8y#2ZSN z7&W28GzBF!qiD@4p$rza!to|gw+_1J6U7l5`V>3EQi~+;M0*Z!Q7ET8$5(PBV#yiu zHw%@4qSyZ117MnQrdC60;Pk{Z*;`V7Oh2gY{{DI8y%;c18}Kh|b(!ApHZL#+3nP0P zhaYrCXW)q8qkU=EzefGY{7VZ!WQ`_OyP~6f*UTN5xu=aTbVhbxmCz%%5o0GBO}Kgl zRHIN&5NFtjo08+P0T_tCWy)~t;-QqCCYVj0e9-Xh#Mt$V`~fR=?MSe)BDC_rb;>d7 z{J~qaPww!`WKfNKeS?{0V$3tG3)7i42;k-efkiC(;StRLh=k%(guPEqQ3Rk* zJohsTie*+Fit>4~!@Vsxa&xpuU@7xk*(Y$HULm1efHd54n%f}##;H#Y6b|}ovw<7YK>tEqx-{Ao_U9qs5GZ_*i2C+j7SS=}>?S*s;N!0Gb9!FOjz@#s5}iKOYmjL|2iY5L6xCb#!X`{Lubv)U77$*(_S2!e z-;7{l4`%9 zYzjmq^t7lbB;^i*bng`J6fPGkI8$tAJ?>#ZW!Kl9>nI@2t zpD=GyU@1g&xhqAyM{0(V7Zi-rI4c7|6^Lej>r|F&@>Of#*j!6Y_vFL0bE94-__re9 zUnfB|D-&zel4DwNVmFoHQ9uCWUbaqKesg(hTyV{sxUE29|jU^k!TvQ%y+a%rKJnHQC7#P1`#F1&E zIw7}Pp5tRoM|LCdoX)U*4m#i?6t;L!i%dV*wW$nkO4r#?VaHl_hP_(xV_)tu+=(V% zn$#g5>+R_2ziO1y6ZKvy6!BlEYiWjfCno^FcmFGzD~%+|g6P47&FlJe+g})9k9M|W I+WN)+1LksxO#lD@ literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ol_highlighted.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ol_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..93fc1eacf34251b042d1d2661ebf5834b3fe6ff7 GIT binary patch literal 1847 zcmb_d`8OMg8jVO5Q^r9|T1t zwS}5e>zJ{N)>83Mu{^1r@y>Z?{(<+-x!-s15BJ<3z8~(F;()Lc;FsnH0008kaG292 zNB(Dcc`i5fhdX~<5*N|Q>H&ZEU#zj~Hu3p^-o7Z5 z?F@MJ>c2HG5!BQh+Nj?rK>9X23Dq@50XL-vzxYu+6<-W!WeO$2c$|7i)hVywzK&w6 z-#9uv235GV>lz*GGxLj#h&WGQ+$#=q;Y@y}a}B!2G#WcPgB~!SvWYl=lE@9N{|_X^ zf&P!uTsO?z<`AYnc>f5j2CRAsUX#2W`y-GXWD4`H#RSK!ObkTy$pe#pUY2m?A@Wrh z(L&lAPMaV6``W{~qsw@|G_3dD%G-;fK}nGD90h!BAvs8dG&Bv7`(Vyss<^H+wa`@J z&XcfPJCT-U>Y(AD7E@1bEOZ3NAi~vv+COVCBh~wu z?g1Y3j3H&yL+#Y~Ow%b@$kUOVTSh$Lx0MNg=cPJ~=}3u@k)HSMCU;~?7-bk7za7a6 zN^<;YOq6)M3UsS698U-u3ZspO7iMbhkdt&324l+X^FlbuL;@Xtyl)^jQ`P(PkOn_S zGt0y{EsnLApYn}?TX6f3HTrysmH*w}XC?_-GVTXEAnc~jk!?3-b@}olx!mM8WWHCA zS*Jvi+zdYtLeE7?iZdDQ{<&FBxq!{f%Mk#!w<$MBuiuiMw}=9HG;B zDmrD1|26bbPkTvD_%UL<(>fq+@!Cs;HWmmmm+l*bb{W^Zu%8wjIkdIhJE7F?mK5MB zZvk0kRqoaX^Rpk{4UdI1gBbhT-$sp#`_- zJKm}(@fRTckMn|0g2JDcO*lq9Jgg4TMT&97@i9f_Rod+LsHFw5eTN(Rl;7;eLBk_G zM-*yb_|U)tTU?FP+>t>AfN>WrvJO&@D=u}B5SnX+SyWK1iw-QfFdsKw7L)_BtO$xz z*XCo#IW|jR)D>|r&C4oeLsXj7U)w_3kAul5JRbC4FoHnC3s-S) zgQYi_Gq-heKR|kuu|`rhnq4jTl%4(hX}c#)QS9z~7E|1cQOBrP4uVA-^otbe<4oI% zX4HRb6{)=rZWK`CQS@S)%mk}^ycz6rv~2Ut86P5ds&@9>*TU){4c}Nl&@i7&n&Bt( zY~Bj%z#->PY&pWT#Q#N~pDb~+khcEADR$b|ci_@>&0UKaczd(PHTm}rE#%iJE6sPk z)IfLDyJ};VP!Ny>!sD5wIqGowe zxQGw~W|wnp^O7LlzYFc$qExC$le9&T_9h=vCOCTlg*MTngZK2X;RACssFhfov z_|NsM(_^U}vxc0HGtr6t&TqHflF(?+Qsv$9Dp`TtczTs}=8SYoib>u|N*$_3N%&Os zXfMZAYN4PUk4D6ZID08kCw~bW%2R<~hK_1D*zUXU5~9qskOC;U94ykMEs464hsUxN zhUlN_3*NX|Zh>!48`_e&6*<`xT2(aeMHPoYJZR03rS4r_yjJe_3WNIaN7-8i3C~e! uj)bI3Scb4Hy)jSu@9z5F1!+lnN51(UF2n2N9nR$^1Xx=jV3Y@5&;J4^IZAl| literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_quote.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_quote.png new file mode 100644 index 0000000000000000000000000000000000000000..3f34d51000c603313c190fafe1666cd9b68f204d GIT binary patch literal 2951 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 p5t2Ug`ia^9NiF|tt%|HCU`P@C`L^B9oXB literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_quote_highlighted.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_quote_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..3607441c13319d9fe98d7d22c509c41ec29719ec GIT binary patch literal 2698 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 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_strikethrough.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_strikethrough.png new file mode 100644 index 0000000000000000000000000000000000000000..263f3028796dee2aa702f890d29f2bcb73cc3d58 GIT binary patch literal 2095 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 Q_+9}BGZehs#Pg4T03FbKVE_OC literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ul.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ul.png new file mode 100644 index 0000000000000000000000000000000000000000..ed54395d82957ddcaf9a244aaf8e772dee28954b GIT binary patch literal 1452 zcmb`HYd8}M7{^CDZV%0+;)zhQ`f$&Q}$wQuKqc;Dau^ZS4Q{~T|qvy#Go1pok`8ncq0X5BLr@4z<;jNh$wjJmbt9S;NGrrlE5Ovq=3_w~r9RSn?NXh+2 zIS?cr1j5^br;_fd3UsHThhh&;88&`WS)sCJldtLwojZVoAE2uR-Hc9ACkggE?tG2v zOn%mi{2C6kwb>4->nU364{S<_iAae)GI>I8I8G%GQ6kbtNOoN!dDqId=M`n@7(AsPyIFQQGZjgm^6U<7|jN*mg-oT!5_k+dst9`C#h%hwgbDi;q*x16%^=~UJekYk<7fcc^bpF)E+rK=}pX+ELzlW zTCt2o>)3W-uR&iQ2JsS&aX-x0T#I;jYSFLyM@9Iq)u%U4MSKrUV8cj;8lHxsPk5~D zmG2bG@nX41Q@=kM{L8yCx8iX3Y2*m0W*|t%YE0Y1OH!V^B>GZ!vEVq)I=`*z)nGlC$k>NGZaev`chReG%mt$7{#7(6ZnDJc(JzZlmd{YN`07AK zhU`ZtoZf79*g48aSWwX*f|Mm+L&1JJx=ytueYjFq18VU|9ONI9Nsq*&T_1aU-U~5r zH)-WHn5}70{5grqz6FzIrglRF4h;bqm}|%gkpR6IY41^qSZ}>Rl6&p=R$yib#|&j* zoyph63pH(u#j>i{+f^p5$x5lB;a)lghuG`1t!5TCTihu1#3))Hz6vkn#WWjvS!B*#xF@#laZY7g+wiSDeFO1dhQu>o7NaO-AGIL*N;k*2E8Ew*Ep&qeGf!>kZx;I##?|Zdx3HY#X8&260x(5?P~;gpoZRBKp<}cIp@43V}K{IfP>V0p7itX8-^I literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ul_highlighted.png b/WordPressEditor/src/main/res/drawable-xxhdpi/format_bar_button_ul_highlighted.png new file mode 100755 index 0000000000000000000000000000000000000000..11ba3cf4c2404f929d6b6786e454d47a0374cfde GIT binary patch literal 1354 zcmeAS@N?(olHy`uVBq!ia0vp^6(G#P1|%(0%q{^b#^NA%Cx&(BWL`2bu(Ei%IEGX( zzP;<8A(JX`{NsJ=PBp=xsab!jSKWK%sFK9$TmJPLSCf*`i<3@{8o64tdIK)Xl_alO z(V-Ah{XwHDSbtXRmbFcf?u+Rko$a(>>y0eslWFnyJD2zxU$)Ty`8lU-Kl91FdzJTQ zrrVuAH>oncEG)^1fssYPfg+;uoKS)8#+}Jq9Zk2oe_A@>{MLuhx6HBDTEE>i>fajG zqL}5LH^g^D)fbzcY*d9Z@@f*4gLN&n$dd{^H9_ zl_NGgQ)G;bSwDTBb?1U;p3M5Y%i8`M>X_=@`|q!JbD7u6%RUb({^p(i)o=86?X>{S z`w0^#-Icp@<=uvZN4sX9s@QM-=bYG%ht-G9yuK{3Y>h+VgPi+Mw^rPh-_BsaB|o(r(JG~M*KVG(R%u8@4C)6mp?viV=W85`0MPyA9feDGuQK#v3|3X^ZYqmtGV9o z+shvXyP2$O1(v>#iK)4A=(hQdck`#c{?ezmRl6tbZcxMbDOJB$?JS(WbN|%~`a3^o zOu1WF&=qgHCvw)xcIO34|5aKoSE+PRUMlsqOMF9hw_owvJH;{key=llHz(fa`M&V* z?|Vhe_igxWoAdp_Pn}E0!?U)xZ+|^$R-Hmm{StNQzKoO?t3SLDZ~G{NCAJngvqmMW zygs|$Jmb}!$633ABxL`;-xT>W!{XqFecy6szPWH~&55+z;ybK1#@>_Vx*oc;HP&S3 z{zDs{=Jn>)=3nIbr=yV&{ovJ+X2tXThb2m`Px`5rH{I=2zOLlqGck<2nfm1=FTDBE zS+Ht@z4_*DsaR*doz7F&+Q(m+^UtvSRAE*9vb|TOw7%Qs0HcBP|IL>VlaBgE)|}Y< zGp6EG1l!5;OY-0Hr{2n(A-usxevj=cwtM;9`W(B<=d4JHR==^~KwYrPVK&(n`8|+W zcvtb;l+i$E!*A0f?(;8RURrs=PF6lIBB54h>H9nCG5ds7&BSxUAKcq_-TB}-F>gy5 zHOWFY+#-;-f?QN!$ih1VbofMP3#{ceBtMt*&+)UrvWqCs5 zRvgo^*{ol%E0EjY%!4^`{XgX`MVk^uxy~sGVq}HJQtb;;%8{D#@(l4)#V6J_#{Vmt z9P>C~hs^RhHxGRgHcgJVl_iJ!jBf;&Xr`rO8LM5$>#Ixb!+w}~)rRMs z`#a@u#M@^D#vk3MH*Zj@bwAC1EycDwEUDbCBFLIs%-pwf@xPg?T8=+-{n@@cvow3h znr~Nqs$ZMV5V`TLi*LRAqO1qC(4@ESfZs#4jKIsjtLmy#L-?DN^G@u26tPdgYU0V8 zu*6%v;m-SsQ!eicR#*OAQnMqrajsqeiN)t`*E*WIkVBz?fr&EWLMPLIrsc)#d-BEaL;wp%22WQ%mvv4FO#rha BT&e&7 literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_admin_links.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_admin_links.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_admin_links.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_admin_links.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_admin_links_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_admin_links_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_bold.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_bold.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_bold_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_bold_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_insertmore.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_insertmore.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_insertmore_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_insertmore_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_italic.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_italic.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_italic_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_italic_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_strikethrough.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_strikethrough.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_strikethrough_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_strikethrough_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_underline.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_underline.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_underline_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_editor_underline_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_format_image_big_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_format_image_big_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_format_quote.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_format_quote.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_format_quote.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_format_quote.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_format_quote_grey.png similarity index 100% rename from WordPressEditor/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.png rename to WordPressEditor/src/main/res/drawable-xxhdpi/legacy_dashicon_format_quote_grey.png diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_icon_mediagallery_placeholder.png b/WordPressEditor/src/main/res/drawable-xxhdpi/legacy_icon_mediagallery_placeholder.png new file mode 100644 index 0000000000000000000000000000000000000000..40976b210a5952994294fcc3a7ea8f2da3dcf4c9 GIT binary patch literal 3826 zcmaJ@2~-o=wyngVF^B{eMH@*GaUcpL%ySA7Mgf@zl_7*EG$w%rOqfCt5D-yBkT}aM zBG{+4*s_Lw>_u2Q}eXCBIvy+V+W)lVg z069Bbsw)5>u<(UKFNY%^9YaO%ZDWL$cZ3`JKm?D*VE`6E>_7%+$D|!(xH4!#QQ=P* zrU0-^EyUeB!rRfon9gQu(xf?>d}bJo1^`nsKa55XWki61jDsO8GyK@SdOR2sWQO7h0S4rdYU>KbRvla>g#KgboKQ0NxML8B1v0|2%q{IBwb@YePe9{ z@UH_8SK|a7Fm|O{|5XcqGs6c*M1&b@Y4LbGO`eV>n{!Z$WMpI{<QLG3W zUxUTn@{@te;LyflAEiCk{ zhz6F{B$Abmp*2OHVy#0ZYEvwYtf+=Ru~aralF492{KN+R2W$Obu~IWI!{EwP1}Ee& zBgmS=W`aKkZ5;9sTC6FCMnpqvn9tDYpSApn4f+QyKd?qb;(x_z!D6(eOZ&f;`ez9C zkM!|x3dPS4z4C?5avTw{4*x2tfXmn=Z zVT_>==SUA0y)>8Z@1MuRJbFyN9b1Qb9JDqe||Z#epuii;;;ofFVlNC@)LW{&`?1Od7ZRwhjFt~LC0(nSxR0bV(w%6nP76eix28xN0g`4Q2 z;`j4yh>4+V{cCmmUIfNuy;*l42k`N8&K+DCdD+vE9Ngsh3E0TQoUXxC_uoREKAGO~ z0;U$dKm2L&dBZ{;3VjuVS2T0H;XZ(H6Qz6Bt<3`vicKHKH6cib(=y&k&IS?=6Ebr) za6T)6Z_IaILAoSBXL~K>QAsxU+(a6eH;Q&a)|bVF0?Ug8)c@d0o|F(xLhHUb<@%Fnh&_FcC}=QLhyl5~yC&>dH)*V`Vb6c7=d!Kla0y*KUqO2-S3 zc6V=7omr30oGLrgm^QN!*>{Je2H9U0KO>k049(K=)m!BoGS!c(J6u|E$RjVj#-ODR zclgXq8HBkkR^DzNP^~9Fv+XU}_4BElz|s;@ zbX(Uz^aLfNHUl{d1S@IQANeZbSJV}iPr1h&cxeODorJ6(~Fh6W7HpZj`ezYDW;HH zM9;ekG-2 zVUK@Q_PlpWBI}mylDKUk+-C6W(<_y=I$_&Qa#S9uzMrW*7S{3GBCE6Z7fbJ?lGfUx zX1|*%Cmtp$_-)tqexw)s5Pf>3AC0|39?)K(Q;2#S7oD5U<4W$INXV4HK0=B_$-muKaj zM2>%x(Lw1>+uyaS#geSnpF0rVjB^(DDX5VB{-rWHt;&fhtfR2TC?kuRZSB09@K@~# z+4RMX?0eR%<6{2hZT(k23v34ibdwcSyqw7IrDAOvuj`PheBfw)1#Xts$F~h?N?$C(q4$^r*G|idg&oS@sG%toF`TO&ilw}5*;ET zlk;}$5&bw~bM*2(UP{M{%8?c2xU9uUBC_zpx7qN%UqAZzPy0{tW-w-+dQ%h!8p`%e zPvtt#oVuEC-I90FFqwBD6abQ9a=T zfA+nb=ZXzV^Kh<_GI;3I>Mw1HbFAOzjzvD>Js0(iH_txvJF%F#t(bTX+vAe{c3#!dU8=oJtwg%9TVNfG zr$xA|3Co&{ZY(m$^kkCFIOl6hVfWH_8~N%Ahl|OLyL)e7j3z0raXyzE%yxKy;sR^8 zY09yXD<>4da)0OTrh|GO0wl0cI#q!RqaLn3E zN*kOy1f;ri*aq9X?2$1-=F_LQ9pk&UuZ-`SF@Nc@qd2b0JyV9 z0RFCg)UGI&8k}JtI~<}Xes|{kHtM#ifk4T@-04wP6`F^M(SWvb*SwaL^%6^C(no9( zA^y5Au(Q|V*{hD`yxXASGfRNn@mr6k^r}Hb!=&r#t1PK}UEc)dNT)65dUF+2-mJFL z7t=kR&ahJnYUCH%7ixBzPFy#y;j)`g^{P^}QKNjiX7 z?&z;6i`~$UNL)r$MDFi*mUc4WOKIZW;KM%pS0SNAdt;_*h zk`K2`t5jy-mg`xMx3rjZ!m8C+j~~4&8Vd^e&%Ea3z2vZ=7SL2464CI>*wTgo;5QS- U^fmL7N>cCGSvgTFECY`G8^qIBp8x;= literal 0 HcmV?d00001 diff --git a/WordPressEditor/src/main/res/drawable-xxhdpi/media_movieclip.png b/WordPressEditor/src/main/res/drawable-xxhdpi/media_movieclip.png new file mode 100644 index 0000000000000000000000000000000000000000..90e9b768a96d19187d2ce43191681edaca769712 GIT binary patch literal 2240 zcmaJ@e_T`b8lDBafI>nwQ54pMOxdrq!C({6!8TbmK)@IVvR`Lx!gj{aU{eGWKcS__ zC-N>Z(emCd-XfZSpfS@)V8R4ZlOJ*o+y$-yBB7QjaKA%P>Z9$m?Y!qb@B6&Z`+T22 z&WEwl8(dwMxnM9DSAHZX4qPk1?`J10_)p&xTn8>obzGq?9+B(xVl9ke%Mb~S=c~kN za2za_ZOgm}hhQ)-`zjNJI-%elmK0Hu#r7JqL8SrR7);1IgGMY(hjn-foTgNV5=QIK z67Wh{C?PRWKow{rV1+VryB3b$9-ScFo-Sp|2JGtfECDK z(Sq=^9|D-BmC0Fg9Nz3Ka2HBY=yVzug`(H%$$B~&(WX%#CX;E$pwUR6f`o2U>%<0< z8eKVuz=2VzR;ke`5jEb9D3%~ux=;dO`eX%_<|(Wios|g)Mlpyr6o^c|h=Qap`OxlgH%+ zb7>I_dlWd=%R!`BDp;+X>yr!_e2z_GO)*sta|ZsTk1$8e{WuWseZ<2oN*I*iT#9Q_U*oM;Vs#axf@1`i+A z4jdW1NxwFd?eBRoy8PKaC1!wv9H1;KsAA``lVK zn8{CaN7oE&u@pCwvTF3sMxy$gf28;etAs1Y+13^Le*13xqPXA?g_CC0eC-&8>#yo< zDA@$kC+|}v{ve_6Xs=vMOzP1GZtxdQU7CbOoA$dHiPwK>cUx#AdY|e(_BwI8-%@hB z#0yjpNt>gmy|9x@lCIl2Quij=cDVKQm5_3$=!|RaVeTlDZc3E2-iCY0l*>oy-Y88T zZ$-$?KZ*zg-<0%&v4zkoN#(1=q=R+!-l_jnI7U&LPYz!Tc}(^d;;aKDQm6wAuWeeM zvRC2QvZD)!{_|&nv+-fgnL}qjgnWfno$l!I)OHtRUguKO@(O$U(>{?WD6h|yww9uH~uusG` z#gckgt-6{>Nvw|1U+gXXYR_Pf=!A1vn9nugK_=f3 zWZc1n83eo#JaDuSgnKZ5E?f;8nk+WR=Gt+js5IkLHe!uDkG|{u{TP3D)^9&#AY-|| zH70vxjCvP#UDb?~;w)h+(46z4oeIz4GSY$f#v}!z6p!9z^Co{V)vU4g-YJuhGR*0raN^y~Egj9%<~r7m~J-8`4# zy{U98I+5vJ?p0B}D`)-0$z6~By=JglepcaG;o38+@A+Ffe;28&hYHeLcK3&6Z%*r3 zUR~KZQ6!mKoH3f6Fv8FjDYKd)Af!&X&SSjV&gR*vv|KUvHCfg|gI<+qdJncftlgT| z@Z~Ar&WD-bZLJlT?wkl4cz+)MMc;Z7PpP6DLUsC5GUzu|s$5IQO}ZRrc=Cw1)^2yzT6g!ke7U_IC - - - + - - + + + + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_bold_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_bold_selector.xml old mode 100644 new mode 100755 index 905d41c187f2..fdc1772d9ef1 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_bold_selector.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_bold_selector.xml @@ -1,8 +1,10 @@ - + - + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_highlighted_underline.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_highlighted_underline.xml new file mode 100644 index 000000000000..ed4a79dc9416 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_highlighted_underline.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_html_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_html_selected_state.xml new file mode 100755 index 000000000000..696a6ce9c0be --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_html_selected_state.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_html_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_html_selector.xml new file mode 100755 index 000000000000..86229c0f76e2 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_html_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selected_state.xml old mode 100644 new mode 100755 index b01b18738d8d..29eb69e4a705 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selected_state.xml @@ -2,11 +2,15 @@ - - - + - - + + + + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selector.xml old mode 100644 new mode 100755 index 2b8cb68bcfd0..c627cb34c42f --- a/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selector.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_italic_selector.xml @@ -1,8 +1,10 @@ - + - + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_link_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_link_selected_state.xml old mode 100644 new mode 100755 index aa147f669e6e..55102f1b1366 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_link_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_link_selected_state.xml @@ -2,11 +2,15 @@ - - - + - - + + + + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_link_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_link_selector.xml old mode 100644 new mode 100755 index 736f212f1076..053cea8d32db --- a/WordPressEditor/src/main/res/drawable/format_bar_button_link_selector.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_link_selector.xml @@ -1,8 +1,10 @@ - + - + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_media_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_media_selected_state.xml old mode 100644 new mode 100755 index 5041c00f77ba..4b1563f0f273 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_media_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_media_selected_state.xml @@ -2,11 +2,15 @@ - - - + - - + + + + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_media_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_media_selector.xml old mode 100644 new mode 100755 index 7c2f5bb64ab5..003de550cc40 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_media_selector.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_media_selector.xml @@ -1,8 +1,10 @@ - + - + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_ol_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_ol_selected_state.xml new file mode 100755 index 000000000000..9d07fc4dc490 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_ol_selected_state.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_ol_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_ol_selector.xml new file mode 100755 index 000000000000..c0f849cd0264 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_ol_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selected_state.xml old mode 100644 new mode 100755 index d145faf7882d..bcea43181cde --- a/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selected_state.xml @@ -2,11 +2,15 @@ - - - + - - + + + + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selector.xml old mode 100644 new mode 100755 index 4de783f1a1ab..bad08df8d9d1 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selector.xml +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_quote_selector.xml @@ -1,8 +1,10 @@ - + - + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selected_state.xml new file mode 100644 index 000000000000..1c89e03e9722 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selected_state.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selector.xml new file mode 100644 index 000000000000..07fe02a892c5 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_strikethrough_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_ul_selected_state.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_ul_selected_state.xml new file mode 100755 index 000000000000..d9e9929d6d5d --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_ul_selected_state.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_ul_selector.xml b/WordPressEditor/src/main/res/drawable/format_bar_button_ul_selector.xml new file mode 100755 index 000000000000..d66242298f5b --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/format_bar_button_ul_selector.xml @@ -0,0 +1,10 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_more_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_bold_selected_state.xml similarity index 50% rename from WordPressEditor/src/main/res/drawable/format_bar_button_more_selected_state.xml rename to WordPressEditor/src/main/res/drawable/legacy_format_bar_button_bold_selected_state.xml index 9ff1e9f3480d..5e7ca3ef8408 100644 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_more_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_bold_selected_state.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android"> - + - + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_strike_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_bold_selector.xml similarity index 55% rename from WordPressEditor/src/main/res/drawable/format_bar_button_strike_selector.xml rename to WordPressEditor/src/main/res/drawable/legacy_format_bar_button_bold_selector.xml index 9d00180ad04c..66d8b631f6f3 100644 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_strike_selector.xml +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_bold_selector.xml @@ -1,8 +1,8 @@ - - + + - + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selected_state.xml new file mode 100644 index 000000000000..13689b19a1eb --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selected_state.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selector.xml new file mode 100644 index 000000000000..f0fd9049772b --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_italic_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_strike_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_link_selected_state.xml similarity index 50% rename from WordPressEditor/src/main/res/drawable/format_bar_button_strike_selected_state.xml rename to WordPressEditor/src/main/res/drawable/legacy_format_bar_button_link_selected_state.xml index d00af024af89..d376ceef0eeb 100644 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_strike_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_link_selected_state.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android"> - + - + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_underline_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_link_selector.xml similarity index 55% rename from WordPressEditor/src/main/res/drawable/format_bar_button_underline_selector.xml rename to WordPressEditor/src/main/res/drawable/legacy_format_bar_button_link_selector.xml index 8f42668e2346..4c488f471d0d 100644 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_underline_selector.xml +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_link_selector.xml @@ -1,8 +1,8 @@ - - + + - + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_underline_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_media_selected_state.xml similarity index 52% rename from WordPressEditor/src/main/res/drawable/format_bar_button_underline_selected_state.xml rename to WordPressEditor/src/main/res/drawable/legacy_format_bar_button_media_selected_state.xml index be0b25dd1e58..9d4cbf83ef45 100644 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_underline_selected_state.xml +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_media_selected_state.xml @@ -3,10 +3,10 @@ xmlns:android="http://schemas.android.com/apk/res/android"> - + - + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/format_bar_button_more_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_media_selector.xml similarity index 56% rename from WordPressEditor/src/main/res/drawable/format_bar_button_more_selector.xml rename to WordPressEditor/src/main/res/drawable/legacy_format_bar_button_media_selector.xml index 412de63a4799..ece70b5c4f36 100644 --- a/WordPressEditor/src/main/res/drawable/format_bar_button_more_selector.xml +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_media_selector.xml @@ -1,8 +1,8 @@ - - + + - + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selected_state.xml new file mode 100644 index 000000000000..0c7870ff52ce --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selected_state.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selector.xml new file mode 100644 index 000000000000..f28a013ce44a --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_more_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selected_state.xml new file mode 100644 index 000000000000..b848cd831ccd --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selected_state.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selector.xml new file mode 100644 index 000000000000..ad0a2e684d26 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_quote_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selected_state.xml new file mode 100644 index 000000000000..43762ab9e36e --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selected_state.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selector.xml new file mode 100644 index 000000000000..d96797dc7e32 --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_strike_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selected_state.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selected_state.xml new file mode 100644 index 000000000000..786fe8d498ae --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selected_state.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selector.xml b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selector.xml new file mode 100644 index 000000000000..38ea66806a3c --- /dev/null +++ b/WordPressEditor/src/main/res/drawable/legacy_format_bar_button_underline_selector.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/drawable/list_divider.xml b/WordPressEditor/src/main/res/drawable/list_divider.xml index 7e3bd2b8f19b..74267734f80f 100644 --- a/WordPressEditor/src/main/res/drawable/list_divider.xml +++ b/WordPressEditor/src/main/res/drawable/list_divider.xml @@ -4,7 +4,7 @@ android:insetRight="@dimen/margin_extra_large"> - + - \ No newline at end of file + diff --git a/WordPressEditor/src/main/res/drawable/pressed_background_wordpress.xml b/WordPressEditor/src/main/res/drawable/pressed_background_wordpress.xml index b0a98b0879e6..4475720c27e6 100644 --- a/WordPressEditor/src/main/res/drawable/pressed_background_wordpress.xml +++ b/WordPressEditor/src/main/res/drawable/pressed_background_wordpress.xml @@ -18,5 +18,5 @@ --> - + diff --git a/WordPressEditor/src/main/res/layout-sw600dp/fragment_editor.xml b/WordPressEditor/src/main/res/layout-sw600dp/fragment_editor.xml new file mode 100644 index 000000000000..26281530c6ab --- /dev/null +++ b/WordPressEditor/src/main/res/layout-sw600dp/fragment_editor.xml @@ -0,0 +1,134 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/WordPressEditor/src/main/res/layout-v19/editor_webview.xml b/WordPressEditor/src/main/res/layout-v19/editor_webview.xml new file mode 100644 index 000000000000..fb826c2ff754 --- /dev/null +++ b/WordPressEditor/src/main/res/layout-v19/editor_webview.xml @@ -0,0 +1,6 @@ + + \ No newline at end of file diff --git a/WordPressEditor/src/main/res/layout/alert_create_link.xml b/WordPressEditor/src/main/res/layout/alert_create_link.xml new file mode 100644 index 000000000000..840917184909 --- /dev/null +++ b/WordPressEditor/src/main/res/layout/alert_create_link.xml @@ -0,0 +1,42 @@ + + + + + + + +