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