diff options
author | Danilo Ercoli <ercoli@gmail.com> | 2016-01-07 16:40:00 +0100 |
---|---|---|
committer | Danilo Ercoli <ercoli@gmail.com> | 2016-01-07 16:40:00 +0100 |
commit | 9611275f0c27e0ee0a0294a7c6e642911ba77f4c (patch) | |
tree | 3a5f4203aabb9a251bfc69373f7efd03c567f038 | |
parent | c1c5c6f033acfc2c7bb6ceed37f87c98e0733a94 (diff) | |
download | gradle-perf-android-medium-9611275f0c27e0ee0a0294a7c6e642911ba77f4c.tar.gz |
Moved Insights and cleaned the code a bit.
22 files changed, 498 insertions, 604 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractFragment.java index 9e30da0d8..bb0a4fb7e 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractFragment.java @@ -1,10 +1,15 @@ package org.wordpress.android.ui.stats; +import android.app.Activity; import android.app.Fragment; import android.content.Intent; import android.os.Bundle; +import com.android.volley.NoConnectionError; +import com.android.volley.VolleyError; + +import org.wordpress.android.R; import org.wordpress.android.WordPress; import org.wordpress.android.models.AccountHelper; import org.wordpress.android.models.Blog; @@ -12,6 +17,8 @@ import org.wordpress.android.ui.stats.service.StatsService; import org.wordpress.android.util.AppLog; import org.wordpress.android.util.NetworkUtils; +import de.greenrobot.event.EventBus; + public abstract class StatsAbstractFragment extends Fragment { public static final String TAG = StatsAbstractFragment.class.getSimpleName(); @@ -29,6 +36,29 @@ public abstract class StatsAbstractFragment extends Fragment { private StatsTimeframe mStatsTimeframe = StatsTimeframe.DAY; protected abstract StatsService.StatsEndpointsEnum[] getSectionsToUpdate(); + protected abstract void showPlaceholderUI(); + protected abstract void updateUI(); + protected abstract void showErrorUI(String label); + + /** + * Wheter or not previous data is available. + * @return True if previous data is already available in the fragment + */ + protected abstract boolean hasDataAvailable(); + + /** + * Called in onSaveIstance. Fragments should persist data here. + * @param outState Bundle in which to place fragment saved state. + */ + protected abstract void saveStatsData(Bundle outState); + + /** + * Called in OnCreate. Fragment should restore here previous saved data. + * @param savedInstanceState If the fragment is being re-created from a previous saved state, this is the state. + */ + protected abstract void restoreStatsData(Bundle savedInstanceState); // called in onCreate + + protected StatsResourceVars mResourceVars; public void refreshStats() { refreshStats(-1, null); @@ -112,6 +142,7 @@ public abstract class StatsAbstractFragment extends Fragment { if (savedInstanceState.containsKey(ARGS_SELECTED_DATE)) { mDate = savedInstanceState.getString(ARGS_SELECTED_DATE); } + restoreStatsData(savedInstanceState); // Each fragment will override this to restore fragment dependant data } // AppLog.d(AppLog.T.STATS, "mStatsTimeframe: " + mStatsTimeframe.getLabel()); @@ -119,15 +150,51 @@ public abstract class StatsAbstractFragment extends Fragment { } @Override + public void onAttach(Activity activity) { + super.onAttach(activity); + mResourceVars = new StatsResourceVars(activity); + } + + @Override public void onSaveInstanceState(Bundle outState) { /* AppLog.d(AppLog.T.STATS, this.getClass().getCanonicalName() + " > saving instance state"); AppLog.d(AppLog.T.STATS, "mStatsTimeframe: " + mStatsTimeframe.getLabel()); AppLog.d(AppLog.T.STATS, "mDate: " + mDate); */ + outState.putString(ARGS_SELECTED_DATE, mDate); outState.putSerializable(ARGS_TIMEFRAME, mStatsTimeframe); + saveStatsData(outState); // Each fragment will override this super.onSaveInstanceState(outState); } + @Override + public void onResume() { + super.onResume(); + + // Init the UI + if (hasDataAvailable()) { + updateUI(); + } else { + if (NetworkUtils.isNetworkAvailable(getActivity())) { + showPlaceholderUI(); + refreshStats(); + } else { + showErrorUI(new NoConnectionError()); + } + } + } + + @Override + public void onStart() { + super.onStart(); + EventBus.getDefault().register(this); + } + + @Override + public void onStop() { + EventBus.getDefault().unregister(this); + super.onStop(); + } public boolean shouldUpdateFragmentOnUpdateEvent(StatsEvents.SectionUpdatedAbstract event) { if (!isAdded()) { @@ -149,6 +216,28 @@ public abstract class StatsAbstractFragment extends Fragment { return true; } + protected void showErrorUI(VolleyError error) { + if (!isAdded()) { + return; + } + + String label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; + + if (error instanceof NoConnectionError) { + label += "<br/>" + getString(R.string.no_network_message); + } + + if (StatsUtils.isRESTDisabledError(error)) { + label += "<br/>" + getString(R.string.stats_enable_rest_api_in_jetpack); + } + + showErrorUI(label); + } + + protected void showErrorUI() { + String label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; + showErrorUI(label); + } public boolean shouldUpdateFragmentOnErrorEvent(StatsEvents.SectionUpdateError errorEvent) { StatsEvents.SectionUpdatedAbstract abstractEvent = errorEvent; diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractInsightsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractInsightsFragment.java index 0c6a04bba..191578fa9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractInsightsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractInsightsFragment.java @@ -1,41 +1,25 @@ package org.wordpress.android.ui.stats; -import android.app.Activity; import android.os.Bundle; import android.text.Html; +import android.text.TextUtils; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.volley.NoConnectionError; -import com.android.volley.VolleyError; - import org.wordpress.android.R; -import org.wordpress.android.ui.stats.exceptions.StatsError; -import org.wordpress.android.ui.stats.service.StatsService; -import org.wordpress.android.util.NetworkUtils; - -import java.io.Serializable; - -import de.greenrobot.event.EventBus; public abstract class StatsAbstractInsightsFragment extends StatsAbstractFragment { public static final String TAG = StatsAbstractInsightsFragment.class.getSimpleName(); - Serializable[] mDatamodels; - - StatsResourceVars mResourceVars; - - private TextView mErrorLabel; - private LinearLayout mEmptyModulePlaceholder; + protected TextView mErrorLabel; + protected LinearLayout mEmptyModulePlaceholder; protected LinearLayout mResultContainer; - abstract void customizeUIWithResults(); // This is where all the UI is customized at module level - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.stats_insights_generic_fragment, container, false); @@ -49,132 +33,20 @@ public abstract class StatsAbstractInsightsFragment extends StatsAbstractFragmen } @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mResourceVars = new StatsResourceVars(activity); - } - - @Override - public void onStart() { - super.onStart(); - EventBus.getDefault().register(this); - } - - @Override - public void onStop() { - EventBus.getDefault().unregister(this); - super.onStop(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - if (savedInstanceState != null) { - if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { - Serializable oldData = savedInstanceState.getSerializable(ARG_REST_RESPONSE); - if (oldData != null && oldData instanceof Serializable[]) { - mDatamodels = (Serializable[]) oldData; - } - } - } - } - - @Override - public void onSaveInstanceState(Bundle outState) { - // Do not serialize VolleyError, but rewrite in a simple stats Exception. - // VolleyErrors should be serializable, but for some reason they are not. - // FIX for https://github.com/wordpress-mobile/WordPress-Android/issues/2228 - if (mDatamodels != null) { - for (int i=0; i < mDatamodels.length; i++) { - if (mDatamodels[i] != null && mDatamodels[i] instanceof VolleyError) { - VolleyError currentVolleyError = (VolleyError) mDatamodels[i]; - mDatamodels[i] = StatsUtils.rewriteVolleyError(currentVolleyError, getString(R.string.error_refresh_stats)); - } - } - } - - outState.putSerializable(ARG_REST_RESPONSE, mDatamodels); - super.onSaveInstanceState(outState); - } - - @Override - public void onResume() { - super.onResume(); - // Init the UI - if (mDatamodels != null) { - updateUI(); - } else { - if (NetworkUtils.isNetworkAvailable(getActivity())) { - showPlaceholderUI(); - refreshStats(); - } else { - showErrorUI(new NoConnectionError()); - } - } - } - - - protected void updateUI() { - if (!isAdded()) { - return; - } - - if (mDatamodels == null) { - return; - } - - if (isErrorResponse(0)) { - showErrorUI(mDatamodels[0]); - return; - } - - if (isDataEmpty(0)) { - // This is just an additional check. We only have 1 endpoint per fragment here. - // mDatamodels is either null or not empty at position 0 - String label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; - showErrorUI(label); - return; - } - - // not an error - update the module UI here - mErrorLabel.setVisibility(View.GONE); - mResultContainer.setVisibility(View.VISIBLE); - mEmptyModulePlaceholder.setVisibility(View.GONE); - - customizeUIWithResults(); // call the subclass and draw the real UI here - } - - void showPlaceholderUI() { + protected void showPlaceholderUI() { mErrorLabel.setVisibility(View.GONE); mResultContainer.setVisibility(View.GONE); mEmptyModulePlaceholder.setVisibility(View.VISIBLE); } - protected final void showErrorUI(Serializable error) { - if (!isAdded()) { - return; - } - - String label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; - - if (error instanceof NoConnectionError) { - label += "<br/>" + getString(R.string.no_network_message); - } - - if (StatsUtils.isRESTDisabledError(error)) { - label += "<br/>" + getString(R.string.stats_enable_rest_api_in_jetpack); - } - - showErrorUI(label); - } - - protected final void showErrorUI(String label) { + @Override + protected void showErrorUI(String label) { if (!isAdded()) { return; } // Use the generic error message when the string passed to this method is null. - if (label == null) { + if (TextUtils.isEmpty(label)) { label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; } @@ -187,54 +59,4 @@ public abstract class StatsAbstractInsightsFragment extends StatsAbstractFragmen mResultContainer.setVisibility(View.GONE); mEmptyModulePlaceholder.setVisibility(View.GONE); } - - - boolean isDataEmpty(int index) { - return mDatamodels == null - || mDatamodels[index] == null - || isErrorResponse(index); - } - - boolean isErrorResponse(int index) { - return mDatamodels != null && mDatamodels[index] != null - && (mDatamodels[index] instanceof VolleyError || mDatamodels[index] instanceof StatsError); - } - - @SuppressWarnings("unused") - public void onEventMainThread(StatsEvents.SectionUpdated event) { - if (!isAdded()) { - return; - } - - if (!event.mRequestBlogId.equals(StatsUtils.getBlogId(getLocalTableBlogID()))) { - return; - } - - if (event.mTimeframe != getTimeframe()) { - return; - } - - StatsService.StatsEndpointsEnum sectionToUpdate = event.mEndPointName; - StatsService.StatsEndpointsEnum[] sectionsToUpdate = getSectionsToUpdate(); - int indexOfDatamodelMatch = -1; - for (int i = 0; i < getSectionsToUpdate().length; i++) { - if (sectionToUpdate == sectionsToUpdate[i]) { - indexOfDatamodelMatch = i; - break; - } - } - - if (-1 == indexOfDatamodelMatch) { - return; - } - - - if (mDatamodels == null) { - mDatamodels = new Serializable[getSectionsToUpdate().length]; - } - - mDatamodels[indexOfDatamodelMatch] = event.mResponseObjectModel; - updateUI(); - } - }
\ No newline at end of file diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractListFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractListFragment.java index 17900b6d6..d78e1f4c4 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractListFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAbstractListFragment.java @@ -1,9 +1,9 @@ package org.wordpress.android.ui.stats; -import android.app.Activity; 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; @@ -15,20 +15,10 @@ import android.widget.LinearLayout; import android.widget.RadioGroup; import android.widget.TextView; -import com.android.volley.NoConnectionError; -import com.android.volley.VolleyError; - import org.wordpress.android.R; -import org.wordpress.android.ui.stats.exceptions.StatsError; -import org.wordpress.android.ui.stats.service.StatsService; import org.wordpress.android.util.DisplayUtils; -import org.wordpress.android.util.NetworkUtils; import org.wordpress.android.widgets.TypefaceCache; -import java.io.Serializable; - -import de.greenrobot.event.EventBus; - public abstract class StatsAbstractListFragment extends StatsAbstractFragment { // Used when the fragment has 2 pages/kind of stats in it. Not meaning the bottom pagination. @@ -61,28 +51,15 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { private LinearLayout mEmptyModulePlaceholder; - /** - * @deprecated */ - Serializable[] mDatamodels; - SparseBooleanArray mGroupIdToExpandedMap; protected abstract int getEntryLabelResId(); protected abstract int getTotalsLabelResId(); protected abstract int getEmptyLabelTitleResId(); protected abstract int getEmptyLabelDescResId(); - protected abstract void updateUI(); protected abstract boolean isExpandableList(); protected abstract boolean isViewAllOptionAvailable(); - StatsResourceVars mResourceVars; - - @Override - public void onAttach(Activity activity) { - super.onAttach(activity); - mResourceVars = new StatsResourceVars(activity); - } - @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view; @@ -126,13 +103,10 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mGroupIdToExpandedMap = new SparseBooleanArray(); - if (savedInstanceState != null) { - restorePreviousData(savedInstanceState); // Each fragment will override this if (savedInstanceState.containsKey(ARGS_EXPANDED_ROWS)) { mGroupIdToExpandedMap = savedInstanceState.getParcelable(ARGS_EXPANDED_ROWS); } - mTopPagerSelectedButtonIndex = savedInstanceState.getInt(ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX); } } @@ -143,52 +117,11 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { outState.putParcelable(ARGS_EXPANDED_ROWS, new SparseBooleanArrayParcelable(mGroupIdToExpandedMap)); } outState.putInt(ARGS_TOP_PAGER_SELECTED_BUTTON_INDEX, mTopPagerSelectedButtonIndex); - savePreviousData(outState); // Each fragment will override this - super.onSaveInstanceState(outState); } @Override - public void onStart() { - super.onStart(); - EventBus.getDefault().register(this); - } - - @Override - public void onStop() { - EventBus.getDefault().unregister(this); - super.onStop(); - } - - @Override - public void onResume() { - super.onResume(); - - // Init the UI - if (hasPreviousDataAvailable()) { - updateUI(); - } else { - if (NetworkUtils.isNetworkAvailable(getActivity())) { - showPlaceholderUI(); - refreshStats(); - } else { - showErrorUI(new NoConnectionError()); - } - } - } - - // TODO: MAKE ME ABSTRACT!!! - protected boolean hasPreviousDataAvailable() { - return false; - } - protected void savePreviousData(Bundle outState) { - - } - protected void restorePreviousData(Bundle savedInstanceState) { - - } - - private void showPlaceholderUI() { + protected void showPlaceholderUI() { mTopPagerContainer.setVisibility(View.GONE); mEmptyLabel.setVisibility(View.GONE); mListContainer.setVisibility(View.GONE); @@ -236,49 +169,8 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { } } - void showErrorUI() { - if (!isAdded()) { - return; - } - showErrorUI(mDatamodels[mTopPagerSelectedButtonIndex]); - } - - protected void showErrorUI(VolleyError error) { - if (!isAdded()) { - return; - } - - mGroupIdToExpandedMap.clear(); - mModuleTitleTextView.setVisibility(View.VISIBLE); - mEmptyModulePlaceholder.setVisibility(View.GONE); - - String label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; - - if (error instanceof NoConnectionError) { - label += "<br/>" + getString(R.string.no_network_message); - } - - // No need to show detailed error messages to the user - /*else if (error instanceof VolleyError) { - String volleyErrorMsg = ((VolleyError)error).getMessage(); - if (org.apache.commons.lang.StringUtils.isNotBlank(volleyErrorMsg)){ - label += volleyErrorMsg; - } - }*/ - - if (label.contains("<")) { - mEmptyLabel.setText(Html.fromHtml(label)); - } else { - mEmptyLabel.setText(label); - } - mEmptyLabel.setVisibility(View.VISIBLE); - mListContainer.setVisibility(View.GONE); - mList.setVisibility(View.GONE); - } - - /** - * @deprecated */ - private void showErrorUI(Serializable error) { + @Override + protected void showErrorUI(String label) { if (!isAdded()) { return; } @@ -287,20 +179,11 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { mModuleTitleTextView.setVisibility(View.VISIBLE); mEmptyModulePlaceholder.setVisibility(View.GONE); - String label = "<b>" + getString(R.string.error_refresh_stats) + "</b>"; - - if (error instanceof NoConnectionError) { - label += "<br/>" + getString(R.string.no_network_message); + // 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>"; } - // No need to show detailed error messages to the user - /*else if (error instanceof VolleyError) { - String volleyErrorMsg = ((VolleyError)error).getMessage(); - if (org.apache.commons.lang.StringUtils.isNotBlank(volleyErrorMsg)){ - label += volleyErrorMsg; - } - }*/ - if (label.contains("<")) { mEmptyLabel.setText(Html.fromHtml(label)); } else { @@ -311,47 +194,6 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { mList.setVisibility(View.GONE); } - - - - - - - /** - * Check if the current datamodel is populated and is NOT an error response. - * - * @deprecated - */ - boolean isDataEmpty() { - return isDataEmpty(mTopPagerSelectedButtonIndex); - } - - /** - * @deprecated */ - boolean isDataEmpty(int index) { - return mDatamodels == null - || mDatamodels[index] == null - || isErrorResponse(index); - } - - /** - * Check if the current datamodel is an error response. - * - * @deprecated - * - * @return true if it is a Volley Error - */ - boolean isErrorResponse() { - return isErrorResponse(mTopPagerSelectedButtonIndex); - } - - /** - * @deprecated */ - boolean isErrorResponse(int index) { - return mDatamodels != null && mDatamodels[index] != null - && (mDatamodels[index] instanceof VolleyError || mDatamodels[index] instanceof StatsError); - } - private void configureViewAllButton() { if (isSingleView()) { // No view all button if you're already in single view @@ -366,7 +208,7 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { return; // already in single view } - if (!hasPreviousDataAvailable()) { + if (!hasDataAvailable()) { return; } @@ -452,46 +294,4 @@ public abstract class StatsAbstractListFragment extends StatsAbstractFragment { updateUI(); } }; - - @SuppressWarnings("unused") - public void onEventMainThread(StatsEvents.SectionUpdated event) { - if (!isAdded()) { - return; - } - - if (!getDate().equals(event.mDate)) { - return; - } - - if (!event.mRequestBlogId.equals(StatsUtils.getBlogId(getLocalTableBlogID()))) { - return; - } - - if (event.mTimeframe != getTimeframe()) { - return; - } - - StatsService.StatsEndpointsEnum sectionToUpdate = event.mEndPointName; - StatsService.StatsEndpointsEnum[] sectionsToUpdate = getSectionsToUpdate(); - int indexOfDatamodelMatch = -1; - for (int i = 0; i < getSectionsToUpdate().length; i++) { - if (sectionToUpdate == sectionsToUpdate[i]) { - indexOfDatamodelMatch = i; - break; - } - } - - if (-1 == indexOfDatamodelMatch) { - return; - } - - mGroupIdToExpandedMap.clear(); - - if (mDatamodels == null) { - mDatamodels = new Serializable[getSectionsToUpdate().length]; - } - - mDatamodels[indexOfDatamodelMatch] = event.mResponseObjectModel; - updateUI(); - } } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAuthorsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAuthorsFragment.java index 21919dccd..cdc880b4c 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAuthorsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsAuthorsFragment.java @@ -26,17 +26,17 @@ public class StatsAuthorsFragment extends StatsAbstractListFragment { private AuthorsModel mAuthors; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mAuthors != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, mAuthors); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mAuthors = (AuthorsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } 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 index 5be34fb94..788758462 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsClicksFragment.java @@ -25,17 +25,17 @@ public class StatsClicksFragment extends StatsAbstractListFragment { private ClicksModel mClicks; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mClicks != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, mClicks); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mClicks = (ClicksModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsCommentsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsCommentsFragment.java index 22456ca53..c0ede28c1 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsCommentsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsCommentsFragment.java @@ -32,11 +32,11 @@ public class StatsCommentsFragment extends StatsAbstractListFragment { private CommentFollowersModel mCommentFollowersModel; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mCommentsModel != null && mCommentFollowersModel != null; } @Override - protected void savePreviousData(Bundle outState) { + protected void saveStatsData(Bundle outState) { if (mCommentsModel != null) { outState.putSerializable(ARG_REST_RESPONSE, mCommentsModel); } @@ -45,7 +45,7 @@ public class StatsCommentsFragment extends StatsAbstractListFragment { } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mCommentsModel = (CommentsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } @@ -174,10 +174,6 @@ public class StatsCommentsFragment extends StatsAbstractListFragment { @Override protected boolean isViewAllOptionAvailable() { - if (isDataEmpty(0)) { - return false; - } - if (mTopPagerSelectedButtonIndex == 0 && hasAuthors() && getAuthors().size() > MAX_NUM_OF_ITEMS_DISPLAYED_IN_LIST) { return true; } else if (mTopPagerSelectedButtonIndex == 1 && hasPosts() && getPosts().size() > MAX_NUM_OF_ITEMS_DISPLAYED_IN_LIST) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsEvents.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsEvents.java index 231b140dd..1e8ac8604 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsEvents.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsEvents.java @@ -8,6 +8,10 @@ import org.wordpress.android.ui.stats.models.CommentFollowersModel; import org.wordpress.android.ui.stats.models.CommentsModel; import org.wordpress.android.ui.stats.models.FollowersModel; import org.wordpress.android.ui.stats.models.GeoviewsModel; +import org.wordpress.android.ui.stats.models.InsightsAllTimeModel; +import org.wordpress.android.ui.stats.models.InsightsLatestPostDetailsModel; +import org.wordpress.android.ui.stats.models.InsightsLatestPostModel; +import org.wordpress.android.ui.stats.models.InsightsPopularModel; import org.wordpress.android.ui.stats.models.PublicizeModel; import org.wordpress.android.ui.stats.models.ReferrersModel; import org.wordpress.android.ui.stats.models.SearchTermsModel; @@ -17,8 +21,6 @@ import org.wordpress.android.ui.stats.models.VideoPlaysModel; import org.wordpress.android.ui.stats.models.VisitsModel; import org.wordpress.android.ui.stats.service.StatsService.StatsEndpointsEnum; -import java.io.Serializable; - public class StatsEvents { public static class UpdateStatusChanged { public final boolean mUpdating; @@ -27,19 +29,6 @@ public class StatsEvents { } } - //TODO: REMOVE - public static class SectionUpdated extends SectionUpdatedAbstract { - public final StatsEndpointsEnum mEndPointName; - // TODO: replace Serializable by a POJO or use several event types (like SectionXUpdated, SectionYUpdated) - public final Serializable mResponseObjectModel; - public SectionUpdated(StatsEndpointsEnum endPointName, String blogId, StatsTimeframe timeframe, String date, - final int maxResultsRequested, final int pageRequested, Serializable responseObjectModel) { - super(blogId, timeframe, date, maxResultsRequested, pageRequested); - mEndPointName = endPointName; - mResponseObjectModel = responseObjectModel; - } - } - public abstract static class SectionUpdatedAbstract { public final String mRequestBlogId; // This is the remote blog ID public final StatsTimeframe mTimeframe; @@ -224,6 +213,52 @@ public class StatsEvents { } } + public static class InsightsAllTimeUpdated extends SectionUpdatedAbstract { + + public final InsightsAllTimeModel mInsightsAllTimeModel; + + public InsightsAllTimeUpdated(String blogId, StatsTimeframe timeframe, String date, + final int maxResultsRequested, final int pageRequested, InsightsAllTimeModel responseObjectModel) { + super(blogId, timeframe, date, maxResultsRequested, pageRequested); + mInsightsAllTimeModel = responseObjectModel; + } + } + + public static class InsightsPopularUpdated extends SectionUpdatedAbstract { + + public final InsightsPopularModel mInsightsPopularModel; + + public InsightsPopularUpdated(String blogId, StatsTimeframe timeframe, String date, + final int maxResultsRequested, final int pageRequested, InsightsPopularModel responseObjectModel) { + super(blogId, timeframe, date, maxResultsRequested, pageRequested); + mInsightsPopularModel = responseObjectModel; + } + } + + public static class InsightsLatestPostSummaryUpdated extends SectionUpdatedAbstract { + + public final InsightsLatestPostModel mInsightsLatestPostModel; + + public InsightsLatestPostSummaryUpdated(String blogId, StatsTimeframe timeframe, String date, + final int maxResultsRequested, final int pageRequested, + InsightsLatestPostModel responseObjectModel) { + super(blogId, timeframe, date, maxResultsRequested, pageRequested); + mInsightsLatestPostModel = responseObjectModel; + } + } + + public static class InsightsLatestPostDetailsUpdated extends SectionUpdatedAbstract { + + public final InsightsLatestPostDetailsModel mInsightsLatestPostDetailsModel; + + public InsightsLatestPostDetailsUpdated(String blogId, StatsTimeframe timeframe, String date, + final int maxResultsRequested, final int pageRequested, + InsightsLatestPostDetailsModel responseObjectModel) { + super(blogId, timeframe, date, maxResultsRequested, pageRequested); + mInsightsLatestPostDetailsModel = responseObjectModel; + } + } + public static class JetpackSettingsCompleted { public final boolean isError; public JetpackSettingsCompleted(boolean isError) { diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsFollowersFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsFollowersFragment.java index 997f2cb35..11445abe2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsFollowersFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsFollowersFragment.java @@ -85,11 +85,11 @@ public class StatsFollowersFragment extends StatsAbstractListFragment { private FollowersModel mFollowersEmail; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mFollowersWPCOM != null && mFollowersEmail != null; } @Override - protected void savePreviousData(Bundle outState) { + protected void saveStatsData(Bundle outState) { if (mFollowersWPCOM != null) { outState.putSerializable(ARG_REST_RESPONSE, mFollowersWPCOM); } @@ -98,7 +98,7 @@ public class StatsFollowersFragment extends StatsAbstractListFragment { } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mFollowersWPCOM = (FollowersModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } @@ -265,7 +265,7 @@ public class StatsFollowersFragment extends StatsAbstractListFragment { @Override protected boolean isViewAllOptionAvailable() { - if (!hasPreviousDataAvailable()) { + if (!hasDataAvailable()) { return false; } FollowersModel followersModel = getCurrentDataModel(); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsGeoviewsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsGeoviewsFragment.java index 8dbbfa149..e773780c5 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsGeoviewsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsGeoviewsFragment.java @@ -33,17 +33,17 @@ public class StatsGeoviewsFragment extends StatsAbstractListFragment { private GeoviewsModel mCountries; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mCountries != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, mCountries); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mCountries = (GeoviewsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsAllTimeFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsAllTimeFragment.java index ec4bc1176..e0fdf7a43 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsAllTimeFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsAllTimeFragment.java @@ -1,5 +1,7 @@ package org.wordpress.android.ui.stats; +import android.os.Bundle; +import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; @@ -13,15 +15,61 @@ import org.wordpress.android.util.FormatUtils; public class StatsInsightsAllTimeFragment extends StatsAbstractInsightsFragment { public static final String TAG = StatsInsightsAllTimeFragment.class.getSimpleName(); + InsightsAllTimeModel mInsightsAllTimeModel; + + @Override + protected boolean hasDataAvailable() { + return mInsightsAllTimeModel != null; + } + @Override + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { + outState.putSerializable(ARG_REST_RESPONSE, mInsightsAllTimeModel); + } + } + @Override + protected void restoreStatsData(Bundle savedInstanceState) { + if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { + mInsightsAllTimeModel = (InsightsAllTimeModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); + } + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.InsightsAllTimeUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { + return; + } + + mInsightsAllTimeModel = event.mInsightsAllTimeModel; + updateUI(); + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.SectionUpdateError event) { + if (!shouldUpdateFragmentOnErrorEvent(event)) { + return; + } + + mInsightsAllTimeModel = null; + showErrorUI(event.mError); + } + + + protected void updateUI() { + if (!isAdded()) { + return; + } - void customizeUIWithResults() { // Another check that the data is available - if (isDataEmpty(0) || !(mDatamodels[0] instanceof InsightsAllTimeModel)) { - showErrorUI(null); + if (!hasDataAvailable()) { + showErrorUI(); return; } - InsightsAllTimeModel data = (InsightsAllTimeModel) mDatamodels[0]; + // not an error - update the module UI here + mErrorLabel.setVisibility(View.GONE); + mResultContainer.setVisibility(View.VISIBLE); + mEmptyModulePlaceholder.setVisibility(View.GONE); mResultContainer.removeAllViews(); @@ -35,13 +83,13 @@ public class StatsInsightsAllTimeFragment extends StatsAbstractInsightsFragment TextView besteverDateTextView = (TextView) ll.findViewById(R.id.stats_all_time_bestever_date); - postsTextView.setText(FormatUtils.formatDecimal(data.getPosts())); - viewsTextView.setText(FormatUtils.formatDecimal(data.getViews())); - visitorsTextView.setText(FormatUtils.formatDecimal(data.getVisitors())); + postsTextView.setText(FormatUtils.formatDecimal(mInsightsAllTimeModel.getPosts())); + viewsTextView.setText(FormatUtils.formatDecimal(mInsightsAllTimeModel.getViews())); + visitorsTextView.setText(FormatUtils.formatDecimal(mInsightsAllTimeModel.getVisitors())); - besteverTextView.setText(FormatUtils.formatDecimal(data.getViewsBestDayTotal())); + besteverTextView.setText(FormatUtils.formatDecimal(mInsightsAllTimeModel.getViewsBestDayTotal())); besteverDateTextView.setText( - StatsUtils.parseDate(data.getViewsBestDay(), StatsConstants.STATS_INPUT_DATE_FORMAT, "MMMM dd, yyyy") + StatsUtils.parseDate(mInsightsAllTimeModel.getViewsBestDay(), StatsConstants.STATS_INPUT_DATE_FORMAT, "MMMM dd, yyyy") ); mResultContainer.addView(ll); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java index a8b797c5e..dea8a9281 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsLatestPostSummaryFragment.java @@ -1,6 +1,7 @@ package org.wordpress.android.ui.stats; import android.graphics.drawable.Drawable; +import android.os.Bundle; import android.text.Spannable; import android.text.SpannableString; import android.text.style.ForegroundColorSpan; @@ -10,12 +11,9 @@ import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; -import com.android.volley.VolleyError; - import org.apache.commons.lang.StringEscapeUtils; import org.wordpress.android.R; import org.wordpress.android.ui.ActivityLauncher; -import org.wordpress.android.ui.stats.exceptions.StatsError; import org.wordpress.android.ui.stats.models.InsightsLatestPostDetailsModel; import org.wordpress.android.ui.stats.models.InsightsLatestPostModel; import org.wordpress.android.ui.stats.models.PostModel; @@ -25,81 +23,111 @@ import org.wordpress.android.util.FormatUtils; public class StatsInsightsLatestPostSummaryFragment extends StatsAbstractInsightsFragment { public static final String TAG = StatsInsightsLatestPostSummaryFragment.class.getSimpleName(); + private static final String ARG_REST_RESPONSE_DETAILS = "ARG_REST_RESPONSE_DETAILS"; + + private InsightsLatestPostModel mInsightsLatestPostModel; + private InsightsLatestPostDetailsModel mInsightsLatestPostDetailsModel; + @Override - public void onEventMainThread(StatsEvents.SectionUpdated event) { - if (!isAdded()) { + protected boolean hasDataAvailable() { + return mInsightsLatestPostModel != null && mInsightsLatestPostDetailsModel != null; + } + @Override + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { + outState.putSerializable(ARG_REST_RESPONSE, mInsightsLatestPostModel); + outState.putSerializable(ARG_REST_RESPONSE_DETAILS, mInsightsLatestPostDetailsModel); + } + } + @Override + protected void restoreStatsData(Bundle savedInstanceState) { + if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { + mInsightsLatestPostModel = (InsightsLatestPostModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); + } + if (savedInstanceState.containsKey(ARG_REST_RESPONSE_DETAILS)) { + mInsightsLatestPostDetailsModel = (InsightsLatestPostDetailsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE_DETAILS); + } + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.InsightsLatestPostSummaryUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { return; } - // This is just an optimization - if (event.mEndPointName != StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS && - event.mEndPointName != StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_SUMMARY) { + mInsightsLatestPostModel = event.mInsightsLatestPostModel; + + // check if there is a post "published" on the blog + View mainView = getView(); + if (mainView != null) { + mainView.setVisibility(mInsightsLatestPostModel.isLatestPostAvailable() ? View.VISIBLE : View.GONE); + } + if (!mInsightsLatestPostModel.isLatestPostAvailable()) { + // No need to go further into UI updating. There are no posts on this blog and the + // entire fragment is hidden. return; } - if (event.mEndPointName != StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS) { - super.onEventMainThread(event); + // Check if we already have the number of "views" for the latest post + if (mInsightsLatestPostModel.getPostViewsCount() == Integer.MIN_VALUE) { + // we don't have the views count. Need to call the service again here + refreshStats(mInsightsLatestPostModel.getPostID(), + new StatsService.StatsEndpointsEnum[]{StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS}); + showPlaceholderUI(); } else { + updateUI(); + } + } - // Check the response of the 2nd rest call before going deeper into updating the UI. - if (event.mResponseObjectModel instanceof VolleyError || - event.mResponseObjectModel instanceof StatsError) { - showErrorUI(event.mResponseObjectModel); - return; - } + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.InsightsLatestPostDetailsUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { + return; + } - // Here an another additional check that ensures the main data returned from the 1st call is available. - if (isDataEmpty(0) || !(mDatamodels[0] instanceof InsightsLatestPostModel)) { - showErrorUI(null); - return; - } + mInsightsLatestPostDetailsModel = event.mInsightsLatestPostDetailsModel; + mInsightsLatestPostModel.setPostViewsCount(mInsightsLatestPostDetailsModel.getPostViewsCount()); + updateUI(); + } - if (event.mResponseObjectModel == null || - !(event.mResponseObjectModel instanceof InsightsLatestPostDetailsModel)) { - showErrorUI(null); - return; - } - final InsightsLatestPostModel latestPostModel = (InsightsLatestPostModel) mDatamodels[0]; - latestPostModel.setPostViewsCount(((InsightsLatestPostDetailsModel) event.mResponseObjectModel).getPostViewsCount()); - updateUI(); + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.SectionUpdateError event) { + + if (!shouldUpdateFragmentOnErrorEvent(event) + && event.mEndPointName != StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS ) { + return; } + + mInsightsLatestPostDetailsModel = null; + mInsightsLatestPostModel = null; + showErrorUI(event.mError); } - void customizeUIWithResults() { + protected void updateUI() { if (!isAdded()) { return; } + + // not an error - update the module UI here + mErrorLabel.setVisibility(View.GONE); + mResultContainer.setVisibility(View.VISIBLE); + mEmptyModulePlaceholder.setVisibility(View.GONE); + mResultContainer.removeAllViews(); // Another additional check. It ensures that the data is available. - if (isDataEmpty(0) || !(mDatamodels[0] instanceof InsightsLatestPostModel)) { - showErrorUI(null); - return; + if (!hasDataAvailable()) { + showErrorUI(); } - final InsightsLatestPostModel latestPostModel = (InsightsLatestPostModel) mDatamodels[0]; - // check if there are posts "published" on the blog - View mainView = getView(); - if (mainView != null) { - mainView.setVisibility(latestPostModel.isLatestPostAvailable() ? View.VISIBLE : View.GONE); - } - if (!latestPostModel.isLatestPostAvailable()) { + if (!mInsightsLatestPostModel.isLatestPostAvailable()) { // No need to go further into UI updating. There are no posts on this blog and the // entire fragment is hidden. return; } - // Check if we already have the number of "views" for the latest post - if (latestPostModel.getPostViewsCount() == Integer.MIN_VALUE) { - // we don't have the views count. Need to call the service again here - refreshStats(latestPostModel.getPostID(), - new StatsService.StatsEndpointsEnum[]{StatsService.StatsEndpointsEnum.INSIGHTS_LATEST_POST_VIEWS}); - showPlaceholderUI(); - return; - } - - TextView moduleTitle = (TextView) mainView.findViewById(R.id.stats_module_title); + TextView moduleTitle = (TextView) getView().findViewById(R.id.stats_module_title); moduleTitle.setOnClickListener(ViewsTabOnClickListener); moduleTitle.setTextColor(getResources().getColor(R.color.stats_link_text_color)); @@ -110,10 +138,10 @@ public class StatsInsightsLatestPostSummaryFragment extends StatsAbstractInsight String trendLabel = getString(R.string.stats_insights_latest_post_trend); String sinceLabel = StatsUtils.getSinceLabel( getActivity(), - latestPostModel.getPostDate() + mInsightsLatestPostModel.getPostDate() ).toLowerCase(); - String postTitle = StringEscapeUtils.unescapeHtml(latestPostModel.getPostTitle()); + String postTitle = StringEscapeUtils.unescapeHtml(mInsightsLatestPostModel.getPostTitle()); final String trendLabelFormatted = String.format( trendLabel, sinceLabel, postTitle); @@ -130,10 +158,10 @@ public class StatsInsightsLatestPostSummaryFragment extends StatsAbstractInsight @Override public void onClick(View v) { StatsUtils.openPostInReaderOrInAppWebview(getActivity(), - latestPostModel.getBlogID(), - String.valueOf(latestPostModel.getPostID()), + mInsightsLatestPostModel.getBlogID(), + String.valueOf(mInsightsLatestPostModel.getPostID()), StatsConstants.ITEM_TYPE_POST, - latestPostModel.getPostURL()); + mInsightsLatestPostModel.getPostURL()); } }); @@ -143,13 +171,13 @@ public class StatsInsightsLatestPostSummaryFragment extends StatsAbstractInsight LinearLayout currentTab = (LinearLayout) tabs.getChildAt(i); switch (i) { case 0: - setupTab(currentTab, FormatUtils.formatDecimal(latestPostModel.getPostViewsCount()), StatsVisitorsAndViewsFragment.OverviewLabel.VIEWS); + setupTab(currentTab, FormatUtils.formatDecimal(mInsightsLatestPostModel.getPostViewsCount()), StatsVisitorsAndViewsFragment.OverviewLabel.VIEWS); break; case 1: - setupTab(currentTab, FormatUtils.formatDecimal(latestPostModel.getPostLikeCount()), StatsVisitorsAndViewsFragment.OverviewLabel.LIKES); + setupTab(currentTab, FormatUtils.formatDecimal(mInsightsLatestPostModel.getPostLikeCount()), StatsVisitorsAndViewsFragment.OverviewLabel.LIKES); break; case 2: - setupTab(currentTab, FormatUtils.formatDecimal(latestPostModel.getPostCommentCount()), StatsVisitorsAndViewsFragment.OverviewLabel.COMMENTS); + setupTab(currentTab, FormatUtils.formatDecimal(mInsightsLatestPostModel.getPostCommentCount()), StatsVisitorsAndViewsFragment.OverviewLabel.COMMENTS); break; } } @@ -204,17 +232,16 @@ public class StatsInsightsLatestPostSummaryFragment extends StatsAbstractInsight } // Another check that the data is available - if (isDataEmpty(0) || !(mDatamodels[0] instanceof InsightsLatestPostModel)) { - showErrorUI(null); + if (mInsightsLatestPostModel == null) { + showErrorUI(); return; } - InsightsLatestPostModel latestPostModel = (InsightsLatestPostModel) mDatamodels[0]; PostModel postModel = new PostModel( - latestPostModel.getBlogID(), - String.valueOf(latestPostModel.getPostID()), - latestPostModel.getPostTitle(), - latestPostModel.getPostURL(), + mInsightsLatestPostModel.getBlogID(), + String.valueOf(mInsightsLatestPostModel.getPostID()), + mInsightsLatestPostModel.getPostTitle(), + mInsightsLatestPostModel.getPostURL(), StatsConstants.ITEM_TYPE_POST); ActivityLauncher.viewStatsSinglePostDetails(getActivity(), postModel); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsMostPopularFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsMostPopularFragment.java index 4079f5c6b..14f27fa9b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsMostPopularFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsMostPopularFragment.java @@ -1,5 +1,7 @@ package org.wordpress.android.ui.stats; +import android.os.Bundle; +import android.view.View; import android.view.ViewGroup; import android.widget.LinearLayout; import android.widget.TextView; @@ -16,22 +18,67 @@ import java.util.Calendar; public class StatsInsightsMostPopularFragment extends StatsAbstractInsightsFragment { public static final String TAG = StatsInsightsMostPopularFragment.class.getSimpleName(); + private InsightsPopularModel mInsightsPopularModel; + + @Override + protected boolean hasDataAvailable() { + return mInsightsPopularModel != null; + } + @Override + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { + outState.putSerializable(ARG_REST_RESPONSE, mInsightsPopularModel); + } + } + @Override + protected void restoreStatsData(Bundle savedInstanceState) { + if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { + mInsightsPopularModel = (InsightsPopularModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); + } + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.InsightsPopularUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { + return; + } + + mInsightsPopularModel = event.mInsightsPopularModel; + updateUI(); + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.SectionUpdateError event) { + if (!shouldUpdateFragmentOnErrorEvent(event)) { + return; + } + + mInsightsPopularModel = null; + showErrorUI(event.mError); + } + + protected void updateUI() { + if (!isAdded()) { + return; + } + + // not an error - update the module UI here + mErrorLabel.setVisibility(View.GONE); + mResultContainer.setVisibility(View.VISIBLE); + mEmptyModulePlaceholder.setVisibility(View.GONE); - void customizeUIWithResults() { mResultContainer.removeAllViews(); // Another check that the data is available - if (isDataEmpty(0) || !(mDatamodels[0] instanceof InsightsPopularModel)) { - showErrorUI(null); + if (!hasDataAvailable()) { + showErrorUI(); return; } - InsightsPopularModel data = (InsightsPopularModel) mDatamodels[0]; - LinearLayout ll = (LinearLayout) getActivity().getLayoutInflater() .inflate(R.layout.stats_insights_most_popular_item, (ViewGroup) mResultContainer.getRootView(), false); - int dayOfTheWeek = data.getHighestDayOfWeek(); + int dayOfTheWeek = mInsightsPopularModel.getHighestDayOfWeek(); Calendar c = Calendar.getInstance(); c.setFirstDayOfWeek(Calendar.MONDAY); @@ -67,20 +114,20 @@ public class StatsInsightsMostPopularFragment extends StatsAbstractInsightsFragm mostPopularDayPercentTextView.setText( String.format( getString(R.string.stats_insights_most_popular_percent_views), - roundToInteger(data.getHighestDayPercent()) + roundToInteger(mInsightsPopularModel.getHighestDayPercent()) ) ); TextView mostPopularHourTextView = (TextView) ll.findViewById(R.id.stats_most_popular_hour); DateFormat timeFormat = android.text.format.DateFormat.getTimeFormat(getActivity()); - c.set(Calendar.HOUR_OF_DAY, data.getHighestHour()); + c.set(Calendar.HOUR_OF_DAY, mInsightsPopularModel.getHighestHour()); c.set(Calendar.MINUTE, 0); mostPopularHourTextView.setText(timeFormat.format(c.getTime())); final TextView mostPopularHourPercentTextView = (TextView) ll.findViewById(R.id.stats_most_popular_hour_percent); mostPopularHourPercentTextView.setText( String.format( getString(R.string.stats_insights_most_popular_percent_views), - roundToInteger(data.getHighestHourPercent()) + roundToInteger(mInsightsPopularModel.getHighestHourPercent()) ) ); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsTodayFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsTodayFragment.java index 03de5b776..de28a14d2 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsTodayFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsInsightsTodayFragment.java @@ -49,22 +49,68 @@ public class StatsInsightsTodayFragment extends StatsAbstractInsightsFragment { return view; } - void customizeUIWithResults() { - mResultContainer.removeAllViews(); - // Another check that the data is available - if (isDataEmpty(0) || !(mDatamodels[0] instanceof VisitsModel)) { - showErrorUI(null); + private VisitsModel mVisitsModel; + + @Override + protected boolean hasDataAvailable() { + return mVisitsModel != null; + } + @Override + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { + outState.putSerializable(ARG_REST_RESPONSE, mVisitsModel); + } + } + @Override + protected void restoreStatsData(Bundle savedInstanceState) { + if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { + mVisitsModel = (VisitsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); + } + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.VisitorsAndViewsUpdated event) { + if (!shouldUpdateFragmentOnUpdateEvent(event)) { + return; + } + + mVisitsModel = event.mVisitsAndViews; + updateUI(); + } + + @SuppressWarnings("unused") + public void onEventMainThread(StatsEvents.SectionUpdateError event) { + if (!shouldUpdateFragmentOnErrorEvent(event)) { return; } - VisitsModel visitsModel = (VisitsModel) mDatamodels[0]; - if (visitsModel.getVisits() == null || visitsModel.getVisits().size() == 0) { - showErrorUI(null); + mVisitsModel = null; + showErrorUI(event.mError); + } + + protected void updateUI() { + if (!isAdded()) { + return; + } + + if (!hasDataAvailable()) { + showErrorUI(); + return; + } + + // not an error - update the module UI here + mErrorLabel.setVisibility(View.GONE); + mResultContainer.setVisibility(View.VISIBLE); + mEmptyModulePlaceholder.setVisibility(View.GONE); + mResultContainer.removeAllViews(); + + if (mVisitsModel.getVisits() == null || mVisitsModel.getVisits().size() == 0) { + showErrorUI(); return; } - List<VisitModel> visits = visitsModel.getVisits(); + List<VisitModel> visits = mVisitsModel.getVisits(); VisitModel data = visits.get(visits.size() - 1); LinearLayout ll = (LinearLayout) getActivity().getLayoutInflater() diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsPublicizeFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsPublicizeFragment.java index c57237aa0..d6c4f81f0 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsPublicizeFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsPublicizeFragment.java @@ -25,17 +25,17 @@ public class StatsPublicizeFragment extends StatsAbstractListFragment { private PublicizeModel mPublicizeData; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mPublicizeData != null; } @Override - protected void savePreviousData(Bundle outState) { + protected void saveStatsData(Bundle outState) { if (mPublicizeData != null) { outState.putSerializable(ARG_REST_RESPONSE, mPublicizeData); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mPublicizeData = (PublicizeModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsReferrersFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsReferrersFragment.java index 0300f60c4..0284eeec9 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsReferrersFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsReferrersFragment.java @@ -27,17 +27,17 @@ public class StatsReferrersFragment extends StatsAbstractListFragment { private ReferrersModel mReferrers; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mReferrers != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, mReferrers); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mReferrers = (ReferrersModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSearchTermsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSearchTermsFragment.java index 0a744c4d8..0ec27719b 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSearchTermsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsSearchTermsFragment.java @@ -25,17 +25,17 @@ public class StatsSearchTermsFragment extends StatsAbstractListFragment { private SearchTermsModel mSearchTerms; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mSearchTerms != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, mSearchTerms); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mSearchTerms = (SearchTermsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } @@ -67,11 +67,6 @@ public class StatsSearchTermsFragment extends StatsAbstractListFragment { return; } - if (isErrorResponse()) { - showErrorUI(); - return; - } - if (hasSearchTerms()) { /** diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTagsAndCategoriesFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTagsAndCategoriesFragment.java index d32bff5a1..3128adee6 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTagsAndCategoriesFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTagsAndCategoriesFragment.java @@ -24,17 +24,17 @@ public class StatsTagsAndCategoriesFragment extends StatsAbstractListFragment { private TagsContainerModel mTagsContainer; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mTagsContainer != null; } @Override - protected void savePreviousData(Bundle outState) { + protected void saveStatsData(Bundle outState) { if (mTagsContainer != null) { outState.putSerializable(ARG_REST_RESPONSE, mTagsContainer); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mTagsContainer = (TagsContainerModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTopPostsAndPagesFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTopPostsAndPagesFragment.java index 3b0383d31..be15932b8 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTopPostsAndPagesFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsTopPostsAndPagesFragment.java @@ -19,17 +19,17 @@ public class StatsTopPostsAndPagesFragment extends StatsAbstractListFragment { private TopPostsAndPagesModel topPostsAndPagesModel = null; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return topPostsAndPagesModel != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, topPostsAndPagesModel); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { topPostsAndPagesModel = (TopPostsAndPagesModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVideoplaysFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVideoplaysFragment.java index e0b7d6f0c..906299f74 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVideoplaysFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVideoplaysFragment.java @@ -23,17 +23,17 @@ public class StatsVideoplaysFragment extends StatsAbstractListFragment { private VideoPlaysModel mVideos; @Override - protected boolean hasPreviousDataAvailable() { + protected boolean hasDataAvailable() { return mVideos != null; } @Override - protected void savePreviousData(Bundle outState) { - if (hasPreviousDataAvailable()) { + protected void saveStatsData(Bundle outState) { + if (hasDataAvailable()) { outState.putSerializable(ARG_REST_RESPONSE, mVideos); } } @Override - protected void restorePreviousData(Bundle savedInstanceState) { + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mVideos = (VideoPlaysModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVisitorsAndViewsFragment.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVisitorsAndViewsFragment.java index 61ea8a9f4..d8bfc0e25 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVisitorsAndViewsFragment.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/StatsVisitorsAndViewsFragment.java @@ -36,8 +36,6 @@ import java.util.Calendar; import java.util.Date; import java.util.List; -import de.greenrobot.event.EventBus; - public class StatsVisitorsAndViewsFragment extends StatsAbstractFragment implements StatsBarGraph.OnGestureListener { @@ -59,7 +57,7 @@ public class StatsVisitorsAndViewsFragment extends StatsAbstractFragment private CheckedTextView mLegendLabel; private LinearLayout mVisitorsCheckboxContainer; private CheckBox mVisitorsCheckbox; - private boolean mIsCheckboxChecked; + private boolean mIsCheckboxChecked = true; private OnDateChangeListener mListener; private OnOverviewItemChangeListener mOverviewItemChangeListener; @@ -266,9 +264,21 @@ public class StatsVisitorsAndViewsFragment extends StatsAbstractFragment } }; + + @Override + protected boolean hasDataAvailable() { + return mVisitsData != null; + } + @Override + protected void saveStatsData(Bundle outState) { + outState.putSerializable(ARG_REST_RESPONSE, mVisitsData); + outState.putInt(ARG_SELECTED_GRAPH_BAR, mSelectedBarGraphBarIndex); + outState.putInt(ARG_PREV_NUMBER_OF_BARS, mPrevNumberOfBarsGraph); + outState.putInt(ARG_SELECTED_OVERVIEW_ITEM, mSelectedOverviewItemIndex); + outState.putBoolean(ARG_CHECKBOX_SELECTED, mVisitorsCheckbox.isChecked()); + } @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); + protected void restoreStatsData(Bundle savedInstanceState) { if (savedInstanceState != null) { if (savedInstanceState.containsKey(ARG_REST_RESPONSE)) { mVisitsData = (VisitsModel) savedInstanceState.getSerializable(ARG_REST_RESPONSE); @@ -284,56 +294,17 @@ public class StatsVisitorsAndViewsFragment extends StatsAbstractFragment } mIsCheckboxChecked = savedInstanceState.getBoolean(ARG_CHECKBOX_SELECTED, true); - } else { - mIsCheckboxChecked = true; } } @Override - public void onSaveInstanceState(Bundle outState) { - //AppLog.d(T.STATS, "StatsVisitorsAndViewsFragment > saving instance state"); - - /* FIX for https://github.com/wordpress-mobile/WordPress-Android/issues/2228 - if (mVisitsData != null && mVisitsData instanceof VolleyError) { - VolleyError currentVolleyError = (VolleyError) mVisitsData; - mVisitsData = StatsUtils.rewriteVolleyError(currentVolleyError, getString(R.string.error_refresh_stats)); - }*/ - - outState.putSerializable(ARG_REST_RESPONSE, mVisitsData); - outState.putInt(ARG_SELECTED_GRAPH_BAR, mSelectedBarGraphBarIndex); - outState.putInt(ARG_PREV_NUMBER_OF_BARS, mPrevNumberOfBarsGraph); - outState.putInt(ARG_SELECTED_OVERVIEW_ITEM, mSelectedOverviewItemIndex); - outState.putBoolean(ARG_CHECKBOX_SELECTED, mVisitorsCheckbox.isChecked()); - - super.onSaveInstanceState(outState); - } - - @Override - public void onStart() { - super.onStart(); - EventBus.getDefault().register(this); - } - - @Override - public void onStop() { - EventBus.getDefault().unregister(this); - super.onStop(); + protected void showErrorUI(String label) { + setupNoResultsUI(false); } @Override - public void onResume() { - super.onResume(); - - if (mVisitsData != null) { - updateUI(); - } else { - if (NetworkUtils.isNetworkAvailable(getActivity())) { - setupNoResultsUI(true); - refreshStats(); - } else { - setupNoResultsUI(false); - } - } + protected void showPlaceholderUI() { + setupNoResultsUI(true); } private VisitModel[] getDataToShowOnGraph(VisitsModel visitsData) { @@ -350,7 +321,7 @@ public class StatsVisitorsAndViewsFragment extends StatsAbstractFragment return visitModelsToShow; } - private void updateUI() { + protected void updateUI() { if (!isAdded()) { return; } diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/InsightsPopularModel.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/InsightsPopularModel.java index 1258fa5f6..5a8c14051 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/InsightsPopularModel.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/InsightsPopularModel.java @@ -10,7 +10,7 @@ public class InsightsPopularModel extends BaseStatsModel { private final Double mHighestHourPercent; private String mBlogID; - public InsightsPopularModel(String blogID, JSONObject response) throws JSONException { + public InsightsPopularModel(String blogID, JSONObject response) { this.setBlogID(blogID); this.mHighestDayOfWeek = response.optInt("highest_day_of_week"); this.mHighestHour = response.optInt("highest_hour"); diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/service/StatsService.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/service/StatsService.java index 8fdc3d847..2390e769d 100644 --- a/WordPress/src/main/java/org/wordpress/android/ui/stats/service/StatsService.java +++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/service/StatsService.java @@ -27,6 +27,10 @@ import org.wordpress.android.ui.stats.models.CommentFollowersModel; import org.wordpress.android.ui.stats.models.CommentsModel; import org.wordpress.android.ui.stats.models.FollowersModel; import org.wordpress.android.ui.stats.models.GeoviewsModel; +import org.wordpress.android.ui.stats.models.InsightsAllTimeModel; +import org.wordpress.android.ui.stats.models.InsightsLatestPostDetailsModel; +import org.wordpress.android.ui.stats.models.InsightsLatestPostModel; +import org.wordpress.android.ui.stats.models.InsightsPopularModel; import org.wordpress.android.ui.stats.models.PublicizeModel; import org.wordpress.android.ui.stats.models.ReferrersModel; import org.wordpress.android.ui.stats.models.SearchTermsModel; @@ -176,10 +180,26 @@ public class StatsService extends Service { case FOLLOWERS_EMAIL: return new StatsEvents.FollowersEmailUdated(blogId, timeframe, date, maxResultsRequested, pageRequested, (FollowersModel)data); + case INSIGHTS_POPULAR: + return new StatsEvents.InsightsPopularUpdated(blogId, timeframe, date, + maxResultsRequested, pageRequested, (InsightsPopularModel)data); + case INSIGHTS_ALL_TIME: + return new StatsEvents.InsightsAllTimeUpdated(blogId, timeframe, date, + maxResultsRequested, pageRequested, (InsightsAllTimeModel)data); + case INSIGHTS_TODAY: + return new StatsEvents.VisitorsAndViewsUpdated(blogId, timeframe, date, + maxResultsRequested, pageRequested, (VisitsModel)data); + case INSIGHTS_LATEST_POST_SUMMARY: + return new StatsEvents.InsightsLatestPostSummaryUpdated(blogId, timeframe, date, + maxResultsRequested, pageRequested, (InsightsLatestPostModel)data); + case INSIGHTS_LATEST_POST_VIEWS: + return new StatsEvents.InsightsLatestPostDetailsUpdated(blogId, timeframe, date, + maxResultsRequested, pageRequested, (InsightsLatestPostDetailsModel)data); default: - return new StatsEvents.SectionUpdated(this, blogId, timeframe, date, - maxResultsRequested, pageRequested, data); + AppLog.e(T.STATS, "Can't find an Update Event that match the current endpoint: " + this.name()); } + + return null; } } @@ -563,8 +583,6 @@ public class StatsService extends Service { EventBus.getDefault().post(new StatsEvents.SectionUpdateError(mEndpointName, mRequestBlogId, mTimeframe, mDate, mMaxResultsRequested, mPageRequested, volleyError)); - EventBus.getDefault().post(new StatsEvents.SectionUpdated(mEndpointName, mRequestBlogId, mTimeframe, mDate, - mMaxResultsRequested, mPageRequested, volleyError)); updateWidgetsUI(mRequestBlogId, mEndpointName, mTimeframe, mDate, mPageRequested, mResponseObjectModel); checkAllRequestsFinished(currentRequest); } |