aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java266
1 files changed, 266 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java
new file mode 100644
index 000000000..edb4ef953
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java
@@ -0,0 +1,266 @@
+package org.wordpress.android.ui.stats;
+
+import android.content.Context;
+import android.os.Bundle;
+import android.text.TextUtils;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.BaseExpandableListAdapter;
+
+import org.wordpress.android.R;
+import org.wordpress.android.ui.stats.models.ClickGroupModel;
+import org.wordpress.android.ui.stats.models.ClicksModel;
+import org.wordpress.android.ui.stats.models.SingleItemModel;
+import org.wordpress.android.ui.stats.service.StatsService;
+import org.wordpress.android.util.FormatUtils;
+import org.wordpress.android.util.GravatarUtils;
+import org.wordpress.android.widgets.WPNetworkImageView;
+
+import java.util.List;
+
+public class StatsClicksFragment extends StatsAbstractListFragment {
+ public static final String TAG = StatsClicksFragment.class.getSimpleName();
+
+ private ClicksModel mClicks;
+
+ @Override
+ protected boolean hasDataAvailable() {
+ return mClicks != null;
+ }
+ @Override
+ protected void saveStatsData(Bundle outState) {
+ if (hasDataAvailable()) {
+ outState.putSerializable(ARG_REST_RESPONSE, mClicks);
+ }
+ }
+ @Override
+ protected void restoreStatsData(Bundle savedInstanceState) {
+ if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) {
+ mClicks = (ClicksModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE);
+ }
+ }
+
+ @SuppressWarnings("unused")
+ public void onEventMainThread(StatsEvents.ClicksUpdated event) {
+ if (!shouldUpdateFragmentOnUpdateEvent(event)) {
+ return;
+ }
+
+ mGroupIdToExpandedMap.clear();
+ mClicks = event.mClicks;
+
+ updateUI();
+ }
+
+ @SuppressWarnings("unused")
+ public void onEventMainThread(StatsEvents.SectionUpdateError event) {
+ if (!shouldUpdateFragmentOnErrorEvent(event)) {
+ return;
+ }
+
+ mClicks = null;
+ mGroupIdToExpandedMap.clear();
+ showErrorUI(event.mError);
+ }
+
+ @Override
+ protected void updateUI() {
+ if (!isAdded()) {
+ return;
+ }
+
+ if (hasClicks()) {
+ BaseExpandableListAdapter adapter = new MyExpandableListAdapter(getActivity(), mClicks.getClickGroups());
+ StatsUIHelper.reloadGroupViews(getActivity(), adapter, mGroupIdToExpandedMap, mList, getMaxNumberOfItemsToShowInList());
+ showHideNoResultsUI(false);
+ } else {
+ showHideNoResultsUI(true);
+ }
+ }
+
+ private boolean hasClicks() {
+ return mClicks != null
+ && mClicks.getClickGroups() != null
+ && mClicks.getClickGroups().size() > 0;
+ }
+
+ @Override
+ protected boolean isViewAllOptionAvailable() {
+ return (hasClicks() && mClicks.getClickGroups().size() > MAX_NUM_OF_ITEMS_DISPLAYED_IN_LIST);
+ }
+
+ @Override
+ protected boolean isExpandableList() {
+ return true;
+ }
+
+ @Override
+ protected StatsService.StatsEndpointsEnum[] sectionsToUpdate() {
+ return new StatsService.StatsEndpointsEnum[]{
+ StatsService.StatsEndpointsEnum.CLICKS
+ };
+ }
+
+ @Override
+ protected int getEntryLabelResId() {
+ return R.string.stats_entry_clicks_link;
+ }
+ @Override
+ protected int getTotalsLabelResId() {
+ return R.string.stats_totals_clicks;
+ }
+ @Override
+ protected int getEmptyLabelTitleResId() {
+ return R.string.stats_empty_clicks_title;
+ }
+ @Override
+ protected int getEmptyLabelDescResId() {
+ return R.string.stats_empty_clicks_desc;
+ }
+
+ private class MyExpandableListAdapter extends BaseExpandableListAdapter {
+ public final LayoutInflater inflater;
+ private final List<ClickGroupModel> clickGroups;
+
+ public MyExpandableListAdapter(Context context, List<ClickGroupModel> clickGroups) {
+ this.clickGroups = clickGroups;
+ this.inflater = LayoutInflater.from(context);
+ }
+
+ @Override
+ public Object getChild(int groupPosition, int childPosition) {
+ ClickGroupModel currentGroup = clickGroups.get(groupPosition);
+ List<SingleItemModel> results = currentGroup.getClicks();
+ return results.get(childPosition);
+ }
+
+ @Override
+ public long getChildId(int groupPosition, int childPosition) {
+ return 0;
+ }
+
+ @Override
+ public View getChildView(int groupPosition, final int childPosition,
+ boolean isLastChild, View convertView, ViewGroup parent) {
+
+ final SingleItemModel children = (SingleItemModel) getChild(groupPosition, childPosition);
+
+ if (convertView == null) {
+ convertView = inflater.inflate(R.layout.stats_list_cell, parent, false);
+ // configure view holder
+ StatsViewHolder viewHolder = new StatsViewHolder(convertView);
+ convertView.setTag(viewHolder);
+ }
+
+ final StatsViewHolder holder = (StatsViewHolder) convertView.getTag();
+
+ // The link icon
+ holder.showLinkIcon();
+
+ // name, url
+ holder.setEntryTextOrLink(children.getUrl(), children.getTitle());
+
+ // totals
+ holder.totalsTextView.setText(FormatUtils.formatDecimal(
+ children.getTotals()
+ ));
+
+ // no icon
+ holder.networkImageView.setVisibility(View.GONE);
+
+ return convertView;
+ }
+
+ @Override
+ public int getChildrenCount(int groupPosition) {
+ ClickGroupModel currentGroup = clickGroups.get(groupPosition);
+ List<SingleItemModel> clicks = currentGroup.getClicks();
+ if (clicks == null) {
+ return 0;
+ } else {
+ return clicks.size();
+ }
+ }
+
+ @Override
+ public Object getGroup(int groupPosition) {
+ return clickGroups.get(groupPosition);
+ }
+
+ @Override
+ public int getGroupCount() {
+ return clickGroups.size();
+ }
+
+
+ @Override
+ public long getGroupId(int groupPosition) {
+ return 0;
+ }
+
+ @Override
+ public View getGroupView(int groupPosition, boolean isExpanded,
+ View convertView, ViewGroup parent) {
+
+ final StatsViewHolder holder;
+ if (convertView == null) {
+ convertView = inflater.inflate(R.layout.stats_list_cell, parent, false);
+ holder = new StatsViewHolder(convertView);
+ convertView.setTag(holder);
+ } else {
+ holder = (StatsViewHolder) convertView.getTag();
+ }
+
+ ClickGroupModel group = (ClickGroupModel) getGroup(groupPosition);
+
+ String name = group.getName();
+ int total = group.getViews();
+ String url = group.getUrl();
+ String icon = group.getIcon();
+ int children = getChildrenCount(groupPosition);
+
+ if (children > 0) {
+ holder.setEntryText(name, getResources().getColor(R.color.stats_link_text_color));
+ } else {
+ holder.setEntryTextOrLink(url, name);
+ }
+
+ // totals
+ holder.totalsTextView.setText(FormatUtils.formatDecimal(total));
+
+ // Site icon
+ holder.networkImageView.setVisibility(View.GONE);
+ if (!TextUtils.isEmpty(icon)) {
+ holder.networkImageView.setImageUrl(
+ GravatarUtils.fixGravatarUrl(icon, mResourceVars.headerAvatarSizePx),
+ WPNetworkImageView.ImageType.GONE_UNTIL_AVAILABLE
+ );
+ }
+
+ if (children == 0) {
+ holder.showLinkIcon();
+ } else {
+ holder.showChevronIcon();
+ }
+
+ return convertView;
+ }
+
+ @Override
+ public boolean hasStableIds() {
+ return false;
+ }
+
+ @Override
+ public boolean isChildSelectable(int groupPosition, int childPosition) {
+ return false;
+ }
+
+ }
+
+ @Override
+ public String getTitle() {
+ return getString(R.string.stats_view_clicks);
+ }
+}