|
|
@@ -38,6 +38,7 @@ import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
|
|
|
import kr.co.zumo.app.lifeplus.model.module.APISearchFilterDetailModule;
|
|
|
import kr.co.zumo.app.lifeplus.model.module.APISearchFilterModule;
|
|
|
import kr.co.zumo.app.lifeplus.model.module.APISearchModule;
|
|
|
+import kr.co.zumo.app.lifeplus.model.module.FilterDetailParser;
|
|
|
import kr.co.zumo.app.lifeplus.supervisor.ContentsFlagHelper;
|
|
|
import kr.co.zumo.app.lifeplus.util.ResourceUtil;
|
|
|
import kr.co.zumo.app.lifeplus.util.StringUtil;
|
|
|
@@ -169,7 +170,7 @@ public class SearchResultModel extends Model {
|
|
|
}
|
|
|
|
|
|
// 필터 적용
|
|
|
- applyFilter(requestBean);
|
|
|
+ applyFilter(requestBean, false);
|
|
|
|
|
|
Log.i("APP# SearchResultModel | search", "|" + " search ---> " + requestBean.toJson());
|
|
|
|
|
|
@@ -261,7 +262,7 @@ public class SearchResultModel extends Model {
|
|
|
}
|
|
|
|
|
|
// 필터 적용
|
|
|
- applyFilter(requestBean);
|
|
|
+ applyFilter(requestBean, false);
|
|
|
|
|
|
Log.d("APP# SearchResultModel | search", "|" + " search ---> " + requestBean.toJson());
|
|
|
|
|
|
@@ -637,51 +638,41 @@ public class SearchResultModel extends Model {
|
|
|
}
|
|
|
|
|
|
private SearchResultBean filterSearchResultBean;
|
|
|
- private SearchResultBean filterSearchResultBeanOnlyProperty; // 지역/핫플 상세 필터를 요구할 때 이전 검색 결과를 제줄해야한다. 이는 지역/핫플이 적용되지 않은 필터 데이터를 갖고 있다.
|
|
|
+ private SearchItemNoProvider itemNoProvider = new SearchItemNoProvider();
|
|
|
private List<FilterSectionBean> filterSectionBeans;
|
|
|
|
|
|
public final List<FilterSectionBean> getFilterList() {
|
|
|
return filterSectionBeans;
|
|
|
}
|
|
|
|
|
|
- public void loadFilteringContents(IWaiterCallable waiterCallable, IEventListener listener) {
|
|
|
- Log.w("APP# SearchResultModel | loadFilteringContents", "|" + " -------------------------- ");
|
|
|
-
|
|
|
- // 키워드는 변경 없음
|
|
|
- SearchRequestBean requestBean = new SearchRequestBean(getSearchTag());
|
|
|
-
|
|
|
- // 카테고리 변경 없음.
|
|
|
- if (null != categoryCheckBeans && categoryCheckBeans.size() > 0) {
|
|
|
- CategoryCheckBean categoryCheckBean = categoryCheckBeans.get(selectedCategoryIndex);
|
|
|
- if (null != categoryCheckBean) {
|
|
|
- requestBean.setCategoryNo(categoryCheckBean.getCategoryNo());
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- // 필터 적용
|
|
|
- boolean hasFilter = applyFilter(requestBean);
|
|
|
+ private void loadFilteringContentsInternal(SearchRequestBean requestBean, boolean hasFilter, IWaiterCallable waiterCallable, IEventListener listener) {
|
|
|
if (hasFilter == false) {
|
|
|
- Log.d("APP# SearchResultModel | loadFilteringContents", "|" + " 선택 필터 없음 -> 필터 없이 로딩 - 리스트 수 반환");
|
|
|
+ Log.d("APP# SearchResultModel | loadFilteringContentsInternal", "|" + " 선택 필터 없음 -> 필터 없이 로딩 - 리스트 수 반환");
|
|
|
}
|
|
|
|
|
|
- Log.i("APP# SearchResultModel | loadFilteringContents", "|" + " search ---> " + requestBean.toJson());
|
|
|
+ Log.i("APP# SearchResultModel | loadFilteringContentsInternal", "|" + " search ---> " + requestBean.toJson());
|
|
|
if (StringUtil.isEmpty(requestBean.getKeyword())) {
|
|
|
- Log.i("APP# SearchResultModel | loadFilteringContents", "|" + " 검색어 없음.");
|
|
|
- filterSearchResultBeanOnlyProperty = null;
|
|
|
+ Log.d("APP# SearchResultModel | loadFilteringContentsInternal", "|" + " 검색어 없음.");
|
|
|
+ itemNoProvider.reset();
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
+ stopSearch();
|
|
|
disposableSearch = new APISearchModule().call(requestBean, new APIModuleListener<SearchResultBean>(waiterCallable) {
|
|
|
@Override
|
|
|
public void onApiSuccess(SearchResultBean resultBean) {
|
|
|
filterSearchResultBean = resultBean;
|
|
|
if (null != filterSearchResultBean) {
|
|
|
- if (StringUtil.isEmpty(requestBean.getFilterArea()) && StringUtil.isEmpty(requestBean.getFilterPlace())) {
|
|
|
- // 지역/핫플 필터가 없는 데이터는 별도 보관한다. 상세 필터를 요구할 때 이용, 일치하는 결과가 없더라도 저장해야 맞음
|
|
|
- filterSearchResultBeanOnlyProperty = filterSearchResultBean;
|
|
|
+
|
|
|
+ // 지역/핫플 필터가 없는 데이터는 별도 보관한다. 상세 필터를 요구할 때 이용, 일치하는 결과가 없더라도 저장해야 맞음
|
|
|
+ if (itemNoProvider.needSaving(requestBean)) {
|
|
|
+ Log.d("APP# SearchResultModel | onApiSuccess", "|" + " ********************** 기초 데이터 저장");
|
|
|
+ itemNoProvider.setRequestBean(requestBean);
|
|
|
+ itemNoProvider.setResult(filterSearchResultBean);
|
|
|
}
|
|
|
|
|
|
isFilterApplied = hasFilter;
|
|
|
+ Log.i("APP# SearchResultModel | onApiSuccess", "|" + " isFilterApplied: " + isFilterApplied);
|
|
|
int count = filterSearchResultBean.getListCount();
|
|
|
if (null == filterSearchResultBean.getTagBeans() || filterSearchResultBean.getTagBeans().size() == 0) {
|
|
|
count = 0;
|
|
|
@@ -700,119 +691,97 @@ public class SearchResultModel extends Model {
|
|
|
});
|
|
|
}
|
|
|
|
|
|
- public void loadFilterDetail(FilterBean filterBean, IFilterDetailListener listener) {
|
|
|
+ private SearchRequestBean getSearchRequestBean() {
|
|
|
+ // 키워드는 변경 없음
|
|
|
+ SearchRequestBean requestBean = new SearchRequestBean(getSearchTag());
|
|
|
|
|
|
- String type = filterBean.getFilterType();
|
|
|
- String no = filterBean.getFilterNo();
|
|
|
- StringBuilder itemNoes = new StringBuilder();
|
|
|
+ // 카테고리 변경 없음.
|
|
|
+ if (null != categoryCheckBeans && categoryCheckBeans.size() > 0) {
|
|
|
+ CategoryCheckBean categoryCheckBean = categoryCheckBeans.get(selectedCategoryIndex);
|
|
|
+ if (null != categoryCheckBean) {
|
|
|
+ requestBean.setCategoryNo(categoryCheckBean.getCategoryNo());
|
|
|
+ }
|
|
|
+ }
|
|
|
|
|
|
- // 필터링 처리한 임시 데이터
|
|
|
- List<SearchContentsBean> targetList = resultContentsBeansFirst; // 우선 초기 데이터로 지정
|
|
|
+ return requestBean;
|
|
|
+ }
|
|
|
|
|
|
- // 지역 필터 적용 이전의 데이터를 저장해두고 넘겨줘야 한다.
|
|
|
- if (null != filterSearchResultBeanOnlyProperty) {
|
|
|
- // 일단 다른 태그로 검색한 상태임
|
|
|
+ public void loadFilteringContents(IWaiterCallable waiterCallable, IEventListener listener) {
|
|
|
+ Log.i("APP# SearchResultModel | loadFilteringContentsInternal", "|" + " -------------------------- ");
|
|
|
+
|
|
|
+ // 키워드는 변경 없음
|
|
|
+ SearchRequestBean requestBean = getSearchRequestBean();
|
|
|
+
|
|
|
+ // 필터 적용
|
|
|
+ boolean hasFilter = applyFilter(requestBean, false);
|
|
|
|
|
|
- // 결과 중 일치하는 콘텐츠 있음.
|
|
|
- if (null != filterSearchResultBeanOnlyProperty.getTagBeans() && filterSearchResultBeanOnlyProperty.getTagBeans().size() > 0) {
|
|
|
- if (null != filterSearchResultBeanOnlyProperty.getData() && filterSearchResultBeanOnlyProperty.getData().size() > 0) {
|
|
|
- // 최종 콘텐츠 있음.
|
|
|
- targetList = filterSearchResultBeanOnlyProperty.getData();
|
|
|
+ loadFilteringContentsInternal(requestBean, hasFilter, waiterCallable, listener);
|
|
|
+ }
|
|
|
+
|
|
|
+ public void loadFilterDetail(FilterBean filterBean, IWaiterCallable waiterCallable, IFilterDetailListener listener) {
|
|
|
+ // itemNo base load
|
|
|
+ // 현재 필터 중 지역/핫풀 필터를 제외한 설정으로 로딩 후 디테일 가져옴
|
|
|
+
|
|
|
+ // 키워드는 변경 없음
|
|
|
+ SearchRequestBean requestBean = getSearchRequestBean();
|
|
|
+
|
|
|
+ // 필터 적용 -> 지역은 제외하고 필터 적용
|
|
|
+ boolean hasFilter = applyFilter(requestBean, true);
|
|
|
+
|
|
|
+ if (itemNoProvider.hasResult(requestBean)) {
|
|
|
+ // 이미 동일한 결과가 있으면
|
|
|
+ Log.e("APP# SearchResultModel | loadFilterDetail", "|" + "********************************* 이전 기초 결과 이용");
|
|
|
+ loadFilterDetailInternal(filterBean, waiterCallable, listener);
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ Log.e("APP# SearchResultModel | loadFilterDetail", "|" + "********************************* 다시 기초 로드");
|
|
|
+ loadFilteringContentsInternal(requestBean, hasFilter, waiterCallable, event -> {
|
|
|
+ if (event.getEventId() == Event.SUCCESS) {
|
|
|
+ loadFilterDetailInternal(filterBean, waiterCallable, listener);
|
|
|
}
|
|
|
- else {
|
|
|
- // 태그는 일치하지만 콘텐츠는 없음.
|
|
|
- targetList = null;
|
|
|
+ else if (event.getEventId() == Event.ERROR) {
|
|
|
+ listener.onError(filterBean);
|
|
|
}
|
|
|
- }
|
|
|
- else {
|
|
|
- // 일치하는 태그 없음(검색 결과 없음)
|
|
|
- targetList = null;
|
|
|
- }
|
|
|
+ });
|
|
|
}
|
|
|
+ }
|
|
|
|
|
|
- /*
|
|
|
- 디테일 정보를 요청할 경우 각 태그별로 컨텐츠 수를 표시하기 위해서 기 검색된 컨텐츠의 no 들을 함께 넘겨준다.
|
|
|
- */
|
|
|
+ private void loadFilterDetailInternal(FilterBean filterBean, IWaiterCallable waiterCallable, IFilterDetailListener listener) {
|
|
|
+ String type = filterBean.getFilterType();
|
|
|
+ String no = filterBean.getFilterNo();
|
|
|
|
|
|
- // 전송할 데이터가 있다면 추가
|
|
|
- if (null != targetList && targetList.size() > 0) {
|
|
|
- for (SearchContentsBean contentsBean : targetList) {
|
|
|
- if (null != contentsBean.getItemNo()) {
|
|
|
- itemNoes.append(StringUtil.HASH).append(contentsBean.getItemNo());
|
|
|
- }
|
|
|
- }
|
|
|
+ String itemNoes = itemNoProvider.getItemNoes(resultContentsBeansFirst);
|
|
|
+
|
|
|
+ // "" 으로 요청하면 결과가 맞지않아서 dummy 를 넣어줌
|
|
|
+ if (StringUtil.isEmpty(itemNoes)) {
|
|
|
+ itemNoes = "#0000";
|
|
|
}
|
|
|
|
|
|
- disposableFilter = new APISearchFilterDetailModule().call(new FilterDetailRequestBean(type, no, itemNoes.toString()), new APIModuleListener<SearchFilterDetailResultBean>(waiterCaller) {
|
|
|
- @Override
|
|
|
- public void onApiSuccess(SearchFilterDetailResultBean resultBean) {
|
|
|
- // 결과를 filterBean 에 맵핑 해준다.
|
|
|
- if (null != resultBean && null != resultBean.getData()) {
|
|
|
- List<FilterTagBean> tagBeans = resultBean.getData();
|
|
|
-
|
|
|
- // todo filter bean 파서 추가 필요
|
|
|
-
|
|
|
- // '전체' 태그는 tag no 를 'all' 로 변환
|
|
|
- for (FilterTagBean tagBean : tagBeans) {
|
|
|
- if (FilterTagBean.INDEX_TOTAL.equals(tagBean.getTagNo()) || FilterTagBean.TAG_NAME_TOTAL.equals(tagBean.getTagName())) {
|
|
|
- tagBean.setTagNo(FilterTagBean.TAG_NO_TOTAL);
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
+ disposableFilter = new APISearchFilterDetailModule().call(
|
|
|
+ new FilterDetailRequestBean(type, no, itemNoes),
|
|
|
+ new APIModuleListener<SearchFilterDetailResultBean>(waiterCallable) {
|
|
|
+ @Override
|
|
|
+ public void onApiSuccess(SearchFilterDetailResultBean resultBean) {
|
|
|
+ // 결과를 filterBean 에 맵핑 해준다.
|
|
|
+ if (null != resultBean && null != resultBean.getData()) {
|
|
|
+ List<FilterTagBean> tagBeans = resultBean.getData();
|
|
|
|
|
|
- // 이전 선택한 항목 재 선택
|
|
|
- if (null != filterBean.getTagBeans()) {
|
|
|
- for (FilterTagBean before : filterBean.getTagBeans()) {
|
|
|
- String tagNo = before.getTagNo();
|
|
|
- if (StringUtil.isFull(tagNo)) {
|
|
|
- for (FilterTagBean tag : tagBeans) {
|
|
|
- if (tagNo.equals(tag.getTagNo())) {
|
|
|
- tag.setSelected(before.isSelected());
|
|
|
- if (before.canCommit() == false) {
|
|
|
- // 커밋한 상태로 만듬
|
|
|
- tag.commit();
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
+ new FilterDetailParser().parse(filterBean, tagBeans);
|
|
|
|
|
|
- // 선택한 것이 있는지 확인
|
|
|
- boolean needDefault = true;
|
|
|
- for (FilterTagBean tagBean : tagBeans) {
|
|
|
- if (tagBean.isSelected()) {
|
|
|
- needDefault = false;
|
|
|
- break;
|
|
|
- }
|
|
|
+ filterBean.setTagBeans(tagBeans);
|
|
|
}
|
|
|
|
|
|
- // 처음 하나도 선택 안된 상태라면 '전체'를 기본값으로 선택한다.
|
|
|
- if (needDefault) {
|
|
|
- for (FilterTagBean tagBean : tagBeans) {
|
|
|
- if (FilterTagBean.TAG_NO_TOTAL.equals(tagBean.getTagNo())) {
|
|
|
- tagBean.setSelected(true);
|
|
|
- // 사용자 선택 전이므로 commit 은 하지 않는다.
|
|
|
- break;
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
-
|
|
|
- filterBean.setTagBeans(tagBeans);
|
|
|
+ listener.onCompleted(filterBean);
|
|
|
}
|
|
|
|
|
|
- listener.onCompleted(filterBean);
|
|
|
- }
|
|
|
-
|
|
|
- @Override
|
|
|
- public void onApiError(String errorMessage, APIError error) {
|
|
|
- listener.onError(filterBean);
|
|
|
- }
|
|
|
- });
|
|
|
+ @Override
|
|
|
+ public void onApiError(String errorMessage, APIError error) {
|
|
|
+ listener.onError(filterBean);
|
|
|
+ }
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
-
|
|
|
- private boolean applyFilter(SearchRequestBean requestBean) {
|
|
|
+ private boolean applyFilter(SearchRequestBean requestBean, boolean withoutArea) {
|
|
|
// 필터 추가
|
|
|
boolean isApplied = false;
|
|
|
if (null != filterSectionBeans) {
|
|
|
@@ -824,12 +793,16 @@ public class SearchResultModel extends Model {
|
|
|
if (tagBean.isSelected()) {
|
|
|
switch (filterBean.getFilterType()) {
|
|
|
case FilterBean.FILTER_TYPE_AREA:
|
|
|
- isApplied = true;
|
|
|
- requestBean.setFilterArea(requestBean.getFilterArea() + StringUtil.HASH + tagBean.getTagNo());
|
|
|
+ if (false == withoutArea) {
|
|
|
+ isApplied = true;
|
|
|
+ requestBean.setFilterArea(requestBean.getFilterArea() + StringUtil.HASH + tagBean.getTagNo());
|
|
|
+ }
|
|
|
break;
|
|
|
case FilterBean.FILTER_TYPE_HOT_PLACE:
|
|
|
- isApplied = true;
|
|
|
- requestBean.setFilterPlace(requestBean.getFilterPlace() + StringUtil.HASH + tagBean.getTagNo());
|
|
|
+ if (false == withoutArea) {
|
|
|
+ isApplied = true;
|
|
|
+ requestBean.setFilterPlace(requestBean.getFilterPlace() + StringUtil.HASH + tagBean.getTagNo());
|
|
|
+ }
|
|
|
break;
|
|
|
default:
|
|
|
break;
|
|
|
@@ -840,12 +813,16 @@ public class SearchResultModel extends Model {
|
|
|
else if (filterBean.isSelected()) {
|
|
|
switch (filterBean.getFilterType()) {
|
|
|
case FilterBean.FILTER_TYPE_AREA:
|
|
|
- isApplied = true;
|
|
|
- requestBean.setFilterArea(requestBean.getFilterArea() + StringUtil.HASH + filterBean.getFilterNo());
|
|
|
+ if (false == withoutArea) {
|
|
|
+ isApplied = true;
|
|
|
+ requestBean.setFilterArea(requestBean.getFilterArea() + StringUtil.HASH + filterBean.getFilterNo());
|
|
|
+ }
|
|
|
break;
|
|
|
case FilterBean.FILTER_TYPE_HOT_PLACE:
|
|
|
- isApplied = true;
|
|
|
- requestBean.setFilterPlace(requestBean.getFilterPlace() + StringUtil.HASH + filterBean.getFilterNo());
|
|
|
+ if (false == withoutArea) {
|
|
|
+ isApplied = true;
|
|
|
+ requestBean.setFilterPlace(requestBean.getFilterPlace() + StringUtil.HASH + filterBean.getFilterNo());
|
|
|
+ }
|
|
|
break;
|
|
|
case FilterBean.FILTER_TYPE_ORDER:
|
|
|
if (filterBean.getFilterNo().equals(FilterBean.FILTER_ORDER_LATEST) == false) {
|
|
|
@@ -934,7 +911,7 @@ public class SearchResultModel extends Model {
|
|
|
}
|
|
|
|
|
|
filterSearchResultBean = null;
|
|
|
- filterSearchResultBeanOnlyProperty = null;
|
|
|
+ itemNoProvider.reset();
|
|
|
isFilterApplied = false;
|
|
|
|
|
|
int len = filterSectionBeans.size();
|