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); } }