diff options
Diffstat (limited to 'WordPress')
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 Binary files differdeleted file mode 100644 index 4b8f443e1..000000000 --- a/WordPress/src/main/res/drawable-hdpi/ab_icon_edit.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.png b/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.png Binary files differdeleted file mode 100644 index 55fb8739a..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 5b66e714c..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_admin_links_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.png Binary files differdeleted file mode 100644 index 0ba4b95e8..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index fc896135d..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_bold_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png Binary files differdeleted file mode 100644 index 444f735ab..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 32411efc7..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_insertmore_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.png Binary files differdeleted file mode 100644 index 48db52143..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index eea6add02..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_italic_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png Binary files differdeleted file mode 100644 index 7cb2dcd30..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 90354d05d..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_strikethrough_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.png b/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.png Binary files differdeleted file mode 100644 index 7e14c49a5..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 978f97519..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_editor_underline_grey.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index a61883996..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_format_image_big_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.png b/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.png Binary files differdeleted file mode 100644 index 7f7c5181e..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 4dc307fc7..000000000 --- a/WordPress/src/main/res/drawable-hdpi/dashicon_format_quote_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/media_movieclip.png b/WordPress/src/main/res/drawable-hdpi/media_movieclip.png Binary files differdeleted file mode 100644 index bb49bcdc2..000000000 --- a/WordPress/src/main/res/drawable-hdpi/media_movieclip.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/noticon_picture.png b/WordPress/src/main/res/drawable-hdpi/noticon_picture.png Binary files differdeleted file mode 100644 index 7900b9283..000000000 --- a/WordPress/src/main/res/drawable-hdpi/noticon_picture.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.png b/WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.png Binary files differdeleted file mode 100644 index c4ca1c13c..000000000 --- a/WordPress/src/main/res/drawable-hdpi/noticon_picture_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.png b/WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.png Binary files differdeleted file mode 100644 index 46d12a96d..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/ab_icon_edit.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.png Binary files differdeleted file mode 100644 index eef4505a5..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index f545cd651..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_admin_links_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.png Binary files differdeleted file mode 100644 index 4519f6c04..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index b85e41382..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_bold_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png Binary files differdeleted file mode 100644 index 61ae586af..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 912987466..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_insertmore_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.png Binary files differdeleted file mode 100644 index dbcea3513..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 6a776b669..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_italic_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png Binary files differdeleted file mode 100644 index 006acefc1..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index c18266381..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_strikethrough_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.png Binary files differdeleted file mode 100644 index c3c76dbc8..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index f728bd9cf..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_editor_underline_grey.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 95dbdd936..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_image_big_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.png b/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.png Binary files differdeleted file mode 100644 index 164881f53..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 797c88e8a..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/dashicon_format_quote_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/media_movieclip.png b/WordPress/src/main/res/drawable-xhdpi/media_movieclip.png Binary files differdeleted file mode 100644 index d1dfae9ea..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/media_movieclip.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/noticon_picture.png b/WordPress/src/main/res/drawable-xhdpi/noticon_picture.png Binary files differdeleted file mode 100644 index 95bffba31..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/noticon_picture.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.png b/WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.png Binary files differdeleted file mode 100644 index d6aeb0e3d..000000000 --- a/WordPress/src/main/res/drawable-xhdpi/noticon_picture_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.png b/WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.png Binary files differdeleted file mode 100644 index 8c5d06a79..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/ab_icon_edit.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.png Binary files differdeleted file mode 100644 index 724dea05e..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index a6746556a..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_admin_links_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png Binary files differdeleted file mode 100644 index 2fc4e42a1..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 0a48139a0..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_bold_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png Binary files differdeleted file mode 100644 index 05437d16b..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 91541b529..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_insertmore_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png Binary files differdeleted file mode 100644 index f1d118b74..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 3a684e978..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_italic_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png Binary files differdeleted file mode 100644 index 35d6579b5..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 2e9e30f5c..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_strikethrough_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png Binary files differdeleted file mode 100644 index fb8558945..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 9f1b612d6..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_editor_underline_grey.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 3a608ed32..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_image_big_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.png b/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.png Binary files differdeleted file mode 100644 index daa89ba17..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote.png +++ /dev/null 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 Binary files differdeleted file mode 100644 index 240493fb3..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/dashicon_format_quote_grey.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/media_movieclip.png b/WordPress/src/main/res/drawable-xxhdpi/media_movieclip.png Binary files differdeleted file mode 100644 index 90e9b768a..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/media_movieclip.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture.png b/WordPress/src/main/res/drawable-xxhdpi/noticon_picture.png Binary files differdeleted file mode 100644 index a132b6da3..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture.png +++ /dev/null diff --git a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.png b/WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.png Binary files differdeleted file mode 100644 index 7b8ff9608..000000000 --- a/WordPress/src/main/res/drawable-xxhdpi/noticon_picture_grey.png +++ /dev/null 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> |