aboutsummaryrefslogtreecommitdiff
path: root/WordPress/src/main/java/org/wordpress/android/ui/stats/models/PostViewsModel.java
diff options
context:
space:
mode:
Diffstat (limited to 'WordPress/src/main/java/org/wordpress/android/ui/stats/models/PostViewsModel.java')
-rw-r--r--WordPress/src/main/java/org/wordpress/android/ui/stats/models/PostViewsModel.java370
1 files changed, 370 insertions, 0 deletions
diff --git a/WordPress/src/main/java/org/wordpress/android/ui/stats/models/PostViewsModel.java b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/PostViewsModel.java
new file mode 100644
index 000000000..5beb0df95
--- /dev/null
+++ b/WordPress/src/main/java/org/wordpress/android/ui/stats/models/PostViewsModel.java
@@ -0,0 +1,370 @@
+package org.wordpress.android.ui.stats.models;
+
+import org.json.JSONArray;
+import org.json.JSONException;
+import org.json.JSONObject;
+import org.wordpress.android.util.AppLog;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+
+public class PostViewsModel implements Serializable {
+ private String mOriginalResponse;
+
+ private int mHighestMonth, mHighestDayAverage, mHighestWeekAverage;
+ private String mDate;
+ private VisitModel[] mDayViews; //Used to build the graph
+ private List<Year> mYears;
+ private List<Year> mAverages;
+ private List<Week> mWeeks;
+
+ public String getDate() {
+ return mDate;
+ }
+
+ public String getOriginalResponse() {
+ return mOriginalResponse;
+ }
+
+ public VisitModel[] getDayViews() {
+ return mDayViews;
+ }
+
+ public int getHighestMonth() {
+ return mHighestMonth;
+ }
+
+ public int getHighestDayAverage() {
+ return mHighestDayAverage;
+ }
+
+ public int getHighestWeekAverage() {
+ return mHighestWeekAverage;
+ }
+
+ public List<Year> getYears() {
+ return mYears;
+ }
+
+ public List<Year> getAverages() {
+ return mAverages;
+ }
+
+ public List<Week> getWeeks() {
+ return mWeeks;
+ }
+
+
+ public PostViewsModel(String response) throws JSONException {
+ this.mOriginalResponse = response;
+ JSONObject responseObj = new JSONObject(response);
+ parseResponseObject(responseObj);
+ }
+
+ public PostViewsModel(JSONObject response) throws JSONException {
+ if (response == null) {
+ return;
+ }
+ this.mOriginalResponse = response.toString();
+ parseResponseObject(response);
+ }
+
+ private void parseResponseObject(JSONObject response) throws JSONException {
+
+ mDate = response.getString("date");
+ mHighestDayAverage = response.getInt("highest_day_average");
+ mHighestWeekAverage = response.getInt("highest_week_average");
+ mHighestMonth = response.getInt("highest_month");
+ mYears = new LinkedList<>();
+ mAverages = new LinkedList<>();
+ mWeeks = new LinkedList<>();
+
+ JSONArray dataJSON = response.getJSONArray("data");
+ if (dataJSON != null) {
+ // Read the position/index of each field in the response
+ JSONArray fieldsJSON = response.getJSONArray("fields");
+ HashMap<String, Integer> fieldColumnsMapping;
+ try {
+ fieldColumnsMapping = new HashMap<>(2);
+ for (int i = 0; i < fieldsJSON.length(); i++) {
+ final String field = fieldsJSON.getString(i);
+ fieldColumnsMapping.put(field, i);
+ }
+ } catch (JSONException e) {
+ AppLog.e(AppLog.T.STATS, "Cannot read the fields indexes from the JSON response", e);
+ throw e;
+ }
+
+ VisitModel[] visitModels = new VisitModel[dataJSON.length()];
+ int viewsColumnIndex = fieldColumnsMapping.get("views");
+ int periodColumnIndex = fieldColumnsMapping.get("period");
+
+ for (int i = 0; i < dataJSON.length(); i++) {
+ try {
+ JSONArray currentDayData = dataJSON.getJSONArray(i);
+ VisitModel currentVisitModel = new VisitModel();
+ currentVisitModel.setPeriod(currentDayData.getString(periodColumnIndex));
+ currentVisitModel.setViews(currentDayData.getInt(viewsColumnIndex));
+ visitModels[i] = currentVisitModel;
+ } catch (JSONException e) {
+ AppLog.e(AppLog.T.STATS, "Cannot create the Visit at index " + i, e);
+ }
+ }
+ mDayViews = visitModels;
+ } else {
+ mDayViews = null;
+ }
+
+ parseYears(response);
+ parseAverages(response);
+ parseWeeks(response);
+ }
+
+ private String[] orderKeys(Iterator keys, int numberOfKeys) {
+ // Keys could not be ordered fine. Reordering them.
+ String[] orderedKeys = new String[numberOfKeys];
+ int i = 0;
+ while (keys.hasNext()) {
+ orderedKeys[i] = (String)keys.next();
+ i++;
+ }
+ Arrays.sort(orderedKeys);
+ return orderedKeys;
+ }
+
+ private void parseYears(JSONObject response) {
+ // Parse the Years section
+ try {
+ JSONObject yearsJSON = response.getJSONObject("years");
+ // Keys could not be ordered fine. Reordering them.
+ String[] orderedKeys = orderKeys(yearsJSON.keys(), yearsJSON.length());
+
+ for (String currentYearKey : orderedKeys) {
+ Year currentYear = new Year();
+ currentYear.setLabel(currentYearKey);
+
+ JSONObject currentYearObj = yearsJSON.getJSONObject(currentYearKey);
+ int total = currentYearObj.getInt("total");
+ currentYear.setTotal(total);
+
+ JSONObject monthsJSON = currentYearObj.getJSONObject("months");
+ Iterator<String> monthsKeys = monthsJSON.keys();
+ List<Month> monthsList = new ArrayList<>(monthsJSON.length());
+ while (monthsKeys.hasNext()) {
+ String currentMonthKey = monthsKeys.next();
+ int currentMonthVisits = monthsJSON.getInt(currentMonthKey);
+ monthsList.add(new Month(currentMonthKey, currentMonthVisits));
+ }
+
+ Collections.sort(monthsList, new Comparator<Month>() {
+ public int compare(Month o1, Month o2) {
+ int v1 = Integer.parseInt(o1.getMonth());
+ int v2 = Integer.parseInt(o2.getMonth());
+ // ascending order
+ return v1 - v2;
+ }
+ });
+
+ currentYear.setMonths(monthsList);
+ mYears.add(currentYear);
+ }
+ } catch (JSONException e) {
+ AppLog.e(AppLog.T.STATS, "Cannot parse the Years section", e);
+ }
+ }
+
+ private void parseAverages(JSONObject response) {
+ // Parse the Averages section
+ try {
+ JSONObject averagesJSON = response.getJSONObject("averages");
+ // Keys could not be ordered fine. Reordering them.
+ String[] orderedKeys = orderKeys(averagesJSON.keys(), averagesJSON.length());
+
+ for (String currentJSONKey : orderedKeys) {
+ Year currentAverage = new Year();
+ currentAverage.setLabel(currentJSONKey);
+
+ JSONObject currentAverageJSONObj = averagesJSON.getJSONObject(currentJSONKey);
+ currentAverage.setTotal(currentAverageJSONObj.getInt("overall"));
+
+ JSONObject monthsJSON = currentAverageJSONObj.getJSONObject("months");
+ Iterator<String> monthsKeys = monthsJSON.keys();
+ List<Month> monthsList = new ArrayList<>(monthsJSON.length());
+ while (monthsKeys.hasNext()) {
+ String currentMonthKey = monthsKeys.next();
+ int currentMonthVisits = monthsJSON.getInt(currentMonthKey);
+ monthsList.add(new Month(currentMonthKey, currentMonthVisits));
+ }
+ Collections.sort(monthsList, new java.util.Comparator<Month>() {
+ public int compare(Month o1, Month o2) {
+ int v1 = Integer.parseInt(o1.getMonth());
+ int v2 = Integer.parseInt(o2.getMonth());
+ // ascending order
+ return v1 - v2;
+ }
+ });
+
+ currentAverage.setMonths(monthsList);
+ mAverages.add(currentAverage);
+ }
+ } catch (JSONException e) {
+ AppLog.e(AppLog.T.STATS, "Cannot parse the Averages section", e);
+ }
+ }
+
+ private void parseWeeks(JSONObject response) {
+ // Parse the Weeks section
+ try {
+ JSONArray weeksJSON = response.getJSONArray("weeks");
+ for (int i = 0; i < weeksJSON.length(); i++) {
+ Week currentWeek = new Week();
+ JSONObject currentWeekJSON = weeksJSON.getJSONObject(i);
+
+ currentWeek.setTotal(currentWeekJSON.getInt("total"));
+ currentWeek.setAverage(currentWeekJSON.getInt("average"));
+ try {
+ if (i == 0 ) {
+ currentWeek.setChange(0);
+ } else {
+ currentWeek.setChange(currentWeekJSON.getInt("change"));
+ }
+ } catch (JSONException e){
+ AppLog.w(AppLog.T.STATS, "Cannot parse the change value in weeks section. Trying to understand the meaning: 42!!");
+ // if i == 0 is the first week. if not it could mean infinity
+ String aProblematicValue = currentWeekJSON.get("change").toString();
+ if (aProblematicValue.contains("infinity")) {
+ currentWeek.setChange(Integer.MAX_VALUE);
+ } else {
+ currentWeek.setChange(0);
+ }
+ }
+
+ JSONArray daysJSON = currentWeekJSON.getJSONArray("days");
+ for (int j = 0; j < daysJSON.length(); j++) {
+ Day currentDay = new Day();
+ JSONObject dayJSON = daysJSON.getJSONObject(j);
+ currentDay.setCount(dayJSON.getInt("count"));
+ currentDay.setDay(dayJSON.getString("day"));
+ currentWeek.getDays().add(currentDay);
+ }
+ mWeeks.add(currentWeek);
+ }
+ } catch (JSONException e) {
+ AppLog.e(AppLog.T.STATS, "Cannot parse the Weeks section", e);
+ }
+ }
+
+ public class Day implements Serializable {
+ private int mCount;
+ private String mDay;
+
+ public String getDay() {
+ return mDay;
+ }
+
+ public void setDay(String day) {
+ this.mDay = day;
+ }
+
+ public int getCount() {
+ return mCount;
+ }
+
+ public void setCount(int count) {
+ this.mCount = count;
+ }
+ }
+
+ public class Week implements Serializable {
+ int mChange;
+ int mTotal;
+ int mAverage;
+ List<Day> mDays = new LinkedList<>();
+
+ public int getTotal() {
+ return mTotal;
+ }
+
+ public void setTotal(int total) {
+ this.mTotal = total;
+ }
+
+ public int getAverage() {
+ return mAverage;
+ }
+
+ public void setAverage(int average) {
+ this.mAverage = average;
+ }
+
+ public int getChange() {
+ return mChange;
+ }
+
+ public void setChange(int change) {
+ this.mChange = change;
+ }
+
+ public List<Day> getDays() {
+ return mDays;
+ }
+
+ public void setDays(List<Day> days) {
+ this.mDays = days;
+ }
+ }
+
+ public class Year implements Serializable {
+ private String mLabel;
+ private int mTotal;
+ private List<Month> mMonths;
+
+ public List<Month> getMonths() {
+ return mMonths;
+ }
+
+ public void setMonths(List<Month> months) {
+ mMonths = months;
+ }
+
+ public String getLabel() {
+ return mLabel;
+ }
+
+ public void setLabel(String label) {
+ this.mLabel = label;
+ }
+
+ public int getTotal() {
+ return mTotal;
+ }
+
+ public void setTotal(int total) {
+ this.mTotal = total;
+ }
+ }
+
+ public class Month implements Serializable {
+ private final int mCount;
+ private final String mMonth;
+
+ Month(String label, int count) {
+ this.mMonth = label;
+ this.mCount = count;
+ }
+
+ public String getMonth() {
+ return mMonth;
+ }
+ public int getCount() {
+ return mCount;
+ }
+ }
+} \ No newline at end of file