Pārlūkot izejas kodu

[메인][Common] 디버그 패널 분리 준비
- 모델/프리젠터 정리, 레이아웃 분리. 모든 로직은 프래그먼트로 이동 -> 별도 클래스로 분리하여 flavor 설정 예정

hyodong.min 6 gadi atpakaļ
vecāks
revīzija
5b54470955

+ 1 - 2
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/IMainView.java

@@ -23,8 +23,6 @@ import kr.co.zumo.app.lifeplus.view.IView;
 public interface IMainView extends IView {
   void drawContents(List<MainContentsBean> data, String weatherCode, String dustCode, String areaName);
 
-  void render();
-
   void scrollToPosition(int index);
 
   void setIndicatorIndex(int index);
@@ -32,4 +30,5 @@ public interface IMainView extends IView {
   void requestLocationPermissions(@NonNull String[] permissions);
 
   void updateWeather(String weatherCode, String dustCode, String areaName);
+
 }

+ 109 - 31
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainFragment.java

@@ -7,6 +7,8 @@ import android.animation.ObjectAnimator;
 import android.os.Bundle;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.support.constraint.ConstraintLayout;
+import android.support.constraint.ConstraintSet;
 import android.support.v4.view.ViewCompat;
 import android.support.v4.view.ViewParentCompat;
 import android.support.v7.widget.LinearLayoutManager;
@@ -33,20 +35,28 @@ import kr.co.zumo.app.R;
 import kr.co.zumo.app.lifeplus.activity.AppInitializer;
 import kr.co.zumo.app.lifeplus.bean.api.CoinInfoBean;
 import kr.co.zumo.app.lifeplus.bean.api.CoinInfoResultBean;
+import kr.co.zumo.app.lifeplus.bean.api.LoginResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.MainContentsBean;
+import kr.co.zumo.app.lifeplus.bean.api.RequestBean;
 import kr.co.zumo.app.lifeplus.config.DebugConfig;
 import kr.co.zumo.app.lifeplus.helper.ActionBarHelper;
 import kr.co.zumo.app.lifeplus.helper.ScreenSizeHelper;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
+import kr.co.zumo.app.lifeplus.model.module.APIError;
+import kr.co.zumo.app.lifeplus.model.module.APILoginStatusMapper;
+import kr.co.zumo.app.lifeplus.model.module.APIMemberSelectModule;
+import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
 import kr.co.zumo.app.lifeplus.supervisor.AnimatorManager;
 import kr.co.zumo.app.lifeplus.supervisor.GuestCoinManager;
+import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
+import kr.co.zumo.app.lifeplus.supervisor.screen.Screen;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
 import kr.co.zumo.app.lifeplus.util.Formatter;
 import kr.co.zumo.app.lifeplus.util.ResourceUtil;
 import kr.co.zumo.app.lifeplus.util.StringUtil;
 import kr.co.zumo.app.lifeplus.util.ViewUtil;
-import kr.co.zumo.app.lifeplus.view.Event;
 import kr.co.zumo.app.lifeplus.view.command.ExitCommand;
+import kr.co.zumo.app.lifeplus.view.command.ScreenCommand;
 import kr.co.zumo.app.lifeplus.view.presenter.CommandInvoker;
 import kr.co.zumo.app.lifeplus.view.screen.FragmentBase;
 
@@ -199,11 +209,6 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     actionBarHelper.animate();
   }
 
-  @Override
-  public void render() {
-    findViewById(R.id.button_sign_up).setEnabled(SuperModel.getInstance().isJoined() == false);
-  }
-
   @Override
   public void setIndicatorIndex(int index) {
     indicator.onChangedIndex(contentsRecyclerView.getAdapter().getItemCount() - 1, index == 0 ? index : index - 1);
@@ -323,10 +328,18 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     }
   }
 
+
+
   /***********************************
    * debug
    ***********************************/
 
