From 5479c528b0ce8f210ef71898a026f662f4275f08 Mon Sep 17 00:00:00 2001
From: nilupeng <qingingrunt2010@qq.com>
Date: Thu, 11 Aug 2022 12:15:39 +0000
Subject: [PATCH] 签到 金币账户设置

---
 app/src/main/res/values/styles.xml                                     |    3 
 app/src/main/res/layout/activity_setting_coin.xml                      |   92 ++++
 app/src/main/java/com/runt/open/mvvm/util/DatesUtil.java               |  379 ++++++++++++++++++
 app/src/main/AndroidManifest.xml                                       |    3 
 app/src/main/java/com/runt/open/mvvm/ui/sign/SignInViewModel.java      |   28 +
 app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingActivity.java  |   99 ++++
 app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java    |   10 
 app/src/main/res/drawable/bg_gold_circle.xml                           |   11 
 app/src/main/java/com/runt/open/mvvm/data/Results.java                 |   42 ++
 app/src/main/java/com/runt/open/mvvm/ui/sign/SignInActivity.java       |  166 +++++++
 app/src/main/res/layout/activity_signs.xml                             |  245 +++++++++++
 app/src/main/res/layout/item_calendar_day.xml                          |   19 
 app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java |   30 
 app/src/main/java/com/runt/open/mvvm/ui/adapter/CalendarAdapter.java   |   58 ++
 app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingViewModel.java |   19 
 15 files changed, 1,186 insertions(+), 18 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index b3b79ce..81610f4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -48,6 +48,9 @@
         <activity android:name=".ui.SettingActivity" />
         <activity android:name=".ui.AboutActivity" />
         <activity android:name=".ui.msg.MsgDetailActivity" />
+        <activity android:name=".ui.sign.SignInActivity" />
+        <activity android:name=".ui.coin.CoinSettingActivity" />
+        <activity android:name=".ui.loadpage.PageActivitys$CoinRecordActivity" tools:ignore="Instantiatable"/>
 
     </application>
 
diff --git a/app/src/main/java/com/runt/open/mvvm/data/Results.java b/app/src/main/java/com/runt/open/mvvm/data/Results.java
index a5a5143..791f53b 100644
--- a/app/src/main/java/com/runt/open/mvvm/data/Results.java
+++ b/app/src/main/java/com/runt/open/mvvm/data/Results.java
@@ -2,6 +2,7 @@
 
 import com.runt.open.mvvm.ui.login.UserBean;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
 
 /**
@@ -38,4 +39,45 @@
          **/
         public Object remark;
     }
+
+
+    public static class Mycalendar {
+
+        String day;
+        int style;
+        long dateTime;
+        public String getDay() {
+            return day;
+        }
+
+        public void setDay(String day) {
+            this.day = day;
+        }
+
+        public int getStyle() {
+            return style;
+        }
+
+        public void setStyle(int style) {
+            this.style = style;
+        }
+
+        public long getDateTime() {
+            return dateTime;
+        }
+
+        public void setDateTime(long dateTime) {
+            this.dateTime = dateTime;
+        }
+
+        SimpleDateFormat datesdf = new SimpleDateFormat("yyyy-MM-dd");
+        @Override
+        public String toString() {
+            return "Mycalendar{" +
+                    "day='" + day + '\'' +
+                    ", style=" + style +
+                    ", dateTime=" + datesdf.format(new Date(dateTime)) +
+                    '}';
+        }
+    }
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java b/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
index 22ddc5f..7c0e28d 100644
--- a/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
+++ b/app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java
@@ -8,6 +8,7 @@
 import okhttp3.MultipartBody;
 import retrofit2.http.*;
 
+import java.util.List;
 import java.util.Map;
 
 /**
@@ -63,16 +64,6 @@
     @POST("updatehead")
     Observable<Results.StringApiResult> updateHead(@Part MultipartBody.Part file);
 
-
-    /**
-     * 获取咨询列表
-     * @param pageNum   页数
-     * @param pageSize  每页数量
-     * @return
-     */
-    @GET("getMsgList")
-    Observable<HttpApiResult<PageResult<Results.Message>>> getMsgList(@Query("page") int pageNum, @Query("size") int pageSize);
-
     /**
      * app更新
      * @return
@@ -80,12 +71,21 @@
     @GET("getMsgDetail")
     Observable<HttpApiResult<Results.Message>> getMsgDetail(@Query("id") String id);
 
+    @POST("updateAlipay")
+    Observable<Results.StringApiResult> updateAlipay(@Field("account") String account,@Field("paypass") String paypass);
+
+    @POST("updateRealname")
+    Observable<Results.StringApiResult> updateRealname(@Field("account") String account,@Field("paypass") String paypass);
+
     /**
-     * 获取金币记录
-     * @param pageNum   页数
-     * @param pageSize  每页数量
+     * 获取签到列表
+     * @param month
      * @return
      */
