diff options
author | Chris Warrington <cmw@google.com> | 2016-10-18 12:29:21 +0100 |
---|---|---|
committer | Chris Warrington <cmw@google.com> | 2016-10-18 12:34:18 +0100 |
commit | e3780081075c01aa1dff6d1f373cb43192b33e68 (patch) | |
tree | fb734615933a39f3d009210dc0d1457160479b35 /WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java | |
parent | 7e05eb7e57827eddc885570bc00aed8a50320dbf (diff) | |
parent | 025b8b226c8d8edba2b309ca878572f40512eca7 (diff) | |
download | gradle-perf-android-medium-e3780081075c01aa1dff6d1f373cb43192b33e68.tar.gz |
Merge remote-tracking branch 'origin/upstream-master' into masterHEADstudio-3.4.0studio-3.2.1studio-3.1.2studio-3.0studio-2.3gradle_3.4.0gradle_3.1.2gradle_3.0.0gradle_2.3.0studio-master-devmirror-goog-studio-master-devmastermain
Change-Id: I63f5e16d09297c48432192761b840310935eb903
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java')
-rw-r--r-- | WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java | 318 |
1 files changed, 318 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java new file mode 100644 index 000000000..0f0c795b5 --- /dev/null +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsViewAllActivity.java @@ -0,0 +1,318 @@ +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.WordPress; +import org.wordpress.android.analytics.AnalyticsTracker; +import org.wordpress.android.ui.ActivityId; +import org.wordpress.android.util.AnalyticsUtils; +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_BLOG_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_BLOG_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) { + AnalyticsUtils.trackWithBlogDetails(AnalyticsTracker.Stat.STATS_VIEW_ALL_ACCESSED, WordPress.getBlog(mLocalBlogID)); + } + } + + @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_BLOG_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_BLOG_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(); + } + } +} |