+  @Deprecated
+  public void renderDebug() {
+    findViewById(R.id.button_sign_up).setEnabled(SuperModel.getInstance().isJoined() == false);
+  }
+
+  @Deprecated
   private void debug() {
 
     if (AppUtil.isProduct()) {
@@ -334,6 +347,27 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     }
     else {
 
+      View view = findViewById(R.id.layout_test);
+      view.setVisibility(View.GONE);
+
+      ImageView toggleButton = findViewById(R.id.image_toggle);
+      toggleButton.setOnClickListener(v -> {
+        view.setVisibility(view.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
+        if (view.getVisibility() == View.GONE) {
+          toggleButton.setImageResource(R.drawable.icon_arcordion_close_arrow);
+        }
+        else {
+          toggleButton.setImageResource(R.drawable.icon_arcordion_open_arrow);
+        }
+      });
+
+      View testView = findViewById(R.id.layout_test_all);
+      ConstraintSet constraintSet = new ConstraintSet();
+      constraintSet.clone((ConstraintLayout) testView.getParent());
+      constraintSet.connect(testView.getId(), ConstraintSet.BOTTOM, ConstraintSet.PARENT_ID, ConstraintSet.BOTTOM, 0);
+      constraintSet.applyTo((ConstraintLayout) testView.getParent());
+
+
       View button;
 
       button = findViewById(R.id.button_7);
@@ -344,7 +378,6 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
         for (int i = 0; i < list.size(); ++i) {
           list.get(i).setDate(Formatter.format(System.currentTimeMillis() - (86400000 * i), CoinInfoBean.DATE_PATTERN));
         }
-
         GuestCoinManager.saveCoinInfoResultBean(resultBean);
       });
 
@@ -360,40 +393,24 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
 
       button = findViewById(R.id.button_sign_up);
       button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.SIGN_UP).build());
+        new CommandInvoker().invoke(presenter, new ScreenCommand(ScreenID.SIGN_UP_START, ScreenID.DIRECTION_NEXT, Screen.METHOD_SKIP));
       });
 
       button = findViewById(R.id.button_0000);
       button.setOnClickListener(v -> {
         presenter.showWaiter();
-        presenter.onEvent(new Event.Builder(Event.DEFAULT).build());
-        render();
-      });
-
-      View view = findViewById(R.id.layout_test);
-      view.setVisibility(View.GONE);
-
-      ImageView toggleButton = findViewById(R.id.image_toggle);
-      toggleButton.setOnClickListener(v -> {
-        view.setVisibility(view.getVisibility() == View.GONE ? View.VISIBLE : View.GONE);
-        if (view.getVisibility() == View.GONE) {
-          toggleButton.setImageResource(R.drawable.icon_arcordion_close_arrow);
-        }
-        else {
-          toggleButton.setImageResource(R.drawable.icon_arcordion_open_arrow);
-        }
+        setDefaultPin();
+        renderDebug();
       });
 
       button = findViewById(R.id.button_set_account);
       button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.INIT).build());
-
+        initUser();
       });
 
       button = findViewById(R.id.button_set_account_ha);
       button.setOnClickListener(v -> {
-        presenter.onEvent(new Event.Builder(Event.UPDATE).build());
-
+        initUser2();
       });
 
       button = findViewById(R.id.button_cache);
@@ -430,8 +447,6 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
         }
       }
 
-      render();
-
       TextView textView = findViewById(R.id.text_member_status);
       String memberStatus = "";
       if (SuperModel.getInstance().isBlockMember()) {
@@ -449,9 +464,12 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
 
       textView = findViewById(R.id.text_version);
       textView.setText(String.format("앱 버젼: %s", AppUtil.getVersionName()));
+
+      renderDebug();
     }
   }
 
