浏览代码

[마이][New] FAQ API 연동
- Closed #11

hyodong.min 7 年之前
父节点
当前提交
0bb9eb7327

+ 1 - 1
.idea/inspectionProfiles/Project_Default.xml

@@ -2,7 +2,7 @@
   <profile version="1.0">
     <option name="myName" value="Project Default" />
     <inspection_tool class="AndroidLintLongLogTag" enabled="false" level="ERROR" enabled_by_default="false" />
-    <inspection_tool class="BreakStatement" enabled="false" level="ERROR" enabled_by_default="false" />
+    <inspection_tool class="BreakStatement" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="DefaultNotLastCaseInSwitch" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="FallthruInSwitchStatement" enabled="true" level="ERROR" enabled_by_default="true" />
     <inspection_tool class="SwitchStatementsWithoutDefault" enabled="true" level="ERROR" enabled_by_default="true">

+ 34 - 6
app/src/main/java/kr/co/zumo/app/lifeplus/activity/FAQActivity.java

@@ -3,28 +3,56 @@ package kr.co.zumo.app.lifeplus.activity;
 import android.os.Bundle;
 import android.support.design.widget.TabLayout;
 import android.support.v4.view.ViewPager;
-import android.support.v7.app.AppCompatActivity;
+
+import java.util.List;
 
 import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.bean.api.FAQBean;
+import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
+import kr.co.zumo.app.lifeplus.model.FAQModel;
+import kr.co.zumo.app.lifeplus.view.IFAQView;
 import kr.co.zumo.app.lifeplus.view.fragment.faq.FAQPagerAdapter;
