package org.wordpress.android.ui.stats;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.AppCompatActivity;
import android.text.TextUtils;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
import org.wordpress.android.R;
import org.wordpress.android.analytics.AnalyticsTracker;
import org.wordpress.android.analytics.AnalyticsTracker.Stat;
import org.wordpress.android.ui.ActivityId;
import org.wordpress.android.util.AppLog;
import org.wordpress.android.util.NetworkUtils;
import org.wordpress.android.util.helpers.SwipeToRefreshHelper;
import org.wordpress.android.util.widgets.CustomSwipeRefreshLayout;
import java.io.Serializable;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import de.greenrobot.event.EventBus;
/**
* Single item details activity.
*/
public class StatsViewAllActivity extends AppCompatActivity {
public static final String ARG_STATS_VIEW_ALL_TITLE = "arg_stats_view_all_title";
private static final String SAVED_STATS_SCROLL_POSITION = "SAVED_STATS_SCROLL_POSITION";
private boolean mIsInFront;
private boolean mIsUpdatingStats;
private SwipeToRefreshHelper mSwipeToRefreshHelper;
private ScrollViewExt mOuterScrollView;
private StatsAbstractListFragment mFragment;
private int mLocalBlogID = -1;
private StatsTimeframe mTimeframe;
private StatsViewType mStatsViewType;
private String mDate;
private Serializable[] mRestResponse;
private int mOuterPagerSelectedButtonIndex = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.stats_activity_view_all);
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);
}
setTitle(R.string.stats);
mOuterScrollView = (ScrollViewExt) findViewById(R.id.scroll_view_stats);
// pull to refresh setup
mSwipeToRefreshHelper = new SwipeToRefreshHelper(this, (CustomSwipeRefreshLayout) findViewById(R.id.ptr_layout),
new SwipeToRefreshHelper.RefreshListener() {
@Override
public void onRefreshStarted() {
if (!NetworkUtils.checkConnection(getBaseContext())) {
mSwipeToRefreshHelper.setRefreshing(false);
mIsUpdatingStats = false;
return;
}
if (mIsUpdatingStats) {
AppLog.w(AppLog.T.STATS, "stats are already updating, refresh cancelled");
return;
}
refreshStats();
}
}
);
if (savedInstanceState != null) {
mLocalBlogID = savedInstanceState.getInt(StatsActivity.ARG_LOCAL_TABLE_SITE_ID, -1);
Serializable oldData = savedInstanceState.getSerializable(StatsAbstractFragment.ARG_REST_RESPONSE);
if (oldData != null && oldData instanceof Serializable[]) {
mRestResponse = (Serializable[]) oldData;
}
mTimeframe = (StatsTimeframe) savedInstanceState.getSerializable(StatsAbstractFragment.ARGS_TIMEFRAME);
mDate = savedInstanceState.getString(StatsAbstractFragment.ARGS_SELECTED_DATE);
mStatsViewType = (StatsViewType) savedInstanceState.getSerializable(StatsAbstractFragment.ARGS_VIEW_TYPE);
mOuterPagerSelectedButtonIndex = savedInstanceState.getInt(StatsAbstractListFragment.ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, 0);
final int yScrollPosition = savedInstanceState.getInt(SAVED_STATS_SCROLL_POSITION);
if(yScrollPosition != 0) {
mOuterScrollView.postDelayed(new Runnable() {
public void run() {
if (!isFinishing()) {
mOuterScrollView.scrollTo(0, yScrollPosition);
}
}
}, StatsConstants.STATS_SCROLL_TO_DELAY);
}
} else if (getIntent() != null) {
Bundle extras = getIntent().getExtras();
mLocalBlogID = extras.getInt(StatsActivity.ARG_LOCAL_TABLE_SITE_ID, -1);
mTimeframe = (StatsTimeframe) extras.getSerializable(StatsAbstractFragment.ARGS_TIMEFRAME);
mDate = extras.getString(StatsAbstractFragment.ARGS_SELECTED_DATE);
mStatsViewType = (StatsViewType) extras.getSerializable(StatsAbstractFragment.ARGS_VIEW_TYPE);
mOuterPagerSelectedButtonIndex = extras.getInt(StatsAbstractListFragment.ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, 0);
// Set a custom activity title if one was passed
if (!TextUtils.isEmpty(extras.getString(ARG_STATS_VIEW_ALL_TITLE))) {
setTitle(extras.getString(ARG_STATS_VIEW_ALL_TITLE));
}
}
if (mStatsViewType == null || mTimeframe == null || mDate == null) {
Toast.makeText(this, getResources().getText(R.string.stats_generic_error),
Toast.LENGTH_SHORT).show();
finish();
}
// Setup the top date label. It's available on those fragments that are affected by the top date selector.
TextView dateTextView = (TextView) findViewById(R.id.stats_summary_date);
switch (mStatsViewType) {
case TOP_POSTS_AND_PAGES:
case REFERRERS:
case CLICKS:
case GEOVIEWS:
case AUTHORS:
case VIDEO_PLAYS:
case SEARCH_TERMS:
dateTextView.setText(getDateForDisplayInLabels(mDate, mTimeframe));
dateTextView.setVisibility(View.VISIBLE);
break;
default:
dateTextView.setVisibility(View.GONE);
break;
}
FragmentManager fm = getFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
mFragment = (StatsAbstractListFragment) fm.findFragmentByTag("ViewAll-Fragment");
if (mFragment == null) {
mFragment = getInnerFragment();
ft.replace(R.id.stats_single_view_fragment, mFragment, "ViewAll-Fragment");
ft.commitAllowingStateLoss();
}
if (savedInstanceState == null) {
AnalyticsTracker.track(Stat.STATS_VIEW_ALL_ACCESSED);
}
}
@Override
protected void onStop() {
EventBus.getDefault().unregister(this);
super.onStop();
}
@Override
protected void onStart() {
super.onStart();
EventBus.getDefault().register(this);
}
@SuppressWarnings("unused")
public void onEventMainThread(StatsEvents.UpdateStatusChanged event) {
if (isFinishing() || !mIsInFront) {
return;
}
mSwipeToRefreshHelper.setRefreshing(event.mUpdating);
mIsUpdatingStats = event.mUpdating;
}
private String getDateForDisplayInLabels(String date, StatsTimeframe timeframe) {
String prefix = getString(R.string.stats_for);
switch (timeframe) {
case DAY:
return String.format(prefix, StatsUtils.parseDate(date, StatsConstants.STATS_INPUT_DATE_FORMAT,
StatsConstants.STATS_OUTPUT_DATE_MONTH_LONG_DAY_SHORT_FORMAT));
case WEEK:
try {
SimpleDateFormat sdf = new SimpleDateFormat(StatsConstants.STATS_INPUT_DATE_FORMAT);
final Date parsedDate = sdf.parse(date);
Calendar c = Calendar.getInstance();
c.setTime(parsedDate);
String endDateLabel = StatsUtils.msToString(c.getTimeInMillis(), StatsConstants.STATS_OUTPUT_DATE_MONTH_LONG_DAY_LONG_FORMAT);
// last day of this week
c.add(Calendar.DAY_OF_WEEK, - 6);
String startDateLabel = StatsUtils.msToString(c.getTimeInMillis(), StatsConstants.STATS_OUTPUT_DATE_MONTH_LONG_DAY_LONG_FORMAT);
return String.format(prefix, startDateLabel + " - " + endDateLabel);
} catch (ParseException e) {
AppLog.e(AppLog.T.UTILS, e);
return "";
}
case MONTH:
return String.format(prefix, StatsUtils.parseDate(date, StatsConstants.STATS_INPUT_DATE_FORMAT, StatsConstants.STATS_OUTPUT_DATE_MONTH_LONG_FORMAT));
case YEAR:
return String.format(prefix, StatsUtils.parseDate(date, StatsConstants.STATS_INPUT_DATE_FORMAT, StatsConstants.STATS_OUTPUT_DATE_YEAR_FORMAT));
}
return "";
}
private StatsAbstractListFragment getInnerFragment() {
StatsAbstractListFragment fragment = null;
switch (mStatsViewType) {
case TOP_POSTS_AND_PAGES:
fragment = new StatsTopPostsAndPagesFragment();
break;
case REFERRERS:
fragment = new StatsReferrersFragment();
break;
case CLICKS:
fragment = new StatsClicksFragment();
break;
case GEOVIEWS:
fragment = new StatsGeoviewsFragment();
break;
case AUTHORS:
fragment = new StatsAuthorsFragment();
break;
case VIDEO_PLAYS:
fragment = new StatsVideoplaysFragment();
break;
case COMMENTS:
fragment = new StatsCommentsFragment();
break;
case TAGS_AND_CATEGORIES:
fragment = new StatsTagsAndCategoriesFragment();
break;
case PUBLICIZE:
fragment = new StatsPublicizeFragment();
break;
case FOLLOWERS:
fragment = new StatsFollowersFragment();
break;
case SEARCH_TERMS:
fragment = new StatsSearchTermsFragment();
break;
}
fragment.setTimeframe(mTimeframe);
fragment.setDate(mDate);
Bundle args = new Bundle();
args.putInt(StatsActivity.ARG_LOCAL_TABLE_SITE_ID, mLocalBlogID);
args.putSerializable(StatsAbstractFragment.ARGS_VIEW_TYPE, mStatsViewType);
args.putBoolean(StatsAbstractListFragment.ARGS_IS_SINGLE_VIEW, true); // Always true here
args.putInt(StatsAbstractListFragment.ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, mOuterPagerSelectedButtonIndex);
args.putSerializable(StatsAbstractFragment.ARG_REST_RESPONSE, mRestResponse);
fragment.setArguments(args);
return fragment;
}
@Override
protected void onSaveInstanceState(Bundle outState) {
outState.putInt(StatsActivity.ARG_LOCAL_TABLE_SITE_ID, mLocalBlogID);
outState.putSerializable(StatsAbstractFragment.ARG_REST_RESPONSE, mRestResponse);
outState.putSerializable(StatsAbstractFragment.ARGS_TIMEFRAME, mTimeframe);
outState.putString(StatsAbstractFragment.ARGS_SELECTED_DATE, mDate);
outState.putSerializable(StatsAbstractFragment.ARGS_VIEW_TYPE, mStatsViewType);
outState.putInt(StatsAbstractListFragment.ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, mOuterPagerSelectedButtonIndex);
if (mOuterScrollView.getScrollY() != 0) {
outState.putInt(SAVED_STATS_SCROLL_POSITION, mOuterScrollView.getScrollY());
}
super.onSaveInstanceState(outState);
}
@Override
protected void onResume() {
super.onResume();
mIsInFront = true;
NetworkUtils.checkConnection(this); // show the error toast if the network is offline
ActivityId.trackLastActivity(ActivityId.STATS_VIEW_ALL);
}
@Override
protected void onPause() {
super.onPause();
mIsInFront = false;
mIsUpdatingStats = false;
mSwipeToRefreshHelper.setRefreshing(false);
}
@Override
public boolean onOptionsItemSelected(final MenuItem item) {
switch (item.getItemId()) {
case android.R.id.home:
onBackPressed();
return true;
default:
return super.onOptionsItemSelected(item);
}
}
private void refreshStats() {
if (mIsUpdatingStats) {
return;
}
if (!NetworkUtils.isNetworkAvailable(this)) {
mSwipeToRefreshHelper.setRefreshing(false);
AppLog.w(AppLog.T.STATS, "ViewAll on "+ mFragment.getTag() + " > no connection, update canceled");
return;
}
if (mFragment != null) {
mFragment.refreshStats();
}
}
}