+  @Deprecated
   private void clearData() {
     SuperModel.getInstance().getPreferences().setOnBoardingDone(false);
     SuperModel.getInstance().getPreferences().setZumoUserNo("");
@@ -461,6 +479,66 @@ public class MainFragment extends FragmentBase<MainPresenter> implements IMainVi
     // helpers...
     AppInitializer.disposeHelpers();
 
-    render();
+    renderDebug();
+  }
+
+  /**
+   * 0000 으로 핀 초기화 - 테스트 용 for test
+   */
+  @Deprecated
+  public void setDefaultPin() {
+    SuperModel.getInstance().savePinWithEncryption("0000");
+  }
+
+  @Deprecated
+  public void login() {
+    new APIMemberSelectModule().call(new RequestBean(),
+      new APILoginStatusMapper(SuperModel.getInstance(), new APIModuleListener<LoginResultBean>(presenter) {
+        @Override
+        public void onApiSuccess(LoginResultBean resultBean) {
+          // 정상;
+          renderDebug();
+        }
+
+        @Override
+        public void onApiError(String errorMessage, APIError error) {
+          Log.e("APP#  MainFragment | onApiError", "|" + errorMessage);
+        }
+      })
+    );
+  }
+
+  @Deprecated
+  private void initUser() {
+    SuperModel.getInstance().renewMemberData();
+
+    // 가입하면 설정되는 값들
+    if (DebugConfig.isDebugDevelop()) {
+      // dev
+      SuperModel.getInstance().setUserId("201901140000000009");
+    }
+    else {
+      // product
+      SuperModel.getInstance().setUserId("201902080000000080");
+    }
+    setDefaultPin(); // pin 0000
+    login();
+  }
+
+  @Deprecated
+  private void initUser2() {
+    SuperModel.getInstance().renewMemberData();
+
+    // 가입하면 설정되는 값들
+    if (DebugConfig.isDebugDevelop()) {
+      // dev
+      SuperModel.getInstance().setUserId("201901140000000008");
+    }
+    else {
+      // product
+      SuperModel.getInstance().setUserId("201902110000000134");
+    }
+    setDefaultPin(); // pin 0000
+    login();
   }
 }

+ 1 - 29
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainModel.java

@@ -29,7 +29,6 @@ import io.reactivex.disposables.Disposable;
 import io.reactivex.schedulers.Schedulers;
 import kr.co.zumo.app.lifeplus.bean.api.APIData;
 import kr.co.zumo.app.lifeplus.bean.api.LifeplusAPIBean;
-import kr.co.zumo.app.lifeplus.bean.api.LoginResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.MainContentsBean;
 import kr.co.zumo.app.lifeplus.bean.api.MainContentsResultBean;
 import kr.co.zumo.app.lifeplus.bean.api.MemberPushAgreeRequestBean;
@@ -43,10 +42,8 @@ import kr.co.zumo.app.lifeplus.bean.api.WeatherResultBean;
 import kr.co.zumo.app.lifeplus.model.CoinModel;
 import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.model.module.APIError;
-import kr.co.zumo.app.lifeplus.model.module.APILoginStatusMapper;
 import kr.co.zumo.app.lifeplus.model.module.APIMainContentsModule;
 import kr.co.zumo.app.lifeplus.model.module.APIMemberPushUpdateModule;
-import kr.co.zumo.app.lifeplus.model.module.APIMemberSelectModule;
 import kr.co.zumo.app.lifeplus.model.module.APIModuleListener;
 import kr.co.zumo.app.lifeplus.model.module.APIPopupLoadModule;
 import kr.co.zumo.app.lifeplus.model.module.coop.APIWeatherModule;
@@ -206,32 +203,6 @@ public class MainModel extends CoinModel {
     return promotionPopupBeans;
   }
 