+import kr.co.zumo.app.lifeplus.view.presenter.FAQPresenter;
+
+public class FAQActivity extends ActivityBase<FAQPresenter> implements IFAQView {
 
-public class FAQActivity extends AppCompatActivity {
+  public static final String CATEGORY_ALL = "전체";
+  public static final String CATEGORY_MEMBER = "회원";
+  public static final String CATEGORY_BENEFIT = "혜택";
+  public static final String CATEGORY_ETC = "기타";
+  public static final int CATEGORY_KEY_ALL = 0;
+  public static final int CATEGORY_KEY_MEMBER = 1;
+  public static final int CATEGORY_KEY_BENEFIT = 2;
+  public static final int CATEGORY_KEY_ETC = 3;
 
   private TabLayout tabLayoutFaq;
   private ViewPager viewPagerFaq;
   private FAQPagerAdapter faqPagerAdapter;
 
   @Override
-  protected void onCreate(Bundle savedInstanceState) {
-    super.onCreate(savedInstanceState);
+  void onAfterCreate(Bundle savedInstanceState) {
     setContentView(R.layout.activity_faq);
 
     tabLayoutFaq = findViewById(R.id.faq_tab_layout);
     viewPagerFaq = findViewById(R.id.faq_view_pager);
     tabLayoutFaq.setTabGravity(TabLayout.GRAVITY_FILL);
 
-    String[] tab = {"전체", "회원", "혜택", "기타"};
-    faqPagerAdapter = new FAQPagerAdapter(getSupportFragmentManager(), tab);
+  }
+
+  @Override
+  void defineActionBar() {
+    ActionBarManager.getInstance().hide();
+  }
+
+  @Override
+  FAQPresenter definePresenter() {
+    return new FAQPresenter(getModel(FAQModel.class), this);
+  }
+
+  @Override
+  public void drawList(List<FAQBean> beans) {
+    String[] tab = {CATEGORY_ALL, CATEGORY_MEMBER, CATEGORY_BENEFIT, CATEGORY_ETC};
+    faqPagerAdapter = new FAQPagerAdapter(getSupportFragmentManager(), tab, beans);
     tabLayoutFaq.setupWithViewPager(viewPagerFaq, true);
     viewPagerFaq.setAdapter(faqPagerAdapter);
   }

+ 95 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/model/FAQModel.java

@@ -0,0 +1,95 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.model;
+
+import android.util.Log;
+
+import java.util.List;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.disposables.CompositeDisposable;
+import io.reactivex.schedulers.Schedulers;
+import kr.co.zumo.app.lifeplus.bean.BlankBean;
+import kr.co.zumo.app.lifeplus.bean.api.FAQBean;
+import kr.co.zumo.app.lifeplus.network.api.LifeplusAPIService;
+import kr.co.zumo.app.lifeplus.view.Event;
+
+/**
+ * FAQModel
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 10. 4.]   [최초 작성]
+ * @since 2018. 10. 4.
+ */
+public class FAQModel extends Model {
+
+  private CompositeDisposable disposable = new CompositeDisposable();
+  private List<FAQBean> faqBeans;
+
+  @Override
+  protected void destroyInternal() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  /**
+   * FAQ 불러오기;
+   */
+  public void loadFaq() {
+    disposable.add(
+      new LifeplusAPIService().getFaqList(new BlankBean())
+        .subscribeOn(Schedulers.io())
+        .observeOn(AndroidSchedulers.mainThread())
+        .subscribe(resultBean -> {
+          Log.i("APP# FAQModel | loadFaq", "|" + resultBean.toPrettyJson());
+          faqBeans = resultBean.getData();
+          try {
+            presenter.onResult(new Event.Builder(Event.RESULT).build());
+          } catch (Throwable throwable) {
+            throwable.printStackTrace();
+          }
+        }, e -> {
+          try {
+            presenter.onResult(new Event.Builder(Event.ERROR).build());
+          } catch (Throwable throwable) {
+            throwable.printStackTrace();
+          }
+        })
+    );
+  }
+
+  /**
+   * FAQ
+   *
+   * @return
+   */
+  public List<FAQBean> getFaqBeans() {
+    return faqBeans;
+  }
+}

+ 22 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/IFAQView.java

@@ -0,0 +1,22 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view;
+
+import java.util.List;
+
+import kr.co.zumo.app.lifeplus.bean.api.FAQBean;
+
+/**
+ * IFAQView
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 10. 4.]   [최초 작성]
+ * @since 2018. 10. 4.
+ */
+public interface IFAQView extends IView {
+  void drawList(List<FAQBean> beans);
+}

+ 47 - 26
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/faq/FAQFragment.java

@@ -11,7 +11,6 @@ import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 
-import java.util.ArrayList;
 import java.util.List;
 
 import kr.co.zumo.app.R;
@@ -30,26 +29,59 @@ import kr.co.zumo.app.lifeplus.util.ResourceUtil;
  */
 public class FAQFragment extends Fragment {
 
+  private static final String PARAM_INDEX = "index";
+
   private RecyclerView expandableListViewFaq;
 
+  private List<FAQBean> faqBeans;
+  private IFAQFragmentListener listener;
+  private int index;
+
+  public void setListener(IFAQFragmentListener listener) {
+    this.listener = listener;
+  }
+
+  public static FAQFragment newInstance(int index) {
+    FAQFragment fragment = new FAQFragment();
+    Bundle args = new Bundle();
+    args.putInt(PARAM_INDEX, index);
+    fragment.setArguments(args);
+    return fragment;
+  }
+
+  @Override
+  public void onCreate(@Nullable Bundle savedInstanceState) {
+    super.onCreate(savedInstanceState);
 
+    this.index = getArguments().getInt(PARAM_INDEX);
+  }
 
   @Nullable
   @Override
   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
     View view = inflater.inflate(R.layout.fragment_faq, container, false);
-    //settingList();
-
-
-    expandableListViewFaq = (RecyclerView) view.findViewById(R.id.expandable_list_view_faq);
-    expandableListViewFaq.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL ,false));
-    List<FAQBean> data = new ArrayList<>();
-    data.add(new FAQBean(0, "카테고리", "타이틀", "콘텐츠", "날짜"));
-    data.add(new FAQBean(1, "카테고리", "타이틀", "콘텐츠", "날짜"));
-    data.add(new FAQBean(2, "카테고리", "타이틀", "콘텐츠", "날짜"));
-    data.add(new FAQBean(3, "카테고리", "타이틀", "콘텐츠", "날짜"));
-    data.add(new FAQBean(4, "카테고리", "타이틀", "콘텐츠", "날짜"));
-    FAQExpandableListViewAdapter adapter = new FAQExpandableListViewAdapter(data);
+    return view;
+  }
+
+  @Override
+  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
+    super.onActivityCreated(savedInstanceState);
+
+    listener.onInit(this, this.index);
+  }
+
+  /**
+   * 초기화
+   *
+   * @param beans
+   */
+  public void init(List<FAQBean> beans) {
+    View view = getView();
+    expandableListViewFaq = view.findViewById(R.id.expandable_list_view_faq);
+    expandableListViewFaq.setLayoutManager(new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false));
+    faqBeans = beans;
+
+    FAQExpandableListViewAdapter adapter = new FAQExpandableListViewAdapter(faqBeans);
     expandableListViewFaq.setAdapter(adapter);
     expandableListViewFaq.addItemDecoration(new RecyclerView.ItemDecoration() {
       @Override
@@ -58,20 +90,9 @@ public class FAQFragment extends Fragment {
         outRect.top = ResourceUtil.dpToPx(12);
       }
     });
