From 7cd5e812882e999443220e9c71103b3e3c476c71 Mon Sep 17 00:00:00 2001
From: nilupeng <qingingrunt2010@qq.com>
Date: Fri, 12 Aug 2022 06:58:54 +0000
Subject: [PATCH] 提现,支付密码

---
 app/src/main/java/com/runt/open/mvvm/MyApplication.java                    |   13 
 app/src/main/res/values/styles.xml                                         |   21 +
 app/src/main/java/com/runt/open/mvvm/base/activities/LoadPageActivity.java |    3 
 app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java      |    7 
 app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java         |   83 +++
 app/src/main/java/com/runt/open/mvvm/util/DimensionUtils.java              |   12 
 app/src/main/java/com/runt/open/mvvm/listener/CrashHandler.java            |   65 +--
 app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java          |   78 ---
 app/src/main/java/com/runt/open/mvvm/ui/paypass/PaypassActivity.java       |  118 +++++
 app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java                |    4 
 app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java        |   24 +
 app/src/main/res/layout/activity_recycler.xml                              |   31 +
 app/src/main/java/com/runt/open/mvvm/ui/coin/CoinViewModel.java            |   53 ++
 app/src/main/res/values/dimens.xml                                         |    2 
 app/src/main/java/com/runt/open/mvvm/widgets/PasswordInputView.java        |  245 ++++++++++++
 app/src/main/java/com/runt/open/mvvm/ui/coin/WithDrawActivity.java         |   70 +++
 app/src/main/java/com/runt/open/mvvm/ui/adapter/NumAdapter.java            |   23 +
 app/src/main/java/com/runt/open/mvvm/ui/paypass/PayPassViewModel.java      |   21 +
 app/src/main/res/layout/activity_paypass.xml                               |   34 +
 app/src/main/java/com/runt/open/mvvm/ui/adapter/CoinTransAdapter.java      |    2 
 app/src/main/AndroidManifest.xml                                           |    2 
 app/src/main/java/com/runt/open/mvvm/util/DeviceUtil.java                  |   18 
 app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java         |    8 
 app/src/main/res/layout/item_num.xml                                       |   13 
 app/src/main/res/layout/dialog_paypass.xml                                 |   63 +++
 app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingActivity.java      |    9 
 app/src/main/java/com/runt/open/mvvm/ui/main/mine/MineFragment.java        |   24 
 /dev/null                                                                  |   19 
 app/src/main/res/layout/activity_withdraw.xml                              |   99 ++++
 app/src/main/java/com/runt/open/mvvm/data/Results.java                     |    2 
 app/src/main/java/com/runt/open/mvvm/retrofit/api/CommonApiCenter.java     |   22 +
 app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java   |   12 
 32 files changed, 991 insertions(+), 209 deletions(-)

diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 81610f4..4d316d5 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -50,6 +50,8 @@
         <activity android:name=".ui.msg.MsgDetailActivity" />
         <activity android:name=".ui.sign.SignInActivity" />
         <activity android:name=".ui.coin.CoinSettingActivity" />
+        <activity android:name=".ui.coin.WithDrawActivity" />
+        <activity android:name=".ui.paypass.PaypassActivity" />
         <activity android:name=".ui.loadpage.PageActivitys$CoinRecordActivity" tools:ignore="Instantiatable"/>
 
     </application>
diff --git a/app/src/main/java/com/runt/open/mvvm/MyApplication.java b/app/src/main/java/com/runt/open/mvvm/MyApplication.java
index 2e7179a..41a2cc5 100644
--- a/app/src/main/java/com/runt/open/mvvm/MyApplication.java
+++ b/app/src/main/java/com/runt/open/mvvm/MyApplication.java
@@ -5,6 +5,7 @@
 import android.content.Context;
 import android.os.Bundle;
 
+import android.os.Process;
 import androidx.annotation.NonNull;
 import androidx.annotation.Nullable;
 
@@ -113,14 +114,12 @@
         });
 
         CrashHandler crashHandler = CrashHandler.getInstance();