-  /**
-   * 0000 으로 핀 초기화 - 테스트 용 for test
-   */
-  @Deprecated
-  public void setDefaultPin() {
-    SuperModel.getInstance().savePinWithEncryption("0000");
-  }
-
-  @Deprecated
-  public void login() {
-    disposable = new APIMemberSelectModule().call(new RequestBean(),
-      new APILoginStatusMapper(SuperModel.getInstance(), new APIModuleListener<LoginResultBean>(waiterCaller) {
-        @Override
-        public void onApiSuccess(LoginResultBean resultBean) {
-          // 정상;
-          onResult(new Event.Builder(Event.RESULT).integer(Event.MEMBER_LOGIN).build());
-        }
-
-        @Override
-        public void onApiError(String errorMessage, APIError error) {
-          onResult(new Event.Builder(Event.ERROR).integer(Event.MEMBER_LOGIN).string(errorMessage).build());
-        }
-      })
-    );
-  }
-
   public int getIndex() {
     return index;
   }
@@ -596,4 +567,5 @@ public class MainModel extends CoinModel {
       }
     };
   }
+
 }

+ 2 - 71
app/src/main/java/kr/co/zumo/app/lifeplus/view/screen/main/MainPresenter.java

@@ -19,9 +19,7 @@ import kr.co.zumo.app.lifeplus.bean.api.APIData;
 import kr.co.zumo.app.lifeplus.bean.api.LoginBean;
 import kr.co.zumo.app.lifeplus.bean.api.MainContentsCategoryBean;
 import kr.co.zumo.app.lifeplus.bean.api.PromotionPopupBean;
-import kr.co.zumo.app.lifeplus.config.DebugConfig;
 import kr.co.zumo.app.lifeplus.helper.NavigationBar;
-import kr.co.zumo.app.lifeplus.model.SuperModel;
 import kr.co.zumo.app.lifeplus.supervisor.AnimatorManager;
 import kr.co.zumo.app.lifeplus.supervisor.ScreenID;
 import kr.co.zumo.app.lifeplus.util.AppUtil;
@@ -182,16 +180,8 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
           setTimer();
         }
         break;
-      case Event.COMPLETED:
-        if (event.getInteger() == Event.MEMBER_DELETE) {
-          showErrorDialog("탈퇴 완료");
-        }
-        break;
       case Event.RESULT:
-        if (event.getInteger() == Event.MEMBER_LOGIN) {
-          view.render();
-        }
-        else if (event.getInteger() == Event.LOADING_WEATHER) {
+        if (event.getInteger() == Event.LOADING_WEATHER) {
           onWeatherComplete();
         }
         else if (event.getInteger() == SettingViewHolder.SWITCH_LOCATION) {
@@ -200,10 +190,7 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
         }
         break;
       case Event.ERROR:
-        if (event.getInteger() == Event.MEMBER_DELETE) {
-          showErrorDialog(event.getString());
-        }
-        else if (event.getInteger() == Event.LOADING_WEATHER) {
+        if (event.getInteger() == Event.LOADING_WEATHER) {
           onWeatherComplete();
         }
         else {
@@ -290,24 +277,6 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
       case Event.SCROLL:
         scrollToFront();
         break;
-
-      /***********************************
-       * debug
-       ***********************************/
-      case Event.INIT:
-        initUser();
-        break;
-      case Event.UPDATE:
-        initUser2();
-        break;
-      case Event.SIGN_UP:
-        go(ScreenID.SIGN_UP_START);
-        break;
-      case Event.DEFAULT:
-        model.setDefaultPin();
-        break;
-      default:
-        break;
     }
   }
 
@@ -549,42 +518,4 @@ public class MainPresenter extends Presenter<MainModel, IMainView> {
       })
       .show();
   }
-
-  /***********************************
-   * debug
-   ***********************************/
-
-  private void initUser() {
-    SuperModel.getInstance().renewMemberData();
-
-    // 가입하면 설정되는 값들
-    if (DebugConfig.isDebugDevelop()) {
-      // dev
-      SuperModel.getInstance().setUserId("201901140000000009");
-    }
-    else {
-      // product
-      SuperModel.getInstance().setUserId("201902080000000080");
-    }
-    model.setDefaultPin(); // pin 0000
-
-    model.login();
-  }
-
-  private void initUser2() {
-    SuperModel.getInstance().renewMemberData();
-
-    // 가입하면 설정되는 값들
-    if (DebugConfig.isDebugDevelop()) {
-      // dev
-      SuperModel.getInstance().setUserId("201901140000000008");
-    }
-    else {
-      // product fake dummy
-      SuperModel.getInstance().setUserId("201902110000000134");
-    }
-    model.setDefaultPin(); // pin 0000
-
-    model.login();
-  }
 }

