PageRenderTime 57ms CodeModel.GetById 17ms RepoModel.GetById 1ms app.codeStats 0ms

/aviasalestemplate/src/main/java/ru/aviasales/template/ui/model/SearchFormData.java

https://bitbucket.org/KillHacker/navigatofly
Java | 374 lines | 292 code | 82 blank | 0 comment | 55 complexity | be9070e432b2c9e03f754544a3a560ec MD5 | raw file
  1. package ru.aviasales.template.ui.model;
  2. import android.content.Context;
  3. import android.content.SharedPreferences;
  4. import java.text.SimpleDateFormat;
  5. import java.util.ArrayList;
  6. import java.util.Calendar;
  7. import java.util.Date;
  8. import java.util.List;
  9. import ru.aviasales.core.http.utils.CoreDateUtils;
  10. import ru.aviasales.core.search.params.Passengers;
  11. import ru.aviasales.core.search.params.SearchParams;
  12. import ru.aviasales.core.search_airports.object.PlaceData;
  13. import ru.aviasales.template.R;
  14. import ru.aviasales.template.utils.DateUtils;
  15. import ru.aviasales.template.utils.Defined;
  16. import ru.aviasales.template.utils.Utils;
  17. public class SearchFormData {
  18. private static final String SEARCH_PARAM_ORIGIN_NAME = "search_param_origin_name";
  19. private static final String SEARCH_PARAM_DESTINATION_NAME = "search_param_destination_name";
  20. private static final String SEARCH_PARAM_DEPART_DATE = "search_param_depart_date";
  21. private static final String SEARCH_PARAM_RETURN_DATE = "search_param_return_date";
  22. private static final String EXTRA_RETURN_ENABLED = "extra-return_enabled";
  23. private static final String COMPLEX_SEARCH_SEGMENTS_COUNT = "open_jaw_segments_count";
  24. private SimpleSearchParams simpleSearchParams;
  25. private List<ComplexSearchParamsSegment> complexSearchSegments;
  26. private String tripClass = SearchParams.TRIP_CLASS_ECONOMY;
  27. private Passengers passengers;
  28. private final Context context;
  29. public SearchFormData(Context context) {
  30. this.context = context;
  31. SharedPreferences prefs = Utils.getPreferences(context);
  32. loadSimpleSearchParams(prefs);
  33. loadComplexSearchParams(prefs);
  34. tripClass = prefs.getString(SearchParams.SEARCH_PARAM_TRIP_CLASS, SearchParams.TRIP_CLASS_ECONOMY);
  35. passengers = new Passengers();
  36. passengers.setAdults(prefs.getInt(SearchParams.SEARCH_PARAM_ADULTS, 1));
  37. passengers.setChildren(prefs.getInt(SearchParams.SEARCH_PARAM_CHILDREN, 0));
  38. passengers.setInfants(prefs.getInt(SearchParams.SEARCH_PARAM_INFANTS, 0));
  39. checkAndFixDates();
  40. }
  41. public SimpleSearchParams getSimpleSearchParams() {
  42. return simpleSearchParams;
  43. }
  44. public List<ComplexSearchParamsSegment> getComplexSearchSegments() {
  45. return complexSearchSegments;
  46. }
  47. private void checkAndFixDates() {
  48. checkAndFixSimpleSearchDates();
  49. checkAndFixComplexSearchDates();
  50. }
  51. private void checkAndFixSimpleSearchDates() {
  52. if (simpleSearchParams.getDepartDateString() != null) {
  53. Date dateWithFirstTimezone = DateUtils.getCurrentDateInGMTMinus11Timezone();
  54. dateWithFirstTimezone = DateUtils.getCurrentDayMidnight(dateWithFirstTimezone);
  55. if (simpleSearchParams.getDepartDate().before(dateWithFirstTimezone)) {
  56. simpleSearchParams.setDepartDate(getTodayDate());
  57. simpleSearchParams.setReturnDate((String) null);
  58. }
  59. } else {
  60. simpleSearchParams.setDepartDate(getTomorrowDate());
  61. }
  62. }
  63. public void checkAndFixComplexSearchDates() {
  64. Date minimumSegmentDate = DateUtils.getCurrentDateInGMTMinus11Timezone();
  65. minimumSegmentDate = DateUtils.getCurrentDayMidnight(minimumSegmentDate);
  66. for (int i = 0; i < complexSearchSegments.size(); i++) {
  67. if (complexSearchSegments.get(i).getStringDate() != null) {
  68. Date currentSegmentDate = getDate(complexSearchSegments.get(i).getStringDate());
  69. if (currentSegmentDate.before(minimumSegmentDate)) {
  70. complexSearchSegments.get(i).setDate(DateUtils.convertToString(minimumSegmentDate));
  71. } else {
  72. minimumSegmentDate = currentSegmentDate;
  73. }
  74. } else {
  75. if (i == 0) {
  76. complexSearchSegments.get(i).setDate(getTomorrowDate());
  77. }
  78. }
  79. }
  80. }
  81. private void loadComplexSearchParams(SharedPreferences prefs) {
  82. complexSearchSegments = new ArrayList<>();
  83. int segmentsSize = prefs.getInt(COMPLEX_SEARCH_SEGMENTS_COUNT, 2);
  84. complexSearchSegments.addAll(loadSegments(prefs, segmentsSize));
  85. }
  86. public void setSimpleSearchParams(SimpleSearchParams simpleSearchParams)
  87. {
  88. this.simpleSearchParams = simpleSearchParams;
  89. }
  90. private void loadSimpleSearchParams(SharedPreferences prefs) {
  91. simpleSearchParams = new SimpleSearchParams();
  92. simpleSearchParams.setOrigin(PlaceData.create(prefs.getString(SEARCH_PARAM_ORIGIN_NAME, null)));
  93. simpleSearchParams.setDestination(PlaceData.create(prefs.getString(SEARCH_PARAM_DESTINATION_NAME, null)));
  94. simpleSearchParams.setDepartDate(prefs.getString(SEARCH_PARAM_DEPART_DATE, null));
  95. simpleSearchParams.setReturnDate(prefs.getString(SEARCH_PARAM_RETURN_DATE, null));
  96. simpleSearchParams.setReturnEnabled(prefs.getBoolean(EXTRA_RETURN_ENABLED, false));
  97. }
  98. private List<ComplexSearchParamsSegment> loadSegments(SharedPreferences prefs, int segmentsSize) {
  99. List<ComplexSearchParamsSegment> segments = new ArrayList<>(segmentsSize);
  100. for (int i = 0; i < segmentsSize; i++) {
  101. String indexString = Integer.toString(i);
  102. segments.add(i, new ComplexSearchParamsSegment(
  103. PlaceData.create(prefs.getString(SearchParams.SEARCH_PARAM_ORIGIN_IATA.replace(SearchParams.SEGMENT_NUMBER,
  104. indexString), null)),
  105. PlaceData.create(prefs.getString(SearchParams.SEARCH_PARAM_DESTINATION_IATA.replace(SearchParams.SEGMENT_NUMBER,
  106. indexString), null)),
  107. prefs.getString(SearchParams.SEARCH_PARAM_DATE.replace(SearchParams.SEGMENT_NUMBER,
  108. indexString), null)
  109. ));
  110. }
  111. return segments;
  112. }
  113. private String getTomorrowDate() {
  114. Calendar calendar = Calendar.getInstance();
  115. calendar.add(Calendar.DAY_OF_MONTH, 1);
  116. return formatData(calendar);
  117. }
  118. private String getTodayDate() {
  119. Calendar calendar = Calendar.getInstance();
  120. return formatData(calendar);
  121. }
  122. public Passengers getPassengers() {
  123. return passengers;
  124. }
  125. private Date getDate(String date) {
  126. if (date == null) return null;
  127. return CoreDateUtils.parseDateString(date, Defined.SEARCH_SERVER_DATE_FORMAT);
  128. }
  129. private String formatData(Calendar calendar) {
  130. SimpleDateFormat sdf = new SimpleDateFormat(Defined.SEARCH_SERVER_DATE_FORMAT);
  131. return sdf.format(calendar.getTime());
  132. }
  133. public String getTripClass() {
  134. return tripClass;
  135. }
  136. public String getTripClassName() {
  137. switch (tripClass) {
  138. case SearchParams.TRIP_CLASS_ECONOMY:
  139. return Utils.capitalizeFirstLetter(context.getString(R.string.trip_class_economy));
  140. case SearchParams.TRIP_CLASS_BUSINESS:
  141. return Utils.capitalizeFirstLetter(context.getString(R.string.trip_class_business));
  142. }
  143. return null;
  144. }
  145. public SearchParams createSearchParams(boolean isComplexSearch) {
  146. SearchParams params = new SearchParams();
  147. params.setPassengers(passengers);
  148. params.setTripClass(tripClass);
  149. params.setContext(context.getApplicationContext());
  150. if (isComplexSearch) {
  151. params = createComplexSearchParams(params);
  152. } else {
  153. params = createSimpleSearchParams(params);
  154. }
  155. return params;
  156. }
  157. private SearchParams createComplexSearchParams(SearchParams params) {
  158. for (ComplexSearchParamsSegment paramsSegment : complexSearchSegments) {
  159. params.addSegment(paramsSegment.toSearchSegment());
  160. }
  161. return params;
  162. }
  163. private SearchParams createSimpleSearchParams(SearchParams params) {
  164. params.setSegments(simpleSearchParams.createSegments());
  165. return params;
  166. }
  167. public void saveState() {
  168. SharedPreferences.Editor editor = Utils.getPreferences(context).edit();
  169. putSimpleSearchParams(editor);
  170. putComplexSearchParams(editor);
  171. editor.putString(SearchParams.SEARCH_PARAM_TRIP_CLASS, tripClass)
  172. .putInt(SearchParams.SEARCH_PARAM_ADULTS, passengers.getAdults())
  173. .putInt(SearchParams.SEARCH_PARAM_CHILDREN, passengers.getChildren())
  174. .putInt(SearchParams.SEARCH_PARAM_INFANTS, passengers.getInfants())
  175. .putBoolean(EXTRA_RETURN_ENABLED, simpleSearchParams.isReturnEnabled())
  176. .apply();
  177. }
  178. private void putComplexSearchParams(SharedPreferences.Editor editor) {
  179. int i = 0;
  180. for (ComplexSearchParamsSegment complexSegment : complexSearchSegments) {
  181. if (complexSegment.getOrigin() != null) {
  182. editor.putString(SearchParams.SEARCH_PARAM_ORIGIN_IATA.replace(SearchParams.SEGMENT_NUMBER,
  183. Integer.toString(i)), complexSegment.getOrigin().serialize());
  184. } else {
  185. editor.remove(SearchParams.SEARCH_PARAM_ORIGIN_IATA.replace(SearchParams.SEGMENT_NUMBER,
  186. Integer.toString(i)));
  187. }
  188. if (complexSegment.getDestination() != null) {
  189. editor.putString(SearchParams.SEARCH_PARAM_DESTINATION_IATA.replace(SearchParams.SEGMENT_NUMBER,
  190. Integer.toString(i)), complexSegment.getDestination().serialize());
  191. } else {
  192. editor.remove(SearchParams.SEARCH_PARAM_DESTINATION_IATA.replace(SearchParams.SEGMENT_NUMBER,
  193. Integer.toString(i)));
  194. }
  195. if (complexSegment.getStringDate() != null) {
  196. editor.putString(SearchParams.SEARCH_PARAM_DATE.replace(SearchParams.SEGMENT_NUMBER,
  197. Integer.toString(i)), complexSegment.getStringDate());
  198. } else {
  199. editor.remove(SearchParams.SEARCH_PARAM_DATE.replace(SearchParams.SEGMENT_NUMBER,
  200. Integer.toString(i)));
  201. }
  202. i++;
  203. }
  204. editor.putInt(COMPLEX_SEARCH_SEGMENTS_COUNT, i);
  205. }
  206. private void putSimpleSearchParams(SharedPreferences.Editor editor) {
  207. String originSerialized = null;
  208. String destinationSerialized = null;
  209. if (simpleSearchParams.getOrigin() != null) {
  210. originSerialized = simpleSearchParams.getOrigin().serialize();
  211. }
  212. if (simpleSearchParams.getDestination() != null) {
  213. destinationSerialized = simpleSearchParams.getDestination().serialize();
  214. }
  215. editor.putString(SEARCH_PARAM_ORIGIN_NAME, originSerialized)
  216. .putString(SEARCH_PARAM_DESTINATION_NAME, destinationSerialized)
  217. .putString(SEARCH_PARAM_DEPART_DATE, simpleSearchParams.getDepartDateString())
  218. .putString(SEARCH_PARAM_RETURN_DATE, simpleSearchParams.getReturnDateString());
  219. }
  220. private boolean isSomeComplexSearchDatePassed() {
  221. for (ComplexSearchParamsSegment segment : complexSearchSegments) {
  222. if (DateUtils.isDateBeforeDateShiftLine(segment.getDate())) {
  223. return true;
  224. }
  225. }
  226. return false;
  227. }
  228. public void setTripClass(String tripClass) {
  229. this.tripClass = tripClass;
  230. }
  231. public void setPassengers(Passengers passengers) {
  232. this.passengers = passengers;
  233. }
  234. public boolean areDestinationsEqual(boolean isComplexSearchSelected) {
  235. if (isComplexSearchSelected) {
  236. for (ComplexSearchParamsSegment segment : complexSearchSegments) {
  237. if (segment.getOrigin().getIata().equals(segment.getDestination().getIata()) ||
  238. segment.getOrigin().getCityName().equals(segment.getDestination().getCityName()))
  239. return true;
  240. }
  241. return false;
  242. } else {
  243. return simpleSearchParams.areDestinationsEqual();
  244. }
  245. }
  246. public boolean areDestinationsSet(boolean isComplexSearch) {
  247. if (isComplexSearch) {
  248. for (ComplexSearchParamsSegment segment : complexSearchSegments) {
  249. if (segment.getOrigin() == null || segment.getDestination() == null) return true;
  250. }
  251. return false;
  252. } else {
  253. return simpleSearchParams.areDestinationsSet();
  254. }
  255. }
  256. public boolean isDepartureDateNotSet(boolean isComplexSearchSelected) {
  257. if (isComplexSearchSelected) {
  258. return areComplexParamsSomeDateNotSet();
  259. } else {
  260. return simpleSearchParams.getDepartDateString() == null;
  261. }
  262. }
  263. private boolean areComplexParamsSomeDateNotSet() {
  264. for (ComplexSearchParamsSegment segment : complexSearchSegments) {
  265. if (segment.getStringDate() == null) {
  266. return true;
  267. }
  268. }
  269. return false;
  270. }
  271. public boolean isDepartDatePassed(boolean isComplexSearchSelected) {
  272. if (isComplexSearchSelected) {
  273. return isSomeComplexSearchDatePassed();
  274. } else {
  275. return DateUtils.isDateBeforeDateShiftLine(simpleSearchParams.getDepartDate());
  276. }
  277. }
  278. public boolean isSimpleParamsNoReturnDateSet() {
  279. return simpleSearchParams.getReturnDateString() == null;
  280. }
  281. public boolean isSimpleSearchReturnDatePassed() {
  282. return DateUtils.isDateBeforeDateShiftLine(simpleSearchParams.getReturnDateString());
  283. }
  284. public boolean isSimpleSearchReturnEarlierThanDeparture() {
  285. return DateUtils.isFirstDateBeforeSecondDateWithDayAccuracy(getDate(simpleSearchParams.getReturnDateString()),
  286. simpleSearchParams.getDepartDate());
  287. }
  288. public boolean isSimpleSearchDatedMoreThanYearAhead() {
  289. return DateUtils.isDateMoreThanOneYearAfterToday(simpleSearchParams.getDepartDate()) ||
  290. DateUtils.isDateMoreThanOneYearAfterToday(simpleSearchParams.getReturnDate());
  291. }
  292. }