-    @GET("coinRecord")
-    Observable<HttpApiResult<PageResult<Results.CustomCoin>>> getCoinRecord(@Query("page") int pageNum, @Query("size") int pageSize, @Query("inOrOut") int inOrOut);
+    @GET("getSignsByMonth")
+    Observable<HttpApiResult<List<String>>> getSignsByMonth(@Query("month") String month);
+
+    @POST("signIn")
+    Observable<Results.StringApiResult> signIn();
+
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/adapter/CalendarAdapter.java b/app/src/main/java/com/runt/open/mvvm/ui/adapter/CalendarAdapter.java
new file mode 100644
index 0000000..22722d8
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/adapter/CalendarAdapter.java
@@ -0,0 +1,58 @@
+package com.runt.open.mvvm.ui.adapter;
+
+import android.widget.TextView;
+import com.runt.open.mvvm.R;
+import com.runt.open.mvvm.base.adapter.BaseAdapter;
+import com.runt.open.mvvm.data.Results;
+import com.runt.open.mvvm.databinding.ItemCalendarDayBinding;
+
+import java.util.List;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+public class CalendarAdapter extends BaseAdapter<Results.Mycalendar, ItemCalendarDayBinding> {
+
+    public CalendarAdapter(List<Results.Mycalendar> list) {
+        this.dataList = list;
+    }
+
+    @Override
+    protected void onBindView(ItemCalendarDayBinding binding, int position, Results.Mycalendar mycalendar) {
+
+        TextView txt = binding.txtDay;
+        txt.setTextColor(binding.getRoot().getContext().getResources().getColor(R.color.white));
+        switch (mycalendar.getStyle()){
+            case 0://已签到
+                txt.setBackground(binding.getRoot().getContext().getResources().getDrawable(R.drawable.bg_blue_circle));
+                break;
+
+            case 1://当月未签到
+                txt.setBackground(binding.getRoot().getContext().getResources().getDrawable(R.drawable.bg_enable_circle));
+                break;
+
+            case 2://今日
+                txt.setBackground(binding.getRoot().getContext().getResources().getDrawable(R.drawable.bg_red_border_circle));
+                txt.setTextColor(binding.getRoot().getContext().getResources().getColor(R.color.txt_normal));
+                break;
+
+            case 3://还未到
+                txt.setBackgroundColor(binding.getRoot().getContext().getResources().getColor(R.color.white));
+                txt.setTextColor(binding.getRoot().getContext().getResources().getColor(R.color.txt_normal));
+                break;
+            case 4://不是本月
+                txt.setBackgroundColor(binding.getRoot().getContext().getResources().getColor(R.color.white));
+                txt.setTextColor(binding.getRoot().getContext().getResources().getColor(R.color.txt_enable));
+                break;
+            case 5://领取金币
+                txt.setBackground(binding.getRoot().getContext().getResources().getDrawable(R.drawable.bg_gold_circle));
+                break;
+            case 6://今日已签到
+                txt.setBackground(binding.getRoot().getContext().getResources().getDrawable(R.drawable.bg_red_circle));
+                //txt.setBackground(binding.getRoot().getContext().getResources().getDrawable(R.drawable.bg_blue_circle));
+                break;
+
+        }
+        txt.setText(mycalendar.getDay());
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingActivity.java
new file mode 100644
index 0000000..1123633
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingActivity.java
@@ -0,0 +1,99 @@
+package com.runt.open.mvvm.ui.coin;
+
+import android.content.Intent;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import com.runt.open.mvvm.base.activities.BaseActivity;
+import com.runt.open.mvvm.data.HttpApiResult;
+import com.runt.open.mvvm.databinding.ActivitySettingCoinBinding;
+import com.runt.open.mvvm.listener.ResPonse;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+import com.runt.open.mvvm.ui.login.UserBean;
+
+/**
+ * My father is Object, ites purpose of 金币交易设置
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-30.
+ */
+public class CoinSettingActivity extends BaseActivity<ActivitySettingCoinBinding,CoinSettingViewModel> {
+
+    private int requestCode = 0;
+
+    @Override
+    public void initViews() {
+        ActivityResultLauncher<Intent>  launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
+            if( result.getResultCode() == RESULT_OK){
+                String pass = result.getData().getStringExtra("paypass");
+                HttpObserver<String> observer = new HttpObserver<String>() {
+                    @Override
+                    protected void onSuccess(String data) {
+                        if(REQUEST_CODE_PAYPASS_FOR_ALIPAY == requestCode ){
+                            showToast("支付宝修改成功");
+                            UserBean.getUser().setAlipay(mBinding.txtAlipay.getText().toString());
+                        }else if(REQUEST_CODE_PAYPASS_FOR_REALNAME == requestCode ){
+                            showToast("修改成功");
+                            UserBean.getUser().setRealname(mBinding.txtRealname.getText().toString());
+                        }
+                    }
+
+                    @Override
+                    protected void onFailed(HttpApiResult error) {
+                        super.onFailed(error);
+                        loadData();
+                        if(error.code == 621){
+                            showDialog("设置支付密码", "当前账号还没有设置支付密码", "设置", "取消", new ResPonse() {
+                                @Override
+                                public void doSuccess(Object obj) {
+                                    //startActivity(new Intent(mContext, PaypassActivity.class).putExtra("type", 1));//去设置密码
+                                }
+                            });
+                        }
+
+                    }
+                };
+                if(REQUEST_CODE_PAYPASS_FOR_ALIPAY == requestCode ){
+                    mViewModel.updateAlipay(mBinding.txtAlipay.getText().toString(),pass,observer);
+                }else if(REQUEST_CODE_PAYPASS_FOR_REALNAME == requestCode ){
+                    mViewModel.updateName(mBinding.txtRealname.getText().toString(),pass,observer);
+                }
+            }
+        });
+        mBinding.linAlipay.setOnClickListener(v->{
+            showInputDialog("修改支付宝账号", UserBean.getUser().getAlipay(), "请输入支付宝账号用于提现", new ResPonse() {
+                @Override
+                public void doSuccess(Object obj) {
+                    mBinding.txtAlipay.setText(obj.toString());
+                    requestCode = REQUEST_CODE_PAYPASS_FOR_ALIPAY;
+                    //launcher.launch(new Intent(mContext, PaypassActivity.class));
+                }
+            });
+        });
+        mBinding.linRealname.setOnClickListener(v->{
+            showInputDialog("修改真实姓名", UserBean.getUser().getRealname(), "请输入真实姓名用于提现", new ResPonse() {
+                @Override
+                public void doSuccess(Object obj) {
+                    requestCode = REQUEST_CODE_PAYPASS_FOR_REALNAME;
+                    mBinding.txtRealname.setText(obj.toString());
+                    //launcher.launch(new Intent(mContext, PaypassActivity.class));
+                }
+            });
+        });
+        mBinding.linPass.setOnClickListener(v->{
+            //startActivity(new Intent(mContext,PaypassActivity.class).putExtra("type",1));
+        });
+    }
+
+    @Override
+    public void loadData() {
+        if(UserBean.getUser().getAlipay()!=null){
+            mBinding.txtAlipay.setText(UserBean.getUser().getAlipay());
+        }else{
+            mBinding.txtAlipay.setText("");
+        }
+        if(UserBean.getUser().getRealname() != null){
+            mBinding.txtRealname.setText(UserBean.getUser().getRealname());
+        }else{
+            mBinding.txtRealname.setText("");
+        }
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingViewModel.java
new file mode 100644
index 0000000..466f798
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingViewModel.java
@@ -0,0 +1,19 @@
+package com.runt.open.mvvm.ui.coin;
+
+import com.runt.open.mvvm.base.model.BaseViewModel;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+public class CoinSettingViewModel extends BaseViewModel {
+
+    public void updateName(String name,String pass, HttpObserver<String> httpObserver){
+        httpObserverOnLoading(commonApi.updateRealname(name,pass),httpObserver);
+    }
+
+    public void updateAlipay(String alipay,String pass, HttpObserver<String> httpObserver){
+        httpObserverOnLoading(commonApi.updateAlipay(alipay,pass),httpObserver);
+    }
+
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java b/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
index 428d272..4eeb5fb 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java
@@ -5,6 +5,8 @@
 import android.content.pm.ActivityInfo;
 import android.view.View;
 import android.widget.TextView;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
 import com.luck.picture.lib.PictureSelector;
@@ -17,8 +19,10 @@
 import com.runt.open.mvvm.databinding.FragmentMineBinding;
 import com.runt.open.mvvm.listener.ResPonse;
 import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+import com.runt.open.mvvm.ui.coin.CoinSettingActivity;
 import com.runt.open.mvvm.ui.loadpage.PageActivitys;
 import com.runt.open.mvvm.ui.login.UserBean;
+import com.runt.open.mvvm.ui.sign.SignInActivity;
 import com.runt.open.mvvm.util.GlideEngine;
 import com.runt.open.mvvm.util.MyLog;
 import sakura.bottommenulibrary.bottompopfragmentmenu.BottomMenuFragment;
@@ -36,7 +40,9 @@
 public class MineFragment extends BaseFragment<FragmentMineBinding,MineViewModel> implements View.OnClickListener {
 
     private final  String TAG = "MineFragment";
+    ActivityResultLauncher<Intent> signLaunch = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
 
+    });
     @Override
     public void initViews() {
     }
@@ -103,7 +109,7 @@
                                             }
                                         });
                                     }else{
-                                        startActivityForResult(new Intent(mActivity, WithDrawActivity.class),REQUEST_CODE_WITHDRAW );
+                                        //startActivityForResult(new Intent(mActivity, WithDrawActivity.class),REQUEST_CODE_WITHDRAW );
                                     }
                                 }
                             }
