aboutsummaryrefslogtreecommitdiff
path: root/WordPress
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress')
-rw-r--r--WordPress/build.gradle13
-rw-r--r--WordPress/src/main/AndroidManifest.xml2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/WordPress.java10
-rw-r--r--WordPress/src/main/java/org/wordpress/android/WordPressDB.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java188
-rw-r--r--WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java760
-rw-r--r--WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanelInstructionsForStat.java140
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Comment.java16
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/MediaFile.java347
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/MediaGallery.java85
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Note.java16
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java46
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java18
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java77
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderRecommendedBlog.java10
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java14
-rw-r--r--WordPress/src/main/java/org/wordpress/android/models/Suggestion.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/ViewSiteActivity.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/WPDrawerActivity.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/ManageBlogsActivity.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/NewBlogFragment.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/NewUserFragment.java13
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java3
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/FetchBlogListWPCom.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/comments/CommentUtils.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsListFragment.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java38
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryActivity.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryAdapter.java1
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridFragment.java15
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaItemFragment.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java11
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPVideos.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/MediaUtils.java576
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java224
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/media/services/MediaUploadService.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsActivity.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailListFragment.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsListFragment.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderUserNoteBlock.java14
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlock.java10
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlockClickableSpan.java12
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/UserNoteBlock.java13
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/EditLinkActivity.java77
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java997
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostContentFragment.java1928
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostSettingsFragment.java14
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/PostUploadService.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/PostsActivity.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListFragment.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java14
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java3
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/prefs/SettingsActivity.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java5
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderCommentService.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderUpdateService.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/StatsActivity.java9
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSinglePostDetailsActivity.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/models/AuthorModel.java4
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/models/ClickGroupModel.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/models/FollowerModel.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/models/ReferrerGroupModel.java8
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/themes/ThemePreviewFragment.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeTabFragment.java6
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java88
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/util/WPHtml.java12
-rw-r--r--WordPress/src/main/java/org/wordpress/android/widgets/MediaGalleryImageSpan.java24
-rw-r--r--WordPress/src/main/java/org/wordpress/android/widgets/WPAutoResizeTextView.java2
-rw-r--r--WordPress/src/main/java/org/wordpress/android/widgets/WPEditText.java56
-rw-r--r--WordPress/src/main/java/org/wordpress/android/widgets/WPImageSpan.java93
-rw-r--r--WordPress/src/main/java/org/wordpress/android/widgets/WPUnderlineSpan.java48
-rw-r--r--WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java10
-rw-r--r--WordPress/src/main/java/org/xmlrpc/android/XMLRPCSerializer.java2
-rw-r--r--WordPress/src/main/res/drawable-hdpi/ab_icon_edit.pngbin1340 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.pngbin814 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_admin_links_grey.pngbin995 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.pngbin586 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.pngbin587 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.pngbin398 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.pngbin398 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.pngbin538 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.pngbin558 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.pngbin663 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.pngbin798 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.pngbin1230 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.pngbin1235 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.pngbin1122 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.pngbin1491 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/dashicon_format_quote_grey.pngbin1564 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/media_movieclip.pngbin4208 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/noticon_picture.pngbin1264 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.pngbin1271 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.pngbin1439 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.pngbin1026 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.pngbin1288 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.pngbin653 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.pngbin703 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.pngbin379 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.pngbin388 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.pngbin576 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.pngbin603 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.pngbin773 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.pngbin1041 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.pngbin1279 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.pngbin1309 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.pngbin1287 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.pngbin1668 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.pngbin1781 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/media_movieclip.pngbin4292 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/noticon_picture.pngbin1376 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.pngbin1371 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.pngbin1713 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.pngbin1429 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.pngbin1691 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.pngbin883 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.pngbin915 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.pngbin432 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.pngbin457 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.pngbin796 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.pngbin735 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.pngbin1145 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.pngbin1440 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.pngbin1427 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.pngbin1473 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.pngbin2174 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.pngbin2087 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.pngbin2218 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/media_movieclip.pngbin2240 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/noticon_picture.pngbin1601 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.pngbin1594 -> 0 bytes
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_bold_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_bold_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_italic_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_italic_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_link_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_link_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_media_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_media_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_more_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_more_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_quote_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_quote_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_strike_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_strike_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_underline_selected_state.xml12
-rw-r--r--WordPress/src/main/res/drawable/format_bar_button_underline_selector.xml8
-rw-r--r--WordPress/src/main/res/drawable/pressed_background_wordpress.xml22
-rw-r--r--WordPress/src/main/res/layout/alert_create_link.xml42
-rw-r--r--WordPress/src/main/res/layout/alert_image_options.xml81
-rw-r--r--WordPress/src/main/res/layout/comment_list_fragment.xml4
-rw-r--r--WordPress/src/main/res/layout/empty_listview.xml4
-rw-r--r--WordPress/src/main/res/layout/fragment_edit_post_content.xml14
-rw-r--r--WordPress/src/main/res/layout/media_grid_fragment.xml4
-rw-r--r--WordPress/src/main/res/layout/notifications_fragment_notes_list.xml4
-rw-r--r--WordPress/src/main/res/layout/post_listview.xml4
-rw-r--r--WordPress/src/main/res/layout/reader_fragment_post_cards.xml4
-rw-r--r--WordPress/src/main/res/layout/select_categories.xml4
-rw-r--r--WordPress/src/main/res/layout/stats_activity.xml4
-rw-r--r--WordPress/src/main/res/layout/stats_activity_single_post_details.xml4
-rw-r--r--WordPress/src/main/res/layout/stats_activity_view_all.xml4
-rw-r--r--WordPress/src/main/res/layout/theme_tab_fragment.xml4
-rw-r--r--WordPress/src/main/res/values/colors.xml5
-rw-r--r--WordPress/src/main/res/values/styles.xml7
177 files changed, 1649 insertions, 4985 deletions
diff --git a/WordPress/build.gradle b/WordPress/build.gradle
index b9c028078..33be73889 100644
--- a/WordPress/build.gradle
+++ b/WordPress/build.gradle
@@ -27,7 +27,7 @@ android {
}
compileSdkVersion 21
- buildToolsVersion "21.1.1"
+ buildToolsVersion "21.1.2"
defaultConfig {
applicationId "org.wordpress.android"
@@ -79,7 +79,6 @@ dependencies {
compile 'com.cocosw:undobar:1.6@aar'
compile 'de.greenrobot:eventbus:2.4.0'
- compile 'com.mixpanel.android:mixpanel-android:4.3.0@aar'
compile 'com.mcxiaoke.volley:library:1.0.+'
androidTestCompile 'com.google.dexmaker:dexmaker-mockito:1.0'
@@ -106,8 +105,18 @@ dependencies {
debugCompile project(path:':libs:graphview:WordPressGraphView', configuration: 'debug')
releaseCompile project(path:':libs:persistentedittext:PersistentEditText', configuration: 'release')
debugCompile project(path:':libs:persistentedittext:PersistentEditText', configuration: 'debug')
+ releaseCompile project(path:':libs:analytics:WordPressAnalytics', configuration: 'release')
+ debugCompile project(path:':libs:analytics:WordPressAnalytics', configuration: 'debug')
+ releaseCompile project(path:':libs:editor:WordPressEditor', configuration: 'release')
+ debugCompile project(path:':libs:editor:WordPressEditor', configuration: 'debug')
}
+configurations.all {
+ // Exclude packaged wordpress sub projects, force the use of the source project
+ // (eg. use :libs:utils:WordPressUtils instead of 'org.wordpress:utils')
+ exclude group: 'org.wordpress', module: 'utils'
+ exclude group: 'org.wordpress', module: 'analytics'
+}
task generateCrashlyticsConfig(group: "generate", description: "Generate Crashlytics config") {
def outputFile = new File("${rootDir}/WordPress/crashlytics.properties")
diff --git a/WordPress/src/main/AndroidManifest.xml b/WordPress/src/main/AndroidManifest.xml
index 5f105e016..bc8eb6ddb 100644
--- a/WordPress/src/main/AndroidManifest.xml
+++ b/WordPress/src/main/AndroidManifest.xml
@@ -118,7 +118,7 @@
android:label="@string/add_new_category"
android:theme="@style/WordPress.Dialog" />
<activity
- android:name=".ui.posts.EditLinkActivity"
+ android:name=".editor.legacy.EditLinkActivity"
android:label="@string/create_a_link"
android:theme="@style/WordPress.Dialog"
android:windowSoftInputMode="stateVisible" />
diff --git a/WordPress/src/main/java/org/wordpress/android/WordPress.java b/WordPress/src/main/java/org/wordpress/android/WordPress.java
index 4edad2973..ea547e897 100644
--- a/WordPress/src/main/java/org/wordpress/android/WordPress.java
+++ b/WordPress/src/main/java/org/wordpress/android/WordPress.java
@@ -48,6 +48,7 @@ import org.wordpress.android.ui.notifications.utils.SimperiumUtils;
import org.wordpress.android.ui.prefs.AppPrefs;
import org.wordpress.android.util.ABTestingUtils;
import org.wordpress.android.util.ABTestingUtils.Feature;
+import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.BitmapLruCache;
@@ -183,10 +184,9 @@ public class WordPress extends Application {
}
HelpshiftHelper.init(this);
-
- AnalyticsTracker.init();
- AnalyticsTracker.registerTracker(new AnalyticsTrackerMixpanel());
- AnalyticsTracker.beginSession();
+ AnalyticsTracker.registerTracker(new AnalyticsTrackerMixpanel(getContext(), BuildConfig.MIXPANEL_TOKEN));
+ AnalyticsTracker.init(getContext());
+ AnalyticsUtils.refreshMetadata();
AnalyticsTracker.track(Stat.APPLICATION_STARTED);
registerForCloudMessaging(this);
@@ -797,7 +797,7 @@ public class WordPress extends Application {
* 2. the app was in background and is now foreground
*/
public void onFromBackground() {
- AnalyticsTracker.beginSession();
+ AnalyticsUtils.refreshMetadata();
mApplicationOpenedDate = new Date();
AnalyticsTracker.track(AnalyticsTracker.Stat.APPLICATION_OPENED);
if (NetworkUtils.isNetworkAvailable(mContext)) {
diff --git a/WordPress/src/main/java/org/wordpress/android/WordPressDB.java b/WordPress/src/main/java/org/wordpress/android/WordPressDB.java
index ae55ad95d..2b05b2c82 100644
--- a/WordPress/src/main/java/org/wordpress/android/WordPressDB.java
+++ b/WordPress/src/main/java/org/wordpress/android/WordPressDB.java
@@ -16,7 +16,7 @@ import org.json.JSONArray;
import org.wordpress.android.datasets.CommentTable;
import org.wordpress.android.datasets.SuggestionTable;
import org.wordpress.android.models.Blog;
-import org.wordpress.android.models.MediaFile;
+import org.wordpress.android.util.helpers.MediaFile;
import org.wordpress.android.models.Post;
import org.wordpress.android.models.PostLocation;
import org.wordpress.android.models.PostsListPost;
diff --git a/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java b/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java
deleted file mode 100644
index 8d7ae0f75..000000000
--- a/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTracker.java
+++ /dev/null
@@ -1,188 +0,0 @@
-package org.wordpress.android.analytics;
-
-import android.content.SharedPreferences;
-import android.preference.PreferenceManager;
-
-import org.wordpress.android.WordPress;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-public final class AnalyticsTracker {
- private static boolean mHasUserOptedOut;
-
- public enum Stat {
- APPLICATION_OPENED,
- APPLICATION_CLOSED,
- THEMES_ACCESSED_THEMES_BROWSER,
- THEMES_CHANGED_THEME,
- THEMES_PREVIEWED_SITE,
- READER_ACCESSED,
- READER_OPENED_ARTICLE,
- READER_LIKED_ARTICLE,
- READER_REBLOGGED_ARTICLE,
- READER_INFINITE_SCROLL,
- READER_FOLLOWED_READER_TAG,
- READER_UNFOLLOWED_READER_TAG,
- READER_FOLLOWED_SITE,
- READER_LOADED_TAG,
- READER_LOADED_FRESHLY_PRESSED,
- READER_COMMENTED_ON_ARTICLE,
- READER_BLOCKED_BLOG,
- READER_BLOG_PREVIEW,
- READER_TAG_PREVIEW,
- STATS_ACCESSED,
- STATS_VIEW_ALL_ACCESSED,
- STATS_SINGLE_POST_ACCESSED,
- STATS_OPENED_WEB_VERSION,
- STATS_TAPPED_BAR_CHART,
- STATS_SCROLLED_TO_BOTTOM,
- EDITOR_CREATED_POST,
- EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY,
- EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY,
- EDITOR_UPDATED_POST,
- EDITOR_SCHEDULED_POST,
- EDITOR_CLOSED_POST,
- EDITOR_PUBLISHED_POST,
- EDITOR_SAVED_DRAFT,
- EDITOR_PUBLISHED_POST_WITH_PHOTO,
- EDITOR_PUBLISHED_POST_WITH_VIDEO,
- EDITOR_PUBLISHED_POST_WITH_CATEGORIES,
- EDITOR_PUBLISHED_POST_WITH_TAGS,
- EDITOR_TAPPED_BLOCKQUOTE,
- EDITOR_TAPPED_BOLD,
- EDITOR_TAPPED_IMAGE,
- EDITOR_TAPPED_ITALIC,
- EDITOR_TAPPED_LINK,
- EDITOR_TAPPED_MORE,
- EDITOR_TAPPED_STRIKETHROUGH,
- EDITOR_TAPPED_UNDERLINE,
- NOTIFICATIONS_ACCESSED,
- NOTIFICATIONS_OPENED_NOTIFICATION_DETAILS,
- NOTIFICATION_REPLIED_TO,
- NOTIFICATION_APPROVED,
- NOTIFICATION_UNAPPROVED,
- NOTIFICATION_LIKED,
- NOTIFICATION_UNLIKED,
- NOTIFICATION_TRASHED,
- NOTIFICATION_FLAGGED_AS_SPAM,
- OPENED_POSTS,
- OPENED_PAGES,
- OPENED_COMMENTS,
- OPENED_VIEW_SITE,
- OPENED_VIEW_ADMIN,
- OPENED_MEDIA_LIBRARY,
- OPENED_SETTINGS,
- CREATED_ACCOUNT,
- SHARED_ITEM,
- ADDED_SELF_HOSTED_SITE,
- SIGNED_IN,
- SIGNED_INTO_JETPACK,
- PERFORMED_JETPACK_SIGN_IN_FROM_STATS_SCREEN,
- STATS_SELECTED_INSTALL_JETPACK,
- APPLICATION_STARTED,
- PUSH_NOTIFICATION_RECEIVED,
- SUPPORT_OPENED_HELPSHIFT_SCREEN,
- LOGIN_FAILED,
- LOGIN_FAILED_TO_GUESS_XMLRPC
- }
-
- public interface Tracker {
- void track(Stat stat);
- void track(Stat stat, Map<String, ?> properties);
- void beginSession();
- void endSession();
- void refreshMetadata();
- void clearAllData();
- void registerPushNotificationToken(String regId);
- }
-
- private static final List<Tracker> TRACKERS = new ArrayList<Tracker>();
-
- private AnalyticsTracker() {
- }
-
- public static void init() {
- loadPrefHasUserOptedOut(false);
- }
-
- public static void loadPrefHasUserOptedOut(boolean manageSession) {
- SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(WordPress.getContext());
-
- boolean hasUserOptedOut = !prefs.getBoolean("wp_pref_send_usage_stats", true);
- if (hasUserOptedOut != mHasUserOptedOut && manageSession) {
- mHasUserOptedOut = hasUserOptedOut;
- if (mHasUserOptedOut) {
- endSession(true);
- clearAllData();
- } else {
- beginSession();
- }
- }
- }
-
- public static void registerTracker(Tracker tracker) {
- if (tracker != null) {
- TRACKERS.add(tracker);
- }
- }
-
- public static void track(Stat stat) {
- if (mHasUserOptedOut) {
- return;
- }
- for (Tracker tracker : TRACKERS) {
- tracker.track(stat);
- }
- }
-
- public static void track(Stat stat, Map<String, ?> properties) {
- if (mHasUserOptedOut) {
- return;
- }
- for (Tracker tracker : TRACKERS) {
- tracker.track(stat, properties);
- }
- }
-
- public static void beginSession() {
- if (mHasUserOptedOut) {
- return;
- }
- for (Tracker tracker : TRACKERS) {
- tracker.beginSession();
- }
- }
-
- public static void endSession(boolean force) {
- if (mHasUserOptedOut && !force) {
- return;
- }
- for (Tracker tracker : TRACKERS) {
- tracker.endSession();
- }
- }
-
- public static void registerPushNotificationToken(String regId) {
- if (mHasUserOptedOut) {
- return;
- }
- for (Tracker tracker : TRACKERS) {
- tracker.registerPushNotificationToken(regId);
- }
- }
-
- public static void clearAllData() {
- for (Tracker tracker : TRACKERS) {
- tracker.clearAllData();
- }
- }
-
- public static void refreshMetadata() {
- for (Tracker tracker : TRACKERS) {
- tracker.refreshMetadata();
- }
- }
-}
-
diff --git a/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java b/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java
deleted file mode 100644
index 6213ae6ba..000000000
--- a/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanel.java
+++ /dev/null
@@ -1,760 +0,0 @@
-package org.wordpress.android.analytics;
-
-import android.annotation.SuppressLint;
-import android.app.Notification;
-import android.app.NotificationManager;
-import android.app.PendingIntent;
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.os.Build;
-import android.preference.PreferenceManager;
-import android.text.TextUtils;
-
-import com.android.volley.VolleyError;
-import com.mixpanel.android.mpmetrics.MixpanelAPI;
-import com.wordpress.rest.RestRequest;
-
-import org.json.JSONException;
-import org.json.JSONObject;
-import org.wordpress.android.BuildConfig;
-import org.wordpress.android.WordPress;
-import org.wordpress.android.ui.prefs.AppPrefs;
-import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.PackageUtils;
-
-import java.util.EnumMap;
-import java.util.Iterator;
-import java.util.Map;
-
-public class AnalyticsTrackerMixpanel implements AnalyticsTracker.Tracker {
- private MixpanelAPI mMixpanel;
- private EnumMap<AnalyticsTracker.Stat, JSONObject> mAggregatedProperties;
- private static final String SESSION_COUNT = "sessionCount";
- private static final String MIXPANEL_PLATFORM = "platform";
- private static final String MIXPANEL_SESSION_COUNT = "session_count";
- private static final String DOTCOM_USER = "dotcom_user";
- private static final String JETPACK_USER = "jetpack_user";
- private static final String MIXPANEL_NUMBER_OF_BLOGS = "number_of_blogs";
- private static final String VERSION_CODE = "version_code";
-
- public AnalyticsTrackerMixpanel() {
- mAggregatedProperties = new EnumMap<AnalyticsTracker.Stat, JSONObject>(AnalyticsTracker.Stat.class);
- mMixpanel = MixpanelAPI.getInstance(WordPress.getContext(), BuildConfig.MIXPANEL_TOKEN);
- }
-
- @SuppressWarnings("deprecation")
- @SuppressLint("NewApi")
- public static void showNotification(Context context, PendingIntent intent, int notificationIcon, CharSequence title,
- CharSequence message) {
- final NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
- final Notification.Builder builder = new Notification.Builder(context).setSmallIcon(notificationIcon)
- .setTicker(message).setWhen(System.currentTimeMillis()).setContentTitle(title).setContentText(message)
- .setContentIntent(intent);
- Notification notification;
- if (Build.VERSION.SDK_INT < 16) {
- notification = builder.getNotification();
- } else {
- notification = builder.build();
- }
- notification.flags |= Notification.FLAG_AUTO_CANCEL;
- nm.notify(0, notification);
- }
-
- @Override
- public void track(AnalyticsTracker.Stat stat) {
- track(stat, null);
- }
-
- @Override
- public void track(AnalyticsTracker.Stat stat, Map<String, ?> properties) {
- AnalyticsTrackerMixpanelInstructionsForStat instructions = instructionsForStat(stat);
-
- if (instructions == null) {
- return;
- }
-
- trackMixpanelDataForInstructions(instructions, properties);
- }
-
- private void retrieveAndRegisterEmailAddressIfApplicable() {
- // Once the email address is bound to a mixpanel profile, we don't need to set (and get it) a second time.
- if (AppPrefs.getMixpanelEmailRetrievalCheck()) {
- return;
- }
- RestRequest.Listener listener = new RestRequest.Listener() {
- @Override
- public void onResponse(JSONObject jsonObject) {
- try {
- if (jsonObject != null && !TextUtils.isEmpty(jsonObject.getString("email"))) {
- String email = jsonObject.getString("email");
- setValueForPeopleProperty("$email", email);
- AppPrefs.setMixpanelEmailRetrievalCheck(true);
- }
- } catch (JSONException e) {
- AppLog.e(T.UTILS, "Can't get email field from json response: " + jsonObject);
- }
- }
- };
- RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() {
- @Override
- public void onErrorResponse(VolleyError volleyError) {
- AppLog.e(T.UTILS, volleyError);
- }
- };
-
- String path = "/me";
- WordPress.getRestClientUtils().get(path, listener, errorListener);
- }
-
- private void trackMixpanelDataForInstructions(AnalyticsTrackerMixpanelInstructionsForStat instructions,
- Map<String, ?> properties) {
- if (instructions.getDisableForSelfHosted()) {
- return;
- }
-
- trackMixpanelEventForInstructions(instructions, properties);
- trackMixpanelPropertiesForInstructions(instructions);
- }
-
- private void trackMixpanelPropertiesForInstructions(AnalyticsTrackerMixpanelInstructionsForStat instructions) {
- if (instructions.getPeoplePropertyToIncrement() != null && !instructions.getPeoplePropertyToIncrement()
- .isEmpty()) {
- incrementPeopleProperty(instructions.getPeoplePropertyToIncrement());
- }
-
- if (instructions.getSuperPropertyToIncrement() != null && !instructions.getSuperPropertyToIncrement()
- .isEmpty()) {
- incrementSuperProperty(instructions.getSuperPropertyToIncrement());
- }
-
- if (instructions.getPropertyToIncrement() != null && !instructions.getPropertyToIncrement().isEmpty()) {
- incrementProperty(instructions.getPropertyToIncrement(), instructions.getStatToAttachProperty());
- }
-
- if (instructions.getSuperPropertiesToFlag() != null && instructions.getSuperPropertiesToFlag().size() > 0) {
- for (String superPropertyToFlag : instructions.getSuperPropertiesToFlag()) {
- flagSuperProperty(superPropertyToFlag);
- }
- }
-
- if (instructions.getPeoplePropertiesToAssign() != null
- && instructions.getPeoplePropertiesToAssign().size() > 0) {
- for (Map.Entry<String, Object> entry: instructions.getPeoplePropertiesToAssign().entrySet()) {
- setValueForPeopleProperty(entry.getKey(), entry.getValue());
- }
- }
- }
-
- private void setValueForPeopleProperty(String peopleProperty, Object value) {
- try {
- mMixpanel.getPeople().set(peopleProperty, value);
- } catch (OutOfMemoryError outOfMemoryError) {
- // ignore exception
- }
- }
-
- private void trackMixpanelEventForInstructions(AnalyticsTrackerMixpanelInstructionsForStat instructions,
- Map<String, ?> properties) {
- String eventName = instructions.getMixpanelEventName();
- if (eventName != null && !eventName.isEmpty()) {
- JSONObject savedPropertiesForStat = propertiesForStat(instructions.getStat());
- if (savedPropertiesForStat == null) {
- savedPropertiesForStat = new JSONObject();
- }
-
- // Retrieve properties user has already passed in and combine them with the saved properties
- if (properties != null) {
- Iterator iter = properties.entrySet().iterator();
- while (iter.hasNext()) {
- Map.Entry pairs = (Map.Entry) iter.next();
- String key = (String) pairs.getKey();
- try {
- Object value = pairs.getValue();
- savedPropertiesForStat.put(key, value);
- } catch (JSONException e) {
- AppLog.e(AppLog.T.UTILS, e);
- }
- }
- }
- mMixpanel.track(eventName, savedPropertiesForStat);
- removePropertiesForStat(instructions.getStat());
- }
- }
-
- @Override
- public void beginSession() {
- refreshMetadata();
- }
-
- @Override
- public void registerPushNotificationToken(String regId) {
- try {
- mMixpanel.getPeople().setPushRegistrationId(regId);
- } catch (OutOfMemoryError outOfMemoryError) {
- // ignore exception
- }
- }
-
- @Override
- public void endSession() {
- mAggregatedProperties.clear();
- mMixpanel.flush();
- }
-
- @Override
- public void refreshMetadata() {
- // Register super properties
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(WordPress.getContext());
- int sessionCount = preferences.getInt(SESSION_COUNT, 0);
- boolean connected = WordPress.hasDotComToken(WordPress.getContext());
- boolean jetpackUser = WordPress.wpDB.hasAnyJetpackBlogs();
- int numBlogs = WordPress.wpDB.getVisibleAccounts().size();
- try {
- JSONObject properties = new JSONObject();
- properties.put(MIXPANEL_PLATFORM, "Android");
- properties.put(MIXPANEL_SESSION_COUNT, sessionCount);
- properties.put(DOTCOM_USER, connected);
- properties.put(JETPACK_USER, jetpackUser);
- properties.put(MIXPANEL_NUMBER_OF_BLOGS, numBlogs);
- properties.put(VERSION_CODE, PackageUtils.getVersionCode(WordPress.getContext()));
- mMixpanel.registerSuperProperties(properties);
- } catch (JSONException e) {
- AppLog.e(AppLog.T.UTILS, e);
- }
-
- // Application opened and start.
- if (connected) {
- String username = preferences.getString(WordPress.WPCOM_USERNAME_PREFERENCE, null);
- mMixpanel.identify(username);
- try {
- mMixpanel.getPeople().identify(username);
- JSONObject jsonObj = new JSONObject();
- jsonObj.put("$username", username);
- jsonObj.put("$first_name", username);
- mMixpanel.getPeople().set(jsonObj);
- } catch (JSONException e) {
- AppLog.e(AppLog.T.UTILS, e);
- } catch (OutOfMemoryError outOfMemoryError) {
- // ignore exception
- }
-
- retrieveAndRegisterEmailAddressIfApplicable();
- }
- }
-
- @Override
- public void clearAllData() {
- mMixpanel.clearSuperProperties();
- try {
- mMixpanel.getPeople().clearPushRegistrationId();
- } catch (OutOfMemoryError outOfMemoryError) {
- // ignore exception
- }
- }
-
- private AnalyticsTrackerMixpanelInstructionsForStat instructionsForStat(
- AnalyticsTracker.Stat stat) {
- AnalyticsTrackerMixpanelInstructionsForStat instructions = null;
- switch (stat) {
- case APPLICATION_STARTED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Application Started");
- instructions.setSuperPropertyToIncrement("Application Started");
- break;
- case APPLICATION_OPENED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Application Opened");
- instructions.setSuperPropertyToIncrement("Application Opened");
- incrementSessionCount();
- break;
- case APPLICATION_CLOSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Application Closed");
- break;
- case THEMES_ACCESSED_THEMES_BROWSER:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Themes - Accessed Theme Browser");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_theme_browser");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_theme_browser");
- break;
- case THEMES_CHANGED_THEME:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Themes - Changed Theme");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_changed_theme");
- instructions.setCurrentDateForPeopleProperty("last_time_changed_theme");
- break;
- case THEMES_PREVIEWED_SITE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Themes - Previewed Theme for Site");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_previewed_a_theme");
- instructions.setCurrentDateForPeopleProperty("last_time_previewed_a_theme");
- break;
- case READER_ACCESSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Accessed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_reader");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_reader");
- break;
- case READER_OPENED_ARTICLE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Opened Article");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_opened_article");
- instructions.setCurrentDateForPeopleProperty("last_time_opened_reader_article");
- break;
- case READER_LIKED_ARTICLE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Liked Article");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_liked_article");
- instructions.setCurrentDateForPeopleProperty("last_time_liked_reader_article");
- break;
- case READER_REBLOGGED_ARTICLE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Reblogged Article");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_reblogged_article");
- instructions.setCurrentDateForPeopleProperty("last_time_reblogged_article");
- break;
- case READER_INFINITE_SCROLL:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Infinite Scroll");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement(
- "number_of_times_reader_performed_infinite_scroll");
- instructions.setCurrentDateForPeopleProperty("last_time_performed_reader_infinite_scroll");
- break;
- case READER_FOLLOWED_READER_TAG:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Followed Reader Tag");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_followed_reader_tag");
- instructions.setCurrentDateForPeopleProperty("last_time_followed_reader_tag");
- break;
- case READER_UNFOLLOWED_READER_TAG:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Unfollowed Reader Tag");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_unfollowed_reader_tag");
- break;
- case READER_LOADED_TAG:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Loaded Tag");
- break;
- case READER_LOADED_FRESHLY_PRESSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Loaded Freshly Pressed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_loaded_freshly_pressed");
- instructions.setCurrentDateForPeopleProperty("last_time_loaded_freshly_pressed");
- break;
- case READER_COMMENTED_ON_ARTICLE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Commented on Article");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement(
- "number_of_times_commented_on_reader_article");
- instructions.setCurrentDateForPeopleProperty("last_time_commented_on_article");
- break;
- case READER_FOLLOWED_SITE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Followed Site");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_followed_site");
- instructions.setCurrentDateForPeopleProperty("last_time_followed_site");
- break;
- case READER_BLOCKED_BLOG:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Blocked Blog");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_blocked_a_blog");
- instructions.setCurrentDateForPeopleProperty("last_time_blocked_a_blog");
- break;
- case READER_BLOG_PREVIEW:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Blog Preview");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_viewed_blog_preview");
- instructions.setCurrentDateForPeopleProperty("last_time_viewed_blog_preview");
- break;
- case READER_TAG_PREVIEW:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Reader - Tag Preview");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_viewed_tag_preview");
- instructions.setCurrentDateForPeopleProperty("last_time_viewed_tag_preview");
- break;
- case EDITOR_CREATED_POST:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Created Post");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_created_post");
- instructions.setCurrentDateForPeopleProperty("last_time_created_post_in_editor");
- break;
- case EDITOR_SAVED_DRAFT:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Saved Draft");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_saved_draft");
- instructions.setCurrentDateForPeopleProperty("last_time_saved_draft");
- break;
- case EDITOR_CLOSED_POST:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Closed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_closed");
- break;
- case EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Added Photo via Local Library");
- instructions.
- setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_added_photo_via_local_library");
- instructions.setCurrentDateForPeopleProperty("last_time_added_photo_via_local_library_to_post");
- break;
- case EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Added Photo via WP Media Library");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement(
- "number_of_times_added_photo_via_wp_media_library");
- instructions.setCurrentDateForPeopleProperty("last_time_added_photo_via_wp_media_library_to_post");
- break;
- case EDITOR_PUBLISHED_POST:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Published Post");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_published_post");
- instructions.setCurrentDateForPeopleProperty("last_time_published_post");
- break;
- case EDITOR_UPDATED_POST:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Updated Post");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_updated_post");
- instructions.setCurrentDateForPeopleProperty("last_time_updated_post");
- break;
- case EDITOR_SCHEDULED_POST:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Scheduled Post");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_scheduled_post");
- instructions.setCurrentDateForPeopleProperty("last_time_scheduled_post");
- break;
- case EDITOR_PUBLISHED_POST_WITH_PHOTO:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_posts_published_with_photos");
- instructions.setCurrentDateForPeopleProperty("last_time_published_post_with_photo");
- break;
- case EDITOR_PUBLISHED_POST_WITH_VIDEO:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_posts_published_with_videos");
- instructions.setCurrentDateForPeopleProperty("last_time_published_post_with_video");
- break;
- case EDITOR_PUBLISHED_POST_WITH_CATEGORIES:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_posts_published_with_categories");
- instructions.setCurrentDateForPeopleProperty("last_time_published_post_with_categories");
- break;
- case EDITOR_PUBLISHED_POST_WITH_TAGS:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_posts_published_with_tags");
- instructions.setCurrentDateForPeopleProperty("last_time_published_post_with_tags");
- break;
- case EDITOR_TAPPED_BLOCKQUOTE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Blockquote Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_blockquote");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_blockquote_in_editor");
- break;
- case EDITOR_TAPPED_BOLD:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Bold Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_bold");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_bold_in_editor");
- break;
- case EDITOR_TAPPED_IMAGE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Image Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_image");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_image_in_editor");
- break;
- case EDITOR_TAPPED_ITALIC:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Italics Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_italic");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_italic_in_editor");
- break;
- case EDITOR_TAPPED_LINK:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Link Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_link");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_link_in_editor");
- break;
- case EDITOR_TAPPED_MORE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped More Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_more");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_more_in_editor");
- break;
- case EDITOR_TAPPED_STRIKETHROUGH:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Strikethrough Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_strikethrough");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_strikethrough_in_editor");
- break;
- case EDITOR_TAPPED_UNDERLINE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Editor - Tapped Underline Button");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_editor_tapped_underline");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_underline_in_editor");
- break;
- case NOTIFICATIONS_ACCESSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Notifications - Accessed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_notifications");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_notifications");
- break;
- case NOTIFICATIONS_OPENED_NOTIFICATION_DETAILS:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Notifications - Opened Notification Details");
- instructions.
- setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_opened_notification_details");
- instructions.setCurrentDateForPeopleProperty("last_time_opened_notification_details");
- break;
- case NOTIFICATION_APPROVED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_notifications_approved");
- break;
- case NOTIFICATION_UNAPPROVED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_notifications_unapproved");
- break;
- case NOTIFICATION_REPLIED_TO:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_notifications_replied_to");
- break;
- case NOTIFICATION_TRASHED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_notifications_trashed");
- break;
- case NOTIFICATION_FLAGGED_AS_SPAM:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(
- "number_of_notifications_flagged_as_spam");
- break;
- case NOTIFICATION_LIKED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Notifications - Liked Comment");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_comment_likes_from_notification");
- break;
- case NOTIFICATION_UNLIKED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Notifications - Unliked Comment");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_comment_unlikes_from_notification");
- break;
- case OPENED_POSTS:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened Posts");
- break;
- case OPENED_PAGES:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened Pages");
- break;
- case OPENED_COMMENTS:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened Comments");
- break;
- case OPENED_VIEW_SITE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened View Site");
- break;
- case OPENED_VIEW_ADMIN:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened View Admin");
- break;
- case OPENED_MEDIA_LIBRARY:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened Media Library");
- break;
- case OPENED_SETTINGS:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Site Menu - Opened Settings");
- break;
- case CREATED_ACCOUNT:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Created Account");
- instructions.setCurrentDateForPeopleProperty("$created");
- instructions.addSuperPropertyToFlag("created_account_on_mobile");
- break;
- case SHARED_ITEM:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor("number_of_items_shared");
- break;
- case ADDED_SELF_HOSTED_SITE:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Added Self Hosted Site");
- instructions.setCurrentDateForPeopleProperty("last_time_added_self_hosted_site");
- break;
- case SIGNED_IN:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Signed In");
- break;
- case SIGNED_INTO_JETPACK:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Signed into Jetpack");
- instructions.addSuperPropertyToFlag("jetpack_user");
- instructions.addSuperPropertyToFlag("dotcom_user");
- break;
- case PERFORMED_JETPACK_SIGN_IN_FROM_STATS_SCREEN:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Signed into Jetpack from Stats Screen");
- break;
- case STATS_ACCESSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Stats - Accessed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_stats");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_stats");
- break;
- case STATS_VIEW_ALL_ACCESSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Stats - View All Accessed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_view_all_screen_stats");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_view_all_screen_stats");
- break;
- case STATS_SINGLE_POST_ACCESSED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Stats - Single Post Accessed");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_single_post_screen_stats");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_single_post_screen_stats");
- break;
- case STATS_OPENED_WEB_VERSION:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Stats - Opened Web Version");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_accessed_web_version_of_stats");
- instructions.setCurrentDateForPeopleProperty("last_time_accessed_web_version_of_stats");
- break;
- case STATS_TAPPED_BAR_CHART:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Stats - Tapped Bar Chart");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_tapped_stats_bar_chart");
- instructions.setCurrentDateForPeopleProperty("last_time_tapped_stats_bar_chart");
- break;
- case STATS_SCROLLED_TO_BOTTOM:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Stats - Scrolled to Bottom");
- instructions.setSuperPropertyAndPeoplePropertyToIncrement("number_of_times_scrolled_to_bottom_of_stats");
- instructions.setCurrentDateForPeopleProperty("last_time_scrolled_to_bottom_of_stats");
- break;
- case STATS_SELECTED_INSTALL_JETPACK:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Selected Install Jetpack");
- break;
- case PUSH_NOTIFICATION_RECEIVED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Push Notification Received");
- break;
- case SUPPORT_OPENED_HELPSHIFT_SCREEN:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Support - Opened Helpshift Screen");
- instructions.addSuperPropertyToFlag("opened_helpshift_screen");
- break;
- case LOGIN_FAILED:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Login - Failed Login");
- break;
- case LOGIN_FAILED_TO_GUESS_XMLRPC:
- instructions = AnalyticsTrackerMixpanelInstructionsForStat.
- mixpanelInstructionsForEventName("Login - Failed To Guess XMLRPC");
- break;
- default:
- instructions = null;
- break;
- }
- return instructions;
- }
-
- private void incrementPeopleProperty(String property) {
- try {
- mMixpanel.getPeople().increment(property, 1);
- } catch (OutOfMemoryError outOfMemoryError) {
- // ignore exception
- }
- }
-
- private void incrementSuperProperty(String property) {
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(WordPress.getContext());
- int propertyCount = preferences.getInt(property, 0);
- propertyCount++;
- SharedPreferences.Editor editor = preferences.edit();
- editor.putInt(property, propertyCount);
- editor.commit();
-
- try {
- JSONObject superProperties = mMixpanel.getSuperProperties();
- superProperties.put(property, propertyCount);
- mMixpanel.registerSuperProperties(superProperties);
- } catch (JSONException e) {
- AppLog.e(AppLog.T.UTILS, e);
- }
- }
-
- private void flagSuperProperty(String property) {
- try {
- JSONObject superProperties = mMixpanel.getSuperProperties();
- superProperties.put(property, true);
- mMixpanel.registerSuperProperties(superProperties);
- } catch (JSONException e) {
- AppLog.e(AppLog.T.UTILS, e);
- }
- }
-
- private void savePropertyValueForStat(String property, Object value, AnalyticsTracker.Stat stat) {
- JSONObject properties = mAggregatedProperties.get(stat);
- if (properties == null) {
- properties = new JSONObject();
- mAggregatedProperties.put(stat, properties);
- }
-
- try {
- properties.put(property, value);
- } catch (JSONException e) {
- AppLog.e(AppLog.T.UTILS, e);
- }
- }
-
- private JSONObject propertiesForStat(AnalyticsTracker.Stat stat) {
- return mAggregatedProperties.get(stat);
- }
-
- private void removePropertiesForStat(AnalyticsTracker.Stat stat) {
- mAggregatedProperties.remove(stat);
- }
-
- private Object propertyForStat(String property, AnalyticsTracker.Stat stat) {
- JSONObject properties = mAggregatedProperties.get(stat);
- if (properties == null) {
- return null;
- }
-
- try {
- Object valueForProperty = properties.get(property);
- return valueForProperty;
- } catch (JSONException e) {
- // We are okay with swallowing this exception as the next line will just return a null value
- }
-
- return null;
- }
-
- private void incrementProperty(String property, AnalyticsTracker.Stat stat) {
- Object currentValueObj = propertyForStat(property, stat);
- int currentValue = 1;
- if (currentValueObj != null) {
- currentValue = Integer.valueOf(currentValueObj.toString());
- currentValue++;
- }
-
- savePropertyValueForStat(property, Integer.toString(currentValue), stat);
- }
-
- private void incrementSessionCount() {
- // Tracking session count will help us isolate users who just installed the app
- SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(WordPress.getContext());
- int sessionCount = preferences.getInt(SESSION_COUNT, 0);
- sessionCount++;
- SharedPreferences.Editor editor = preferences.edit();
- editor.putInt(SESSION_COUNT, sessionCount);
- editor.commit();
- }
-}
-
diff --git a/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanelInstructionsForStat.java b/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanelInstructionsForStat.java
deleted file mode 100644
index 38aefa988..000000000
--- a/WordPress/src/main/java/org/wordpress/android/analytics/AnalyticsTrackerMixpanelInstructionsForStat.java
+++ /dev/null
@@ -1,140 +0,0 @@
-package org.wordpress.android.analytics;
-
-import java.text.DateFormat;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-
-public class AnalyticsTrackerMixpanelInstructionsForStat {
- private String mMixpanelEventName;
- private String mSuperPropertyToIncrement;
- private String mPeoplePropertyToIncrement;
- private ArrayList<String> mSuperPropertiesToFlag;
- private AnalyticsTracker.Stat mStatToAttachProperty;
- private AnalyticsTracker.Stat mStat;
- private String mPropertyToIncrement;
- private boolean mDisableForSelfHosted;
- private Map<String, Object> mPeoplePropertiesToAssign;
-
- public AnalyticsTrackerMixpanelInstructionsForStat() {
- mSuperPropertiesToFlag = new ArrayList<String>();
- mPeoplePropertiesToAssign = new HashMap<String, Object>();
- }
-
- public static AnalyticsTrackerMixpanelInstructionsForStat mixpanelInstructionsForEventName(String eventName) {
- AnalyticsTrackerMixpanelInstructionsForStat instructions = new AnalyticsTrackerMixpanelInstructionsForStat();
- instructions.setMixpanelEventName(eventName);
- return instructions;
- }
-
- public static AnalyticsTrackerMixpanelInstructionsForStat
- mixpanelInstructionsWithSuperPropertyAndPeoplePropertyIncrementor(String property) {
- AnalyticsTrackerMixpanelInstructionsForStat instructions = new AnalyticsTrackerMixpanelInstructionsForStat();
- instructions.setSuperPropertyAndPeoplePropertyToIncrement(property);
- return instructions;
- }
-
- public static AnalyticsTrackerMixpanelInstructionsForStat mixpanelInstructionsWithPropertyIncrementor(
- String property, AnalyticsTracker.Stat stat) {
- AnalyticsTrackerMixpanelInstructionsForStat instructions = new AnalyticsTrackerMixpanelInstructionsForStat();
- instructions.setStatToAttachProperty(stat);
- instructions.setPropertyToIncrement(property);
- return instructions;
- }
-
- public String getMixpanelEventName() {
- return mMixpanelEventName;
- }
-
- public void setMixpanelEventName(String mixpanelEventName) {
- this.mMixpanelEventName = mixpanelEventName;
- }
-
- public String getSuperPropertyToIncrement() {
- return mSuperPropertyToIncrement;
- }
-
- public void setSuperPropertyToIncrement(String superPropertyToIncrement) {
- this.mSuperPropertyToIncrement = superPropertyToIncrement;
- }
-
- public String getPeoplePropertyToIncrement() {
- return mPeoplePropertyToIncrement;
- }
-
- public void setPeoplePropertyToIncrement(String peoplePropertyToIncrement) {
- this.mPeoplePropertyToIncrement = peoplePropertyToIncrement;
- }
-
- public void setSuperPropertyAndPeoplePropertyToIncrement(String property) {
- setSuperPropertyToIncrement(property);
- setPeoplePropertyToIncrement(property);
- }
-
- public AnalyticsTracker.Stat getStatToAttachProperty() {
- return mStatToAttachProperty;
- }
-
- public void setStatToAttachProperty(AnalyticsTracker.Stat statToAttachProperty) {
- this.mStatToAttachProperty = statToAttachProperty;
- }
-
- public String getPropertyToIncrement() {
- return mPropertyToIncrement;
- }
-
- public void setPropertyToIncrement(String propertyToIncrement) {
- this.mPropertyToIncrement = propertyToIncrement;
- }
-
- public boolean getDisableForSelfHosted() {
- return mDisableForSelfHosted;
- }
-
- public void setDisableForSelfHosted(boolean disableForSelfHosted) {
- this.mDisableForSelfHosted = disableForSelfHosted;
- }
-
- public AnalyticsTracker.Stat getStat() {
- return mStat;
- }
-
- public void setStat(AnalyticsTracker.Stat stat) {
- this.mStat = stat;
- }
-
- public ArrayList<String> getSuperPropertiesToFlag() {
- return mSuperPropertiesToFlag;
- }
-
- public void addSuperPropertyToFlag(String superPropertyToFlag) {
- if (!mSuperPropertiesToFlag.contains(superPropertyToFlag)) {
- mSuperPropertiesToFlag.add(superPropertyToFlag);
- }
- }
-
- private static final ThreadLocal<DateFormat> AnalyticsDateFormat = new ThreadLocal<DateFormat>() {
- @Override
- protected DateFormat initialValue() {
- DateFormat format = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'", Locale.US);
- format.setTimeZone(TimeZone.getTimeZone("UTC"));
- return format;
- }
- };
-
- public void setCurrentDateForPeopleProperty(String property) {
- setPeoplePropertyToValue(property, AnalyticsDateFormat.get().format(new Date()));
- }
-
- public void setPeoplePropertyToValue(String property, Object value) {
- mPeoplePropertiesToAssign.put(property, value);
- }
-
- public Map<String, Object> getPeoplePropertiesToAssign() {
- return mPeoplePropertiesToAssign;
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Comment.java b/WordPress/src/main/java/org/wordpress/android/models/Comment.java
index 0298c6c06..8058ee1b9 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Comment.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Comment.java
@@ -9,7 +9,7 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.util.DateTimeUtils;
import org.wordpress.android.util.GravatarUtils;
import org.wordpress.android.util.HtmlUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
public class Comment {
@@ -61,13 +61,13 @@ public class Comment {
Comment comment = new Comment();
comment.commentID = json.optLong("ID");
- comment.status = JSONUtil.getString(json, "status");
- comment.published = JSONUtil.getString(json, "date");
+ comment.status = JSONUtils.getString(json, "status");
+ comment.published = JSONUtils.getString(json, "date");
// note that the content often contains html, and on rare occasions may contain
// script blocks that need to be removed (only seen with blogs that use the
// sociable plugin)
- comment.comment = HtmlUtils.stripScript(JSONUtil.getString(json, "content"));
+ comment.comment = HtmlUtils.stripScript(JSONUtils.getString(json, "content"));
JSONObject jsonPost = json.optJSONObject("post");
if (jsonPost != null) {
@@ -78,15 +78,15 @@ public class Comment {
JSONObject jsonAuthor = json.optJSONObject("author");
if (jsonAuthor!=null) {
// author names may contain html entities (esp. pingbacks)
- comment.authorName = JSONUtil.getStringDecoded(jsonAuthor, "name");
- comment.authorUrl = JSONUtil.getString(jsonAuthor, "URL");
+ comment.authorName = JSONUtils.getStringDecoded(jsonAuthor, "name");
+ comment.authorUrl = JSONUtils.getString(jsonAuthor, "URL");
// email address will be set to "false" when there isn't an email address
- comment.authorEmail = JSONUtil.getString(jsonAuthor, "email");
+ comment.authorEmail = JSONUtils.getString(jsonAuthor, "email");
if (comment.authorEmail.equals("false"))
comment.authorEmail = "";
- comment.profileImageUrl = JSONUtil.getString(jsonAuthor, "avatar_URL");
+ comment.profileImageUrl = JSONUtils.getString(jsonAuthor, "avatar_URL");
}
return comment;
diff --git a/WordPress/src/main/java/org/wordpress/android/models/MediaFile.java b/WordPress/src/main/java/org/wordpress/android/models/MediaFile.java
deleted file mode 100644
index 767c055d4..000000000
--- a/WordPress/src/main/java/org/wordpress/android/models/MediaFile.java
+++ /dev/null
@@ -1,347 +0,0 @@
-package org.wordpress.android.models;
-
-import android.text.TextUtils;
-import android.webkit.MimeTypeMap;
-
-import org.wordpress.android.WordPress;
-import org.wordpress.android.util.MapUtils;
-import org.wordpress.android.util.StringUtils;
-
-import java.util.Date;
-import java.util.Map;
-
-public class MediaFile {
- protected int id;
- protected long postID;
- protected String filePath = null; //path of the file into disk
- protected String fileName = null; //name of the file into the server
- protected String title = null;
- protected String description = null;
- protected String caption = null;
- protected int horizontalAlignment; //0 = none, 1 = left, 2 = center, 3 = right
- protected boolean verticalAligment = false; //false = bottom, true = top
- protected int width = 500, height;
- protected String mimeType = "";
- protected String videoPressShortCode = null;
- protected boolean featured = false;
- protected boolean isVideo = false;
- protected boolean featuredInPost;
- protected String fileURL = null; // url of the file to download
- protected String thumbnailURL = null; // url of the thumbnail to download
- private String blogId;
- private long dateCreatedGmt;
- private String uploadState = null;
- private String mediaId;
-
- public static String VIDEOPRESS_SHORTCODE_ID = "videopress_shortcode";
-
- public MediaFile(String blogId, Map<?, ?> resultMap) {
- boolean isDotCom = (WordPress.getCurrentBlog() != null && WordPress.getCurrentBlog().isDotcomFlag());
-
- setBlogId(blogId);
- setMediaId(MapUtils.getMapStr(resultMap, "attachment_id"));
- setPostID(MapUtils.getMapLong(resultMap, "parent"));
- setTitle(MapUtils.getMapStr(resultMap, "title"));
- setCaption(MapUtils.getMapStr(resultMap, "caption"));
- setDescription(MapUtils.getMapStr(resultMap, "description"));
- setVideoPressShortCode(MapUtils.getMapStr(resultMap, VIDEOPRESS_SHORTCODE_ID));
-
- // get the file name from the link
- String link = MapUtils.getMapStr(resultMap, "link");
- setFileName(new String(link).replaceAll("^.*/([A-Za-z0-9_-]+)\\.\\w+$", "$1"));
-
- String fileType = new String(link).replaceAll(".*\\.(\\w+)$", "$1").toLowerCase();
- String fileMimeType = MimeTypeMap.getSingleton().getMimeTypeFromExtension(fileType);
- setMimeType(fileMimeType);
-
- // make the file urls be https://... so that we can get these images with oauth when the blogs are private
- // assume no https for images in self-hosted blogs
- String fileUrl = MapUtils.getMapStr(resultMap, "link");
- if (isDotCom)
- fileUrl = fileUrl.replace("http:", "https:");
- setFileURL(fileUrl);
-
- String thumbnailURL = MapUtils.getMapStr(resultMap, "thumbnail");
- if (thumbnailURL.startsWith("http")) {
- if (isDotCom)
- thumbnailURL = thumbnailURL.replace("http:", "https:");
- setThumbnailURL(thumbnailURL);
- }
-
- Date date = MapUtils.getMapDate(resultMap, "date_created_gmt");
- if (date != null)
- setDateCreatedGMT(date.getTime());
-
- Object meta = resultMap.get("metadata");
- if(meta != null && meta instanceof Map) {
- Map<?, ?> metadata = (Map<?, ?>) meta;
- setWidth(MapUtils.getMapInt(metadata, "width"));
- setHeight(MapUtils.getMapInt(metadata, "height"));
- }
- }
-
- public MediaFile() {
- // default constructor
- }
-
- public MediaFile(MediaFile mediaFile) {
- this.id = mediaFile.id;
- this.postID = mediaFile.postID;
- this.filePath = mediaFile.filePath;
- this.fileName = mediaFile.fileName;
- this.title = mediaFile.title;
- this.description = mediaFile.description;
- this.caption = mediaFile.caption;
- this.horizontalAlignment = mediaFile.horizontalAlignment;
- this.verticalAligment = mediaFile.verticalAligment;
- this.width = mediaFile.width;
- this.height = mediaFile.height;
- this.mimeType = mediaFile.mimeType;
- this.videoPressShortCode = mediaFile.videoPressShortCode;
- this.featured = mediaFile.featured;
- this.isVideo = mediaFile.isVideo;
- this.featuredInPost = mediaFile.featuredInPost;
- this.fileURL = mediaFile.fileURL;
- this.thumbnailURL = mediaFile.thumbnailURL;
- this.blogId = mediaFile.blogId;
- this.dateCreatedGmt = mediaFile.dateCreatedGmt;
- this.uploadState = mediaFile.uploadState;
- this.mediaId = mediaFile.mediaId;
- }
-
-
- public int getId() {
- return id;
- }
-
- public void setId(int id) {
- this.id = id;
- }
-
- public String getMediaId() {
- return mediaId;
- }
-
- public void setMediaId(String id) {
- mediaId = id;
- }
-
- public boolean isFeatured() {
- return featured;
- }
-
- public void setFeatured(boolean featured) {
- this.featured = featured;
- }
-
- public long getPostID() {
- return postID;
- }
-
- public void setPostID(long postID) {
- this.postID = postID;
- }
-
- public String getFilePath() {
- return filePath;
- }
-
- public void setFilePath(String filePath) {
- this.filePath = filePath;
- }
-
- public String getTitle() {
- return title;
- }
-
- public void setTitle(String title) {
- this.title = title;
- }
-
- public String getCaption() {
- return caption;
- }
-
- public void setCaption(String caption) {
- this.caption = caption;
- }
-
- public String getDescription() {
- return description;
- }
-
- public void setDescription(String description) {
- this.description = description;
- }
-
- public String getFileURL() {
- return fileURL;
- }
-
- public void setFileURL(String fileURL) {
- this.fileURL = fileURL;
- }
-
- public String getThumbnailURL() {
- return thumbnailURL;
- }
-
- public void setThumbnailURL(String thumbnailURL) {
- this.thumbnailURL = thumbnailURL;
- }
-
- public boolean isVerticalAlignmentOnTop() {
- return verticalAligment;
- }
-
- public void setVerticalAlignmentOnTop(boolean verticalAligment) {
- this.verticalAligment = verticalAligment;
- }
-
- public int getWidth() {
- return width;
- }
-
- public void setWidth(int width) {
- this.width = width;
- }
-
- public int getHeight() {
- return height;
- }
-
- public void setHeight(int height) {
- this.height = height;
- }
-
- public String getFileName() {
- return fileName;
- }
-
- public void setFileName(String fileName) {
- this.fileName = fileName;
- }
-
- public String getMimeType() {
- return StringUtils.notNullStr(mimeType);
- }
-
- public void setMimeType(String type) {
- mimeType = StringUtils.notNullStr(type);
- }
-
- public String getVideoPressShortCode() {
- return videoPressShortCode;
- }
-
- public void setVideoPressShortCode(String videoPressShortCode) {
- this.videoPressShortCode = videoPressShortCode;
- }
-
- public int getHorizontalAlignment() {
- return horizontalAlignment;
- }
-
- public void setHorizontalAlignment(int horizontalAlignment) {
- this.horizontalAlignment = horizontalAlignment;
- }
-
- public boolean isVideo() {
- return isVideo;
- }
-
- public void setVideo(boolean isVideo) {
- this.isVideo = isVideo;
- }
-
- public boolean isFeaturedInPost() {
- return featuredInPost;
- }
-
- public void setFeaturedInPost(boolean featuredInPost) {
- this.featuredInPost = featuredInPost;
- }
-
- public void save() {
- WordPress.wpDB.saveMediaFile(this);
- }
-
- public String getBlogId() {
- return blogId;
- }
-
- public void setBlogId(String blogId) {
- this.blogId = blogId;
-
- }
-
- public void setDateCreatedGMT(long date_created_gmt) {
- this.dateCreatedGmt = date_created_gmt;
- }
-
-
- public long getDateCreatedGMT() {
- return dateCreatedGmt;
- }
-
- public void setUploadState(String uploadState) {
- this.uploadState = uploadState;
- }
-
- public String getUploadState() {
- return uploadState;
- }
-
- /**
- * Outputs the Html for an image
- * If a fullSizeUrl exists, a link will be created to it from the resizedPictureUrl
- */
- public String getImageHtmlForUrls(String fullSizeUrl, String resizedPictureURL, boolean shouldAddImageWidthCSS) {
- String alignment = "";
- switch (getHorizontalAlignment()) {
- case 0:
- alignment = "alignnone";
- break;
- case 1:
- alignment = "alignleft";
- break;
- case 2:
- alignment = "aligncenter";
- break;
- case 3:
- alignment = "alignright";
- break;
- }
-
- String alignmentCSS = "class=\"" + alignment + " size-full\" ";
-
- if (shouldAddImageWidthCSS) {
- alignmentCSS += "style=\"max-width: " + getWidth() + "px\" ";
- }
-
- // Check if we uploaded a featured picture that is not added to the Post content (normal case)
- if ((fullSizeUrl != null && fullSizeUrl.equalsIgnoreCase("")) ||
- (resizedPictureURL != null && resizedPictureURL.equalsIgnoreCase(""))) {
- return ""; // Not featured in Post. Do not add to the content.
- }
-
- if (fullSizeUrl == null && resizedPictureURL != null) {
- fullSizeUrl = resizedPictureURL;
- } else if (fullSizeUrl != null && resizedPictureURL == null) {
- resizedPictureURL = fullSizeUrl;
- }
-
- String mediaTitle = StringUtils.notNullStr(getTitle());
-
- String content = String.format("<a href=\"%s\"><img title=\"%s\" %s alt=\"image\" src=\"%s\" /></a>",
- fullSizeUrl, mediaTitle, alignmentCSS, resizedPictureURL);
-
- if (!TextUtils.isEmpty(getCaption())) {
- content = String.format("[caption id=\"\" align=\"%s\" width=\"%d\" caption=\"%s\"]%s[/caption]",
- alignment, getWidth(), TextUtils.htmlEncode(getCaption()), content);
- }
-
- return content;
- }
-}
-
diff --git a/WordPress/src/main/java/org/wordpress/android/models/MediaGallery.java b/WordPress/src/main/java/org/wordpress/android/models/MediaGallery.java
deleted file mode 100644
index 4b4339e4f..000000000
--- a/WordPress/src/main/java/org/wordpress/android/models/MediaGallery.java
+++ /dev/null
@@ -1,85 +0,0 @@
-
-package org.wordpress.android.models;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-
-/**
- * A model representing a Media Gallery.
- * A unique id is not used on the website, but only in this app.
- * It is used to uniquely determining the instance of the object, as it is
- * passed between post and media gallery editor.
- */
-public class MediaGallery implements Serializable{
- private static final long serialVersionUID = 2359176987182027508L;
-
- private long uniqueId;
- private boolean isRandom;
- private String type;
- private int numColumns;
- private ArrayList<String> ids;
-
- public MediaGallery(boolean isRandom, String type, int numColumns, ArrayList<String> ids) {
- this.isRandom = isRandom;
- this.type = type;
- this.numColumns = numColumns;
- this.ids = ids;
- this.uniqueId = System.currentTimeMillis();
- }
-
- public MediaGallery() {
- isRandom = false;
- type = "";
- numColumns = 3;
- ids = new ArrayList<String>();
- this.uniqueId = System.currentTimeMillis();
- }
-
- public boolean isRandom() {
- return isRandom;
- }
-
- public void setRandom(boolean isRandom) {
- this.isRandom = isRandom;
- }
-
- public String getType() {
- return type;
- }
-
- public void setType(String type) {
- this.type = type;
- }
-
- public int getNumColumns() {
- return numColumns;
- }
-
- public void setNumColumns(int numColumns) {
- this.numColumns = numColumns;
- }
-
- public ArrayList<String> getIds() {
- return ids;
- }
-
- public String getIdsStr() {
- String ids_str = "";
- if (ids.size() > 0) {
- for (String id : ids) {
- ids_str += id + ",";
- }
- ids_str = ids_str.substring(0, ids_str.length() - 1);
- }
- return ids_str;
- }
-
- public void setIds(ArrayList<String> ids) {
- this.ids = ids;
- }
-
- /** An id to uniquely identify a media gallery object, so that the same object can be edited in the post editor **/
- public long getUniqueId() {
- return uniqueId;
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Note.java b/WordPress/src/main/java/org/wordpress/android/models/Note.java
index ef3ed3fd2..7d35c1264 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Note.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Note.java
@@ -17,7 +17,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.ui.notifications.utils.NotificationsUtils;
import org.wordpress.android.util.DateTimeUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
import java.util.ArrayList;
@@ -102,7 +102,7 @@ public class Note extends Syncable {
public Boolean isCommentType() {
synchronized (mSyncLock) {
- return (isAutomattcherType() && JSONUtil.queryJSON(mNoteJSON, "meta.ids.comment", -1) != -1) ||
+ return (isAutomattcherType() && JSONUtils.queryJSON(mNoteJSON, "meta.ids.comment", -1) != -1) ||
isType(NOTE_COMMENT_TYPE);
}
}
@@ -150,7 +150,7 @@ public class Note extends Syncable {
synchronized (mSyncLock) {
JSONArray subjectArray = mNoteJSON.optJSONArray("subject");
if (subjectArray != null) {
- String commentSubject = JSONUtil.queryJSON(subjectArray, "subject[1].text", "");
+ String commentSubject = JSONUtils.queryJSON(subjectArray, "subject[1].text", "");
// Trim down the comment preview if the comment text is too large.
if (commentSubject != null && commentSubject.length() > MAX_COMMENT_PREVIEW_LENGTH) {
@@ -258,8 +258,8 @@ public class Note extends Syncable {
try {
JSONObject bodyItem = bodyArray.getJSONObject(i);
if (bodyItem.has("type") && bodyItem.optString("type").equals("comment")
- && commentId == JSONUtil.queryJSON(bodyItem, "meta.ids.comment", 0)) {
- mActions = JSONUtil.queryJSON(bodyItem, "actions", new JSONObject());
+ && commentId == JSONUtils.queryJSON(bodyItem, "meta.ids.comment", 0)) {
+ mActions = JSONUtils.queryJSON(bodyItem, "actions", new JSONObject());
break;
}
} catch (JSONException e) {
@@ -334,7 +334,7 @@ public class Note extends Syncable {
private <U> U queryJSON(String query, U defaultObject) {
synchronized (mSyncLock) {
if (mNoteJSON == null) return defaultObject;
- return JSONUtil.queryJSON(mNoteJSON, query, defaultObject);
+ return JSONUtils.queryJSON(mNoteJSON, query, defaultObject);
}
}
@@ -384,7 +384,7 @@ public class Note extends Syncable {
try {
JSONObject bodyItem = bodyArray.getJSONObject(i);
if (bodyItem.has("type") && bodyItem.optString("type").equals("user")) {
- return JSONUtil.queryJSON(bodyItem, "meta.links.home", "");
+ return JSONUtils.queryJSON(bodyItem, "meta.links.home", "");
}
} catch (JSONException e) {
return "";
@@ -510,4 +510,4 @@ public class Note extends Syncable {
note.updateJSON(properties);
}
}
-} \ No newline at end of file
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java
index 0f6d74da4..660b43d6f 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderBlog.java
@@ -3,7 +3,7 @@ package org.wordpress.android.models;
import android.text.TextUtils;
import org.json.JSONObject;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.UrlUtils;
@@ -31,39 +31,39 @@ public class ReaderBlog {
// if meta/data/site exists then JSON is for a read/following/mine?meta=site subscription,
// if meta/data/feed exists then JSON is for a read/following/mine?meta=feed subscription,
// otherwise JSON the response for a single site/$siteId or read/feed/$feedId
- JSONObject jsonSite = JSONUtil.getJSONChild(json, "meta/data/site");
- JSONObject jsonFeed = JSONUtil.getJSONChild(json, "meta/data/feed");
+ JSONObject jsonSite = JSONUtils.getJSONChild(json, "meta/data/site");
+ JSONObject jsonFeed = JSONUtils.getJSONChild(json, "meta/data/feed");
if (jsonSite != null) {
blog.blogId = jsonSite.optLong("ID");
- blog.setName(JSONUtil.getStringDecoded(jsonSite, "name"));
- blog.setDescription(JSONUtil.getStringDecoded(jsonSite, "description"));
- blog.setUrl(JSONUtil.getString(jsonSite, "URL"));
- blog.isJetpack = JSONUtil.getBool(jsonSite, "jetpack");
- blog.isPrivate = JSONUtil.getBool(jsonSite, "is_private");
- blog.isFollowing = JSONUtil.getBool(jsonSite, "is_following");
+ blog.setName(JSONUtils.getStringDecoded(jsonSite, "name"));
+ blog.setDescription(JSONUtils.getStringDecoded(jsonSite, "description"));
+ blog.setUrl(JSONUtils.getString(jsonSite, "URL"));
+ blog.isJetpack = JSONUtils.getBool(jsonSite, "jetpack");
+ blog.isPrivate = JSONUtils.getBool(jsonSite, "is_private");
+ blog.isFollowing = JSONUtils.getBool(jsonSite, "is_following");
blog.numSubscribers = jsonSite.optInt("subscribers_count");
JSONObject jsonIcon = jsonSite.optJSONObject("icon");
if (jsonIcon != null) {
- blog.setImageUrl(JSONUtil.getString(jsonIcon, "img"));
+ blog.setImageUrl(JSONUtils.getString(jsonIcon, "img"));
}
} else if (jsonFeed != null) {
blog.feedId = jsonFeed.optLong("feed_ID");
- blog.setFeedUrl(JSONUtil.getString(jsonFeed, "feed_URL"));
- blog.setName(JSONUtil.getStringDecoded(jsonFeed, "name"));
- blog.setUrl(JSONUtil.getString(jsonFeed, "URL"));
+ blog.setFeedUrl(JSONUtils.getString(jsonFeed, "feed_URL"));
+ blog.setName(JSONUtils.getStringDecoded(jsonFeed, "name"));
+ blog.setUrl(JSONUtils.getString(jsonFeed, "URL"));
blog.numSubscribers = jsonFeed.optInt("subscribers_count");
// read/following/mine doesn't include is_following for feeds, so assume to be true
blog.isFollowing = true;
} else {
blog.blogId = json.optLong("ID");
blog.feedId = json.optLong("feed_ID");
- blog.setName(JSONUtil.getStringDecoded(json, "name"));
- blog.setDescription(JSONUtil.getStringDecoded(json, "description"));
- blog.setUrl(JSONUtil.getString(json, "URL"));
- blog.setFeedUrl(JSONUtil.getString(json, "feed_URL"));
- blog.isJetpack = JSONUtil.getBool(json, "jetpack");
- blog.isPrivate = JSONUtil.getBool(json, "is_private");
- blog.isFollowing = JSONUtil.getBool(json, "is_following");
+ blog.setName(JSONUtils.getStringDecoded(json, "name"));
+ blog.setDescription(JSONUtils.getStringDecoded(json, "description"));
+ blog.setUrl(JSONUtils.getString(json, "URL"));
+ blog.setFeedUrl(JSONUtils.getString(json, "feed_URL"));
+ blog.isJetpack = JSONUtils.getBool(json, "jetpack");
+ blog.isPrivate = JSONUtils.getBool(json, "is_private");
+ blog.isFollowing = JSONUtils.getBool(json, "is_following");
blog.numSubscribers = json.optInt("subscribers_count");
}
@@ -72,11 +72,11 @@ public class ReaderBlog {
blog.blogId = blog.feedId;
}
- JSONObject jsonIcon = JSONUtil.getJSONChild(json, "icon");
+ JSONObject jsonIcon = JSONUtils.getJSONChild(json, "icon");
if (jsonIcon != null) {
- blog.setImageUrl(JSONUtil.getString(jsonIcon, "img"));
+ blog.setImageUrl(JSONUtils.getString(jsonIcon, "img"));
if (!blog.hasImageUrl()) {
- blog.setImageUrl(JSONUtil.getString(jsonIcon, "ico"));
+ blog.setImageUrl(JSONUtils.getString(jsonIcon, "ico"));
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java
index 2dd6c0a60..4eadf451e 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderComment.java
@@ -5,7 +5,7 @@ import android.text.TextUtils;
import org.json.JSONObject;
import org.wordpress.android.util.DateTimeUtils;
import org.wordpress.android.util.HtmlUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
public class ReaderComment {
@@ -43,12 +43,12 @@ public class ReaderComment {
comment.blogId = blogId;
comment.commentId = json.optLong("ID");
- comment.status = JSONUtil.getString(json, "status");
+ comment.status = JSONUtils.getString(json, "status");
// note that content may contain html, adapter needs to handle it
- comment.text = HtmlUtils.stripScript(JSONUtil.getString(json, "content"));
+ comment.text = HtmlUtils.stripScript(JSONUtils.getString(json, "content"));
- comment.published = JSONUtil.getString(json, "date");
+ comment.published = JSONUtils.getString(json, "date");
comment.timestamp = DateTimeUtils.iso8601ToTimestamp(comment.published);
JSONObject jsonPost = json.optJSONObject("post");
@@ -59,9 +59,9 @@ public class ReaderComment {
JSONObject jsonAuthor = json.optJSONObject("author");
if (jsonAuthor!=null) {
// author names may contain html entities (esp. pingbacks)
- comment.authorName = JSONUtil.getStringDecoded(jsonAuthor, "name");
- comment.authorAvatar = JSONUtil.getString(jsonAuthor, "avatar_URL");
- comment.authorUrl = JSONUtil.getString(jsonAuthor, "URL");
+ comment.authorName = JSONUtils.getStringDecoded(jsonAuthor, "name");
+ comment.authorAvatar = JSONUtils.getString(jsonAuthor, "avatar_URL");
+ comment.authorUrl = JSONUtils.getString(jsonAuthor, "URL");
comment.authorId = jsonAuthor.optLong("ID");
comment.authorBlogId = jsonAuthor.optLong("site_ID");
}
@@ -72,10 +72,10 @@ public class ReaderComment {
}
// like info is found under meta/data/likes when meta=likes query param is used
- JSONObject jsonLikes = JSONUtil.getJSONChild(json, "meta/data/likes");
+ JSONObject jsonLikes = JSONUtils.getJSONChild(json, "meta/data/likes");
if (jsonLikes != null) {
comment.numLikes = jsonLikes.optInt("found");
- comment.isLikedByCurrentUser = JSONUtil.getBool(jsonLikes, "i_like");
+ comment.isLikedByCurrentUser = JSONUtils.getBool(jsonLikes, "i_like");
}
return comment;
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java
index 9dcc95788..8532450a9 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderPost.java
@@ -10,7 +10,7 @@ import org.wordpress.android.ui.reader.utils.ReaderUtils;
import org.wordpress.android.util.DateTimeUtils;
import org.wordpress.android.util.GravatarUtils;
import org.wordpress.android.util.HtmlUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
import java.text.BreakIterator;
@@ -71,36 +71,36 @@ public class ReaderPost {
post.feedId = json.optLong("feed_ID");
if (json.has("pseudo_ID")) {
- post.pseudoId = JSONUtil.getString(json, "pseudo_ID"); // read/ endpoint
+ post.pseudoId = JSONUtils.getString(json, "pseudo_ID"); // read/ endpoint
} else {
- post.pseudoId = JSONUtil.getString(json, "global_ID"); // sites/ endpoint
+ post.pseudoId = JSONUtils.getString(json, "global_ID"); // sites/ endpoint
}
// remove HTML from the excerpt
- post.excerpt = HtmlUtils.fastStripHtml(JSONUtil.getString(json, "excerpt"));
+ post.excerpt = HtmlUtils.fastStripHtml(JSONUtils.getString(json, "excerpt"));
- post.text = JSONUtil.getString(json, "content");
- post.title = JSONUtil.getStringDecoded(json, "title");
- post.url = JSONUtil.getString(json, "URL");
- post.shortUrl = JSONUtil.getString(json, "short_URL");
- post.setBlogUrl(JSONUtil.getString(json, "site_URL"));
+ post.text = JSONUtils.getString(json, "content");
+ post.title = JSONUtils.getStringDecoded(json, "title");
+ post.url = JSONUtils.getString(json, "URL");
+ post.shortUrl = JSONUtils.getString(json, "short_URL");
+ post.setBlogUrl(JSONUtils.getString(json, "site_URL"));
post.numLikes = json.optInt("like_count");
- post.isLikedByCurrentUser = JSONUtil.getBool(json, "i_like");
- post.isFollowedByCurrentUser = JSONUtil.getBool(json, "is_following");
- post.isRebloggedByCurrentUser = JSONUtil.getBool(json, "is_reblogged");
- post.isExternal = JSONUtil.getBool(json, "is_external");
- post.isPrivate = JSONUtil.getBool(json, "site_is_private");
+ post.isLikedByCurrentUser = JSONUtils.getBool(json, "i_like");
+ post.isFollowedByCurrentUser = JSONUtils.getBool(json, "is_following");
+ post.isRebloggedByCurrentUser = JSONUtils.getBool(json, "is_reblogged");
+ post.isExternal = JSONUtils.getBool(json, "is_external");
+ post.isPrivate = JSONUtils.getBool(json, "site_is_private");
- post.isLikesEnabled = JSONUtil.getBool(json, "likes_enabled");
- post.isSharingEnabled = JSONUtil.getBool(json, "sharing_enabled");
+ post.isLikesEnabled = JSONUtils.getBool(json, "likes_enabled");
+ post.isSharingEnabled = JSONUtils.getBool(json, "sharing_enabled");
JSONObject jsonDiscussion = json.optJSONObject("discussion");
if (jsonDiscussion != null) {
- post.isCommentsOpen = JSONUtil.getBool(jsonDiscussion, "comments_open");
+ post.isCommentsOpen = JSONUtils.getBool(jsonDiscussion, "comments_open");
post.numReplies = jsonDiscussion.optInt("comment_count");
} else {
- post.isCommentsOpen = JSONUtil.getBool(json, "comments_open");
+ post.isCommentsOpen = JSONUtils.getBool(json, "comments_open");
post.numReplies = json.optInt("comment_count");
}
@@ -111,21 +111,22 @@ public class ReaderPost {
JSONObject jsonEditorial = json.optJSONObject("editorial");
if (jsonEditorial != null) {
post.blogId = jsonEditorial.optLong("blog_id");
- post.blogName = JSONUtil.getStringDecoded(jsonEditorial, "blog_name");
- post.featuredImage = ReaderImageScanner.getImageUrlFromFPFeaturedImageUrl(JSONUtil.getString(jsonEditorial, "image"));
- post.setPrimaryTag(JSONUtil.getString(jsonEditorial, "highlight_topic_title")); // highlight_topic?
+ post.blogName = JSONUtils.getStringDecoded(jsonEditorial, "blog_name");
+ post.featuredImage = ReaderImageScanner.getImageUrlFromFPFeaturedImageUrl(
+ JSONUtils.getString(jsonEditorial, "image"));
+ post.setPrimaryTag(JSONUtils.getString(jsonEditorial, "highlight_topic_title")); // highlight_topic?
// we want freshly-pressed posts to show & store the date they were chosen rather than the day they were published
- post.published = JSONUtil.getString(jsonEditorial, "displayed_on");
+ post.published = JSONUtils.getString(jsonEditorial, "displayed_on");
} else {
- post.featuredImage = JSONUtil.getString(json, "featured_image");
- post.blogName = JSONUtil.getStringDecoded(json, "site_name");
- post.published = JSONUtil.getString(json, "date");
+ post.featuredImage = JSONUtils.getString(json, "featured_image");
+ post.blogName = JSONUtils.getStringDecoded(json, "site_name");
+ post.published = JSONUtils.getString(json, "date");
}
// the date a post was liked is only returned by the read/liked/ endpoint - if this exists,
// set it as the timestamp so posts are sorted by the date they were liked rather than the
// date they were published (the timestamp is used to sort posts when querying)
- String likeDate = JSONUtil.getString(json, "date_liked");
+ String likeDate = JSONUtils.getString(json, "date_liked");
if (!TextUtils.isEmpty(likeDate)) {
post.timestamp = DateTimeUtils.iso8601ToTimestamp(likeDate);
} else {
@@ -152,14 +153,14 @@ public class ReaderPost {
}
// site metadata - returned when ?meta=site was added to the request
- JSONObject jsonSite = JSONUtil.getJSONChild(json, "meta/data/site");
+ JSONObject jsonSite = JSONUtils.getJSONChild(json, "meta/data/site");
if (jsonSite != null) {
post.blogId = jsonSite.optInt("ID");
- post.blogName = JSONUtil.getString(jsonSite, "name");
- post.setBlogUrl(JSONUtil.getString(jsonSite, "URL"));
- post.isPrivate = JSONUtil.getBool(jsonSite, "is_private");
+ post.blogName = JSONUtils.getString(jsonSite, "name");
+ post.setBlogUrl(JSONUtils.getString(jsonSite, "URL"));
+ post.isPrivate = JSONUtils.getBool(jsonSite, "is_private");
// TODO: as of 29-Sept-2014, this is broken - endpoint returns false when it should be true
- post.isJetpack = JSONUtil.getBool(jsonSite, "jetpack");
+ post.isJetpack = JSONUtils.getBool(jsonSite, "jetpack");
}
// if there's no featured image, check if featured media has been set - this is sometimes
@@ -168,9 +169,9 @@ public class ReaderPost {
if (!post.hasFeaturedImage()) {
JSONObject jsonMedia = json.optJSONObject("featured_media");
if (jsonMedia != null && jsonMedia.length() > 0) {
- String mediaUrl = JSONUtil.getString(jsonMedia, "uri");
+ String mediaUrl = JSONUtils.getString(jsonMedia, "uri");
if (!TextUtils.isEmpty(mediaUrl)) {
- String type = JSONUtil.getString(jsonMedia, "type");
+ String type = JSONUtils.getString(jsonMedia, "type");
boolean isVideo = (type != null && type.equals("video"));
if (isVideo) {
post.featuredVideo = mediaUrl;
@@ -204,13 +205,13 @@ public class ReaderPost {
return;
}
- post.authorName = JSONUtil.getString(jsonAuthor, "name");
- post.postAvatar = JSONUtil.getString(jsonAuthor, "avatar_URL");
+ post.authorName = JSONUtils.getString(jsonAuthor, "name");
+ post.postAvatar = JSONUtils.getString(jsonAuthor, "avatar_URL");
post.authorId = jsonAuthor.optLong("ID");
// site_URL doesn't exist for /sites/ endpoints, so get it from the author
if (TextUtils.isEmpty(post.blogUrl)) {
- post.setBlogUrl(JSONUtil.getString(jsonAuthor, "URL"));
+ post.setBlogUrl(JSONUtils.getString(jsonAuthor, "URL"));
}
}
@@ -241,7 +242,7 @@ public class ReaderPost {
int postCount = jsonThisTag.optInt("post_count");
if (postCount > popularCount) {
nextMostPopularTag = mostPopularTag;
- mostPopularTag = JSONUtil.getString(jsonThisTag, "name");
+ mostPopularTag = JSONUtils.getString(jsonThisTag, "name");
popularCount = postCount;
}
}
@@ -565,4 +566,4 @@ public class ReaderPost {
return stableId;
}
-} \ No newline at end of file
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderRecommendedBlog.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderRecommendedBlog.java
index 381771a98..5f314b2d7 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderRecommendedBlog.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderRecommendedBlog.java
@@ -1,7 +1,7 @@
package org.wordpress.android.models;
import org.json.JSONObject;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
public class ReaderRecommendedBlog {
@@ -28,12 +28,12 @@ public class ReaderRecommendedBlog {
blog.followRecoId = json.optLong("follow_reco_id");
blog.score = json.optInt("score");
- blog.setTitle(JSONUtil.getString(json, "title"));
- blog.setImageUrl(JSONUtil.getString(json, "image"));
- blog.setReason(JSONUtil.getStringDecoded(json, "reason"));
+ blog.setTitle(JSONUtils.getString(json, "title"));
+ blog.setImageUrl(JSONUtils.getString(json, "image"));
+ blog.setReason(JSONUtils.getStringDecoded(json, "reason"));
// the "url" field points to an API endpoint, "blog_domain" contains the actual url
- blog.setBlogUrl(JSONUtil.getString(json, "blog_domain"));
+ blog.setBlogUrl(JSONUtils.getString(json, "blog_domain"));
return blog;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java b/WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java
index 34a39cc2f..d1bc89cad 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/ReaderUser.java
@@ -3,7 +3,7 @@ package org.wordpress.android.models;
import android.text.TextUtils;
import org.json.JSONObject;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.UrlUtils;
@@ -27,16 +27,16 @@ public class ReaderUser {
user.userId = json.optLong("ID");
user.blogId = json.optLong("site_ID");
- user.userName = JSONUtil.getString(json, "username");
- user.url = JSONUtil.getString(json, "URL"); // <-- this isn't necessarily a wp blog
- user.profileUrl = JSONUtil.getString(json, "profile_URL");
- user.avatarUrl = JSONUtil.getString(json, "avatar_URL");
+ user.userName = JSONUtils.getString(json, "username");
+ user.url = JSONUtils.getString(json, "URL"); // <-- this isn't necessarily a wp blog
+ user.profileUrl = JSONUtils.getString(json, "profile_URL");
+ user.avatarUrl = JSONUtils.getString(json, "avatar_URL");
// "me" api call (current user) has "display_name", others have "name"
if (json.has("display_name")) {
- user.displayName = JSONUtil.getStringDecoded(json, "display_name");
+ user.displayName = JSONUtils.getStringDecoded(json, "display_name");
} else {
- user.displayName = JSONUtil.getStringDecoded(json, "name");
+ user.displayName = JSONUtils.getStringDecoded(json, "name");
}
return user;
diff --git a/WordPress/src/main/java/org/wordpress/android/models/Suggestion.java b/WordPress/src/main/java/org/wordpress/android/models/Suggestion.java
index 7a699b63f..0d4b1d752 100644
--- a/WordPress/src/main/java/org/wordpress/android/models/Suggestion.java
+++ b/WordPress/src/main/java/org/wordpress/android/models/Suggestion.java
@@ -2,7 +2,7 @@ package org.wordpress.android.models;
import org.json.JSONArray;
import org.json.JSONObject;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.StringUtils;
import java.util.ArrayList;
@@ -35,9 +35,9 @@ public class Suggestion {
return null;
}
- String userLogin = JSONUtil.getString(json, "user_login");
- String displayName = JSONUtil.getString(json, "display_name");
- String imageUrl = JSONUtil.getString(json, "image_URL");
+ String userLogin = JSONUtils.getString(json, "user_login");
+ String displayName = JSONUtils.getString(json, "display_name");
+ String imageUrl = JSONUtils.getString(json, "image_URL");
// the api currently doesn't return a taxonomy field but we want to be ready for when it does
return new Suggestion(siteID, userLogin, displayName, imageUrl, MENTION_TAXONOMY);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/ViewSiteActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/ViewSiteActivity.java
index b6002385e..55b71cd8c 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/ViewSiteActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/ViewSiteActivity.java
@@ -19,7 +19,7 @@ import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.WPWebChromeClient;
+import org.wordpress.android.util.helpers.WPWebChromeClient;
import org.wordpress.android.util.WPWebViewClient;
import org.wordpress.passcodelock.AppLockManager;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/WPDrawerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/WPDrawerActivity.java
index 9e0223864..27a16dae0 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/WPDrawerActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/WPDrawerActivity.java
@@ -50,7 +50,7 @@ import org.wordpress.android.util.AuthenticationDialogUtils;
import org.wordpress.android.util.BlogUtils;
import org.wordpress.android.util.DeviceUtils;
import org.wordpress.android.util.DisplayUtils;
-import org.wordpress.android.util.ListScrollPositionManager;
+import org.wordpress.android.util.helpers.ListScrollPositionManager;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
import org.wordpress.android.util.WPActivityUtils;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java
index 648917d00..656eef4d6 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/WPWebViewActivity.java
@@ -26,7 +26,7 @@ import org.wordpress.android.models.Blog;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.UrlUtils;
-import org.wordpress.android.util.WPWebChromeClient;
+import org.wordpress.android.util.helpers.WPWebChromeClient;
import org.wordpress.android.util.WPWebViewClient;
import org.wordpress.passcodelock.AppLockManager;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/ManageBlogsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/ManageBlogsActivity.java
index 0e7a67358..17783059b 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/ManageBlogsActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/ManageBlogsActivity.java
@@ -21,13 +21,13 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.ui.accounts.helpers.UpdateBlogListTask;
import org.wordpress.android.util.BlogUtils;
import org.wordpress.android.util.GravatarUtils;
-import org.wordpress.android.util.ListScrollPositionManager;
import org.wordpress.android.util.MapUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.ListScrollPositionManager;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import org.wordpress.android.widgets.WPNetworkImageView;
import java.util.List;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewBlogFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewBlogFragment.java
index f8e2fac1c..b022539d4 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewBlogFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewBlogFragment.java
@@ -23,7 +23,7 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.WordPressDB;
import org.wordpress.android.ui.WPDrawerActivity;
import org.wordpress.android.ui.accounts.helpers.CreateUserAndBlog;
-import org.wordpress.android.util.AlertUtil;
+import org.wordpress.android.util.AlertUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.EditTextUtils;
@@ -159,7 +159,7 @@ public class NewBlogFragment extends AbstractFragment implements TextWatcher {
private void validateAndCreateUserAndBlog() {
if (mSystemService.getActiveNetworkInfo() == null) {
- AlertUtil.showAlert(getActivity(), R.string.no_network_title, R.string.no_network_message);
+ AlertUtils.showAlert(getActivity(), R.string.no_network_title, R.string.no_network_message);
return;
}
if (!isUserDataValid()) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewUserFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewUserFragment.java
index e054d3704..feb43bf7b 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewUserFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/NewUserFragment.java
@@ -24,12 +24,13 @@ import org.wordpress.android.Constants;
import org.wordpress.android.R;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.ui.accounts.helpers.CreateUserAndBlog;
-import org.wordpress.android.util.AlertUtil;
+import org.wordpress.android.util.AlertUtils;
+import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.EditTextUtils;
-import org.wordpress.android.util.UserEmail;
-import org.wordpress.persistentedittext.PersistentEditTextHelper;
+import org.wordpress.android.util.UserEmailUtils;
import org.wordpress.android.widgets.WPTextView;
import org.wordpress.emailchecker.EmailChecker;
+import org.wordpress.persistentedittext.PersistentEditTextHelper;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -230,7 +231,7 @@ public class NewUserFragment extends AbstractFragment implements TextWatcher {
private void validateAndCreateUserAndBlog() {
if (mSystemService.getActiveNetworkInfo() == null) {
- AlertUtil.showAlert(getActivity(), R.string.no_network_title, R.string.no_network_message);
+ AlertUtils.showAlert(getActivity(), R.string.no_network_title, R.string.no_network_message);
return;
}
if (!isUserDataValid()) {
@@ -280,7 +281,7 @@ public class NewUserFragment extends AbstractFragment implements TextWatcher {
@Override
public void onSuccess(JSONObject createSiteResponse) {
- AnalyticsTracker.refreshMetadata();
+ AnalyticsUtils.refreshMetadata(username, email);
AnalyticsTracker.track(AnalyticsTracker.Stat.CREATED_ACCOUNT);
endProgress();
if (isAdded()) {
@@ -349,7 +350,7 @@ public class NewUserFragment extends AbstractFragment implements TextWatcher {
mProgressBarSignIn = (RelativeLayout) rootView.findViewById(R.id.nux_sign_in_progress_bar);
mEmailTextField = (EditText) rootView.findViewById(R.id.email_address);
- mEmailTextField.setText(UserEmail.getPrimaryEmail(getActivity()));
+ mEmailTextField.setText(UserEmailUtils.getPrimaryEmail(getActivity()));
mEmailTextField.setSelection(EditTextUtils.getText(mEmailTextField).length());
mPasswordTextField = (EditText) rootView.findViewById(R.id.password);
mUsernameTextField = (EditText) rootView.findViewById(R.id.username);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java
index f1576b984..d020889af 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/SignInFragment.java
@@ -46,6 +46,7 @@ import org.wordpress.android.ui.reader.services.ReaderUpdateService;
import org.wordpress.android.ui.reader.services.ReaderUpdateService.UpdateTask;
import org.wordpress.android.util.ABTestingUtils;
import org.wordpress.android.util.ABTestingUtils.Feature;
+import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.EditTextUtils;
@@ -399,7 +400,7 @@ public class SignInFragment extends AbstractFragment implements TextWatcher {
Map<String, Boolean> properties = new HashMap<String, Boolean>();
properties.put("dotcom_user", isWPComLogin());
AnalyticsTracker.track(AnalyticsTracker.Stat.SIGNED_IN, properties);
- AnalyticsTracker.refreshMetadata();
+ AnalyticsUtils.refreshMetadata();
if (!isWPComLogin()) {
AnalyticsTracker.track(AnalyticsTracker.Stat.ADDED_SELF_HOSTED_SITE);
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/FetchBlogListWPCom.java b/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/FetchBlogListWPCom.java
index a52a8fa67..3882c4825 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/FetchBlogListWPCom.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/accounts/helpers/FetchBlogListWPCom.java
@@ -9,7 +9,7 @@ import org.json.JSONObject;
import org.wordpress.android.WordPress;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.VolleyUtils;
import java.util.ArrayList;
@@ -43,7 +43,7 @@ public class FetchBlogListWPCom extends FetchBlogListAbstract {
site.put("blogid", jsonSite.get("ID"));
site.put("isAdmin", jsonSite.get("user_can_manage"));
site.put("isVisible", jsonSite.get("visible"));
- JSONObject jsonLinks = JSONUtil.getJSONChild(jsonSite, "meta/links");
+ JSONObject jsonLinks = JSONUtils.getJSONChild(jsonSite, "meta/links");
if (jsonLinks != null) {
site.put("xmlrpc", jsonLinks.getString("xmlrpc"));
sites.add(site);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentUtils.java
index ddc1bcd47..7d0f596d7 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentUtils.java
@@ -13,9 +13,9 @@ import android.widget.TextView;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
-import org.wordpress.android.util.Emoticons;
+import org.wordpress.android.util.EmoticonsUtils;
import org.wordpress.android.util.HtmlUtils;
-import org.wordpress.android.util.WPImageGetter;
+import org.wordpress.android.util.helpers.WPImageGetter;
public class CommentUtils {
/*
@@ -43,7 +43,7 @@ public class CommentUtils {
}
// convert emoticons first (otherwise they'll be downloaded)
- content = Emoticons.replaceEmoticonsWithEmoji(content);
+ content = EmoticonsUtils.replaceEmoticonsWithEmoji(content);
// now convert to HTML with an image getter that enforces a max image size
final Spanned html;
@@ -104,4 +104,4 @@ public class CommentUtils {
return lines;
}
}
-} \ No newline at end of file
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsListFragment.java
index b3d0cf44e..ed5cab40f 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsListFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/comments/CommentsListFragment.java
@@ -30,9 +30,9 @@ import org.wordpress.android.ui.WPDrawerActivity;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import org.xmlrpc.android.ApiHelper;
import org.xmlrpc.android.ApiHelper.ErrorType;
import org.xmlrpc.android.XMLRPCFault;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java
index 5d8598744..c6463dce1 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaAddFragment.java
@@ -24,12 +24,13 @@ import android.widget.Toast;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
-import org.wordpress.android.models.MediaFile;
-import org.wordpress.android.ui.media.MediaUtils.LaunchCameraCallback;
-import org.wordpress.android.ui.media.MediaUtils.RequestCode;
+import org.wordpress.android.ui.media.WordPressMediaUtils.LaunchCameraCallback;
+import org.wordpress.android.ui.media.WordPressMediaUtils.RequestCode;
import org.wordpress.android.ui.media.services.MediaUploadService;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
+import org.wordpress.android.util.helpers.MediaFile;
import java.io.File;
import java.util.List;
@@ -126,7 +127,8 @@ public class MediaAddFragment extends Fragment implements LaunchCameraCallback {
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- if (data != null || requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO || requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO) {
+ if (data != null || requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO ||
+ requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO) {
String path;
switch (requestCode) {
@@ -149,7 +151,6 @@ public class MediaAddFragment extends Fragment implements LaunchCameraCallback {
}
break;
}
-
}
}
@@ -208,8 +209,9 @@ public class MediaAddFragment extends Fragment implements LaunchCameraCallback {
Blog blog = WordPress.getCurrentBlog();
File file = new File(path);
- if (!file.exists())
+ if (!file.exists()) {
return;
+ }
String mimeType = MediaUtils.getMediaFileMimeType(file);
String fileName = MediaUtils.getMediaFileName(file, mimeType);
@@ -230,10 +232,10 @@ public class MediaAddFragment extends Fragment implements LaunchCameraCallback {
mediaFile.setHeight(bfo.outHeight);
}
- if (!TextUtils.isEmpty(mimeType))
+ if (!TextUtils.isEmpty(mimeType)) {
mediaFile.setMimeType(mimeType);
- mediaFile.save();
-
+ }
+ WordPress.wpDB.saveMediaFile(mediaFile);
mCallback.onMediaAdded(mediaFile.getMediaId());
startMediaUploadService();
@@ -257,20 +259,28 @@ public class MediaAddFragment extends Fragment implements LaunchCameraCallback {
mMediaCapturePath = mediaCapturePath;
}
- public void launchCamera(){
- MediaUtils.launchCamera(this, this);
+ public void launchCamera() {
+ if (isAdded()) {
+ WordPressMediaUtils.launchCamera(getActivity(), this);
+ }
}
public void launchVideoCamera() {
- MediaUtils.launchVideoCamera(this);
+ if (isAdded()) {
+ WordPressMediaUtils.launchVideoCamera(getActivity());
+ }
}
public void launchVideoLibrary() {
- MediaUtils.launchVideoLibrary(this);
+ if (isAdded()) {
+ WordPressMediaUtils.launchVideoLibrary(getActivity());
+ }
}
public void launchPictureLibrary() {
- MediaUtils.launchPictureLibrary(this);
+ if (isAdded()) {
+ WordPressMediaUtils.launchPictureLibrary(getActivity());
+ }
}
public void addToQueue(String mediaId) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java
index 88fd6bc55..166975662 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaBrowserActivity.java
@@ -564,7 +564,7 @@ public class MediaBrowserActivity extends WPDrawerActivity implements MediaGridL
// Make sure there are no media in "uploading"
for (String currentID : ids) {
- if (MediaUtils.canDeleteMedia(blogId, currentID)) {
+ if (WordPressMediaUtils.canDeleteMedia(blogId, currentID)) {
sanitizedIds.add(currentID);
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java
index 9ee0ef935..6b9dbb0e8 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaEditFragment.java
@@ -30,6 +30,7 @@ import org.wordpress.android.models.Blog;
import org.wordpress.android.util.ActivityUtils;
import org.wordpress.android.util.ImageUtils.BitmapWorkerCallback;
import org.wordpress.android.util.ImageUtils.BitmapWorkerTask;
+import org.wordpress.android.util.MediaUtils;
import org.xmlrpc.android.ApiHelper;
import java.util.ArrayList;
@@ -162,7 +163,7 @@ public class MediaEditFragment extends Fragment {
}
private void disableEditingOnOldVersion() {
- if (MediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
+ if (WordPressMediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
return;
}
@@ -344,7 +345,7 @@ public class MediaEditFragment extends Fragment {
menu.findItem(R.id.menu_new_media).setVisible(false);
menu.findItem(R.id.menu_search).setVisible(false);
- if (!MediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
+ if (!WordPressMediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
menu.findItem(R.id.menu_save_media).setVisible(false);
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryActivity.java
index a12886f25..a35addd31 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryActivity.java
@@ -15,7 +15,7 @@ import com.sothree.slidinguppanel.SlidingUpPanelLayout.PanelSlideListener;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
-import org.wordpress.android.models.MediaGallery;
+import org.wordpress.android.util.helpers.MediaGallery;
import org.wordpress.android.ui.media.MediaGallerySettingsFragment.MediaGallerySettingsCallback;
import org.wordpress.android.util.DisplayUtils;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryAdapter.java
index 1f46063bc..34068452b 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryAdapter.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGalleryAdapter.java
@@ -15,6 +15,7 @@ import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.WordPressDB;
import org.wordpress.android.util.DisplayUtils;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.util.StringUtils;
/**
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java
index 8aa5c2101..c2aa33e64 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridAdapter.java
@@ -31,8 +31,8 @@ import org.wordpress.android.ui.CheckableFrameLayout;
import org.wordpress.android.util.DisplayUtils;
import org.wordpress.android.util.ImageUtils.BitmapWorkerCallback;
import org.wordpress.android.util.ImageUtils.BitmapWorkerTask;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.util.PhotonUtils;
-import org.wordpress.android.util.StringUtils;
import java.util.ArrayList;
import java.util.HashMap;
@@ -285,7 +285,7 @@ public class MediaGridAdapter extends CursorAdapter {
Uri uri = Uri.parse(thumbnailURL);
String filepath = uri.getLastPathSegment();
- int placeholderResId = MediaUtils.getPlaceholder(filepath);
+ int placeholderResId = WordPressMediaUtils.getPlaceholder(filepath);
imageView.setImageResource(0);
imageView.setErrorImageResId(placeholderResId);
@@ -554,4 +554,4 @@ public class MediaGridAdapter extends CursorAdapter {
mSelectedItems = selectedItems;
notifyDataSetChanged();
}
-} \ No newline at end of file
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridFragment.java
index 7f1b68d86..91f7c50fc 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaGridFragment.java
@@ -39,14 +39,13 @@ import org.wordpress.android.ui.CustomSpinner;
import org.wordpress.android.ui.EmptyViewMessageType;
import org.wordpress.android.ui.media.MediaGridAdapter.MediaGridAdapterCallback;
import org.wordpress.android.ui.posts.EditPostActivity;
-import org.wordpress.android.ui.posts.EditPostContentFragment;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
import org.wordpress.android.util.WPActivityUtils;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import org.xmlrpc.android.ApiHelper;
import org.xmlrpc.android.ApiHelper.SyncMediaLibraryTask.Callback;
@@ -798,8 +797,8 @@ public class MediaGridFragment extends Fragment
}
ArrayList<String> ids = mGridAdapter.getSelectedItems();
Intent i = new Intent(getActivity(), EditPostActivity.class);
- i.setAction(EditPostContentFragment.NEW_MEDIA_POST);
- i.putExtra(EditPostContentFragment.NEW_MEDIA_POST_EXTRA, ids.iterator().next());
+ i.setAction(EditPostActivity.NEW_MEDIA_POST);
+ i.putExtra(EditPostActivity.NEW_MEDIA_POST_EXTRA, ids.iterator().next());
startActivity(i);
}
@@ -828,8 +827,8 @@ public class MediaGridFragment extends Fragment
return;
}
Intent i = new Intent(getActivity(), EditPostActivity.class);
- i.setAction(EditPostContentFragment.NEW_MEDIA_GALLERY);
- i.putStringArrayListExtra(EditPostContentFragment.NEW_MEDIA_GALLERY_EXTRA_IDS,
+ i.setAction(EditPostActivity.NEW_MEDIA_GALLERY);
+ i.putStringArrayListExtra(EditPostActivity.NEW_MEDIA_GALLERY_EXTRA_IDS,
mGridAdapter.getSelectedItems());
startActivity(i);
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaItemFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaItemFragment.java
index ca83831a6..7183d1d50 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaItemFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaItemFragment.java
@@ -33,6 +33,7 @@ import org.wordpress.android.WordPressDB;
import org.wordpress.android.models.Blog;
import org.wordpress.android.util.ImageUtils.BitmapWorkerCallback;
import org.wordpress.android.util.ImageUtils.BitmapWorkerTask;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.util.StringUtils;
import java.util.ArrayList;
@@ -320,7 +321,7 @@ public class MediaItemFragment extends Fragment {
menu.findItem(R.id.menu_new_media).setVisible(false);
menu.findItem(R.id.menu_search).setVisible(false);
- if (mIsLocal || !MediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
+ if (mIsLocal || !WordPressMediaUtils.isWordPressVersionWithMediaEditingCapabilities()) {
menu.findItem(R.id.menu_edit_media).setVisible(false);
}
}
@@ -331,7 +332,7 @@ public class MediaItemFragment extends Fragment {
if (itemId == R.id.menu_delete) {
String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
- boolean canDeleteMedia = MediaUtils.canDeleteMedia(blogId, getMediaId());
+ boolean canDeleteMedia = WordPressMediaUtils.canDeleteMedia(blogId, getMediaId());
if (!canDeleteMedia) {
Toast.makeText(getActivity(), R.string.wait_until_upload_completes, Toast.LENGTH_LONG).show();
return true;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java
index fa59c6665..423fad05a 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaPickerActivity.java
@@ -24,11 +24,12 @@ import com.android.volley.toolbox.ImageLoader;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.widgets.SlidingTabLayout;
import org.wordpress.android.widgets.WPViewPager;
import org.wordpress.mediapicker.MediaItem;
-import org.wordpress.mediapicker.source.MediaSource;
import org.wordpress.mediapicker.MediaPickerFragment;
+import org.wordpress.mediapicker.source.MediaSource;
import java.io.File;
import java.util.ArrayList;
@@ -132,7 +133,7 @@ public class MediaPickerActivity extends ActionBarActivity
if (item.getItemId() == android.R.id.home) {
finish();
} else if (item.getItemId() == R.id.capture_image) {
- MediaUtils.launchCamera(this, new MediaUtils.LaunchCameraCallback() {
+ WordPressMediaUtils.launchCamera(this, new WordPressMediaUtils.LaunchCameraCallback() {
@Override
public void onMediaCapturePathReady(String mediaCapturePath) {
mCapturePath = mediaCapturePath;
@@ -140,7 +141,7 @@ public class MediaPickerActivity extends ActionBarActivity
});
return true;
} else if (item.getItemId() == R.id.capture_video) {
- MediaUtils.launchVideoCamera(this);
+ WordPressMediaUtils.launchVideoCamera(this);
return true;
}
@@ -152,7 +153,7 @@ public class MediaPickerActivity extends ActionBarActivity
super.onActivityResult(requestCode, resultCode, data);
switch (requestCode) {
- case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO:
+ case WordPressMediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO:
File file = new File(mCapturePath);
Uri imageUri = Uri.fromFile(file);
@@ -168,7 +169,7 @@ public class MediaPickerActivity extends ActionBarActivity
finishWithResults(imageResult, ACTIVITY_RESULT_CODE_MEDIA_SELECTED);
}
break;
- case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO:
+ case WordPressMediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO:
Uri videoUri = data != null ? data.getData() : null;
if (videoUri != null) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java
index 89d393837..79955b115 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPImages.java
@@ -73,7 +73,7 @@ public class MediaSourceWPImages implements MediaSource {
if (imageBitmap == null) {
imageView.setImageResource(R.color.grey_darken_10);
- MediaUtils.BackgroundDownloadWebImage bgDownload = new MediaUtils.BackgroundDownloadWebImage(imageView);
+ WordPressMediaUtils.BackgroundDownloadWebImage bgDownload = new WordPressMediaUtils.BackgroundDownloadWebImage(imageView);
imageView.setTag(bgDownload);
bgDownload.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mediaItem.getPreviewSource());
} else {
@@ -121,7 +121,7 @@ public class MediaSourceWPImages implements MediaSource {
mLoading = true;
notifyLoadingStatus();
- Cursor imageCursor = MediaUtils.getWordPressMediaImages(String.valueOf(blog.getLocalTableBlogId()));
+ Cursor imageCursor = WordPressMediaUtils.getWordPressMediaImages(String.valueOf(blog.getLocalTableBlogId()));
if (imageCursor != null) {
addWordPressImagesFromCursor(imageCursor);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPVideos.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPVideos.java
index e18f13862..9605c39d0 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPVideos.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaSourceWPVideos.java
@@ -15,6 +15,7 @@ import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.WordPressDB;
import org.wordpress.android.models.Blog;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.mediapicker.MediaItem;
import org.wordpress.mediapicker.source.MediaSource;
@@ -70,7 +71,8 @@ public class MediaSourceWPVideos implements MediaSource {
imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
if (imageBitmap == null) {
imageView.setImageResource(R.color.grey_darken_10);
- MediaUtils.BackgroundDownloadWebImage bgDownload = new MediaUtils.BackgroundDownloadWebImage(imageView);
+ WordPressMediaUtils.BackgroundDownloadWebImage bgDownload =
+ new WordPressMediaUtils.BackgroundDownloadWebImage(imageView);
imageView.setTag(bgDownload);
bgDownload.execute(mediaItem.getPreviewSource());
} else {
@@ -137,8 +139,8 @@ public class MediaSourceWPVideos implements MediaSource {
if (blog != null) {
mLoading = true;
notifyLoadingStatus();
- Cursor videoCursor = MediaUtils.getWordPressMediaVideos(String.valueOf(blog.getLocalTableBlogId()));
-
+ Cursor videoCursor = WordPressMediaUtils.getWordPressMediaVideos(
+ String.valueOf(blog.getLocalTableBlogId()));
if (videoCursor != null) {
addWordPressVideosFromCursor(videoCursor);
videoCursor.close();
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/media/MediaUtils.java
deleted file mode 100644
index f849e859e..000000000
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/MediaUtils.java
+++ /dev/null
@@ -1,576 +0,0 @@
-package org.wordpress.android.ui.media;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Fragment;
-import android.content.Context;
-import android.content.CursorLoader;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.database.Cursor;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Environment;
-import android.provider.MediaStore;
-import android.text.TextUtils;
-import android.webkit.MimeTypeMap;
-import android.widget.ImageView;
-
-import org.wordpress.android.R;
-import org.wordpress.android.WordPress;
-import org.wordpress.android.WordPressDB;
-import org.wordpress.android.models.Blog;
-import org.wordpress.android.models.MediaFile;
-import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.ImageUtils;
-import org.wordpress.android.util.UrlUtils;
-import org.wordpress.android.util.Version;
-import org.wordpress.android.widgets.WPImageSpan;
-import org.wordpress.passcodelock.AppLockManager;
-
-import java.io.DataInputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.lang.ref.WeakReference;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLConnection;
-import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.Locale;
-import java.util.TimeZone;
-
-import static org.wordpress.mediapicker.MediaUtils.fadeInImage;
-
-public class MediaUtils {
- public class RequestCode {
- public static final int ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY = 1000;
- public static final int ACTIVITY_REQUEST_CODE_TAKE_PHOTO = 1100;
- public static final int ACTIVITY_REQUEST_CODE_VIDEO_LIBRARY = 1200;
- public static final int ACTIVITY_REQUEST_CODE_TAKE_VIDEO = 1300;
- }
-
- public interface LaunchCameraCallback {
- public void onMediaCapturePathReady(String mediaCapturePath);
- }
-
- public static boolean isValidImage(String url) {
- if (url == null)
- return false;
-
- if (url.endsWith(".png") || url.endsWith(".jpg") || url.endsWith(".jpeg") || url.endsWith(".gif"))
- return true;
- return false;
- }
-
- private static boolean isDocument(String url) {
- if (url == null)
- return false;
-
- if (url.endsWith(".doc") || url.endsWith(".docx") || url.endsWith(".odt") || url.endsWith(".pdf"))
- return true;
- return false;
- }
-
- private static boolean isPowerpoint(String url) {
- if (url == null)
- return false;
-
- if (url.endsWith(".ppt") || url.endsWith(".pptx") || url.endsWith(".pps") || url.endsWith(".ppsx") || url.endsWith(".key"))
- return true;
- return false;
- }
-
- private static boolean isSpreadsheet(String url) {
- if (url == null)
- return false;
-
- if (url.endsWith(".xls") || url.endsWith(".xlsx"))
- return true;
- return false;
- }
-
- public static boolean isVideo(String url) {
- if (url == null)
- return false;
- if (url.endsWith(".ogv") || url.endsWith(".mp4") || url.endsWith(".m4v") || url.endsWith(".mov") ||
- url.endsWith(".wmv") || url.endsWith(".avi") || url.endsWith(".mpg") || url.endsWith(".3gp") || url.endsWith(".3g2"))
- return true;
- return false;
- }
-
- public static Cursor getWordPressMediaImages(String blogId) {
- return WordPress.wpDB.getMediaImagesForBlog(blogId);
- }
-
- public static Cursor getWordPressMediaVideos(String blogId) {
- return WordPress.wpDB.getMediaFilesForBlog(blogId);
- }
-
- public static class BackgroundDownloadWebImage extends AsyncTask<Uri, String, Bitmap> {
- WeakReference<ImageView> mReference;
-
- public BackgroundDownloadWebImage(ImageView resultStore) {
- mReference = new WeakReference<>(resultStore);
- }
-
- @Override
- protected Bitmap doInBackground(Uri... params) {
- try {
- String uri = params[0].toString();
- Bitmap bitmap = WordPress.getBitmapCache().getBitmap(uri);
-
- if (bitmap == null) {
- URL url = new URL(uri);
- bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
- WordPress.getBitmapCache().put(uri, bitmap);
- }
-
- return bitmap;
- }
- catch(IOException notFoundException) {
- return null;
- }
- }
-
- @Override
- protected void onPostExecute(Bitmap result) {
- ImageView imageView = mReference.get();
-
- if (imageView != null) {
- if (imageView.getTag() == this) {
- imageView.setImageBitmap(result);
- fadeInImage(imageView, result);
- }
- }
- }
- }
-
- public static int getPlaceholder(String url) {
- if (isValidImage(url))
- return R.drawable.media_image_placeholder;
- else if(isDocument(url))
- return R.drawable.media_document;
- else if(isPowerpoint(url))
- return R.drawable.media_powerpoint;
- else if(isSpreadsheet(url))
- return R.drawable.media_spreadsheet;
- else if(isVideo(url))
- return R.drawable.media_movieclip;
- return 0;
- }
-
- /** E.g. Jul 2, 2013 @ 21:57 **/
- public static String getDate(long ms) {
- Date date = new Date(ms);
- SimpleDateFormat sdf = new SimpleDateFormat("MMM d, yyyy '@' HH:mm", Locale.ENGLISH);
-
- // The timezone on the website is at GMT
- sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
-
- return sdf.format(date);
- }
-
- public static void launchPictureLibrary(Fragment fragment) {
- Intent intent = new Intent(Intent.ACTION_PICK);
- intent.setType("image/*");
- intent.setAction(Intent.ACTION_GET_CONTENT);
-
- AppLockManager.getInstance().setExtendedTimeout();
- fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.pick_photo)), RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
- }
-
- public static void launchCamera(Activity activity, LaunchCameraCallback callback) {
- String state = android.os.Environment.getExternalStorageState();
- if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
- showSDCardRequiredDialog(activity);
- } else {
- Intent intent = prepareLaunchCameraIntent(callback);
- activity.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO);
- AppLockManager.getInstance().setExtendedTimeout();
- }
- }
-
- public static void launchCamera(Fragment fragment, LaunchCameraCallback callback) {
- String state = android.os.Environment.getExternalStorageState();
- if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
- showSDCardRequiredDialog(fragment.getActivity());
- } else {
- Intent intent = prepareLaunchCameraIntent(callback);
- fragment.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO);
- AppLockManager.getInstance().setExtendedTimeout();
- }
- }
-
- private static Intent prepareLaunchCameraIntent(LaunchCameraCallback callback) {
- File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
-
- String mediaCapturePath = path + File.separator + "Camera" + File.separator + "wp-" + System.currentTimeMillis() + ".jpg";
- Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
- intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mediaCapturePath)));
-
- if (callback != null) {
- callback.onMediaCapturePathReady(mediaCapturePath);
- }
-
- // make sure the directory we plan to store the recording in exists
- File directory = new File(mediaCapturePath).getParentFile();
- if (!directory.exists() && !directory.mkdirs()) {
- try {
- throw new IOException("Path to file could not be created.");
- } catch (IOException e) {
- AppLog.e(T.POSTS, e);
- }
- }
- return intent;
- }
-
- private static void showSDCardRequiredDialog(Activity activity) {
- AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
- dialogBuilder.setTitle(activity.getResources().getText(R.string.sdcard_title));
- dialogBuilder.setMessage(activity.getResources().getText(R.string.sdcard_message));
- dialogBuilder.setPositiveButton(activity.getString(R.string.ok), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- dialog.dismiss();
- }
- });
- dialogBuilder.setCancelable(true);
- dialogBuilder.create().show();
- }
-
- public static void launchVideoLibrary(Fragment fragment) {
- Intent intent = new Intent(Intent.ACTION_PICK);
- intent.setType("video/*");
- intent.setAction(Intent.ACTION_GET_CONTENT);
-
- AppLockManager.getInstance().setExtendedTimeout();
- fragment.startActivityForResult(Intent.createChooser(intent, fragment.getString(R.string.pick_video)), RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
- }
-
- public static void launchVideoCamera(Fragment fragment) {
- Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
- fragment.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO);
- AppLockManager.getInstance().setExtendedTimeout();
- }
-
- public static void launchVideoCamera(Activity activity) {
- Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
- activity.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO);
- AppLockManager.getInstance().setExtendedTimeout();
- }
-
- public static boolean isLocalFile(String state) {
- if (state == null)
- return false;
-
- if (state.equals("queued") || state.equals("uploading") || state.equals("retry") || state.equals("failed"))
- return true;
-
- return false;
- }
-
- public static Uri getLastRecordedVideoUri(Activity activity) {
- String[] proj = { MediaStore.Video.Media._ID };
- Uri contentUri = MediaStore.Video.Media.EXTERNAL_CONTENT_URI;
- String sortOrder = MediaStore.Video.VideoColumns.DATE_TAKEN + " DESC";
- CursorLoader loader = new CursorLoader(activity, contentUri, proj, null, null, sortOrder);
- Cursor cursor = loader.loadInBackground();
- cursor.moveToFirst();
-
- return Uri.parse(contentUri.toString() + "/" + cursor.getLong(0));
- }
-
- /**
- * This is a workaround for WP3.4.2 that deletes the media from the server when editing media properties within the app.
- * See: https://github.com/wordpress-mobile/WordPress-Android/issues/204
- * @return
- */
- public static boolean isWordPressVersionWithMediaEditingCapabilities() {
- if (WordPress.currentBlog == null)
- return false;
-
- if (WordPress.currentBlog.getWpVersion() == null)
- return true;
-
- if (WordPress.currentBlog.isDotcomFlag())
- return true;
-
- Version minVersion;
- Version currentVersion;
- try {
- minVersion = new Version("3.5.2");
- currentVersion = new Version(WordPress.currentBlog.getWpVersion());
-
- if( currentVersion.compareTo(minVersion) == -1 )
- return false;
-
- } catch (IllegalArgumentException e) {
- AppLog.e(T.POSTS, e);
- }
-
- return true;
- }
-
- public static boolean canDeleteMedia(String blogId, String mediaID) {
- Cursor cursor = WordPress.wpDB.getMediaFile(blogId, mediaID);
- if (!cursor.moveToFirst()) {
- cursor.close();
- return false;
- }
- String state = cursor.getString(cursor.getColumnIndex("uploadState"));
- cursor.close();
- if (state != null && state.equals("uploading")) {
- return false;
- }
- return true;
- }
-
- public static WPImageSpan prepareWPImageSpan(Context context, String blogId, final String mediaId) {
- Cursor cursor = WordPress.wpDB.getMediaFile(blogId, mediaId);
- if (cursor == null || !cursor.moveToFirst()){
- if (cursor != null)
- cursor.close();
- return null;
- }
-
- String url = cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_URL));
- if (url == null) {
- cursor.close();
- return null;
- }
-
- String mimeType = cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_MIME_TYPE));
- boolean isVideo = mimeType != null && mimeType.contains("video");
-
- Uri uri = Uri.parse(url);
- WPImageSpan imageSpan = new WPImageSpan(context,
- isVideo ? R.drawable.media_movieclip : R.drawable.dashicon_format_image_big_grey, uri);
- MediaFile mediaFile = imageSpan.getMediaFile();
- mediaFile.setMediaId(mediaId);
- mediaFile.setBlogId(blogId);
- mediaFile.setCaption(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_CAPTION)));
- mediaFile.setDescription(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_DESCRIPTION)));
- mediaFile.setTitle(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_TITLE)));
- mediaFile.setWidth(cursor.getInt(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_WIDTH)));
- mediaFile.setHeight(cursor.getInt(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_HEIGHT)));
- mediaFile.setMimeType(mimeType);
- mediaFile.setFileName(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_NAME)));
- mediaFile.setThumbnailURL(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_THUMBNAIL_URL)));
- mediaFile.setDateCreatedGMT(cursor.getLong(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_DATE_CREATED_GMT)));
- mediaFile.setVideoPressShortCode(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_VIDEO_PRESS_SHORTCODE)));
- mediaFile.setFileURL(cursor.getString(cursor.getColumnIndex(WordPressDB.COLUMN_NAME_FILE_URL)));
- mediaFile.setVideo(isVideo);
- mediaFile.save();
- cursor.close();
-
- return imageSpan;
- }
-
- // Calculate the minimun width between the blog setting and picture real width
- public static int getMinimumImageWidth(Context context, Uri curStream) {
- String imageWidth = WordPress.getCurrentBlog().getMaxImageWidth();
- int imageWidthBlogSetting = Integer.MAX_VALUE;
-
- if (!imageWidth.equals("Original Size")) {
- try {
- imageWidthBlogSetting = Integer.valueOf(imageWidth);
- } catch (NumberFormatException e) {
- AppLog.e(T.POSTS, e);
- }
- }
-
- int[] dimensions = ImageUtils.getImageSize(curStream, context);
- int imageWidthPictureSetting = dimensions[0] == 0 ? Integer.MAX_VALUE : dimensions[0];
-
- if (Math.min(imageWidthPictureSetting, imageWidthBlogSetting) == Integer.MAX_VALUE) {
- // Default value in case of errors reading the picture size and the blog settings is set to Original size
- return 1024;
- } else {
- return Math.min(imageWidthPictureSetting, imageWidthBlogSetting);
- }
- }
-
- public static void setWPImageSpanWidth(Context context, Uri curStream, WPImageSpan is) {
- MediaFile mediaFile = is.getMediaFile();
- if (mediaFile != null)
- mediaFile.setWidth(getMinimumImageWidth(context, curStream));
- }
-
- public static boolean isInMediaStore(Uri mediaUri) {
- // Check if the image is externally hosted (Picasa/Google Photos for example)
- if (mediaUri != null && mediaUri.toString().startsWith("content://media/")) {
- return true;
- } else {
- return false;
- }
- }
-
- public static Uri downloadExternalMedia(Context context, Uri imageUri) {
- if (context == null || imageUri == null) {
- return null;
- }
- File cacheDir = null;
-
- String mimeType = context.getContentResolver().getType(imageUri);
- boolean isVideo = (mimeType != null && mimeType.contains("video"));
-
- // If the device has an SD card
- if (android.os.Environment.getExternalStorageState().equals(android.os.Environment.MEDIA_MOUNTED)) {
- String mediaFolder = isVideo ? "video" : "images";
- cacheDir = new File(android.os.Environment.getExternalStorageDirectory() + "/WordPress/" + mediaFolder);
- } else {
- if (context.getApplicationContext() != null) {
- cacheDir = context.getApplicationContext().getCacheDir();
- }
- }
-
- if (cacheDir != null && !cacheDir.exists()) {
- cacheDir.mkdirs();
- }
- try {
- InputStream input;
- // Download the file
- if (imageUri.toString().startsWith("content://")) {
- input = context.getContentResolver().openInputStream(imageUri);
- if (input == null) {
- AppLog.e(T.UTILS, "openInputStream returned null");
- return null;
- }
- } else {
- input = new URL(imageUri.toString()).openStream();
- }
-
- String fileName = "wp-" + System.currentTimeMillis();
- if (isVideo) {
- fileName += "." + MimeTypeMap.getSingleton().getExtensionFromMimeType(mimeType);
- }
-
- File f = new File(cacheDir, fileName);
-
- OutputStream output = new FileOutputStream(f);
-
- byte data[] = new byte[1024];
- int count;
- while ((count = input.read(data)) != -1) {
- output.write(data, 0, count);
- }
-
- output.flush();
- output.close();
- input.close();
-
- return Uri.fromFile(f);
- } catch (FileNotFoundException e) {
- AppLog.e(T.UTILS, e);
- } catch (MalformedURLException e) {
- AppLog.e(T.UTILS, e);
- } catch (IOException e) {
- AppLog.e(T.UTILS, e);
- }
-
- return null;
- }
-
- public static String getMimeTypeOfInputStream(InputStream stream) {
- BitmapFactory.Options options = new BitmapFactory.Options();
- options.inJustDecodeBounds = true;
- BitmapFactory.decodeStream(stream, null, options);
- return options.outMimeType;
- }
-
- public static String getMediaFileMimeType(File mediaFile) {
- String originalFileName = mediaFile.getName().toLowerCase();
- String mimeType = UrlUtils.getUrlMimeType(originalFileName);
-
- if (TextUtils.isEmpty(mimeType)) {
- try {
- String filePathForGuessingMime;
- if (mediaFile.getPath().contains("://")) {
- filePathForGuessingMime = Uri.encode(mediaFile.getPath(), ":/");
- } else {
- filePathForGuessingMime = "file://"+ Uri.encode(mediaFile.getPath(), "/");
- }
- URL urlForGuessingMime = new URL(filePathForGuessingMime);
- URLConnection uc = urlForGuessingMime.openConnection();
- String guessedContentType = uc.getContentType(); //internally calls guessContentTypeFromName(url.getFile()); and guessContentTypeFromStream(is);
- // check if returned "content/unknown"
- if (!TextUtils.isEmpty(guessedContentType) && !guessedContentType.equals("content/unknown")) {
- mimeType = guessedContentType;
- }
- } catch (MalformedURLException e) {
- AppLog.e(AppLog.T.API, "MalformedURLException while trying to guess the content type for the file here " + mediaFile.getPath() + " with URLConnection", e);
- }
- catch (IOException e) {
- AppLog.e(AppLog.T.API, "Error while trying to guess the content type for the file here " + mediaFile.getPath() +" with URLConnection", e);
- }
- }
-
- // No mimeType yet? Try to decode the image and get the mimeType from there
- if (TextUtils.isEmpty(mimeType)) {
- try {
- DataInputStream inputStream = new DataInputStream(new FileInputStream(mediaFile));
- String mimeTypeFromStream = getMimeTypeOfInputStream(inputStream);
- if (!TextUtils.isEmpty(mimeTypeFromStream)) {
- mimeType = mimeTypeFromStream;
- }
- inputStream.close();
- } catch (FileNotFoundException e) {
- AppLog.e(AppLog.T.API, "FileNotFoundException while trying to guess the content type for the file " + mediaFile.getPath(), e);
- } catch (IOException e) {
- AppLog.e(AppLog.T.API, "IOException while trying to guess the content type for the file " + mediaFile.getPath(), e);
- }
- }
-
- if (TextUtils.isEmpty(mimeType)) {
- mimeType = "";
- } else {
- if (mimeType.equalsIgnoreCase("video/mp4v-es")) { //Fixes #533. See: http://tools.ietf.org/html/rfc3016
- mimeType = "video/mp4";
- }
- }
-
- return mimeType;
- }
-
- public static String getMediaFileName(File mediaFile, String mimeType) {
- String originalFileName = mediaFile.getName().toLowerCase();
- String extension = MimeTypeMap.getFileExtensionFromUrl(originalFileName);
- if (!TextUtils.isEmpty(extension)) //File name already has the extension in it
- return originalFileName;
-
- if (!TextUtils.isEmpty(mimeType)) { //try to get the extension from mimeType
- String fileExtension = getExtensionForMimeType(mimeType);
- if (!TextUtils.isEmpty(fileExtension)) {
- originalFileName += "." + fileExtension;
- }
- } else {
- //No mimetype and no extension!!
- AppLog.e(AppLog.T.API, "No mimetype and no extension for " + mediaFile.getPath());
- }
-
- return originalFileName;
- }
-
- public static String getExtensionForMimeType(String mimeType) {
- if (TextUtils.isEmpty(mimeType))
- return "";
-
- MimeTypeMap mimeTypeMap = MimeTypeMap.getSingleton();
- String fileExtensionFromMimeType = mimeTypeMap.getExtensionFromMimeType(mimeType);
- if (TextUtils.isEmpty(fileExtensionFromMimeType)) {
- // We're still without an extension - split the mime type and retrieve it
- String[] split = mimeType.split("/");
- fileExtensionFromMimeType = split.length > 1 ? split[1] : split[0];
- }
-
- return fileExtensionFromMimeType.toLowerCase();
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java
new file mode 100644
index 000000000..a432b1e49
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/WordPressMediaUtils.java
@@ -0,0 +1,224 @@
+package org.wordpress.android.ui.media;
+
+import android.app.Activity;
+import android.app.AlertDialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.database.Cursor;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.AsyncTask;
+import android.os.Environment;
+import android.provider.MediaStore;
+import android.widget.ImageView;
+
+import org.wordpress.android.R;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.util.AppLog;
+import org.wordpress.android.util.AppLog.T;
+import org.wordpress.android.util.MediaUtils;
+import org.wordpress.android.util.helpers.Version;
+import org.wordpress.passcodelock.AppLockManager;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.ref.WeakReference;
+import java.net.URL;
+
+import static org.wordpress.mediapicker.MediaUtils.fadeInImage;
+
+public class WordPressMediaUtils {
+ public class RequestCode {
+ public static final int ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY = 1000;
+ public static final int ACTIVITY_REQUEST_CODE_TAKE_PHOTO = 1100;
+ public static final int ACTIVITY_REQUEST_CODE_VIDEO_LIBRARY = 1200;
+ public static final int ACTIVITY_REQUEST_CODE_TAKE_VIDEO = 1300;
+ }
+
+ public interface LaunchCameraCallback {
+ public void onMediaCapturePathReady(String mediaCapturePath);
+ }
+
+ private static void showSDCardRequiredDialog(Activity activity) {
+ AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(activity);
+ dialogBuilder.setTitle(activity.getResources().getText(R.string.sdcard_title));
+ dialogBuilder.setMessage(activity.getResources().getText(R.string.sdcard_message));
+ dialogBuilder.setPositiveButton(activity.getString(R.string.ok), new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int whichButton) {
+ dialog.dismiss();
+ }
+ });
+ dialogBuilder.setCancelable(true);
+ dialogBuilder.create().show();
+ }
+
+ public static void launchVideoLibrary(Activity activity) {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setType("video/*");
+ intent.setAction(Intent.ACTION_GET_CONTENT);
+
+ AppLockManager.getInstance().setExtendedTimeout();
+ activity.startActivityForResult(Intent.createChooser(intent, activity.getString(R.string.pick_video)),
+ RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
+ }
+
+ public static void launchVideoCamera(Activity activity) {
+ Intent intent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);
+ activity.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO);
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+
+
+ public static void launchPictureLibrary(Activity activity) {
+ Intent intent = new Intent(Intent.ACTION_PICK);
+ intent.setType("image/*");
+ intent.setAction(Intent.ACTION_GET_CONTENT);
+ AppLockManager.getInstance().setExtendedTimeout();
+ activity.startActivityForResult(Intent.createChooser(intent, activity.getString(R.string.pick_photo)),
+ RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY);
+ }
+
+ public static void launchCamera(Activity activity, LaunchCameraCallback callback) {
+ String state = android.os.Environment.getExternalStorageState();
+ if (!state.equals(android.os.Environment.MEDIA_MOUNTED)) {
+ showSDCardRequiredDialog(activity);
+ } else {
+ Intent intent = prepareLaunchCameraIntent(callback);
+ activity.startActivityForResult(intent, RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO);
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+ }
+
+ private static Intent prepareLaunchCameraIntent(LaunchCameraCallback callback) {
+ File path = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM);
+
+ String mediaCapturePath = path + File.separator + "Camera" + File.separator + "wp-" + System.currentTimeMillis() + ".jpg";
+ Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
+ intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, Uri.fromFile(new File(mediaCapturePath)));
+
+ if (callback != null) {
+ callback.onMediaCapturePathReady(mediaCapturePath);
+ }
+
+ // make sure the directory we plan to store the recording in exists
+ File directory = new File(mediaCapturePath).getParentFile();
+ if (!directory.exists() && !directory.mkdirs()) {
+ try {
+ throw new IOException("Path to file could not be created.");
+ } catch (IOException e) {
+ AppLog.e(T.POSTS, e);
+ }
+ }
+ return intent;
+ }
+
+ public static int getPlaceholder(String url) {
+ if (MediaUtils.isValidImage(url)) {
+ return R.drawable.media_image_placeholder;
+ } else if (MediaUtils.isDocument(url)) {
+ return R.drawable.media_document;
+ } else if (MediaUtils.isPowerpoint(url)) {
+ return R.drawable.media_powerpoint;
+ } else if (MediaUtils.isSpreadsheet(url)) {
+ return R.drawable.media_spreadsheet;
+ } else if (MediaUtils.isVideo(url)) {
+ return R.drawable.media_movieclip;
+ }
+ return 0;
+ }
+
+ /**
+ * This is a workaround for WP3.4.2 that deletes the media from the server when editing media properties
+ * within the app. See: https://github.com/wordpress-mobile/WordPress-Android/issues/204
+ */
+ public static boolean isWordPressVersionWithMediaEditingCapabilities() {
+ if (WordPress.currentBlog == null) {
+ return false;
+ }
+
+ if (WordPress.currentBlog.getWpVersion() == null) {
+ return true;
+ }
+
+ if (WordPress.currentBlog.isDotcomFlag()) {
+ return true;
+ }
+
+ Version minVersion;
+ Version currentVersion;
+ try {
+ minVersion = new Version("3.5.2");
+ currentVersion = new Version(WordPress.currentBlog.getWpVersion());
+
+ if (currentVersion.compareTo(minVersion) == -1) {
+ return false;
+ }
+ } catch (IllegalArgumentException e) {
+ AppLog.e(T.POSTS, e);
+ }
+
+ return true;
+ }
+
+ public static boolean canDeleteMedia(String blogId, String mediaID) {
+ Cursor cursor = WordPress.wpDB.getMediaFile(blogId, mediaID);
+ if (!cursor.moveToFirst()) {
+ cursor.close();
+ return false;
+ }
+ String state = cursor.getString(cursor.getColumnIndex("uploadState"));
+ cursor.close();
+ if (state != null && state.equals("uploading")) {
+ return false;
+ }
+ return true;
+ }
+
+ public static class BackgroundDownloadWebImage extends AsyncTask<Uri, String, Bitmap> {
+ WeakReference<ImageView> mReference;
+
+ public BackgroundDownloadWebImage(ImageView resultStore) {
+ mReference = new WeakReference<>(resultStore);
+ }
+
+ @Override
+ protected Bitmap doInBackground(Uri... params) {
+ try {
+ String uri = params[0].toString();
+ Bitmap bitmap = WordPress.getBitmapCache().getBitmap(uri);
+
+ if (bitmap == null) {
+ URL url = new URL(uri);
+ bitmap = BitmapFactory.decodeStream(url.openConnection().getInputStream());
+ WordPress.getBitmapCache().put(uri, bitmap);
+ }
+
+ return bitmap;
+ }
+ catch(IOException notFoundException) {
+ return null;
+ }
+ }
+
+ @Override
+ protected void onPostExecute(Bitmap result) {
+ ImageView imageView = mReference.get();
+
+ if (imageView != null) {
+ if (imageView.getTag() == this) {
+ imageView.setImageBitmap(result);
+ fadeInImage(imageView, result);
+ }
+ }
+ }
+ }
+
+ public static Cursor getWordPressMediaImages(String blogId) {
+ return WordPress.wpDB.getMediaImagesForBlog(blogId);
+ }
+
+ public static Cursor getWordPressMediaVideos(String blogId) {
+ return WordPress.wpDB.getMediaFilesForBlog(blogId);
+ }
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/media/services/MediaUploadService.java b/WordPress/src/main/java/org/wordpress/android/ui/media/services/MediaUploadService.java
index 8ae2728ff..f8f7c650a 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/media/services/MediaUploadService.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/media/services/MediaUploadService.java
@@ -10,8 +10,8 @@ import android.support.v4.content.LocalBroadcastManager;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
+import org.wordpress.android.util.helpers.MediaFile;
import org.wordpress.android.WordPressDB;
-import org.wordpress.android.models.MediaFile;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.CrashlyticsUtils;
import org.wordpress.android.util.CrashlyticsUtils.ExceptionType;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsActivity.java
index 3ae024c4f..bfdbba793 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsActivity.java
@@ -1,8 +1,8 @@
package org.wordpress.android.ui.notifications;
import android.content.Intent;
-import android.support.v7.app.ActionBar;
import android.os.Bundle;
+import android.support.v7.app.ActionBar;
import org.wordpress.android.GCMIntentService;
import org.wordpress.android.R;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailListFragment.java
index 56bf44729..6bca918ed 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailListFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsDetailListFragment.java
@@ -33,7 +33,7 @@ import org.wordpress.android.ui.notifications.blocks.UserNoteBlock;
import org.wordpress.android.ui.notifications.utils.NotificationsUtils;
import org.wordpress.android.ui.notifications.utils.SimperiumUtils;
import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import java.util.ArrayList;
import java.util.List;
@@ -259,7 +259,7 @@ public class NotificationsDetailListFragment extends ListFragment implements Not
JSONObject noteObject = bodyArray.getJSONObject(i);
// Determine NoteBlock type and add it to the array
NoteBlock noteBlock;
- String noteBlockTypeString = JSONUtil.queryJSON(noteObject, "type", "");
+ String noteBlockTypeString = JSONUtils.queryJSON(noteObject, "type", "");
if (NoteBlockRangeType.fromString(noteBlockTypeString) == NoteBlockRangeType.USER) {
if (mNote.isCommentType()) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsListFragment.java
index c83d9f228..ce02b7dd9 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsListFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/NotificationsListFragment.java
@@ -34,8 +34,8 @@ import org.wordpress.android.ui.notifications.utils.SimperiumUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.ToastUtils;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import javax.annotation.Nonnull;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderUserNoteBlock.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderUserNoteBlock.java
index cfefc27a5..46c1d7e25 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderUserNoteBlock.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/HeaderUserNoteBlock.java
@@ -11,9 +11,9 @@ import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONObject;
import org.wordpress.android.R;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.ui.notifications.utils.NotificationsUtils;
import org.wordpress.android.util.GravatarUtils;
-import org.wordpress.android.util.JSONUtil;
import org.wordpress.android.widgets.WPNetworkImageView;
// Note header, displayed at top of detail view
@@ -85,19 +85,19 @@ public class HeaderUserNoteBlock extends NoteBlock {
};
private String getUserName() {
- return JSONUtil.queryJSON(mHeaderArray, "[0].text", "");
+ return JSONUtils.queryJSON(mHeaderArray, "[0].text", "");
}
private String getAvatarUrl() {
- return GravatarUtils.fixGravatarUrl(JSONUtil.queryJSON(mHeaderArray, "[0].media[0].url", ""), mAvatarSize);
+ return GravatarUtils.fixGravatarUrl(JSONUtils.queryJSON(mHeaderArray, "[0].media[0].url", ""), mAvatarSize);
}
private String getUserUrl() {
- return JSONUtil.queryJSON(mHeaderArray, "[0].ranges[0].url", "");
+ return JSONUtils.queryJSON(mHeaderArray, "[0].ranges[0].url", "");
}
private String getSnippet() {
- return JSONUtil.queryJSON(mHeaderArray, "[1].text", "");
+ return JSONUtils.queryJSON(mHeaderArray, "[1].text", "");
}
@Override
@@ -148,8 +148,8 @@ public class HeaderUserNoteBlock extends NoteBlock {
if (event.getActionMasked() == MotionEvent.ACTION_UP && mGravatarClickedListener != null) {
// Fire the listener, which will load the site preview for the user's site
// In the future we can use this to load a 'profile view' (currently in R&D)
- long siteId = Long.valueOf(JSONUtil.queryJSON(mHeaderArray, "[0].ranges[0].site_id", 0));
- long userId = Long.valueOf(JSONUtil.queryJSON(mHeaderArray, "[0].ranges[0].id", 0));
+ long siteId = Long.valueOf(JSONUtils.queryJSON(mHeaderArray, "[0].ranges[0].site_id", 0));
+ long userId = Long.valueOf(JSONUtils.queryJSON(mHeaderArray, "[0].ranges[0].id", 0));
String siteUrl = getUserUrl();
if (siteId > 0 && userId > 0) {
mGravatarClickedListener.onGravatarClicked(siteId, userId, siteUrl);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlock.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlock.java
index 317191a10..6c33b2bbf 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlock.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlock.java
@@ -25,7 +25,7 @@ import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.ui.notifications.utils.NotificationsUtils;
import org.wordpress.android.util.DisplayUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.widgets.WPTextView;
/**
@@ -72,20 +72,20 @@ public class NoteBlock {
}
public String getMetaHomeTitle() {
- return JSONUtil.queryJSON(mNoteData, "meta.titles.home", "");
+ return JSONUtils.queryJSON(mNoteData, "meta.titles.home", "");
}
public long getMetaSiteId() {
- return JSONUtil.queryJSON(mNoteData, "meta.ids.site", -1);
+ return JSONUtils.queryJSON(mNoteData, "meta.ids.site", -1);
}
public String getMetaSiteUrl() {
- return JSONUtil.queryJSON(mNoteData, "meta.links.home", "");
+ return JSONUtils.queryJSON(mNoteData, "meta.links.home", "");
}
JSONObject getNoteMediaItem() {
if (mMediaItem == null) {
- mMediaItem = JSONUtil.queryJSON(mNoteData, "media[0]", new JSONObject());
+ mMediaItem = JSONUtils.queryJSON(mNoteData, "media[0]", new JSONObject());
}
return mMediaItem;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlockClickableSpan.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlockClickableSpan.java
index cae4534ae..59dcc61ca 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlockClickableSpan.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/NoteBlockClickableSpan.java
@@ -10,8 +10,8 @@ import android.view.View;
import org.json.JSONArray;
import org.json.JSONObject;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.R;
-import org.wordpress.android.util.JSONUtil;
import javax.annotation.Nonnull;
@@ -44,11 +44,11 @@ public class NoteBlockClickableSpan extends ClickableSpan {
private void processRangeData() {
if (mBlockData != null) {
- mId = JSONUtil.queryJSON(mBlockData, "id", 0);
- mSiteId = JSONUtil.queryJSON(mBlockData, "site_id", 0);
- mPostId = JSONUtil.queryJSON(mBlockData, "post_id", 0);
- mRangeType = NoteBlockRangeType.fromString(JSONUtil.queryJSON(mBlockData, "type", ""));
- mUrl = JSONUtil.queryJSON(mBlockData, "url", "");
+ mId = JSONUtils.queryJSON(mBlockData, "id", 0);
+ mSiteId = JSONUtils.queryJSON(mBlockData, "site_id", 0);
+ mPostId = JSONUtils.queryJSON(mBlockData, "post_id", 0);
+ mRangeType = NoteBlockRangeType.fromString(JSONUtils.queryJSON(mBlockData, "type", ""));
+ mUrl = JSONUtils.queryJSON(mBlockData, "url", "");
mIndices = new int[]{0,0};
JSONArray indicesArray = mBlockData.optJSONArray("indices");
if (indicesArray != null) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/UserNoteBlock.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/UserNoteBlock.java
index bfcb256eb..186ac6373 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/UserNoteBlock.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/blocks/UserNoteBlock.java
@@ -1,7 +1,6 @@
package org.wordpress.android.ui.notifications.blocks;
import android.content.Context;
-import android.graphics.Color;
import android.text.TextUtils;
import android.view.MotionEvent;
import android.view.View;
@@ -10,8 +9,8 @@ import android.widget.TextView;
import org.json.JSONObject;
import org.wordpress.android.R;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.GravatarUtils;
-import org.wordpress.android.util.JSONUtil;
import org.wordpress.android.widgets.WPNetworkImageView;
/**
@@ -133,15 +132,15 @@ public class UserNoteBlock extends NoteBlock {
}
String getUserUrl() {
- return JSONUtil.queryJSON(getNoteData(), "meta.links.home", "");
+ return JSONUtils.queryJSON(getNoteData(), "meta.links.home", "");
}
private String getUserBlogTitle() {
- return JSONUtil.queryJSON(getNoteData(), "meta.titles.home", "");
+ return JSONUtils.queryJSON(getNoteData(), "meta.titles.home", "");
}
private String getUserBlogTagline() {
- return JSONUtil.queryJSON(getNoteData(), "meta.titles.tagline", "");
+ return JSONUtils.queryJSON(getNoteData(), "meta.titles.tagline", "");
}
private boolean hasUserUrl() {
@@ -189,8 +188,8 @@ public class UserNoteBlock extends NoteBlock {
};
private void showBlogPreview() {
- long siteId = Long.valueOf(JSONUtil.queryJSON(getNoteData(), "meta.ids.site", 0));
- long userId = Long.valueOf(JSONUtil.queryJSON(getNoteData(), "meta.ids.user", 0));
+ long siteId = Long.valueOf(JSONUtils.queryJSON(getNoteData(), "meta.ids.site", 0));
+ long userId = Long.valueOf(JSONUtils.queryJSON(getNoteData(), "meta.ids.user", 0));
String siteUrl = getUserUrl();
if (mGravatarClickedListener != null) {
mGravatarClickedListener.onGravatarClicked(siteId, userId, siteUrl);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java
index 314050ac1..410fa68d7 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/notifications/utils/NotificationsUtils.java
@@ -36,9 +36,9 @@ import org.wordpress.android.ui.notifications.blocks.NoteBlockRangeType;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.DeviceUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.MapUtils;
-import org.wordpress.android.util.WPImageGetter;
+import org.wordpress.android.util.helpers.WPImageGetter;
import java.util.ArrayList;
import java.util.HashMap;
@@ -305,8 +305,8 @@ public class NotificationsUtils {
final Drawable remoteDrawable = imageGetter.getDrawable(mediaObject.optString("url", ""));
ImageSpan noteImageSpan = new ImageSpan(remoteDrawable, mediaObject.optString("url", ""));
- int startIndex = JSONUtil.queryJSON(mediaObject, "indices[0]", -1);
- int endIndex = JSONUtil.queryJSON(mediaObject, "indices[1]", -1);
+ int startIndex = JSONUtils.queryJSON(mediaObject, "indices[0]", -1);
+ int endIndex = JSONUtils.queryJSON(mediaObject, "indices[1]", -1);
if (startIndex >= 0) {
startIndex += indexAdjustment;
endIndex += indexAdjustment;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditLinkActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditLinkActivity.java
deleted file mode 100644
index 4d682b9fc..000000000
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditLinkActivity.java
+++ /dev/null
@@ -1,77 +0,0 @@
-package org.wordpress.android.ui.posts;
-
-import android.app.Activity;
-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.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/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
index 815b10bc8..82db1eb71 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostActivity.java
@@ -1,40 +1,90 @@
package org.wordpress.android.ui.posts;
+import android.app.Activity;
import android.app.Fragment;
import android.app.FragmentManager;
+import android.app.NotificationManager;
+import android.content.BroadcastReceiver;
+import android.content.Context;
import android.content.Intent;
+import android.content.IntentFilter;
+import android.database.Cursor;
+import android.graphics.BitmapFactory;
+import android.net.Uri;
+import android.os.AsyncTask;
import android.os.Bundle;
+import android.os.Environment;
import android.support.v13.app.FragmentPagerAdapter;
+import android.support.v4.app.NotificationCompat;
+import android.support.v4.content.LocalBroadcastManager;
import android.support.v4.view.ViewPager;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.text.Html;
+import android.text.Spannable;
+import android.text.SpannableStringBuilder;
+import android.text.Spanned;
+import android.text.TextUtils;
+import android.text.style.CharacterStyle;
+import android.text.style.SuggestionSpan;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.ViewGroup;
import android.widget.Toast;
+import org.wordpress.android.Constants;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
+import org.wordpress.android.analytics.AnalyticsTracker.Stat;
+import org.wordpress.android.editor.EditorFragmentAbstract;
+import org.wordpress.android.editor.EditorFragmentAbstract.EditorFragmentListener;
+import org.wordpress.android.editor.LegacyEditorFragment;
import org.wordpress.android.models.Blog;
import org.wordpress.android.models.Post;
import org.wordpress.android.models.PostStatus;
import org.wordpress.android.ui.ActivityId;
+import org.wordpress.android.ui.media.MediaGalleryActivity;
+import org.wordpress.android.ui.media.MediaGalleryPickerActivity;
+import org.wordpress.android.ui.media.MediaGridFragment;
+import org.wordpress.android.ui.media.MediaPickerActivity;
+import org.wordpress.android.ui.media.MediaSourceWPImages;
+import org.wordpress.android.ui.media.MediaSourceWPVideos;
+import org.wordpress.android.ui.media.WordPressMediaUtils;
+import org.wordpress.android.ui.media.WordPressMediaUtils.RequestCode;
+import org.wordpress.android.ui.media.services.MediaUploadService;
import org.wordpress.android.util.AppLog;
+import org.wordpress.android.util.AppLog.T;
+import org.wordpress.android.util.AutolinkUtils;
+import org.wordpress.android.util.ImageUtils;
+import org.wordpress.android.util.MediaUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
+import org.wordpress.android.util.WPHtml;
+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.widgets.WPViewPager;
+import org.wordpress.mediapicker.MediaItem;
+import org.wordpress.mediapicker.source.MediaSource;
+import org.wordpress.mediapicker.source.MediaSourceDeviceImages;
+import org.wordpress.mediapicker.source.MediaSourceDeviceVideos;
+import org.wordpress.passcodelock.AppLockManager;
+import org.xmlrpc.android.ApiHelper;
+import java.io.File;
+import java.util.ArrayList;
import java.util.HashMap;
+import java.util.List;
import java.util.Map;
import java.util.Timer;
import java.util.TimerTask;
-public class EditPostActivity extends ActionBarActivity {
+public class EditPostActivity extends ActionBarActivity implements EditorFragmentListener {
public static final String EXTRA_POSTID = "postId";
public static final String EXTRA_IS_PAGE = "isPage";
public static final String EXTRA_IS_NEW_POST = "isNewPost";
@@ -43,6 +93,9 @@ public class EditPostActivity extends ActionBarActivity {
public static final String STATE_KEY_CURRENT_POST = "stateKeyCurrentPost";
public static final String STATE_KEY_ORIGINAL_POST = "stateKeyOriginalPost";
+ private static final String ANALYTIC_PROP_NUM_LOCAL_PHOTOS_ADDED = "number_of_local_photos_added";
+ private static final String ANALYTIC_PROP_NUM_WP_PHOTOS_ADDED = "number_of_wp_library_photos_added";
+
private static int PAGE_CONTENT = 0;
private static int PAGE_SETTINGS = 1;
private static int PAGE_PREVIEW = 2;
@@ -50,6 +103,13 @@ public class EditPostActivity extends ActionBarActivity {
private static final int AUTOSAVE_INTERVAL_MILLIS = 10000;
private Timer mAutoSaveTimer;
+ // Each element is a list of media IDs being uploaded to a gallery, keyed by gallery ID
+ private Map<Long, List<String>> mPendingGalleryUploads = new HashMap<>();
+
+ // -1=no response yet, 0=unavailable, 1=available
+ private int mBlogMediaStatus = -1;
+ private boolean mMediaUploadServiceStarted;
+
/**
* The {@link android.support.v4.view.PagerAdapter} that will provide
* fragments for each of the sections. We use a
@@ -68,7 +128,7 @@ public class EditPostActivity extends ActionBarActivity {
private Post mPost;
private Post mOriginalPost;
- private EditPostContentFragment mEditPostContentFragment;
+ private EditorFragmentAbstract mEditorFragment;
private EditPostSettingsFragment mEditPostSettingsFragment;
private EditPostPreviewFragment mEditPostPreviewFragment;
@@ -90,8 +150,8 @@ public class EditPostActivity extends ActionBarActivity {
String action = getIntent().getAction();
if (savedInstanceState == null) {
if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)
- || EditPostContentFragment.NEW_MEDIA_GALLERY.equals(action)
- || EditPostContentFragment.NEW_MEDIA_POST.equals(action)
+ || NEW_MEDIA_GALLERY.equals(action)
+ || NEW_MEDIA_POST.equals(action)
|| getIntent().hasExtra(EXTRA_IS_QUICKPRESS)
|| (extras != null && extras.getInt("quick-media", -1) > -1)) {
if (getIntent().hasExtra(EXTRA_QUICKPRESS_BLOG_ID)) {
@@ -181,6 +241,9 @@ public class EditPostActivity extends ActionBarActivity {
}
});
ActivityId.trackLastActivity(ActivityId.POST_EDITOR);
+
+ registerReceiver(mGalleryReceiver,
+ new IntentFilter(LegacyEditorFragment.ACTION_MEDIA_GALLERY_TOUCHED));
}
class AutoSaveTask extends TimerTask {
@@ -192,19 +255,29 @@ public class EditPostActivity extends ActionBarActivity {
@Override
protected void onResume() {
super.onResume();
+ refreshBlogMedia();
mAutoSaveTimer = new Timer();
mAutoSaveTimer.scheduleAtFixedRate(new AutoSaveTask(), AUTOSAVE_INTERVAL_MILLIS, AUTOSAVE_INTERVAL_MILLIS);
+
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
+ lbm.registerReceiver(mMediaUploadReceiver,
+ new IntentFilter(MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION));
+
}
@Override
protected void onPause() {
super.onPause();
+ LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(this);
+ lbm.unregisterReceiver(mMediaUploadReceiver);
+ stopMediaUploadService();
mAutoSaveTimer.cancel();
}
@Override
protected void onDestroy() {
super.onDestroy();
+ unregisterReceiver(mGalleryReceiver);
AnalyticsTracker.track(AnalyticsTracker.Stat.EDITOR_CLOSED_POST);
}
@@ -353,7 +426,7 @@ public class EditPostActivity extends ActionBarActivity {
// Post created with share with WordPress
normalizedSourceName = "shared-from-external-app";
}
- if (EditPostContentFragment.NEW_MEDIA_GALLERY.equals(action) || EditPostContentFragment.NEW_MEDIA_POST.equals(
+ if (EditPostActivity.NEW_MEDIA_GALLERY.equals(action) || EditPostActivity.NEW_MEDIA_POST.equals(
action)) {
// Post created from the media library
normalizedSourceName = "media-library";
@@ -377,8 +450,8 @@ public class EditPostActivity extends ActionBarActivity {
}
// Update post object from fragment fields
- if (mEditPostContentFragment != null) {
- mEditPostContentFragment.updatePostContent(isAutosave);
+ if (mEditorFragment != null) {
+ updatePostContent(isAutosave);
}
if (mEditPostSettingsFragment != null) {
mEditPostSettingsFragment.updatePostSettings();
@@ -405,18 +478,18 @@ public class EditPostActivity extends ActionBarActivity {
return;
}
- if (getSupportActionBar() != null) {
- if (getSupportActionBar().isShowing()) {
- saveAndFinish();
- } else if (mEditPostContentFragment != null) {
- mEditPostContentFragment.setContentEditingModeVisible(false);
- }
+ if (mEditorFragment != null && !mEditorFragment.onBackPressed()) {
+ saveAndFinish();
}
}
+ private boolean hasEmptyContentFields() {
+ return TextUtils.isEmpty(mEditorFragment.getTitle()) && TextUtils.isEmpty(mEditorFragment.getContent());
+ }
+
private void saveAndFinish() {
savePost(true);
- if (mEditPostContentFragment != null && mEditPostContentFragment.hasEmptyContentFields()) {
+ if (mEditorFragment != null && hasEmptyContentFields()) {
// new and empty post? delete it
if (mIsNewPost) {
WordPress.wpDB.deletePost(mPost);
@@ -438,10 +511,6 @@ public class EditPostActivity extends ActionBarActivity {
finish();
}
- public void showPostSettings() {
- mViewPager.setCurrentItem(PAGE_SETTINGS);
- }
-
/**
* A {@link FragmentPagerAdapter} that returns a fragment corresponding to
* one of the sections/tabs/pages.
@@ -456,7 +525,8 @@ public class EditPostActivity extends ActionBarActivity {
// getItem is called to instantiate the fragment for the given page.
switch (position) {
case 0:
- return new EditPostContentFragment();
+ // TODO: switch between legacy and new editor here (AB test?)
+ return new LegacyEditorFragment();
case 1:
return new EditPostSettingsFragment();
default:
@@ -469,13 +539,13 @@ public class EditPostActivity extends ActionBarActivity {
Fragment fragment = (Fragment) super.instantiateItem(container, position);
switch (position) {
case 0:
- mEditPostContentFragment = (EditPostContentFragment)fragment;
+ mEditorFragment = (EditorFragmentAbstract) fragment;
break;
case 1:
- mEditPostSettingsFragment = (EditPostSettingsFragment)fragment;
+ mEditPostSettingsFragment = (EditPostSettingsFragment) fragment;
break;
case 2:
- mEditPostPreviewFragment = (EditPostPreviewFragment)fragment;
+ mEditPostPreviewFragment = (EditPostPreviewFragment) fragment;
break;
}
return fragment;
@@ -491,4 +561,887 @@ public class EditPostActivity extends ActionBarActivity {
public boolean isEditingPostContent() {
return (mViewPager.getCurrentItem() == PAGE_CONTENT);
}
+
+ // Moved from EditPostContentFragment
+ public static final String NEW_MEDIA_GALLERY = "NEW_MEDIA_GALLERY";
+ public static final String NEW_MEDIA_GALLERY_EXTRA_IDS = "NEW_MEDIA_GALLERY_EXTRA_IDS";
+ public static final String NEW_MEDIA_POST = "NEW_MEDIA_POST";
+ public static final String NEW_MEDIA_POST_EXTRA = "NEW_MEDIA_POST_ID";
+ private String mMediaCapturePath = "";
+ private int mMaxThumbWidth = 0;
+
+ private int getMaximumThumbnailWidthForEditor() {
+ if (mMaxThumbWidth == 0) {
+ mMaxThumbWidth = ImageUtils.getMaximumThumbnailWidthForEditor(this);
+ }
+ return mMaxThumbWidth;
+ }
+
+ private MediaFile createMediaFile(String blogId, final String mediaId) {
+ Cursor cursor = WordPress.wpDB.getMediaFile(blogId, mediaId);
+
+ if (cursor == null || !cursor.moveToFirst()) {
+ if (cursor != null) {
+ cursor.close();
+ }
+ return null;
+ }
+
+ String url = cursor.getString(cursor.getColumnIndex("fileURL"));
+ if (url == null) {
+ cursor.close();
+ return null;
+ }
+
+ String mimeType = cursor.getString(cursor.getColumnIndex("mimeType"));
+ boolean isVideo = mimeType != null && mimeType.contains("video");
+ MediaFile mediaFile = new MediaFile();
+ mediaFile.setMediaId(mediaId);
+ mediaFile.setBlogId(blogId);
+ mediaFile.setCaption(cursor.getString(cursor.getColumnIndex("caption")));
+ mediaFile.setDescription(cursor.getString(cursor.getColumnIndex("description")));
+ mediaFile.setTitle(cursor.getString(cursor.getColumnIndex("title")));
+ mediaFile.setWidth(cursor.getInt(cursor.getColumnIndex("width")));
+ mediaFile.setHeight(cursor.getInt(cursor.getColumnIndex("height")));
+ mediaFile.setMimeType(mimeType);
+ mediaFile.setFileName(cursor.getString(cursor.getColumnIndex("fileName")));
+ mediaFile.setThumbnailURL(cursor.getString(cursor.getColumnIndex("thumbnailURL")));
+ mediaFile.setDateCreatedGMT(cursor.getLong(cursor.getColumnIndex("date_created_gmt")));
+ mediaFile.setVideoPressShortCode(cursor.getString(cursor.getColumnIndex("videoPressShortcode")));
+ mediaFile.setFileURL(cursor.getString(cursor.getColumnIndex("fileURL")));
+ mediaFile.setVideo(isVideo);
+ WordPress.wpDB.saveMediaFile(mediaFile);
+ cursor.close();
+ return mediaFile;
+ }
+
+ private void addExistingMediaToEditor(String mediaId) {
+ if (WordPress.getCurrentBlog() == null) {
+ return;
+ }
+ String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
+ MediaFile mediaFile = createMediaFile(blogId, mediaId);
+ if (mediaFile == null) {
+ return;
+ }
+ mEditorFragment.appendMediaFile(mediaFile, getMediaUrl(mediaFile), WordPress.imageLoader);
+ }
+
+ /**
+ * Get media url from a MediaFile, returns a photon URL if the selected blog is Photon capable.
+ */
+ private String getMediaUrl(MediaFile mediaFile) {
+ if (mediaFile == null) {
+ return null;
+ }
+ String imageURL;
+ if (WordPress.getCurrentBlog() != null && WordPress.getCurrentBlog().isPhotonCapable()) {
+ String photonUrl = mediaFile.getFileURL();
+ imageURL = StringUtils.getPhotonUrl(photonUrl, getMaximumThumbnailWidthForEditor());
+ } else {
+ // Not a Jetpack or wpcom blog
+ // imageURL = mediaFile.getThumbnailURL(); // do not use fileURL here since downloading picture
+ // of big dimensions can result in OOM Exception
+ imageURL = mediaFile.getFileURL() != null ? mediaFile.getFileURL() : mediaFile.getThumbnailURL();
+ }
+ return imageURL;
+ }
+
+ private class LoadPostContentTask extends AsyncTask<String, Spanned, Spanned> {
+ @Override
+ protected Spanned doInBackground(String... params) {
+ if (params.length < 1 || getPost() == null) {
+ return null;
+ }
+
+ String content = StringUtils.notNullStr(params[0]);
+ return WPHtml.fromHtml(content, EditPostActivity.this, getPost(), getMaximumThumbnailWidthForEditor());
+ }
+
+ @Override
+ protected void onPostExecute(Spanned spanned) {
+ if (spanned != null) {
+ mEditorFragment.setContent(spanned);
+ }
+ }
+ }
+
+ private void fillContentEditorFields() {
+ // Needed blog settings needed by the editor
+ if (WordPress.getCurrentBlog() != null) {
+ mEditorFragment.setFeaturedImageSupported(WordPress.getCurrentBlog().isFeaturedImageCapable());
+ mEditorFragment.setBlogSettingMaxImageWidth(WordPress.getCurrentBlog().getMaxImageWidth());
+ }
+
+ // Set post title and content
+ Post post = getPost();
+ if (post != null) {
+ if (!TextUtils.isEmpty(post.getContent())) {
+ if (post.isLocalDraft()) {
+ // Load local post content in the background, as it may take time to generate images
+ new LoadPostContentTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
+ post.getContent().replaceAll("\uFFFC", ""));
+ }
+ else {
+ mEditorFragment.setContent(post.getContent().replaceAll("\uFFFC", ""));
+ }
+ }
+ if (!TextUtils.isEmpty(post.getTitle())) {
+ mEditorFragment.setTitle(post.getTitle());
+ }
+ // TODO: postSettingsButton.setText(post.isPage() ? R.string.page_settings : R.string.post_settings);
+ mEditorFragment.setLocalDraft(post.isLocalDraft());
+ }
+
+ // Special actions
+ String action = getIntent().getAction();
+ int quickMediaType = getIntent().getIntExtra("quick-media", -1);
+ if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
+ setPostContentFromShareAction();
+ } else if (NEW_MEDIA_GALLERY.equals(action)) {
+ prepareMediaGallery();
+ } else if (NEW_MEDIA_POST.equals(action)) {
+ prepareMediaPost();
+ } else if (quickMediaType >= 0) {
+ // User selected 'Quick Photo' in the menu drawer
+ if (quickMediaType == Constants.QUICK_POST_PHOTO_CAMERA) {
+ launchCamera();
+ } else if (quickMediaType == Constants.QUICK_POST_PHOTO_LIBRARY) {
+ WordPressMediaUtils.launchPictureLibrary(this);
+ }
+ if (post != null) {
+ post.setQuickPostType(Post.QUICK_MEDIA_TYPE_PHOTO);
+ }
+ }
+ }
+
+ private void launchCamera() {
+ WordPressMediaUtils.launchCamera(this, new WordPressMediaUtils.LaunchCameraCallback() {
+ @Override
+ public void onMediaCapturePathReady(String mediaCapturePath) {
+ mMediaCapturePath = mediaCapturePath;
+ AppLockManager.getInstance().setExtendedTimeout();
+ }
+ });
+ }
+
+ protected void setPostContentFromShareAction() {
+ Intent intent = getIntent();
+
+ // Check for shared text
+ String text = intent.getStringExtra(Intent.EXTRA_TEXT);
+ String title = intent.getStringExtra(Intent.EXTRA_SUBJECT);
+ if (text != null) {
+ if (title != null) {
+ mEditorFragment.setTitle(title);
+ }
+ // Create an <a href> element around links
+ text = AutolinkUtils.autoCreateLinks(text);
+ mEditorFragment.setContent(WPHtml.fromHtml(StringUtils.addPTags(text), this, getPost(),
+ getMaximumThumbnailWidthForEditor()));
+ }
+
+ // Check for shared media
+ if (intent.hasExtra(Intent.EXTRA_STREAM)) {
+ String action = intent.getAction();
+ String type = intent.getType();
+ ArrayList<Uri> sharedUris;
+
+ if (Intent.ACTION_SEND_MULTIPLE.equals(action)) {
+ sharedUris = intent.getParcelableArrayListExtra((Intent.EXTRA_STREAM));
+ } else {
+ // For a single media share, we only allow images and video types
+ if (type != null && (type.startsWith("image") || type.startsWith("video"))) {
+ sharedUris = new ArrayList<Uri>();
+ sharedUris.add((Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM));
+ } else {
+ return;
+ }
+ }
+
+ if (sharedUris != null) {
+ for (Uri uri : sharedUris) {
+ addMedia(uri);
+ }
+ }
+ }
+ }
+
+ private void startMediaGalleryActivity(MediaGallery mediaGallery) {
+ Intent intent = new Intent(this, MediaGalleryActivity.class);
+ intent.putExtra(MediaGalleryActivity.PARAMS_MEDIA_GALLERY, mediaGallery);
+ if (mediaGallery == null) {
+ intent.putExtra(MediaGalleryActivity.PARAMS_LAUNCH_PICKER, true);
+ }
+ startActivityForResult(intent, MediaGalleryActivity.REQUEST_CODE);
+ }
+
+ private void prepareMediaGallery() {
+ MediaGallery mediaGallery = new MediaGallery();
+ mediaGallery.setIds(getIntent().getStringArrayListExtra(NEW_MEDIA_GALLERY_EXTRA_IDS));
+ startMediaGalleryActivity(mediaGallery);
+ }
+
+ private void prepareMediaPost() {
+ String mediaId = getIntent().getStringExtra(NEW_MEDIA_POST_EXTRA);
+ addExistingMediaToEditor(mediaId);
+ }
+
+ /**
+ * Updates post object with content of this fragment
+ */
+ public void updatePostContent(boolean isAutoSave) {
+ Post post = getPost();
+
+ if (post == null) {
+ return;
+ }
+ String title = StringUtils.notNullStr((String) mEditorFragment.getTitle());
+ SpannableStringBuilder postContent;
+ if (mEditorFragment.getSpannedContent() != null) {
+ // needed by the legacy editor to save local drafts
+ postContent = new SpannableStringBuilder(mEditorFragment.getSpannedContent());
+ } else {
+ postContent = new SpannableStringBuilder(StringUtils.notNullStr((String) mEditorFragment.getContent()));
+ }
+
+ String content;
+ if (post.isLocalDraft()) {
+ // remove suggestion spans, they cause craziness in WPHtml.toHTML().
+ CharacterStyle[] characterStyles = postContent.getSpans(0, postContent.length(), CharacterStyle.class);
+ for (CharacterStyle characterStyle : characterStyles) {
+ if (characterStyle instanceof SuggestionSpan) {
+ postContent.removeSpan(characterStyle);
+ }
+ }
+ content = WPHtml.toHtml(postContent);
+ // replace duplicate <p> tags so there's not duplicates, trac #86
+ content = content.replace("<p><p>", "<p>");
+ content = content.replace("</p></p>", "</p>");
+ content = content.replace("<br><br>", "<br>");
+ // sometimes the editor creates extra tags
+ content = content.replace("</strong><strong>", "").replace("</em><em>", "").replace("</u><u>", "")
+ .replace("</strike><strike>", "").replace("</blockquote><blockquote>", "");
+ } else {
+ if (!isAutoSave) {
+ // Add gallery shortcode
+ MediaGalleryImageSpan[] gallerySpans = postContent.getSpans(0, postContent.length(),
+ MediaGalleryImageSpan.class);
+ for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
+ int start = postContent.getSpanStart(gallerySpan);
+ postContent.removeSpan(gallerySpan);
+ postContent.insert(start, WPHtml.getGalleryShortcode(gallerySpan));
+ }
+ }
+
+ WPImageSpan[] imageSpans = postContent.getSpans(0, postContent.length(), WPImageSpan.class);
+ if (imageSpans.length != 0) {
+ for (WPImageSpan wpIS : imageSpans) {
+ MediaFile mediaFile = wpIS.getMediaFile();
+ if (mediaFile == null)
+ continue;
+ if (mediaFile.getMediaId() != null) {
+ updateMediaFileOnServer(wpIS);
+ } else {
+ mediaFile.setFileName(wpIS.getImageSource().toString());
+ mediaFile.setFilePath(wpIS.getImageSource().toString());
+ WordPress.wpDB.saveMediaFile(mediaFile);
+ }
+
+ int tagStart = postContent.getSpanStart(wpIS);
+ if (!isAutoSave) {
+ postContent.removeSpan(wpIS);
+
+ // network image has a mediaId
+ if (mediaFile.getMediaId() != null && mediaFile.getMediaId().length() > 0) {
+ postContent.insert(tagStart, WPHtml.getContent(wpIS));
+ } else {
+ // local image for upload
+ postContent.insert(tagStart,
+ "<img android-uri=\"" + wpIS.getImageSource().toString() + "\" />");
+ }
+ }
+ }
+ }
+ content = postContent.toString();
+ }
+
+ String moreTag = "<!--more-->";
+
+ post.setTitle(title);
+ // split up the post content if there's a more tag
+ if (post.isLocalDraft() && content.contains(moreTag)) {
+ post.setDescription(content.substring(0, content.indexOf(moreTag)));
+ post.setMoreText(content.substring(content.indexOf(moreTag) + moreTag.length(), content.length()));
+ } else {
+ post.setDescription(content);
+ post.setMoreText("");
+ }
+
+ if (!post.isLocalDraft()) {
+ post.setLocalChange(true);
+ }
+ }
+
+ /**
+ * Media
+ */
+
+ private void fetchMedia(Uri mediaUri) {
+ if (!MediaUtils.isInMediaStore(mediaUri)) {
+ // Create an AsyncTask to download the file
+ new DownloadMediaTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mediaUri);
+ } else {
+ // It is a regular local image file
+ if (!addMedia(mediaUri)) {
+ Toast.makeText(EditPostActivity.this, getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT)
+ .show();
+ }
+ }
+ }
+
+ private class DownloadMediaTask extends AsyncTask<Uri, Integer, Uri> {
+ @Override
+ protected Uri doInBackground(Uri... uris) {
+ Uri imageUri = uris[0];
+ return MediaUtils.downloadExternalMedia(EditPostActivity.this, imageUri);
+ }
+
+ @Override
+ protected void onPreExecute() {
+ Toast.makeText(EditPostActivity.this, R.string.download, Toast.LENGTH_SHORT).show();
+ }
+
+ protected void onPostExecute(Uri newUri) {
+ if (newUri != null) {
+ addMedia(newUri);
+ } else {
+ Toast.makeText(EditPostActivity.this, getString(R.string.error_downloading_image), Toast.LENGTH_SHORT)
+ .show();
+ }
+ }
+ }
+
+ private void updateMediaFileOnServer(WPImageSpan wpIS) {
+ Blog currentBlog = WordPress.getCurrentBlog();
+ if (currentBlog == null || wpIS == null)
+ return;
+
+ MediaFile mf = wpIS.getMediaFile();
+
+ final String mediaId = mf.getMediaId();
+ final String title = mf.getTitle();
+ final String description = mf.getDescription();
+ final String caption = mf.getCaption();
+
+ ApiHelper.EditMediaItemTask task = new ApiHelper.EditMediaItemTask(mf.getMediaId(), mf.getTitle(),
+ mf.getDescription(), mf.getCaption(),
+ new ApiHelper.GenericCallback() {
+ @Override
+ public void onSuccess() {
+ if (WordPress.getCurrentBlog() == null) {
+ return;
+ }
+ String localBlogTableIndex = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
+ WordPress.wpDB.updateMediaFile(localBlogTableIndex, mediaId, title, description, caption);
+ }
+
+ @Override
+ public void onFailure(ApiHelper.ErrorType errorType, String errorMessage, Throwable throwable) {
+ Toast.makeText(EditPostActivity.this, R.string.media_edit_failure, Toast.LENGTH_LONG).show();
+ }
+ });
+
+ List<Object> apiArgs = new ArrayList<Object>();
+ apiArgs.add(currentBlog);
+ task.execute(apiArgs);
+ }
+
+ private boolean addMedia(Uri imageUri) {
+ if (!MediaUtils.isInMediaStore(imageUri) && !imageUri.toString().startsWith("/")) {
+ imageUri = MediaUtils.downloadExternalMedia(this, imageUri);
+ }
+
+ if (imageUri == null) {
+ return false;
+ }
+
+ String mediaTitle;
+ if (MediaUtils.isVideo(imageUri.toString())) {
+ mediaTitle = getResources().getString(R.string.video);
+ } else {
+ mediaTitle = ImageUtils.getTitleForWPImageSpan(this, imageUri.getEncodedPath());
+ }
+
+ MediaFile mediaFile = new MediaFile();
+ mediaFile.setPostID(getPost().getLocalTablePostId());
+ mediaFile.setTitle(mediaTitle);
+ mediaFile.setFilePath(imageUri.toString());
+ if (imageUri.getEncodedPath() != null) {
+ mediaFile.setVideo(MediaUtils.isVideo(imageUri.toString()));
+ }
+ WordPress.wpDB.saveMediaFile(mediaFile);
+
+ mEditorFragment.appendMediaFile(mediaFile, mediaFile.getFilePath(), WordPress.imageLoader);
+ return true;
+ }
+
+ @Override
+ public void onActivityResult(int requestCode, int resultCode, Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+
+ if (data != null || ((requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO ||
+ requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO))) {
+ Bundle extras;
+ switch (requestCode) {
+ case MediaPickerActivity.ACTIVITY_REQUEST_CODE_MEDIA_SELECTION:
+ if (resultCode == MediaPickerActivity.ACTIVITY_RESULT_CODE_MEDIA_SELECTED) {
+ handleMediaSelectionResult(data);
+ } else if (resultCode == MediaPickerActivity.ACTIVITY_RESULT_CODE_GALLERY_CREATED) {
+ handleGalleryResult(data);
+ }
+ break;
+ case MediaGalleryActivity.REQUEST_CODE:
+ if (resultCode == Activity.RESULT_OK) {
+ handleMediaGalleryResult(data);
+ }
+ break;
+ case MediaGalleryPickerActivity.REQUEST_CODE:
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY);
+ if (resultCode == Activity.RESULT_OK) {
+ handleMediaGalleryPickerResult(data);
+ }
+ break;
+ case RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY:
+ Uri imageUri = data.getData();
+ fetchMedia(imageUri);
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY);
+ break;
+ case RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO:
+ if (resultCode == Activity.RESULT_OK) {
+ try {
+ File f = new File(mMediaCapturePath);
+ Uri capturedImageUri = Uri.fromFile(f);
+ if (!addMedia(capturedImageUri)) {
+ ToastUtils.showToast(this, R.string.gallery_error, Duration.SHORT);
+ }
+ this.sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://"
+ + Environment.getExternalStorageDirectory())));
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY);
+ } catch (RuntimeException e) {
+ AppLog.e(T.POSTS, e);
+ } catch (OutOfMemoryError e) {
+ AppLog.e(T.POSTS, e);
+ }
+ } else if (TextUtils.isEmpty(mEditorFragment.getContent())) {
+ // TODO: check if it was mQuickMediaType > -1
+ // Quick Photo was cancelled, delete post and finish activity
+ WordPress.wpDB.deletePost(getPost());
+ finish();
+ }
+ break;
+ case RequestCode.ACTIVITY_REQUEST_CODE_VIDEO_LIBRARY:
+ Uri videoUri = data.getData();
+ fetchMedia(videoUri);
+ break;
+ case RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO:
+ if (resultCode == Activity.RESULT_OK) {
+ Uri capturedVideoUri = MediaUtils.getLastRecordedVideoUri(this);
+ if (!addMedia(capturedVideoUri)) {
+ ToastUtils.showToast(this, R.string.gallery_error, Duration.SHORT);
+ }
+ } else if (TextUtils.isEmpty(mEditorFragment.getContent())) {
+ // TODO: check if it was mQuickMediaType > -1
+ // Quick Photo was cancelled, delete post and finish activity
+ WordPress.wpDB.deletePost(getPost());
+ finish();
+ }
+ break;
+ }
+ }
+ }
+
+ private void startMediaGalleryAddActivity() {
+ Intent intent = new Intent(this, MediaGalleryPickerActivity.class);
+ intent.putExtra(MediaGalleryPickerActivity.PARAM_SELECT_ONE_ITEM, true);
+ startActivityForResult(intent, MediaGalleryPickerActivity.REQUEST_CODE);
+ }
+
+ private void handleMediaGalleryPickerResult(Intent data) {
+ ArrayList<String> ids = data.getStringArrayListExtra(MediaGalleryPickerActivity.RESULT_IDS);
+ if (ids == null || ids.size() == 0) {
+ return;
+ }
+
+ String mediaId = ids.get(0);
+ addExistingMediaToEditor(mediaId);
+ }
+
+ private void handleMediaGalleryResult(Intent data) {
+ MediaGallery gallery = (MediaGallery) data.getSerializableExtra(MediaGalleryActivity.RESULT_MEDIA_GALLERY);
+
+ // if blank gallery returned, don't add to span
+ if (gallery == null || gallery.getIds().size() == 0) {
+ return;
+ }
+ mEditorFragment.appendGallery(gallery);
+ }
+
+ /**
+ * Handles result from {@link org.wordpress.android.ui.media.MediaPickerActivity}. Uploads local
+ * media to users blog then adds a gallery to the Post with all the selected media.
+ *
+ * @param data
+ * contains the selected media content with key
+ * {@link org.wordpress.android.ui.media.MediaPickerActivity#SELECTED_CONTENT_RESULTS_KEY}
+ */
+ private void handleGalleryResult(Intent data) {
+ if (data != null) {
+ List<MediaItem> selectedContent = data.getParcelableArrayListExtra(MediaPickerActivity.SELECTED_CONTENT_RESULTS_KEY);
+
+ if (selectedContent != null && selectedContent.size() > 0) {
+ ArrayList<String> blogMediaIds = new ArrayList<>();
+ ArrayList<String> localMediaIds = new ArrayList<>();
+
+ for (MediaItem content : selectedContent) {
+ Uri source = content.getSource();
+ final String id = content.getTag();
+
+ if (source != null && id != null) {
+ final String sourceString = source.toString();
+
+ if (MediaUtils.isVideo(sourceString)) {
+ // Videos cannot be added to a gallery, insert inline instead
+ addMedia(source);
+ } else if (sourceString.contains("wordpress.com")) {
+ blogMediaIds.add(id);
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY);
+ } else if (MediaUtils.isValidImage(sourceString)) {
+ queueFileForUpload(sourceString, localMediaIds);
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY);
+ }
+ }
+ }
+
+ MediaGallery gallery = new MediaGallery();
+ gallery.setIds(blogMediaIds);
+
+ if (localMediaIds.size() > 0) {
+ NotificationManager notificationManager = (NotificationManager) getSystemService(
+ Context.NOTIFICATION_SERVICE);
+
+ NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext());
+ builder.setSmallIcon(android.R.drawable.stat_sys_upload);
+ builder.setContentTitle("Uploading gallery");
+ notificationManager.notify(10, builder.build());
+
+ mPendingGalleryUploads.put(gallery.getUniqueId(), new ArrayList<>(localMediaIds));
+ }
+
+ // Only insert gallery span if images were added
+ if (localMediaIds.size() > 0 || blogMediaIds.size() > 0) {
+ mEditorFragment.appendGallery(gallery);
+ }
+ }
+ }
+ }
+
+
+ /**
+ * Handles result from {@link org.wordpress.android.ui.media.MediaPickerActivity} by adding the
+ * selected media to the Post.
+ *
+ * @param data
+ * result {@link android.content.Intent} with selected media items
+ */
+ private void handleMediaSelectionResult(Intent data) {
+ if (data != null) {
+ final List<MediaItem> selectedContent =
+ data.getParcelableArrayListExtra(MediaPickerActivity.SELECTED_CONTENT_RESULTS_KEY);
+ if (selectedContent != null && selectedContent.size() > 0) {
+ Integer localMediaAdded = 0;
+ Integer libraryMediaAdded = 0;
+
+ for (MediaItem media : selectedContent) {
+ if (media.getSource().toString().contains("wordpress.com")) {
+ addExistingMediaToEditor(media.getTag());
+ ++libraryMediaAdded;
+ } else {
+ addMedia(media.getSource());
+ ++localMediaAdded;
+ }
+ }
+
+ if (localMediaAdded > 0) {
+ Map<String, Object> analyticsProperties = new HashMap<>();
+ analyticsProperties.put(ANALYTIC_PROP_NUM_LOCAL_PHOTOS_ADDED, localMediaAdded);
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY, analyticsProperties);
+ }
+
+ if (libraryMediaAdded > 0) {
+ Map<String, Object> analyticsProperties = new HashMap<>();
+ analyticsProperties.put(ANALYTIC_PROP_NUM_WP_PHOTOS_ADDED, libraryMediaAdded);
+ AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY, analyticsProperties);
+ }
+ }
+ }
+ }
+
+ /**
+ * Create image {@link org.wordpress.mediapicker.source.MediaSource}'s for media selection.
+ *
+ * @return
+ * list containing all sources to gather image media from
+ */
+ private ArrayList<MediaSource> imageMediaSelectionSources() {
+ ArrayList<MediaSource> imageMediaSources = new ArrayList<>();
+ imageMediaSources.add(new MediaSourceDeviceImages(getContentResolver()));
+
+ return imageMediaSources;
+ }
+
+ private ArrayList<MediaSource> blogImageMediaSelectionSources() {
+ ArrayList<MediaSource> imageMediaSources = new ArrayList<>();
+ imageMediaSources.add(new MediaSourceWPImages());
+
+ return imageMediaSources;
+ }
+
+ private ArrayList<MediaSource> blogVideoMediaSelectionSources() {
+ ArrayList<MediaSource> imageMediaSources = new ArrayList<>();
+ imageMediaSources.add(new MediaSourceWPVideos());
+
+ return imageMediaSources;
+ }
+
+ /**
+ * Create video {@link org.wordpress.mediapicker.source.MediaSource}'s for media selection.
+ *
+ * @return
+ * list containing all sources to gather video media from
+ */
+ private ArrayList<MediaSource> videoMediaSelectionSources() {
+ ArrayList<MediaSource> videoMediaSources = new ArrayList<>();
+ videoMediaSources.add(new MediaSourceDeviceVideos(getContentResolver()));
+
+ return videoMediaSources;
+ }
+
+ private BroadcastReceiver mGalleryReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ if (LegacyEditorFragment.ACTION_MEDIA_GALLERY_TOUCHED.equals(intent.getAction())) {
+ startMediaGalleryActivity((MediaGallery)intent.getSerializableExtra(LegacyEditorFragment.EXTRA_MEDIA_GALLERY));
+ }
+ }
+ };
+
+ /**
+ * Handles media upload notifications. Used when uploading local media to create a gallery
+ * after media selection.
+ */
+ private BroadcastReceiver mMediaUploadReceiver = new BroadcastReceiver() {
+ @Override
+ public void onReceive(Context context, Intent intent) {
+ String action = intent.getAction();
+ if (MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION.equals(action)) {
+ String mediaId = intent.getStringExtra(MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION_EXTRA);
+ String newId = intent.getStringExtra(MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION_ERROR);
+
+ if (mediaId != null && newId != null) {
+ for (Long galleryId : mPendingGalleryUploads.keySet()) {
+ if (mPendingGalleryUploads.get(galleryId).contains(mediaId)) {
+
+ SpannableStringBuilder postContent;
+ if (mEditorFragment.getSpannedContent() != null) {
+ // needed by the legacy editor to save local drafts
+ postContent = new SpannableStringBuilder(mEditorFragment.getSpannedContent());
+ } else {
+ postContent = new SpannableStringBuilder(StringUtils.notNullStr((String) mEditorFragment.getContent()));
+ }
+ int selectionStart = 0;
+ int selectionEnd = postContent.length();
+
+ MediaGalleryImageSpan[] gallerySpans = postContent.getSpans(selectionStart, selectionEnd, MediaGalleryImageSpan.class);
+ if (gallerySpans.length != 0) {
+ for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
+ MediaGallery gallery = gallerySpan.getMediaGallery();
+ if (gallery.getUniqueId() == galleryId) {
+ ArrayList<String> galleryIds = gallery.getIds();
+ galleryIds.add(newId);
+ gallery.setIds(galleryIds);
+ gallerySpan.setMediaGallery(gallery);
+ int spanStart = postContent.getSpanStart(gallerySpan);
+ int spanEnd = postContent.getSpanEnd(gallerySpan);
+ postContent.setSpan(gallerySpan, spanStart, spanEnd,
+ Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
+ }
+ }
+ }
+
+ mPendingGalleryUploads.get(galleryId).remove(mediaId);
+ if (mPendingGalleryUploads.get(galleryId).size() == 0) {
+ mPendingGalleryUploads.remove(galleryId);
+ }
+ }
+ }
+
+ if (mPendingGalleryUploads.size() == 0) {
+ stopMediaUploadService();
+ NotificationManager notificationManager = (NotificationManager)
+ getSystemService(Context.NOTIFICATION_SERVICE);
+ notificationManager.cancel(10);
+ }
+ }
+ }
+ }
+ };
+
+
+ /**
+ * Starts {@link org.wordpress.android.ui.media.MediaPickerActivity} after refreshing the blog media.
+ */
+ private void startMediaSelection() {
+ Intent intent = new Intent(this, MediaPickerActivity.class);
+ intent.putExtra(MediaPickerActivity.ACTIVITY_TITLE_KEY, getString(R.string.add_to_post));
+ intent.putParcelableArrayListExtra(MediaPickerActivity.DEVICE_IMAGE_MEDIA_SOURCES_KEY,
+ imageMediaSelectionSources());
+ intent.putParcelableArrayListExtra(MediaPickerActivity.DEVICE_VIDEO_MEDIA_SOURCES_KEY,
+ videoMediaSelectionSources());
+ if (mBlogMediaStatus != 0) {
+ intent.putParcelableArrayListExtra(MediaPickerActivity.BLOG_IMAGE_MEDIA_SOURCES_KEY,
+ blogImageMediaSelectionSources());
+ intent.putParcelableArrayListExtra(MediaPickerActivity.BLOG_VIDEO_MEDIA_SOURCES_KEY,
+ blogVideoMediaSelectionSources());
+ }
+
+ startActivityForResult(intent, MediaPickerActivity.ACTIVITY_REQUEST_CODE_MEDIA_SELECTION);
+ overridePendingTransition(R.anim.slide_up, R.anim.fade_out);
+ }
+
+ private void refreshBlogMedia() {
+ if (NetworkUtils.isNetworkAvailable(this)) {
+ List<Object> apiArgs = new ArrayList<Object>();
+ apiArgs.add(WordPress.getCurrentBlog());
+ ApiHelper.SyncMediaLibraryTask.Callback callback = new ApiHelper.SyncMediaLibraryTask.Callback() {
+ @Override
+ public void onSuccess(int count) {
+ mBlogMediaStatus = 1;
+ }
+
+ @Override
+ public void onFailure(final ApiHelper.ErrorType errorType, String errorMessage, Throwable throwable) {
+ mBlogMediaStatus = 0;
+ ToastUtils.showToast(EditPostActivity.this, R.string.error_refresh_media, ToastUtils.Duration.SHORT);
+ }
+ };
+ ApiHelper.SyncMediaLibraryTask getMediaTask = new ApiHelper.SyncMediaLibraryTask(0,
+ MediaGridFragment.Filter.ALL, callback);
+ getMediaTask.execute(apiArgs);
+ } else {
+ mBlogMediaStatus = 0;
+ ToastUtils.showToast(this, R.string.error_refresh_media, ToastUtils.Duration.SHORT);
+ }
+ }
+
+ /**
+ * Starts the upload service to upload selected media.
+ */
+ private void startMediaUploadService() {
+ if (!mMediaUploadServiceStarted) {
+ startService(new Intent(this, MediaUploadService.class));
+ mMediaUploadServiceStarted = true;
+ }
+ }
+
+ /**
+ * Stops the upload service.
+ */
+ private void stopMediaUploadService() {
+ if (mMediaUploadServiceStarted) {
+ stopService(new Intent(this, MediaUploadService.class));
+ mMediaUploadServiceStarted = false;
+ }
+ }
+
+ /**
+ * Queues a media file for upload and starts the MediaUploadService. Toasts will alert the user
+ * if there are issues with the file.
+ *
+ * @param path
+ * local path of the media file to upload
+ * @param mediaIdOut
+ * the new {@link org.wordpress.android.models.MediaFile} ID is added if non-null
+ */
+ private void queueFileForUpload(String path, ArrayList<String> mediaIdOut) {
+ // Invalid file path
+ if (TextUtils.isEmpty(path)) {
+ Toast.makeText(this, R.string.editor_toast_invalid_path, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ // File not found
+ File file = new File(path);
+ if (!file.exists()) {
+ Toast.makeText(this, R.string.file_not_found, Toast.LENGTH_SHORT).show();
+ return;
+ }
+
+ Blog blog = WordPress.getCurrentBlog();
+ long currentTime = System.currentTimeMillis();
+ String mimeType = MediaUtils.getMediaFileMimeType(file);
+ String fileName = MediaUtils.getMediaFileName(file, mimeType);
+ MediaFile mediaFile = new MediaFile();
+
+ mediaFile.setBlogId(String.valueOf(blog.getLocalTableBlogId()));
+ mediaFile.setFileName(fileName);
+ mediaFile.setFilePath(path);
+ mediaFile.setUploadState("queued");
+ mediaFile.setDateCreatedGMT(currentTime);
+ mediaFile.setMediaId(String.valueOf(currentTime));
+
+ if (mimeType != null && mimeType.startsWith("image")) {
+ // get width and height
+ BitmapFactory.Options bfo = new BitmapFactory.Options();
+ bfo.inJustDecodeBounds = true;
+ BitmapFactory.decodeFile(path, bfo);
+ mediaFile.setWidth(bfo.outWidth);
+ mediaFile.setHeight(bfo.outHeight);
+ }
+
+ if (!TextUtils.isEmpty(mimeType)) {
+ mediaFile.setMimeType(mimeType);
+ }
+
+ if (mediaIdOut != null) {
+ mediaIdOut.add(mediaFile.getMediaId());
+ }
+
+ saveMediaFile(mediaFile);
+ startMediaUploadService();
+ }
+
+ /**
+ * EditorFragmentListener methods
+ */
+
+ @Override
+ public void onSettingsClicked() {
+ mViewPager.setCurrentItem(PAGE_SETTINGS);
+ }
+
+ @Override
+ public void onAddMediaClicked() {
+ startMediaSelection();
+ }
+
+ @Override
+ public void onEditorFragmentInitialized() {
+ fillContentEditorFields();
+ }
+
+ @Override
+ public void saveMediaFile(MediaFile mediaFile) {
+ WordPress.wpDB.saveMediaFile(mediaFile);
+ }
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostContentFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostContentFragment.java
deleted file mode 100644
index 6bb66936b..000000000
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostContentFragment.java
+++ /dev/null
@@ -1,1928 +0,0 @@
-package org.wordpress.android.ui.posts;
-
-import android.app.Activity;
-import android.app.AlertDialog;
-import android.app.Fragment;
-import android.app.NotificationManager;
-import android.content.BroadcastReceiver;
-import android.content.Context;
-import android.content.DialogInterface;
-import android.content.Intent;
-import android.content.IntentFilter;
-import android.content.res.Configuration;
-import android.graphics.Bitmap;
-import android.graphics.BitmapFactory;
-import android.graphics.Point;
-import android.graphics.Typeface;
-import android.net.Uri;
-import android.os.AsyncTask;
-import android.os.Bundle;
-import android.os.Environment;
-import android.support.v4.app.NotificationCompat;
-import android.support.v4.content.LocalBroadcastManager;
-import android.support.v7.app.ActionBar;
-import android.text.Editable;
-import android.text.Layout;
-import android.text.Selection;
-import android.text.Spannable;
-import android.text.SpannableStringBuilder;
-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.CharacterStyle;
-import android.text.style.ImageSpan;
-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.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.ListView;
-import android.widget.SeekBar;
-import android.widget.Spinner;
-import android.widget.TextView;
-import android.widget.Toast;
-import android.widget.ToggleButton;
-
-import com.android.volley.VolleyError;
-import com.android.volley.toolbox.ImageLoader;
-
-import org.wordpress.android.Constants;
-import org.wordpress.android.R;
-import org.wordpress.android.WordPress;
-import org.wordpress.android.analytics.AnalyticsTracker;
-import org.wordpress.android.analytics.AnalyticsTracker.Stat;
-import org.wordpress.android.models.Blog;
-import org.wordpress.android.models.MediaFile;
-import org.wordpress.android.models.MediaGallery;
-import org.wordpress.android.models.Post;
-import org.wordpress.android.ui.media.MediaGalleryActivity;
-import org.wordpress.android.ui.media.MediaGridFragment;
-import org.wordpress.android.ui.media.MediaPickerActivity;
-import org.wordpress.android.ui.media.MediaSourceWPImages;
-import org.wordpress.android.ui.media.MediaSourceWPVideos;
-import org.wordpress.android.ui.media.MediaUtils;
-import org.wordpress.android.ui.media.services.MediaUploadService;
-import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.AutolinkUtils;
-import org.wordpress.android.util.CrashlyticsUtils;
-import org.wordpress.android.util.CrashlyticsUtils.ExceptionType;
-import org.wordpress.android.util.CrashlyticsUtils.ExtraKey;
-import org.wordpress.android.util.DisplayUtils;
-import org.wordpress.android.util.ImageUtils;
-import org.wordpress.android.util.NetworkUtils;
-import org.wordpress.android.util.PhotonUtils;
-import org.wordpress.android.util.StringUtils;
-import org.wordpress.android.util.ToastUtils;
-import org.wordpress.android.util.WPHtml;
-import org.wordpress.android.widgets.MediaGalleryImageSpan;
-import org.wordpress.android.widgets.WPEditText;
-import org.wordpress.android.widgets.WPImageSpan;
-import org.wordpress.android.widgets.WPUnderlineSpan;
-import org.wordpress.mediapicker.MediaItem;
-import org.wordpress.mediapicker.source.MediaSource;
-import org.wordpress.mediapicker.source.MediaSourceDeviceImages;
-import org.wordpress.mediapicker.source.MediaSourceDeviceVideos;
-import org.wordpress.passcodelock.AppLockManager;
-import org.xmlrpc.android.ApiHelper;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.Serializable;
-import java.lang.ref.WeakReference;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Vector;
-
-public class EditPostContentFragment extends Fragment implements TextWatcher,
- WPEditText.OnSelectionChangedListener, View.OnTouchListener {
- EditPostActivity mActivity;
-
- private static final int ACTIVITY_REQUEST_CODE_CREATE_LINK = 4;
- public static final String NEW_MEDIA_GALLERY = "NEW_MEDIA_GALLERY";
- public static final String NEW_MEDIA_GALLERY_EXTRA_IDS = "NEW_MEDIA_GALLERY_EXTRA_IDS";
- public static final String NEW_MEDIA_POST = "NEW_MEDIA_POST";
- public static final String NEW_MEDIA_POST_EXTRA = "NEW_MEDIA_POST_ID";
-
- 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 static final String ANALYTIC_PROP_NUM_LOCAL_PHOTOS_ADDED = "number_of_local_photos_added";
- private static final String ANALYTIC_PROP_NUM_WP_PHOTOS_ADDED = "number_of_wp_library_photos_added";
-
- private static final int CONTENT_ANIMATION_DURATION = 250;
- private static final int MIN_THUMBNAIL_WIDTH = 200;
-
- private View mRootView;
- private WPEditText mContentEditText;
- private Button mAddPictureButton;
- private EditText mTitleEditText;
- private ToggleButton mBoldToggleButton, mEmToggleButton, mBquoteToggleButton;
- private ToggleButton mUnderlineToggleButton, mStrikeToggleButton;
- private LinearLayout mFormatBar, mPostContentLinearLayout, mPostSettingsLinearLayout;
- private boolean mIsBackspace;
- private boolean mScrollDetected;
-
- // Each element is a list of media IDs being uploaded to a gallery, keyed by gallery ID
- private Map<Long, List<String>> mPendingGalleryUploads = new HashMap<>();
-
- // -1=no response yet, 0=unavailable, 1=available
- private int mBlogMediaStatus = -1;
- private boolean mMediaUploadServiceStarted;
- private String mMediaCapturePath = "";
-
- private int mStyleStart, mSelectionStart, mSelectionEnd, mFullViewBottom, mMaximumThumbnailWidth;
- private int mLastPosition = -1, mQuickMediaType = -1;
-
- private float mLastYPos = 0;
-
- @Override
- public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
- mActivity = (EditPostActivity) 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.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 && mActivity.getSupportActionBar() != null && mActivity
- .getSupportActionBar().isShowing()) {
- setContentEditingModeVisible(true);
- }
- return false;
- }
- });
- mContentEditText = (WPEditText) rootView.findViewById(R.id.post_content);
- 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) {
- mActivity.showPostSettings();
- }
- });
- 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);
- mAddPictureButton = (Button) rootView.findViewById(R.id.addPictureButton);
- Button linkButton = (Button) rootView.findViewById(R.id.link);
- Button moreButton = (Button) rootView.findViewById(R.id.more);
-
- registerForContextMenu(mAddPictureButton);
- 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 && mActivity.getSupportActionBar() != null && !mActivity
- .getSupportActionBar().isShowing()) {
- setContentEditingModeVisible(false);
- }
- }
- });
- mAddPictureButton.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- startMediaSelection();
- }
- });
- mBoldToggleButton.setOnClickListener(mFormatBarButtonClickListener);
- linkButton.setOnClickListener(mFormatBarButtonClickListener);
- mEmToggleButton.setOnClickListener(mFormatBarButtonClickListener);
- mUnderlineToggleButton.setOnClickListener(mFormatBarButtonClickListener);
- mStrikeToggleButton.setOnClickListener(mFormatBarButtonClickListener);
- mBquoteToggleButton.setOnClickListener(mFormatBarButtonClickListener);
- moreButton.setOnClickListener(mFormatBarButtonClickListener);
-
- Post post = mActivity.getPost();
- if (post != null) {
- if (!TextUtils.isEmpty(post.getContent())) {
- if (post.isLocalDraft()) {
- // Load local post content in the background, as it may take time to generate images
- new LoadPostContentTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
- post.getContent().replaceAll("\uFFFC", ""));
- }
- else {
- mContentEditText.setText(post.getContent().replaceAll("\uFFFC", ""));
- }
- }
- if (!TextUtils.isEmpty(post.getTitle())) {
- mTitleEditText.setText(post.getTitle());
- }
-
- postSettingsButton.setText(post.isPage() ? R.string.page_settings : R.string.post_settings);
- }
-
- // Check for Android share action
- String action = mActivity.getIntent().getAction();
- mQuickMediaType = mActivity.getIntent().getIntExtra("quick-media", -1);
- if (Intent.ACTION_SEND.equals(action) || Intent.ACTION_SEND_MULTIPLE.equals(action)) {
- setPostContentFromShareAction();
- } else if (NEW_MEDIA_GALLERY.equals(action)) {
- prepareMediaGallery();
- } else if (NEW_MEDIA_POST.equals(action)) {
- prepareMediaPost();
- } else if (mQuickMediaType >= 0) {
- // User selected 'Quick Photo' in the menu drawer
- if (mQuickMediaType == Constants.QUICK_POST_PHOTO_CAMERA) {
- launchCamera();
- } else if (mQuickMediaType == Constants.QUICK_POST_PHOTO_LIBRARY) {
- launchPictureLibrary();
- }
- if (post != null) {
- post.setQuickPostType(Post.QUICK_MEDIA_TYPE_PHOTO);
- }
- }
-
- return rootView;
- }
-
- @Override
- public void onPause() {
- super.onPause();
-
- LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getActivity());
- lbm.unregisterReceiver(mMediaUploadReceiver);
- stopMediaUploadService();
- }
-
- @Override
- public void onResume() {
- super.onResume();
-
- refreshBlogMedia();
-
- LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getActivity());
- lbm.registerReceiver(mMediaUploadReceiver, new IntentFilter(MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION));
- }
-
- @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 (mActivity == null)
- 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 (data != null || ((requestCode == MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO || requestCode == MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO))) {
- Bundle extras;
- switch (requestCode) {
- case MediaPickerActivity.ACTIVITY_REQUEST_CODE_MEDIA_SELECTION:
- if (resultCode == MediaPickerActivity.ACTIVITY_RESULT_CODE_MEDIA_SELECTED) {
- handleMediaSelectionResult(data);
- } else if (resultCode == MediaPickerActivity.ACTIVITY_RESULT_CODE_GALLERY_CREATED) {
- handleGalleryResult(data);
- }
- break;
- case MediaGalleryActivity.REQUEST_CODE:
- if (resultCode == Activity.RESULT_OK) {
- handleMediaGalleryResult(data);
- }
- break;
- case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_PICTURE_LIBRARY:
- Uri imageUri = data.getData();
- fetchMedia(imageUri);
- AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY);
- break;
- case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_VIDEO_LIBRARY:
- Uri videoUri = data.getData();
- fetchMedia(videoUri);
- break;
- case MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO:
- if (resultCode == Activity.RESULT_OK) {
- try {
- File f = new File(mMediaCapturePath);
- Uri capturedImageUri = Uri.fromFile(f);
- if (!addMedia(capturedImageUri, null, getActivity()))
- Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT).show();
- getActivity().sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED, Uri.parse("file://" + Environment.getExternalStorageDirectory())));
- AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY);
- } catch (RuntimeException e) {
- AppLog.e(T.POSTS, e);
- } catch (OutOfMemoryError e) {
- AppLog.e(T.POSTS, e);
- }
- } else if (mActivity != null && mQuickMediaType > -1 && TextUtils.isEmpty(mContentEditText.getText())) {
- // Quick Photo was cancelled, delete post and finish activity
- WordPress.wpDB.deletePost(mActivity.getPost());
- mActivity.finish();
- }
- break;
- case ACTIVITY_REQUEST_CODE_CREATE_LINK:
- try {
- extras = data.getExtras();
- if (extras == null)
- return;
- String linkURL = extras.getString("linkURL");
- if (linkURL != null && !linkURL.equals("http://") && !linkURL.equals("")) {
- if (mSelectionStart > mSelectionEnd) {
- int temp = mSelectionEnd;
- mSelectionEnd = mSelectionStart;
- mSelectionStart = temp;
- }
- Editable str = mContentEditText.getText();
- if (str == null)
- return;
- if (mActivity.getPost().isLocalDraft()) {
- if (extras.getString("linkText") == null) {
- if (mSelectionStart < mSelectionEnd)
- str.delete(mSelectionStart, mSelectionEnd);
- str.insert(mSelectionStart, linkURL);
- str.setSpan(new URLSpan(linkURL), mSelectionStart, mSelectionStart + linkURL.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- mContentEditText.setSelection(mSelectionStart + linkURL.length());
- } else {
- String linkText = extras.getString("linkText");
- if (linkText == null)
- return;
- if (mSelectionStart < mSelectionEnd)
- str.delete(mSelectionStart, mSelectionEnd);
- str.insert(mSelectionStart, linkText);
- str.setSpan(new URLSpan(linkURL), mSelectionStart, mSelectionStart + linkText.length(),
- Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- mContentEditText.setSelection(mSelectionStart + linkText.length());
- }
- } else {
- if (extras.getString("linkText") == null) {
- if (mSelectionStart < mSelectionEnd)
- str.delete(mSelectionStart, mSelectionEnd);
- String urlHTML = "<a href=\"" + linkURL + "\">" + linkURL + "</a>";
- str.insert(mSelectionStart, urlHTML);
- mContentEditText.setSelection(mSelectionStart + urlHTML.length());
- } else {
- String linkText = extras.getString("linkText");
- if (mSelectionStart < mSelectionEnd)
- str.delete(mSelectionStart, mSelectionEnd);
- String urlHTML = "<a href=\"" + linkURL + "\">" + linkText + "</a>";
- str.insert(mSelectionStart, urlHTML);
- mContentEditText.setSelection(mSelectionStart + urlHTML.length());
- }
- }
- }
- } catch (RuntimeException e) {
- AppLog.e(T.POSTS, e);
- }
- break;
- }
- }
- }
-
- protected void setPostContentFromShareAction() {
- Intent intent = mActivity.getIntent();
-
- // Check for shared text
- String text = intent.getStringExtra(Intent.EXTRA_TEXT);
- String title = intent.getStringExtra(Intent.EXTRA_SUBJECT);
- if (text != null) {
- if (title != null) {
- mTitleEditText.setText(title);
- }
- // Create an <a href> element around links
- text = AutolinkUtils.autoCreateLinks(text);
- mContentEditText.setText(WPHtml.fromHtml(StringUtils.addPTags(text), getActivity(), mActivity.getPost(),
- getMaximumThumbnailWidth()));
- }
-
- // Check for shared media
- if (intent.hasExtra(Intent.EXTRA_STREAM)) {
- String action = intent.getAction();
- String type = intent.getType();
- ArrayList<Uri> sharedUris;
-
- if (Intent.ACTION_SEND_MULTIPLE.equals(action)) {
- sharedUris = intent.getParcelableArrayListExtra((Intent.EXTRA_STREAM));
- } else {
- // For a single media share, we only allow images and video types
- if (type != null && (type.startsWith("image") || type.startsWith("video"))) {
- sharedUris = new ArrayList<Uri>();
- sharedUris.add((Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM));
- } else {
- return;
- }
- }
-
- if (sharedUris != null) {
- List<Serializable> params = new Vector<Serializable>();
- params.add(sharedUris);
- params.add(type);
- new ProcessAttachmentsTask(getActivity()).execute(params);
- }
- }
- }
-
- /**
- * Updates post object with content of this fragment
- */
- public void updatePostContent(boolean isAutoSave) {
- Post post = mActivity.getPost();
-
- if (post == null || mContentEditText.getText() == null)
- return;
-
- String title = (mTitleEditText.getText() != null) ? mTitleEditText.getText().toString() : "";
-
- Editable postContentEditable;
- try {
- postContentEditable = new SpannableStringBuilder(mContentEditText.getText());
- } catch (IndexOutOfBoundsException e) {
- // A core android bug might cause an out of bounds exception, if so we'll just use the current editable
- // See https://code.google.com/p/android/issues/detail?id=5164
- postContentEditable = mContentEditText.getText();
- }
-
- if (postContentEditable == null)
- return;
-
- String content;
- if (post.isLocalDraft()) {
- // remove suggestion spans, they cause craziness in WPHtml.toHTML().
- CharacterStyle[] characterStyles = postContentEditable.getSpans(0, postContentEditable.length(),
- CharacterStyle.class);
- for (CharacterStyle characterStyle : characterStyles) {
- if (characterStyle.getClass().getName().equals("android.text.style.SuggestionSpan")) {
- postContentEditable.removeSpan(characterStyle);
- }
- }
- content = WPHtml.toHtml(postContentEditable);
- // replace duplicate <p> tags so there's not duplicates, trac #86
- content = content.replace("<p><p>", "<p>");
- content = content.replace("</p></p>", "</p>");
- content = content.replace("<br><br>", "<br>");
- // sometimes the editor creates extra tags
- content = content.replace("</strong><strong>", "").replace("</em><em>", "").replace("</u><u>", "")
- .replace("</strike><strike>", "").replace("</blockquote><blockquote>", "");
- } else {
- if (!isAutoSave) {
- // Add gallery shortcode
- MediaGalleryImageSpan[] gallerySpans = postContentEditable.getSpans(0, postContentEditable.length(),
- MediaGalleryImageSpan.class);
- for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
- int start = postContentEditable.getSpanStart(gallerySpan);
- postContentEditable.removeSpan(gallerySpan);
- postContentEditable.insert(start, WPHtml.getGalleryShortcode(gallerySpan));
- }
- }
-
- WPImageSpan[] imageSpans = postContentEditable.getSpans(0, postContentEditable.length(), WPImageSpan.class);
- if (imageSpans.length != 0) {
- for (WPImageSpan wpIS : imageSpans) {
- MediaFile mediaFile = wpIS.getMediaFile();
- if (mediaFile == null)
- continue;
- if (mediaFile.getMediaId() != null) {
- updateMediaFileOnServer(wpIS);
- } else {
- mediaFile.setFileName(wpIS.getImageSource().toString());
- mediaFile.setFilePath(wpIS.getImageSource().toString());
- mediaFile.save();
- }
-
- int tagStart = postContentEditable.getSpanStart(wpIS);
- if (!isAutoSave) {
- postContentEditable.removeSpan(wpIS);
-
- // network image has a mediaId
- if (mediaFile.getMediaId() != null && mediaFile.getMediaId().length() > 0) {
- postContentEditable.insert(tagStart, WPHtml.getContent(wpIS));
- } else {
- // local image for upload
- postContentEditable.insert(tagStart,
- "<img android-uri=\"" + wpIS.getImageSource().toString() + "\" />");
- }
- }
- }
- }
- content = postContentEditable.toString();
- }
-
- String moreTag = "<!--more-->";
-
- post.setTitle(title);
- // split up the post content if there's a more tag
- if (post.isLocalDraft() && content.contains(moreTag)) {
- post.setDescription(content.substring(0, content.indexOf(moreTag)));
- post.setMoreText(content.substring(content.indexOf(moreTag) + moreTag.length(), content.length()));
- } else {
- post.setDescription(content);
- post.setMoreText("");
- }
-
- if (!post.isLocalDraft())
- post.setLocalChange(true);
- }
-
- public boolean hasEmptyContentFields() {
- return TextUtils.isEmpty(mTitleEditText.getText()) && TextUtils.isEmpty(mContentEditText.getText());
- }
-
- @Override
- public void onConfigurationChanged(Configuration newConfig) {
- super.onConfigurationChanged(newConfig);
- mFullViewBottom = mRootView.getBottom();
- }
-
- /**
- * Media
- */
-
- private class ProcessAttachmentsTask extends AsyncTask<List<?>, Void, SpannableStringBuilder> {
- private final WeakReference<Context> mWeakContext;
- public ProcessAttachmentsTask(Context context) {
- mWeakContext = new WeakReference<Context>(context);
- }
-
- protected void onPreExecute() {
- Context context = mWeakContext.get();
- if (context != null) {
- Toast.makeText(context, R.string.loading, Toast.LENGTH_SHORT).show();
- }
- }
-
- @Override
- protected SpannableStringBuilder doInBackground(List<?>... args) {
- ArrayList<?> multi_stream = (ArrayList<?>) args[0].get(0);
- String type = (String) args[0].get(1);
- SpannableStringBuilder ssb = new SpannableStringBuilder();
- for (Object streamUri : multi_stream) {
- if (streamUri instanceof Uri) {
- Uri imageUri = (Uri) streamUri;
- if (type != null) {
- Context context = mWeakContext.get();
- if (context != null) {
- addMedia(imageUri, ssb, context);
- }
- }
- }
- }
- return ssb;
- }
-
- protected void onPostExecute(SpannableStringBuilder ssb) {
- if (!isAdded()) {
- return;
- }
- if (ssb != null && ssb.length() > 0) {
- Editable postContentEditable = mContentEditText.getText();
- if (postContentEditable != null) {
- postContentEditable.insert(0, ssb);
- }
- } else {
- Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT)
- .show();
- }
- }
- }
-
- private void launchPictureLibrary() {
- MediaUtils.launchPictureLibrary(this);
- AppLockManager.getInstance().setExtendedTimeout();
- }
-
- private void launchCamera() {
- MediaUtils.launchCamera(this, new MediaUtils.LaunchCameraCallback() {
- @Override
- public void onMediaCapturePathReady(String mediaCapturePath) {
- mMediaCapturePath = mediaCapturePath;
- AppLockManager.getInstance().setExtendedTimeout();
- }
- });
- }
-
- private void fetchMedia(Uri mediaUri) {
- if (!MediaUtils.isInMediaStore(mediaUri)) {
- // Create an AsyncTask to download the file
- new DownloadMediaTask().executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, mediaUri);
- } else {
- // It is a regular local image file
- if (!addMedia(mediaUri, null, getActivity())) {
- Toast.makeText(getActivity(), getResources().getText(R.string.gallery_error), Toast.LENGTH_SHORT)
- .show();
- }
- }
- }
-
- private class DownloadMediaTask extends AsyncTask<Uri, Integer, Uri> {
- @Override
- protected Uri doInBackground(Uri... uris) {
- Uri imageUri = uris[0];
- return MediaUtils.downloadExternalMedia(getActivity(), imageUri);
- }
-
- @Override
- protected void onPreExecute() {
- Toast.makeText(getActivity(), R.string.download, Toast.LENGTH_SHORT).show();
- }
-
- protected void onPostExecute(Uri newUri) {
- if (!isAdded()) {
- return;
- }
-
- if (newUri != null) {
- addMedia(newUri, null, getActivity());
- } else {
- Toast.makeText(getActivity(), getString(R.string.error_downloading_image), Toast.LENGTH_SHORT).show();
- }
- }
- }
-
- private void prepareMediaGallery() {
- MediaGallery mediaGallery = new MediaGallery();
- mediaGallery.setIds(getActivity().getIntent().getStringArrayListExtra(NEW_MEDIA_GALLERY_EXTRA_IDS));
-
- startMediaGalleryActivity(mediaGallery);
- }
-
- private void prepareMediaPost() {
- String mediaId = getActivity().getIntent().getStringExtra(NEW_MEDIA_POST_EXTRA);
- addExistingMediaToEditor(mediaId);
- }
-
- private void addExistingMediaToEditor(String mediaId) {
- if (WordPress.getCurrentBlog() == null)
- return;
-
- String blogId = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
-
- WPImageSpan imageSpan = MediaUtils.prepareWPImageSpan(getActivity(), blogId, mediaId);
- if (imageSpan == null)
- return;
-
- // based on addMedia()
-
- 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);
- }
-
- Editable s = mContentEditText.getText();
- if (s != null) {
- WPImageSpan[] gallerySpans = s.getSpans(selectionStart, selectionEnd, WPImageSpan.class);
- if (gallerySpans.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");
- }
-
- // load image from server
- loadWPImageSpanThumbnail(imageSpan);
- }
-
- private void updateMediaFileOnServer(WPImageSpan wpIS) {
- Blog currentBlog = WordPress.getCurrentBlog();
- if (currentBlog == null || wpIS == null) {
- return;
- }
-
- MediaFile mf = wpIS.getMediaFile();
-
- final String mediaId = mf.getMediaId();
- final String title = mf.getTitle();
- final String description = mf.getDescription();
- final String caption = mf.getCaption();
-
- ApiHelper.EditMediaItemTask task = new ApiHelper.EditMediaItemTask(mf.getMediaId(), mf.getTitle(),
- mf.getDescription(), mf.getCaption(),
- new ApiHelper.GenericCallback() {
- @Override
- public void onSuccess() {
- if (WordPress.getCurrentBlog() == null) {
- return;
- }
- String localBlogTableIndex = String.valueOf(WordPress.getCurrentBlog().getLocalTableBlogId());
- WordPress.wpDB.updateMediaFile(localBlogTableIndex, mediaId, title, description, caption);
- }
-
- @Override
- public void onFailure(ApiHelper.ErrorType errorType, String errorMessage, Throwable throwable) {
- if (isAdded()) {
- Toast.makeText(getActivity(), R.string.media_edit_failure, Toast.LENGTH_LONG).show();
- }
- }
- });
-
- List<Object> apiArgs = new ArrayList<Object>();
- apiArgs.add(currentBlog);
- task.execute(apiArgs);
- }
-
- /** Loads the thumbnail url in the imagespan from a server **/
- private void loadWPImageSpanThumbnail(WPImageSpan imageSpan) {
-
- MediaFile mediaFile = imageSpan.getMediaFile();
- if (mediaFile == null)
- return;
-
- final String mediaId = mediaFile.getMediaId();
- if (mediaId == null)
- return;
-
- String imageURL;
- if (WordPress.getCurrentBlog() != null && WordPress.getCurrentBlog().isPhotonCapable()) {
- String photonUrl = imageSpan.getImageSource().toString();
- imageURL = PhotonUtils.getPhotonImageUrl(photonUrl, getMaximumThumbnailWidth(), 0);
- } else {
- // Not a Jetpack or wpcom blog
- // imageURL = mediaFile.getThumbnailURL(); //do not use fileURL here since downloading picture
- // of big dimensions can result in OOM Exception
- imageURL = mediaFile.getFileURL() != null ? mediaFile.getFileURL() : mediaFile.getThumbnailURL();
- }
-
- if (imageURL == null)
- return;
-
- WordPress.imageLoader.get(imageURL, new ImageLoader.ImageListener() {
- @Override
- public void onErrorResponse(VolleyError arg0) {
- }
-
- @Override
- public void onResponse(ImageLoader.ImageContainer container, boolean arg1) {
- if (!isAdded()) {
- return;
- }
-
- 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;
- int maxWidth = getMaximumThumbnailWidth();
- //resize the downloaded bitmap
- try {
- resizedBitmap = ImageUtils.getScaledBitmapAtLongestSide(downloadedBitmap, maxWidth);
- } catch (OutOfMemoryError er) {
- CrashlyticsUtils.setInt(ExtraKey.IMAGE_WIDTH, downloadedBitmap.getWidth());
- CrashlyticsUtils.setInt(ExtraKey.IMAGE_HEIGHT, downloadedBitmap.getHeight());
- CrashlyticsUtils.setFloat(ExtraKey.IMAGE_RESIZE_SCALE,
- ((float) maxWidth) / downloadedBitmap.getWidth());
- CrashlyticsUtils.logException(er, ExceptionType.SPECIFIC, T.POSTS);
- return;
- }
-
- if (resizedBitmap == null) return;
-
- Editable s = mContentEditText.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() && isAdded()) {
- // replace the existing span with a new one with the correct image, re-add it to the same position.
- int spanStart = s.getSpanStart(is);
- int spanEnd = s.getSpanEnd(is);
- WPImageSpan imageSpan = new WPImageSpan(getActivity(), resizedBitmap, is.getImageSource());
- imageSpan.setMediaFile(is.getMediaFile());
- imageSpan.setNetworkImageLoaded(true);
- s.removeSpan(is);
- s.setSpan(imageSpan, spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- break;
- }
- }
- }
- }
- }, 0, 0);
- }
-
- private void startMediaGalleryActivity(MediaGallery mediaGallery) {
- Intent intent = new Intent(getActivity(), MediaGalleryActivity.class);
- intent.putExtra(MediaGalleryActivity.PARAMS_MEDIA_GALLERY, mediaGallery);
- if (mediaGallery == null)
- intent.putExtra(MediaGalleryActivity.PARAMS_LAUNCH_PICKER, true);
- startActivityForResult(intent, MediaGalleryActivity.REQUEST_CODE);
- }
-
- private void handleMediaGalleryResult(Intent data) {
- MediaGallery gallery = (MediaGallery) data.getSerializableExtra(MediaGalleryActivity.RESULT_MEDIA_GALLERY);
-
- // if blank gallery returned, don't add to span
- if (gallery == null || gallery.getIds().size() == 0)
- 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);
- }
-
- Editable s = mContentEditText.getText();
- if (s == null)
- return;
- MediaGalleryImageSpan[] gallerySpans = s.getSpans(selectionStart, selectionEnd, MediaGalleryImageSpan.class);
- if (gallerySpans.length != 0) {
- for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
- if (gallerySpan.getMediaGallery().getUniqueId() == gallery.getUniqueId()) {
- // replace the existing span with a new gallery, re-add it to the same position.
- gallerySpan.setMediaGallery(gallery);
- int spanStart = s.getSpanStart(gallerySpan);
- int spanEnd = s.getSpanEnd(gallerySpan);
- s.setSpan(gallerySpan, spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
- return;
- } 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, " ");
- MediaGalleryImageSpan is = new MediaGalleryImageSpan(getActivity(), gallery);
- s.setSpan(is, 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");
- }
-
- private boolean addMedia(Uri imageUri, SpannableStringBuilder ssb, Context context) {
- if (context == null) {
- return false;
- }
-
- if (ssb != null && !MediaUtils.isInMediaStore(imageUri)) {
- imageUri = MediaUtils.downloadExternalMedia(context, imageUri);
- }
-
- if (imageUri == null) {
- return false;
- }
-
- Bitmap thumbnailBitmap;
- String mediaTitle;
- if (MediaUtils.isVideo(imageUri.toString())) {
- thumbnailBitmap = BitmapFactory.decodeResource(context.getResources(), R.drawable.media_movieclip);
- mediaTitle = getResources().getString(R.string.video);
- } else {
- thumbnailBitmap = ImageUtils.getWPImageSpanThumbnailFromFilePath(context, imageUri.getEncodedPath(),
- getMaximumThumbnailWidth());
- if (thumbnailBitmap == null) {
- return false;
- }
- mediaTitle = ImageUtils.getTitleForWPImageSpan(context, imageUri.getEncodedPath());
- }
-
- WPImageSpan imageSpan = new WPImageSpan(context, thumbnailBitmap, imageUri);
- MediaFile mediaFile = imageSpan.getMediaFile();
- mediaFile.setPostID(mActivity.getPost().getLocalTablePostId());
- mediaFile.setTitle(mediaTitle);
- mediaFile.setFilePath(imageSpan.getImageSource().toString());
- MediaUtils.setWPImageSpanWidth(context, imageUri, imageSpan);
- if (imageUri.getEncodedPath() != null) {
- mediaFile.setVideo(imageUri.getEncodedPath().contains("video"));
- }
- mediaFile.save();
-
- if (ssb != null) {
- ssb.append(" ");
- ssb.setSpan(imageSpan, ssb.length() - 1, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
- ssb.setSpan(as, ssb.length() - 1, ssb.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- ssb.append("\n");
- } else {
- int selectionStart = mContentEditText.getSelectionStart();
- mStyleStart = selectionStart;
- int selectionEnd = mContentEditText.getSelectionEnd();
-
- if (selectionStart > selectionEnd) {
- int temp = selectionEnd;
- selectionEnd = selectionStart;
- selectionStart = temp;
- }
-
- Editable editable = mContentEditText.getText();
- if (editable == null) {
- return false;
- }
-
- int line, column = 0;
- if (mContentEditText.getLayout() != null) {
- line = mContentEditText.getLayout().getLineForOffset(selectionStart);
- column = mContentEditText.getSelectionStart() - mContentEditText.getLayout().getLineStart(line);
- }
-
- WPImageSpan[] image_spans = editable.getSpans(selectionStart, selectionEnd, WPImageSpan.class);
- if (image_spans.length != 0) {
- // insert a few line breaks if the cursor imageSpan already on an image
- editable.insert(selectionEnd, "\n\n");
- selectionStart = selectionStart + 2;
- selectionEnd = selectionEnd + 2;
- } else if (column != 0) {
- // insert one line break if the cursor imageSpan not at the first column
- editable.insert(selectionEnd, "\n");
- selectionStart = selectionStart + 1;
- selectionEnd = selectionEnd + 1;
- }
-
- editable.insert(selectionStart, " ");
- editable.setSpan(imageSpan, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- AlignmentSpan.Standard as = new AlignmentSpan.Standard(Layout.Alignment.ALIGN_CENTER);
- editable.setSpan(as, selectionStart, selectionEnd + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- editable.insert(selectionEnd + 1, "\n\n");
- }
- // Show the soft keyboard after adding media
- if (mActivity != null && mActivity.getSupportActionBar() != null && !mActivity.getSupportActionBar().isShowing()) {
- ((InputMethodManager) mActivity.getSystemService(Context.INPUT_METHOD_SERVICE)).toggleSoftInput(
- InputMethodManager.SHOW_FORCED, InputMethodManager.HIDE_IMPLICIT_ONLY);
- }
- return true;
- }
-
- /**
- * Get the maximum size a thumbnail can be to fit in either portrait or landscape orientations.
- */
- public int getMaximumThumbnailWidth() {
- if (mMaximumThumbnailWidth == 0 && isAdded()) {
- Point size = DisplayUtils.getDisplayPixelSize(getActivity());
- int screenWidth = size.x;
- int screenHeight = size.y;
- mMaximumThumbnailWidth = (screenWidth > screenHeight) ? screenHeight : screenWidth;
- // 48dp of padding on each side so you can still place the cursor next to the image.
- int padding = DisplayUtils.dpToPx(getActivity(), 48) * 2;
- mMaximumThumbnailWidth -= padding;
- }
-
- return mMaximumThumbnailWidth;
- }
-
- /**
- * 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<!--more-->\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);
- mAddPictureButton.performLongClick();
- }
- }
- };
-
- /**
- * 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 (mActivity.getPost().isLocalDraft()) {
- // 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 = "</" + tag + ">";
- 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());
- }
- }
- }
-
- private boolean imageSpanTapped(final WPImageSpan span) {
- MediaFile mediaFile = span.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 theme support it
- if (WordPress.getCurrentBlog().isFeaturedImageCapable()) {
- 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<CharSequence> 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(), span.getImageSource());
- 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;
- }
- });
-
- AlertDialog ad = new AlertDialog.Builder(getActivity()).setTitle(getString(R.string.image_settings))
- .setView(alertView).setPositiveButton(getString(R.string.ok), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- String title = (titleText.getText() != null) ? titleText.getText().toString() : "";
- MediaFile mediaFile = span.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[] postImageSpans = contentSpannable.getSpans(0, contentSpannable.length(), WPImageSpan.class);
- if (postImageSpans.length > 1) {
- for (WPImageSpan postImageSpan : postImageSpans) {
- if (postImageSpan != span) {
- MediaFile postMediaFile = postImageSpan.getMediaFile();
- postMediaFile.setFeatured(false);
- postMediaFile.setFeaturedInPost(false);
- postMediaFile.save();
- }
- }
- }
- }
- mediaFile.setFeaturedInPost(featuredInPostCheckBox.isChecked());
- mediaFile.save();
- }
- }).setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
- public void onClick(DialogInterface dialog, int whichButton) {
- dialog.dismiss();
- }
- }).create();
- ad.getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN);
- ad.show();
- mScrollDetected = false;
- }
-
- return true;
- }
-
- /**
- * Rich Text Editor
- */
- @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 (mActivity != null && 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 s = mContentEditText.getText();
- if (s == null)
- return false;
-
-
- // check if image span was tapped
- WPImageSpan[] image_spans = s.getSpans(charPosition, charPosition, WPImageSpan.class);
-
- if (image_spans.length != 0) {
- return imageSpanTapped(image_spans[0]);
- } 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 = s.getSpans(charPosition, charPosition, MediaGalleryImageSpan.class);
- if (gallerySpans.length > 0) {
- final MediaGalleryImageSpan gallerySpan = gallerySpans[0];
- startMediaGalleryActivity(gallerySpan.getMediaGallery());
- }
- }
- } 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 || !mActivity.getPost().isLocalDraft())
- 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 (mActivity.getPost() == null || !mActivity.getPost().isLocalDraft())
- 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;
- }
-
- /**
- * Handles media upload notifications. Used when uploading local media to create a gallery
- * after media selection.
- */
- private BroadcastReceiver mMediaUploadReceiver = new BroadcastReceiver() {
- @Override
- public void onReceive(Context context, Intent intent) {
- String action = intent.getAction();
- if (MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION.equals(action)) {
- String mediaId = intent.getStringExtra(MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION_EXTRA);
- String newId = intent.getStringExtra(MediaUploadService.MEDIA_UPLOAD_INTENT_NOTIFICATION_ERROR);
-
- if (mediaId != null && newId != null) {
- for (Long galleryId : mPendingGalleryUploads.keySet()) {
- if (mPendingGalleryUploads.get(galleryId).contains(mediaId)) {
- int selectionStart = 0;
- int selectionEnd = mContentEditText.length();
- Editable editableText = mContentEditText.getText();
-
- MediaGalleryImageSpan[] gallerySpans = editableText.getSpans(selectionStart, selectionEnd, MediaGalleryImageSpan.class);
- if (gallerySpans.length != 0) {
- for (MediaGalleryImageSpan gallerySpan : gallerySpans) {
- MediaGallery gallery = gallerySpan.getMediaGallery();
- if (gallery.getUniqueId() == galleryId) {
- ArrayList<String> galleryIds = gallery.getIds();
- galleryIds.add(newId);
- gallery.setIds(galleryIds);
- gallerySpan.setMediaGallery(gallery);
- int spanStart = editableText.getSpanStart(gallerySpan);
- int spanEnd = editableText.getSpanEnd(gallerySpan);
- editableText.setSpan(gallerySpan, spanStart, spanEnd, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
- }
- }
- }
-
- mPendingGalleryUploads.get(galleryId).remove(mediaId);
- if (mPendingGalleryUploads.get(galleryId).size() == 0) {
- mPendingGalleryUploads.remove(galleryId);
- }
- }
- }
-
- if (mPendingGalleryUploads.size() == 0) {
- stopMediaUploadService();
- NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
- notificationManager.cancel(10);
- }
- }
- }
- }
- };
-
- /**
- * Starts the upload service to upload selected media.
- */
- private void startMediaUploadService() {
- if (!mMediaUploadServiceStarted) {
- getActivity().startService(new Intent(getActivity(), MediaUploadService.class));
- mMediaUploadServiceStarted = true;
- }
- }
-
- /**
- * Stops the upload service.
- */
- private void stopMediaUploadService() {
- if (mMediaUploadServiceStarted) {
- getActivity().stopService(new Intent(getActivity(), MediaUploadService.class));
- mMediaUploadServiceStarted = false;
- }
- }
-
- /**
- * Create image {@link org.wordpress.mediapicker.source.MediaSource}'s for media selection.
- *
- * @return
- * list containing all sources to gather image media from
- */
- private ArrayList<MediaSource> imageMediaSelectionSources() {
- ArrayList<MediaSource> imageMediaSources = new ArrayList<>();
- imageMediaSources.add(new MediaSourceDeviceImages(getActivity().getContentResolver()));
-
- return imageMediaSources;
- }
-
- private ArrayList<MediaSource> blogImageMediaSelectionSources() {
- ArrayList<MediaSource> imageMediaSources = new ArrayList<>();
- imageMediaSources.add(new MediaSourceWPImages());
-
- return imageMediaSources;
- }
-
- private ArrayList<MediaSource> blogVideoMediaSelectionSources() {
- ArrayList<MediaSource> imageMediaSources = new ArrayList<>();
- imageMediaSources.add(new MediaSourceWPVideos());
-
- return imageMediaSources;
- }
-
- /**
- * Create video {@link org.wordpress.mediapicker.source.MediaSource}'s for media selection.
- *
- * @return
- * list containing all sources to gather video media from
- */
- private ArrayList<MediaSource> videoMediaSelectionSources() {
- ArrayList<MediaSource> videoMediaSources = new ArrayList<>();
- videoMediaSources.add(new MediaSourceDeviceVideos(getActivity().getContentResolver()));
-
- return videoMediaSources;
- }
-
- private void refreshBlogMedia() {
- if (NetworkUtils.isNetworkAvailable(getActivity())) {
- List<Object> apiArgs = new ArrayList<Object>();
- apiArgs.add(WordPress.getCurrentBlog());
- ApiHelper.SyncMediaLibraryTask.Callback callback = new ApiHelper.SyncMediaLibraryTask.Callback() {
- @Override
- public void onSuccess(int count) {
- mBlogMediaStatus = 1;
- }
-
- @Override
- public void onFailure(final ApiHelper.ErrorType errorType, String errorMessage, Throwable throwable) {
- mBlogMediaStatus = 0;
- ToastUtils.showToast(getActivity(), R.string.error_refresh_media, ToastUtils.Duration.SHORT);
- }
- };
- ApiHelper.SyncMediaLibraryTask getMediaTask = new ApiHelper.SyncMediaLibraryTask(0, MediaGridFragment.Filter.ALL, callback);
- getMediaTask.execute(apiArgs);
- } else {
- mBlogMediaStatus = 0;
- ToastUtils.showToast(getActivity(), R.string.error_refresh_media, ToastUtils.Duration.SHORT);
- }
- }
-
- /**
- * Starts {@link org.wordpress.android.ui.media.MediaPickerActivity} after refreshing the blog media.
- */
- private void startMediaSelection() {
- Intent intent = new Intent(mActivity, MediaPickerActivity.class);
- intent.putExtra(MediaPickerActivity.ACTIVITY_TITLE_KEY, getString(R.string.add_to_post));
- intent.putParcelableArrayListExtra(MediaPickerActivity.DEVICE_IMAGE_MEDIA_SOURCES_KEY, imageMediaSelectionSources());
- intent.putParcelableArrayListExtra(MediaPickerActivity.DEVICE_VIDEO_MEDIA_SOURCES_KEY, videoMediaSelectionSources());
- if (mBlogMediaStatus != 0) {
- intent.putParcelableArrayListExtra(MediaPickerActivity.BLOG_IMAGE_MEDIA_SOURCES_KEY, blogImageMediaSelectionSources());
- intent.putParcelableArrayListExtra(MediaPickerActivity.BLOG_VIDEO_MEDIA_SOURCES_KEY, blogVideoMediaSelectionSources());
- }
-
- startActivityForResult(intent, MediaPickerActivity.ACTIVITY_REQUEST_CODE_MEDIA_SELECTION);
- mActivity.overridePendingTransition(R.anim.slide_up, R.anim.fade_out);
- }
-
- /**
- * Handles result from {@link org.wordpress.android.ui.media.MediaPickerActivity} by adding the
- * selected media to the Post.
- *
- * @param data
- * result {@link android.content.Intent} with selected media items
- */
- private void handleMediaSelectionResult(Intent data) {
- if (data != null) {
- final List<MediaItem> selectedContent =
- data.getParcelableArrayListExtra(MediaPickerActivity.SELECTED_CONTENT_RESULTS_KEY);
- if (selectedContent != null && selectedContent.size() > 0) {
- Integer localMediaAdded = 0;
- Integer libraryMediaAdded = 0;
-
- for (MediaItem media : selectedContent) {
- if (media.getSource().toString().contains("wordpress.com")) {
- addExistingMediaToEditor(media.getTag());
- ++libraryMediaAdded;
- } else {
- addMedia(media.getSource(), null, getActivity());
- ++localMediaAdded;
- }
- }
-
- if (localMediaAdded > 0) {
- Map<String, Object> analyticsProperties = new HashMap<>();
- analyticsProperties.put(ANALYTIC_PROP_NUM_LOCAL_PHOTOS_ADDED, localMediaAdded);
- AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY, analyticsProperties);
- }
-
- if (libraryMediaAdded > 0) {
- Map<String, Object> analyticsProperties = new HashMap<>();
- analyticsProperties.put(ANALYTIC_PROP_NUM_WP_PHOTOS_ADDED, libraryMediaAdded);
- AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY, analyticsProperties);
- }
- }
- }
- }
-
- /**
- * Handles result from {@link org.wordpress.android.ui.media.MediaPickerActivity}. Uploads local
- * media to users blog then adds a gallery to the Post with all the selected media.
- *
- * @param data
- * contains the selected media content with key
- * {@link org.wordpress.android.ui.media.MediaPickerActivity#SELECTED_CONTENT_RESULTS_KEY}
- */
- private void handleGalleryResult(Intent data) {
- if (data != null) {
- List<MediaItem> selectedContent = data.getParcelableArrayListExtra(MediaPickerActivity.SELECTED_CONTENT_RESULTS_KEY);
-
- if (selectedContent != null && selectedContent.size() > 0) {
- ArrayList<String> blogMediaIds = new ArrayList<>();
- ArrayList<String> localMediaIds = new ArrayList<>();
-
- for (MediaItem content : selectedContent) {
- Uri source = content.getSource();
- final String id = content.getTag();
-
- if (source != null && id != null) {
- final String sourceString = source.toString();
-
- if (MediaUtils.isVideo(sourceString)) {
- // Videos cannot be added to a gallery, insert inline instead
- addMedia(source, null, getActivity());
- } else if (sourceString.contains("wordpress.com")) {
- blogMediaIds.add(id);
- AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_WP_MEDIA_LIBRARY);
- } else if (MediaUtils.isValidImage(sourceString)) {
- queueFileForUpload(sourceString, localMediaIds);
- AnalyticsTracker.track(Stat.EDITOR_ADDED_PHOTO_VIA_LOCAL_LIBRARY);
- }
- }
- }
-
- MediaGallery gallery = new MediaGallery();
- gallery.setIds(blogMediaIds);
-
- if (localMediaIds.size() > 0) {
- NotificationManager notificationManager = (NotificationManager) getActivity().getSystemService(Context.NOTIFICATION_SERVICE);
-
- NotificationCompat.Builder builder = new NotificationCompat.Builder(getActivity().getApplicationContext());
- builder.setSmallIcon(android.R.drawable.stat_sys_upload);
- builder.setContentTitle("Uploading gallery");
- notificationManager.notify(10, builder.build());
-
- mPendingGalleryUploads.put(gallery.getUniqueId(), new ArrayList<>(localMediaIds));
- }
-
- // Only insert gallery span if images were added
- if (localMediaIds.size() > 0 || blogMediaIds.size() > 0) {
- 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(), gallery);
- 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");
- }
- }
- }
- }
-
- /**
- * Queues a media file for upload and starts the MediaUploadService. Toasts will alert the user
- * if there are issues with the file.
- *
- * @param path
- * local path of the media file to upload
- * @param mediaIdOut
- * the new {@link org.wordpress.android.models.MediaFile} ID is added if non-null
- */
- private void queueFileForUpload(String path, ArrayList<String> mediaIdOut) {
- // Invalid file path
- if (TextUtils.isEmpty(path)) {
- Toast.makeText(getActivity(), R.string.editor_toast_invalid_path, Toast.LENGTH_SHORT).show();
- return;
- }
-
- // File not found
- File file = new File(path);
- if (!file.exists()) {
- Toast.makeText(getActivity(), R.string.file_not_found, Toast.LENGTH_SHORT).show();
- return;
- }
-
- Blog blog = WordPress.getCurrentBlog();
- long currentTime = System.currentTimeMillis();
- String mimeType = MediaUtils.getMediaFileMimeType(file);
- String fileName = MediaUtils.getMediaFileName(file, mimeType);
- MediaFile mediaFile = new MediaFile();
-
- mediaFile.setBlogId(String.valueOf(blog.getLocalTableBlogId()));
- mediaFile.setFileName(fileName);
- mediaFile.setFilePath(path);
- mediaFile.setUploadState("queued");
- mediaFile.setDateCreatedGMT(currentTime);
- mediaFile.setMediaId(String.valueOf(currentTime));
-
- if (mimeType != null && mimeType.startsWith("image")) {
- // get width and height
- BitmapFactory.Options bfo = new BitmapFactory.Options();
- bfo.inJustDecodeBounds = true;
- BitmapFactory.decodeFile(path, bfo);
- mediaFile.setWidth(bfo.outWidth);
- mediaFile.setHeight(bfo.outHeight);
- }
-
- if (!TextUtils.isEmpty(mimeType)) {
- mediaFile.setMimeType(mimeType);
- }
-
- if (mediaIdOut != null) {
- mediaIdOut.add(mediaFile.getMediaId());
- }
-
- mediaFile.save();
- startMediaUploadService();
- }
-
- private class LoadPostContentTask extends AsyncTask<String, Spanned, Spanned> {
- @Override
- protected Spanned doInBackground(String... params) {
- if (params.length < 1 || mActivity == null || mActivity.getPost() == null) {
- return null;
- }
-
- String content = StringUtils.notNullStr(params[0]);
-
- return WPHtml.fromHtml(
- content,
- mActivity,
- mActivity.getPost(),
- getMaximumThumbnailWidth()
- );
- }
-
- @Override
- protected void onPostExecute(Spanned spanned) {
- if (mActivity != null && mContentEditText != null && spanned != null) {
- mContentEditText.setText(spanned);
- }
- }
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostSettingsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
index 792231bd1..13b9346fe 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/EditPostSettingsFragment.java
@@ -46,13 +46,13 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.models.Post;
import org.wordpress.android.models.PostLocation;
import org.wordpress.android.models.PostStatus;
-import org.wordpress.android.ui.media.MediaUtils;
+import org.wordpress.android.ui.media.WordPressMediaUtils.RequestCode;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.EditTextUtils;
import org.wordpress.android.util.GeocoderUtils;
-import org.wordpress.android.util.JSONUtil;
-import org.wordpress.android.util.LocationHelper;
+import org.wordpress.android.util.JSONUtils;
+import org.wordpress.android.util.helpers.LocationHelper;
import org.xmlrpc.android.ApiHelper;
import java.lang.reflect.Type;
@@ -105,8 +105,9 @@ public class EditPostSettingsFragment extends Fragment
ViewGroup rootView = (ViewGroup) inflater
.inflate(R.layout.fragment_edit_post_settings, container, false);
- if (rootView == null)
+ if (rootView == null) {
return null;
+ }
mActivity = (EditPostActivity) getActivity();
@@ -265,7 +266,7 @@ public class EditPostSettingsFragment extends Fragment
if (!post.isPage()) {
if (post.getJSONCategories() != null) {
- mCategories = JSONUtil.fromJSONArrayToStringList(post.getJSONCategories());
+ mCategories = JSONUtils.fromJSONArrayToStringList(post.getJSONCategories());
}
}
String tags = post.getKeywords();
@@ -302,7 +303,8 @@ public class EditPostSettingsFragment extends Fragment
public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
- if (data != null || ((requestCode == MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO || requestCode == MediaUtils.RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO))) {
+ if (data != null || ((requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_PHOTO ||
+ requestCode == RequestCode.ACTIVITY_REQUEST_CODE_TAKE_VIDEO))) {
Bundle extras;
switch (requestCode) {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostUploadService.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostUploadService.java
index 536c26bed..40ea141e2 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostUploadService.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostUploadService.java
@@ -31,16 +31,16 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.models.Blog;
import org.wordpress.android.models.FeatureSet;
-import org.wordpress.android.models.MediaFile;
import org.wordpress.android.models.Post;
import org.wordpress.android.models.PostLocation;
import org.wordpress.android.models.PostStatus;
-import org.wordpress.android.ui.media.MediaUtils;
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.SystemServiceFactory;
+import org.wordpress.android.util.helpers.MediaFile;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlrpc.android.ApiHelper;
import org.xmlrpc.android.XMLRPCClient;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsActivity.java
index 782973b8a..dd8338642 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsActivity.java
@@ -13,7 +13,6 @@ import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.text.TextUtils;
-import android.view.MenuItem;
import android.widget.Toast;
import org.wordpress.android.R;
@@ -25,7 +24,7 @@ import org.wordpress.android.ui.WPDrawerActivity;
import org.wordpress.android.ui.posts.PostsListFragment.OnPostActionListener;
import org.wordpress.android.ui.posts.PostsListFragment.OnPostSelectedListener;
import org.wordpress.android.ui.posts.ViewPostFragment.OnDetailPostActionListener;
-import org.wordpress.android.util.AlertUtil;
+import org.wordpress.android.util.AlertUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.ProfilingUtils;
@@ -469,7 +468,7 @@ public class PostsActivity extends WPDrawerActivity
} else if (action == POST_SHARE) {
// Only share published posts
if (post.getStatusEnum() != PostStatus.PUBLISHED && post.getStatusEnum() != PostStatus.SCHEDULED) {
- AlertUtil.showAlert(this, R.string.error,
+ AlertUtils.showAlert(this, R.string.error,
post.isPage() ? R.string.page_not_published : R.string.post_not_published);
return;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListFragment.java
index f7097eba6..50b6606d9 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/PostsListFragment.java
@@ -27,9 +27,9 @@ import org.wordpress.android.ui.posts.adapters.PostsListAdapter;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import org.wordpress.android.widgets.FloatingActionButton;
import org.wordpress.android.widgets.WPAlertDialogFragment;
import org.xmlrpc.android.ApiHelper;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java
index f94c1a620..370f4653d 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/posts/SelectCategoriesActivity.java
@@ -20,14 +20,14 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
import org.wordpress.android.models.CategoryNode;
import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.ListScrollPositionManager;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.ListScrollPositionManager;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlrpc.android.XMLRPCClientInterface;
import org.xmlrpc.android.XMLRPCException;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java
index 78e839e29..3ef0b6f19 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/AppPrefs.java
@@ -25,7 +25,7 @@ public class AppPrefs {
READER_SUBS_PAGE_TITLE,
// email retrieved and attached to mixpanel profile
- MIXPANEL_EMAIL_ADDRESS_RETRIEVED,
+ MIXPANEL_EMAIL_ADDRESS,
}
private static SharedPreferences prefs() {
@@ -129,7 +129,7 @@ public class AppPrefs {
}
}
- /*
+ /**
* title of the last active page in ReaderSubsActivity - this is stored rather than
* the index of the page so we can re-order pages without affecting this value
*/
@@ -140,7 +140,7 @@ public class AppPrefs {
setString(PrefKey.READER_SUBS_PAGE_TITLE, pageTitle);
}
- /*
+ /**
* name of the last shown activity - used at startup to restore the previously selected
* activity, also used by analytics tracker
*/
@@ -157,11 +157,11 @@ public class AppPrefs {
// Mixpanel email retrieval check
- public static Boolean getMixpanelEmailRetrievalCheck() {
- return getBoolean(PrefKey.MIXPANEL_EMAIL_ADDRESS_RETRIEVED, false);
+ public static String getMixpanelUserEmail() {
+ return getString(PrefKey.MIXPANEL_EMAIL_ADDRESS, null);
}
- public static void setMixpanelEmailRetrievalCheck(boolean b) {
- setBoolean(PrefKey.MIXPANEL_EMAIL_ADDRESS_RETRIEVED, b);
+ public static void setMixpanelUserEmail(String email) {
+ setString(PrefKey.MIXPANEL_EMAIL_ADDRESS, email);
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java
index f1e22071c..684afc75a 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/BlogPreferencesActivity.java
@@ -24,6 +24,7 @@ import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.ui.WPWebViewActivity;
+import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.StringUtils;
import java.util.Locale;
@@ -271,7 +272,7 @@ public class BlogPreferencesActivity extends ActionBarActivity {
boolean deleteSuccess =
WordPress.wpDB.deleteAccount(BlogPreferencesActivity.this, blog.getLocalTableBlogId());
if (deleteSuccess) {
- AnalyticsTracker.refreshMetadata();
+ AnalyticsUtils.refreshMetadata();
Toast.makeText(activity, getResources().getText(R.string.blog_removed_successfully),
Toast.LENGTH_SHORT)
.show();
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SettingsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SettingsActivity.java
index 09a22b5e7..a9cf18028 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/prefs/SettingsActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/prefs/SettingsActivity.java
@@ -12,6 +12,7 @@ import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.models.Blog;
+import org.wordpress.android.util.AnalyticsUtils;
public class SettingsActivity extends ActionBarActivity {
public static final int RESULT_SIGNED_OUT = 1;
@@ -78,7 +79,8 @@ public class SettingsActivity extends ActionBarActivity {
}
data.putExtra(SettingsActivity.CURRENT_BLOG_CHANGED, currentBlogChanged);
setResult(Activity.RESULT_OK, data);
- AnalyticsTracker.loadPrefHasUserOptedOut(true);
+ AnalyticsTracker.loadPrefHasUserOptedOut(this, true);
+ AnalyticsUtils.refreshMetadata();
super.finish();
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java
index 8b04df9eb..c73df4c3d 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/ReaderPostListFragment.java
@@ -68,9 +68,9 @@ import org.wordpress.android.util.HtmlUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.WPActivityUtils;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import java.util.ArrayList;
import java.util.EnumSet;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java
index f4502090c..5296a2ef0 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderCommentActions.java
@@ -16,14 +16,13 @@ import org.wordpress.android.models.ReaderUser;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.DateTimeUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.VolleyUtils;
import java.util.HashMap;
import java.util.Map;
public class ReaderCommentActions {
-
/*
* used by post detail to generate a temporary "fake" comment id (see below)
*/
@@ -149,7 +148,7 @@ public class ReaderCommentActions {
RestRequest.Listener listener = new RestRequest.Listener() {
@Override
public void onResponse(JSONObject jsonObject) {
- boolean success = (jsonObject != null && JSONUtil.getBool(jsonObject, "success"));
+ boolean success = (jsonObject != null && JSONUtils.getBool(jsonObject, "success"));
if (success) {
AppLog.d(T.READER, String.format("comment %s succeeded", actionName));
} else {
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java
index 460d1b114..edc857311 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/actions/ReaderPostActions.java
@@ -19,7 +19,7 @@ import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResult;
import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResultListener;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.VolleyUtils;
import java.util.HashMap;
@@ -106,7 +106,7 @@ public class ReaderPostActions {
com.wordpress.rest.RestRequest.Listener listener = new RestRequest.Listener() {
@Override
public void onResponse(JSONObject jsonObject) {
- boolean isReblogged = (jsonObject != null && JSONUtil.getBool(jsonObject, "is_reblogged"));
+ boolean isReblogged = (jsonObject != null && JSONUtils.getBool(jsonObject, "is_reblogged"));
if (isReblogged) {
ReaderPostTable.setPostReblogged(post, true);
}
@@ -228,7 +228,7 @@ public class ReaderPostActions {
return false;
}
- JSONObject jsonLikes = JSONUtil.getJSONChild(jsonPost, "meta/data/likes");
+ JSONObject jsonLikes = JSONUtils.getJSONChild(jsonPost, "meta/data/likes");
if (jsonLikes == null) {
return false;
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderCommentService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderCommentService.java
index a9475daae..5458ca9dc 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderCommentService.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderCommentService.java
@@ -25,7 +25,7 @@ import org.wordpress.android.ui.reader.actions.ReaderActions;
import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResult;
import org.wordpress.android.ui.reader.actions.ReaderActions.UpdateResultListener;
import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import de.greenrobot.event.EventBus;
@@ -146,7 +146,7 @@ public class ReaderCommentService extends Service {
serverComments.add(comment);
// extract and save likes for this comment
- JSONObject jsonLikes = JSONUtil.getJSONChild(jsonComment, "meta/data/likes");
+ JSONObject jsonLikes = JSONUtils.getJSONChild(jsonComment, "meta/data/likes");
if (jsonLikes != null) {
ReaderUserList likingUsers = ReaderUserList.fromJsonLikes(jsonLikes);
ReaderUserTable.addOrUpdateUsers(likingUsers);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderUpdateService.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderUpdateService.java
index c7ca3548e..1c61759d1 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderUpdateService.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/services/ReaderUpdateService.java
@@ -23,7 +23,7 @@ import org.wordpress.android.models.ReaderTagType;
import org.wordpress.android.ui.reader.ReaderConstants;
import org.wordpress.android.ui.reader.ReaderEvents;
import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import java.util.EnumSet;
import java.util.Iterator;
@@ -192,8 +192,8 @@ public class ReaderUpdateService extends Service {
String internalName = it.next();
JSONObject jsonTopic = jsonTopics.optJSONObject(internalName);
if (jsonTopic != null) {
- String tagName = JSONUtil.getStringDecoded(jsonTopic, "title");
- String endpoint = JSONUtil.getString(jsonTopic, "URL");
+ String tagName = JSONUtils.getStringDecoded(jsonTopic, "title");
+ String endpoint = JSONUtils.getString(jsonTopic, "URL");
topics.add(new ReaderTag(tagName, endpoint, topicType));
}
}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.java
index 379ee4a50..10661d12a 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ImageSizeMap.java
@@ -5,7 +5,7 @@ import android.text.TextUtils;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.util.AppLog;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.UrlUtils;
import java.util.HashMap;
@@ -31,8 +31,8 @@ public class ImageSizeMap extends HashMap<String, ImageSizeMap.ImageSize> {
while (it.hasNext()) {
JSONObject jsonAttach = json.optJSONObject(it.next());
- if (jsonAttach != null && JSONUtil.getString(jsonAttach, "mime_type").startsWith("image")) {
- String normUrl = UrlUtils.normalizeUrl(UrlUtils.removeQuery(JSONUtil.getString(jsonAttach, "URL")));
+ if (jsonAttach != null && JSONUtils.getString(jsonAttach, "mime_type").startsWith("image")) {
+ String normUrl = UrlUtils.normalizeUrl(UrlUtils.removeQuery(JSONUtils.getString(jsonAttach, "URL")));
int width = jsonAttach.optInt("width");
int height = jsonAttach.optInt("height");
this.put(normUrl, new ImageSize(width, height));
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java
index df42753bb..45d1cf5f7 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/reader/utils/ReaderVideoUtils.java
@@ -12,7 +12,7 @@ import org.json.JSONObject;
import org.wordpress.android.WordPress;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
public class ReaderVideoUtils {
private ReaderVideoUtils() {
@@ -145,7 +145,7 @@ public class ReaderVideoUtils {
if (response!=null && response.length() > 0) {
JSONObject json = response.optJSONObject(0);
if (json!=null && json.has("thumbnail_large"))
- thumbnailUrl = JSONUtil.getString(json, "thumbnail_large");
+ thumbnailUrl = JSONUtils.getString(json, "thumbnail_large");
}
if (TextUtils.isEmpty(thumbnailUrl)) {
thumbListener.onResponse(false, null);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsActivity.java
index 090fbae97..7ec9defcc 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsActivity.java
@@ -39,6 +39,7 @@ import org.wordpress.android.ui.WPDrawerActivity;
import org.wordpress.android.ui.WPWebViewActivity;
import org.wordpress.android.ui.accounts.SignInActivity;
import org.wordpress.android.ui.stats.service.StatsService;
+import org.wordpress.android.util.AnalyticsUtils;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.AuthenticationDialogUtils;
@@ -47,9 +48,9 @@ import org.wordpress.android.util.RateLimitedTask;
import org.wordpress.android.util.StringUtils;
import org.wordpress.android.util.ToastUtils;
import org.wordpress.android.util.ToastUtils.Duration;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import org.xmlrpc.android.ApiHelper;
import org.xmlrpc.android.XMLRPCCallback;
import org.xmlrpc.android.XMLRPCClientInterface;
@@ -437,7 +438,7 @@ public class StatsActivity extends WPDrawerActivity implements ScrollViewExt.Scr
if (result != null && (result instanceof HashMap)) {
Map<?, ?> blogOptions = (HashMap<?, ?>) result;
ApiHelper.updateBlogOptions(currentBlog, blogOptions);
- AnalyticsTracker.refreshMetadata();
+ AnalyticsUtils.refreshMetadata();
AnalyticsTracker.track(AnalyticsTracker.Stat.SIGNED_INTO_JETPACK);
AnalyticsTracker.track(
AnalyticsTracker.Stat.PERFORMED_JETPACK_SIGN_IN_FROM_STATS_SCREEN);
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSinglePostDetailsActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSinglePostDetailsActivity.java
index 20b294a0b..83470a691 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSinglePostDetailsActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSinglePostDetailsActivity.java
@@ -36,8 +36,8 @@ import org.wordpress.android.util.DisplayUtils;
import org.wordpress.android.util.FormatUtils;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import java.lang.ref.WeakReference;
import java.util.List;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java
index 4f5c50308..a47e0d9ff 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java
@@ -26,8 +26,8 @@ import org.wordpress.android.ui.stats.service.StatsService;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.ToastUtils;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import java.io.Serializable;
import java.lang.ref.WeakReference;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/AuthorModel.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/AuthorModel.java
index 38fa62038..4137d6eb1 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/AuthorModel.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/AuthorModel.java
@@ -4,7 +4,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.ui.stats.StatsUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import java.io.Serializable;
import java.util.ArrayList;
@@ -42,7 +42,7 @@ public class AuthorModel implements Serializable {
setGroupId(authorJSON.getString("name"));
setName(authorJSON.getString("name"));
setViews(authorJSON.getInt("views"));
- setAvatar(JSONUtil.getString(authorJSON, "avatar"));
+ setAvatar(JSONUtils.getString(authorJSON, "avatar"));
// Follow data could return a boolean false
JSONObject followData = authorJSON.optJSONObject("follow_data");
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ClickGroupModel.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ClickGroupModel.java
index 90adab892..6e2fc9468 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ClickGroupModel.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ClickGroupModel.java
@@ -6,7 +6,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.ui.stats.StatsUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import java.io.Serializable;
import java.util.ArrayList;
@@ -33,11 +33,11 @@ public class ClickGroupModel implements Serializable {
setGroupId(clickGroupJSON.getString("name"));
setName(clickGroupJSON.getString("name"));
setViews(clickGroupJSON.getInt("views"));
- setIcon(JSONUtil.getString(clickGroupJSON, "icon"));
+ setIcon(JSONUtils.getString(clickGroupJSON, "icon"));
// if URL is set in the response there is one result only. No need to unfold "results"
- if (!TextUtils.isEmpty(JSONUtil.getString(clickGroupJSON, "url"))) {
- setUrl(JSONUtil.getString(clickGroupJSON, "url"));
+ if (!TextUtils.isEmpty(JSONUtils.getString(clickGroupJSON, "url"))) {
+ setUrl(JSONUtils.getString(clickGroupJSON, "url"));
} else {
JSONArray childrenJSON = clickGroupJSON.getJSONArray("children");
mClicks = new ArrayList<>(childrenJSON.length());
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/FollowerModel.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/FollowerModel.java
index b5a0786c0..9eba38413 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/FollowerModel.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/FollowerModel.java
@@ -4,7 +4,7 @@ import android.text.TextUtils;
import org.json.JSONException;
import org.json.JSONObject;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import org.wordpress.android.util.UrlUtils;
import java.io.Serializable;
@@ -21,8 +21,8 @@ public class FollowerModel implements Serializable {
this.mBlogId = mBlogId;
this.mLabel = followerJSONData.getString("label");
- setAvatar(JSONUtil.getString(followerJSONData, "avatar"));
- setURL(JSONUtil.getString(followerJSONData, "url"));
+ setAvatar(JSONUtils.getString(followerJSONData, "avatar"));
+ setURL(JSONUtils.getString(followerJSONData, "url"));
this.mDateSubscribed = followerJSONData.getString("date_subscribed");
@@ -74,4 +74,4 @@ public class FollowerModel implements Serializable {
public String getDateSubscribed() {
return mDateSubscribed;
}
-} \ No newline at end of file
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ReferrerGroupModel.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ReferrerGroupModel.java
index 56a62b374..50291332c 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ReferrerGroupModel.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/ReferrerGroupModel.java
@@ -6,7 +6,7 @@ import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.wordpress.android.ui.stats.StatsUtils;
-import org.wordpress.android.util.JSONUtil;
+import org.wordpress.android.util.JSONUtils;
import java.io.Serializable;
import java.util.ArrayList;
@@ -34,11 +34,11 @@ public class ReferrerGroupModel implements Serializable {
setGroupId(groupJSON.getString("group"));
setName(groupJSON.getString("name"));
setTotal(groupJSON.getInt("total"));
- setIcon(JSONUtil.getString(groupJSON, "icon"));
+ setIcon(JSONUtils.getString(groupJSON, "icon"));
// if URL is set in the response there is one result only. No need to unfold "results"
- if (!TextUtils.isEmpty(JSONUtil.getString(groupJSON, "url"))) {
- setUrl(JSONUtil.getString(groupJSON, "url"));
+ if (!TextUtils.isEmpty(JSONUtils.getString(groupJSON, "url"))) {
+ setUrl(JSONUtils.getString(groupJSON, "url"));
} else {
// Referrers is a 3-levels depth structure. We don't have 3 levels UI for now. Unfold childs here.
JSONArray resultsJSON = groupJSON.getJSONArray("results");
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemePreviewFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemePreviewFragment.java
index d1805866e..0477d2123 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemePreviewFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemePreviewFragment.java
@@ -19,7 +19,7 @@ import org.wordpress.android.models.Blog;
import org.wordpress.android.ui.WPWebViewActivity;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.util.WPWebChromeClient;
+import org.wordpress.android.util.helpers.WPWebChromeClient;
import org.wordpress.android.util.WPWebViewClient;
import java.io.UnsupportedEncodingException;
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeTabFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeTabFragment.java
index 402c804dc..b9ace6c1d 100644
--- a/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeTabFragment.java
+++ b/WordPress/src/main/java/org/wordpress/android/ui/themes/ThemeTabFragment.java
@@ -22,9 +22,9 @@ import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.ui.themes.ThemeTabAdapter.ScreenshotHolder;
import org.wordpress.android.util.NetworkUtils;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper;
-import org.wordpress.android.util.ptr.SwipeToRefreshHelper.RefreshListener;
-import org.wordpress.android.util.ptr.CustomSwipeRefreshLayout;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
+import org.wordpress.android.util.helpers.SwipeToRefreshHelper.RefreshListener;
+import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
/**
* A fragment display the themes on a grid view.
diff --git a/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java
new file mode 100644
index 000000000..11d051cd8
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/util/AnalyticsUtils.java
@@ -0,0 +1,88 @@
+package org.wordpress.android.util;
+
+import android.content.SharedPreferences;
+import android.preference.PreferenceManager;
+import android.text.TextUtils;
+
+import com.android.volley.VolleyError;
+import com.wordpress.rest.RestRequest;
+
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.wordpress.android.WordPress;
+import org.wordpress.android.analytics.AnalyticsTracker;
+import org.wordpress.android.analytics.AnalyticsTrackerMixpanel;
+import org.wordpress.android.ui.prefs.AppPrefs;
+import org.wordpress.android.util.AppLog.T;
+
+public class AnalyticsUtils {
+ /**
+ * Utility method to refresh mixpanel metadata.
+ *
+ * @param username WordPress.com username
+ * @param email WordPress.com email address
+ */
+ public static void refreshMetadata(String username, String email) {
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(WordPress.getContext());
+ int sessionCount = preferences.getInt(AnalyticsTrackerMixpanel.SESSION_COUNT, 0);
+ boolean isUserConnected = WordPress.isSignedIn(WordPress.getContext());
+ boolean isJetpackUser = WordPress.wpDB.hasAnyJetpackBlogs();
+ int numBlogs = WordPress.wpDB.getVisibleAccounts().size();
+ int versionCode = PackageUtils.getVersionCode(WordPress.getContext());
+
+ retrieveAndSaveEmailAddressIfApplicable();
+ AnalyticsTracker.refreshMetadata(isUserConnected, isJetpackUser, sessionCount, numBlogs, versionCode,
+ username, email);
+ }
+
+ /**
+ * Utility method to refresh mixpanel metadata.
+ */
+ public static void refreshMetadata() {
+ // retrieve email address if user is logged in
+ retrieveAndSaveEmailAddressIfApplicable();
+
+ SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(WordPress.getContext());
+ int sessionCount = preferences.getInt(AnalyticsTrackerMixpanel.SESSION_COUNT, 0);
+ boolean isUserConnected = WordPress.isSignedIn(WordPress.getContext());
+ boolean isJetpackUser = WordPress.wpDB.hasAnyJetpackBlogs();
+ int numBlogs = WordPress.wpDB.getVisibleAccounts().size();
+ int versionCode = PackageUtils.getVersionCode(WordPress.getContext());
+ String username = preferences.getString(WordPress.WPCOM_USERNAME_PREFERENCE, null);
+ String email = AppPrefs.getMixpanelUserEmail();
+ AnalyticsTracker.refreshMetadata(isUserConnected, isJetpackUser, sessionCount, numBlogs, versionCode,
+ username, email);
+ }
+
+ /**
+ * Fetch user email address with the REST api, will be used later to fill Mixpanel metadata.
+ */
+ private static void retrieveAndSaveEmailAddressIfApplicable() {
+ // Once the email address is bound to a mixpanel profile, we don't need to set (and get it) a second time.
+ if (AppPrefs.getMixpanelUserEmail() != null) {
+ return;
+ }
+ RestRequest.Listener listener = new RestRequest.Listener() {
+ @Override
+ public void onResponse(JSONObject jsonObject) {
+ try {
+ if (jsonObject != null && !TextUtils.isEmpty(jsonObject.getString("email"))) {
+ String email = jsonObject.getString("email");
+ AppPrefs.setMixpanelUserEmail(email);
+ }
+ } catch (JSONException e) {
+ AppLog.e(T.UTILS, "Can't get email field from json response: " + jsonObject);
+ }
+ }
+ };
+ RestRequest.ErrorListener errorListener = new RestRequest.ErrorListener() {
+ @Override
+ public void onErrorResponse(VolleyError volleyError) {
+ AppLog.e(T.UTILS, volleyError);
+ }
+ };
+
+ String path = "/me";
+ WordPress.getRestClientUtils().get(path, listener, errorListener);
+ }
+}
diff --git a/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java b/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java
index 183bb085c..3502ec09d 100644
--- a/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java
+++ b/WordPress/src/main/java/org/wordpress/android/util/HelpshiftHelper.java
@@ -187,7 +187,7 @@ public class HelpshiftHelper {
}
private HashMap getHelpshiftConfig(Context context) {
- String emailAddress = UserEmail.getPrimaryEmail(context);
+ String emailAddress = UserEmailUtils.getPrimaryEmail(context);
// Use the user entered username to pre-fill name
String name = (String) getMetaData(MetadataKey.USER_ENTERED_USERNAME);
// If it's null or empty, use split email address to pre-fill name
diff --git a/WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java b/WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java
index 164430180..5c43068f2 100644
--- a/WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java
+++ b/WordPress/src/main/java/org/wordpress/android/util/VolleyUtils.java
@@ -28,7 +28,7 @@ public class VolleyUtils {
JSONObject json = volleyErrorToJSON(volleyError);
if (json==null)
return "";
- return JSONUtil.getString(json, "error");
+ return JSONUtils.getString(json, "error");
}
public static int statusCodeFromVolleyError(VolleyError volleyError) {
diff --git a/WordPress/src/main/java/org/wordpress/android/util/WPHtml.java b/WordPress/src/main/java/org/wordpress/android/util/WPHtml.java
index e8801ec9a..a888f3ad3 100644
--- a/WordPress/src/main/java/org/wordpress/android/util/WPHtml.java
+++ b/WordPress/src/main/java/org/wordpress/android/util/WPHtml.java
@@ -21,8 +21,6 @@ import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
-import android.graphics.Canvas;
-import android.graphics.Paint;
import android.graphics.Typeface;
import android.graphics.drawable.Drawable;
import android.net.Uri;
@@ -53,13 +51,13 @@ import org.ccil.cowan.tagsoup.Parser;
import org.wordpress.android.R;
import org.wordpress.android.WordPress;
import org.wordpress.android.models.Blog;
-import org.wordpress.android.models.MediaFile;
-import org.wordpress.android.models.MediaGallery;
+import org.wordpress.android.util.helpers.MediaFile;
+import org.wordpress.android.util.helpers.MediaGallery;
import org.wordpress.android.models.Post;
import org.wordpress.android.util.AppLog.T;
-import org.wordpress.android.widgets.MediaGalleryImageSpan;
-import org.wordpress.android.widgets.WPImageSpan;
-import org.wordpress.android.widgets.WPUnderlineSpan;
+import org.wordpress.android.util.helpers.MediaGalleryImageSpan;
+import org.wordpress.android.util.helpers.WPImageSpan;
+import org.wordpress.android.util.helpers.WPUnderlineSpan;
import org.xml.sax.Attributes;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/MediaGalleryImageSpan.java b/WordPress/src/main/java/org/wordpress/android/widgets/MediaGalleryImageSpan.java
deleted file mode 100644
index 19dcebf7c..000000000
--- a/WordPress/src/main/java/org/wordpress/android/widgets/MediaGalleryImageSpan.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package org.wordpress.android.widgets;
-
-import android.content.Context;
-import android.text.style.ImageSpan;
-
-import org.wordpress.android.R;
-import org.wordpress.android.models.MediaGallery;
-
-public class MediaGalleryImageSpan extends ImageSpan {
- private MediaGallery mMediaGallery;
-
- public MediaGalleryImageSpan(Context context, MediaGallery mediaGallery) {
- super(context, R.drawable.icon_mediagallery_placeholder);
- setMediaGallery(mediaGallery);
- }
-
- public MediaGallery getMediaGallery() {
- return mMediaGallery;
- }
-
- public void setMediaGallery(MediaGallery mediaGallery) {
- this.mMediaGallery = mediaGallery;
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPAutoResizeTextView.java b/WordPress/src/main/java/org/wordpress/android/widgets/WPAutoResizeTextView.java
index 5a5c4ac1c..b8c8a9d61 100644
--- a/WordPress/src/main/java/org/wordpress/android/widgets/WPAutoResizeTextView.java
+++ b/WordPress/src/main/java/org/wordpress/android/widgets/WPAutoResizeTextView.java
@@ -3,7 +3,7 @@ package org.wordpress.android.widgets;
import android.content.Context;
import android.util.AttributeSet;
-import org.wordpress.android.util.AutoResizeTextView;
+import org.wordpress.android.util.widgets.AutoResizeTextView;
/**
* custom AutoTextView used in layouts - enables keeping custom typeface handling in one place (so we
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPEditText.java b/WordPress/src/main/java/org/wordpress/android/widgets/WPEditText.java
deleted file mode 100644
index 126bd8eb6..000000000
--- a/WordPress/src/main/java/org/wordpress/android/widgets/WPEditText.java
+++ /dev/null
@@ -1,56 +0,0 @@
-package org.wordpress.android.widgets;
-
-import android.content.Context;
-import android.util.AttributeSet;
-import android.view.KeyEvent;
-import android.widget.EditText;
-
-public class WPEditText extends EditText {
- private EditTextImeBackListener mOnImeBack;
- private OnSelectionChangedListener onSelectionChangedListener;
-
- public WPEditText(Context context) {
- super(context);
- }
-
- public WPEditText(Context context, AttributeSet attrs) {
- super(context, attrs);
- }
-
- public WPEditText(Context context, AttributeSet attrs, int defStyle) {
- super(context, attrs, defStyle);
- }
-
- @Override
- protected void onSelectionChanged(int selStart, int selEnd) {
- if (onSelectionChangedListener != null)
- onSelectionChangedListener.onSelectionChanged();
- }
-
- @Override
- public boolean onKeyPreIme(int keyCode, KeyEvent event) {
- if (event.getKeyCode() == KeyEvent.KEYCODE_BACK
- && event.getAction() == KeyEvent.ACTION_UP) {
- if (mOnImeBack != null)
- mOnImeBack.onImeBack(this, this.getText().toString());
- }
-
- return super.onKeyPreIme(keyCode, event);
- }
-
- public void setOnEditTextImeBackListener(EditTextImeBackListener listener) {
- mOnImeBack = listener;
- }
-
- public interface EditTextImeBackListener {
- public abstract void onImeBack(WPEditText ctrl, String text);
- }
-
- public void setOnSelectionChangedListener(OnSelectionChangedListener listener) {
- onSelectionChangedListener = listener;
- }
-
- public interface OnSelectionChangedListener {
- public abstract void onSelectionChanged();
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPImageSpan.java b/WordPress/src/main/java/org/wordpress/android/widgets/WPImageSpan.java
deleted file mode 100644
index a9298c32c..000000000
--- a/WordPress/src/main/java/org/wordpress/android/widgets/WPImageSpan.java
+++ /dev/null
@@ -1,93 +0,0 @@
-//Add WordPress image fields to ImageSpan object
-
-package org.wordpress.android.widgets;
-
-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.text.style.ImageSpan;
-
-import org.wordpress.android.R;
-import org.wordpress.android.models.MediaFile;
-import org.wordpress.android.ui.posts.EditPostActivity;
-
-public class WPImageSpan extends ImageSpan {
- private Context mContext;
-
- private Uri mImageSource = null;
- private boolean mNetworkImageLoaded = false;
- private boolean mIsInPostEditor;
-
- private MediaFile mMediaFile;
-
- public WPImageSpan(Context context, Bitmap b, Uri src) {
- super(context, b);
- this.mImageSource = src;
- mContext = context;
- mMediaFile = new MediaFile();
- if (mContext instanceof EditPostActivity) {
- EditPostActivity editPostActivity = (EditPostActivity)mContext;
- if (editPostActivity.isEditingPostContent())
- mIsInPostEditor = true;
- }
-
- }
-
- public WPImageSpan(Context context, int resId, Uri src) {
- super(context, resId);
- this.mImageSource = src;
- mContext = context;
- mMediaFile = new MediaFile();
- if (mContext instanceof EditPostActivity)
- mIsInPostEditor = true;
- }
-
- public MediaFile getMediaFile() {
- return mMediaFile;
- }
-
- public void setMediaFile(MediaFile mMediaFile) {
- this.mMediaFile = mMediaFile;
- }
-
- public void setImageSource(Uri mImageSource) {
- this.mImageSource = mImageSource;
- }
-
- public Uri getImageSource() {
- return mImageSource;
- }
-
- public boolean isNetworkImageLoaded() {
- return mNetworkImageLoaded;
- }
-
- public void setNetworkImageLoaded(boolean networkImageLoaded) {
- this.mNetworkImageLoaded = networkImageLoaded;
- }
-
- @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 (mIsInPostEditor && !mMediaFile.isVideo()) {
- // Add 'edit' icon at bottom right of image
- int width = getSize(paint, text, start, end, paint.getFontMetricsInt());
- Bitmap editIconBitmap = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.ab_icon_edit);
- float editIconXPosition = (x + width) - editIconBitmap.getWidth();
- float editIconYPosition = bottom - editIconBitmap.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 + editIconBitmap.getWidth(), editIconYPosition + editIconBitmap.getHeight(), bgPaint);
- // Add the icon to the canvas
- canvas.drawBitmap(editIconBitmap, editIconXPosition, editIconYPosition, paint);
- }
- }
-}
diff --git a/WordPress/src/main/java/org/wordpress/android/widgets/WPUnderlineSpan.java b/WordPress/src/main/java/org/wordpress/android/widgets/WPUnderlineSpan.java
deleted file mode 100644
index 4fe1b0f59..000000000
--- a/WordPress/src/main/java/org/wordpress/android/widgets/WPUnderlineSpan.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * Copyright (C) 2006 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package org.wordpress.android.widgets;
-
-import android.os.Parcel;
-import android.text.ParcelableSpan;
-import android.text.TextPaint;
-import android.text.style.CharacterStyle;
-import android.text.style.UpdateAppearance;
-
-public class WPUnderlineSpan extends CharacterStyle
- implements UpdateAppearance, ParcelableSpan {
- public WPUnderlineSpan() {
- }
-
- public WPUnderlineSpan(Parcel src) {
- }
-
- public int getSpanTypeId() {
- return 6;
- }
-
- public int describeContents() {
- return 0;
- }
-
- public void writeToParcel(Parcel dest, int flags) {
- }
-
- @Override
- public void updateDrawState(TextPaint ds) {
- ds.setUnderlineText(true);
- }
-}
diff --git a/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java b/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java
index a20fd1c7c..e6ad66b48 100644
--- a/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java
+++ b/WordPress/src/main/java/org/xmlrpc/android/ApiHelper.java
@@ -18,7 +18,7 @@ import org.wordpress.android.models.BlogIdentifier;
import org.wordpress.android.models.Comment;
import org.wordpress.android.models.CommentList;
import org.wordpress.android.models.FeatureSet;
-import org.wordpress.android.models.MediaFile;
+import org.wordpress.android.util.helpers.MediaFile;
import org.wordpress.android.ui.media.MediaGridFragment.Filter;
import org.wordpress.android.ui.posts.PostsListFragment;
import org.wordpress.android.util.AppLog;
@@ -655,7 +655,8 @@ public class ApiHelper {
}
for (Object result : results) {
resultMap = (Map<?, ?>) result;
- MediaFile mediaFile = new MediaFile(blogId, resultMap);
+ boolean isDotCom = (WordPress.getCurrentBlog() != null && WordPress.getCurrentBlog().isDotcomFlag());
+ MediaFile mediaFile = new MediaFile(blogId, resultMap, isDotCom);
WordPress.wpDB.saveMediaFile(mediaFile);
}
WordPress.wpDB.deleteFilesMarkedForDeleted(blogId);
@@ -797,8 +798,9 @@ public class ApiHelper {
}
if (results != null && blogId != null) {
- MediaFile mediaFile = new MediaFile(blogId, results);
- mediaFile.save();
+ boolean isDotCom = (WordPress.getCurrentBlog() != null && WordPress.getCurrentBlog().isDotcomFlag());
+ MediaFile mediaFile = new MediaFile(blogId, results, isDotCom);
+ WordPress.wpDB.saveMediaFile(mediaFile);
return mediaFile;
} else {
return null;
diff --git a/WordPress/src/main/java/org/xmlrpc/android/XMLRPCSerializer.java b/WordPress/src/main/java/org/xmlrpc/android/XMLRPCSerializer.java
index 8a8f42c05..5840ea118 100644
--- a/WordPress/src/main/java/org/xmlrpc/android/XMLRPCSerializer.java
+++ b/WordPress/src/main/java/org/xmlrpc/android/XMLRPCSerializer.java
@@ -4,7 +4,7 @@ import android.text.TextUtils;
import android.util.Base64;
import android.util.Xml;
-import org.wordpress.android.models.MediaFile;
+import org.wordpress.android.util.helpers.MediaFile;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.AppLog.T;
import org.wordpress.android.util.StringUtils;
diff --git a/WordPress/src/main/res/drawable-hdpi/ab_icon_edit.png b/WordPress/src/main/res/drawable-hdpi/ab_icon_edit.png
deleted file mode 100644
index 4b8f443e1..000000000
--- a/WordPress/src/main/res/drawable-hdpi/ab_icon_edit.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.png b/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.png
deleted file mode 100644
index 55fb8739a..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links_grey.png
deleted file mode 100644
index 5b66e714c..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.png
deleted file mode 100644
index 0ba4b95e8..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.png
deleted file mode 100644
index fc896135d..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png
deleted file mode 100644
index 444f735ab..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.png
deleted file mode 100644
index 32411efc7..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.png
deleted file mode 100644
index 48db52143..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.png
deleted file mode 100644
index eea6add02..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png
deleted file mode 100644
index 7cb2dcd30..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.png
deleted file mode 100644
index 90354d05d..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.png
deleted file mode 100644
index 7e14c49a5..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.png
deleted file mode 100644
index 978f97519..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.png
deleted file mode 100644
index a61883996..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.png b/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.png
deleted file mode 100644
index 7f7c5181e..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote_grey.png b/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote_grey.png
deleted file mode 100644
index 4dc307fc7..000000000
--- a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/media_movieclip.png b/WordPress/src/main/res/drawable-hdpi/media_movieclip.png
deleted file mode 100644
index bb49bcdc2..000000000
--- a/WordPress/src/main/res/drawable-hdpi/media_movieclip.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/noticon_picture.png b/WordPress/src/main/res/drawable-hdpi/noticon_picture.png
deleted file mode 100644
index 7900b9283..000000000
--- a/WordPress/src/main/res/drawable-hdpi/noticon_picture.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.png b/WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.png
deleted file mode 100644
index c4ca1c13c..000000000
--- a/WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.png b/WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.png
deleted file mode 100644
index 46d12a96d..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.png
deleted file mode 100644
index eef4505a5..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.png
deleted file mode 100644
index f545cd651..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.png
deleted file mode 100644
index 4519f6c04..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.png
deleted file mode 100644
index b85e41382..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png
deleted file mode 100644
index 61ae586af..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.png
deleted file mode 100644
index 912987466..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.png
deleted file mode 100644
index dbcea3513..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.png
deleted file mode 100644
index 6a776b669..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png
deleted file mode 100644
index 006acefc1..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.png
deleted file mode 100644
index c18266381..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.png
deleted file mode 100644
index c3c76dbc8..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.png
deleted file mode 100644
index f728bd9cf..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.png
deleted file mode 100644
index 95dbdd936..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.png
deleted file mode 100644
index 164881f53..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.png
deleted file mode 100644
index 797c88e8a..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/media_movieclip.png b/WordPress/src/main/res/drawable-xhdpi/media_movieclip.png
deleted file mode 100644
index d1dfae9ea..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/media_movieclip.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/noticon_picture.png b/WordPress/src/main/res/drawable-xhdpi/noticon_picture.png
deleted file mode 100644
index 95bffba31..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/noticon_picture.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.png b/WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.png
deleted file mode 100644
index d6aeb0e3d..000000000
--- a/WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.png b/WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.png
deleted file mode 100644
index 8c5d06a79..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.png
deleted file mode 100644
index 724dea05e..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.png
deleted file mode 100644
index a6746556a..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png
deleted file mode 100644
index 2fc4e42a1..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.png
deleted file mode 100644
index 0a48139a0..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png
deleted file mode 100644
index 05437d16b..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.png
deleted file mode 100644
index 91541b529..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png
deleted file mode 100644
index f1d118b74..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.png
deleted file mode 100644
index 3a684e978..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png
deleted file mode 100644
index 35d6579b5..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.png
deleted file mode 100644
index 2e9e30f5c..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png
deleted file mode 100644
index fb8558945..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.png
deleted file mode 100644
index 9f1b612d6..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.png
deleted file mode 100644
index 3a608ed32..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.png
deleted file mode 100644
index daa89ba17..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.png
deleted file mode 100644
index 240493fb3..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/media_movieclip.png b/WordPress/src/main/res/drawable-xxhdpi/media_movieclip.png
deleted file mode 100644
index 90e9b768a..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/media_movieclip.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture.png b/WordPress/src/main/res/drawable-xxhdpi/noticon_picture.png
deleted file mode 100644
index a132b6da3..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.png b/WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.png
deleted file mode 100644
index 7b8ff9608..000000000
--- a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.png
+++ /dev/null
Binary files differ
diff --git a/WordPress/src/main/res/drawable/format_bar_button_bold_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_bold_selected_state.xml
deleted file mode 100644
index b4a0ec1d1..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_bold_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_bold" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_bold_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_bold_selector.xml
deleted file mode 100644
index 905d41c18..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_bold_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_bold_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_bold_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_bold_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_italic_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_italic_selected_state.xml
deleted file mode 100644
index e1972c898..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_italic_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_italic" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_italic_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_italic_selector.xml
deleted file mode 100644
index 2b8cb68bc..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_italic_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_italic_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_italic_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_italic_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_link_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_link_selected_state.xml
deleted file mode 100644
index b542f5f11..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_link_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_admin_links" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_link_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_link_selector.xml
deleted file mode 100644
index 736f212f1..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_link_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_link_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_link_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_admin_links_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_media_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_media_selected_state.xml
deleted file mode 100644
index 35be1ca2b..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_media_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/noticon_picture" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_media_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_media_selector.xml
deleted file mode 100644
index 7c2f5bb64..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_media_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_media_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_media_selected_state"/>
- <item>
- <bitmap android:src="@drawable/noticon_picture_grey" android:gravity="center"/>
- </item>
-</selector>
diff --git a/WordPress/src/main/res/drawable/format_bar_button_more_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_more_selected_state.xml
deleted file mode 100644
index 7f7d8e7fa..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_more_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_insertmore" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_more_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_more_selector.xml
deleted file mode 100644
index 412de63a4..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_more_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_more_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_more_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_insertmore_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_quote_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_quote_selected_state.xml
deleted file mode 100644
index dcbd6a34e..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_quote_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_format_quote" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_quote_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_quote_selector.xml
deleted file mode 100644
index 4de783f1a..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_quote_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_quote_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_quote_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_format_quote_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_strike_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_strike_selected_state.xml
deleted file mode 100644
index 71c40164d..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_strike_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_strikethrough" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_strike_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_strike_selector.xml
deleted file mode 100644
index 9d00180ad..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_strike_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_strike_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_strike_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_strikethrough_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_underline_selected_state.xml b/WordPress/src/main/res/drawable/format_bar_button_underline_selected_state.xml
deleted file mode 100644
index 4a133790c..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_underline_selected_state.xml
+++ /dev/null
@@ -1,12 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<layer-list
- xmlns:android="http://schemas.android.com/apk/res/android">
- <item>
- <shape>
- <solid android:color="@color/blue_medium"/>
- </shape>
- </item>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_underline" android:gravity="center"/>
- </item>
-</layer-list> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/format_bar_button_underline_selector.xml b/WordPress/src/main/res/drawable/format_bar_button_underline_selector.xml
deleted file mode 100644
index 8f42668e2..000000000
--- a/WordPress/src/main/res/drawable/format_bar_button_underline_selector.xml
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<selector xmlns:android="http://schemas.android.com/apk/res/android" >
- <item android:state_checked="true" android:drawable="@drawable/format_bar_button_underline_selected_state"/>
- <item android:state_pressed="true" android:drawable="@drawable/format_bar_button_underline_selected_state"/>
- <item>
- <bitmap android:src="@drawable/dashicon_editor_underline_grey" android:gravity="center"/>
- </item>
-</selector> \ No newline at end of file
diff --git a/WordPress/src/main/res/drawable/pressed_background_wordpress.xml b/WordPress/src/main/res/drawable/pressed_background_wordpress.xml
deleted file mode 100644
index b0a98b087..000000000
--- a/WordPress/src/main/res/drawable/pressed_background_wordpress.xml
+++ /dev/null
@@ -1,22 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- File created by the Android Action Bar Style Generator
-
- Copyright (C) 2011 The Android Open Source Project
- Copyright (C) 2012 readyState Software Ltd
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
--->
-
-<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle">
- <solid android:color="@color/pressed_wordpress" />
-</shape>
diff --git a/WordPress/src/main/res/layout/alert_create_link.xml b/WordPress/src/main/res/layout/alert_create_link.xml
deleted file mode 100644
index 0d91e7369..000000000
--- a/WordPress/src/main/res/layout/alert_create_link.xml
+++ /dev/null
@@ -1,42 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<RelativeLayout
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:padding="@dimen/margin_medium"
- android:layout_gravity="center_vertical">
-
- <EditText
- android:id="@+id/linkURL"
- android:inputType="textUri"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:hint="@string/link_enter_url"
- android:imeOptions="actionNext" />
-
- <EditText
- android:id="@+id/linkText"
- android:inputType="text"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_below="@id/linkURL"
- android:hint="@string/link_enter_url_text" />
-
- <Button
- android:id="@+id/ok"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_below="@id/linkText"
- android:layout_alignParentRight="true"
- android:layout_marginLeft="@dimen/margin_medium"
- android:text="@string/ok" />
-
- <Button
- android:id="@+id/cancel"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:layout_alignTop="@id/ok"
- android:layout_toLeftOf="@id/ok"
- android:text="@string/cancel" />
-
-</RelativeLayout>
diff --git a/WordPress/src/main/res/layout/alert_image_options.xml b/WordPress/src/main/res/layout/alert_image_options.xml
deleted file mode 100644
index b2d4fdb9c..000000000
--- a/WordPress/src/main/res/layout/alert_image_options.xml
+++ /dev/null
@@ -1,81 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<ScrollView
- xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="match_parent"
- android:layout_height="match_parent">
-
- <LinearLayout
- android:orientation="vertical"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:padding="10dp"
- android:layout_gravity="center_horizontal"
- android:gravity="center_horizontal">
-
- <EditText
- android:id="@+id/title"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/title"
- android:singleLine="true"/>
-
- <EditText
- android:id="@+id/caption"
- android:layout_width="match_parent"
- android:layout_height="wrap_content"
- android:hint="@string/caption"
- android:singleLine="true"
- android:inputType="textCapSentences"/>
-
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/horizontal_alignment"
- android:textStyle="bold"
- android:textColor="@color/image_options_label"/>
-
- <Spinner
- android:id="@+id/alignment_spinner"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:prompt="@string/image_alignment"/>
-
- <TextView
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text="@string/width"
- android:textStyle="bold"
- android:textColor="@color/image_options_label"/>
-
- <SeekBar
- android:layout_height="wrap_content"
- android:id="@+id/imageWidth"
- android:layout_width="match_parent"/>
-
- <EditText
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:text=""
- android:imeOptions="actionDone"
- android:id="@+id/imageWidthText"
- android:layout_gravity="left|center_vertical"
- android:singleLine="true"
- android:inputType="number"/>
-
- <CheckBox
- android:layout_gravity="left"
- android:text="@string/featured"
- android:id="@+id/featuredImage"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="gone"/>
-
- <CheckBox
- android:layout_gravity="left"
- android:text="@string/featured_in_post"
- android:id="@+id/featuredInPost"
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:visibility="gone"/>
- </LinearLayout>
-</ScrollView> \ No newline at end of file
diff --git a/WordPress/src/main/res/layout/comment_list_fragment.xml b/WordPress/src/main/res/layout/comment_list_fragment.xml
index dfff5cc53..28e8b418d 100644
--- a/WordPress/src/main/res/layout/comment_list_fragment.xml
+++ b/WordPress/src/main/res/layout/comment_list_fragment.xml
@@ -4,7 +4,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -20,7 +20,7 @@
android:dividerHeight="1dp"
android:scrollingCache="true"
tools:listitem="@layout/comment_listitem" />
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
<org.wordpress.android.widgets.WPTextView
android:id="@+id/empty_view"
diff --git a/WordPress/src/main/res/layout/empty_listview.xml b/WordPress/src/main/res/layout/empty_listview.xml
index 38ec53056..26e0e5a24 100644
--- a/WordPress/src/main/res/layout/empty_listview.xml
+++ b/WordPress/src/main/res/layout/empty_listview.xml
@@ -6,7 +6,7 @@
android:layout_height="match_parent"
android:background="@color/background_grey">
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
@@ -28,5 +28,5 @@
android:layout_marginLeft="@dimen/empty_list_title_side_margin"
android:layout_marginRight="@dimen/empty_list_title_side_margin"
android:text="@string/empty_list_default" />
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
</LinearLayout>
diff --git a/WordPress/src/main/res/layout/fragment_edit_post_content.xml b/WordPress/src/main/res/layout/fragment_edit_post_content.xml
index 41b30d2a8..2b5c04cdb 100644
--- a/WordPress/src/main/res/layout/fragment_edit_post_content.xml
+++ b/WordPress/src/main/res/layout/fragment_edit_post_content.xml
@@ -30,7 +30,7 @@
android:hint="@string/title"
android:inputType="textCapSentences|textAutoCorrect" />
- <org.wordpress.android.widgets.WPEditText
+ <org.wordpress.android.util.widgets.WPEditText
android:id="@+id/post_content"
android:layout_width="fill_parent"
android:layout_height="0dp"
@@ -97,35 +97,35 @@
<ToggleButton
android:id="@+id/bold"
- style="@style/WordPress.ToggleButton"
+ style="@style/ToggleButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="@drawable/format_bar_button_bold_selector" />
<ToggleButton
android:id="@+id/em"
- style="@style/WordPress.ToggleButton"
+ style="@style/ToggleButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="@drawable/format_bar_button_italic_selector" />
<ToggleButton
android:id="@+id/underline"
- style="@style/WordPress.ToggleButton"
+ style="@style/ToggleButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="@drawable/format_bar_button_underline_selector" />
<ToggleButton
android:id="@+id/strike"
- style="@style/WordPress.ToggleButton"
+ style="@style/ToggleButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="@drawable/format_bar_button_strike_selector" />
<ToggleButton
android:id="@+id/bquote"
- style="@style/WordPress.ToggleButton"
+ style="@style/ToggleButton"
android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:background="@drawable/format_bar_button_quote_selector" />
@@ -154,4 +154,4 @@
android:background="@drawable/format_bar_button_media_selector" />
</LinearLayout>
-</LinearLayout> \ No newline at end of file
+</LinearLayout>
diff --git a/WordPress/src/main/res/layout/media_grid_fragment.xml b/WordPress/src/main/res/layout/media_grid_fragment.xml
index 75068743d..34b57a4d8 100644
--- a/WordPress/src/main/res/layout/media_grid_fragment.xml
+++ b/WordPress/src/main/res/layout/media_grid_fragment.xml
@@ -31,7 +31,7 @@
android:padding="8dp"
android:visibility="gone" />
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -49,7 +49,7 @@
android:scrollbarStyle="outsideOverlay"
android:stretchMode="columnWidth"
android:verticalSpacing="@dimen/margin_small" />
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
<LinearLayout
android:id="@+id/empty_view"
diff --git a/WordPress/src/main/res/layout/notifications_fragment_notes_list.xml b/WordPress/src/main/res/layout/notifications_fragment_notes_list.xml
index dc56668eb..9afc21103 100644
--- a/WordPress/src/main/res/layout/notifications_fragment_notes_list.xml
+++ b/WordPress/src/main/res/layout/notifications_fragment_notes_list.xml
@@ -5,7 +5,7 @@
android:layout_height="match_parent"
android:orientation="vertical">
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -16,7 +16,7 @@
android:layout_height="fill_parent"
android:scrollbars="vertical" />
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
<org.wordpress.android.widgets.WPTextView
android:id="@+id/empty_view"
diff --git a/WordPress/src/main/res/layout/post_listview.xml b/WordPress/src/main/res/layout/post_listview.xml
index 0f56d2827..64da1daf3 100644
--- a/WordPress/src/main/res/layout/post_listview.xml
+++ b/WordPress/src/main/res/layout/post_listview.xml
@@ -49,7 +49,7 @@
android:layout_width="match_parent"
android:layout_height="match_parent">
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -60,7 +60,7 @@
android:layout_height="match_parent"
android:drawSelectorOnTop="false"
tools:listitem="@layout/post_list_row" />
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
<org.wordpress.android.widgets.FloatingActionButton
android:id="@+id/fab_button"
diff --git a/WordPress/src/main/res/layout/reader_fragment_post_cards.xml b/WordPress/src/main/res/layout/reader_fragment_post_cards.xml
index 97a87591c..eefef863e 100644
--- a/WordPress/src/main/res/layout/reader_fragment_post_cards.xml
+++ b/WordPress/src/main/res/layout/reader_fragment_post_cards.xml
@@ -11,7 +11,7 @@
android:layout_height="wrap_content"
android:visibility="gone" />
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent"
@@ -23,7 +23,7 @@
android:layout_height="match_parent"
android:scrollbars="vertical" />
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
<include
android:id="@+id/empty_view"
diff --git a/WordPress/src/main/res/layout/select_categories.xml b/WordPress/src/main/res/layout/select_categories.xml
index cae41f53d..37721b32a 100644
--- a/WordPress/src/main/res/layout/select_categories.xml
+++ b/WordPress/src/main/res/layout/select_categories.xml
@@ -6,7 +6,7 @@
android:padding="0px"
android:orientation="vertical">
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
@@ -22,5 +22,5 @@
android:cacheColorHint="#00000000">
</ListView>
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
</LinearLayout>
diff --git a/WordPress/src/main/res/layout/stats_activity.xml b/WordPress/src/main/res/layout/stats_activity.xml
index fe233e94f..03b65d046 100644
--- a/WordPress/src/main/res/layout/stats_activity.xml
+++ b/WordPress/src/main/res/layout/stats_activity.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+<org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
@@ -164,4 +164,4 @@
</LinearLayout>
</org.wordpress.android.ui.stats.ScrollViewExt>
-</org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+</org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
diff --git a/WordPress/src/main/res/layout/stats_activity_single_post_details.xml b/WordPress/src/main/res/layout/stats_activity_single_post_details.xml
index adff46e9a..9d2719ff8 100644
--- a/WordPress/src/main/res/layout/stats_activity_single_post_details.xml
+++ b/WordPress/src/main/res/layout/stats_activity_single_post_details.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<org.wordpress.android.util.ptr.CustomSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
+<org.wordpress.android.util.widgets.CustomSwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -249,4 +249,4 @@
</LinearLayout>
</org.wordpress.android.ui.stats.ScrollViewExt>
-</org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+</org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
diff --git a/WordPress/src/main/res/layout/stats_activity_view_all.xml b/WordPress/src/main/res/layout/stats_activity_view_all.xml
index 9389cb7a3..ad76a0930 100644
--- a/WordPress/src/main/res/layout/stats_activity_view_all.xml
+++ b/WordPress/src/main/res/layout/stats_activity_view_all.xml
@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?>
-<org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+<org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
@@ -39,4 +39,4 @@
</LinearLayout>
</org.wordpress.android.ui.stats.ScrollViewExt>
-</org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+</org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
diff --git a/WordPress/src/main/res/layout/theme_tab_fragment.xml b/WordPress/src/main/res/layout/theme_tab_fragment.xml
index d5ba2dd65..06f2055e0 100644
--- a/WordPress/src/main/res/layout/theme_tab_fragment.xml
+++ b/WordPress/src/main/res/layout/theme_tab_fragment.xml
@@ -13,7 +13,7 @@
android:visibility="gone"
android:layout_margin="16dp"/>
- <org.wordpress.android.util.ptr.CustomSwipeRefreshLayout
+ <org.wordpress.android.util.widgets.CustomSwipeRefreshLayout
android:id="@+id/ptr_layout"
android:layout_width="match_parent"
android:layout_height="match_parent">
@@ -31,7 +31,7 @@
android:stretchMode="columnWidth"
android:layout_below="@id/theme_no_search_result_text">
</GridView>
- </org.wordpress.android.util.ptr.CustomSwipeRefreshLayout>
+ </org.wordpress.android.util.widgets.CustomSwipeRefreshLayout>
<org.wordpress.android.widgets.WPTextView
android:id="@+id/text_empty"
diff --git a/WordPress/src/main/res/values/colors.xml b/WordPress/src/main/res/values/colors.xml
index 2c932a7cb..c2dba7b51 100644
--- a/WordPress/src/main/res/values/colors.xml
+++ b/WordPress/src/main/res/values/colors.xml
@@ -134,8 +134,11 @@
<color name="nux_eye_icon_color_open">@color/grey_lighten_10</color>
<!-- Editor -->
- <color name="image_options_label">@color/grey_lighten_20</color>
<color name="post_detail_icon_tint">@color/grey_darken_20</color>
+ <color name="format_bar_button_selected">@color/blue_medium</color>
+ <color name="placeholder_content_text">@color/blue_wordpress</color>
+ <color name="format_bar_background">@color/grey_lighten_30</color>
+ <color name="image_options_label">@color/grey_lighten_20</color>
<!-- Misc -->
<color name="pressed_wordpress">@color/semi_transparent_blue_light</color>
diff --git a/WordPress/src/main/res/values/styles.xml b/WordPress/src/main/res/values/styles.xml
index fe00f852e..483346460 100644
--- a/WordPress/src/main/res/values/styles.xml
+++ b/WordPress/src/main/res/values/styles.xml
@@ -106,13 +106,6 @@
<item name="android:layout_marginBottom">-4dp</item>
</style>
- <style name="WordPress.ToggleButton">
- <item name="android:minWidth">@dimen/format_bar_height</item>
- <item name="android:minHeight">@dimen/format_bar_height</item>
- <item name="android:textOn">""</item>
- <item name="android:textOff">""</item>
- </style>
-
<style name="WordPressTitleAppearance" parent="@android:style/TextAppearance">
<item name="android:singleLine">true</item>
<item name="android:shadowColor">#BB000000</item>