-
-    return view;
   }
 
-  @Override
-  public void onActivityCreated(@Nullable Bundle savedInstanceState) {
-    super.onActivityCreated(savedInstanceState);
+  interface IFAQFragmentListener {
+    void onInit(FAQFragment faqFragment, int category);
   }
-
-/*  private void settingList() {
-    faqList = new ArrayList<>();
-    FAQBean bean1 = new FAQBean(0, "회원", "비밀번호는 어떻게 변경하나요?", "개인인증을 위한 정보(이름, 휴대폰 번호)를 입력 받고, 당첨 시 입력하신 번호로 경품 당첨 내용을 전송하오니 정확한 본인의 이름과 전화번호를 입력해 주시기 바랍니다. 당첨자는 추첨을 통해 선정되며 9월 28일자 발표일에 경품이 주어집니다.", "dummy");
-    faqList.add(bean1);
-    FAQBean bean2 = new FAQBean(0, "회원", "비밀번호는 어떻게 변경하나요?", "개인인증을 위한 정보(이름, 휴대폰 번호)를 입력 받고, 당첨 시 입력하신 번호로 경품 당첨 내용을 전송하오니 정확한 본인의 이름과 전화번호를 입력해 주시기 바랍니다. 당첨자는 추첨을 통해 선정되며 9월 28일자 발표일에 경품이 주어집니다.", "dummy");
-    faqList.add(bean2);
-  }*/
 }

+ 38 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/fragment/faq/FAQPagerAdapter.java

@@ -5,6 +5,12 @@ import android.support.v4.app.Fragment;
 import android.support.v4.app.FragmentManager;
 import android.support.v4.app.FragmentStatePagerAdapter;
 
+import java.util.ArrayList;
+import java.util.List;
+
+import kr.co.zumo.app.lifeplus.activity.FAQActivity;
+import kr.co.zumo.app.lifeplus.bean.api.FAQBean;
+
 /**
  * FaqPagerAdapter
  * <pre>
@@ -15,19 +21,25 @@ import android.support.v4.app.FragmentStatePagerAdapter;
  * @history 하세미   [2018-10-01]   [최초 작성]
  * @since 2018-10-01
  */
