Browse Source

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

Hasemi 7 years ago
parent
commit
b455c78ae6

+ 4 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/ContentsFlagRequestBean.java

@@ -43,4 +43,8 @@ public class ContentsFlagRequestBean extends UserNameRequestBean {
   public void setChecked(String checked) {
     this.checked = checked;
   }
+
+  public boolean isChecked() {
+    return LifeplusData.isTrue(checked);
+  }
 }

+ 25 - 10
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/QuestionBean.java

@@ -6,6 +6,7 @@ package kr.co.zumo.app.lifeplus.bean.api;
 import com.google.gson.annotations.SerializedName;
 
 import kr.co.zumo.app.lifeplus.bean.JsonBeanBase;
+import kr.co.zumo.app.lifeplus.util.StringUtil;
 
 /**
  * QuestionBean
@@ -24,16 +25,18 @@ public class QuestionBean extends JsonBeanBase {
 
   @SerializedName("id")
   private int id;
-  @SerializedName("cate")
+  @SerializedName("qaType")
   private String category;
-  @SerializedName("title")  // 질문 내용
+  @SerializedName("qaCten")  // 질문 내용
   private String title;
-  @SerializedName("contents") // 답변 내용
+  @SerializedName("replCten") // 답변 내용
   private String contents;
-  @SerializedName("reg_dt")
-  private String date;  // "yyyy-mm-dd"
+  @SerializedName("qaDttm")
+  private String questionDate;  // "yyyy-mm-dd"
   @SerializedName("status")
   private String status;
+  @SerializedName("replDttm")
+  private String answerDate;  // "yyyy-mm-dd"
 
   public String getStatus() {
     return status;
@@ -53,7 +56,7 @@ public class QuestionBean extends JsonBeanBase {
     this.category = category;
     this.title = title;
     this.contents = contents;
-    this.date = date;
+    this.questionDate = date;
   }
 
   public int getId() {
@@ -88,12 +91,12 @@ public class QuestionBean extends JsonBeanBase {
     this.contents = contents;
   }
 
-  public String getDate() {
-    return date;
+  public String getQuestionDate() {
+    return questionDate;
   }
 
-  public void setDate(String date) {
-    this.date = date;
+  public void setQuestionDate(String questionDate) {
+    this.questionDate = questionDate;
   }
 
   public boolean isExpanded() {
@@ -103,4 +106,16 @@ public class QuestionBean extends JsonBeanBase {
   public void setExpanded(boolean expanded) {
     isExpanded = expanded;
   }
+
+  public String getAnswerDate() {
+    return answerDate;
+  }
+
+  public void setAnswerDate(String answerDate) {
+    this.answerDate = answerDate;
+  }
+
+  public boolean hasAnswer() {
+    return StringUtil.isFull(answerDate) && StringUtil.isFull(contents);
+  }
 }

+ 8 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/bean/api/QuestionRequestBean.java

@@ -17,25 +17,24 @@ import com.google.gson.annotations.SerializedName;
  */
 public class QuestionRequestBean extends RequestBean {
 
+  /*
+  1 : 회원, 2 : 쿠폰, 3 : 혜택, 4 : 기타
+   */
   private transient String[] categories = new String[]{"회원", "쿠폰", "혜택", "기타"};
 
-  @SerializedName("cate")
-  private String category = categories[0];
-  @SerializedName("contents")   // 질문 내용
+  @SerializedName("qaType")
+  private String category = "0";
+  @SerializedName("qaCten")   // 질문 내용
   private String contents = "";
-  @SerializedName("device_info")
+  @SerializedName("deviceInfo")
   private String deviceInfo = "";
 
   public String getCategory() {
     return category;
   }
 
-  public void setCategory(String category) {
-    this.category = category;
-  }
-
   public void setCategory(int category) {
-    this.category = categories[category];
+    this.category = String.valueOf(category);
   }
 
   public String getContents() {

+ 8 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPI.java

@@ -253,24 +253,23 @@ public interface LifeplusAPI {
   @POST("mapi/members/updpushagre.plus")
   Single<LifeplusAPIBean> setMemberPushAgree(@Body MemberPushAgreeRequestBean bean);
 
+  // 나의 문의 목록
+  @POST("mapi/faqs/myqalists.plus")
+  Single<QuestionResultBean> getQuestionList(@Body RequestBean bean);
+
+  // 문의 등록 하기
+  @POST("mapi/faqs/setmyqa.plus")
+  Single<LifeplusAPIBean> registerQuestion(@Body QuestionRequestBean bean);
 
   // ----------------------------------------------------------------------------------
 
-  // 코인
+  // todo 코인
   @POST("api/v1/setting/member/coin/get.plus")
   Single<CoinResultBean> getCoins(@Body RequestBean bean);
 
   // todo 알림
-
   @POST("api/v1/notification/get.plus")
   Single<NotificationResultBean> getNotification(@Body RequestBean bean);
 
-  // todo 나의 문의
-  @POST("api/v1/question/get.plus")
-  Single<QuestionResultBean> getQuestionList(@Body RequestBean bean);
-
-  @POST("api/v1/question/set.plus")
-  Single<LifeplusAPIBean> registerQuestion(@Body QuestionRequestBean bean);
-
 
 }

+ 92 - 20
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsFlagHelper.java

@@ -13,9 +13,14 @@ import io.reactivex.android.schedulers.AndroidSchedulers;
 import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsFlagBean;
+import kr.co.zumo.app.lifeplus.bean.api.ContentsFlagRequestBean;
 import kr.co.zumo.app.lifeplus.bean.api.ContentsFlagResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.ItemNumberBean;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
 import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
+import kr.co.zumo.app.lifeplus.model.module.APIContentsBookmarkedModule;
+import kr.co.zumo.app.lifeplus.model.module.APIContentsLikedModule;
+import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
 import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIRepository;
 import kr.co.zumo.app.lifeplus.network.api.ParameterMapper;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
@@ -31,6 +36,9 @@ import kr.co.zumo.app.lifeplus.util.AppUtil;
  * @since 2018. 11. 16.
  */
 public class ContentsFlagHelper {
+
+  // todo activity helper 로 변경 고려
+
   private static ContentsFlagHelper ourInstance = new ContentsFlagHelper();
 
   public static ContentsFlagHelper getInstance() {
@@ -41,6 +49,8 @@ public class ContentsFlagHelper {
   }
 
   private Disposable disposable;
+  private Disposable disposableLiked;
+  private Disposable disposableBookmarked;
   private ContentsFlagBean contentsFlagBean;
 
   public Single<ContentsFlagResultBean> load() {
@@ -75,7 +85,14 @@ public class ContentsFlagHelper {
       disposable.dispose();
       disposable = null;
     }
-    contentsFlagBean = null;
+    if (null != disposableLiked) {
+      disposableLiked.dispose();
+      disposableLiked = null;
+    }
+    if (null != disposableBookmarked) {
+      disposableBookmarked.dispose();
+      disposableBookmarked = null;
+    }
   }
 
   /**
@@ -83,6 +100,7 @@ public class ContentsFlagHelper {
    */
   public void dispose() {
     stopLoading();
+    contentsFlagBean = null;
   }
 
   /**
@@ -93,14 +111,7 @@ public class ContentsFlagHelper {
    */
   public boolean isLiked(String itemNumber) {
     List<ItemNumberBean> list = contentsFlagBean.getLikedList();
-    if (null != list) {
-      for (ItemNumberBean bean : list) {
-        if (bean.getItemNumber().equals(itemNumber)) {
-          return true;
-        }
-      }
-    }
-    return false;
+    return isChecked(itemNumber, list);
   }
 
   /**
@@ -111,6 +122,10 @@ public class ContentsFlagHelper {
    */
   public boolean isBookmarked(String itemNumber) {
     List<ItemNumberBean> list = contentsFlagBean.getBookmarkedList();
+    return isChecked(itemNumber, list);
+  }
+
+  private boolean isChecked(String itemNumber, List<ItemNumberBean> list) {
     if (null != list) {
       for (ItemNumberBean bean : list) {
         if (bean.getItemNumber().equals(itemNumber)) {
@@ -132,7 +147,9 @@ public class ContentsFlagHelper {
       contentsFlagBean.setLikedList(new ArrayList<>());
       list = contentsFlagBean.getLikedList();
     }
-    list.add(new ItemNumberBean(itemNumber));
+    if (isLiked(itemNumber) == false) {
+      list.add(new ItemNumberBean(itemNumber));
+    }
     print();
   }
 
@@ -147,7 +164,9 @@ public class ContentsFlagHelper {
       contentsFlagBean.setBookmarkedList(new ArrayList<>());
       list = contentsFlagBean.getBookmarkedList();
     }
-    list.add(new ItemNumberBean(itemNumber));
+    if (isBookmarked(itemNumber) == false) {
+      list.add(new ItemNumberBean(itemNumber));
+    }
     print();
   }
 
@@ -158,15 +177,7 @@ public class ContentsFlagHelper {
    */
   public void removeLiked(String itemNumber) {
     List<ItemNumberBean> list = contentsFlagBean.getLikedList();
-    if (null != list) {
-      for (ItemNumberBean bean : list) {
-        if (bean.getItemNumber().equals(itemNumber)) {
-          list.remove(bean);
-          break;
-        }
-      }
-    }
-    print();
+    removeFlag(itemNumber, list);
   }
 
   /**
@@ -176,6 +187,10 @@ public class ContentsFlagHelper {
    */
   public void removeBookmarked(String itemNumber) {
     List<ItemNumberBean> list = contentsFlagBean.getBookmarkedList();
+    removeFlag(itemNumber, list);
+  }
+
+  private void removeFlag(String itemNumber, List<ItemNumberBean> list) {
     if (null != list) {
       for (ItemNumberBean bean : list) {
         if (bean.getItemNumber().equals(itemNumber)) {
@@ -192,4 +207,61 @@ public class ContentsFlagHelper {
       Log.w("APP# ContentsFlagHelper | print", "| lists: \n" + contentsFlagBean.toPrettyJson());
     }
   }
+
+  public Disposable updateLiked(ContentsFlagRequestBean requestBean, IAPIModuleListener<LifeplusAPIBean> listener) {
+    boolean toChecked = requestBean.isChecked();
+    disposableLiked = new APIContentsLikedModule().call(requestBean, new IAPIModuleListener<LifeplusAPIBean>() {
+      @Override
+      public void onApiSuccess(LifeplusAPIBean resultBean) {
+        if (toChecked) {
+          addLiked(requestBean.getItemNumber());
+        }
+        else {
+          removeLiked(requestBean.getItemNumber());
+        }
+        listener.onApiSuccess(resultBean);
+      }
+
+      @Override
+      public void onApiReason(LifeplusAPIBean resultBean) {
+        listener.onApiReason(resultBean);
+      }
+
+      @Override
+      public void onApiError(String errorMessage) {
+        listener.onApiError(errorMessage);
+      }
+    });
+
+    return disposableLiked;
+  }
+
+
+  public Disposable updateBookmarked(ContentsFlagRequestBean requestBean, IAPIModuleListener<LifeplusAPIBean> listener) {
+    boolean toChecked = requestBean.isChecked();
+    disposableBookmarked = new APIContentsBookmarkedModule().call(requestBean, new IAPIModuleListener<LifeplusAPIBean>() {
+      @Override
+      public void onApiSuccess(LifeplusAPIBean resultBean) {
+        if (toChecked) {
+          addBookmarked(requestBean.getItemNumber());
+        }
+        else {
+          removeBookmarked(requestBean.getItemNumber());
+        }
+        listener.onApiSuccess(resultBean);
+      }
+
+      @Override
+      public void onApiReason(LifeplusAPIBean resultBean) {
+        listener.onApiReason(resultBean);
+      }
+
+      @Override
+      public void onApiError(String errorMessage) {
+        listener.onApiError(errorMessage);
+      }
+    });
+
+    return disposableBookmarked;
+  }
 }

+ 23 - 20
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/contents/ContentsModel.java

@@ -10,8 +10,6 @@ import kr.co.zumo.app.lifeplus.bean.api.LifeplusContentsBean;
 import kr.co.zumo.app.lifeplus.bean.api.LifeplusData;
 import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
-import kr.co.zumo.app.lifeplus.model.module.APIContentsBookmarkedModule;
-import kr.co.zumo.app.lifeplus.model.module.APIContentsLikedModule;
 import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
 import kr.co.zumo.app.lifeplus.view.Event;
 
@@ -35,6 +33,7 @@ public class ContentsModel extends Model {
   @Override
   protected void destroyInternal() {
     stopLoading();
+    contentsBean = null;
   }
 
   @Override
@@ -57,18 +56,38 @@ public class ContentsModel extends Model {
 
   }
 
+  /**
+   * 리뷰 다이얼로그를 표시하기 위한 카운트
+   *
+   * @return
+   */
   public int getCountForReview() {
     return SuperModel.getInstance().getPreferences().getCountForReview();
   }
 
+  /**
+   * 리뷰 다이얼로그를 표시하기 위한 카운트
+   *
+   * @param count
+   */
   public void setCountForReview(int count) {
     SuperModel.getInstance().getPreferences().setCountForReview(count);
   }
 
+  /**
+   * 컨텐츠 정보
+   *
+   * @return
+   */
   public LifeplusContentsBean getContentsBean() {
     return contentsBean;
   }
 
+  /**
+   * DeliveryHelper 로 전달된 데이터를 저장한다.
+   *
+   * @param bean
+   */
   public void setContentsBean(LifeplusContentsBean bean) {
     this.contentsBean = bean;
 
@@ -89,17 +108,9 @@ public class ContentsModel extends Model {
 
   public void updateLiked() {
     boolean toChecked = !contentsBean.isLiked();
-    disposableLiked = new APIContentsLikedModule().call(new ContentsFlagRequestBean(getUserName(), contentsBean.getItemNumber(), LifeplusData.valueOf(toChecked)), new IAPIModuleListener<LifeplusAPIBean>() {
+    disposableLiked = ContentsFlagHelper.getInstance().updateLiked(new ContentsFlagRequestBean(getUserName(), contentsBean.getItemNumber(), LifeplusData.valueOf(toChecked)), new IAPIModuleListener<LifeplusAPIBean>() {
       @Override
       public void onApiSuccess(LifeplusAPIBean resultBean) {
-        // todo 좋아요 / 북마크 확인 목록 업데이트
-
-        if (toChecked) {
-          ContentsFlagHelper.getInstance().addLiked(contentsBean.getItemNumber());
-        }
-        else {
-          ContentsFlagHelper.getInstance().removeLiked(contentsBean.getItemNumber());
-        }
         contentsBean.setLiked(toChecked);
         onResult(new Event.Builder(Event.SUCCESS).integer(Event.CONTENTS_LIKE).bool(toChecked).build());
       }
@@ -119,17 +130,9 @@ public class ContentsModel extends Model {
 
   public void updateBookmarked() {
     boolean toChecked = !contentsBean.isBookmarked();
-    disposableLiked = new APIContentsBookmarkedModule().call(new ContentsFlagRequestBean(getUserName(), contentsBean.getItemNumber(), LifeplusData.valueOf(toChecked)), new IAPIModuleListener<LifeplusAPIBean>() {
+    disposableBookmarked = ContentsFlagHelper.getInstance().updateBookmarked(new ContentsFlagRequestBean(getUserName(), contentsBean.getItemNumber(), LifeplusData.valueOf(toChecked)), new IAPIModuleListener<LifeplusAPIBean>() {
       @Override
       public void onApiSuccess(LifeplusAPIBean resultBean) {
-        // todo 좋아요 / 북마크 확인 목록 업데이트
-
-        if (toChecked) {
-          ContentsFlagHelper.getInstance().addBookmarked(contentsBean.getItemNumber());
-        }
-        else {
-          ContentsFlagHelper.getInstance().removeBookmarked(contentsBean.getItemNumber());
-        }
         contentsBean.setBookmarked(toChecked);
         onResult(new Event.Builder(Event.SUCCESS).integer(Event.CONTENTS_BOOKMARK).bool(toChecked).build());
       }

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/faq/FAQWritePresenter.java

@@ -113,7 +113,7 @@ public class FAQWritePresenter extends Presenter<FAQWriteModel, IFAQWriteView> {
 
   private void setDeviceInfo() {
     String info = String.format(ResourceUtil.getString(R.string.my_faq_device_information), model.getAppVersion(), model.getDeviceModel(), model.getOsVersion());
-    view.setDeviceInfo(info);
+    view.setDeviceInfo(ResourceUtil.getString(R.string.my_faq_device_information_header) + info);
     model.setDeviceInfo(info);
   }
 

+ 36 - 9
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/faq/MyFAQExpandableViewHolder.java

@@ -2,6 +2,7 @@ package kr.co.zumo.app.lifeplus.view.screen.faq;
 
 import android.graphics.Typeface;
 import android.support.v7.widget.RecyclerView;
+import android.text.TextUtils;
 import android.view.View;
 import android.widget.ImageView;
 import android.widget.RelativeLayout;
@@ -33,6 +34,8 @@ public class MyFAQExpandableViewHolder extends RecyclerView.ViewHolder {
   private TextView textViewAnswer;
   private TextView textViewAnswerDate;
 
+  private boolean hasAnswer = false;
+
   public MyFAQExpandableViewHolder(View itemView) {
     super(itemView);
     textViewCategory = itemView.findViewById(R.id.text_view_my_faq_category);
@@ -47,12 +50,22 @@ public class MyFAQExpandableViewHolder extends RecyclerView.ViewHolder {
   }
 
   public void bind(QuestionBean bean, IEventListener listener) {
-    textViewStatus.setText(bean.getStatus());
-    textViewAnswerDate.setText(bean.getDate());
-    textViewQuestionDate.setText(bean.getDate());
-    textViewAnswer.setText(bean.getContents());
-    textViewQuestion.setText(bean.getTitle());
     textViewCategory.setText(bean.getCategory());
+    textViewQuestion.setText(bean.getTitle());
+    textViewQuestionDate.setText(bean.getQuestionDate());
+
+    // 답변 날짜/내용이 있으면 답변 완료
+    String answerDate = bean.getAnswerDate();
+    String answerContents = bean.getContents();
+    hasAnswer = bean.hasAnswer();
+    if (hasAnswer) {
+      textViewStatus.setVisibility(View.VISIBLE);
+      textViewAnswer.setText(answerContents);
+      textViewAnswerDate.setText(answerDate);
+    }
+    else {
+      textViewStatus.setVisibility(View.GONE);
+    }
 
     View.OnClickListener clickListener = view -> {
       boolean isExpanded = bean.isExpanded();
@@ -60,23 +73,37 @@ public class MyFAQExpandableViewHolder extends RecyclerView.ViewHolder {
       changed(bean.isExpanded());
 
       listener.onEvent(new Event.Builder(Event.CLICK).integer(getAdapterPosition()).build());
-
     };
 
     textViewQuestion.setOnClickListener(clickListener);
-
     buttonArrow.setOnClickListener(clickListener);
   }
 
   public void changed(boolean isExpanded) {
     if (isExpanded) {
-      layoutAnswer.setVisibility(View.VISIBLE);
+      // 문의 글 모두 보여주기
+      // maxLines , ellipsize
       textViewQuestion.setTypeface(null, Typeface.BOLD);
+      textViewQuestion.setMaxLines(Integer.MAX_VALUE);
+      textViewQuestion.setEllipsize(null);
+      if (hasAnswer) {
+        // 답변 내용 보여주기
+        layoutAnswer.setVisibility(View.VISIBLE);
+      }
     }
     else {
-      layoutAnswer.setVisibility(View.GONE);
+      // 문의 글 ... 처리
+      // maxLines , ellipsize
       textViewQuestion.setTypeface(null, Typeface.NORMAL);
+      textViewQuestion.setMaxLines(2);
+      textViewQuestion.setEllipsize(TextUtils.TruncateAt.END);
+
+      if (hasAnswer) {
+        // 답변 내용 닫기
+        layoutAnswer.setVisibility(View.GONE);
+      }
     }
+
     buttonArrow.setImageResource(isExpanded ? R.drawable.icon_closearrow : R.drawable.icon_openarrow);
   }
 

+ 7 - 7
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/faq/MyFAQFragment.java

@@ -47,6 +47,13 @@ public class MyFAQFragment extends FragmentBase<MyFAQPresenter> implements IMyFa
   @Override
   protected void onAfterActivityCreated(Bundle savedInstanceState) {
     myFAQList = findViewById(R.id.expandable_list_view_my_faq);
+    myFAQList.addItemDecoration(new RecyclerView.ItemDecoration() {
+      @Override
+      public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
+        super.getItemOffsets(outRect, view, parent, state);
+        outRect.bottom = ResourceUtil.dpToPx(12);
+      }
+    });
     viewNoQuestion = findViewById(R.id.layout_my_faq_none);
     viewRequestNotification = findViewById(R.id.text_view_my_faq_notice);
     viewRequestNotification.setOnClickListener(v -> presenter.onEvent(new Event.Builder(Event.CLICK).build()));
@@ -107,13 +114,6 @@ public class MyFAQFragment extends FragmentBase<MyFAQPresenter> implements IMyFa
 
       myFAQList.setLayoutManager(new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false));
       MyFAQExpandableListViewAdapter adapter = new MyFAQExpandableListViewAdapter(beans);
-      myFAQList.addItemDecoration(new RecyclerView.ItemDecoration() {
-        @Override
-        public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
-          super.getItemOffsets(outRect, view, parent, state);
-          outRect.bottom = ResourceUtil.dpToPx(12);
-        }
-      });
       myFAQList.setAdapter(adapter);
     }
     else {

+ 21 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/faq/MyFAQModel.java

@@ -3,6 +3,7 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.faq;
 
+import java.util.Collections;
 import java.util.List;
 
 import io.reactivex.disposables.Disposable;
@@ -27,6 +28,7 @@ import kr.co.zumo.app.lifeplus.view.Event;
 public class MyFAQModel extends Model {
   private Disposable disposable;
   private List<QuestionBean> questionBeans;
+
   @Override
   protected void destroyInternal() {
     disposeLoading();
@@ -59,6 +61,22 @@ public class MyFAQModel extends Model {
       disposable = null;
     }
   }
+
+  private void sortBeans() {
+    Collections.sort(questionBeans, (o1, o2) -> {
+      if (o1.hasAnswer() && o2.hasAnswer()) {
+        return 0;
+      }
+      else if (o1.hasAnswer()) {
+        return 1;
+      }
+      else if (o2.hasAnswer()) {
+        return -1;
+      }
+      return 0;
+    });
+  }
+
   /**
    * 문의내역 불러오기;
    */
@@ -69,6 +87,9 @@ public class MyFAQModel extends Model {
           public void onApiSuccess(QuestionResultBean resultBean) {
             questionBeans = resultBean.getData();
 
+            // 답변이 없는 순서로 정렬
+            sortBeans();
+
             onResult(new Event.Builder(Event.RESULT).build());
           }
 

+ 3 - 2
app/src/main/res/layout/my_faq_contents.xml

@@ -35,9 +35,10 @@
       android:layout_marginTop="5dp"
       android:layout_marginEnd="50dp"
       android:lineSpacingExtra="5sp"
-      android:maxLines="3"
+      android:maxLines="2"
       android:textColor="@color/C333333"
       android:textSize="14sp"
+      android:ellipsize="end"
       tools:text="@string/my_faq_question"/>
 
     <TextView
@@ -50,7 +51,7 @@
       android:lineSpacingExtra="4sp"
       android:textColor="@color/C000000"
       android:textSize="11sp"
-      tools:text="@string/my_faq_answer_success"
+      android:text="@string/my_faq_answer_success"
       tools:visibility="visible"/>
 
     <TextView

+ 2 - 1
app/src/main/res/values/strings.xml

@@ -357,7 +357,8 @@
   <string name="recommend_confirm_success_detail">%s님의 추천이 인증되었습니다.\n회원님과 추천인에게 %d코인 지급이 완료되었습니다.</string>
 
   <string name="my_faq_nothing_comment">문의하신 내용이 없습니다</string>
-  <string name="my_faq_device_information">단말정보 : 어플리케이션 버전 %1$s /기기모델 %2$s /OS버전 %3$s</string>
+  <string name="my_faq_device_information_header">"단말정보: "</string>
+  <string name="my_faq_device_information">어플리케이션 버전 %1$s /기기모델 %2$s /OS버전 %3$s</string>
   <string name="my_faq_notice1">문의하신 내용의 답변은 회원정보에 등록하신 이메일 및 이용\n안내/문의에서 확인가능합니다.</string>
   <string name="my_faq_notice2">접수 순서대로 답변해 드리며, 문의가 많을 경우 답변이\n지연될 수 있습니다.</string>
   <string name="my_faq_write_character">/ 2,000</string>

File diff suppressed because it is too large
+ 32 - 30
app/src/sandbox/java/kr/co/zumo/app/lifeplus/network/api/LifeplusAPIService.java