-        crashHandler.init(getApplicationContext(), new CrashHandler.CrashListener() {
-            @Override
-            public void onCrash() {
-                for(Activity activity : activities){
-                    activity.finish();
-                }
-                System.exit(0);
+        crashHandler.init(getApplicationContext(), () -> {
+            for(Activity activity : activities){
+                activity.finish();
             }
+            Process.killProcess(Process.myPid());
+            System.exit(0);
         });
     }
 
diff --git a/app/src/main/java/com/runt/open/mvvm/base/activities/LoadPageActivity.java b/app/src/main/java/com/runt/open/mvvm/base/activities/LoadPageActivity.java
index a5cfaa5..245f461 100644
--- a/app/src/main/java/com/runt/open/mvvm/base/activities/LoadPageActivity.java
+++ b/app/src/main/java/com/runt/open/mvvm/base/activities/LoadPageActivity.java
@@ -34,19 +34,20 @@
 
     @Override
     public void initViews() {
+        setTitle(initTitle());
         try {
             Class<A> entityClass = (Class<A>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[2];
             this.adapter = entityClass.newInstance();//实例化泛型
         } catch (Exception e) {
             e.printStackTrace();
         }
+        refresh = mBinding.getRoot().findViewById(R.id.refresh);
         refresh.setRefreshHeader(new ClassicsHeader(mContext));
         refresh.setRefreshFooter(new ClassicsFooter(mContext));
         refresh.setOnRefreshLoadMoreListener(this);
         RecyclerView recycler = mBinding.getRoot().findViewById(R.id.recycler);
         recycler.setLayoutManager(new LinearLayoutManager(mContext));
         recycler.setAdapter(adapter);
-        refresh = mBinding.getRoot().findViewById(R.id.refresh);
         refresh.setOnRefreshLoadMoreListener(this);
         mViewModel.getLiveData().observe(this, (Observer<List<RESULT>>) list -> {
             adapter.showNull = true;
diff --git a/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java b/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java
index 755f0ee..00f3fd9 100644
--- a/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java
+++ b/app/src/main/java/com/runt/open/mvvm/base/adapter/BaseAdapter.java
@@ -3,13 +3,11 @@
 import android.util.Log;
 import android.view.LayoutInflater;
 import android.view.ViewGroup;
-
 import androidx.annotation.NonNull;
 import androidx.recyclerview.widget.RecyclerView;
 import androidx.viewbinding.ViewBinding;
-
 import com.runt.open.mvvm.databinding.LayoutNullBinding;
-import com.runt.open.mvvm.util.DeviceUtil;
+import com.runt.open.mvvm.util.DimensionUtils;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
@@ -148,9 +146,9 @@
     protected void setBottomMargin(RecyclerView.ViewHolder holder, int position, float dp, float defaultDp){
         ViewGroup.MarginLayoutParams params1 = (ViewGroup.MarginLayoutParams) holder.itemView.getLayoutParams();
         if(position == dataList.size() -1){
-            params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, DeviceUtil.convertDpToPixel(dp,holder.itemView.getContext()));
+            params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, (int) DimensionUtils.convertDpToPixel(dp,holder.itemView.getContext()));
         }else{
-            params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, DeviceUtil.convertDpToPixel(defaultDp,holder.itemView.getContext()));
+            params1.setMargins(params1.leftMargin, params1.topMargin, params1.rightMargin, (int) DimensionUtils.convertDpToPixel(defaultDp,holder.itemView.getContext()));
         }
     }
 
diff --git a/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java b/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
index 7b5e156..fde9799 100644
--- a/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
+++ b/app/src/main/java/com/runt/open/mvvm/base/model/BaseViewModel.java
@@ -7,6 +7,7 @@
 import android.util.Log;
 import androidx.annotation.NonNull;
 import androidx.core.content.FileProvider;
+import androidx.lifecycle.MutableLiveData;
 import androidx.lifecycle.ViewModel;
 import com.runt.open.mvvm.BuildConfig;
 import com.runt.open.mvvm.base.activities.BaseActivity;
@@ -17,8 +18,8 @@
 import com.runt.open.mvvm.retrofit.api.CommonApiCenter;
 import com.runt.open.mvvm.retrofit.observable.HttpObserver;
 import com.runt.open.mvvm.retrofit.utils.RetrofitUtils;
+import com.runt.open.mvvm.ui.login.UserBean;
 import io.reactivex.Observable;
-import io.reactivex.functions.Consumer;
 import io.reactivex.schedulers.Schedulers;
 import okhttp3.*;
 
@@ -26,6 +27,9 @@
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
 
 /**
  * Created by Administrator on 2021/11/11 0011.
@@ -34,9 +38,78 @@
 
     protected BaseActivity mActivity;
     protected CommonApiCenter commonApi = RetrofitUtils.getInstance().getCommonApi();
+    MutableLiveData<Integer> verifyResult = new MutableLiveData<>();
+    public MutableLiveData<Integer> getVerifyResult() {
+        return verifyResult;
+    }
 
     public void onCreate(BaseActivity activity) {
         this.mActivity = activity;
+    }
+
+    public void getUserBean(){
+        httpObserverOn(commonApi.getUserBean(), new HttpObserver<UserBean>() {
+            @Override
+            protected void onSuccess(UserBean data) {
+                UserBean.setUser(data);
+            }
+        });
+    }
+
+    /**
+     * 获取验证码
+     * @param url    验证码地址
+     * @param phone 手机号
+     */
+    public void getVerifyCode(String url,String phone){
+        String time = new Date().getTime()+"";
+        httpObserverOnLoading(commonApi.getVerifyCode(url, phone, randomString(phone, time), time), new HttpObserver<Results.SmsResult>(){
+            @Override
+            protected void onSuccess(Results.SmsResult data) {
+                verifyResult.setValue(0);
+            }
+
+            @Override
+            protected void onFailed(HttpApiResult httpResult) {
+                super.onFailed(httpResult);
+                verifyResult.setValue(-1);
+            }
+        });
+    }
+
+    /**
+     * 随机字符串
+     * @param phone
+     * @param time
+     * @return
+     */
+    private String randomString(String phone,String time){
+        int p =  (int) Math.round(phone.length()/6.0);
+        int t = time.length()/6;
+        List<String> list = new ArrayList<String>();
+        for(int i = 0 ; i < 6 ; i ++){
+            String str = "";
+            if(i*p>phone.length()){
+                str = phone.substring((i-1)*p);
+            }else if((i+1)*p>phone.length()){
+                str = phone.substring(i*p);
+            }else{
+                str = phone.substring(i*p,(i+1)*p);
+            }
+            String num = ((Integer.parseInt(str)*Long.parseLong(time))+"") ;
+            list.add(num);
+        }
+        //return sb.toString();
+        return plusSingle2(list);
+    }
+
+    private String plusSingle2(List<String> list){
+        StringBuilder sb = new StringBuilder();
+        for(int i = 0 ; i < list.size() ; i ++){
+            sb.append(list.get(i).substring(list.get(i).length()-2<0?0:list.get(i).length()-2));
+        }
+        return sb.toString();
+
     }
 
     public void checkUpdate(boolean showTip){
@@ -197,11 +270,9 @@
                     mActivity.showLoadingDialog("");
                 })
                 .observeOn(AndroidScheduler.mainThread())
-                .doOnError(new Consumer<Throwable>() {
-                    @Override
-                    public void accept(Throwable throwable) throws Exception {
-
-                    }
+                .doOnError(throwable -> {
+                    mActivity.dissmissLoadingDialog();
+                    Log.e("ViewModel",hashCode()+" httpObserverOnLoading "+throwable);
                 })
                 .doOnComplete(() -> {
                     mActivity.dissmissLoadingDialog();
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 791f53b..06e0ab1 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
@@ -33,7 +33,7 @@
         public String id;
         public UserBean toUser,fromUser;
         public int count,after,before,type;
-        public Date cTime;
+        public String cTime;
         /**
          * 备注
          **/
diff --git a/app/src/main/java/com/runt/open/mvvm/listener/CrashHandler.java b/app/src/main/java/com/runt/open/mvvm/listener/CrashHandler.java
index a837be7..217fdd0 100644
--- a/app/src/main/java/com/runt/open/mvvm/listener/CrashHandler.java
+++ b/app/src/main/java/com/runt/open/mvvm/listener/CrashHandler.java
@@ -5,20 +5,10 @@
 import android.content.pm.PackageManager;
 import android.os.Build;
 import android.os.Environment;
-import android.os.Looper;
 import android.util.Log;
 import android.widget.Toast;
 
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.io.Writer;
+import java.io.*;
 import java.lang.reflect.Field;
 import java.text.DateFormat;
 import java.text.SimpleDateFormat;
@@ -38,11 +28,9 @@
 
     //系统默认的UncaughtException处理类
     private Thread.UncaughtExceptionHandler mDefaultHandler;
-
-    CrashListener crashListener;
-
     //CrashHandler实例
     private static CrashHandler instance;
+    CrashListener crashListener;
     //程序的Context对象
     private Context mContext;
     //用来存储设备信息和异常信息
@@ -74,9 +62,6 @@
         Thread.setDefaultUncaughtExceptionHandler(this);
     }
 
-    /**
-     * 初始化
-     */
     public void init(Context context,CrashListener crashListener) {
         Log.i(TAG, "init context:"+context);
         mContext = context;
@@ -85,6 +70,9 @@
         Thread.setDefaultUncaughtExceptionHandler(this);
     }
 
+    public interface CrashListener {
+        void onCrash();
+    }
     /**
      * 当UncaughtException发生时会转入该函数来处理
      */
@@ -94,17 +82,9 @@
         if (!handleException(ex) && mDefaultHandler != null) {
             //如果用户没有处理则让系统默认的异常处理器来处理
             mDefaultHandler.uncaughtException(thread, ex);
-        } else if(crashListener != null){
+        }
+        if (crashListener != null) {
             crashListener.onCrash();
-        } else {
-            try {
-                Thread.sleep(3000);
-            } catch (InterruptedException e) {
-                Log.e(TAG, "error : ", e);
-            }
-            //退出程序
-            android.os.Process.killProcess(android.os.Process.myPid());
-            System.exit(1);
         }
     }
 
@@ -122,17 +102,8 @@
         //收集设备参数信息
         collectDeviceInfo(mContext);
 
-        //使用Toast来显示异常信息
-        new Thread() {
-            @Override
-            public void run() {
-                Looper.prepare();
-                Toast.makeText(mContext, "很抱歉,程序出现异常,即将退出.", Toast.LENGTH_SHORT).show();
-                Looper.loop();
-            }
-        }.start();
         //保存日志文件
-        saveCatchInfo2File(ex);
+        saveCatchInfoFile(ex);
         return true;
     }
 
@@ -172,7 +143,7 @@
      * @param ex
      * @return  返回文件名称,便于将文件传送到服务器
      */
-    private String saveCatchInfo2File(Throwable ex) {
+    private String saveCatchInfoFile(Throwable ex) {
         ex.printStackTrace();
         Log.i(TAG, "saveCatchInfo2File Throwable:"+ex);
 
@@ -199,12 +170,20 @@
             String time = formatter.format(new Date());
             String fileName = "crash-" + time + "-" + timestamp + ".log";
             if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
-                String path = "/mnt/sdcard/crash/";
+                String path = mContext.getExternalFilesDir(null).getAbsolutePath()+"/crash/";
                 File dir = new File(path);
                 if (!dir.exists()) {
                     dir.mkdirs();
                 }
-                FileOutputStream fos = new FileOutputStream(path + fileName);
+                String newFileName = path + fileName;
+                Log.i(TAG,"exc newFileName:"+newFileName);
+                File file = new File(newFileName);
+                file.mkdirs();
+                if(file.exists()){
+                    file.delete();
+                }
+                file.createNewFile();
+                FileOutputStream fos = new FileOutputStream(file);
                 fos.write(sb.toString().getBytes());
                 //发送给开发人员
                 sendCrashLog2PM(path+fileName);
@@ -238,7 +217,7 @@
                 s = reader.readLine();
                 if(s == null) break;
                 //由于目前尚未确定以何种方式发送,所以先打出log日志。
-                //Log.i("info", s.toString());
+                Log.i("info", s.toString());
             }
         } catch (FileNotFoundException e) {
             e.printStackTrace();
@@ -252,9 +231,5 @@
                 e.printStackTrace();
             }
         }
-    }
-
-    public static  interface CrashListener{
-        void onCrash();
     }
 }
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 7c0e28d..c27a0bf 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
@@ -1,9 +1,11 @@
 package com.runt.open.mvvm.retrofit.api;
 
 