-public class FAQPagerAdapter extends FragmentStatePagerAdapter {
+public class FAQPagerAdapter extends FragmentStatePagerAdapter implements FAQFragment.IFAQFragmentListener {
 
   private String[] tab;
   private static final int PAGE_COUNT = 4;
+  private List<FAQBean> faqBeans;
 
-  public FAQPagerAdapter(FragmentManager fm, String[] tab) {
+  public FAQPagerAdapter(FragmentManager fm, String[] tab, List<FAQBean> beans) {
     super(fm);
+
     this.tab = tab;
+    this.faqBeans = beans;
   }
 
   @Override
   public Fragment getItem(int position) {
-    FAQFragment faqFragment = new FAQFragment();
+    // position 에 매칭되는 카테고리 인덱스
+
+    FAQFragment faqFragment = FAQFragment.newInstance(position);
+    faqFragment.setListener(this);
     return faqFragment;
   }
 
@@ -41,4 +53,27 @@ public class FAQPagerAdapter extends FragmentStatePagerAdapter {
   public CharSequence getPageTitle(int position) {
     return tab[position];
   }
+
+  @Override
+  public void onInit(FAQFragment faqFragment, int category) {
+    /**
+     * 카테고리 별로 데이터를 구분해서 전달한다.
+     */
+
+    List<FAQBean> beans = new ArrayList<>();
+    if (category == FAQActivity.CATEGORY_KEY_ALL) {
+      beans = faqBeans;
+    }
+    else {
+      String categoryName = tab[category];
+
+      for (FAQBean faqBean : faqBeans) {
+        if (faqBean.getCategory().equals(categoryName)) {
+          beans.add(faqBean);
+        }
+      }
+    }
+
+    faqFragment.init(beans);
+  }
 }

+ 78 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/FAQPresenter.java

@@ -0,0 +1,78 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.presenter;
+
+import kr.co.zumo.app.lifeplus.model.FAQModel;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.IFAQView;
+import kr.co.zumo.app.lifeplus.view.command.ActivityChangeCommand;
+
+/**
+ * FAQPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 10. 4.]   [최초 작성]
+ * @since 2018. 10. 4.
+ */
+public class FAQPresenter extends Presenter<FAQModel, IFAQView> {
+
+  public FAQPresenter(FAQModel model, IFAQView view) {
+    super(model, view);
+
+    model.loadFaq();
+  }
+
+  @Override
+  public boolean onBackPressed() {
+    onCommand(new ActivityChangeCommand(ScreenID.ACTIVITY_MAIN, ScreenID.DIRECTION_BACK));
+    return true;
+  }
+
+  @Override
+  protected void onEventInternal(Event event) {
+
+  }
+
+  @Override
+  protected void destroyInternal() {
+
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  @Override
+  public void onResult(Event event) throws Throwable {
+    switch (event.getEventId()) {
+      case Event.ERROR:
+        break;
+      case Event.RESULT:
+        view.drawList(model.getFaqBeans());
+        break;
+      default:
+        break;
+    }
+  }
+}

+ 2 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/presenter/Presenter.java

@@ -106,8 +106,6 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
     onEventInternal(event);
   }
 
-  protected abstract void onEventInternal(Event event);
-
   protected abstract void destroyInternal();
 
   protected abstract void startInternal();
@@ -118,6 +116,8 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
 
   protected abstract void pauseInternal();
 
+  protected abstract void onEventInternal(Event event);
+
   /***********************************
    * method
    ***********************************/

+ 12 - 12
app/src/main/res/layout/activity_faq.xml

@@ -26,18 +26,18 @@
       android:layout_width="match_parent"
       android:layout_height="match_parent"/>
 
-    <android.support.design.widget.FloatingActionButton
-      android:id="@+id/button_write_faq"
-      android:layout_width="44dp"
-      android:layout_height="44dp"
-      android:layout_alignParentBottom="true"
-      android:layout_alignParentEnd="true"
-      android:layout_gravity="bottom|end"
-      android:layout_marginBottom="22dp"
-      android:layout_marginEnd="22dp"
-      android:src="@drawable/icon_inqurebtn"
-      android:scaleType="center"
-      />
+    <!--<android.support.design.widget.FloatingActionButton-->
+      <!--android:id="@+id/button_write_faq"-->
+      <!--android:layout_width="44dp"-->
+      <!--android:layout_height="44dp"-->
+      <!--android:layout_alignParentBottom="true"-->
+      <!--android:layout_alignParentEnd="true"-->
+      <!--android:layout_gravity="bottom|end"-->
+      <!--android:layout_marginBottom="22dp"-->
+      <!--android:layout_marginEnd="22dp"-->
+      <!--android:src="@drawable/icon_inqurebtn"-->
+      <!--android:scaleType="center"-->
+      <!--/>-->
 
   </RelativeLayout>
 

+ 26 - 18
app/src/main/res/layout/faq_question_list.xml

@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:background="@drawable/faq_answer_border"
@@ -14,11 +15,11 @@
 
     <LinearLayout
       android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
+      android:layout_height="match_parent"
       android:orientation="vertical"
-      android:paddingBottom="23dp"
-      android:paddingLeft="23dp"
-      android:paddingTop="23dp">
+      android:paddingStart="23dp"
+      android:paddingTop="23dp"
+      android:paddingBottom="23dp">
 
       <TextView
         android:id="@+id/faq_category"
@@ -26,68 +27,74 @@
         android:layout_height="wrap_content"
         android:layout_marginBottom="5dp"
         android:lineSpacingExtra="4sp"
-        android:text="회원"
-        android:textColor="#999999"
-        android:textSize="10sp"/>
+        android:textColor="@color/C999999"
+        android:textSize="10sp"
+        tools:text="회원"/>
 
       <TextView
         android:id="@+id/faq_question"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:lineSpacingExtra="5sp"
-        android:textColor="#333333"
+        android:maxLines="3"
+        android:textColor="@color/C333333"
         android:textSize="14sp"
+        tools:text="회원"
         />
 
     </LinearLayout>
 
     <Space
       android:layout_width="0dp"
-      android:layout_height="wrap_content"
+      android:layout_height="match_parent"
       android:layout_weight="1"
       />
 
     <LinearLayout
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
+      android:gravity="end"
       android:orientation="horizontal">
 
       <ImageView
         android:id="@+id/button_open_arrow"
         android:layout_width="wrap_content"
         android:layout_height="match_parent"
+        android:paddingStart="10dp"
         android:paddingTop="47dp"
+        android:paddingEnd="23dp"
         android:paddingBottom="47dp"
-        android:paddingRight="23dp"
         android:src="@drawable/icon_openarrow"
-
         />
 
     </LinearLayout>
+
   </LinearLayout>
 
   <LinearLayout
-    android:id="@+id/layout_answer"
-    android:visibility="gone"
     xmlns:android="http://schemas.android.com/apk/res/android"
+    android:id="@+id/layout_answer"
     android:layout_width="match_parent"
     android:layout_height="match_parent"
-    android:orientation="vertical">
+    android:orientation="vertical"
+    android:visibility="gone"
+    tools:visibility="visible"
+    >
 
     <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
       android:orientation="vertical"
+      android:paddingStart="23dp"
+      android:paddingEnd="23dp"
       android:paddingBottom="23dp"
-      android:paddingLeft="23dp"
-      android:paddingRight="23dp"
       >
 
       <View
         android:layout_width="match_parent"
         android:layout_height="1dp"
         android:layout_marginBottom="23dp"
-        android:background="#e5e5e5"
+        android:background="@color/CE5E5E5"
         />
 
       <TextView
@@ -95,8 +102,9 @@
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:lineSpacingExtra="9sp"
-        android:textColor="#999999"
+        android:textColor="@color/C999999"
         android:textSize="12sp"
+        tools:text="@string/sign_up_from_zumo_description"
         />
 
     </LinearLayout>