@@ -111,7 +117,7 @@
                         .show();
                 break;
             case R.id.lin_sign://签到
-                startActivityForResult(new Intent(getContext(), SignInActivity.class),REQUEST_CODE_SIGN);
+                signLaunch.launch(new Intent(getContext(), SignInActivity.class));
                 break;
         }
     }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/sign/SignInActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/sign/SignInActivity.java
new file mode 100644
index 0000000..a752121
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/sign/SignInActivity.java
@@ -0,0 +1,166 @@
+package com.runt.open.mvvm.ui.sign;
+
+import android.util.Log;
+import androidx.recyclerview.widget.GridLayoutManager;
+import com.runt.open.mvvm.base.activities.BaseActivity;
+import com.runt.open.mvvm.data.HttpApiResult;
+import com.runt.open.mvvm.data.Results;
+import com.runt.open.mvvm.databinding.ActivitySignsBinding;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+import com.runt.open.mvvm.ui.adapter.CalendarAdapter;
+import com.runt.open.mvvm.ui.login.UserBean;
+import com.runt.open.mvvm.util.DatesUtil;
+
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.TimeZone;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+public class SignInActivity extends BaseActivity<ActivitySignsBinding,SignInViewModel> {
+
+    List<Results.Mycalendar> list = new ArrayList<>();
+    CalendarAdapter adapter = new CalendarAdapter(list);
+    SimpleDateFormat datesdf = new SimpleDateFormat("yyyy-MM-dd");
+    SimpleDateFormat monthdf = new SimpleDateFormat("yyyy/MM");
+    SimpleDateFormat secondsdf = new SimpleDateFormat("dd");
+    int last = 0 ;
+
+    HttpObserver<List<String>> observer = new HttpObserver<List<String>>() {
+        @Override
+        protected void onSuccess(List<String> data) {
+            last = (int) mBinding.txtCalendarTitle.getTag();
+            String today = datesdf.format(new Date());
+            if(data.contains(today)){
+                mBinding.btnSign.setText("已签到");
+                mBinding.btnSign.setEnabled(false);
+            }
+            initCalendar(data);
+            loadMothBtn(getStartDate());
+        }
+
+        @Override
+        protected void onFailed(HttpApiResult error) {
+            super.onFailed(error);
+            loadMothBtn(getStartDate());
+        }
+    };
+    @Override
+    public void initViews() {
+        mBinding.lastMonth.setOnClickListener(v->{
+            v.setEnabled(false);
+            mBinding.txtCalendarTitle.setTag(last - 1);
+            mViewModel.getSigns(last-1,observer);
+        });
+        mBinding.nextMonth.setOnClickListener(v->{
+            v.setEnabled(false);
+            mBinding.txtCalendarTitle.setTag(last+ 1);
+            mViewModel.getSigns(last+1,observer);;});
+        mBinding.btnSign.setOnClickListener(v->{mViewModel.signIn(new HttpObserver<String>(this) {
+            @Override
+            protected void onSuccess(String data) {
+                showToast("赠送金币"+data+"个");
+                UserBean.getUser().setCoin(UserBean.getUser().getCoin()+Integer.parseInt(data.toString()));
+                UserBean.getUser().setSign(UserBean.getUser().getSign()+1);
+                mBinding.txtSigns.setText(UserBean.getUser().getSign()+"天");
+                mBinding.btnSign.setEnabled(false);
+                mBinding.btnSign.setText("已签到");
+                setResult(RESULT_OK);
+                mViewModel.getSigns(last,observer);
+            }
+
+            @Override
+            protected void onFailed(HttpApiResult error) {
+                super.onFailed(error);
+                if(error.code == 610){
+                    mBinding.btnSign.setEnabled(false);
+                    mBinding.btnSign.setText("已签到");
+                }
+            }
+        });});
+        mBinding.recycler.setLayoutManager(new GridLayoutManager(mContext,7));
+        mBinding.recycler.setAdapter(adapter);
+    }
+
+    @Override
+    public void loadData() {
+        initCalendar(new ArrayList<>());
+        mBinding.txtCalendarTitle.setTag(last);
+        mViewModel.getSigns(last,observer);
+    }
+
+    /**
+     * 加载🗓
+     * @param signList
+     */
+    private  void initCalendar(List<String> signList ){
+        list.clear();
+        Date startDate = getStartDate();
+        Date endDate = DatesUtil.getEndDayOfMonth(DatesUtil.getNowMonth()+last);
+        int days = (int) ((endDate.getTime() - startDate.getTime())/(60000*60*24));
+        int week = DatesUtil.getWeekOfDate(startDate);
+        long starttime = startDate.getTime()-((60000*60*24*week-1));
+        int lastWeek = DatesUtil.getWeekOfDate(endDate);
+        long endtime = endDate.getTime()+((60000*60*24*(6-lastWeek)));
+        days+=week+1;
+        days+=(6-lastWeek);
+        int newDays = (int) ((endtime- starttime)/(60000*60*24));
+        //Log.e(TAG,"days:"+days +" newDays:"+newDays+" month:"+(DatesUtil.getNowMonth()+last)+" endDate:"+datesdf.format(endDate));
+        for(int i  = 0 ; i < days ; i ++ ){
+            Results.Mycalendar calendar = new Results.Mycalendar();
+            long dateTime = starttime+(i*(60000l*60*24));
+            calendar.setDateTime(dateTime);
+            calendar.setDay(secondsdf.format(new Date(dateTime)));
+            /*if(coinList.contains(datesdf.format(new Date(dateTime)))){//是否赠送了金币
+                calendar.setStyle(5);
+            }else */if(dateTime < startDate.getTime() || dateTime > endDate.getTime()){//不是本月的日期
+                calendar.setStyle(4);
+            }else if(datesdf.format(new Date()).equals(datesdf.format(new Date(dateTime)))&& !signList.contains(datesdf.format(new Date(dateTime)))){//今天
+                Log.e(TAG,"今天"+datesdf.format(new Date()));
+                calendar.setStyle(2);
+            }else if(datesdf.format(new Date()).equals(datesdf.format(new Date(dateTime)))&& signList.contains(datesdf.format(new Date(dateTime)))){//今天
+                calendar.setStyle(6);
+            }else if(new Date().getTime()<dateTime){//还没到的日期
+                calendar.setStyle(3);
+            }else if(signList.contains(datesdf.format(new Date(dateTime)))){//是否签到
+                calendar.setStyle(0);
+            }else{
+                calendar.setStyle(1);
+            }
+            //Log.e(TAG,"day:"+datesdf.format(new Date(dateTime)) + " sign:"+signs.contains(datesdf.format(new Date(dateTime))));
+            list.add(calendar);
+        }
+        adapter.notifyDataSetChanged();
+        mBinding.txtCalendarTitle.setText(monthdf.format(startDate));
+        loadMothBtn(startDate);
+
+    }
+
+    private Date getStartDate(){
+        secondsdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
+        datesdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
+        return DatesUtil.getBeginDayOfMonth(DatesUtil.getNowMonth()+last);
+    }
+
+    private void loadMothBtn(Date startDate){
+
+        try {
+            if(monthdf.format(startDate).equals(monthdf.format(new Date()))|| new Date().getTime()<startDate.getTime()) {//超过指定日期禁止点击
+                mBinding.nextMonth.setEnabled(false);
+            }else{
+                mBinding.nextMonth.setEnabled(true);
+            }
+            if(monthdf.format(startDate).equals("2021/09") || monthdf.parse("2021/09").getTime()>startDate.getTime()){//超过指定日期禁止点击
+                mBinding.lastMonth.setEnabled(false);
+            }else{
+                mBinding.lastMonth.setEnabled(true);
+            }
+        } catch (ParseException e) {
+            e.printStackTrace();
+        }
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/sign/SignInViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/sign/SignInViewModel.java
new file mode 100644
index 0000000..405efe0
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/sign/SignInViewModel.java
@@ -0,0 +1,28 @@
+package com.runt.open.mvvm.ui.sign;
+
+import com.runt.open.mvvm.base.model.BaseViewModel;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+import com.runt.open.mvvm.util.DatesUtil;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+public class SignInViewModel extends BaseViewModel {
+
+
+
+    public void signIn(HttpObserver<String> observer){
+        httpObserverOn(commonApi.signIn(),observer);
+    }
+
+    public void getSigns(int month,HttpObserver<List<String>> observer){
+        SimpleDateFormat monthdf = new SimpleDateFormat("yyyy-MM");
+        Date startDate = DatesUtil.getBeginDayOfMonth(DatesUtil.getNowMonth()+month);
+        httpObserverOn(commonApi.getSignsByMonth(monthdf.format(startDate)),observer);
+    }
+
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/util/DatesUtil.java b/app/src/main/java/com/runt/open/mvvm/util/DatesUtil.java
new file mode 100644
index 0000000..83a5819
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/util/DatesUtil.java
@@ -0,0 +1,379 @@
+package com.runt.open.mvvm.util;
+
+import android.annotation.SuppressLint;
+
+import java.sql.Timestamp;
+import java.util.*;
+
+/**
+ * My father is Object, ites purpose of
+ *
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+
+public class DatesUtil {
+    /**
+     * 获取当前日期是星期几<br>
+     *
+     * @param date
+     * @return 当前日期是星期几    首日为星期日
+     */
+    public static int getWeekOfDate(Date date) {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
+        if (w < 0)
+            w = 0;
+        return w;
+    }
+
+    // 获取当天的开始时间
+    public static Date getDayBegin() {
+        Calendar cal = new GregorianCalendar();
+        cal.set(Calendar.HOUR_OF_DAY, 0);
+        cal.set(Calendar.MINUTE, 0);
+        cal.set(Calendar.SECOND, 0);
+        cal.set(Calendar.MILLISECOND, 0);
+        return cal.getTime();
+    }
+
+    // 获取当天的结束时间
+    public static Date getDayEnd() {
+        Calendar cal = new GregorianCalendar();
+        cal.set(Calendar.HOUR_OF_DAY, 23);
+        cal.set(Calendar.MINUTE, 59);
+        cal.set(Calendar.SECOND, 59);
+        return cal.getTime();
+    }
+
+    // 获取昨天的开始时间
+    public static Date getBeginDayOfYesterday() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getDayBegin());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    // 获取昨天的结束时间
+    public static Date getEndDayOfYesterDay() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getDayEnd());
+        cal.add(Calendar.DAY_OF_MONTH, -1);
+        return cal.getTime();
+    }
+
+    // 获取明天的开始时间
+    public static Date getBeginDayOfTomorrow() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getDayBegin());
+        cal.add(Calendar.DAY_OF_MONTH, 1);
+        return cal.getTime();
+    }
+
+    // 获取明天的结束时间
+    public static Date getEndDayOfTomorrow() {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(getDayEnd());
+        cal.add(Calendar.DAY_OF_MONTH, 1);
+        return cal.getTime();
+    }
+
+    // 获取本周的开始时间
+    @SuppressWarnings("unused")
+    public static Date getBeginDayOfWeek() {
+        Date date = new Date();
+        if (date == null) {
+            return null;
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
+        if (dayofweek == 1) {
+            dayofweek += 7;
+        }
+        cal.add(Calendar.DATE, 2 - dayofweek);
+        return getDayStartTime(cal.getTime());
+    }
+
+    // 获取本周的结束时间
+    public static Date getEndDayOfWeek() {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(getBeginDayOfWeek());
+        cal.add(Calendar.DAY_OF_WEEK, 6);
+        Date weekEndSta = cal.getTime();
+        return getDayEndTime(weekEndSta);
+    }
+
+    // 获取上周的开始时间
+    @SuppressWarnings("unused")
+    public static Date getBeginDayOfLastWeek() {
+        Date date = new Date();
+        if (date == null) {
+            return null;
+        }
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
+        if (dayofweek == 1) {
+            dayofweek += 7;
+        }
+        cal.add(Calendar.DATE, 2 - dayofweek - 7);
+        return getDayStartTime(cal.getTime());
+    }
+
+    // 获取上周的结束时间
+    public static Date getEndDayOfLastWeek() {
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(getBeginDayOfLastWeek());
+        cal.add(Calendar.DAY_OF_WEEK, 6);
+        Date weekEndSta = cal.getTime();
+        return getDayEndTime(weekEndSta);
+    }
+
+
+    // 获取本月的结束时间
+    @SuppressLint("WrongConstant")
+    public static Date getEndDayOfMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(getNowYear(), getNowMonth() - 1, 1);
+        int day = calendar.getActualMaximum(5);
+        calendar.set(getNowYear(), getNowMonth() - 1, day);
+        return getDayEndTime(calendar.getTime());
+    }
+
+    // 获取当年某月的结束时间
+    @SuppressLint("WrongConstant")
+    public static Date getEndDayOfMonth(int month) {
+        return getEndDayOfMonth(getNowYear(),month);
+    }
+
+    // 获取某年某月的结束时间
+    @SuppressLint("WrongConstant")
+    public static Date getEndDayOfMonth(int year,int month) {
+        Calendar calendar = Calendar.getInstance();
+        if(month <= 0){
+            year-=(1+((Math.abs(month))/12));
+            month = 12-(Math.abs(month)%12);
+        }else if( month > 12){
+            year +=(1+((Math.abs(month))/12));
+            month = (Math.abs(month)%12);
+        }
+        calendar.set(year, month - 1, 1);
+        int day = calendar.getActualMaximum(5);
+        calendar.set(year, month - 1, day);
+        return getDayEndTime(calendar.getTime());
+    }
+    // 获取某月的开始时间
+    public static Date getBeginDayOfMonth(int month) {
+        return getBeginDayOfMonth(getNowYear(),month);
+    }
+
+    // 获取某年某月的开始时间
+    public static Date getBeginDayOfMonth(int year, int month) {
+        Calendar calendar = Calendar.getInstance();
+        if(month <= 0){
+            year-=(1+((Math.abs(month))/12));
+            month = 12-(Math.abs(month)%12);
+        }else if( month > 12){
+            year +=(1+((Math.abs(month))/12));
+            month = (Math.abs(month)%12);
+        }
+        calendar.set(year, month-1, 1);
+        return getDayStartTime(calendar.getTime());
+    }
+
+    // 获取上月的结束时间
+    @SuppressLint("WrongConstant")
+    public static Date getEndDayOfLastMonth() {
+        Calendar calendar = Calendar.getInstance();
+        calendar.set(getNowYear(), getNowMonth() - 2, 1);
+        int day = calendar.getActualMaximum(5);
+        calendar.set(getNowYear(), getNowMonth() - 2, day);
+        return getDayEndTime(calendar.getTime());
+    }
+
+    /**
+     * 获取当月多少天
+     * @param year
+     * @param month
+     * @return
+     */
+    public static int getDaysOfMonth(int year,int month){
+        Calendar c = Calendar.getInstance();
+        c.set(year, month, 0); //输入类型为int类型
+        return c.get(Calendar.DAY_OF_MONTH);
+    }
+
+    // 获取本年的开始时间
+    public static Date getBeginDayOfYear() {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, getNowYear());
+        cal.set(Calendar.MONTH, Calendar.JANUARY);
+        cal.set(Calendar.DATE, 1);
+        return getDayStartTime(cal.getTime());
+    }
+
+    // 获取本年的结束时间
+    public static Date getEndDayOfYear() {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, getNowYear());
+        cal.set(Calendar.MONTH, Calendar.DECEMBER);
+        cal.set(Calendar.DATE, 31);
+        return getDayEndTime(cal.getTime());
+    }
+
+    // 获取某个日期的开始时间
+    public static Timestamp getDayStartTime(Date d) {
+        Calendar calendar = Calendar.getInstance();
+        if (null != d)
+            calendar.setTime(d);
+        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
+                calendar.get(Calendar.DAY_OF_MONTH), 0, 0, 0);
+        calendar.set(Calendar.MILLISECOND, 0);
+        return new Timestamp(calendar.getTimeInMillis());
+    }
+
+    // 获取某个日期的结束时间
+    public static Timestamp getDayEndTime(Date d) {
+        Calendar calendar = Calendar.getInstance();
+        if (null != d)
+            calendar.setTime(d);
+        calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH),
+                calendar.get(Calendar.DAY_OF_MONTH), 23, 59, 59);
+        calendar.set(Calendar.MILLISECOND, 999);
+        return new Timestamp(calendar.getTimeInMillis());
+    }
+
+    // 获取今年是哪一年
+    @SuppressLint("WrongConstant")
+    public static Integer getNowYear() {
+        Date date = new Date();
+        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
+        gc.setTime(date);
+        return Integer.valueOf(gc.get(1));
+    }
+
+    // 获取本月是哪一月
+    @SuppressLint("WrongConstant")
+    public static int getNowMonth() {
+        Date date = new Date();
+        GregorianCalendar gc = (GregorianCalendar) Calendar.getInstance();
+        gc.setTime(date);
+        return gc.get(2) + 1;
+    }
+
+    // 两个日期相减得到的天数
+    public static int getDiffDays(Date beginDate, Date endDate) {
+        if (beginDate == null || endDate == null) {
+            throw new IllegalArgumentException("getDiffDays param is null!");
+        }
+        long diff = (endDate.getTime() - beginDate.getTime())
+                / (1000 * 60 * 60 * 24);
+        int days = new Long(diff).intValue();
+        return days;
+    }
+
+    // 两个日期相减得到的毫秒数
+    public static long dateDiff(Date beginDate, Date endDate) {
+        long date1ms = beginDate.getTime();
+        long date2ms = endDate.getTime();
+        return date2ms - date1ms;
+    }
+
+    // 获取两个日期中的最大日期
+    public static Date max(Date beginDate, Date endDate) {
+        if (beginDate == null) {
+            return endDate;
+        }
+        if (endDate == null) {
+            return beginDate;
+        }
+        if (beginDate.after(endDate)) {
+            return beginDate;
+        }
+        return endDate;
+    }
+
+    // 获取两个日期中的最小日期
+    public static Date min(Date beginDate, Date endDate) {
+        if (beginDate == null) {
+            return endDate;
+        }
+        if (endDate == null) {
+            return beginDate;
+        }
+        if (beginDate.after(endDate)) {
+            return endDate;
+        }
+        return beginDate;
+    }
+
+    // 返回某月该季度的第一个月
+    public static Date getFirstSeasonDate(Date date) {
+        final int[] SEASON = { 1, 1, 1, 2, 2, 2, 3, 3, 3, 4, 4, 4 };
+        Calendar cal = Calendar.getInstance();
+        cal.setTime(date);
+        int sean = SEASON[cal.get(Calendar.MONTH)];
+        cal.set(Calendar.MONTH, sean * 3 - 3);
+        return cal.getTime();
+    }
+
+    // 返回某个日期下几天的日期
+    public static Date getNextDay(Date date, int i) {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(date);
+        cal.set(Calendar.DATE, cal.get(Calendar.DATE) + i);
+        return cal.getTime();
+    }
+
+    // 返回某个日期前几天的日期
+    public static Date getFrontDay(Date date, int i) {
+        Calendar cal = new GregorianCalendar();
+        cal.setTime(date);
+        cal.set(Calendar.DATE, cal.get(Calendar.DATE) - i);
+        return cal.getTime();
+    }
+
+    // 获取某年某月到某年某月按天的切片日期集合(间隔天数的集合)
+    @SuppressWarnings({ "rawtypes", "unchecked" })
+    public static List getTimeList(int beginYear, int beginMonth, int endYear,
+                                   int endMonth, int k) {
+        List list = new ArrayList();
+        if (beginYear == endYear) {
+            for (int j = beginMonth; j <= endMonth; j++) {
+                list.add(getTimeList(beginYear, j, k));
+            }
+        } else {
+            {
+                for (int j = beginMonth; j < 12; j++) {
+                    list.add(getTimeList(beginYear, j, k));
+                }
+                for (int i = beginYear + 1; i < endYear; i++) {
+                    for (int j = 0; j < 12; j++) {
+                        list.add(getTimeList(i, j, k));
+                    }
+                }
+                for (int j = 0; j <= endMonth; j++) {
+                    list.add(getTimeList(endYear, j, k));
+                }
+            }
+        }
+        return list;
+    }
+
+    // 获取某年某月按天切片日期集合(某个月间隔多少天的日期集合)
+    @SuppressWarnings({ "unchecked", "rawtypes" })
+    public static List getTimeList(int beginYear, int beginMonth, int k) {
+        List list = new ArrayList();
+        Calendar begincal = new GregorianCalendar(beginYear, beginMonth, 1);
+        int max = begincal.getActualMaximum(Calendar.DATE);
+        for (int i = 1; i < max; i = i + k) {
+            list.add(begincal.getTime());
+            begincal.add(Calendar.DATE, k);
+        }
+        begincal = new GregorianCalendar(beginYear, beginMonth, max);
+        list.add(begincal.getTime());
+        return list;
+    }
+
+}
diff --git a/app/src/main/res/drawable/bg_gold_circle.xml b/app/src/main/res/drawable/bg_gold_circle.xml
new file mode 100644
index 0000000..520f868
--- /dev/null
+++ b/app/src/main/res/drawable/bg_gold_circle.xml
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="utf-8"?>
+<selector xmlns:android="http://schemas.android.com/apk/res/android">
+
+    <item>
+        <shape android:shape="rectangle">
+            <corners android:radius="@dimen/circle" />
+            <solid android:color="@color/gold" />
+        </shape>
+    </item>
+
+</selector>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_setting_coin.xml b/app/src/main/res/layout/activity_setting_coin.xml
new file mode 100644
index 0000000..a6ff8fc
--- /dev/null
+++ b/app/src/main/res/layout/activity_setting_coin.xml
@@ -0,0 +1,92 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout 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:background="@color/white"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:orientation="vertical">
+
+    <com.runt.open.mvvm.widgets.TitleBarView
+        android:id="@+id/title_bar"
+        style="@style/titlebar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toTopOf="parent"
+        app:leftDrawable="@mipmap/icon_white_back"
+        app:leftTint="@color/black"
+        app:titleText="财务设置"
+        />
+
+    <TextView
+        android:id="@+id/lin_realname"
+        style="@style/lin_txt"
+        app:layout_constraintTop_toBottomOf="@id/title_bar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:text="真实姓名" />
+    <TextView
+        android:id="@+id/txt_realname"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="@dimen/default_margin_lr"
+        android:textSize="14sp"
+        android:textColor="@color/txt_enable"
+        app:layout_constraintTop_toTopOf="@id/lin_realname"
+        app:layout_constraintBottom_toBottomOf="@id/lin_realname"
+        app:layout_constraintRight_toRightOf="parent"  />
+    <TextView
+        android:id="@+id/lin_pass"
+        style="@style/lin_txt"
+        app:layout_constraintTop_toBottomOf="@id/lin_realname"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:drawableRight="@mipmap/arrow_right"
+        android:text="支付密码" />
+    <TextView
+        android:id="@+id/lin_alipay"
+        style="@style/lin_txt"
+        app:layout_constraintTop_toBottomOf="@id/lin_pass"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:text="支付宝账号" />
+    <TextView
+        android:id="@+id/txt_alipay"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content"
+        android:layout_marginRight="@dimen/default_margin_lr"
+        android:textSize="14sp"
+        android:textColor="@color/txt_enable"
+        app:layout_constraintTop_toTopOf="@id/lin_alipay"
+        app:layout_constraintBottom_toBottomOf="@id/lin_alipay"
+        app:layout_constraintRight_toRightOf="parent"  />
+    <View
+        app:layout_constraintTop_toBottomOf="@id/title_bar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/color_gray8" />
+    <View
+        app:layout_constraintTop_toBottomOf="@id/lin_realname"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/color_gray8" />
+    <View
+        app:layout_constraintTop_toBottomOf="@id/lin_pass"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/color_gray8" />
+    <View
+        app:layout_constraintTop_toBottomOf="@id/lin_alipay"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/color_gray8" />
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_signs.xml b/app/src/main/res/layout/activity_signs.xml
new file mode 100644
index 0000000..ffc5697
--- /dev/null
+++ b/app/src/main/res/layout/activity_signs.xml
@@ -0,0 +1,245 @@
+<?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:orientation="vertical"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:background="@android:color/white">
+
+    <com.runt.open.mvvm.widgets.TitleBarView
+        android:id="@+id/title_bar"
+        style="@style/titlebar"
+        android:background="@color/transparent"
+        app:leftDrawable="@mipmap/icon_white_back"
+        app:leftTint="@color/black"
+        app:titleText="签到"
+        />
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        android:scrollbars="vertical">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:background="@color/theme"
+                android:gravity="center_horizontal"
+                android:orientation="vertical"
+                android:paddingTop="30dp"
+                android:layout_height="210dp">
+
+                <TextView
+                    android:id="@+id/txt_signs"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="天数"
+                    android:textColor="@color/white"
+                    android:textStyle="bold"
+                    android:textSize="26sp"/>
+                <TextView
+                    android:id="@+id/txt_tip"
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:text="连续签到赠送金币丰厚"
+                    android:layout_marginTop="10dp"
+                    android:textColor="@color/cut_off_line"
+                    android:textSize="16sp"/>
+
+            </LinearLayout>
+
+            <LinearLayout
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginTop="-80dp"
+                android:layout_marginLeft="15dp"
+                android:layout_marginRight="15dp"
+                android:background="@drawable/bg_white_corner"
+                android:orientation="vertical"
+                android:elevation="5dp">
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:padding="10dp"
+                    android:layout_gravity="center"
+                    android:layout_marginTop="10dp"
+                    android:gravity="center_vertical"
+                    android:orientation="horizontal">
+
+                    <ImageView
+                        android:id="@+id/last_month"
+                        android:layout_width="wrap_content"
+                        android:layout_height="16dp"
+                        android:adjustViewBounds="true"
+                        android:src="@drawable/calender_last"/>
+
+                    <TextView
+                        android:id="@+id/txt_calendar_title"
+                        android:layout_width="130dp"
+                        android:layout_height="wrap_content"
+                        android:text="2017年7月"
+                        android:textColor="@color/txt_normal"
+                        android:textSize="20sp"
+                        android:gravity="center" />
+                    <ImageView
+                        android:id="@+id/next_month"
+                        android:layout_width="wrap_content"
+                        android:layout_height="16dp"
+                        android:adjustViewBounds="true"
+                        android:src="@drawable/calender_next"/>
+                </LinearLayout>
+
+
+                <LinearLayout
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:layout_marginTop="10dp"
+                    android:layout_marginBottom="10dp"
+                    android:orientation="horizontal">
+
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="日"/>
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="一"/>
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="二"/>
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="三"/>
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="四"/>
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="五"/>
+                    <TextView
+                        android:layout_width="match_parent"
+                        android:layout_height="wrap_content"
+                        android:gravity="center"
+                        android:layout_weight="1"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="六"/>
+
+                </LinearLayout>
+
+                <androidx.recyclerview.widget.RecyclerView
+                    android:id="@+id/recycler"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    tools:listitem="@layout/item_calendar_day"
+                    app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
+                    app:spanCount="7"
+                    tools:itemCount="24">
+
+                </androidx.recyclerview.widget.RecyclerView>
+
+                <LinearLayout
+                    android:layout_width="wrap_content"
+                    android:layout_height="wrap_content"
+                    android:gravity="center_vertical"
+                    android:padding="15dp"
+                    android:orientation="horizontal">
+
+
+                    <View
+                        android:layout_width="7dp"
+                        android:layout_height="7dp"
+                        android:background="@drawable/bg_blue_circle" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="5dp"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="已签到"
+                        android:gravity="center" />
+                    <View
+                        android:layout_width="7dp"
+                        android:layout_height="7dp"
+                        android:layout_marginLeft="@dimen/sign_text_margin"
+                        android:background="@drawable/bg_enable_circle" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="5dp"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="未签到"
+                        android:gravity="center" />
+                    <View
+                        android:layout_width="7dp"
+                        android:layout_height="7dp"
+                        android:layout_marginLeft="@dimen/sign_text_margin"
+                        android:background="@drawable/bg_red_border_circle" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="5dp"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="今日"
+                        android:gravity="center" />
+                    <View
+                        android:layout_width="7dp"
+                        android:layout_height="7dp"
+                        android:layout_marginLeft="@dimen/sign_text_margin"
+                        android:background="@drawable/bg_red_circle" />
+
+                    <TextView
+                        android:layout_width="wrap_content"
+                        android:layout_height="wrap_content"
+                        android:layout_marginLeft="5dp"
+                        android:textSize="@dimen/sign_text_size"
+                        android:text="今日已签"
+                        android:gravity="center" />
+                </LinearLayout>
+
+            </LinearLayout>
+
+            <Button
+                android:id="@+id/btn_sign"
+                style="@style/btn_normal"
+                android:layout_marginTop="50dp"
+                android:layout_marginBottom="50dp"
+                android:layout_marginLeft="@dimen/default_margin_lr"
+                android:layout_marginRight="@dimen/default_margin_lr"
+                android:text="签到"/>
+        </LinearLayout>
+
+    </ScrollView>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_calendar_day.xml b/app/src/main/res/layout/item_calendar_day.xml
new file mode 100644
index 0000000..0efb68f
--- /dev/null
+++ b/app/src/main/res/layout/item_calendar_day.xml
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content"
+    android:layout_marginTop="10dp"
+    android:gravity="center">
+
+    <TextView
+        android:id="@+id/txt_day"
+        android:background="@drawable/bg_red_border_circle"
+        android:layout_width="30dp"
+        android:layout_height="30dp"
+        android:textColor="@color/black"
+        android:gravity="center"
+        android:textSize="@dimen/sign_text_size"
+        android:text="11"/>
+
+</LinearLayout>
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index eadbfc9..14e8819 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="utf-8"?>
-<resources>
+<resources xmlns:tools="http://schemas.android.com/tools">
 
     <declare-styleable name="TitleBarView">
         <attr name="leftDrawable" format="reference"/>
@@ -67,6 +67,7 @@
     </style>
 
     <style name="titlebar">
+        <item name="android:id" tools:ignore="AaptCrash">@+id/title_bar</item>
         <item name="android:layout_width">match_parent</item>
         <item name="android:layout_height">?attr/actionBarSize</item>
         <item name="android:background">@color/white</item>

--
Gitblit v1.9.1