+import com.runt.open.mvvm.config.Configuration;
 import com.runt.open.mvvm.data.HttpApiResult;
 import com.runt.open.mvvm.data.PageResult;
 import com.runt.open.mvvm.data.Results;
+import com.runt.open.mvvm.ui.login.UserBean;
 import io.reactivex.Observable;
 import okhttp3.MultipartBody;
 import retrofit2.http.*;
@@ -51,12 +53,23 @@
     Observable<Object> postPageData(@Url String url, @Field("page") int pageNum, @Field("size") int pageSize, @FieldMap Map<String,String> param);
 
     /**
+     * 登录
+     * @return
+     */
+    @POST("loginToken")
+    Observable<HttpApiResult<UserBean>> getUserBean();
+
+    @FormUrlEncoded
+    @POST
+    Observable<HttpApiResult<Results.SmsResult>> getVerifyCode(@Url String url, @Field(Configuration.KEY_PHONE) String phone, @Field(Configuration.KEY_CODE) String code, @Field("time") String time);
+    /**
      * app更新
      * @return
      */
     @GET("getControlVersion")
     Observable<HttpApiResult<Results.ApkVersion>> getAppUpdate();
 
+    @FormUrlEncoded
     @POST("updateName")
     Observable<Results.StringApiResult> updateName(@Field("username") String name);
 
@@ -71,11 +84,17 @@
     @GET("getMsgDetail")
     Observable<HttpApiResult<Results.Message>> getMsgDetail(@Query("id") String id);
 
+    @FormUrlEncoded
     @POST("updateAlipay")
     Observable<Results.StringApiResult> updateAlipay(@Field("account") String account,@Field("paypass") String paypass);
 
+    @FormUrlEncoded
     @POST("updateRealname")
     Observable<Results.StringApiResult> updateRealname(@Field("account") String account,@Field("paypass") String paypass);
+
+    @FormUrlEncoded
+    @POST("withDraw")
+    Observable<Results.StringApiResult> withDraw(@Field("paypass") String paypass,@Field("count") int count);
 
     /**
      * 获取签到列表
@@ -88,4 +107,7 @@
     @POST("signIn")
     Observable<Results.StringApiResult> signIn();
 
+    @FormUrlEncoded
+    @POST("updatePaypass")
+    Observable<Results.StringApiResult> updatePaypass(@Field("smsCode") String smsCode,@Field("paypass") String paypass);
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java b/app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java
index 2c5b8d4..ecc5794 100644
--- a/app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java
+++ b/app/src/main/java/com/runt/open/mvvm/retrofit/api/LoginApiCenter.java
@@ -3,13 +3,11 @@
 import com.runt.open.mvvm.config.Configuration;
 import com.runt.open.mvvm.data.HttpApiResult;
 import com.runt.open.mvvm.data.Results;
-
 import com.runt.open.mvvm.ui.login.UserBean;
 import io.reactivex.Observable;
 import retrofit2.http.Field;
 import retrofit2.http.FormUrlEncoded;
 import retrofit2.http.POST;
-import retrofit2.http.Url;
 
 /**
  * Created by Administrator on 2021/11/15 0015.
@@ -34,11 +32,6 @@
     @FormUrlEncoded
     @POST("loginCode")
     Observable<HttpApiResult<UserBean>> loginByCode(@Field(Configuration.KEY_PHONE) String phone, @Field(Configuration.KEY_CODE) String code);
-
-
-    @FormUrlEncoded
-    @POST
-    Observable<HttpApiResult<Results.SmsResult>> getVerifyCode(@Url String url, @Field(Configuration.KEY_PHONE) String phone, @Field(Configuration.KEY_CODE) String code, @Field("time") String time);
 
     /**
      * 重置密码
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/adapter/CoinTransAdapter.java b/app/src/main/java/com/runt/open/mvvm/ui/adapter/CoinTransAdapter.java
index 96bf470..14b970a 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/adapter/CoinTransAdapter.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/adapter/CoinTransAdapter.java
@@ -63,6 +63,6 @@
             binding.txtCount.setText("+" + data.count);
             Glide.with(binding.getRoot().getContext()).load(BuildConfig.HOST_IP_ADDR + (data.fromUser == null ? "" : data.fromUser.getHead())).apply(options).into(binding.imgHead);
         }
-        binding.txtTime.setText(HandleDate.getTimeStateNew(data.cTime));
+        binding.txtTime.setText(HandleDate.getTimeStateNew(HandleDate.getDateTimeToLong(data.cTime)));
     }
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/adapter/NumAdapter.java b/app/src/main/java/com/runt/open/mvvm/ui/adapter/NumAdapter.java
new file mode 100644
index 0000000..785afd0
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/adapter/NumAdapter.java
@@ -0,0 +1,23 @@
+package com.runt.open.mvvm.ui.adapter;
+
+import com.runt.open.mvvm.base.adapter.BaseAdapter;
+import com.runt.open.mvvm.databinding.ItemNumBinding;
+
+import java.util.List;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-30.
+ */
+public class NumAdapter extends BaseAdapter<String, ItemNumBinding> {
+
+    public NumAdapter(List<String> list) {
+        this.dataList = list;
+    }
+
+    @Override
+    protected void onBindView(ItemNumBinding binding, int position, String s) {
+        binding.text.setText(s);
+        binding.getRoot().setTag(s);
+
+    }
+}
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
index 1123633..47f8eed 100644
--- 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
@@ -9,13 +9,14 @@
 import com.runt.open.mvvm.listener.ResPonse;
 import com.runt.open.mvvm.retrofit.observable.HttpObserver;
 import com.runt.open.mvvm.ui.login.UserBean;
