blob: d78e1f4c44c89f1aa1d623efa5a598016bcf9ca8 [file] [log] [blame]
package org.wordpress.android.ui.stats;
import android.content.Intent;
import android.os.Bundle;
import android.text.Html;
import android.text.TextUtils;
import android.util.SparseBooleanArray;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.CheckedTextView;
import android.widget.LinearLayout;
import android.widget.RadioGroup;
import android.widget.TextView;
import org.wordpress.android.R;
import org.wordpress.android.util.DisplayUtils;
import org.wordpress.android.widgets.TypefaceCache;
public abstract class StatsAbstractListFragment extends StatsAbstractFragment {
// Used when the fragment has 2 pages/kind of stats in it. Not meaning the bottom pagination.
static final String ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX = "ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX";
private static final String ARGS_EXPANDED_ROWS = "ARGS_EXPANDED_ROWS";
private static final int MAX_NUM_OF_ITEMS_DISPLAYED_IN_SINGLE_VIEW_LIST = 1000;
static final int MAX_NUM_OF_ITEMS_DISPLAYED_IN_LIST = 10;
private static final int NO_STRING_ID = -1;
private TextView mModuleTitleTextView;
private TextView mEmptyLabel;
TextView mTotalsLabel;
private LinearLayout mListContainer;
LinearLayout mList;
private Button mViewAll;
LinearLayout mTopPagerContainer;
int mTopPagerSelectedButtonIndex = 0;
// Bottom and Top Pagination for modules that has pagination enabled.
LinearLayout mBottomPaginationContainer;
Button mBottomPaginationGoBackButton;
Button mBottomPaginationGoForwardButton;
TextView mBottomPaginationText;
LinearLayout mTopPaginationContainer;
Button mTopPaginationGoBackButton;
Button mTopPaginationGoForwardButton;
TextView mTopPaginationText;
private LinearLayout mEmptyModulePlaceholder;
SparseBooleanArray mGroupIdToExpandedMap;
protected abstract int getEntryLabelResId();
protected abstract int getTotalsLabelResId();
protected abstract int getEmptyLabelTitleResId();
protected abstract int getEmptyLabelDescResId();
protected abstract boolean isExpandableList();
protected abstract boolean isViewAllOptionAvailable();
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view;
if (isExpandableList()) {
view = inflater.inflate(R.layout.stats_expandable_list_fragment, container, false);
} else {
view = inflater.inflate(R.layout.stats_list_fragment, container, false);
}
mEmptyModulePlaceholder = (LinearLayout) view.findViewById(R.id.stats_empty_module_placeholder);
mModuleTitleTextView = (TextView) view.findViewById(R.id.stats_module_title);
mModuleTitleTextView.setText(getTitle());
TextView entryLabel = (TextView) view.findViewById(R.id.stats_list_entry_label);
entryLabel.setText(getEntryLabelResId());
TextView totalsLabel = (TextView) view.findViewById(R.id.stats_list_totals_label);
totalsLabel.setText(getTotalsLabelResId());
mEmptyLabel = (TextView) view.findViewById(R.id.stats_list_empty_text);
mTotalsLabel = (TextView) view.findViewById(R.id.stats_module_totals_label);
mList = (LinearLayout) view.findViewById(R.id.stats_list_linearlayout);
mListContainer = (LinearLayout) view.findViewById(R.id.stats_list_container);
mViewAll = (Button) view.findViewById(R.id.btnViewAll);
mTopPagerContainer = (LinearLayout) view.findViewById(R.id.stats_pager_tabs);
// Load pagination items
mBottomPaginationContainer = (LinearLayout) view.findViewById(R.id.stats_bottom_pagination_container);
mBottomPaginationGoBackButton = (Button) mBottomPaginationContainer.findViewById(R.id.stats_pagination_go_back);
mBottomPaginationGoForwardButton = (Button) mBottomPaginationContainer.findViewById(R.id.stats_pagination_go_forward);
mBottomPaginationText = (TextView) mBottomPaginationContainer.findViewById(R.id.stats_pagination_text);
mTopPaginationContainer = (LinearLayout) view.findViewById(R.id.stats_top_pagination_container);
mTopPaginationContainer.setBackgroundResource(R.drawable.stats_pagination_item_background);
mTopPaginationGoBackButton = (Button) mTopPaginationContainer.findViewById(R.id.stats_pagination_go_back);
mTopPaginationGoForwardButton = (Button) mTopPaginationContainer.findViewById(R.id.stats_pagination_go_forward);
mTopPaginationText = (TextView) mTopPaginationContainer.findViewById(R.id.stats_pagination_text);
return view;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mGroupIdToExpandedMap = new SparseBooleanArray();
if (savedInstanceState != null) {
if (savedInstanceState.containsKey(ARGS_EXPANDED_ROWS)) {
mGroupIdToExpandedMap = savedInstanceState.getParcelable(ARGS_EXPANDED_ROWS);
}
mTopPagerSelectedButtonIndex = savedInstanceState.getInt(ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX);
}
}
@Override
public void onSaveInstanceState(Bundle outState) {
if (mGroupIdToExpandedMap.size() > 0) {
outState.putParcelable(ARGS_EXPANDED_ROWS, new SparseBooleanArrayParcelable(mGroupIdToExpandedMap));
}
outState.putInt(ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, mTopPagerSelectedButtonIndex);
super.onSaveInstanceState(outState);
}
@Override
protected void showPlaceholderUI() {
mTopPagerContainer.setVisibility(View.GONE);
mEmptyLabel.setVisibility(View.GONE);
mListContainer.setVisibility(View.GONE);
mList.setVisibility(View.GONE);
mViewAll.setVisibility(View.GONE);
mBottomPaginationContainer.setVisibility(View.GONE);
mTopPaginationContainer.setVisibility(View.GONE);
mEmptyModulePlaceholder.setVisibility(View.VISIBLE);
}
void showHideNoResultsUI(boolean showNoResultsUI) {
mModuleTitleTextView.setVisibility(View.VISIBLE);
mEmptyModulePlaceholder.setVisibility(View.GONE);
if (showNoResultsUI) {
mGroupIdToExpandedMap.clear();
String label;
if (getEmptyLabelDescResId() == NO_STRING_ID) {
label = "<b>" + getString(getEmptyLabelTitleResId()) + "</b><br/><br/>";
} else {
label = "<b>" + getString(getEmptyLabelTitleResId()) + "</b><br/><br/>" + getString(getEmptyLabelDescResId());
}
if (label.contains("<")) {
mEmptyLabel.setText(Html.fromHtml(label));
} else {
mEmptyLabel.setText(label);
}
mEmptyLabel.setVisibility(View.VISIBLE);
mListContainer.setVisibility(View.GONE);
mList.setVisibility(View.GONE);
mViewAll.setVisibility(View.GONE);
mBottomPaginationContainer.setVisibility(View.GONE);
mTopPaginationContainer.setVisibility(View.GONE);
} else {
mEmptyLabel.setVisibility(View.GONE);
mListContainer.setVisibility(View.VISIBLE);
mList.setVisibility(View.VISIBLE);
if (!isSingleView() && isViewAllOptionAvailable()) {
// No view all button if already in single view
configureViewAllButton();
} else {
mViewAll.setVisibility(View.GONE);
}
}
}
@Override
protected void showErrorUI(String label) {
if (!isAdded()) {
return;
}
mGroupIdToExpandedMap.clear();
mModuleTitleTextView.setVisibility(View.VISIBLE);
mEmptyModulePlaceholder.setVisibility(View.GONE);
// Use the generic error message when the string passed to this method is null.
if (TextUtils.isEmpty(label)) {
label = "<b>" + getString(R.string.error_refresh_stats) + "</b>";
}
if (label.contains("<")) {
mEmptyLabel.setText(Html.fromHtml(label));
} else {
mEmptyLabel.setText(label);
}
mEmptyLabel.setVisibility(View.VISIBLE);
mListContainer.setVisibility(View.GONE);
mList.setVisibility(View.GONE);
}
private void configureViewAllButton() {
if (isSingleView()) {
// No view all button if you're already in single view
mViewAll.setVisibility(View.GONE);
return;
}
mViewAll.setVisibility(View.VISIBLE);
mViewAll.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (isSingleView()) {
return; // already in single view
}
if (!hasDataAvailable()) {
return;
}
Intent viewAllIntent = new Intent(getActivity(), StatsViewAllActivity.class);
viewAllIntent.putExtra(StatsActivity.ARG_LOCAL_TABLE_BLOG_ID, getLocalTableBlogID());
viewAllIntent.putExtra(StatsAbstractFragment.ARGS_TIMEFRAME, getTimeframe());
viewAllIntent.putExtra(StatsAbstractFragment.ARGS_VIEW_TYPE, getViewType());
viewAllIntent.putExtra(StatsAbstractFragment.ARGS_SELECTED_DATE, getDate());
viewAllIntent.putExtra(ARGS_IS_SINGLE_VIEW, true);
if (mTopPagerContainer.getVisibility() == View.VISIBLE) {
viewAllIntent.putExtra(ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, mTopPagerSelectedButtonIndex);
}
//viewAllIntent.putExtra(StatsAbstractFragment.ARG_REST_RESPONSE, mDatamodels[mTopPagerSelectedButtonIndex]);
getActivity().startActivity(viewAllIntent);
}
});
}
int getMaxNumberOfItemsToShowInList() {
return isSingleView() ? MAX_NUM_OF_ITEMS_DISPLAYED_IN_SINGLE_VIEW_LIST : MAX_NUM_OF_ITEMS_DISPLAYED_IN_LIST;
}
void setupTopModulePager(LayoutInflater inflater, ViewGroup container, View view, String[] buttonTitles) {
int dp4 = DisplayUtils.dpToPx(view.getContext(), 4);
int dp80 = DisplayUtils.dpToPx(view.getContext(), 80);
for (int i = 0; i < buttonTitles.length; i++) {
CheckedTextView rb = (CheckedTextView) inflater.inflate(R.layout.stats_top_module_pager_button, container, false);
RadioGroup.LayoutParams params = new RadioGroup.LayoutParams(RadioGroup.LayoutParams.MATCH_PARENT,
RadioGroup.LayoutParams.WRAP_CONTENT);
params.weight = 1;
rb.setTypeface((TypefaceCache.getTypeface(view.getContext())));
if (i == 0) {
params.setMargins(0, 0, dp4, 0);
} else {
params.setMargins(dp4, 0, 0, 0);
}
rb.setMinimumWidth(dp80);
rb.setGravity(Gravity.CENTER);
rb.setLayoutParams(params);
rb.setText(buttonTitles[i]);
rb.setChecked(i == mTopPagerSelectedButtonIndex);
rb.setOnClickListener(TopModulePagerOnClickListener);
mTopPagerContainer.addView(rb);
}
mTopPagerContainer.setVisibility(View.VISIBLE);
}
private final View.OnClickListener TopModulePagerOnClickListener = new View.OnClickListener() {
@Override
public void onClick(View v) {
if (!isAdded()) {
return;
}
CheckedTextView ctv = (CheckedTextView) v;
if (ctv.isChecked()) {
// already checked. Do nothing
return;
}
int numberOfButtons = mTopPagerContainer.getChildCount();
int checkedId = -1;
for (int i = 0; i < numberOfButtons; i++) {
CheckedTextView currentCheckedTextView = (CheckedTextView)mTopPagerContainer.getChildAt(i);
if (ctv == currentCheckedTextView) {
checkedId = i;
currentCheckedTextView.setChecked(true);
} else {
currentCheckedTextView.setChecked(false);
}
}
if (checkedId == -1)
return;
mTopPagerSelectedButtonIndex = checkedId;
TextView entryLabel = (TextView) getView().findViewById(R.id.stats_list_entry_label);
if (entryLabel != null) {
entryLabel.setText(getEntryLabelResId());
}
updateUI();
}
};
}