Jelajahi Sumber

Merge branch 'develop' of https://github.com/swict/LifePlusAndroid into develop

# Conflicts:
#	app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchFragment.java
Hasemi 7 tahun lalu
induk
melakukan
6211e90464

+ 1 - 1
app/build.gradle

@@ -23,7 +23,7 @@ android {
         minSdkVersion 19    // 4.4
         targetSdkVersion 27
         versionCode 149
-        versionName "4.0.0.49"
+        versionName "4.0.0.50"
         testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
         multiDexEnabled true
         vectorDrawables.useSupportLibrary = true

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/util/StringUtil.java

@@ -464,7 +464,7 @@ public class StringUtil {
    * @return
    */
   public static String toTag(String s) {
-    if (s.length() > 0 && HASH.equals(String.valueOf(s.charAt(0))) == false) {
+    if (isFull(s) && HASH.equals(String.valueOf(s.charAt(0))) == false) {
       s = HASH + s;
     }
     return s;

+ 6 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/CharFinder.java

@@ -41,6 +41,12 @@ public class CharFinder {
       index[0] = -1;
       return false;
     }
+    else if (Math.abs(prevStr.length() - currentStr.length()) > 1) {
+      // 길이 차이가 2이상일 경우 정상 입력이 아님
+      prevStr = currentStr;
+      index[0] = -1;
+      return false;
+    }
 
     boolean isBackspace = prevStr.length() > currentStr.length();
 

+ 2 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/ISearchResultView.java

@@ -20,4 +20,6 @@ import kr.co.zumo.app.lifeplus.view.IView;
  */
 interface ISearchResultView extends IView {
   void drawResultContents(List<SearchContentsBean> tagBeans);
+
+  void setVisibleCategory(boolean isVisible);
 }

+ 5 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/ISearchView.java

@@ -37,4 +37,9 @@ public interface ISearchView extends IView {
 
   void setVisibleAutoCompletionTag(boolean isVisible);
 
+  void setKeyword(String keyword);
+
+  void addTextWatcher();
+  void removeTextWatcher();
+
 }

+ 37 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchFragment.java

@@ -53,6 +53,21 @@ public class SearchFragment extends FragmentBase<SearchPresenter> implements ISe
   private RecyclerView recyclerViewPopularTag;
   private RecyclerView recyclerViewAutoCompletion;
 
+  private TextWatcher textWatcher = new TextWatcher() {
+    @Override
+    public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
+
+    @Override
+    public void onTextChanged(CharSequence s, int start, int before, int count) {
+      presenter.onSearchTextChanged(s, start, before, count);
+    }
+
+    @Override
+    public void afterTextChanged(Editable s) {
+      presenter.afterTextChanged(s);
+    }
+  };
+
   @Override
   protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     return inflater.inflate(R.layout.fragment_search, container, false);
@@ -85,7 +100,7 @@ public class SearchFragment extends FragmentBase<SearchPresenter> implements ISe
     recyclerViewLatestTag.setLayoutManager(new LinearLayoutManager(getContext()));
     recyclerViewPopularTag.setLayoutManager(new LinearLayoutManager(getContext()));
     recyclerViewAutoCompletion.setLayoutManager(new LinearLayoutManager(getContext()));
-
+    
     recyclerViewLatestTag.setNestedScrollingEnabled(false);
     recyclerViewPopularTag.setNestedScrollingEnabled(false);
 
@@ -220,4 +235,25 @@ public class SearchFragment extends FragmentBase<SearchPresenter> implements ISe
     containerAutoCompletion.setVisibility(isVisible ? View.VISIBLE : View.GONE);
   }
 
+  @Override
+  public void setKeyword(String keyword) {
+    editSearch.setText(keyword);
+    int max = keyword.length();
+    keyword = editSearch.getText().toString();
+    int len = keyword.length();
+    if (len > max) {
+      len = max;
+    }
+    editSearch.setSelection(len);
+  }
+
+  @Override
+  public void addTextWatcher() {
+    editSearch.addTextChangedListener(textWatcher);
+  }
+
+  @Override
+  public void removeTextWatcher() {
+    editSearch.removeTextChangedListener(textWatcher);
+  }
 }

+ 10 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchModel.java

@@ -46,6 +46,8 @@ public class SearchModel extends Model {
   protected List<TagKeywordBean> autoCompletionTagBeans;
   private String tag;
 
+  private boolean isShowingAutoCompletion = false;
+
   @Override
   protected void createViewInternal() {
 
@@ -235,4 +237,12 @@ public class SearchModel extends Model {
   public List<TagKeywordBean> getAutoCompletionBeans() {
     return autoCompletionTagBeans;
   }
+
+  public boolean isShowingAutoCompletion() {
+    return isShowingAutoCompletion;
+  }
+
+  public void setShowingAutoCompletion(boolean showing) {
+    isShowingAutoCompletion = showing;
+  }
 }

+ 30 - 4
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchPresenter.java

@@ -46,6 +46,7 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
   private void renderLatest() {
     List<TagBean> list = model.getLatestTagBeans();
     if (null != list && list.size() > 0) {
+      model.setShowingAutoCompletion(false);
       view.setVisibleAutoCompletionTag(false);
       view.setVisibleLatestTag(true);
       view.drawLatestTag(list);
@@ -58,6 +59,7 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
   private void renderPopular() {
     List<TagBean> list = model.getPopularTagBeans();
     if (null != list && list.size() > 0) {
+      model.setShowingAutoCompletion(false);
       view.setVisibleAutoCompletionTag(false);
       view.setVisiblePopularTag(true);
       view.drawPopularTag(list);
@@ -70,6 +72,7 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
   private void renderAutoCompletion() {
     List<TagKeywordBean> list = model.getAutoCompletionBeans();
     if (null != list && list.size() > 0) {
+      model.setShowingAutoCompletion(true);
       view.setVisibleLatestTag(false);
       view.setVisiblePopularTag(false);
       view.setVisibleAutoCompletionTag(true);
@@ -95,7 +98,10 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
   @Override
   protected void startInternal() {
     // 최근 검색어 리로드
-    renderLatest();
+    // 자동 완성이 표시되어 있지 않을 경우에만 갱신
+    if (model.isShowingAutoCompletion() == false) {
+      renderLatest();
+    }
   }
 
   @Override
@@ -129,7 +135,7 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
   protected void onEventInternal(Event event) {
     int integer;
     int index;
-    String tag;
+    String tag = null;
     switch (event.getEventId()) {
       case Event.CLICK:
         integer = event.getInteger();
@@ -137,17 +143,25 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
         if (integer == Event.TAG_LATEST) {
           // 최근 검색 태그
           tag = model.getLatestTagBeans().get(index).getTagName();
-          search(tag);
         }
         else if (integer == Event.TAG_POPULAR) {
           // 인기 태그
           tag = model.getPopularTagBeans().get(index).getTagName();
-          search(tag);
         }
         else if (integer == Event.TAG_AUTO_COMPLETION) {
+          // 자동 완성
           tag = model.getAutoCompletionBeans().get(index).getTagName();
+        }
+        if (StringUtil.isFull(tag)) {
+          // 키워드를 텍스트필드에 넣을 때 이벤트 발생을 막기위해 리스너 제거/재등록
+          view.removeTextWatcher();
+          view.setBoldGuideHash(false);
+          view.setKeyword(stripTag(tag));
+          view.addTextWatcher();
+
           search(tag);
         }
+
         break;
       case Event.DELETE:
         integer = event.getInteger();
@@ -163,8 +177,16 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
     }
   }
 
+  protected String stripTag(String s) {
+    if (StringUtil.isFull(s) && StringUtil.HASH.equals(String.valueOf(s.charAt(0)))) {
+      s = s.substring(1, s.length());
+    }
+    return s;
+  }
+
   @Override
   public void onScreenReady() {
+    view.addTextWatcher();
     view.setVisibleLatestTag(false);
     view.setVisiblePopularTag(false);
     view.setVisibleAutoCompletionTag(false);
@@ -267,6 +289,10 @@ public class SearchPresenter extends Presenter<SearchModel, ISearchView> {
             replaceHash(s);
           }
         }
+        else if (str[0] == hash.charAt(0)) {
+          // # 직접 입력
+          replaceHash(s);
+        }
       }
     }
   }

+ 7 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultFragment.java

@@ -35,6 +35,7 @@ public class SearchResultFragment extends FragmentBase<SearchResultPresenter> im
 
   private RecyclerView recyclerViewResultContents;
   private RecyclerView recyclerViewTags;
+  private View containerCategory;
 
   @Override
   protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -58,6 +59,7 @@ public class SearchResultFragment extends FragmentBase<SearchResultPresenter> im
 
     recyclerViewTags = findViewById(R.id.recycler_view_tag);
     recyclerViewResultContents = findViewById(R.id.recycler_view_search_result);
+    containerCategory = findViewById(R.id.container_category);
 
     recyclerViewTags.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.HORIZONTAL, false));
     recyclerViewResultContents.setLayoutManager(new LinearLayoutManager(getContext()));
@@ -102,4 +104,9 @@ public class SearchResultFragment extends FragmentBase<SearchResultPresenter> im
       searchResultAdapter.update(contentsBeans);
     }
   }
+
+  @Override
+  public void setVisibleCategory(boolean isVisible) {
+    containerCategory.setVisibility(isVisible ? View.VISIBLE : View.GONE);
+  }
 }

+ 9 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultModel.java

@@ -5,6 +5,7 @@ package kr.co.zumo.app.lifeplus.view.screen.search;
 
 import android.util.Log;
 
+import java.util.ArrayList;
 import java.util.List;
 
 import io.reactivex.disposables.Disposable;
@@ -114,7 +115,14 @@ public class SearchResultModel extends Model {
         categoryBeans = resultBean.getCategoryBeans();
         tagBeans = resultBean.getTagBeans();
 
-        if (null != tagBeans && tagBeans.size() > 0) {
+        if (null == tagBeans) {
+          tagBeans = new ArrayList<>();
+        }
+        if (null == categoryBeans) {
+          categoryBeans = new ArrayList<>();
+        }
+
+        if (tagBeans.size() > 0) {
           Log.i("APP# SearchResultModel | onApiSuccess", "|" + "------------------- tagBeans.size(): " + tagBeans.size());
           // 검색 결과 있음
           if (countOfDeliveredTag == tagBeans.size()) {

+ 1 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/search/SearchResultPresenter.java

@@ -3,8 +3,6 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.search;
 
-import android.util.Log;
-
 import java.util.List;
 
 import kr.co.zumo.app.lifeplus.bean.ContentsDeliveryBean;
@@ -41,7 +39,7 @@ public class SearchResultPresenter extends Presenter<SearchResultModel, ISearchR
 
   private void render() {
     List<SearchContentsBean> list = model.getResultContentsBeans();
-    Log.i("APP# SearchResultPresenter | render", "|" + "==============> list.size(): " + list.size());
+    view.setVisibleCategory(model.getTagBeans().size() > 0);
     view.drawResultContents(list);
   }