+import com.runt.open.mvvm.ui.paypass.PaypassActivity;
 
 /**
  * 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> {
+public class CoinSettingActivity extends BaseActivity<ActivitySettingCoinBinding, CoinViewModel> {
 
     private int requestCode = 0;
 
@@ -64,7 +65,7 @@
                 public void doSuccess(Object obj) {
                     mBinding.txtAlipay.setText(obj.toString());
                     requestCode = REQUEST_CODE_PAYPASS_FOR_ALIPAY;
-                    //launcher.launch(new Intent(mContext, PaypassActivity.class));
+                    launcher.launch(new Intent(mContext, PaypassActivity.class));
                 }
             });
         });
@@ -74,12 +75,12 @@
                 public void doSuccess(Object obj) {
                     requestCode = REQUEST_CODE_PAYPASS_FOR_REALNAME;
                     mBinding.txtRealname.setText(obj.toString());
-                    //launcher.launch(new Intent(mContext, PaypassActivity.class));
+                    launcher.launch(new Intent(mContext, PaypassActivity.class));
                 }
             });
         });
         mBinding.linPass.setOnClickListener(v->{
-            //startActivity(new Intent(mContext,PaypassActivity.class).putExtra("type",1));
+            startActivity(new Intent(mContext,PaypassActivity.class).putExtra("type",1));
         });
     }
 
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
deleted file mode 100644
index 466f798..0000000
--- a/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinSettingViewModel.java
+++ /dev/null
@@ -1,19 +0,0 @@
-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/coin/CoinViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinViewModel.java
new file mode 100644
index 0000000..a3ec633
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/coin/CoinViewModel.java
@@ -0,0 +1,53 @@
+package com.runt.open.mvvm.ui.coin;
+
+import android.content.Intent;
+import com.runt.open.mvvm.base.model.BaseViewModel;
+import com.runt.open.mvvm.data.HttpApiResult;
+import com.runt.open.mvvm.listener.ResPonse;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+import com.runt.open.mvvm.ui.login.UserBean;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+public class CoinViewModel 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);
+    }
+
+    //提现
+    public void withDraw(String pass,int count){
+        httpObserverOnLoading(commonApi.withDraw(pass, count), new HttpObserver<String>(mActivity) {
+            @Override
+            protected void onSuccess(String data) {
+                UserBean.getUser().setCoin(UserBean.getUser().getCoin()-count);
+                mActivity.showToast("申请成功");
+                mActivity.setResult(mActivity.RESULT_OK);
+                mActivity.finish();
+            }
+
+            @Override
+            protected void onFailed(HttpApiResult error) {
+                if(error.code == 40004){
+                    mActivity.showDialog("申请失败", "未找到对应的支付宝账户", "设置", "取消", new ResPonse() {
+                        @Override
+                        public void doSuccess(Object obj) {
+                            mActivity.startActivity(new Intent(mActivity, CoinSettingActivity.class) );//去设置密码
+                        }
+                    });
+                }else if(error.code == 622){
+                    mActivity.showDialog("申请失败",error.msg,null);
+                }else{
+                    super.onFailed(error);
+                }
+            }
+        });
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/coin/WithDrawActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/coin/WithDrawActivity.java
new file mode 100644
index 0000000..53d7523
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/coin/WithDrawActivity.java
@@ -0,0 +1,70 @@
+package com.runt.open.mvvm.ui.coin;
+
+import android.content.Intent;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.View;
+import androidx.activity.result.ActivityResultLauncher;
+import androidx.activity.result.contract.ActivityResultContracts;
+import com.runt.open.mvvm.base.activities.BaseActivity;
+import com.runt.open.mvvm.databinding.ActivityWithdrawBinding;
+import com.runt.open.mvvm.listener.CustomClickListener;
+import com.runt.open.mvvm.ui.login.UserBean;
+import com.runt.open.mvvm.ui.paypass.PaypassActivity;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-30.
+ */
+public class WithDrawActivity extends BaseActivity<ActivityWithdrawBinding, CoinViewModel> {
+
+    ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
+        if(result.getResultCode() == RESULT_OK){
+            int count = Integer.parseInt(mBinding.edit.getText().toString())*1000;
+            mViewModel.withDraw(result.getData().getStringExtra("paypass"),count);
+        }
+    });
+
+    @Override
+    public void initViews() {
+
+        mBinding.txtBalance.setText(String.format("当前金币数量%s个", UserBean.getUser().getCoin()));
+        mBinding.edit.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable editable) {
+                mBinding.txtRmb.setText(String.format("提现¥%s元",mBinding.edit.getText()));
+            }
+        });
+        mBinding.btnSubmit.setOnClickListener(new CustomClickListener() {
+            @Override
+            protected void onSingleClick(View view) {
+                if(isNull(mBinding.edit.getText())){
+                    showToast("请输入提现数量");
+                }else{
+                    int count = Integer.parseInt(mBinding.edit.getText().toString())*1000;
+                    if(count>UserBean.getUser().getCoin()){
+                        showToast("余额不足");
+                    }else if( isNull(UserBean.getUser().getAlipay())){
+                        showToast("还没有设置支付宝账号");
+                    }else {
+                        launcher.launch(new Intent(mContext, PaypassActivity.class));//开启支付密码
+                    }
+                }
+            }
+        });
+    }
+
+    @Override
+    public void loadData() {
+
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java b/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java
index 8e0a194..b848f77 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/loadpage/PageActivitys.java
@@ -1,9 +1,15 @@
 package com.runt.open.mvvm.ui.loadpage;
 
+import android.content.Intent;
+import android.graphics.drawable.Drawable;
+import android.view.View;
+import com.runt.open.mvvm.R;
 import com.runt.open.mvvm.base.activities.LoadPageActivity;
 import com.runt.open.mvvm.data.Results;
-import com.runt.open.mvvm.databinding.RefreshRecyclerBinding;
+import com.runt.open.mvvm.databinding.ActivityRecyclerBinding;
+import com.runt.open.mvvm.listener.CustomClickListener;
 import com.runt.open.mvvm.ui.adapter.CoinTransAdapter;
+import com.runt.open.mvvm.ui.coin.CoinSettingActivity;
 
 import java.util.Map;
 
@@ -13,13 +19,27 @@
 public class PageActivitys {
 
     //金币记录
-    public class CoinRecordActivity extends LoadPageActivity<RefreshRecyclerBinding, PageViewModels.CoinRecordViewModel, CoinTransAdapter, Results.CustomCoin>{
+    public static class CoinRecordActivity extends LoadPageActivity<ActivityRecyclerBinding, PageViewModels.CoinRecordViewModel, CoinTransAdapter, Results.CustomCoin>{
         @Override
         protected String initTitle() {
             return "金币记录";
         }
 
         @Override
+        public void initViews() {
+            super.initViews();
+            Drawable drawable = getResources().getDrawable(R.mipmap.icon_white_setting);
+            drawable.setTint(getResources().getColor(R.color.txt_color));
+            setTitleRight(drawable);
+            titleBarView.setRightClick(new CustomClickListener() {
+                @Override
+                protected void onSingleClick(View view) {
+                    startActivity(new Intent(mContext, CoinSettingActivity.class));//打开设置
+                }
+            });
+        }
+
+        @Override
         protected Map requestParams() {
             Map map = super.requestParams();
             map.put("inOrOut",0);
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java
index 80addfe..dd5cd96 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/login/LoginViewModel.java
@@ -1,18 +1,17 @@
 package com.runt.open.mvvm.ui.login;
 
 import androidx.lifecycle.MutableLiveData;
+import com.runt.open.mvvm.R;
 import com.runt.open.mvvm.base.activities.BaseActivity;
 import com.runt.open.mvvm.base.model.BaseViewModel;
+import com.runt.open.mvvm.config.Configuration;
 import com.runt.open.mvvm.data.HttpApiResult;
 import com.runt.open.mvvm.data.Results;
 import com.runt.open.mvvm.retrofit.api.LoginApiCenter;
 import com.runt.open.mvvm.retrofit.observable.HttpObserver;
 import com.runt.open.mvvm.retrofit.utils.RetrofitUtils;
+import com.runt.open.mvvm.util.MyLog;
 import io.reactivex.Observable;
-
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.List;
 
 /**
  * Created by Administrator on 2021/11/15 0015.
@@ -25,8 +24,6 @@
         loginApi = RetrofitUtils.getInstance().getRetrofit(LoginApiCenter.class);
     }
 
-    MutableLiveData<UserBean> loginResult = new MutableLiveData<>();
-    MutableLiveData<Integer> verifyResult = new MutableLiveData<>();
     MutableLiveData<Results.StringApiResult> resetResult = new MutableLiveData<>();
     MutableLiveData<Results.StringApiResult> registerResult = new MutableLiveData<>();
     HttpObserver<UserBean> logginObserver;
@@ -37,18 +34,16 @@
         logginObserver = new HttpObserver<UserBean>(mActivity){
             @Override
             protected void onSuccess(UserBean data) {
-                loginResult.setValue(data);
+                UserBean.setUser(data);
+                mActivity.putStringProjectPrefrence(Configuration.KEY_USERNAME, data.getUsername());
+                MyLog.i("registerlogin",data.toString());
+                mActivity.showToast(R.string.login_success);
+                mActivity.setResult(mActivity.RESULT_CODE_SUCESS);
+                mActivity.finish();
             }
         };
     }
 
-    public MutableLiveData<UserBean> getLoginResult() {
-        return loginResult;
-    }
-
-    public MutableLiveData<Integer> getVerifyResult() {
-        return verifyResult;
-    }
 
     /**
      * 密码登录
@@ -119,59 +114,4 @@
         getVerifyCode("getLoginSMS",phone);
     }
 
-    /**
-     * 获取验证码
-     * @param url    验证码地址
-     * @param phone 手机号
-     */
-    public void getVerifyCode(String url,String phone){
-        String time = new Date().getTime()+"";
-        httpObserverOnLoading(loginApi.getVerifyCode(url, phone, randomString(phone, time), time), new HttpObserver<Results.SmsResult>(){
-            @Override
-            protected void onSuccess(Results.SmsResult data) {
-                verifyResult.setValue(0);
-            }
-
-            @Override
-            protected void onFailed(HttpApiResult httpResult) {
-                super.onFailed(httpResult);
-                verifyResult.setValue(-1);
-            }
-        });
-    }
-
-    /**
-     * 随机字符串
-     * @param phone
-     * @param time
-     * @return
-     */
-    private String randomString(String phone,String time){
-        int p =  (int) Math.round(phone.length()/6.0);
-        int t = time.length()/6;
-        List<String> list = new ArrayList<String>();
-        for(int i = 0 ; i < 6 ; i ++){
-            String str = "";
-            if(i*p>phone.length()){
-                str = phone.substring((i-1)*p);
-            }else if((i+1)*p>phone.length()){
-                str = phone.substring(i*p);
-            }else{
-                str = phone.substring(i*p,(i+1)*p);
-            }
-            String num = ((Integer.parseInt(str)*Long.parseLong(time))+"") ;
-            list.add(num);
-        }
-        //return sb.toString();
-        return plusSingle2(list);
-    }
-
-    private String plusSingle2(List<String> list){
-        StringBuilder sb = new StringBuilder();
-        for(int i = 0 ; i < list.size() ; i ++){
-            sb.append(list.get(i).substring(list.get(i).length()-2<0?0:list.get(i).length()-2));
-        }
-        return sb.toString();
-
-    }
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
index 4d11f31..d62969f 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/login/RegisterLoginActivity.java
@@ -3,8 +3,6 @@
 import android.content.Intent;
 import android.view.View;
 import android.widget.EditText;
-
-import com.google.gson.Gson;
 import com.runt.open.mvvm.R;
 import com.runt.open.mvvm.base.activities.BaseActivity;
 import com.runt.open.mvvm.config.Configuration;
@@ -12,7 +10,6 @@
 import com.runt.open.mvvm.listener.CustomClickListener;
 import com.runt.open.mvvm.ui.web.WebViewActivity;
 import com.runt.open.mvvm.util.AlgorithmUtils;
-import com.runt.open.mvvm.util.MyLog;
 import com.runt.open.mvvm.util.PhoneUtil;
 
 import java.util.Date;
@@ -44,15 +41,6 @@
            }else{
 
            }
-        });
-        mViewModel.getLoginResult().observe(this, loggedInUser -> {
-            putStringProjectPrefrence(Configuration.KEY_USERNAME, mBinding.editPhone.getText().toString());
-            UserBean.setUser(loggedInUser);
-            putStringProjectPrefrence(Configuration.KEY_USERINFO, new Gson().toJson(loggedInUser));
-            MyLog.i("registerlogin",loggedInUser.toString());
-            showToast(R.string.login_success);
-            setResult(RESULT_CODE_SUCESS);
-            finish();
         });
     }
 
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java b/app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java
index 6d3901f..38ba3f0 100644
--- a/app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java
+++ b/app/src/main/java/com/runt/open/mvvm/ui/login/UserBean.java
@@ -4,6 +4,8 @@
  * Created by Administrator on 2021/11/15 0015.
  */
 
+import androidx.lifecycle.MutableLiveData;
+
 import java.io.Serializable;
 import java.math.BigDecimal;
 import java.util.Date;
@@ -19,6 +21,7 @@
     private static final long serialVersionUID = 1L;
 
     private static UserBean user;
+    public static MutableLiveData<UserBean> onUpdate = new MutableLiveData<>();
 
     public static UserBean getUser() {
         return user;
@@ -26,6 +29,7 @@
 
     public static void setUser(UserBean user) {
         UserBean.user = user;
+        onUpdate.postValue(user);
     }
 
     /** 主键 **/
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 4eeb5fb..e2f1262 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
@@ -9,6 +9,7 @@
 import androidx.activity.result.contract.ActivityResultContracts;
 import com.bumptech.glide.Glide;
 import com.bumptech.glide.request.RequestOptions;
+import com.google.gson.Gson;
 import com.luck.picture.lib.PictureSelector;
 import com.luck.picture.lib.config.PictureConfig;
 import com.luck.picture.lib.config.PictureMimeType;
@@ -16,9 +17,11 @@
 import com.runt.open.mvvm.BuildConfig;
 import com.runt.open.mvvm.R;
 import com.runt.open.mvvm.base.fragments.BaseFragment;
+import com.runt.open.mvvm.config.Configuration;
 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.WithDrawActivity;
 import com.runt.open.mvvm.ui.coin.CoinSettingActivity;
 import com.runt.open.mvvm.ui.loadpage.PageActivitys;
 import com.runt.open.mvvm.ui.login.UserBean;
@@ -40,15 +43,25 @@
 public class MineFragment extends BaseFragment<FragmentMineBinding,MineViewModel> implements View.OnClickListener {
 
     private final  String TAG = "MineFragment";
-    ActivityResultLauncher<Intent> signLaunch = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
-
+    ActivityResultLauncher<Intent> launcher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> {
+        refreshUi();
     });
     @Override
     public void initViews() {
+        mViewModel.getUserBean();
+        UserBean.onUpdate.observe(this, userBean -> {
+            mActivity.putStringProjectPrefrence(Configuration.KEY_USERINFO, new Gson().toJson(userBean));
+            refreshUi();
+        });
     }
 
     @Override
     public void loadData() {
+        setOnClickListener(this,R.id.lin_sign,R.id.lin_coin,R.id.img,R.id.txt_name);
+        refreshUi();
+    }
+
+    public void refreshUi(){
         if(UserBean.getUser() != null){
             RequestOptions options = new RequestOptions()
                     .placeholder(R.mipmap.default_head)//图片加载出来前,显示的图片
@@ -59,14 +72,13 @@
             mBinding.txtCoin.setText(UserBean.getUser().getCoin()+"");
             mBinding.txtSigns.setText(UserBean.getUser().getSign()+"");
             mBinding.linGroup.setVisibility(View.VISIBLE);
+
         }else{
             Glide.with(getContext()).load(R.mipmap.default_head).into(mBinding.img);
             mBinding.txtName.setText("未登录");
             mBinding.linGroup.setVisibility(View.GONE);
         }
-        setOnClickListener(this,R.id.lin_sign,R.id.lin_coin,R.id.img,R.id.txt_name);
     }
-
 
     @Override
     public void onClick(View view) {
@@ -109,7 +121,7 @@
                                             }
                                         });
                                     }else{
-                                        //startActivityForResult(new Intent(mActivity, WithDrawActivity.class),REQUEST_CODE_WITHDRAW );
+                                        launcher.launch(new Intent(mActivity, WithDrawActivity.class) );
                                     }
                                 }
                             }
