diff options
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java | 280 |
1 files changed, 280 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java new file mode 100644 index 000000000..c65b2053c --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java @@ -0,0 +1,280 @@ +package org.wordpress.android.ui.stats; + +import android.graphics.drawable.Drawable; +import android.os.Bundle; +import android.text.Spannable; +import android.text.SpannableString; +import android.text.TextUtils; +import android.text.style.ForegroundColorSpan; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.TextView; + +import org.apache.commons.lang.StringEscapeUtils; +import org.wordpress.android.R; +import org.wordpress.android.ui.ActivityLauncher; +import org.wordpress.android.ui.stats.models.InsightsLatestPostDetailsModel; +import org.wordpress.android.ui.stats.models.InsightsLatestPostModel; +import org.wordpress.android.ui.stats.models.PostModel; +import org.wordpress.android.ui.stats.service.StatsService; +import org.wordpress.android.util.FormatUtils; + +public class StatsInsightsLatestPostSummaryFragment extends StatsAbstractInsightsFragment { + public static final String TAG = StatsInsightsLatestPostSummaryFragment.class.getSimpleName(); + + private static final String ARG_REST_RESPONSE_DETAILS = "ARG_REST_RESPONSE_DETAILS"; + + private InsightsLatestPostModel mInsightsLatestPostModel; + private InsightsLatestPostDetailsModel mInsightsLatestPostDetailsModel; + + @Override + protected boolean hasDataAvailable() { + return mInsightsLatestPostModel != null && mInsightsLatestPostDetailsModel != null; + } + @Override + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { + outState.putSerializable(ARG_REST_RESPONSE, mInsightsLatestPostModel); + outState.putSerializable(ARG_REST_RESPONSE_DETAILS, mInsightsLatestPostDetailsModel); + } + } + @Override + protected void restoreStatsData(Bundle savedInstanceState) { + if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { + mInsightsLatestPostModel = (InsightsLatestPostModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); + } + if (savedInstanceState.containsKey(ARG_REST_RESPONSE_DETAILS)) { + mInsightsLatestPostDetailsModel = (InsightsLatestPostDetailsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE_DETAILS); + } + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.InsightsLatestPostSummaryUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { + return; + } + + if (event.mInsightsLatestPostModel == null) { + showErrorUI(); + return; + } + + mInsightsLatestPostModel = event.mInsightsLatestPostModel; + + // check if there is a post "published" on the blog + View mainView = getView(); + if (mainView != null) { + mainView.setVisibility(mInsightsLatestPostModel.isLatestPostAvailable() ? View.VISIBLE : View.GONE); + } + if (!mInsightsLatestPostModel.isLatestPostAvailable()) { + // No need to go further into UI updating. There are no posts on this blog and the + // entire fragment is hidden. + return; + } + + // Check if we already have the number of "views" for the latest post + if (mInsightsLatestPostModel.getPostViewsCount() == Integer.MIN_VALUE) { + // we don't have the views count. Need to call the service again here + refreshStats(mInsightsLatestPostModel.getPostID(), + new StatsService.StatsEndpointsEnum[]{StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS}); + showPlaceholderUI(); + } else { + updateUI(); + } + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.InsightsLatestPostDetailsUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { + return; + } + + if (mInsightsLatestPostModel == null || event.mInsightsLatestPostDetailsModel == null) { + showErrorUI(); + return; + } + + mInsightsLatestPostDetailsModel = event.mInsightsLatestPostDetailsModel; + mInsightsLatestPostModel.setPostViewsCount(mInsightsLatestPostDetailsModel.getPostViewsCount()); + updateUI(); + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.SectionUpdateError event) { + + if (!shouldUpdateFragmentOnErrorEvent(event) + && event.mEndPointName != StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS ) { + return; + } + + mInsightsLatestPostDetailsModel = null; + mInsightsLatestPostModel = null; + showErrorUI(event.mError); + } + + protected void updateUI() { + super.updateUI(); + + if (!isAdded() || !hasDataAvailable()) { + return; + } + + // check if there are posts "published" on the blog + if (!mInsightsLatestPostModel.isLatestPostAvailable()) { + // No need to go further into UI updating. There are no posts on this blog and the + // entire fragment is hidden. + return; + } + + TextView moduleTitle = (TextView) getView().findViewById(R.id.stats_module_title); + moduleTitle.setOnClickListener(ViewsTabOnClickListener); + moduleTitle.setTextColor(getResources().getColor(R.color.stats_link_text_color)); + + // update the tabs and the text now + LinearLayout ll = (LinearLayout) getActivity().getLayoutInflater() + .inflate(R.layout.stats_insights_latest_post_item, (ViewGroup) mResultContainer.getRootView(), false); + + String trendLabel = getString(R.string.stats_insights_latest_post_trend); + String sinceLabel = StatsUtils.getSinceLabel( + getActivity(), + mInsightsLatestPostModel.getPostDate() + ).toLowerCase(); + + String postTitle = StringEscapeUtils.unescapeHtml(mInsightsLatestPostModel.getPostTitle()); + if (TextUtils.isEmpty(postTitle)) { + postTitle = getString(R.string.stats_insights_latest_post_no_title); + } + + final String trendLabelFormatted = String.format( + trendLabel, sinceLabel, postTitle); + + int startIndex, endIndex; + startIndex = trendLabelFormatted.indexOf(postTitle); + endIndex = startIndex + postTitle.length() +1; + + Spannable descriptionTextToSpan = new SpannableString(trendLabelFormatted); + descriptionTextToSpan.setSpan(new ForegroundColorSpan(getResources().getColor(R.color.stats_link_text_color)), + startIndex, endIndex, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE); + TextView trendLabelTextField = (TextView) ll.findViewById(R.id.stats_post_trend_label); + trendLabelTextField.setText(descriptionTextToSpan); + trendLabelTextField.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + StatsUtils.openPostInReaderOrInAppWebview(getActivity(), + mInsightsLatestPostModel.getBlogID(), + String.valueOf(mInsightsLatestPostModel.getPostID()), + StatsConstants.ITEM_TYPE_POST, + mInsightsLatestPostModel.getPostURL()); + } + }); + + LinearLayout tabs = (LinearLayout) ll.findViewById(R.id.stats_latest_post_tabs); + + for (int i = 0; i < tabs.getChildCount(); i++) { + LinearLayout currentTab = (LinearLayout) tabs.getChildAt(i); + switch (i) { + case 0: + setupTab(currentTab, FormatUtils.formatDecimal(mInsightsLatestPostModel.getPostViewsCount()), StatsVisitorsAndViewsFragment.OverviewLabel.VIEWS); + break; + case 1: + setupTab(currentTab, FormatUtils.formatDecimal(mInsightsLatestPostModel.getPostLikeCount()), StatsVisitorsAndViewsFragment.OverviewLabel.LIKES); + break; + case 2: + setupTab(currentTab, FormatUtils.formatDecimal(mInsightsLatestPostModel.getPostCommentCount()), StatsVisitorsAndViewsFragment.OverviewLabel.COMMENTS); + break; + } + } + + mResultContainer.addView(ll); + } + + private void setupTab(LinearLayout currentTab, String total, final StatsVisitorsAndViewsFragment.OverviewLabel itemType) { + final TextView label; + final TextView value; + final ImageView icon; + + currentTab.setTag(itemType); + // Only Views is clickable here + if (itemType == StatsVisitorsAndViewsFragment.OverviewLabel.VIEWS) { + currentTab.setOnClickListener(ViewsTabOnClickListener); + } else { + currentTab.setClickable(false); + } + + label = (TextView) currentTab.findViewById(R.id.stats_visitors_and_views_tab_label); + label.setText(itemType.getLabel()); + value = (TextView) currentTab.findViewById(R.id.stats_visitors_and_views_tab_value); + value.setText(total); + if (total.equals("0")) { + value.setTextColor(getResources().getColor(R.color.grey)); + } else { + // Only Views is clickable here. + // Likes and Comments shouldn't link anywhere because they don't have summaries + // so their color should be Gray Darken 30 or #3d596d + if (itemType == StatsVisitorsAndViewsFragment.OverviewLabel.VIEWS) { + value.setTextColor(getResources().getColor(R.color.blue_wordpress)); + } else { + value.setTextColor(getResources().getColor(R.color.grey_darken_30)); + } + } + icon = (ImageView) currentTab.findViewById(R.id.stats_visitors_and_views_tab_icon); + icon.setImageDrawable(getTabIcon(itemType)); + + if (itemType == StatsVisitorsAndViewsFragment.OverviewLabel.COMMENTS) { + currentTab.setBackgroundResource(R.drawable.stats_visitors_and_views_button_latest_white); + } else { + currentTab.setBackgroundResource(R.drawable.stats_visitors_and_views_button_white); + } + } + + private final View.OnClickListener ViewsTabOnClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + if (!isAdded()) { + return; + } + + // Another check that the data is available + if (mInsightsLatestPostModel == null) { + showErrorUI(); + return; + } + + PostModel postModel = new PostModel( + mInsightsLatestPostModel.getBlogID(), + String.valueOf(mInsightsLatestPostModel.getPostID()), + mInsightsLatestPostModel.getPostTitle(), + mInsightsLatestPostModel.getPostURL(), + StatsConstants.ITEM_TYPE_POST); + ActivityLauncher.viewStatsSinglePostDetails(getActivity(), postModel); + } + }; + + private Drawable getTabIcon(final StatsVisitorsAndViewsFragment.OverviewLabel labelItem) { + switch (labelItem) { + case VISITORS: + return getResources().getDrawable(R.drawable.stats_icon_visitors); + case COMMENTS: + return getResources().getDrawable(R.drawable.stats_icon_comments); + case LIKES: + return getResources().getDrawable(R.drawable.stats_icon_likes); + default: + // Views and when no prev match + return getResources().getDrawable(R.drawable.stats_icon_views); + } + } + + @Override + protected StatsService.StatsEndpointsEnum[] sectionsToUpdate() { + return new StatsService.StatsEndpointsEnum[]{ + StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_SUMMARY, + }; + } + + @Override + public String getTitle() { + return getString(R.string.stats_insights_latest_post_summary); + } +}
\ No newline at end of file |