Procházet zdrojové kódy

[설정][New] 회원 탈퇴 신청: 완료
- 완료 화면 필요

hyodong.min před 7 roky
rodič
revize
bb8acae2a0

+ 3 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/supervisor/ScreenID.java

@@ -64,11 +64,12 @@ public class ScreenID {
   public static final int GUIDE = 44;
   public static final int LIFE_PLUS_X = 45;
   public static final int SETTING_MEMBER_INFO = 46;
-  public static final int MY_MAIN_GUEST  = 47;
+  public static final int MY_MAIN_GUEST = 47;
   public static final int COUPON_MALL = 48;
   public static final int ALL_MENU_GUEST = 49;
   public static final int SETTING_MEMBER_QUIT_INFO = 50;
   public static final int MY_FAQ = 51;
+  public static final int SETTING_MEMBER_QUIT_REQUEST = 52;
 
   @Retention(RetentionPolicy.SOURCE)
   @IntDef({
@@ -77,7 +78,7 @@ public class ScreenID {
     SIGN_UP_COMPLETED, SIGN_UP_UNDER_14_YEARS, REST_MEMBER_START, REST_MEMBER_ACTIVE_COMPLETED, MEMBER_BLOCK, SIGN_UP_FROM_ON_BOARDING,
     BUCKET, MY_COIN_DETAIL, ALL_MENU, MY_BUCKET, ADD_MY_BUCKET, FAQ_WRITE, BUCKET_DETAIL, FIRST_CATEGORY, SECOND_CATEGORY, THIRD_CATEGORY,
     FOURTH_CATEGORY, FIFTH_CATEGORY, NOTIFICATION, SETTING_CODE, MY_MAIN, BOOK_MARK_DEFAULT, BOOK_MARK_LIST, MY_COIN_MAIN, MY_COIN_EXTINCT, MY_PURCHASE_HISTORY,
-    GUIDE, LIFE_PLUS_X, SETTING_MEMBER_INFO,MY_MAIN_GUEST, COUPON_MALL, ALL_MENU_GUEST, SETTING_MEMBER_QUIT_INFO, MY_FAQ
+    GUIDE, LIFE_PLUS_X, SETTING_MEMBER_INFO, MY_MAIN_GUEST, COUPON_MALL, ALL_MENU_GUEST, SETTING_MEMBER_QUIT_INFO, MY_FAQ, SETTING_MEMBER_QUIT_REQUEST
 
   })
   public @interface FragmentID {}

+ 3 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/IDialogResultListener.java

@@ -15,19 +15,19 @@ import kr.co.zumo.app.lifeplus.view.Event;
  * @history 민효동   [2018. 9. 14.]   [최초 작성]
  * @since 2018. 9. 14.
  */
-public interface IDialogResultListener {
+public interface IDialogResultListener<T extends DialogBase> {
   /**
    * 특정 결과가 있을 경우 실행
    *
    * @param dialog
    * @param event
    */
-  void onDialogResult(DialogBase dialog, Event event);
+  void onDialogResult(T dialog, Event event);
 
   /**
    * 취소/back key 등 처리 없이 닫는 경우
    *
    * @param dialog
    */
-  void onDialogCanceled(DialogBase dialog);
+  void onDialogCanceled(T dialog);
 }

+ 10 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/dialog/PinConfirmDialog.java

@@ -19,6 +19,7 @@ import kr.co.zumo.app.lifeplus.view.custom.pin.IPinContract;
 /**
  * PinConfirmDialog
  * <pre>
+ *   핀 입력이 완료되면 onDialogResult(this, Event.string(pin)) 으로 입력 값이 전달된다.
  * </pre>
  *
  * @author 민효동
@@ -67,7 +68,7 @@ public class PinConfirmDialog extends DialogBase {
       @Override
       public void onPinResult(String result) {
         if (null != getResultListener()) {
-          getResultListener().onDialogResult(PinConfirmDialog.this, new Event.Builder(Event.CONFIRM).build());
+          getResultListener().onDialogResult(PinConfirmDialog.this, new Event.Builder(Event.CONFIRM).string(result).build());
         }
       }
 
@@ -98,4 +99,12 @@ public class PinConfirmDialog extends DialogBase {
     layout.addView(customPinView, params);
   }
 
+  /**
+   * 핀 입력 재시도
+   * - 5회 실패 시 onPinFail() 발생하여 Event.FAIL 이 전달된다.
+   */
+  public void retry() {
+    pinPresenter.retry();
+  }
+
 }

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

@@ -3,6 +3,7 @@
  */
 package kr.co.zumo.app.lifeplus.view.presenter;
 
+import android.support.annotation.StringRes;
 import android.support.v7.app.ActionBar;
 import android.util.Log;
 
@@ -13,6 +14,7 @@ import kr.co.zumo.app.lifeplus.model.IModelResult;
 import kr.co.zumo.app.lifeplus.model.Model;
 import kr.co.zumo.app.lifeplus.network.INetworkReceiverListener;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.IEventListener;
 import kr.co.zumo.app.lifeplus.view.IView;
@@ -143,6 +145,10 @@ public abstract class Presenter<M extends Model, V extends IView> implements ILi
     showErrorDialog(string, null);
   }
 
+  protected void showErrorDialog(@StringRes int stringId) {
+    showErrorDialog(ResourceUtil.getString(stringId), null);
+  }
+
   protected void showErrorDialog(String string, Runnable runnable) {
     dialog = DialogBuilder.create(DialogID.CONFIRM)
       .listener(new IDialogResultListener() {

+ 4 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/factory/BasicFragmentFactory.java

@@ -45,6 +45,7 @@ import kr.co.zumo.app.lifeplus.view.screen.setting.SettingFragment;
 import kr.co.zumo.app.lifeplus.view.screen.setting.code.SettingCodeFragment;
 import kr.co.zumo.app.lifeplus.view.screen.setting.common.SettingMemberInfoFragment;
 import kr.co.zumo.app.lifeplus.view.screen.setting.common.SettingMemberQuitInfoFragment;
+import kr.co.zumo.app.lifeplus.view.screen.setting.common.SettingMemberQuitRequestFragment;
 import kr.co.zumo.app.lifeplus.view.screen.signup.SignUpAgreeFragment;
 import kr.co.zumo.app.lifeplus.view.screen.signup.SignUpAlreadyMemberFragment;
 import kr.co.zumo.app.lifeplus.view.screen.signup.SignUpCompletedFragment;
@@ -209,6 +210,9 @@ public class BasicFragmentFactory extends FragmentFactory {
       case ScreenID.SETTING_MEMBER_QUIT_INFO:
         fragment = new SettingMemberQuitInfoFragment();
         break;
+      case ScreenID.SETTING_MEMBER_QUIT_REQUEST:
+        fragment = new SettingMemberQuitRequestFragment();
+        break;
       case ScreenID.MY_MAIN_GUEST:
         fragment = new MyMainGuestFragment();
         break;

+ 0 - 39
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainModel.java

@@ -3,14 +3,7 @@
  */
 package kr.co.zumo.app.lifeplus.view.screen.main;
 
-import io.reactivex.disposables.Disposable;
-import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.bean.api.UserNoBean;
 import kr.co.zumo.app.lifeplus.model.Model;
-import kr.co.zumo.app.lifeplus.model.SuperModel;
-import kr.co.zumo.app.lifeplus.model.module.APIMemberDeleteModule;
-import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
-import kr.co.zumo.app.lifeplus.view.Event;
 
 /**
  * MainModel
@@ -24,45 +17,14 @@ import kr.co.zumo.app.lifeplus.view.Event;
  */
 public class MainModel extends Model {
 
-  private Disposable disposable;
-
-  public void deleteAccount() {
-    disposable = new APIMemberDeleteModule().call(new UserNoBean(SuperModel.getInstance().getUserId()), new IAPIModuleListener<LifeplusAPIBean>() {
-      @Override
-      public void onApiSuccess(LifeplusAPIBean resultBean) {
-        onResult(new Event.Builder(Event.COMPLETED).integer(Event.MEMBER_DELETE).build());
-      }
-
-      @Override
-      public void onApiReason(LifeplusAPIBean resultBean) {
-        onResult(new Event.Builder(Event.ERROR).string(resultBean.getReturnMessage()).build());
-      }
-
-      @Override
-      public void onApiError(String errorMessage) {
-        onResult(new Event.Builder(Event.ERROR).integer(Event.MEMBER_DELETE).string(errorMessage).build());
-      }
-    });
-  }
-
   @Override
   protected void destroyInternal() {
-    disposeObservable();
   }
 
   /**
    * 로드 중지
    */
   public void stopLoading() {
-    disposeObservable();
-  }
-
-  private void disposeObservable() {
-    if (null != disposable) {
-      disposable.dispose();
-      disposable = null;
-    }
-
   }
 
   @Override
@@ -82,6 +44,5 @@ public class MainModel extends Model {
 
   @Override
   protected void pauseInternal() {
-    disposeObservable();
   }
 }

+ 0 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainPresenter.java

@@ -127,9 +127,6 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
       case Event.BUCKET:
         go(ScreenID.BUCKET);
         break;
-      case Event.DELETE:
-        model.deleteAccount();
-        break;
       default:
         break;
     }

+ 21 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/common/ISettingMemberQuitRequestView.java

@@ -0,0 +1,21 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.setting.common;
+
+import kr.co.zumo.app.lifeplus.view.IView;
+
+/**
+ * ISettingMemberQuitRequestView
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 1.]   [최초 작성]
+ * @since 2018. 11. 1.
+ */
+public interface ISettingMemberQuitRequestView extends IView {
+
+  void setName(String str);
+}

+ 0 - 3
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/common/SettingMemberInfoFragment.java

@@ -98,8 +98,6 @@ public class SettingMemberInfoFragment extends FragmentBase<SettingMemberInfoPre
     viewCancel.setOnClickListener(v -> presenter.onClickCancel());
     viewMemberOut.setOnClickListener(v -> presenter.onClickMemberOut());
 
-    checkBoxEmail.setChecked(false);
-    checkBoxSms.setChecked(false);
     checkBoxEmail.setOnClickListener(v -> presenter.onClickAgreeEmail(checkBoxEmail.isChecked()));
     checkBoxSms.setOnClickListener(v -> presenter.onClickAgreeSms(checkBoxSms.isChecked()));
   }
@@ -234,7 +232,6 @@ public class SettingMemberInfoFragment extends FragmentBase<SettingMemberInfoPre
     container.removeAllViews();
 
     CheckBox checkBoxAll = findViewById(R.id.agree_check_all);
-    checkBoxAll.setChecked(false);
     checkBoxAllDriver = new CheckBoxAllDriver(checkBoxAll);
 
     checkBoxAll.setOnClickListener(v -> {

+ 1 - 1
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/common/SettingMemberQuitInfoPresenter.java

@@ -95,6 +95,6 @@ public class SettingMemberQuitInfoPresenter extends Presenter<SettingMemberQuitI
    */
   public void onViewClickRequest() {
     // 탈퇴 신청 화면 이동
-
+    go(ScreenID.SETTING_MEMBER_QUIT_REQUEST);
   }
 }

+ 66 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/common/SettingMemberQuitRequestFragment.java

@@ -0,0 +1,66 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.setting.common;
+
+import android.os.Bundle;
+import android.support.annotation.NonNull;
+import android.support.annotation.Nullable;
+import android.view.LayoutInflater;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.TextView;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.manager.ActionBarManager;
+import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
+
+/**
+ * SettingMemberQuitRequestFragment
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 1.]   [최초 작성]
+ * @since 2018. 11. 1.
+ */
+public class SettingMemberQuitRequestFragment extends FragmentBase<SettingMemberQuitRequestPresenter> implements ISettingMemberQuitRequestView {
+
+  private TextView textName;
+  private View viewCancel;
+  private View viewRequest;
+
+  @Override
+  protected View onAfterCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
+    return inflater.inflate(R.layout.setting_user_quit_request, container, false);
+  }
+
+  @Override
+  protected void onAfterActivityCreated(Bundle savedInstanceState) {
+    textName = findViewById(R.id.text_name);
+    viewCancel = findViewById(R.id.button_cancel);
+    viewRequest = findViewById(R.id.button_request);
+
+    viewCancel.setOnClickListener(v -> presenter.onViewClickCancel());
+    viewRequest.setOnClickListener(v -> presenter.onViewClickRequest());
+  }
+
+  @Override
+  protected void defineActionBar() {
+    ActionBarManager.getInstance().begin()
+      .title(R.string.user_quit_request_title)
+      .back(actionBar -> presenter.onClickBack(actionBar))
+      .show();
+  }
+
+  @Override
+  protected SettingMemberQuitRequestPresenter definePresenter() {
+    return new SettingMemberQuitRequestPresenter(getModel(SettingMemberQuitRequestModel.class), this);
+  }
+
+  @Override
+  public void setName(String str) {
+    textName.setText(str);
+  }
+}

+ 110 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/common/SettingMemberQuitRequestModel.java

@@ -0,0 +1,110 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.setting.common;
+
+import io.reactivex.disposables.Disposable;
+import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
+import kr.co.zumo.app.lifeplus.bean.api.UserNoBean;
+import kr.co.zumo.app.lifeplus.model.Model;
+import kr.co.zumo.app.lifeplus.model.SuperModel;
+import kr.co.zumo.app.lifeplus.model.module.APIMemberDeleteModule;
+import kr.co.zumo.app.lifeplus.model.module.IAPIModuleListener;
+import kr.co.zumo.app.lifeplus.model.module.PinModuleParser;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenIDMapper;
+import kr.co.zumo.app.lifeplus.view.Event;
+
+/**
+ * SettingMemberQuitRequestModel
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 1.]   [최초 작성]
+ * @since 2018. 11. 1.
+ */
+public class SettingMemberQuitRequestModel extends Model {
+
+  private Disposable disposable;
+
+  @Override
+  protected void destroyInternal() {
+    disposeObservable();
+  }
+
+  @Override
+  protected void startInternal() {
+
+  }
+
+  @Override
+  protected void stopInternal() {
+
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  private void disposeObservable() {
+    if (null != disposable) {
+      disposable.dispose();
+      disposable = null;
+    }
+  }
+
+  public String getUserName() {
+    return SuperModel.getInstance().getUserName();
+  }
+
+  public void quitMember() {
+    disposable = new APIMemberDeleteModule().call(new UserNoBean(SuperModel.getInstance().getUserId()), new IAPIModuleListener<LifeplusAPIBean>() {
+      @Override
+      public void onApiSuccess(LifeplusAPIBean resultBean) {
+        clearData();
+        onResult(new Event.Builder(Event.COMPLETED).integer(Event.MEMBER_DELETE).build());
+      }
+
+      @Override
+      public void onApiReason(LifeplusAPIBean resultBean) {
+        onResult(new Event.Builder(Event.ERROR).integer(Event.MEMBER_DELETE).string(resultBean.getReturnMessage()).build());
+      }
+
+      @Override
+      public void onApiError(String errorMessage) {
+        onResult(new Event.Builder(Event.ERROR).integer(Event.MEMBER_DELETE).string(errorMessage).build());
+      }
+    });
+  }
+
+  /**
+   * 입력한 핀과 저장된 핀이 같은지 확인
+   *
+   * @param pin "0000"
+   * @return boolean
+   */
+  public boolean verifyPin(String pin) {
+    return new PinModuleParser().verify(pin);
+  }
+
+  public void stopMemberQuit() {
+    disposeObservable();
+  }
+
+  private void clearData() {
+    SuperModel.getInstance().setUserId("");
+    SuperModel.getInstance().setUserName("");
+    SuperModel.getInstance().setUserEmail("");
+    SuperModel.getInstance().getPreferences().setEncryptedPin("");
+
+    ScreenIDMapper.getInstance().toGuest();
+  }
+
+}

+ 144 - 0
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/setting/common/SettingMemberQuitRequestPresenter.java

@@ -0,0 +1,144 @@
+/*
+ * COPYRIGHT (c) 2018 All rights reserved by HANWHA LIFE.
+ */
+package kr.co.zumo.app.lifeplus.view.screen.setting.common;
+
+import android.util.Log;
+
+import kr.co.zumo.app.R;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.view.Event;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogBase;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogBuilder;
+import kr.co.zumo.app.lifeplus.view.dialog.DialogID;
+import kr.co.zumo.app.lifeplus.view.dialog.IDialogResultListener;
+import kr.co.zumo.app.lifeplus.view.dialog.PinConfirmDialog;
+import kr.co.zumo.app.lifeplus.view.presenter.Presenter;
+
+/**
+ * SettingMemberQuitRequestPresenter
+ * <pre>
+ * </pre>
+ *
+ * @author 민효동
+ * @version 1.0
+ * @history 민효동   [2018. 11. 1.]   [최초 작성]
+ * @since 2018. 11. 1.
+ */
+public class SettingMemberQuitRequestPresenter extends Presenter<SettingMemberQuitRequestModel, ISettingMemberQuitRequestView> {
+
+  DialogBase dialog;
+
+  public SettingMemberQuitRequestPresenter(SettingMemberQuitRequestModel model, ISettingMemberQuitRequestView view) {
+    super(model, view);
+  }
+
+  @Override
+  protected void destroyInternal() {
+    if (null != dialog) {
+      dialog.dispose();
+      dialog = null;
+    }
+  }
+
+  @Override
+  protected void startInternal() {
+    view.setName(model.getUserName());
+  }
+
+  @Override
+  protected void stopInternal() {
+    model.stopMemberQuit();
+  }
+
+  @Override
+  protected void resumeInternal() {
+
+  }
+
+  @Override
+  protected void pauseInternal() {
+
+  }
+
+  @Override
+  public boolean onBackPressed() {
+    back(ScreenID.SETTING_MEMBER_QUIT_INFO);
+    return true;
+  }
+
+  @Override
+  protected void onEventInternal(Event event) {
+
+  }
+
+  @Override
+  public void onResult(Event event) {
+
+    switch (event.getEventId()) {
+      case Event.COMPLETED:
+        if (event.getInteger() == Event.MEMBER_DELETE) {
+//          showErrorDialog("탈퇴 완료");
+          // todo 탈퇴 완료 화면 이동
+          Log.i("APP# SettingMemberQuitRequestPresenter | onResult", "|" + "todo 탈퇴 완료 화면 이동");
+        }
+        break;
+      case Event.ERROR:
+        if (event.getInteger() == Event.MEMBER_DELETE) {
+          showErrorDialog("탈퇴 에러 발생 - " + event.getString());
+        }
+        break;
+      default:
+        break;
+    }
+  }
+
+  public void onViewClickCancel() {
+    // 취소 -> 회원 정보 관리 화면으로 이동
+    go(ScreenID.SETTING_MEMBER_INFO);
+  }
+
+  public void onViewClickRequest() {
+    // 신청
+    // 핀 확인
+    // -> 일치하면 탈퇴 시작
+    // -> 불일치: 그냥 있음
+    // -> 그냥 닫음: 그냥 있음
+    dialog = DialogBuilder.create(DialogID.PIN_CONFIRM)
+      .listener(new IDialogResultListener<PinConfirmDialog>() {
+        @Override
+        public void onDialogResult(PinConfirmDialog dialog, Event event) {
+          switch (event.getEventId()) {
+            case Event.CONFIRM:
+              String inputPin = event.getString();
+              if (model.verifyPin(inputPin)) {
+                dialog.dispose();
+                // 핀 일치
+                model.quitMember();
+              }
+              else {
+                dialog.retry();
+              }
+
+              break;
+            case Event.FAIL:
+              dialog.dispose();
+              // 핀 불일치
+              showErrorDialog(R.string.pin_miss_match_error);
+              break;
+            default:
+              dialog.dispose();
+              break;
+          }
+        }
+
+        @Override
+        public void onDialogCanceled(PinConfirmDialog dialog) {
+          dialog.dispose();
+          // do nothing;
+
+        }
+      })
+      .show();
+  }
+}

+ 202 - 192
app/src/main/res/layout/setting_user_quit_request.xml

@@ -1,239 +1,249 @@
 <?xml version="1.0" encoding="utf-8"?>
-<LinearLayout
+<android.support.v4.widget.NestedScrollView
   xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
-  android:orientation="vertical">
+  android:fillViewport="true">
 
   <LinearLayout
     android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginTop="75dp"
+    android:layout_height="match_parent"
     android:orientation="vertical">
 
-    <ImageView
+    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      app:srcCompat="@drawable/icon_leave_lifeplus"
-      />
+      android:layout_marginTop="75dp"
+      android:orientation="vertical">
 
-  </LinearLayout>
+      <ImageView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:srcCompat="@drawable/icon_leave_lifeplus"
+        />
 
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginTop="23dp"
-    android:layout_marginBottom="52dp"
-    android:orientation="vertical">
+    </LinearLayout>
 
-    <TextView
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:layout_gravity="center"
-      android:gravity="center_horizontal"
-      android:lineSpacingExtra="7sp"
-      android:text="@string/user_quit_title"
-      android:textColor="#000000"
-      android:textSize="17.5sp"
-      />
-
-    <TextView
-      android:layout_width="wrap_content"
+    <LinearLayout
+      android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:layout_gravity="center"
-      android:layout_marginTop="11dp"
-      android:gravity="center_horizontal"
-      android:lineSpacingExtra="5.5sp"
-      android:text="@string/user_quit_question"
-      android:textColor="#999999"
-      android:textSize="14sp"
-      />
-  </LinearLayout>
+      android:layout_marginTop="23dp"
+      android:layout_marginBottom="52dp"
+      android:orientation="vertical">
 
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginLeft="24dp"
-    android:layout_marginRight="24dp"
-    android:background="@color/CF8F8F8"
-    android:gravity="center"
-    android:orientation="horizontal"
-    android:paddingLeft="45dp"
-    android:paddingTop="17dp"
-    android:paddingRight="45dp"
-    android:paddingBottom="17dp">
-
-
-    <TextView
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:gravity="center_horizontal"
-      android:lineSpacingExtra="3sp"
-      android:paddingTop="10dp"
-      android:paddingRight="10dp"
-      android:paddingBottom="10dp"
-      android:text="@string/phone_identify_name"
-      android:textColor="#999999"
-      android:textSize="12sp"
-      />
-
-    <TextView
-      android:layout_width="wrap_content"
-      android:layout_height="wrap_content"
-      android:gravity="center_horizontal"
-      android:lineSpacingExtra="3sp"
-      android:paddingTop="10dp"
-      android:paddingRight="10dp"
-      android:paddingBottom="10dp"
-      android:text="@string/sign_up_completed_name"
-      android:textColor="@color/C000000"
-      android:textSize="12sp"
-      />
-  </LinearLayout>
+      <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:gravity="center_horizontal"
+        android:lineSpacingExtra="7sp"
+        android:text="@string/user_quit_title"
+        android:textColor="@color/C000000"
+        android:textSize="17.5sp"
+        />
 
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginLeft="25dp"
-    android:layout_marginTop="17dp"
-    android:layout_marginRight="25dp"
-    android:orientation="vertical">
+      <TextView
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_gravity="center"
+        android:layout_marginTop="11dp"
+        android:gravity="center_horizontal"
+        android:lineSpacingExtra="5.5sp"
+        android:text="@string/user_quit_question"
+        android:textColor="@color/C999999"
+        android:textSize="14sp"
+        />
+    </LinearLayout>
 
-    <RelativeLayout
+    <LinearLayout
       android:layout_width="match_parent"
-      android:layout_height="wrap_content"
+      android:layout_height="65dp"
+      android:layout_marginLeft="24dp"
+      android:layout_marginRight="24dp"
+      android:background="@color/CF8F8F8"
+      android:gravity="center"
       android:orientation="horizontal"
-      >
+      android:paddingLeft="45dp"
+      android:paddingTop="17dp"
+      android:paddingRight="45dp"
+      android:paddingBottom="17dp">
 
-      <ImageView
-        android:layout_width="2dp"
-        android:layout_height="2dp"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginStart="0dp"
-        android:layout_marginTop="9dp"
-        android:layout_marginRight="5dp"
-        android:src="@drawable/rectangle_c999999"/>
 
       <TextView
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginStart="6dp"
-        android:layout_marginTop="0dp"
-        android:lineSpacingExtra="3sp"
-        android:text="@string/user_quit_information1"
-        android:textColor="#999999"
+        android:gravity="center_horizontal"
+        android:padding="2dp"
+        android:text="@string/phone_identify_name"
+        android:textColor="@color/C999999"
         android:textSize="12sp"
         />
-    </RelativeLayout>
 
-  </LinearLayout>
+      <TextView
+        android:id="@+id/text_name"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:gravity="center_horizontal"
+        android:padding="2dp"
+        android:textColor="@color/C000000"
+        android:textSize="12sp"
+        tools:text="@string/sign_up_completed_name"
+        />
+    </LinearLayout>
 
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginLeft="25dp"
-    android:layout_marginTop="17dp"
-    android:layout_marginRight="25dp"
-    android:orientation="vertical">
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_marginLeft="25dp"
+      android:layout_marginTop="17dp"
+      android:layout_marginRight="25dp"
+      android:orientation="vertical">
 
-    <RelativeLayout
+      <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        >
+
+        <ImageView
+          android:layout_width="2dp"
+          android:layout_height="2dp"
+          android:layout_alignParentStart="true"
+          android:layout_alignParentTop="true"
+          android:layout_marginStart="0dp"
+          android:layout_marginTop="9dp"
+          android:layout_marginRight="5dp"
+          android:src="@drawable/rectangle_c999999"/>
+
+        <TextView
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_alignParentStart="true"
+          android:layout_alignParentTop="true"
+          android:layout_marginStart="6dp"
+          android:layout_marginTop="0dp"
+          android:lineSpacingExtra="3sp"
+          android:text="@string/user_quit_information1"
+          android:textColor="#999999"
+          android:textSize="12sp"
+          />
+      </RelativeLayout>
+
+    </LinearLayout>
+
+    <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
-      android:orientation="horizontal"
-      >
+      android:layout_marginLeft="25dp"
+      android:layout_marginTop="17dp"
+      android:layout_marginRight="25dp"
+      android:orientation="vertical">
 
-      <ImageView
-        android:layout_width="2dp"
-        android:layout_height="2dp"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginStart="0dp"
-        android:layout_marginTop="9dp"
-        android:layout_marginRight="5dp"
-        android:src="@drawable/rectangle_c999999"/>
+      <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="horizontal"
+        >
+
+        <ImageView
+          android:layout_width="2dp"
+          android:layout_height="2dp"
+          android:layout_alignParentStart="true"
+          android:layout_alignParentTop="true"
+          android:layout_marginStart="0dp"
+          android:layout_marginTop="9dp"
+          android:layout_marginRight="5dp"
+          android:src="@drawable/rectangle_c999999"/>
+
+        <TextView
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:layout_alignParentStart="true"
+          android:layout_alignParentTop="true"
+          android:layout_marginStart="6dp"
+          android:layout_marginTop="0dp"
+          android:lineSpacingExtra="3sp"
+          android:text="@string/user_quit_information2"
+          android:textColor="#999999"
+          android:textSize="12sp"
+          />
+      </RelativeLayout>
+    </LinearLayout>
 
-      <TextView
-        android:layout_width="wrap_content"
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:layout_marginLeft="25dp"
+      android:layout_marginTop="17dp"
+      android:layout_marginRight="25dp"
+      android:orientation="vertical">
+
+      <LinearLayout
+        android:layout_width="match_parent"
         android:layout_height="wrap_content"
-        android:layout_alignParentStart="true"
-        android:layout_alignParentTop="true"
-        android:layout_marginStart="6dp"
-        android:layout_marginTop="0dp"
-        android:lineSpacingExtra="3sp"
-        android:text="@string/user_quit_information2"
-        android:textColor="#999999"
-        android:textSize="12sp"
-        />
-    </RelativeLayout>
-  </LinearLayout>
+        android:orientation="horizontal"
+        >
+
+        <ImageView
+          android:layout_width="2dp"
+          android:layout_height="2dp"
+          android:layout_gravity="center"
+          android:layout_marginRight="5dp"
+          android:src="@drawable/rectangle_c999999"
+          />
+
+        <TextView
+          android:layout_width="wrap_content"
+          android:layout_height="wrap_content"
+          android:lineSpacingExtra="3sp"
+          android:text="@string/user_quit_information3"
+          android:textColor="#999999"
+          android:textSize="12sp"
+          />
+      </LinearLayout>
+    </LinearLayout>
 
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:layout_marginLeft="25dp"
-    android:layout_marginTop="17dp"
-    android:layout_marginRight="25dp"
-    android:orientation="vertical">
+    <Space
+      android:layout_width="match_parent"
+      android:layout_height="0dp"
+      android:layout_weight="1"/>
 
     <LinearLayout
       android:layout_width="match_parent"
       android:layout_height="wrap_content"
+      android:layout_marginStart="25dp"
+      android:layout_marginTop="25dp"
+      android:layout_marginEnd="25dp"
+      android:layout_marginBottom="25dp"
       android:orientation="horizontal"
-      >
-
-      <ImageView
-        android:layout_width="2dp"
-        android:layout_height="2dp"
-        android:layout_gravity="center"
-        android:layout_marginRight="5dp"
-        android:src="@drawable/rectangle_c999999"
+      android:weightSum="4">
+
+      <Button
+        android:id="@+id/button_cancel"
+        android:layout_width="0dp"
+        android:layout_height="42dp"
+        android:layout_gravity="bottom"
+        android:layout_marginEnd="4dp"
+        android:layout_weight="2"
+        android:background="@drawable/input_black_border"
+        android:text="@string/cancel"
         />
 
-      <TextView
-        android:layout_width="wrap_content"
-        android:layout_height="wrap_content"
-        android:lineSpacingExtra="3sp"
-        android:text="@string/user_quit_information3"
-        android:textColor="#999999"
-        android:textSize="12sp"
+      <Button
+        android:id="@+id/button_request"
+        android:layout_width="0dp"
+        android:layout_height="42dp"
+        android:layout_gravity="bottom"
+        android:layout_marginStart="4dp"
+        android:layout_weight="2"
+        android:background="@color/C000000"
+        android:lineSpacingExtra="6sp"
+        android:text="@string/user_quit_request"
+        android:textColor="@color/CFFFFFF"
+        android:textSize="15sp"
         />
     </LinearLayout>
   </LinearLayout>
-
-  <LinearLayout
-    android:layout_width="match_parent"
-    android:layout_height="match_parent"
-    android:layout_marginStart="25dp"
-    android:layout_marginEnd="25dp"
-    android:layout_marginBottom="25dp"
-    android:orientation="horizontal"
-    android:weightSum="4">
-
-    <Button
-      android:layout_width="0dp"
-      android:layout_height="wrap_content"
-      android:layout_gravity="bottom"
-      android:layout_marginEnd="4dp"
-      android:layout_weight="2"
-      android:background="@drawable/input_black_border"
-      android:text="@string/cancel"
-      />
-
-    <Button
-      android:layout_width="0dp"
-      android:layout_height="wrap_content"
-      android:layout_gravity="bottom"
-      android:layout_marginStart="4dp"
-      android:layout_weight="2"
-      android:background="@color/C000000"
-      android:lineSpacingExtra="6sp"
-      android:text="@string/user_quit_request"
-      android:textColor="@color/CFFFFFF"
-      android:textSize="15sp"
-      />
-  </LinearLayout>
-</LinearLayout>
+</android.support.v4.widget.NestedScrollView>

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

@@ -269,6 +269,7 @@
   <string name="user_quit">"<u>회원탈퇴</u>"</string>
   <string name="user_quit_request">탈퇴신청</string>
   <string name="user_quit_info">회원탈퇴 안내</string>
+  <string name="user_quit_request_title">회원탈퇴 신청</string>
 
   <string name="setting_update_information_name_validation">이름을 정확히 입력해주세요.</string>
   <string name="setting_update_birth_date_validation">YYYYMMDD 숫자를 입력해주세요.</string>