@@ -117,7 +129,7 @@
                         .show();
                 break;
             case R.id.lin_sign://签到
-                signLaunch.launch(new Intent(getContext(), SignInActivity.class));
+                launcher.launch(new Intent(getContext(), SignInActivity.class));
                 break;
         }
     }
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/paypass/PayPassViewModel.java b/app/src/main/java/com/runt/open/mvvm/ui/paypass/PayPassViewModel.java
new file mode 100644
index 0000000..6e5a793
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/paypass/PayPassViewModel.java
@@ -0,0 +1,21 @@
+package com.runt.open.mvvm.ui.paypass;
+
+import com.runt.open.mvvm.base.model.BaseViewModel;
+import com.runt.open.mvvm.retrofit.observable.HttpObserver;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-30.
+ */
+public class PayPassViewModel extends BaseViewModel {
+
+    public void updatePass(String pass,String code){
+        httpObserverOnLoading(commonApi.updatePaypass(code, pass), new HttpObserver(mActivity) {
+            @Override
+            protected void onSuccess(Object data) {
+                mActivity.finish();
+                mActivity.showToast("支付密码修改成功");
+            }
+        });
+    }
+
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/ui/paypass/PaypassActivity.java b/app/src/main/java/com/runt/open/mvvm/ui/paypass/PaypassActivity.java
new file mode 100644
index 0000000..5c3750c
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/ui/paypass/PaypassActivity.java
@@ -0,0 +1,118 @@
+package com.runt.open.mvvm.ui.paypass;
+
+import android.app.Instrumentation;
+import android.content.Intent;
+import android.text.Editable;
+import android.text.TextWatcher;
+import android.view.KeyEvent;
+import androidx.recyclerview.widget.GridLayoutManager;
+import com.runt.open.mvvm.base.activities.BaseActivity;
+import com.runt.open.mvvm.databinding.ActivityPaypassBinding;
+import com.runt.open.mvvm.listener.ResPonse;
+import com.runt.open.mvvm.ui.adapter.NumAdapter;
+import com.runt.open.mvvm.ui.login.UserBean;
+import com.runt.open.mvvm.widgets.PasswordInputView;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2020-10-30.
+ */
+public class PaypassActivity extends BaseActivity<ActivityPaypassBinding, PayPassViewModel> {
+
+
+    @Override
+    public void initViews() {
+        int type = getIntent().getIntExtra("type",0);// 0 验证 , 1 修改
+        if(type == 0) {
+            setTitle("验证支付密码");
+        }else{
+            setTitle("修改支付密码");
+        }
+        PasswordInputView password = mBinding.paypassInclude.password;
+        mBinding.paypassInclude.view.setOnClickListener(v->{});
+        mBinding.paypassInclude.recyclerNum.setLayoutManager(new GridLayoutManager(this,3));
+        mBinding.paypassInclude.password.addTextChangedListener(new TextWatcher() {
+            @Override
+            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
+
+            }
+
+            @Override
+            public void afterTextChanged(Editable editable) {
+                if(editable.length() ==6){
+
+                    if(type == 0 ){
+                        setResult(RESULT_OK,new Intent().putExtra("paypass",editable.toString()));
+                        finish();
+                    }else if(type == 1){
+                        if(password.getTag() == null){
+                            password.setText("");
+                            password.setTag(editable.toString());
+                            mBinding.paypassInclude.txtTip.setText("请再次输入支付密码");
+                        } else if(password.getTag().toString().equals(editable.toString())) {
+                            mViewModel.getVerifyCode("getPayPassSMS", UserBean.getUser().getPhone());
+                        } else if(!password.getTag().toString().equals(editable.toString())) {
+                            password.setText("");
+                            password.setTag(null);
+                            showToast("两次输入不一致");
+                            mBinding.paypassInclude.txtTip.setText("两次输入不一致");
+                        }
+                    }
+                }
+            }
+        });
+        mViewModel.getVerifyResult().observe(this, integer -> {
+            if(integer == 0){
+                showInputDialog("输入验证码", "", "请输入发送到" + UserBean.getUser().getPhone().substring(8)+"的验证码", new ResPonse() {
+                    @Override
+                    public void doSuccess(Object obj) {
+                        mViewModel.updatePass(password.getText().toString(),obj.toString());
+                    }
+                });
+            }
+            password.setText("");
+            password.setTag(null);
+        });
+    }
+
+    @Override
+    public void loadData() {
+        List<String> list = new ArrayList<>();
+        for(int i = 1 ; i < 10; i ++) {
+            list.add(i+"");
+        }
+        list.add("×");
+        list.add("0");
+        list.add("←");
+        NumAdapter numAdapter = new NumAdapter(list);
+        numAdapter.setOnItemClickListener((position, s) -> {
+
+            if(s.equals("←")){
+                new Thread(() -> {
+                    Instrumentation inst = new Instrumentation();
+                    inst.sendKeyDownUpSync( KeyEvent.KEYCODE_DEL  );
+                }).start();
+            }else if(s.equals("×")){
+                showDialog("取消操作", "确定取消当前操作?", new ResPonse() {
+                    @Override
+                    public void doSuccess(Object obj) {
+                        finish();
+                    }
+                });
+            } else {
+                new Thread(() -> {
+                    Instrumentation inst = new Instrumentation();
+                    inst.sendKeyDownUpSync( Integer.parseInt(s)+7 );
+                }).start();
+            }
+        });
+        mBinding.paypassInclude.recyclerNum.setAdapter(numAdapter);
+    }
+}
diff --git a/app/src/main/java/com/runt/open/mvvm/util/DeviceUtil.java b/app/src/main/java/com/runt/open/mvvm/util/DeviceUtil.java
index fc5a85c..37f7b36 100644
--- a/app/src/main/java/com/runt/open/mvvm/util/DeviceUtil.java
+++ b/app/src/main/java/com/runt/open/mvvm/util/DeviceUtil.java
@@ -293,25 +293,7 @@
         return 0;
     }
 