+ 1 - 188
app/src/main/res/layout/fragment_main.xml

@@ -7,7 +7,6 @@
   android:layout_width="match_parent"
   android:layout_height="match_parent">
 
-
   <android.support.v7.widget.RecyclerView
     android:id="@+id/recycler_view_main"
     android:layout_width="match_parent"
@@ -18,193 +17,7 @@
     android:layout_width="match_parent"
     android:layout_height="match_parent"/>
 
-  <LinearLayout
-    android:id="@+id/layout_test_all"
-    android:layout_width="match_parent"
-    android:layout_height="wrap_content"
-    android:gravity="bottom"
-    android:orientation="vertical"
-    app:layout_constraintBottom_toBottomOf="parent">
-
-    <ImageView
-      android:id="@+id/image_toggle"
-      android:layout_width="30dp"
-      android:layout_height="30dp"
-      android:layout_gravity="center"
-      android:layout_marginStart="8dp"
-      android:layout_marginEnd="8dp"
-      app:srcCompat="@drawable/icon_arcordion_close_arrow"/>
-
-    <LinearLayout
-      android:id="@+id/layout_test"
-      tools:visibility="gone"
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:background="@color/CFFFFFF"
-      android:orientation="vertical"
-      android:paddingBottom="8dp">
-
-      <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="horizontal"
-        android:paddingStart="20dp"
-        android:paddingTop="10dp"
-        android:paddingEnd="20dp"
-        android:paddingBottom="10dp"
-        >
-
-        <TextView
-          android:id="@+id/text_member_status"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          tools:text="Member status: inactive"/>
-
-        <Space
-          android:layout_width="0dp"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-
-        <TextView
-          android:id="@+id/text_version"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          tools:text="Version: v4.0.0"/>
-
-      </LinearLayout>
-
-      <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="horizontal"
-        android:paddingStart="20dp"
-        android:paddingTop="10dp"
-        android:paddingEnd="20dp"
-        android:paddingBottom="10dp"
-        >
-
-        <Button
-          android:id="@+id/button_set_account"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="MIN"/>
-        <Button
-          android:id="@+id/button_set_account_ha"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="HA"/>
-        <Button
-          android:id="@+id/button_7"
-          android:padding="0dp"
-          android:minWidth="50dp"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="7"/>
-
-        <Space
-          android:layout_width="0dp"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-
-        <Button
-          android:id="@+id/button_clear"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="Clear Data"/>
-
-      </LinearLayout>
-
-      <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="horizontal"
-        android:paddingStart="20dp"
-        android:paddingTop="10dp"
-        android:paddingEnd="20dp"
-        android:paddingBottom="10dp">
-
-        <Button
-          android:id="@+id/button_sign_up"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="Join"/>
-
-        <Space
-          android:layout_width="0dp"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-
-        <Button
-          android:id="@+id/button_zumo"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="Set Zumo User"/>
-
-        <Space
-          android:layout_width="0dp"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-
-        <Button
-          android:id="@+id/button_0000"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="0000"/>
-      </LinearLayout>
-
-
-      <LinearLayout
-        android:layout_width="match_parent"
-        android:layout_height="wrap_content"
-        android:gravity="center"
-        android:orientation="horizontal"
-        android:paddingStart="20dp"
-        android:paddingTop="10dp"
-        android:paddingEnd="20dp"
-        android:paddingBottom="10dp">
-
-        <Button
-          android:id="@+id/button_dev"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="Develop"/>
-
-        <Space
-          android:layout_width="0dp"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-
-        <Button
-          android:id="@+id/button_cache"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="Clear Cache"/>
-
-        <Space
-          android:layout_width="0dp"
-          android:layout_height="wrap_content"
-          android:layout_weight="1"/>
-
-        <Button
-          android:id="@+id/button_product"
-          style="@style/SignUpButton"
-          android:layout_width="wrap_content"
-          android:layout_height="wrap_content"
-          android:text="Product"/>
-      </LinearLayout>
-    </LinearLayout>
-  </LinearLayout>
+  <include layout="@layout/main_test_layout"/>
 
   <android.support.constraint.ConstraintLayout
     android:id="@+id/container_navigation_bar"