-    /**
-     * dp获取dip
-     * @param dp
-     * @return
-     */
-    public static int convertDpToPixel(float dp, Context context) {
-        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
-        return (int) (dp * displayMetrics.density);
-    }
 
-    /***
-     * px获取dip
-     * @param pixel
-     * @return
-     */
-    public static int convertPixelToDp(int pixel, Context context) {
-        DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
-        return (int) (pixel / displayMetrics.density);
-    }
 
     public static String getSerialNumber(Context context) {
         String serial = "";
diff --git a/app/src/main/java/com/runt/open/mvvm/util/DimensionUtils.java b/app/src/main/java/com/runt/open/mvvm/util/DimensionUtils.java
index 73494a0..83ed432 100644
--- a/app/src/main/java/com/runt/open/mvvm/util/DimensionUtils.java
+++ b/app/src/main/java/com/runt/open/mvvm/util/DimensionUtils.java
@@ -12,9 +12,9 @@
      * @param dp
      * @return
      */
-    public int convertDpToPixel(float dp,Context context) {
+    public static float convertDpToPixel(float dp, Context context) {
         DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
-        return (int) (dp * displayMetrics.density);
+        return (dp * displayMetrics.density);
     }
 
     /***
@@ -22,9 +22,9 @@
      * @param pixel
      * @return
      */
-    public int convertPixelToDp(int pixel,Context context) {
+    public static float convertPixelToDp(int pixel,Context context) {
         DisplayMetrics displayMetrics = context.getResources().getDisplayMetrics();
-        return (int) (pixel / displayMetrics.density);
+        return (pixel / displayMetrics.density);
     }
     /**
      * 把pix值转换为sp
@@ -44,8 +44,8 @@
      *            (DisplayMetrics类中属性scaledDensity)
      * @return
      */
-    public static int convertSpToPixel(Context context, float spValue) {
+    public static float convertSpToPixel(Context context, float spValue) {
         final float fontScale = context.getResources().getDisplayMetrics().scaledDensity;
-        return (int) (spValue * fontScale + 0.5f);
+        return (spValue * fontScale + 0.5f);
     }
 }
diff --git a/app/src/main/java/com/runt/open/mvvm/widgets/PasswordInputView.java b/app/src/main/java/com/runt/open/mvvm/widgets/PasswordInputView.java
new file mode 100644
index 0000000..e0d6a5f
--- /dev/null
+++ b/app/src/main/java/com/runt/open/mvvm/widgets/PasswordInputView.java
@@ -0,0 +1,245 @@
+package com.runt.open.mvvm.widgets;
+
+import android.content.Context;
+import android.content.res.Resources;
+import android.content.res.TypedArray;
+import android.graphics.Canvas;
+import android.graphics.Paint;
+import android.graphics.RectF;
+import android.util.AttributeSet;
+import com.runt.open.mvvm.R;
+import com.runt.open.mvvm.util.DimensionUtils;
+
+/**
+ * @purpose Created by Runt (qingingrunt2010@qq.com) on 2019-3-26.
+ */
+public class PasswordInputView  extends androidx.appcompat.widget.AppCompatEditText {
+    private int textLength;
+
+    private int borderColor;
+
+    private float borderWidth;
+
+    private float borderRadius;
+
+    private int passwordLength;
+
+    private int passwordColor;
+
+    private float passwordWidth;
+
+    private float passwordRadius;
+
+    private Paint passwordPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+    private Paint borderPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
+
+    private final int defaultSplitLineWidth = 1;
+
+    public PasswordInputView(Context context, AttributeSet attrs) {
+
+        super(context, attrs);
+
+        final Resources res = getResources();
+
+        final int defaultBorderColor = res.getColor(R.color.cut_off_line);
+
+        final float defaultBorderWidth = res.getDimension(R.dimen.dimen_1px);
+
+        final float defaultBorderRadius = res.getDimension(R.dimen.radios);
+
+        final int defaultPasswordLength = 6;
+
+        final int defaultPasswordColor = res.getColor(R.color.txt_normal);
+
+        final float defaultPasswordWidth = res.getDimension(R.dimen.dimen_6);
+
+        final float defaultPasswordRadius = res.getDimension(R.dimen.dimen_6);
+
+        TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.PasswordInputView, 0, 0);
+
+        try {
+
+            borderColor = a.getColor(R.styleable.PasswordInputView_borderColor, defaultBorderColor);
+
+            borderWidth = a.getDimension(R.styleable.PasswordInputView_borderWidth, defaultBorderWidth);
+
+            borderRadius = a.getDimension(R.styleable.PasswordInputView_borderRadius, defaultBorderRadius);
+
+            passwordLength = a.getInt(R.styleable.PasswordInputView_passwordLength, defaultPasswordLength);
+
+            passwordColor = a.getColor(R.styleable.PasswordInputView_passwordColor, defaultPasswordColor);
+
+            passwordWidth = a.getDimension(R.styleable.PasswordInputView_passwordWidth, defaultPasswordWidth);
+
+            passwordRadius = a.getDimension(R.styleable.PasswordInputView_passwordRadius, defaultPasswordRadius);
+
+        } finally {
+
+            a.recycle();
+
+        }
+
+        borderPaint.setStrokeWidth(borderWidth);
+        borderPaint.setStyle(Paint.Style.STROKE); //空心的
+        borderPaint.setStrokeWidth(DimensionUtils.convertDpToPixel(1,getContext()));//线宽
+        borderPaint.setColor(borderColor);
+
+        passwordPaint.setStrokeWidth(passwordWidth);
+        passwordPaint.setStyle(Paint.Style.FILL);
+
+        passwordPaint.setColor(passwordColor);
+        setBackground(null);
+        setSingleLine(true);
+
+    }
+
+    @Override
+
+    protected void onDraw(Canvas canvas) {
+
+        int width = getWidth();
+
+        int border = (int) DimensionUtils.convertDpToPixel(1,getContext());
+
+
+        final float cha = (borderWidth - passwordWidth)/2;
+        final float xCha = (width/passwordLength-borderWidth)/2;
+
+        for (int i = 0; i < passwordLength; i++) {
+            float x = width * i / passwordLength + xCha;
+            canvas.drawRoundRect(new RectF(x, border, x+borderWidth, border+borderWidth), 10, 10, borderPaint);
+
+        }
+
+        // 密码
+
+        float cx, cy = cha+passwordWidth/2 + border;
+
+        for(int i = 0; i < textLength; i++) {
+
+            cx = width * i / passwordLength + cha+passwordWidth/2 + xCha;
+
+            canvas.drawCircle(cx, cy, passwordWidth, passwordPaint);
+
+        }
+
+    }
+
+    @Override
+    protected void onTextChanged(CharSequence text, int start, int lengthBefore, int lengthAfter) {
+
+        super.onTextChanged(text, start, lengthBefore, lengthAfter);
+
+        this.textLength = text.toString().length();
+
+        invalidate();
+
+    }
+
+    public int getBorderColor() {
+
+        return borderColor;
+
+    }
+
+    public void setBorderColor(int borderColor) {
+
+        this.borderColor = borderColor;
+
+        borderPaint.setColor(borderColor);
+
+        invalidate();
+
+    }
+
+    public float getBorderWidth() {
+
+        return borderWidth;
+
+    }
+
+    public void setBorderWidth(float borderWidth) {
+
+        this.borderWidth = borderWidth;
+
+        borderPaint.setStrokeWidth(borderWidth);
+
+        invalidate();
+
+    }
+
+    public float getBorderRadius() {
+
+        return borderRadius;
+
+    }
+
+    public void setBorderRadius(float borderRadius) {
+
+        this.borderRadius = borderRadius;
+
+        invalidate();
+
+    }
+
+    public int getPasswordLength() {
+
+        return passwordLength;
+
+    }
+
+    public void setPasswordLength(int passwordLength) {
+
+        this.passwordLength = passwordLength;
+
+        invalidate();
+
+    }
+
+    public int getPasswordColor() {
+
+        return passwordColor;
+
+    }
+
+    public void setPasswordColor(int passwordColor) {
+
+        this.passwordColor = passwordColor;
+
+        passwordPaint.setColor(passwordColor);
+
+        invalidate();
+
+    }
+
+    public float getPasswordWidth() {
+
+        return passwordWidth;
+
+    }
+
+    public void setPasswordWidth(float passwordWidth) {
+
+        this.passwordWidth = passwordWidth;
+
+        passwordPaint.setStrokeWidth(passwordWidth);
+
+        invalidate();
+
+    }
+
+    public float getPasswordRadius() {
+
+        return passwordRadius;
+
+    }
+
+    public void setPasswordRadius(float passwordRadius) {
+
+        this.passwordRadius = passwordRadius;
+
+        invalidate();
+
+    }
+}
diff --git a/app/src/main/res/layout/activity_paypass.xml b/app/src/main/res/layout/activity_paypass.xml
new file mode 100644
index 0000000..d82e662
--- /dev/null
+++ b/app/src/main/res/layout/activity_paypass.xml
@@ -0,0 +1,34 @@
+<?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:layout_width="match_parent"
+    android:layout_height="match_parent"  >
+
+    <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="支付密码"
+        tools:ignore="MissingConstraints"/>
+
+    <include
+        android:id="@+id/paypass_include"
+        layout="@layout/dialog_paypass"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintBottom_toBottomOf="parent" />
+
+    <View
+        app:layout_constraintTop_toBottomOf="@id/title_bar"
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/gray_normal" />
+
+
+
+</androidx.constraintlayout.widget.ConstraintLayout>
diff --git a/app/src/main/res/layout/activity_recycler.xml b/app/src/main/res/layout/activity_recycler.xml
new file mode 100644
index 0000000..67378e2
--- /dev/null
+++ b/app/src/main/res/layout/activity_recycler.xml
@@ -0,0 +1,31 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent" xmlns:app="http://schemas.android.com/apk/res-auto">
+
+    <com.runt.open.mvvm.widgets.TitleBarView
+        android:id="@+id/title_bar"
+        style="@style/titlebar"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:leftDrawable="@mipmap/icon_white_back"
+        app:leftTint="@color/txt_normal"
+        app:titleTextColor="@color/txt_normal"/>
+
+    <include
+        android:layout_width="match_parent"
+        android:layout_height="0dp"
+        layout="@layout/refresh_recycler"
+        app:layout_constraintBottom_toBottomOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/title_bar"
+        app:layout_constraintLeft_toLeftOf="parent"
+        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/cut_off_line"/>
+
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/activity_withdraw.xml b/app/src/main/res/layout/activity_withdraw.xml
new file mode 100644
index 0000000..f168a07
--- /dev/null
+++ b/app/src/main/res/layout/activity_withdraw.xml
@@ -0,0 +1,99 @@
+<?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: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"
+        android:background="@color/transparent"
+        app:leftDrawable="@mipmap/icon_white_back"
+        app:leftTint="@color/black"
+        app:titleText="提现"
+        />
+    <View
+        android:layout_width="match_parent"
+        android:layout_height="0.5dp"
+        android:background="@color/color_gray8" />
+
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="@dimen/default_margin_lr"
+        android:layout_marginLeft="@dimen/default_margin_lr"
+        android:layout_marginRight="@dimen/default_margin_lr"
+        android:orientation="vertical">
+
+        <TextView
+            android:id="@+id/txt_balance"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="当前金币数量1000个" />
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/default_margin_td"
+            android:gravity="center_vertical"
+            android:orientation="horizontal">
+
+            <EditText
+                android:id="@+id/edit"
+                android:layout_width="match_parent"
+                android:layout_weight="1"
+                android:layout_height="40dp"
+                android:background="@null"
+                android:inputType="number"
+                android:textSize="23sp"
+                android:gravity="right|center_vertical"
+                android:textColor="@color/txt_normal"
+                android:hint="输入提现数量" />
+            <TextView
+                android:layout_width="wrap_content"
+                android:layout_height="40dp"
+                android:textSize="23sp"
+                android:layout_marginLeft="5dp"
+                android:gravity="center_vertical"
+                android:text=",000 个" />
+        </LinearLayout>
+        <TextView
+            android:id="@+id/txt_rmb"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_marginTop="@dimen/default_margin_td"
+            android:layout_gravity="right"
+            android:textSize="16sp"
+            android:text="提现¥0元" />
+
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:textSize="12sp"
+            android:textColor="@color/txt_enable"
+            android:layout_marginTop="@dimen/default_margin_td"
+            android:text="输入金币数量必须为1000的倍数,1000兑换为1元人民币。提现申请提交后,系统会在一个工作日内将金额汇入您所设置的支付宝账户中,请留意查收"
+            />
+
+    </LinearLayout>
+
+    <LinearLayout
+        android:id="@+id/lin_ad"
+        android:layout_margin="15dp"
+        android:orientation="vertical"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content" ></LinearLayout>
+    <Button
+        android:id="@+id/btn_submit"
+        style="@style/btn_normal"
+        android:layout_marginTop="20dp"
+        android:layout_marginBottom="50dp"
+        android:layout_marginLeft="@dimen/default_margin_lr"
+        android:layout_marginRight="@dimen/default_margin_lr"
+        android:text="提交申请"/>
+
+</LinearLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/dialog_paypass.xml b/app/src/main/res/layout/dialog_paypass.xml
new file mode 100644
index 0000000..ceda82b
--- /dev/null
+++ b/app/src/main/res/layout/dialog_paypass.xml
@@ -0,0 +1,63 @@
+<?xml version="1.0" encoding="utf-8"?>
+<androidx.constraintlayout.widget.ConstraintLayout
+    xmlns:android="http://schemas.android.com/apk/res/android"
+    android:layout_width="match_parent"
+    android:layout_height="wrap_content" xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools">
+
+    <TextView
+        android:id="@+id/txt_tip"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:text=""
+        android:gravity="center"
+        android:textSize="14sp"
+        android:layout_margin="@dimen/default_margin_lr"
+        app:layout_constraintTop_toTopOf="parent"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent" />
+
+    <com.runt.open.mvvm.widgets.PasswordInputView
+        android:id="@+id/password"
+        android:layout_width="match_parent"
+        android:layout_height="50dp"
+        android:inputType="number"
+        android:background="@null"
+        android:layout_marginTop="36dp"
+        android:layout_marginLeft="21dp"
+        android:layout_marginRight="20dp"
+        android:focusable="true"
+        android:focusableInTouchMode="true"
+        android:maxLength="6"
+        app:passwordColor="@color/black"
+        app:passwordWidth="10dp"
+        app:passwordLength="6"
+        app:borderColor="@color/gray"
+        app:borderWidth="47dp"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/txt_tip" />
+
+    <View
+        android:id="@+id/view"
+        android:layout_width="match_parent"
+        android:layout_height="match_parent"
+        app:layout_constraintLeft_toLeftOf="@id/password"
+        app:layout_constraintRight_toRightOf="@id/password"
+        app:layout_constraintTop_toTopOf="@id/password"
+        app:layout_constraintBottom_toBottomOf="@id/password" />
+
+    <androidx.recyclerview.widget.RecyclerView
+        android:id="@+id/recycler_num"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:layout_marginTop="16dp"
+        android:overScrollMode="never"
+        app:layout_constraintLeft_toLeftOf="parent"
+        app:layout_constraintRight_toRightOf="parent"
+        app:layout_constraintTop_toBottomOf="@id/password"
+        app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
+        app:spanCount="3"
+        tools:listitem="@layout/item_num"
+        tools:itemCount="12" />
+</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
diff --git a/app/src/main/res/layout/item_num.xml b/app/src/main/res/layout/item_num.xml
new file mode 100644
index 0000000..74c24b3
--- /dev/null
+++ b/app/src/main/res/layout/item_num.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8"?>
+<com.runt.open.mvvm.widgets.QuadrateLinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:gravity="center"
+    android:orientation="vertical" >
+    <TextView
+        android:id="@+id/text"
+        android:text="←"
+        style="@style/item_num" />
+
+</com.runt.open.mvvm.widgets.QuadrateLinearLayout >
\ No newline at end of file
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index 59f56cf..c9a2763 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -45,4 +45,6 @@
     <dimen name="default_margin_lr">27dp</dimen>
     <dimen name="default_margin_td">12dp</dimen>
 
+    <dimen name="dimen_1px">1px</dimen>
+    <dimen name="dimen_6">6dp</dimen>
 </resources>
\ No newline at end of file
diff --git a/app/src/main/res/values/styles.xml b/app/src/main/res/values/styles.xml
index 14e8819..3430e63 100644
--- a/app/src/main/res/values/styles.xml
+++ b/app/src/main/res/values/styles.xml
@@ -150,4 +150,25 @@
         <item name="android:paddingLeft">@dimen/default_margin_lr</item>
         <item name="android:paddingRight">@dimen/default_margin_lr</item>
     </style>
+
+    <declare-styleable name="PasswordInputView">
+        <attr name="borderColor" format="color" />
+        <attr name="borderWidth" format="dimension" />
+        <attr name="borderRadius" format="dimension" />
+        <attr name="passwordLength" format="integer" />
+        <attr name="passwordColor" format="color" />
+        <attr name="passwordWidth" format="dimension" />
+        <attr name="passwordRadius" format="dimension" />
+    </declare-styleable>
+
+
+    <style name="item_num">
+        <item name="android:layout_width">match_parent</item>
+        <item name="android:layout_height">match_parent</item>
+        <item name="android:gravity">center</item>
+        <item name="android:background">@drawable/bg_num</item>
+        <item name="android:textColor">@color/black</item>
+        <item name="android:textSize">44sp</item>
+    </style>
+
 </resources>
\ No newline at end of file

--
Gitblit v1.9.1