+ 191 - 0
app/src/main/res/layout/main_test_layout.xml

@@ -0,0 +1,191 @@
+<?xml version="1.0" encoding="utf-8"?>
+
+<LinearLayout
+  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:id="@+id/layout_test_all"
+  android:layout_width="match_parent"
+  android:layout_height="wrap_content"
+  android:gravity="bottom"
+  android:orientation="vertical">
+
+  <ImageView
+    android:id="@+id/image_toggle"
+    android:layout_width="30dp"
+    android:layout_height="30dp"
+    android:layout_gravity="center"
+    android:layout_marginStart="8dp"
+    android:layout_marginEnd="8dp"
+    app:srcCompat="@drawable/icon_arcordion_close_arrow"/>
+
+  <LinearLayout
+    android:id="@+id/layout_test"
+    tools:visibility="gone"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@color/CFFFFFF"
+    android:orientation="vertical"
+    android:paddingBottom="8dp">
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:gravity="center"
+      android:orientation="horizontal"
+      android:paddingStart="20dp"
+      android:paddingTop="10dp"
+      android:paddingEnd="20dp"
+      android:paddingBottom="10dp"
+      >
+
+      <TextView
+        android:id="@+id/text_member_status"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:text="Member status: inactive"/>
+
+      <Space
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+      <TextView
+        android:id="@+id/text_version"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        tools:text="Version: v4.0.0"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:gravity="center"
+      android:orientation="horizontal"
+      android:paddingStart="20dp"
+      android:paddingTop="10dp"
+      android:paddingEnd="20dp"
+      android:paddingBottom="10dp"
+      >
+
+      <Button
+        android:id="@+id/button_set_account"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="MIN"/>
+      <Button
+        android:id="@+id/button_set_account_ha"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="HA"/>
+      <Button
+        android:id="@+id/button_7"
+        android:padding="0dp"
+        android:minWidth="50dp"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="7"/>
+
+      <Space
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+      <Button
+        android:id="@+id/button_clear"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Clear Data"/>
+
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:gravity="center"
+      android:orientation="horizontal"
+      android:paddingStart="20dp"
+      android:paddingTop="10dp"
+      android:paddingEnd="20dp"
+      android:paddingBottom="10dp">
+
+      <Button
+        android:id="@+id/button_sign_up"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Join"/>
+
+      <Space
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+      <Button
+        android:id="@+id/button_zumo"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Set Zumo User"/>
+
+      <Space
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+      <Button
+        android:id="@+id/button_0000"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="0000"/>
+    </LinearLayout>
+
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:gravity="center"
+      android:orientation="horizontal"
+      android:paddingStart="20dp"
+      android:paddingTop="10dp"
+      android:paddingEnd="20dp"
+      android:paddingBottom="10dp">
+
+      <Button
+        android:id="@+id/button_dev"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Develop"/>
+
+      <Space
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+      <Button
+        android:id="@+id/button_cache"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Clear Cache"/>
+
+      <Space
+        android:layout_width="0dp"
+        android:layout_height="wrap_content"
+        android:layout_weight="1"/>
+
+      <Button
+        android:id="@+id/button_product"
+        style="@style/SignUpButton"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:text="Product"/>
+    </LinearLayout>
+  </LinearLayout>
+</LinearLayout>