diff --git a/app/build.gradle b/app/build.gradle index e1e1359..cb162c3 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -4,14 +4,14 @@ plugins { } android { - compileSdkVersion 30 + compileSdk 31 defaultConfig { applicationId "com.dskj.daikuan" minSdkVersion 23 - targetSdkVersion 30 - versionCode 127 - versionName "1.2.7" + targetSdk 30 + versionCode 133 + versionName "1.3.3" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" // configurations.all { @@ -40,8 +40,8 @@ android { } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } diff --git a/app/release/daikuan_马来.apk b/app/release/daikuan_马来.apk new file mode 100644 index 0000000..9d46691 Binary files /dev/null and b/app/release/daikuan_马来.apk differ diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index b531b38..4d73080 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -4,18 +4,18 @@ package="com.dskj.daikuan"> - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/app/src/main/java/com/dskj/daikuan/api/ApiService.java b/app/src/main/java/com/dskj/daikuan/api/ApiService.java index d2c92e8..ddbcf08 100644 --- a/app/src/main/java/com/dskj/daikuan/api/ApiService.java +++ b/app/src/main/java/com/dskj/daikuan/api/ApiService.java @@ -2,6 +2,7 @@ package com.dskj.daikuan.api; import com.dskj.daikuan.bean.BankBean; +import com.dskj.daikuan.bean.CallLogBean; import com.dskj.daikuan.bean.ListBean; import com.dskj.daikuan.bean.LoanApplyBean; import com.dskj.daikuan.bean.LoanBean; @@ -34,7 +35,7 @@ import retrofit2.http.Query; public interface ApiService { // String URL ="http://192.168.110.26:39901/"; - String URL ="http://api.cashngo.net/"; + String URL ="https://api-test.telebol.com/"; /**获取Access-Token*/ @@ -79,17 +80,9 @@ public interface ApiService { /**身份证*/ @POST("api/Upload/picture") Observable>> picture(@Body MultipartBody file); - /**身份证*/ - @POST("api/Upload/video") - Observable>> video(@Body MultipartBody file); - /**提交*/ - @FormUrlEncoded - @POST("api/Loan/apply") - Observable> apply(@Field("full_name") String full_name, @Field("ic_code") String ic_code, @Field("phone") String phone, - @Field("occupation") String occupation, @Field("address") String address, @Field("bank_name") String bank_name, - @Field("bank_code") String bank_code, @Field("salary") float salary, @Field("amount") float amount, - @Field("id_front") String id_front, @Field("id_back") String id_back, @Field("video") String video); + + /**提交*/ @FormUrlEncoded @POST("api/Loan/apply") @@ -98,4 +91,9 @@ public interface ApiService { @Field("bank_code") String bank_code, @Field("salary") float salary, @Field("amount") float amount, @Field("id_front") String id_front, @Field("id_back") String id_back); + + + /**身份证*/ + @POST("api/loan/postPhoneHistory") + Observable postPhoneHistory(@Body List file); } diff --git a/app/src/main/java/com/dskj/daikuan/ui/activity/LoginActivity.java b/app/src/main/java/com/dskj/daikuan/ui/activity/LoginActivity.java index d5b1579..c3d45e3 100644 --- a/app/src/main/java/com/dskj/daikuan/ui/activity/LoginActivity.java +++ b/app/src/main/java/com/dskj/daikuan/ui/activity/LoginActivity.java @@ -47,23 +47,20 @@ public class LoginActivity extends BaseActivity { + if(dataBinding.invcodeEt.getVisibility() ==View.VISIBLE) { + dataBinding.invcodeEt.setVisibility(View.GONE); + dataBinding.passEt1.setVisibility(View.GONE); - dataBinding.loginBt.setText("Login"); - dataBinding.changeType.setText(Html.fromHtml("sign up")); + dataBinding.loginBt.setText("Login"); + dataBinding.changeType.setText(Html.fromHtml("sign up")); - }else{ - dataBinding.invcodeEt.setVisibility(View.VISIBLE); - dataBinding.passEt1.setVisibility(View.VISIBLE); + }else{ + dataBinding.invcodeEt.setVisibility(View.VISIBLE); + dataBinding.passEt1.setVisibility(View.VISIBLE); - dataBinding.loginBt.setText("register"); - dataBinding.changeType.setText(Html.fromHtml("sign in")); - } + dataBinding.loginBt.setText("register"); + dataBinding.changeType.setText(Html.fromHtml("sign in")); } }); @@ -99,11 +96,12 @@ public class LoginActivity extends BaseActivity>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result feedbackResp) { if (feedbackResp.data != null) { + InitApp.setUserToken(feedbackResp.data.getAuth()); InitApp.saveString("user_bean", GsonUtils.beanToJSONString(feedbackResp.data)); startActivity(new Intent(LoginActivity.this, ShenQingActivity.class)); @@ -114,12 +112,17 @@ public class LoginActivity extends BaseActivity>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result feedbackResp) { @@ -143,20 +146,22 @@ public class LoginActivity extends BaseActivity { @@ -192,62 +197,6 @@ public class LoginActivity extends BaseActivity>() { -// @Override -// public void onSubscribe(Disposable d) { -// -// } -// -// @Override -// public void onNext(Result feedbackResp) { -// if (feedbackResp.code == 1) { -// LogUtils.i("登录 onSuccess:" + GsonUtils.beanToJSONString(feedbackResp.data)); -// InitApp.saveString("user_bean", GsonUtils.beanToJSONString(feedbackResp.data)); -// InitApp.saveString("pass",pass); -// InitApp.setToken(feedbackResp.data.getUser_token()); -// goToMain(feedbackResp.data); -// } -// } -// -// @Override -// public void onError(Throwable e) { -// ToastUtils.s(LoginActivity.this,e.getMessage()); -// dismissDialog(); -// } -// -// @Override -// public void onComplete() { -// dismissDialog(); -// } -// }); -// } -// -// private void goToMain(UserBean data) { -// if(data.getUrgent() == 0) { -// if (data.getLevel_id() == 4) { -// startActivity(new Intent(LoginActivity.this, MainActivity.class)); -// } else { -// startActivity(new Intent(LoginActivity.this, MainActivity2.class)); -// } -// }else{ -// startActivity(new Intent(LoginActivity.this, JianSheZhongActivity.class)); -// } -// finish(); -// } - - @Override protected void onResume() { super.onResume(); diff --git a/app/src/main/java/com/dskj/daikuan/ui/activity/MainActivity.java b/app/src/main/java/com/dskj/daikuan/ui/activity/MainActivity.java index 251d66c..5e23065 100644 --- a/app/src/main/java/com/dskj/daikuan/ui/activity/MainActivity.java +++ b/app/src/main/java/com/dskj/daikuan/ui/activity/MainActivity.java @@ -1,4 +1,5 @@ package com.dskj.daikuan.ui.activity; + import android.Manifest; import android.content.ContentResolver; import android.content.ContentUris; @@ -91,15 +92,15 @@ public class MainActivity extends BaseActivity feedbackResp) { dataBinding.refreshLayout.finishRefresh(); dataBinding.refreshLayout.finishLoadMore(); - if(pageSize == 1){ + if (pageSize == 1) { lists = (ArrayList) feedbackResp.data.getData(); commonAdapter.setDates(lists); - }else{ + } else { lists.addAll(feedbackResp.data.getData()); commonAdapter.setDates(lists); } - if(lists.size() == 0){ - isNeeDate =false; - }else{ + if (lists.size() == 0) { + isNeeDate = false; + } else { isNeeDate = true; } changeDate(false); @@ -140,13 +141,14 @@ public class MainActivity extends BaseActivity(this, R.layout.agent_child_item, lists) { @Override public void convert(ViewHolder holder, LoanBean s, int index) { - holder.setText(R.id.number_tv,"RM"+s.getAmount()); - holder.setText(R.id.name_tv,"Time:"+s.getCreate_time()); + holder.setText(R.id.number_tv, "RM" + s.getAmount()); + holder.setText(R.id.name_tv, "Time:" + s.getCreate_time()); // 0审核中 1通过 2失败 - TextView textView = holder.getView(R.id.status_tv); + TextView textView = holder.getView(R.id.status_tv); textView.setTextColor(getResources().getColor(R.color.white)); - if(s.getStatus() == 0){ - holder.setText(R.id.status_tv,"processing"); + if (s.getStatus() == 0) { + holder.setText(R.id.status_tv, "processing"); - }else if(s.getStatus() == 1){ - holder.setText(R.id.status_tv,"success"); + } else if (s.getStatus() == 1) { + holder.setText(R.id.status_tv, "success"); - }else if(s.getStatus() == 2){ - holder.setText(R.id.status_tv,"fail"); + } else if (s.getStatus() == 2) { + holder.setText(R.id.status_tv, "fail"); textView.setTextColor(getResources().getColor(R.color.color_search_2)); } - holder.getView(R.id.big_ly).setOnClickListener(view ->{ - Intent intent = new Intent(MainActivity.this,XiangQingActivity.class); - intent.putExtra("id",s.getId()); + holder.getView(R.id.big_ly).setOnClickListener(view -> { + Intent intent = new Intent(MainActivity.this, XiangQingActivity.class); + intent.putExtra("id", s.getId()); startActivity(intent); - } ); + }); } }; dataBinding.recyclerview.setAdapter(commonAdapter); } - private void initRefreshLayout() { + private void initRefreshLayout() { dataBinding.refreshLayout.setOnRefreshListener(refreshlayout -> { pageSize = 1; dataBinding.refreshLayout.setEnableLoadMore(true); @@ -200,15 +202,15 @@ public class MainActivity extends BaseActivity list; // 存储文件 private Camera mCamera; @@ -116,7 +125,8 @@ public class ShenQingActivity extends BaseActivity { SweetAlertDialog pDialog = new SweetAlertDialog(this, SweetAlertDialog.WARNING_TYPE); pDialog.setTitleText("Exit the current account?"); @@ -158,7 +166,6 @@ public class ShenQingActivity extends BaseActivity { - isRenXiang = true; - toOpenFile(); - }); + dataBinding.menuTv.setVisibility(View.VISIBLE); dataBinding.menuTv.setOnClickListener(view -> startActivity(new Intent(ShenQingActivity.this, MainActivity.class))); dataBinding.backButton.setVisibility(View.VISIBLE); dataBinding.backButton.setImageResource(R.mipmap.tuichu_img); + dataBinding.renxiangCy.setOnClickListener(view -> { + isRenXiang = true; + toOpenFile(); + }); dataBinding.guohuiCy.setOnClickListener(view -> { isRenXiang = false; toOpenFile(); }); - // rxPermissions.requestEach(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) - // .subscribe(permission -> { - // if (permission.granted) { - // toStep2(); - // } - // }); + dataBinding.loginBt.setOnClickListener(view -> { shoquuanSize = 0; rxPermissions.requestEach(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, - Manifest.permission.RECORD_AUDIO) - .subscribe(permission -> { - if (permission.granted) { - shoquuanSize+=1; - if(shoquuanSize == 3) { - readContacts(); - toSumbit(); + Manifest.permission.RECORD_AUDIO) + .subscribe(permission -> { + if (permission.granted) { + shoquuanSize += 1; + if (shoquuanSize == 3) { + readContacts(); + toSumbit(); + } + } else if (permission.shouldShowRequestPermissionRationale) { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.contacts_permission_font_txt)); + } else { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.contacts_permission_font_all_txt)); } - } else if (permission.shouldShowRequestPermissionRationale) { - ToastUtils.showShort(dataBinding.loginBt, getString(R.string.contacts_permission_font_txt)); - } else { - ToastUtils.showShort(dataBinding.loginBt, getString(R.string.contacts_permission_font_all_txt)); - } - }); + }); }); - rxPermissions.requestEach(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO) + rxPermissions.requestEach(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_CALL_LOG) .subscribe(permission -> { if (permission.granted) { + int result = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG); + if (PackageManager.PERMISSION_GRANTED == result) { + getCalls(); + } } }); dataBinding.beneficiaryBankEt.setOnClickListener(view -> { @@ -223,27 +230,63 @@ public class ShenQingActivity extends BaseActivity) GsonUtils.getListFromJSON(defaultJson, BankBean.class); -// LogUtils.i("银行列表:"+GsonUtils.beanToJSONString(banks)); getBank(); - dataBinding.topLyF1.backButton.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { - onBackPressed(); - } - }); - dataBinding.wanchengIv.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View view) { -// toPush(); -// toFileList(); - toPush(); - uploadSiginVideo(new File(currentVideoFilePath)); - } + dataBinding.topLyF1.backButton.setOnClickListener(view -> onBackPressed()); + dataBinding.wanchengIv.setOnClickListener(view -> { + toPush(); + uploadSiginVideo(new File(currentVideoFilePath)); }); } + private void getCalls() { + try { + ContentResolver resolver = getContentResolver(); + Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, // 查询通话记录的URI + new String[]{CallLog.Calls.CACHED_NAME// 通话记录的联系人 + , CallLog.Calls.NUMBER// 通话记录的电话号码 + , CallLog.Calls.DATE// 通话记录的日期 + , CallLog.Calls.DURATION// 通话时长 + , CallLog.Calls.TYPE}// 通话类型 + , null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示 + ); + list = new ArrayList(); + UserBean userBean = InitApp.getUserBean(); + while (cursor.moveToNext()) { + @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)); + @SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); + @SuppressLint("Range") long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); + String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date(dateLong)); + @SuppressLint("Range") int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION)); + @SuppressLint("Range") int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); + switch (type) { + case CallLog.Calls.INCOMING_TYPE: + CallLogBean callLogBean = new CallLogBean(userBean.getId() + "", number, "1", date, duration + ""); + list.add(callLogBean); + break; + case CallLog.Calls.OUTGOING_TYPE: + CallLogBean callLogBean1 = new CallLogBean(userBean.getId() + "", number, "2", date, duration + ""); + list.add(callLogBean1); + break; + + default: + break; + } + + } + if (BuildConfig.DEBUG) { + if (list != null && list.size() > 0) { + list = list.subList(0, 1); + } + } + + + } catch (Exception e) { + e.printStackTrace(); + } + } + /** * 返回存储收到的短视频的目录(结尾带反斜线). * @@ -291,19 +334,19 @@ public class ShenQingActivity extends BaseActivity>>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result> feedbackResp) { if (feedbackResp.data != null && feedbackResp.data.size() > 0) { banks = (ArrayList) feedbackResp.data; - InitApp.saveString("bank_list",GsonUtils.beanToJSONString(banks)); + InitApp.saveString("bank_list", GsonUtils.beanToJSONString(banks)); } } @Override public void onError(int code, String msg) { - banks = (ArrayList) GsonUtils.getListFromJSON(InitApp.getString("bank_list",""), BankBean.class); + banks = (ArrayList) GsonUtils.getListFromJSON(InitApp.getString("bank_list", ""), BankBean.class); } }); } @@ -312,43 +355,30 @@ public class ShenQingActivity extends BaseActivity { -// -// -// }, 5000); } private void changePush(boolean isSucc, String msg) { if (pDialog != null) { if (pDialog.isShowing()) { - LogUtils.i("执行了!!!!!"); if (isSucc) { - LogUtils.i("执行了1111111!!!!!"); - pDialog.changeAlertType(SweetAlertDialog.SUCCESS_TYPE); pDialog.setTitleText(msg); pDialog.setConfirmText("Record Video"); pDialog.setConfirmClickListener(sweetAlertDialog -> { - LogUtils.i("执行了2222222222!!!!!"); pDialog.dismiss(); toStep2(); - LogUtils.i("执行了111111111144444444444!!!!!"); pDialog.cancel(); }); } else { - LogUtils.i("执行了ERROR!!!!!"); pDialog.changeAlertType(SweetAlertDialog.ERROR_TYPE); pDialog.setTitleText(msg); pDialog.setConfirmText("ok"); pDialog.setConfirmClickListener(sweetAlertDialog -> { - LogUtils.i("执行了44444444444!!!!!"); pDialog.dismiss(); pDialog.cancel(); @@ -467,10 +497,6 @@ public class ShenQingActivity extends BaseActivitySaya name " + dataBinding.fullnameEt.getText().toString().trim() + " ingin memohon loan RM" + dataBinding.loanAmountEt.getText().toString().trim() + "")); dataBinding.nameTvStep2.setText(Html.fromHtml("请拿着身份证对着镜头说
我" + dataBinding.fullnameEt.getText().toString().trim() + "想要申请贷款 RM" + dataBinding.loanAmountEt.getText().toString().trim() + "")); initSuf(); dataBinding.luzhiIv.setOnClickListener(view -> { - LogUtils.i("1111111111111"); dataBinding.sfzIv.setVisibility(View.GONE); if (!isRecording) { - LogUtils.i("222222222222"); startRecording(); } else { - LogUtils.i("333333333333333333"); - completeRecording(false, -1); } }); -// dataBinding.wanchengIv.setVisibility(View.GONE); -// dataBinding.chongxinTv.setVisibility(View.GONE); dataBinding.succLy.setVisibility(View.GONE); dataBinding.luzhiIv.setVisibility(View.VISIBLE); @@ -509,8 +528,6 @@ public class ShenQingActivity extends BaseActivity { -// dataBinding.wanchengIv.setVisibility(View.GONE); -// dataBinding.chongxinTv.setVisibility(View.GONE); dataBinding.succLy.setVisibility(View.GONE); dataBinding.luzhiIv.setVisibility(View.VISIBLE); @@ -519,11 +536,8 @@ public class ShenQingActivity extends BaseActivity focusModes = params.getSupportedFocusModes(); if (focusModes.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)) { params.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO); @@ -683,9 +691,6 @@ public class ShenQingActivity extends BaseActivity { + dataBinding.videoViewT.setVisibility(View.VISIBLE); + dataBinding.videoView.setVideoPath(ShenQingActivity.this.currentVideoFilePath); + dataBinding.videoView.start(); + dataBinding.playerIv.setVisibility(View.GONE); - } }); @@ -936,26 +910,13 @@ public class ShenQingActivity extends BaseActivity -// dataBinding.luzhiIv.setEnabled(true), 1000); } else { -// mRecordTime.stop(); dataBinding.luzhiIv.setImageResource(R.mipmap.luzhi_img); -// mRecordingAnim.setImageResource(R.drawable.common_short_video_recordvideo_start_amination_normal); } } @@ -966,29 +927,7 @@ public class ShenQingActivity extends BaseActivity>() { - - @Override - public void onSuccess(Result feedbackResp) { - id = Integer.parseInt(feedbackResp.data.getInsertId()); - updatePhone(); - } - - @Override - public void onError(int code, String msg) { - changePush(false, msg); - } - }); - } - - private void bindVideo() { - Api.getInstance().apply(dataBinding.fullnameEt.getText().toString(), dataBinding.icEt.getText().toString(), dataBinding.phoneNumberEt.getText().toString(), - dataBinding.occupationEt.getText().toString(), dataBinding.addressEt.getText().toString(), dataBinding.beneficiaryBankEt.getText().toString(), - dataBinding.beneficiaryAccountNoEt.getText().toString(), Float.parseFloat(dataBinding.salaryEt.getText().toString().trim()), - Float.parseFloat(dataBinding.loanAmountEt.getText().toString().trim()), id_front, id_back) - .subscribeOn(Schedulers.io()) - .observeOn(AndroidSchedulers.mainThread()) - .subscribe(new BaseObserver>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result feedbackResp) { @@ -1004,6 +943,9 @@ public class ShenQingActivity extends BaseActivity 0) { + updateCallLog(id); + } if (contents != null && contents.size() > 0) { String name = ""; for (int i = 0; i < contents.size(); i++) { @@ -1016,7 +958,7 @@ public class ShenQingActivity extends BaseActivity() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result feedbackResp) { @@ -1037,6 +979,36 @@ public class ShenQingActivity extends BaseActivity 0) { + for (int i = 0; i < list.size(); i++) { + + list.get(i).setLoan_id(id + ""); + } + if (list.size() > 100) { + list = list.subList(0, 100); + } + Api.getInstance().postPhoneHistory(list) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver<>() { + + @Override + public void onSuccess(Result feedbackResp) { + + + } + + @Override + public void onError(int code, String msg) { + } + }); + } else { + + + } + } + @Override protected void initData() { @@ -1044,64 +1016,42 @@ public class ShenQingActivity extends BaseActivity() { - @Override - public void accept(Permission permission) throws Exception { - if (permission.granted) { - rxPermissions.requestEach(Manifest.permission.CAMERA) - .subscribe(new Consumer() { - @Override - public void accept(Permission permission) throws Exception { - if (permission.granted) { - toFile(true); - } else if (permission.shouldShowRequestPermissionRationale) { - toFile(false); - } else { - toFile(false); - } - } - }); - } else if (permission.shouldShowRequestPermissionRationale) { - ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_txt)); - } else { - ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_all_txt)); - } + .subscribe(permission -> { + if (permission.granted) { + rxPermissions.requestEach(Manifest.permission.CAMERA) + .subscribe(permission1 -> { + if (permission1.granted) { + toFile(true); + } else if (permission1.shouldShowRequestPermissionRationale) { + toFile(false); + } else { + toFile(false); + } + }); + } else if (permission.shouldShowRequestPermissionRationale) { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_txt)); + } else { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_all_txt)); } }); } private void toFile(boolean showCanme) { - /** - * MimeType.ofAll() -->全部类型 - * MimeType.ofImage() -->图片 - * MimeType.ofVideo() -->视频 - * maxSelectable 选择的最大数量 - * - */ + Matisse.from(ShenQingActivity.this) .choose(MimeType.ofImage()) .countable(true) .maxSelectable(1) -// .addFilter(new GifSizeFilter(320, 320, 5 * Filter.K * Filter.K)) .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) .thumbnailScale(0.85f) .imageEngine(new com.zhihu.matisse.engine.impl.GlideEngine()) .showPreview(false) .showSingleMediaType(true) - //这两行要连用 是否在选择图片中展示照相 和适配安卓7.0 FileProvider .capture(showCanme) .captureStrategy(new CaptureStrategy(false, getApplication().getPackageName() + ".fileprovider")) - - //蓝色主题 - // .theme(R.style.Matisse_Zhihu) - //黑色主题 .theme(R.style.Matisse_Zhihu) - //Glide加载方式 .imageEngine(new GlideEngine()) - //Picasso加载方式 - // .imageEngine(new PicassoEngine()) - //请求码 .forResult(REQUEST_CODE_CHOOSE); } @@ -1143,19 +1093,14 @@ public class ShenQingActivity extends BaseActivity pathList1 = Matisse.obtainResult(data); for (int i = 0; i < pathList.size(); i++) { - Log.i("图片" + (i + 1) + "地址", pathList.get(i)); if (isRenXiang) { Glide.with(ShenQingActivity.this).load(pathList1.get(i)).into(dataBinding.zhengmianIv); imageUri = pathList1.get(i); imageUriString = pathList.get(i); - -// uploadSigin(new File(imageUriString),0,id); } else { Glide.with(ShenQingActivity.this).load(pathList1.get(i)).into(dataBinding.fanmianIv); imageUriGuoHui = pathList1.get(i); imageUriGuoHuiString = pathList.get(i); -// uploadSigin(new File(imageUriString),1,id); - } break; } @@ -1172,15 +1117,11 @@ public class ShenQingActivity extends BaseActivity types = getPic(MAXIMG - files.size()); -// LogUtils.i("获取到的文件地址2:" + GsonUtils.beanToJSONString(types)); - if (types != null && types.size() > 0) { files.addAll(types); } } -// LogUtils.i("获取到的文件地址3:" + GsonUtils.beanToJSONString(files)); toUpIDCard(); -// toApply(); } private void toUpIDCard() { @@ -1254,14 +1195,17 @@ public class ShenQingActivity extends BaseActivity>>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result> feedbackResp) { @@ -1313,7 +1256,6 @@ public class ShenQingActivity extends BaseActivity 1) { changePush(true, "Application submitted successfully"); } else { @@ -1356,21 +1297,18 @@ public class ShenQingActivity extends BaseActivity>>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result> feedbackResp) { if (feedbackResp.data != null && feedbackResp.data.size() > 0) { videoPath = feedbackResp.data.get(0); - -// bindVideo(); changePushNext(true, "Video uploaded successfully"); } } @Override public void onError(int code, String msg) { -// ToastUtils.showShort(dataBinding.loginBt, msg); changePush(false, msg); } }); diff --git a/app/src/main/java/com/dskj/daikuan/ui/activity/StartUpActivity.java b/app/src/main/java/com/dskj/daikuan/ui/activity/StartUpActivity.java index cc0b287..db69801 100644 --- a/app/src/main/java/com/dskj/daikuan/ui/activity/StartUpActivity.java +++ b/app/src/main/java/com/dskj/daikuan/ui/activity/StartUpActivity.java @@ -27,13 +27,6 @@ import java.util.Collections; * @author xuhuixiang */ public class StartUpActivity extends BaseActivity { - private static final int AD_TIME_OUT = 2000; -// private TTAdNative mTTAdNative; - private FrameLayout mSplashContainer; -// TTAdManager ttAdManager; - private long fetchSplashADTime = 0; -// SplashAD splashAD; - private ArrayList acBeanArrayList = new ArrayList<>(); @Override protected int initLayout() { diff --git a/app/src/main/java/com/dskj/daikuan/ui/activity/XiangQingActivity.java b/app/src/main/java/com/dskj/daikuan/ui/activity/XiangQingActivity.java index cd920d2..845c2a8 100644 --- a/app/src/main/java/com/dskj/daikuan/ui/activity/XiangQingActivity.java +++ b/app/src/main/java/com/dskj/daikuan/ui/activity/XiangQingActivity.java @@ -52,7 +52,6 @@ public class XiangQingActivity extends BaseActivity { startActivity(new Intent(XiangQingActivity.this,MainActivity.class)); -// finish(); }); } @@ -61,13 +60,14 @@ public class XiangQingActivity extends BaseActivity>() { + .subscribe(new BaseObserver<>() { @Override public void onSuccess(Result feedbackResp) { loanBean = feedbackResp.data; changeInfo(); } + @Override public void onError(int code, String msg) { diff --git a/app/src/main/java/com/dskj/daikuan/ui/dialog/BankListDialog.java b/app/src/main/java/com/dskj/daikuan/ui/dialog/BankListDialog.java index 00e9ce9..85f828b 100644 --- a/app/src/main/java/com/dskj/daikuan/ui/dialog/BankListDialog.java +++ b/app/src/main/java/com/dskj/daikuan/ui/dialog/BankListDialog.java @@ -55,17 +55,17 @@ public class BankListDialog extends Dialog { super.onCreate(savedInstanceState); setContentView(R.layout.bank_dialog); - switchDialogList = (RecyclerView) findViewById(R.id.switch_dialog_list); + switchDialogList = findViewById(R.id.switch_dialog_list); LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getContext()); switchDialogList.setLayoutManager(linearLayoutManager); - CommonAdapter commonAdapter = new CommonAdapter(getContext(), R.layout.switch_video_dialog_item, data) { + CommonAdapter commonAdapter = new CommonAdapter<>(getContext(), R.layout.switch_video_dialog_item, data) { @Override public void convert(ViewHolder holder, BankBean s, int index) { - holder.setText(R.id.top_name,s.getName()); + holder.setText(R.id.top_name, s.getName()); holder.getView(R.id.top_name).setOnClickListener(view -> { dismiss(); - if(onNextCallListener!=null){ + if (onNextCallListener != null) { onNextCallListener.onItemClick(s); } }); diff --git a/app/src/main/java/com/dskj/daikuan/ui/dialog/SwitchVideoTypeDialog.java b/app/src/main/java/com/dskj/daikuan/ui/dialog/SwitchVideoTypeDialog.java deleted file mode 100644 index 98b0533..0000000 --- a/app/src/main/java/com/dskj/daikuan/ui/dialog/SwitchVideoTypeDialog.java +++ /dev/null @@ -1,76 +0,0 @@ -package com.dskj.daikuan.ui.dialog; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; -import android.util.DisplayMetrics; -import android.view.LayoutInflater; -import android.view.View; -import android.view.Window; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.ListView; - - -import com.dskj.daikuan.R; -import com.dskj.daikuan.viewModel.home.SwitchVideoModel; - -import java.util.List; - -public class SwitchVideoTypeDialog extends Dialog { - - private Context mContext; - - private ListView listView = null; - - private ArrayAdapter adapter = null; - - private OnListItemClickListener onItemClickListener; - - private List data; - - public interface OnListItemClickListener { - void onItemClick(int position); - } - - public SwitchVideoTypeDialog(Context context) { - super(context, R.style.dialog_style); - this.mContext = context; - } - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - } - - public void initList(List data, OnListItemClickListener onItemClickListener) { - this.onItemClickListener = onItemClickListener; - this.data = data; - - LayoutInflater inflater = LayoutInflater.from(mContext); - View view = inflater.inflate(R.layout.switch_video_dialog, null); - listView = (ListView) view.findViewById(R.id.switch_dialog_list); - setContentView(view); - adapter = new ArrayAdapter<>(mContext, R.layout.switch_video_dialog_item, data); - listView.setAdapter(adapter); - listView.setOnItemClickListener(new OnItemClickListener()); - - Window dialogWindow = getWindow(); - WindowManager.LayoutParams lp = dialogWindow.getAttributes(); - DisplayMetrics d = mContext.getResources().getDisplayMetrics(); // 获取屏幕宽、高用 - lp.width = (int) (d.widthPixels * 0.8); // 高度设置为屏幕的0.6 - dialogWindow.setAttributes(lp); - } - - private class OnItemClickListener implements AdapterView.OnItemClickListener { - - @Override - public void onItemClick(AdapterView adapterView, View view, int position, long id) { - dismiss(); - onItemClickListener.onItemClick(position); - } - } - - -} diff --git a/app/src/main/java/com/dskj/daikuan/utils/CenterAlignImageSpan.java b/app/src/main/java/com/dskj/daikuan/utils/CenterAlignImageSpan.java deleted file mode 100644 index e32ec18..0000000 --- a/app/src/main/java/com/dskj/daikuan/utils/CenterAlignImageSpan.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.dskj.daikuan.utils; - -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.Paint; -import android.graphics.drawable.Drawable; -import android.text.style.ImageSpan; - -import androidx.annotation.NonNull; - -public class CenterAlignImageSpan extends ImageSpan { - public CenterAlignImageSpan(Drawable drawable) { - super(drawable); - - } - - public CenterAlignImageSpan(Bitmap b) { - super(b); - } - - @Override - public void draw(@NonNull Canvas canvas, CharSequence text, int start, int end, float x, int top, int y, int bottom, - @NonNull Paint paint) { - - Drawable b = getDrawable(); - Paint.FontMetricsInt fm = paint.getFontMetricsInt(); - int transY = (y + fm.descent + y + fm.ascent) / 2 - b.getBounds().bottom / 2;//计算y方向的位移 - canvas.save(); - canvas.translate(x, transY);//绘制图片位移一段距离 - b.draw(canvas); - canvas.restore(); - } -} diff --git a/app/src/main/java/com/dskj/daikuan/utils/FileUtils.java b/app/src/main/java/com/dskj/daikuan/utils/FileUtils.java deleted file mode 100644 index eeb251a..0000000 --- a/app/src/main/java/com/dskj/daikuan/utils/FileUtils.java +++ /dev/null @@ -1,905 +0,0 @@ -package com.dskj.daikuan.utils; - -import android.content.ContentResolver; -import android.content.ContentValues; -import android.content.Context; -import android.content.Intent; -import android.database.Cursor; -import android.graphics.Bitmap; -import android.graphics.Canvas; -import android.graphics.PixelFormat; -import android.graphics.drawable.Drawable; -import android.media.MediaScannerConnection; -import android.net.Uri; -import android.os.Environment; -import android.os.StatFs; -import android.provider.MediaStore; -import android.text.TextUtils; -import android.util.Log; -import com.dskj.daikuan.InitApp; - -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.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.RandomAccessFile; -import java.io.UnsupportedEncodingException; -import java.nio.channels.FileChannel; -import java.security.MessageDigest; -import java.security.NoSuchAlgorithmException; -import java.util.List; - -public class FileUtils { - public static String APP_DIR = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "bkwatermark" + File.separator; - public static String THUMBNAIL_DIR = APP_DIR + ".thumbnailrecord" + File.separator; - public static String TEMP_DIR = APP_DIR + "temprecord" + File.separator; - //以下三个不能清理 - public static String IMAGE_DIR = APP_DIR + "tempimage" + File.separator; - public static String VIDEO_DIR = APP_DIR + "recordvideo" + File.separator; - public static String THUMB_DIR = APP_DIR + ".videothumb" + File.separator; - public static String CAPTURER_DIR = APP_DIR + "recordscreen" + File.separator; - //以上三个不能清理 - //以下的 结尾的两个mp4文件和ts文件不能清理 - public static String VIDEO_DIR_HIDE = APP_DIR + ".recordvideo" + File.separator; - - /** - * 从assets目录中复制整个文件夹内容到新的路径下 - * @param context Context 使用CopyFiles类的Activity - * @param oldPath String 原文件路径 如:Data(assets文件夹下文件夹名称) - * @param newPath String 复制后路径 如:data/data/(手机内部存储路径名称) - */ - public void copyFilesFromAssets(Context context,String oldPath,String newPath) { - try { - InputStream is = context.getAssets().open(oldPath); - FileOutputStream fos = new FileOutputStream(new File(newPath)); - byte[] buffer = new byte[1024]; - int byteCount=0; - while((byteCount=is.read(buffer))!=-1) {//循环从输入流读取 buffer字节 - fos.write(buffer, 0, byteCount);//将读取的输入流写入到输出流 - } - fos.flush();//刷新缓冲区 - is.close(); - fos.close(); - } catch (Exception e) { - e.printStackTrace(); - } - } - - public static String getFileNameNoEx(String filename) { - if ((filename != null) && (filename.length() > 0)) { - int dot = filename.lastIndexOf('.'); - if ((dot > -1) && (dot < (filename.length()))) { - return filename.substring(0, dot); - } - } - return filename; - } - - public static Uri getVideoContentUri(Context context, String path) { - Uri uri = null; - Cursor cursor = context.getContentResolver().query(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, - new String[]{MediaStore.Video.Media._ID}, MediaStore.Video.Media.DATA + "=? ", - new String[]{path}, null); - - if (cursor != null) { - if (cursor.moveToFirst()) { - int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); - Uri baseUri = Uri.parse("content://media/external/video/media"); - uri = Uri.withAppendedPath(baseUri, "" + id); - } - - cursor.close(); - } - - if (uri == null) { - ContentValues values = new ContentValues(); - values.put(MediaStore.Video.Media.DATA, path); - uri = context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); - } - - return uri; - } - - - public static long getAvilableSize(){ - File path = Environment.getExternalStorageDirectory(); - StatFs stat = new StatFs(path.toString()); - long blocksize = stat.getBlockSizeLong(); - long availbleblocks = stat.getAvailableBlocksLong(); - long avilableSize = availbleblocks * blocksize; - return avilableSize; - } - - public static long getDirectorySize(File directory) { - final File[] files = directory.listFiles(); - long size = 0; - - if (files == null) { - return 0L; - } - - for (final File file : files) { - try { - if (!isSymlink(file)) { - size += sizeOf(file); - if (size < 0) { - break; - } - } - } catch (IOException ioe) { - // ignore exception when asking for symlink - } - } - - return size; - } - /** - * 检测文件是否可用 - */ - public static boolean checkFile(String path) { - if (!TextUtils.isEmpty(path)) { - File f = new File(path); - if (f != null && f.exists() && f.canRead() && (f.isDirectory() || (f.isFile() - && f.length() > 0))) { - return true; - } - } - return false; - } - - public static String getExtension(String name) { - String ext; - - if (name.lastIndexOf(".") == -1) { - ext = ""; - - } else { - int index = name.lastIndexOf("."); - ext = name.substring(index + 1, name.length()); - } - return ext; - } - - private static boolean isSymlink(File file) throws IOException { - File fileInCanonicalDir; - - if (file.getParent() == null) { - fileInCanonicalDir = file; - } else { - File canonicalDir = file.getParentFile().getCanonicalFile(); - fileInCanonicalDir = new File(canonicalDir, file.getName()); - } - - return !fileInCanonicalDir.getCanonicalFile().equals(fileInCanonicalDir.getAbsoluteFile()); - } - - - - public static String getFileName(String path) { - String s[] = path.split("/"); - if (s.length != 0) - return "/" + s[s.length - 1]; - return "/"; - } - /** - * Return the name of file. - * - * @param file The file. - * @return the name of file - */ - public static String getFileName(final File file) { - if (file == null) return ""; - return getFileName(file.getAbsolutePath()); - } - - private static long sizeOf(File file) { - if (file.isDirectory()) { - return getDirectorySize(file); - } else { - return file.length(); - } - } - - - public static void writeTxtToFile(List strcontent, String filePath, String fileName) { - makeFilePath(filePath, fileName); - String strFilePath = filePath + fileName; - String strContent = ""; - - for (int i = 0; i < strcontent.size(); ++i) { - strContent = strContent + "file " + strcontent.get(i) + "\r\n"; - } - - try { - File file = new File(strFilePath); - if (file.isFile() && file.exists()) { - file.delete(); - } - - file.getParentFile().mkdirs(); - file.createNewFile(); - RandomAccessFile raf = new RandomAccessFile(file, "rwd"); - raf.seek(file.length()); - raf.write(strContent.getBytes()); - raf.close(); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - public static boolean saveBitmap(Bitmap src, String dest) { - if (src == null || TextUtils.isEmpty(dest)) { - return false; - } - File destDir = new File(dest).getParentFile(); - if (destDir == null) { - return false; - } - if (!destDir.exists()) { - destDir.mkdirs(); - } - - FileOutputStream fout = null; - boolean success = false; - try { - fout = new FileOutputStream(dest); - src.compress(Bitmap.CompressFormat.PNG, 100, fout); - - success = true; - } catch (FileNotFoundException e) { - e.printStackTrace(); - success = false; - } finally { - if (fout != null) { - try { - fout.close(); - } catch (IOException e) { - e.printStackTrace(); - success = false; - } - } - return success; - } - } - - public static boolean saveBitmapPic(Context context,Bitmap src, String dest,String fileName) { - if (src == null || TextUtils.isEmpty(dest)) { - return false; - } - File destDir = new File(dest).getParentFile(); - if (destDir == null) { - return false; - } - if (!destDir.exists()) { - destDir.mkdirs(); - } - - FileOutputStream fout = null; - boolean success = false; - try { - fout = new FileOutputStream(dest); - src.compress(Bitmap.CompressFormat.PNG, 100, fout); - - - success = true; - } catch (FileNotFoundException e) { - e.printStackTrace(); - success = false; - } finally { - if (fout != null) { - try { - fout.close(); - } catch (IOException e) { - e.printStackTrace(); - success = false; - } - } - // 其次把文件插入到系统图库 - try { - MediaStore.Images.Media.insertImage(context.getContentResolver(), - dest, fileName, null); - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - return success; - } - } - - - public static String saveBitmap2Gallery(String dest,String fileName, Bitmap bitmap) { - File mPicDir = new File(dest); - - if (mPicDir == null) { - return null; - } - if (!mPicDir.exists()) { - mPicDir.mkdirs(); - } - OutputStream out = null; - String[] pathArray = null; - String[] typeArray = null; - String fialeN=null; - try { - // Android 10版本 创建文件夹不成功,这里没有过多去研究 - boolean isMk = mPicDir.mkdirs(); - Log.d("ImageUtils ", "isMk = " + isMk); - File mPicFile = new File(mPicDir, fileName); - String mPicPath = mPicFile.getAbsolutePath(); - Log.d("ImageUtils ", "mPicPath = " + mPicPath); - pathArray = new String[]{mPicFile.getAbsolutePath()}; - typeArray = new String[]{"image/png"}; - ContentValues values = new ContentValues(); - ContentResolver resolver = InitApp.initApp.getContentResolver(); - values.put(MediaStore.Images.ImageColumns.DATA, mPicPath); - values.put(MediaStore.Images.ImageColumns.DISPLAY_NAME, fileName); - values.put(MediaStore.Images.ImageColumns.MIME_TYPE, "image/png"); - values.put(MediaStore.Images.ImageColumns.DATE_TAKEN, System.currentTimeMillis() + ""); - // 插入相册 - Uri uri = resolver.insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); - if (uri != null) { - out = resolver.openOutputStream(uri); - bitmap.compress(Bitmap.CompressFormat.PNG, 100, out); - Log.d("ImageUtils ", "compress"); - } - fialeN=fileName; - } catch (Exception e) { - e.printStackTrace(); - fialeN=null; - } finally { - if (out != null) { - try { - out.flush(); - out.close(); - Log.d("ImageUtils", "finally close"); - // 扫描刷新 - MediaScannerConnection.scanFile(InitApp.initApp, pathArray, typeArray, (s, uri) -> Log.d("ImageUtils", "onScanCompleted s->" + s)); - return fialeN; - } catch (IOException e) { - e.printStackTrace(); - } - } - } - return fialeN; - } - - - public static File makeFilePath(String filePath, String fileName) { - File file = null; - makeRootDirectory(filePath); - - try { - file = new File(filePath + fileName); - if (!file.exists()) { - file.createNewFile(); - } - } catch (Exception e) { - e.printStackTrace(); - } - - return file; - } - - public static void makeRootDirectory(String filePath) { - File file = null; - - try { - file = new File(filePath); - if (!file.exists()) { - file.mkdirs(); - } - } catch (Exception e) { - Log.i("error:", e + ""); - } - } - - /** - * 递归删除文件和文件夹 - * - * @param file - */ - public static void deleteFileRecursively(File file) { - if (file.isFile()) { - file.delete(); - return; - } - if (file.isDirectory()) { - File[] childFile = file.listFiles(); - if (childFile == null || childFile.length == 0) { - file.delete(); - return; - } - for (File f : childFile) { - deleteFileRecursively(f); - } - file.delete(); - } - } - - public static String md5(String content) { - byte[] hash; - try { - hash = MessageDigest.getInstance("MD5").digest(content.getBytes("UTF-8")); - } catch (NoSuchAlgorithmException e) { - throw new RuntimeException("NoSuchAlgorithmException", e); - } catch (UnsupportedEncodingException e) { - throw new RuntimeException("UnsupportedEncodingException", e); - } - - StringBuilder hex = new StringBuilder(hash.length * 2); - for (byte b : hash) { - if ((b & 0xFF) < 0x10) { - hex.append("0"); - } - hex.append(Integer.toHexString(b & 0xFF)); - } - return hex.toString(); - } - - public static String getSaveUpdateDirectory() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - String rootDir = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "SuperRecord" + File.separator + "update" + File.separator; - File file = new File(rootDir); - if (!file.exists()) { - if (!file.mkdirs()) { - return null; - } - } - return rootDir; - } else { - return null; - } - } - - - /** - * check the usability of the external storage. - * - * @return enable -> true, disable->false - */ - public static boolean isExternalStorageEnable() { - String state = Environment.getExternalStorageState(); - return Environment.MEDIA_MOUNTED.equals(state); - } - - /** - * get the external storage file path - * - * @return the file path - */ - public static String getExternalStoragePath() { - return getExternalStorageDir().getAbsolutePath(); - } - - /** - * get the external storage file - * - * @return the file - */ - public static File getExternalStorageDir() { - return Environment.getExternalStorageDirectory(); - } - - public static String handleSpaceFilePath(String path) { - if (TextUtils.isEmpty(path) || !path.contains(" ")) { - return path; - } - - File origin = new File(path); - String fileName = origin.getName(); - if (fileName.contains(" ")) { - fileName = fileName.replaceAll(" ", ""); - } - - File targetDir = new File(TEMP_DIR); - if (!targetDir.exists()) { - targetDir.mkdirs(); - } - - File after = new File(targetDir, fileName); - copyFile(origin, after); - return after.getAbsolutePath(); - } - - - public static boolean copyFile(File src, File dest) { - if (src == null || dest == null) { - return false; - } - if (dest.exists()) { - return true; - } - - if (TextUtils.equals(src.getParent(), dest.getParent())) { - return src.renameTo(dest); - } - - try { - dest.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - - FileChannel srcChannel = null; - FileChannel dstChannel = null; - - boolean result = false; - try { - srcChannel = new FileInputStream(src).getChannel(); - dstChannel = new FileOutputStream(dest).getChannel(); - srcChannel.transferTo(0, srcChannel.size(), dstChannel); - result = true; - } catch (Exception e) { - e.printStackTrace(); - } finally { - try { - srcChannel.close(); - dstChannel.close(); - } catch (Exception e) { - e.printStackTrace(); - result = false; - } - } - return result; - } - - public static String getTempDirectory() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - File file = new File(TEMP_DIR); - if (!file.exists()) { - if (!file.mkdirs()) { - return null; - } - } - return TEMP_DIR; - } else { - return null; - } - } - - public static String getSaveRecordDirectory() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - File file = new File(VIDEO_DIR); - if (!file.exists()) { - if (!file.mkdirs()) { - return null; - } - } - return VIDEO_DIR; - } else { - return null; - } - } - - public static String getSaveRecordPicDirectory() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - File file = new File(THUMB_DIR); - if (!file.exists()) { - if (!file.mkdirs()) { - return null; - } - } - return THUMB_DIR; - } else { - return null; - } - } - - - public static String getSaveCacheDirectory() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - String rootDir = Environment.getExternalStorageDirectory().getAbsolutePath() - + File.separator + "ScreenRecord" - + File.separator + "cache" - + File.separator + "frame" + File.separator; - File file = new File(rootDir); - if (file.exists()) { - deleteDir(rootDir); - } - file.mkdirs(); - return rootDir; - } else { - return null; - } - } - - public static String getSaveCoverDirectory() { - if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - String rootDir = Environment.getExternalStorageDirectory().getAbsolutePath() - + File.separator + "ScreenRecord" - + File.separator + "cache" - + File.separator + "cover" + File.separator; - File file = new File(rootDir); - if (!file.exists()) { - file.mkdirs(); - } - return rootDir; - } else { - return null; - } - } - - public static String getSaveScreenDirectory() { -// if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) { - File file = new File(CAPTURER_DIR); - if (!file.exists()) { - if (!file.mkdirs()) { - return null; - } - } - return CAPTURER_DIR; -// } else { -// return null; -// } - } - - public static void deleteDir(final String pPath) { - File dir = new File(pPath); - deleteDirWithFile(dir); - } - - public static void deleteDirWithFile(File dir) { - if (dir == null || !dir.exists() || !dir.isDirectory()) - return; - for (File file : dir.listFiles()) { - if (file.isFile()) - file.delete(); - else if (file.isDirectory()) - deleteDirWithFile(file); - } - dir.delete(); - } - - public static boolean fileIsExist(String filePath) { - if (TextUtils.isEmpty(filePath)) return false; - - File file = new File(filePath); - return file.exists(); - } - - - public static void deleteFile(String path) { - if (TextUtils.isEmpty(path)) { - return; - } - File file = new File(path); - Log.i("XHXDEBUG","XHXDEBUG清理删除文件:"+path); - if (file.exists() && file.isFile()) { - file.delete(); - } - } - - public static boolean isExists(String path) { - if (TextUtils.isEmpty(path)) { - return false; - } - - File file = new File(path); - return file.exists(); - } - - - public static Uri getImageContentUri(Context context, String filePath) { - Cursor cursor = context.getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, - new String[]{MediaStore.Images.Media._ID}, MediaStore.Images.Media.DATA + "=? ", - new String[]{filePath}, null); - Uri uri = null; - - if (cursor != null) { - if (cursor.moveToFirst()) { - int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID)); - Uri baseUri = Uri.parse("content://media/external/images/media"); - uri = Uri.withAppendedPath(baseUri, "" + id); - } - - cursor.close(); - } - - if (uri == null) { - ContentValues values = new ContentValues(); - values.put(MediaStore.Images.Media.DATA, filePath); - uri = context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); - } - - return uri; - } - - //存储assets中的文件到本地 - public static void getAssetsPath(Context context) { - String fileName = "ic_share_image.jpeg"; - File testFolder = new File(APP_DIR + "/share"); - if (testFolder.exists() && testFolder.isDirectory()) { - Log.d("", "test folder already exists"); - } else if (!testFolder.exists()) { - testFolder.mkdir(); - } - File modelFile = new File(testFolder, fileName); - if (!modelFile.exists()) { - new Thread(new Runnable() { - @Override - public void run() { - try { - InputStream is = context.getAssets().open(fileName); - FileOutputStream fos = new FileOutputStream(modelFile); - byte[] buffer = new byte[8192]; - int read; - try { - while ((read = is.read(buffer)) != -1) { - fos.write(buffer, 0, read); - } - } finally { - fos.flush(); - fos.close(); - is.close(); - } - } catch (IOException e) { - Log.d("", "Can't copy test file onto SD card"); - } - } - }).start(); - } - } - - public static int saveImageToGalleryShare(Context mContext, Bitmap bmp, String fileName) { - //生成路径 - String root = APP_DIR; - String dirName = "tempimage"; - File appDir = new File(root, dirName); - if (!appDir.exists()) { - appDir.mkdirs(); - } - //获取文件 - File file = new File(appDir, fileName); - FileOutputStream fos = null; - try { - fos = new FileOutputStream(file); - bmp.compress(Bitmap.CompressFormat.PNG, 100, fos); - fos.flush(); - //通知系统相册刷新 -// mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, -// Uri.fromFile(new File(file.getPath())))); - //通知更新相册 - mContext.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.fromFile(file))); - - return 2; - } catch (FileNotFoundException e) { - e.printStackTrace(); - } catch (IOException e) { - e.printStackTrace(); - } finally { - try { - if (fos != null) { - fos.close(); - } - } catch (IOException e) { - e.printStackTrace(); - } - } - return -1; - } - - /** - * Drawable转换成一个Bitmap - * - * @param drawable drawable对象 - * @return - */ - public static Bitmap drawableToBitmap(Drawable drawable) { - Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), - drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); - Canvas canvas = new Canvas(bitmap); - drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); - drawable.draw(canvas); - return bitmap; - } - - - /** - * oldPath 和 newPath必须是新旧文件的绝对路径 - */ - public static File renameFile(String oldPath, String newPath) { - if (TextUtils.isEmpty(oldPath)) { - return null; - } - - if (TextUtils.isEmpty(newPath)) { - return null; - } - File oldFile = new File(oldPath); - File newFile = new File(newPath); - boolean b = oldFile.renameTo(newFile); - File file2 = new File(newPath); - return file2; - } - - /** - * 删除单个文件 - * - * @param filePath$Name 要删除的文件的文件名 - * @return 单个文件删除成功返回true,否则返回false - */ - public static boolean deleteSingleFile(String filePath$Name) { - File file = new File(filePath$Name); - // 如果文件路径所对应的文件存在,并且是一个文件,则直接删除 - if (file.exists() && file.isFile()) { - if (file.delete()) { - return true; - } else { - return false; - } - } else { - return false; - } - } - - /** - * 复制asset到片尾 - */ - public static boolean copyAssetsToDst(Context context, String srcPath) { - File targetDir0 = new File(APP_DIR); - if (!targetDir0.exists()) { - targetDir0.mkdirs(); - } - - File targetDir = new File(VIDEO_DIR_HIDE); - if (!targetDir.exists()) { - targetDir.mkdirs(); - } - - try { - File outFile = new File(VIDEO_DIR_HIDE, srcPath); - InputStream is = context.getAssets().open(srcPath); - FileOutputStream fos = new FileOutputStream(outFile); - byte[] buffer = new byte[1024]; - int byteCount; - while ((byteCount = is.read(buffer)) != -1) { - fos.write(buffer, 0, byteCount); - } - fos.flush(); - is.close(); - fos.close(); - return true; - } catch (Exception e) { - e.printStackTrace(); - return false; - } - } - - - /**读取assets文件*/ - public static String getFromAssets(Context context,String fileName) { - try { - InputStreamReader inputReader = new InputStreamReader(context.getResources().getAssets().open(fileName)); - BufferedReader bufReader = new BufferedReader(inputReader); - String line = ""; - String Result = ""; - while ((line = bufReader.readLine()) != null) - Result += line; - return Result; - } catch (Exception e) { - e.printStackTrace(); - } - return null; - - } - - - /* - * Java文件操作 获取文件扩展名 - * - */ - public static String getExtensionName(String filename) { - if ((filename != null) && (filename.length() > 0)) { - int dot = filename.lastIndexOf('.'); - if ((dot >-1) && (dot < (filename.length() - 1))) { - return filename.substring(dot + 1); - } - } - return filename; - } -} diff --git a/app/src/main/java/com/hitomi/tilibrary/transfer/ProgressBarIndicatorNew.java b/app/src/main/java/com/hitomi/tilibrary/transfer/ProgressBarIndicatorNew.java deleted file mode 100644 index 3576752..0000000 --- a/app/src/main/java/com/hitomi/tilibrary/transfer/ProgressBarIndicatorNew.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.hitomi.tilibrary.transfer; - -import android.content.Context; -import android.util.SparseArray; -import android.view.Gravity; -import android.view.View; -import android.view.ViewGroup; -import android.widget.FrameLayout; -import android.widget.ProgressBar; - -import com.hitomi.tilibrary.style.IProgressIndicator; - -/** - * 图片加载时使用 Android 默认的 ProgressBar - *

- * email: 196425254@qq.com - */ -public class ProgressBarIndicatorNew implements IProgressIndicator { - -// private SparseArray progressBarArray = new SparseArray<>(); - -// private int dip2Px(Context context, float dpValue) { -//// final float scale = context.getResources().getDisplayMetrics().density; -//// return (int) (dpValue * scale + 0.5f); -// } - - @Override - public void attach(int position, FrameLayout parent) { -// Context context = parent.getContext(); -// -// int progressSize = dip2Px(context, 50); -// FrameLayout.LayoutParams progressLp = new FrameLayout.LayoutParams( -// progressSize, progressSize); -// progressLp.gravity = Gravity.CENTER; -// -// ProgressBar progressBar = new ProgressBar(context); -// progressBar.setLayoutParams(progressLp); -// -// parent.addView(progressBar, parent.getChildCount()); -// progressBarArray.put(position, progressBar); - } - - @Override - public void hideView(int position) { -// ProgressBar progressBar = progressBarArray.get(position); -// if (progressBar != null) -// progressBar.setVisibility(View.GONE); - } - - @Override - public void onStart(int position) { - } - - @Override - public void onProgress(int position, int progress) { - } - - @Override - public void onFinish(int position) { -// ProgressBar progressBar = progressBarArray.get(position); -// if (progressBar == null) return; -// -// ViewGroup vg = (ViewGroup) progressBar.getParent(); -// ; -// if (vg != null) { -// vg.removeView(progressBar); -// } - } -} diff --git a/app/src/main/java/com/hitomi/tilibrary/transfer/TransfereeNew.java b/app/src/main/java/com/hitomi/tilibrary/transfer/TransfereeNew.java deleted file mode 100644 index 432211e..0000000 --- a/app/src/main/java/com/hitomi/tilibrary/transfer/TransfereeNew.java +++ /dev/null @@ -1,276 +0,0 @@ -package com.hitomi.tilibrary.transfer; - -import android.app.Activity; -import android.app.Application; -import android.app.Dialog; -import android.content.Context; -import android.content.DialogInterface; -import android.view.KeyEvent; -import android.widget.ImageView; - -import androidx.appcompat.app.AlertDialog; - -import com.gyf.immersionbar.ImmersionBar; -import com.hitomi.tilibrary.style.index.CircleIndexIndicator; -import com.hitomi.tilibrary.style.progress.ProgressBarIndicator; -import com.hitomi.tilibrary.utils.AppManager; -import com.hitomi.tilibrary.utils.FileUtils; -import com.hitomi.tilibrary.view.video.ExoVideoView; -import com.hitomi.tilibrary.view.video.source.ExoSourceManager; - -import java.io.File; - -/** - * Main workflow:
- * 1、点击缩略图展示缩略图到 transferee 过渡动画
- * 2、显示下载高清图片进度
- * 3、加载完成显示高清图片
- * 4、高清图支持手势缩放
- * 5、关闭 transferee 展示 transferee 到原缩略图的过渡动画
- * Created by Vans Z on 2017/1/19. - *

- * email: 196425254@qq.com - */ -public class TransfereeNew implements DialogInterface.OnShowListener, - DialogInterface.OnKeyListener, - TransferLayout.OnLayoutResetListener, - AppManager.OnAppStateChangeListener { - - private Context context; - private Dialog transDialog; - - private TransferLayout transLayout; - private TransferConfig transConfig; - private OnTransfereeStateChangeListener transListener; - - // 因为Dialog的关闭有动画延迟,固不能使用 dialog.isShowing, 去判断 transferee 的显示逻辑 - private boolean shown; - - /** - * 构造方法私有化,通过{@link #getDefault(Context)} 创建 transferee - * - * @param context 上下文环境 - */ - private TransfereeNew(Context context) { - this.context = context; - createLayout(); - createDialog(); - AppManager.getInstance().init((Application) context.getApplicationContext()); - } - - /** - * @param context - * @return {@link TransfereeNew} - */ - public static TransfereeNew getDefault(Context context) { - return new TransfereeNew(context); - } - - private void createLayout() { - transLayout = new TransferLayout(context); - transLayout.setOnLayoutResetListener(this); - } - - private void createDialog() { - transDialog = new AlertDialog.Builder(context, - android.R.style.Theme_Translucent_NoTitleBar_Fullscreen) - .setView(transLayout) - .create(); - transDialog.setOnShowListener(this); - transDialog.setOnKeyListener(this); - } - - /** - * 检查参数,如果必须参数缺少,就使用缺省参数或者抛出异常 - */ - private void checkConfig() { - if (transConfig == null) - throw new IllegalArgumentException("The parameter TransferConfig can't be null"); - if (transConfig.isSourceEmpty()) - throw new IllegalArgumentException("The parameter sourceUrlList or sourceUriList can't be empty"); - if (transConfig.getImageLoader() == null) - throw new IllegalArgumentException("Need to specify an ImageLoader"); - - transConfig.setNowThumbnailIndex(Math.max(transConfig.getNowThumbnailIndex(), 0)); - transConfig.setOffscreenPageLimit(transConfig.getOffscreenPageLimit() <= 0 - ? 1 : transConfig.getOffscreenPageLimit()); - transConfig.setDuration(transConfig.getDuration() <= 0 - ? 300 : transConfig.getDuration()); - transConfig.setProgressIndicator(transConfig.getProgressIndicator() == null - ? new ProgressBarIndicator() : transConfig.getProgressIndicator()); - transConfig.setIndexIndicator(transConfig.getIndexIndicator() == null - ? new CircleIndexIndicator() : transConfig.getIndexIndicator()); - } - - /** - * 配置 transferee 参数对象 - * - * @param config 参数对象 - * @return transferee - */ - public TransfereeNew apply(TransferConfig config) { - if (!shown) { - transConfig = config; - OriginalViewHelper.getInstance().fillOriginImages(config); - checkConfig(); - transLayout.apply(config); - } - return this; - } - - /** - * transferee 是否显示 - * - * @return true :显示, false :关闭 - */ - public boolean isShown() { - return shown; - } - - /** - * 显示 transferee - */ - public void show() { - if (shown) return; - transDialog.show(); - adjustTopAndBottom(); - if (transListener != null) { - transListener.onShow(); - } - shown = true; - } - - /** - * 显示 transferee, 并设置 OnTransfereeChangeListener - * - * @param listener {@link OnTransfereeStateChangeListener} - */ - public void show(OnTransfereeStateChangeListener listener) { - if (shown || listener == null) return; - transDialog.show(); - adjustTopAndBottom(); - transListener = listener; - transListener.onShow(); - shown = true; - } - - /** - * 关闭 transferee - */ - public void dismiss() { - if (shown && transLayout.dismiss(transConfig.getNowThumbnailIndex())) { - shown = false; - } - } - - /** - * 获取图片文件 - */ - public File getImageFile(String imageUrl) { - return transConfig.getImageLoader().getCache(imageUrl); - } - - /** - * 清除 transferee 缓存,包括图片和视频文件缓存,注意清除视频缓存必须保证 transferee 是关闭状态 - */ - public void clear() { - if (transConfig != null && transConfig.getImageLoader() != null) { - transConfig.getImageLoader().clearCache(); - } - File cacheFile = new File(context.getCacheDir(), ExoVideoView.CACHE_DIR); - if (cacheFile.exists() && !shown) { - FileUtils.deleteDir(new File(cacheFile, VideoThumbState.FRAME_DIR)); - ExoSourceManager.clearCache(context, cacheFile, null); - } - } - - /** - * dialog 打开时的监听器 - */ - @Override - public void onShow(DialogInterface dialog) { - AppManager.getInstance().register(this); - transLayout.show(); - } - - /** - * 调整顶部和底部内边距 - */ - private void adjustTopAndBottom() { - if (context instanceof Activity) { - // 隐藏状态栏和导航栏,全屏化 - Activity activity = (Activity) context; - ImmersionBar.with(activity, transDialog) - .fullScreen(true) - .init(); -// int top = ImmersionBar.getNotchHeight(activity); -// int bottom = ImmersionBar.getNavigationBarHeight(activity); - transLayout.setPadding(0, 0, 0, 0); - } - } - - @Override - public void onReset() { - AppManager.getInstance().unregister(this); - transDialog.dismiss(); - if (transListener != null) - transListener.onDismiss(); - shown = false; - } - - @Override - public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) { - if (keyCode == KeyEvent.KEYCODE_BACK && - event.getAction() == KeyEvent.ACTION_UP && - !event.isCanceled()) { - dismiss(); - return true; - } - return false; - } - - @Override - public void onForeground() { - transLayout.pauseOrPlayVideo(false); - } - - @Override - public void onBackground() { - transLayout.pauseOrPlayVideo(true); - } - - /** - * 设置 Transferee 显示和关闭的监听器 - * - * @param listener {@link OnTransfereeStateChangeListener} - */ - public void setOnTransfereeStateChangeListener(OnTransfereeStateChangeListener listener) { - transListener = listener; - } - - /** - * 资源销毁,防止内存泄漏 - */ - public void destroy() { - if (transConfig != null) { - transConfig.destroy(); - transConfig = null; - } - } - - /** - * Transferee 显示的时候调用 {@link OnTransfereeStateChangeListener#onShow()} - *

- * Transferee 关闭的时候调用 {@link OnTransfereeStateChangeListener#onDismiss()} - */ - public interface OnTransfereeStateChangeListener { - void onShow(); - - void onDismiss(); - } - - public interface OnTransfereeLongClickListener { - void onLongClick(ImageView imageView, String imageUri, int pos); - } - -} diff --git a/app/src/main/res/layout/activity_start_up.xml b/app/src/main/res/layout/activity_start_up.xml index 757d72b..b5b7b86 100644 --- a/app/src/main/res/layout/activity_start_up.xml +++ b/app/src/main/res/layout/activity_start_up.xml @@ -18,7 +18,9 @@ android:orientation="vertical" android:fitsSystemWindows="true" tools:context=".ui.activity.StartUpActivity"> - + #FFBB86FC #FF6200EE #FF3700B3 + #FF03DAC5 #FF018786 #000019 @@ -72,10 +73,13 @@ #DDDDDD #E12D48 #750000 - #E12D48 - #E12D48 - #E12D48 - #E12D48 + #47A0C2 + #47A0C2 + #47A0C2 + #47A0C2 #45000000 + #47A0C2 + #8847A0C2 + \ No newline at end of file diff --git a/build.gradle b/build.gradle index c573848..ec3f07d 100644 --- a/build.gradle +++ b/build.gradle @@ -26,7 +26,7 @@ buildscript { } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:7.2.0' classpath 'org.greenrobot:greendao-gradle-plugin:3.3.0' // 添加GreenDao插件 classpath 'com.novoda:bintray-release:0.6.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" diff --git a/gradle.properties b/gradle.properties index 2c57de0..215dfe3 100644 --- a/gradle.properties +++ b/gradle.properties @@ -23,6 +23,4 @@ android.useAndroidX=true # Automatically convert third-party libraries to use AndroidX android.enableJetifier=true android.injected.testOnly = false -android.enableR8=false - diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 12e45a2..0501508 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip diff --git a/settings.gradle b/settings.gradle index 3f658d9..1bde1c7 100644 --- a/settings.gradle +++ b/settings.gradle @@ -3,3 +3,4 @@ include ':app' include ':cili' include ':youyou' include ':matisse' +include ':trustlend' diff --git a/trustlend/.gitignore b/trustlend/.gitignore new file mode 100644 index 0000000..42afabf --- /dev/null +++ b/trustlend/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/trustlend/build.gradle b/trustlend/build.gradle new file mode 100644 index 0000000..03052a4 --- /dev/null +++ b/trustlend/build.gradle @@ -0,0 +1,111 @@ +plugins { + id 'com.android.application' +} + +android { + namespace 'com.dskj.trustlend' + compileSdk 31 + + defaultConfig { + applicationId "com.dskj.trustlend" + minSdk 24 + targetSdk 30 + versionCode 105 + versionName "1.0.5" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + debug { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' + } + } + + buildFeatures{ + dataBinding = true + // for view binding : + // viewBinding = true + } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } + + + signingConfigs { + debug { + storeFile file('videomark.jks') + storePassword "123456" + keyAlias 'videomark' + keyPassword "123456" + v1SigningEnabled true + v2SigningEnabled true + } + release { + storeFile file('videomark.jks') + storePassword "123456" + keyAlias 'videomark' + keyPassword "123456" + v1SigningEnabled true + v2SigningEnabled true + + } + } + lintOptions { + checkReleaseBuilds false + abortOnError false + } +} + +dependencies { + + implementation 'com.github.tbruyelle:rxpermissions:0.10.2' + + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'com.google.android.material:material:1.3.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.4' + testImplementation "junit:junit:4.13.1" + androidTestImplementation 'androidx.test.ext:junit:1.1.2' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0' + //viewmode需要引入的依赖 livedate 之类的就依赖他了 + implementation 'androidx.lifecycle:lifecycle-extensions:2.0.0' + + implementation project(path: ':basicLib') + implementation "androidx.fragment:fragment-ktx:1.4.0" + implementation "androidx.core:core-ktx:1.3.2" + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'io.reactivex:rxjava:1.3.0' + implementation 'io.reactivex:rxandroid:1.2.1' + // okhttp 3 + implementation 'com.squareup.okhttp3:okhttp:3.10.0' + implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0' + + implementation 'com.github.Hitomis:transferee:1.6.1' + // 添加 Glide 图片加载器 + implementation 'com.github.Hitomis.transferee:GlideImageLoader:1.6.1' + implementation 'com.gyf.immersionbar:immersionbar:2.3.3' + + implementation project(path: ':matisse') + + + //以下3个 下拉刷新和加载更多依赖 + implementation 'com.scwang.smart:refresh-layout-kernel:2.0.1' + //核心必须依赖 + implementation 'com.scwang.smart:refresh-header-classics:2.0.1' + //经典刷新头 + implementation 'com.scwang.smart:refresh-footer-classics:2.0.1' + implementation 'com.scwang.smart:refresh-footer-ball:2.0.1' + implementation 'com.github.cazaea:sweet-alert-dialog:1.0.0' + implementation 'com.tencent.bugly:crashreport:4.0.4' + implementation("com.youth.banner:banner:1.4.9") + implementation 'de.hdodenhof:circleimageview:3.0.1' + + +} \ No newline at end of file diff --git a/trustlend/proguard-rules.pro b/trustlend/proguard-rules.pro new file mode 100644 index 0000000..481bb43 --- /dev/null +++ b/trustlend/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/trustlend/release/output-metadata.json b/trustlend/release/output-metadata.json new file mode 100644 index 0000000..c3f5de5 --- /dev/null +++ b/trustlend/release/output-metadata.json @@ -0,0 +1,20 @@ +{ + "version": 3, + "artifactType": { + "type": "APK", + "kind": "Directory" + }, + "applicationId": "com.dskj.trustlend", + "variantName": "release", + "elements": [ + { + "type": "SINGLE", + "filters": [], + "attributes": [], + "versionCode": 105, + "versionName": "1.0.5", + "outputFile": "trustlend-release.apk" + } + ], + "elementType": "File" +} \ No newline at end of file diff --git a/trustlend/src/androidTest/java/com/dskj/trustlend/ExampleInstrumentedTest.java b/trustlend/src/androidTest/java/com/dskj/trustlend/ExampleInstrumentedTest.java new file mode 100644 index 0000000..e7f4100 --- /dev/null +++ b/trustlend/src/androidTest/java/com/dskj/trustlend/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.dskj.trustlend; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.dskj.trustlend", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/trustlend/src/main/AndroidManifest.xml b/trustlend/src/main/AndroidManifest.xml new file mode 100644 index 0000000..9743934 --- /dev/null +++ b/trustlend/src/main/AndroidManifest.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/AboutUsActivity.java b/trustlend/src/main/java/com/dskj/trustlend/AboutUsActivity.java new file mode 100644 index 0000000..90c3386 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/AboutUsActivity.java @@ -0,0 +1,138 @@ +package com.dskj.trustlend; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ClipboardManager; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.net.Uri; +import android.os.Build; +import android.text.TextUtils; + +import androidx.annotation.RequiresApi; +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseActivity; +import com.bumptech.glide.Glide; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.ContactBean; +import com.dskj.trustlend.databinding.ActivityAboutUsBinding; +import com.dskj.trustlend.databinding.ActivityEditUserBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; +import com.dskj.trustlend.utils.ToastUtils; +import com.tbruyelle.rxpermissions2.RxPermissions; +import com.zhihu.matisse.Matisse; +import com.zhihu.matisse.MimeType; +import com.zhihu.matisse.engine.impl.GlideEngine; +import com.zhihu.matisse.internal.entity.CaptureStrategy; + +import java.io.File; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class AboutUsActivity extends BaseActivity { + ContactBean contactBean; + @Override + protected int initLayout() { + return R.layout.activity_about_us; + } + + @Override + protected void initView() { + //setStatusBarColorW(this,R.color.white,false); + dataBinding.backIv.setOnClickListener(v -> onBackPressed()); + + getAbout(); + + dataBinding.emailLy.setOnClickListener(v -> toSendEmail()); + dataBinding.telLy.setOnClickListener(v -> toPhone()); + + } + + private void toPhone() { + if(contactBean!=null&&!TextUtils.isEmpty(contactBean.getTel())) { + copy(contactBean.getTel(),AboutUsActivity.this,"Phone number copied successfully"); + + Intent intent = new Intent(Intent.ACTION_DIAL); + intent.setData(Uri.parse("tel:"+contactBean.getTel())); // 替换1234567890为你想拨打的电话号码 + startActivity(intent); + } + } + + + /** + * 实现文本复制功能 + * + * @param content + */ + public void copy(String content, Context context,String toastTips) { + // 得到剪贴板管理器 + ClipboardManager cmb = (ClipboardManager) context.getSystemService(Context.CLIPBOARD_SERVICE); + cmb.setText(content.trim()); + ToastUtils.showShort(dataBinding.backIv,toastTips); + } + + private void toSendEmail(){ + if(contactBean!=null&&!TextUtils.isEmpty(contactBean.getEmail())) { + copy(contactBean.getEmail(),AboutUsActivity.this,"Email address copied successfully"); + + Intent emailIntent = new Intent(Intent.ACTION_SENDTO); + emailIntent.setData(Uri.parse("mailto:" +contactBean.getEmail())); + emailIntent.putExtra(Intent.EXTRA_SUBJECT, getString(R.string.app_name)); + emailIntent.putExtra(Intent.EXTRA_TEXT, getString(R.string.app_name)); + try { + startActivity(Intent.createChooser(emailIntent, "Select Email APP")); + } catch (android.content.ActivityNotFoundException ex) { + // 如果设备上没有安装邮箱应用,则显示一个Toast消息 + ToastUtils.showShort(dataBinding.backIv, "No email application installed"); + } + } + + } + + private void getAbout() { + Api.getInstance().contact() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + contactBean = feedbackResp.data; + // {"code":1,"msg":"操作成功","data":{"tel":"123456","whatsapp":"456789","email":"123@gmail.com","time":"星期一至星期日-10:00-18:00"}} + dataBinding.telsTv.setText(feedbackResp.data.getTel()+""); + dataBinding.emailTv.setText(feedbackResp.data.getEmail()+""); + dataBinding.aboutUsTv.setText(feedbackResp.data.getTime()+""); + + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + @Override + protected void initData() { + + } + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/EditUserActivity.java b/trustlend/src/main/java/com/dskj/trustlend/EditUserActivity.java new file mode 100644 index 0000000..9539c5f --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/EditUserActivity.java @@ -0,0 +1,317 @@ +package com.dskj.trustlend; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ComponentName; +import android.content.ContentResolver; +import android.content.Context; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.net.Uri; +import android.os.Build; +import android.os.Bundle; +import android.provider.MediaStore; +import android.text.TextUtils; +import android.util.Log; +import android.view.View; + +import androidx.annotation.RequiresApi; +import androidx.core.content.FileProvider; +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseActivity; +import com.bumptech.glide.Glide; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.databinding.ActivityEditUserBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; +import com.dskj.trustlend.utils.LogUtils; +import com.dskj.trustlend.utils.ToastUtils; +import com.tbruyelle.rxpermissions2.RxPermissions; +import com.zhihu.matisse.Matisse; +import com.zhihu.matisse.MimeType; +import com.zhihu.matisse.engine.impl.GlideEngine; +import com.zhihu.matisse.internal.entity.CaptureStrategy; + +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileOutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +public class EditUserActivity extends BaseActivity { + int isRenXiang = 0; + private RxPermissions rxPermissions; + public static final int REQUEST_CODE_CHOOSE = 0x124; + public static final int PHOTO_RESOULT = 0x125; + + private Uri imageUri; + private String imageUriString = ""; + private String imageUriStringNet = ""; + UserBean userBean = null; + + + @Override + protected int initLayout() { + return R.layout.activity_edit_user; + } + + @SuppressLint("WrongConstant") + @Override + protected void initView() { + rxPermissions = new RxPermissions(this); +// setStatusBarColorW(this, R.color.white, false); + dataBinding.backIv.setOnClickListener(v -> onBackPressed()); + + dataBinding.userIvRy.setOnClickListener(view -> { + isRenXiang = 0; + toOpenFile(); + }); + userBean = InitApp.getUserBean(); + changeUserInfo(userBean); + + + dataBinding.loginBt.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + if(TextUtils.isEmpty(imageUriString)){ + toSumbit(); + }else{ +// if(cropFile!=null){ +// uploadSigin(cropFile); +// }else { + uploadSigin(new File(imageUriString)); +// } + } + } + }); + + getUserInfo(); + + } + + @Override + public void onBackPressed() { + setResult(RESULT_OK); + super.onBackPressed(); + } + + private void changeUserInfo(UserBean userBean) { + dataBinding.titleTv2.setText(userBean.getFull_name() + ""); + dataBinding.phoneTv.setText("" + userBean.getPhone()); + + if(!TextUtils.isEmpty(userBean.getEmail())){ + dataBinding.emailEt.setText(userBean.getEmail()); + } + Glide.with(EditUserActivity.this).load(userBean.getAvatar()+"").error(R.mipmap.default_head_img).error(R.mipmap.default_head_img).into(dataBinding.userHeadIv); + + } + + private void getUserInfo() { + Api.getInstance().userProfile() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if(feedbackResp!=null&&feedbackResp.data!=null) { +// userBean = feedbackResp.data.get(0); +// InitApp.saveString("user_bean", GsonUtils.beanToJSONString(feedbackResp.data.get(0))); + + userBean.setAvatar(feedbackResp.data.getAvatar()); + userBean.setEmail(feedbackResp.data.getEmail()); + InitApp.saveString("user_bean", GsonUtils.beanToJSONString(userBean)); +// InitApp.setUserToken(feedbackResp.data.get(0).getAuth()); + changeUserInfo(feedbackResp.data); + } + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private void toOpenFile() { + rxPermissions.requestEach(Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe(permission -> { + if (permission.granted) { + rxPermissions.requestEach(Manifest.permission.CAMERA) + .subscribe(permission1 -> { + if (permission1.granted) { + toFile(true); + } else if (permission1.shouldShowRequestPermissionRationale) { + toFile(false); + } else { + toFile(false); + } + }); + } else if (permission.shouldShowRequestPermissionRationale) { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_txt)); + } else { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_all_txt)); + } + }); + } + + + /** + * 上传单图片 + * + * @param + */ + public void uploadSigin(File file) { + if (userBean == null) { + ToastUtils.showShort(dataBinding.loginBt, "User information acquisition failed"); + return; + } + MultipartBody.Builder builder = new MultipartBody.Builder(); + RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file); + builder.addFormDataPart("picture", "sign_" + System.currentTimeMillis() + ".png", requestBody); + + builder.setType(MultipartBody.FORM); + MultipartBody multipartBody = builder.build(); + + Api.getInstance().picture(multipartBody) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + + @Override + public void onSuccess(Result> feedbackResp) { + if (feedbackResp.data != null && feedbackResp.data.size() > 0) { + imageUriStringNet = feedbackResp.data.get(0); + toSumbit(); + + } + } + + @Override + public void onError(int code, String msg) { + ToastUtils.showShort(dataBinding.loginBt, msg); + dismissDialog(); + } + }); + } + + private void toSumbit() { + Map map = new HashMap<>(); + if(!TextUtils.isEmpty(imageUriStringNet)){ + map.put("avatar",imageUriStringNet); + } + map.put("email",dataBinding.emailEt.getText().toString()); + + if(!TextUtils.isEmpty(dataBinding.passwordEt.getText().toString())&&!TextUtils.isEmpty(dataBinding.passwordEt1.getText().toString())){ + if(dataBinding.passwordEt.getText().toString().equals(dataBinding.passwordEt1.getText().toString())){ + map.put("password",dataBinding.passwordEt.getText().toString()); + }else{ + ToastUtils.showShort(dataBinding.emailEt,"Password inconsistency"); + return; + } + } + + Api.getInstance().userProfilePost(map) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + + if(feedbackResp!=null&&feedbackResp.data!=null) { + ToastUtils.showShort(dataBinding.loginBt,"Update UserInfo Success"); +// userBean = feedbackResp.data.get(0); + userBean.setAvatar(feedbackResp.data.getAvatar()); + userBean.setEmail(feedbackResp.data.getEmail()); + InitApp.saveString("user_bean", GsonUtils.beanToJSONString(userBean)); +// InitApp.setUserToken(feedbackResp.data.get(0).getAuth()); + changeUserInfo(feedbackResp.data); + } + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + private void toFile(boolean showCanme) { + + Matisse.from(EditUserActivity.this) + .choose(MimeType.ofImage()) + .countable(true) + .maxSelectable(1) + .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + .thumbnailScale(0.85f) + .imageEngine(new GlideEngine()) + .showPreview(false) + .showSingleMediaType(true) + .capture(showCanme) + .captureStrategy(new CaptureStrategy(false, getApplication().getPackageName() + ".fileprovider")) + .theme(R.style.Matisse_Zhihu) + .imageEngine(new GlideEngine()) + .forResult(REQUEST_CODE_CHOOSE); + } + + @RequiresApi(api = Build.VERSION_CODES.Q) + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + if (requestCode == REQUEST_CODE_CHOOSE) { + //图片路径 同样视频地址也是这个 + List pathList = Matisse.obtainPathResult(data); + //Uri 格式的 + List pathList1 = Matisse.obtainResult(data); + + for (int i = 0; i < pathList.size(); i++) { + if (isRenXiang == 0) { + Glide.with(EditUserActivity.this).load(pathList1.get(i)).into(dataBinding.userHeadIv); + imageUri = pathList1.get(i); + imageUriString = pathList.get(i); +// crop(imageUri); + } + break; + } + } + + } + } + + + @Override + protected void initData() { + + } + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/InitApp.java b/trustlend/src/main/java/com/dskj/trustlend/InitApp.java new file mode 100644 index 0000000..0b28c4f --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/InitApp.java @@ -0,0 +1,174 @@ +package com.dskj.trustlend; + +import android.app.Activity; +import android.app.Application; +import android.content.Context; +import android.content.SharedPreferences; +import android.text.TextUtils; + +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.config.Config; +import com.dskj.trustlend.utils.DeviceUtil; +import com.dskj.trustlend.utils.GsonUtils; +import com.dskj.trustlend.utils.LogUtils; +import com.tencent.bugly.crashreport.CrashReport; + + +/** + * Application 主入口 + * + * @author xuhuixiang + */ + +public class InitApp extends Application { + public static Context AppContext; + public static InitApp initApp; + + public static Context getAppContext() { + return AppContext; + } + + + @Override + protected void attachBaseContext(Context base) { + super.attachBaseContext(base); + + } + + + + @Override + public void onCreate() { + super.onCreate(); + AppContext = getApplicationContext(); + initApp = this; + DeviceUtil.init(this); + initARouter(); + CrashReport.initCrashReport(getApplicationContext(), "67a2a1ead7", false); + + + } + + + private void initARouter() { + + } + + //----------------------------SharedPreferences的全局存储实现 人懒 懒得抽文件--------------------------------------- + + public static void saveInt(String key, int value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putInt(key, value); + editor.apply(); + } + + public static void saveFloat(String key, float value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putFloat(key, value); + editor.apply(); + } + + public static void saveLong(String key, long value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putLong(key, value); + editor.apply(); + } + + public static void saveString(String key, String value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putString(key, value); + editor.apply(); + } + + public static void deleteKey(String key) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + if (!sp.contains(key)) return; + SharedPreferences.Editor editor = sp.edit(); + editor.remove(key); + editor.apply(); + } + + public static void saveBoolean(String key, boolean value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putBoolean(key, value); + editor.apply(); + } + + public static int getInt(String key, int defValue) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + return sp.getInt(key, defValue); + } + + public static float getFloat(String key, float defValue) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + return sp.getFloat(key, defValue); + } + + public static long getLong(String key, long defValue) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + return sp.getLong(key, defValue); + } + + public static boolean getBoolean(String key, boolean defValue) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + return sp.getBoolean(key, defValue); + } + + public static String getString(String key, String defValue) { + Context context = AppContext; + if (context == null) { + return defValue; + } + SharedPreferences sp = context.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + return sp.getString(key, defValue); + } + + public static UserBean getUserBean() { + Context context = AppContext; + if (context == null) { + return null; + } + String name = getString("user_bean",""); + if(TextUtils.isEmpty(name)){ + return null; + } + return GsonUtils.getObjFromJSON(name,UserBean.class); + } + + + public static String getToken() { + Context context = AppContext; + if (context == null) { + return ""; + } + return getString(Config.API_TOKEN_TAG,""); + } + + public static void setToken(String value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putString(Config.API_TOKEN_TAG, value); + editor.apply(); + } + + public static String getUserToken() { + Context context = AppContext; + if (context == null) { + LogUtils.i("进这里干嘛?"); + return ""; + } + return getString(Config.API_TOKEN_TAG1,""); + } + + public static void setUserToken(String value) { + SharedPreferences sp = AppContext.getSharedPreferences("InitApp", Activity.MODE_PRIVATE); + SharedPreferences.Editor editor = sp.edit(); + editor.putString(Config.API_TOKEN_TAG1, value); + editor.apply(); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/LoginActivity.java b/trustlend/src/main/java/com/dskj/trustlend/LoginActivity.java new file mode 100644 index 0000000..beed8eb --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/LoginActivity.java @@ -0,0 +1,124 @@ +package com.dskj.trustlend; + +import android.content.Intent; +import android.text.TextUtils; +import android.view.View; + +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseActivity; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.databinding.ActivityLoginBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; +import com.dskj.trustlend.utils.ToastUtils; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class LoginActivity extends BaseActivity { + + @Override + protected int initLayout() { + return R.layout.activity_login; + } + + @Override + protected void initView() { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + } + + @Override + protected void initData() { + dataBinding.regBt.setOnClickListener(v -> { + startActivity(new Intent(LoginActivity.this,RegActivity.class)); + overridePendingTransition(0,0); + finish(); + }); + dataBinding.loginBt.setOnClickListener(v -> { + + if(TextUtils.isEmpty(dataBinding.idNumberTv.getText().toString())){ + ToastUtils.showShort(dataBinding.loginBt,"ID Number cannot be empty"); + return; + } + + if(TextUtils.isEmpty(dataBinding.passTv.getText().toString())){ + ToastUtils.showShort(dataBinding.loginBt,"Password cannot be empty"); + return; + } + + Api.getInstance().getLoginById(dataBinding.idNumberTv.getText().toString(), dataBinding.passTv.getText().toString()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data != null) { + InitApp.setUserToken(feedbackResp.data.getAuth()); + if(dataBinding.rememberMeCb.isChecked()){ + InitApp.saveString("idNumber",dataBinding.idNumberTv.getText().toString().trim()); + InitApp.saveString("pass_text",dataBinding.passTv.getText().toString().trim()); + } + InitApp.saveBoolean("isRemember",dataBinding.rememberMeCb.isChecked()); + + InitApp.saveString("user_bean", GsonUtils.beanToJSONString(feedbackResp.data)); + startActivity(new Intent(LoginActivity.this, MainActivity.class)); + finish(); + } + } + + @Override + public void onError(int code, String msg) { + ToastUtils.showShort(dataBinding.loginBt, msg); + } + }); + +// Api.getInstance().getLogin("+85210086", dataBinding.passTv.getText().toString()) +// .subscribeOn(Schedulers.io()) +// .observeOn(AndroidSchedulers.mainThread()) +// .subscribe(new BaseObserver>() { +// +// @Override +// public void onSuccess(Result feedbackResp) { +// if (feedbackResp.data != null) { +// InitApp.setUserToken(feedbackResp.data.getAuth()); +// if(dataBinding.rememberMeCb.isChecked()){ +// InitApp.saveString("idNumber",dataBinding.idNumberTv.getText().toString().trim()); +// InitApp.saveString("pass_text",dataBinding.passTv.getText().toString().trim()); +// } +// InitApp.saveString("user_bean", GsonUtils.beanToJSONString(feedbackResp.data)); +// startActivity(new Intent(LoginActivity.this, MainActivity.class)); +// finish(); +// } +// } +// +// @Override +// public void onError(int code, String msg) { +// ToastUtils.showShort(dataBinding.loginBt, msg); +// } +// }); + }); + + dataBinding.rememberMeCb.setChecked(InitApp.getBoolean("isRemember",false)); + if(dataBinding.rememberMeCb.isChecked()){ + dataBinding.idNumberTv.setText(InitApp.getString("idNumber","")); + dataBinding.passTv.setText(InitApp.getString("pass_text","")); + + } + } + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/MainActivity.java b/trustlend/src/main/java/com/dskj/trustlend/MainActivity.java new file mode 100644 index 0000000..b23f9cf --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/MainActivity.java @@ -0,0 +1,185 @@ +package com.dskj.trustlend; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.ViewModelProviders; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Bundle; +import android.os.Handler; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.MenuItem; +import android.view.View; +import android.view.ViewGroup; + +import com.azhon.basic.base.BaseActivity; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.databinding.ActivityHomeBinding; +import com.dskj.trustlend.databinding.ActivityMainBinding; +import com.dskj.trustlend.dialog.FaqsDialog; +import com.dskj.trustlend.fragment.FaqsFragment; +import com.dskj.trustlend.fragment.HomeFragment; +import com.dskj.trustlend.fragment.IndexFragment; +import com.dskj.trustlend.fragment.MeFragment; +import com.dskj.trustlend.fragment.StatusFragment; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; +import com.google.android.material.bottomnavigation.BottomNavigationMenuView; +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.google.android.material.bottomnavigation.LabelVisibilityMode; + +import java.util.ArrayList; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class MainActivity extends BaseActivity { + private List mList; + + private HomeFragment homeFragment; +// private FaqsFragment faqsFragment; +// private IndexFragment indexFragment; + private StatusFragment statusFragment; + private MeFragment meFragment; + @Override + protected int initLayout() { + return R.layout.activity_home; + } + + @SuppressLint("WrongConstant") + @Override + protected void initView() { +// getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + +// setStatusBarColorW(this,R.color.color_f7e9ff,false); + //显示Navigation完整的item的图标和文字 + dataBinding.navView.setLabelVisibilityMode(LabelVisibilityMode.LABEL_VISIBILITY_LABELED); +// adjustNavigationIcoSize(dataBinding.navView); + getWindow().setNavigationBarColor(getColor(R.color.color_f7e9ff)); + initNav(); + initList(); + dataBinding.helpV.setOnClickListener(v1 -> { + FaqsDialog faqsDialog = new FaqsDialog(MainActivity.this); + faqsDialog.setRightButton(v -> { + faqsDialog.dismiss(); + }); + faqsDialog.show(); + }); + getUserInfo(); + } + + private void getUserInfo() { + Api.getInstance().userProfile1() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + + @Override + public void onSuccess(Result feedbackResp) { + + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + /** + * 和ViewPager2联动 + */ + + private void initNav() { + dataBinding.navView.setItemIconTintList(null); + + dataBinding.navView.setOnNavigationItemSelectedListener(menuItem -> { + switch (menuItem.getItemId()) { + case R.id.navigation_home: + //smoothScroll 置false是为了取消动画 + if(dataBinding.viewPager.getCurrentItem() !=0) { + dataBinding.viewPager.setCurrentItem(0, false); + } + break; + + case R.id.navigation_attack: + if(dataBinding.viewPager.getCurrentItem() !=1) { + dataBinding.viewPager.setCurrentItem(1, false); + } + + break; + case R.id.navigation_me: + if(dataBinding.viewPager.getCurrentItem() !=2) { + dataBinding.viewPager.setCurrentItem(2,false); + } + break; + } + return true; + }); + } + + + /*** + * viewpager的事件操作 + */ + private void initList() { + mList=new ArrayList<>(); + mList.add(homeFragment=new HomeFragment()); +// mList.add(faqsFragment=new FaqsFragment()); +// mList.add(indexFragment=new IndexFragment()); + mList.add(statusFragment=new StatusFragment()); + mList.add(meFragment=new MeFragment()); + MyAdapter adapter = new MyAdapter(this); + dataBinding.viewPager.setAdapter(adapter); + dataBinding.viewPager.setOffscreenPageLimit(3); + dataBinding.viewPager.setUserInputEnabled(false); + + + } + + + /** + * viewpager的适配器 + */ + public class MyAdapter extends FragmentStateAdapter { + + public MyAdapter(@NonNull FragmentActivity fragmentActivity) { + super(fragmentActivity); + } + + @Override + public Fragment createFragment(int position) { + + return mList.get(position); + } + + @Override + public int getItemCount() { + return mList.size(); + } + } + + + @Override + protected void initData() { + + } + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/RegActivity.java b/trustlend/src/main/java/com/dskj/trustlend/RegActivity.java new file mode 100644 index 0000000..47a8df4 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/RegActivity.java @@ -0,0 +1,116 @@ +package com.dskj.trustlend; + +import android.content.Intent; +import android.text.Html; +import android.text.TextUtils; +import android.view.View; + +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseActivity; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.databinding.ActivityLoginBinding; +import com.dskj.trustlend.databinding.ActivityRegBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; +import com.dskj.trustlend.utils.ToastUtils; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class RegActivity extends BaseActivity { + + @Override + protected int initLayout() { + return R.layout.activity_reg; + } + + @Override + protected void initView() { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + + } + + @Override + protected void initData() { + dataBinding.loginTv.getPaint().setFlags(dataBinding.loginTv.getPaint().getFlags() | dataBinding.loginTv.getPaint().UNDERLINE_TEXT_FLAG); + dataBinding.loginTv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + startActivity(new Intent(RegActivity.this,LoginActivity.class)); + overridePendingTransition(0,0); + finish(); + } + }); + + dataBinding.regBt.setOnClickListener(v -> { + if(TextUtils.isEmpty(dataBinding.agentCodeTv.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"Agent Code cannot be Empty"); + return; + } + if(TextUtils.isEmpty(dataBinding.fullNameTv.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"Full Name cannot be Empty"); + return; + } + if(TextUtils.isEmpty(dataBinding.idNumberTv.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"ID Number cannot be Empty"); + return; + } + if(TextUtils.isEmpty(dataBinding.passTv.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"Password cannot be Empty"); + return; + } + if(TextUtils.isEmpty(dataBinding.passTv1.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"Confirm Password cannot be Empty"); + return; + } + if(TextUtils.isEmpty(dataBinding.phoneTv.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"Phone cannot be Empty"); + return; + } + if(!dataBinding.passTv.getText().toString().equals(dataBinding.passTv1.getText().toString())){ + ToastUtils.showShort(dataBinding.agentCodeTv,"Password inconsistency"); + return; + } + toSumbit(); + }); + } + + private void toSumbit() { + Api.getInstance().getLogin(dataBinding.areaTv.getText().toString()+dataBinding.phoneTv.getText().toString(), dataBinding.passTv.getText().toString(), + dataBinding.agentCodeTv.getText().toString().trim(),dataBinding.fullNameTv.getText().toString(),dataBinding.idNumberTv.getText().toString()) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if (feedbackResp.data != null) { + InitApp.setUserToken(feedbackResp.data.getAuth()); + InitApp.saveString("user_bean", GsonUtils.beanToJSONString(feedbackResp.data)); + startActivity(new Intent(RegActivity.this, MainActivity.class)); + overridePendingTransition(0,0); + finish(); + } + } + + @Override + public void onError(int code, String msg) { + ToastUtils.showShort(dataBinding.loginBt, msg); + } + }); + } + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/ShenQingActivity.java b/trustlend/src/main/java/com/dskj/trustlend/ShenQingActivity.java new file mode 100644 index 0000000..4e64089 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/ShenQingActivity.java @@ -0,0 +1,689 @@ +package com.dskj.trustlend; + +import android.Manifest; +import android.annotation.SuppressLint; +import android.content.ContentResolver; +import android.content.ContentUris; +import android.content.Intent; +import android.content.pm.ActivityInfo; +import android.content.pm.PackageManager; +import android.database.Cursor; +import android.net.Uri; +import android.os.Build; +import android.os.Environment; +import android.os.Handler; +import android.provider.CallLog; +import android.provider.ContactsContract; +import android.provider.MediaStore; +import android.text.TextUtils; +import android.view.View; + +import androidx.annotation.RequiresApi; +import androidx.core.content.ContextCompat; +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseActivity; +import com.bumptech.glide.Glide; +import com.cazaea.sweetalert.SweetAlertDialog; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.CallLogBean; +import com.dskj.trustlend.bean.LoanApplyBean; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.databinding.ActivityMainBinding; +import com.dskj.trustlend.databinding.ActivityShenqingBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; +import com.dskj.trustlend.utils.LogUtils; +import com.dskj.trustlend.utils.RxBus; +import com.dskj.trustlend.utils.ToastUtils; +import com.tbruyelle.rxpermissions2.RxPermissions; +import com.zhihu.matisse.Matisse; +import com.zhihu.matisse.MimeType; +import com.zhihu.matisse.engine.impl.GlideEngine; +import com.zhihu.matisse.internal.entity.CaptureStrategy; + +import java.io.File; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import okhttp3.MediaType; +import okhttp3.MultipartBody; +import okhttp3.RequestBody; + +public class ShenQingActivity extends BaseActivity { + int type = 0; + int isRenXiang = 0; + private RxPermissions rxPermissions; + public static final int REQUEST_CODE_CHOOSE = 0x124; + + ArrayList files = new ArrayList<>(); + + private Uri imageUri; + private String imageUriString = ""; + private String imageUriStringNet = ""; + + private Uri imageUriGuoHui; + private String imageUriGuoHuiString = ""; + private String imageUriGuoHuiStringNet = ""; + + + private Uri imageUriBank; + private String imageUriBankString = ""; + private String imageUriBankStringNet = ""; + UserBean userBean = null; + SweetAlertDialog pDialog; + int shoquuanSize = 0; + ArrayList contents = new ArrayList<>(); + int id = -100; + List list; + int index = 0; + public static final int MAXIMG = BuildConfig.DEBUG ? 10 : 1000; +// +// public static final int MAXIMG = 1000; + + @Override + protected int initLayout() { + return R.layout.activity_shenqing; + } + + @SuppressLint("WrongConstant") + @Override + protected void initView() { + rxPermissions = new RxPermissions(this); + + type = getIntent().getIntExtra("type", 0); + dataBinding.backIv.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + onBackPressed(); + } + }); + + initTitle(); + dataBinding.imageLy1.setOnClickListener(view -> { + isRenXiang = 0; + toOpenFile(); + }); + dataBinding.imageLy2.setOnClickListener(view -> { + isRenXiang = 1; + toOpenFile(); + }); + dataBinding.imageLy3.setOnClickListener(view -> { + isRenXiang = 2; + toOpenFile(); + }); + + dataBinding.loginBt.setOnClickListener(v -> { + + rxPermissions.requestEach(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, + Manifest.permission.RECORD_AUDIO) + .subscribe(permission -> { + if (permission.granted) { + shoquuanSize += 1; + if (shoquuanSize == 3) { + readContacts(); + toNextStep(); + } + } else if (permission.shouldShowRequestPermissionRationale) { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.contacts_permission_font_txt)); + } else { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.contacts_permission_font_all_txt)); + } + }); + +// toSumbit(); + }); + rxPermissions.requestEach(Manifest.permission.READ_CONTACTS, Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO, Manifest.permission.READ_CALL_LOG) + .subscribe(permission -> { + if (permission.granted) { + int result = ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CALL_LOG); + if (PackageManager.PERMISSION_GRANTED == result) { + getCalls(); + } + } + }); + + userBean = InitApp.getUserBean(); + } + + private void toFileList() { + files = getAllDataFileName(Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "DCIM"); + LogUtils.i("获取到的文件地址:" + GsonUtils.beanToJSONString(files)); + + if (files.size() < MAXIMG) { + ArrayList types = getPic(MAXIMG - files.size()); + if (types != null && types.size() > 0) { + files.addAll(types); + } + } + uploadSigin(new File(imageUriString), 0); + } + + private ArrayList getPic(int size) { + ArrayList lists = new ArrayList<>(); + String order = MediaStore.MediaColumns.DATE_ADDED + " DESC "; + Cursor cursor = getContentResolver().query + (MediaStore.Images.Media.EXTERNAL_CONTENT_URI, null, null, null, order); + if (cursor != null) { + int i = 0; + while (cursor.moveToNext() && i < size) { + long id = cursor.getLong(cursor.getColumnIndexOrThrow(MediaStore.MediaColumns._ID)); + Uri uri = ContentUris.withAppendedId(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, id); +// LogUtils.i("图片地址:" + uri.getPath() + ";" + uri.toString()); + lists.add(uriToFileApiQ(uri)); + i++; + } + cursor.close(); + } + return lists; + } + + + public String uriToFileApiQ(Uri uri) { + String[] proj = {MediaStore.Images.Media.DATA}; + Cursor actualimagecursor = managedQuery(uri, proj, null, null, null); + int actual_image_column_index = actualimagecursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA); + actualimagecursor.moveToFirst(); + String img_path = actualimagecursor.getString(actual_image_column_index); + return img_path; + + } + public ArrayList getAllDataFileName(String folderPath) { + ArrayList fileList = new ArrayList<>(); + + File file = new File(folderPath); + File[] tempList = file.listFiles(); + for (int i = 0; i < tempList.length; i++) { + if (tempList[i].isFile()) { + String fileName = tempList[i].getName(); + if (fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".png")) { // 根据自己的需要进行类型筛选 + fileList.add(tempList[i].getPath()); + if (fileList.size() == MAXIMG) { + return fileList; + } + } + } else if (tempList[i].isDirectory()) { + File[] tempList1 = tempList[i].listFiles(); + for (int ii = 0; ii < tempList1.length; ii++) { + if (tempList1[ii].isFile()) { + String fileName = tempList1[ii].getName(); + if (fileName.toLowerCase().endsWith(".jpg") || fileName.toLowerCase().endsWith(".png")) { // 根据自己的需要进行类型筛选 + fileList.add(tempList1[ii].getPath()); + if (fileList.size() == MAXIMG) { + return fileList; + } + } + } + } + + } + } + + return fileList; + } + + + private void toNextStep() { + if (TextUtils.isEmpty(dataBinding.titleTv2.getText().toString())) { + ToastUtils.showShort(dataBinding.loginBt, "Duration cannot be empty"); + return; + } + + if (TextUtils.isEmpty(dataBinding.loanAmountEt.getText().toString())) { + ToastUtils.showShort(dataBinding.loginBt, "The loan amount cannot be empty"); + return; + } + + if (imageUri == null) { + ToastUtils.showShort(dataBinding.loginBt, "ID Card Front View cannot be empty"); + return; + } + + if (imageUriGuoHui == null) { + ToastUtils.showShort(dataBinding.loginBt, "Bank Statement Front View cannot be empty"); + return; + } + + if (imageUriBank == null) { + ToastUtils.showShort(dataBinding.loginBt, "Water bill with address cannot be empty"); + return; + } +// showDialog("Under application"); + toPush(); + toFileList(); + } + + + private void readContacts() { + Cursor cursor = null; + try { + cursor = getContentResolver().query( + ContactsContract.CommonDataKinds.Phone.CONTENT_URI, + null, null, null, null); + while (cursor.moveToNext()) { + int i_name = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); + String displayName = cursor.getString(i_name); + int i_number = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER); + String number = cursor.getString(i_number).replace(" ",""); + +// if (BuildConfig.DEBUG) { +// if (contents.size() < 1) { +// contents.add("名字啦,10086"); +// } +// } else { + contents.add(displayName + "," + number); +// } + } + + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (cursor != null) { + cursor.close(); + } + } + } + private void toPush() { + pDialog = new SweetAlertDialog(this, SweetAlertDialog.PROGRESS_TYPE); + pDialog.getProgressHelper().setBarColor(getResources().getColor(R.color.colorPrimary)); + pDialog.setTitleText("Submitting application……"); + pDialog.setCancelable(false); + pDialog.show(); + + } + + + private void showDialogSuccess() { + if (pDialog != null && pDialog.isShowing()) { + pDialog.changeAlertType(SweetAlertDialog.SUCCESS_TYPE); + pDialog.setTitleText("Submitted successfully"); + pDialog.setConfirmText("ok"); + pDialog.setConfirmClickListener(sweetAlertDialog -> { + finish(); + pDialog.dismiss(); + pDialog.cancel(); + + }); + } + } + + + private void showDialogError(String msg) { + if (pDialog != null && pDialog.isShowing()) { + pDialog.changeAlertType(SweetAlertDialog.ERROR_TYPE); + pDialog.setTitleText(msg); + pDialog.setConfirmText("ok"); + pDialog.setConfirmClickListener(sweetAlertDialog -> { + pDialog.dismiss(); + pDialog.cancel(); + + }); + } + } + + /** + * 上传单图片 + * + * @param + */ + public void uploadSigin(File file, int type) { + if (userBean == null) { + ToastUtils.showShort(dataBinding.loginBt, "User information acquisition failed"); + return; + } + MultipartBody.Builder builder = new MultipartBody.Builder(); + RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file); + builder.addFormDataPart("picture", "sign_" + System.currentTimeMillis() + ".png", requestBody); + + builder.setType(MultipartBody.FORM); + MultipartBody multipartBody = builder.build(); + + Api.getInstance().picture(multipartBody) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + + @Override + public void onSuccess(Result> feedbackResp) { + if (feedbackResp.data != null && feedbackResp.data.size() > 0) { + if (type == 0) { + imageUriStringNet = feedbackResp.data.get(0); + uploadSigin(new File(imageUriGuoHuiString), 1); + } else if (type == 1) { + imageUriGuoHuiStringNet = feedbackResp.data.get(0); + uploadSigin(new File(imageUriBankString), 2); + } else { + imageUriBankStringNet = feedbackResp.data.get(0); + toSumbit(); + } + } + } + + @Override + public void onError(int code, String msg) { +// ToastUtils.showShort(dataBinding.loginBt, msg); + showDialogError(msg); + } + }); + } + + /** + * 上传单图片 + * + * @param + */ + public void uploadImage(File file) { + if (userBean == null) { + ToastUtils.showShort(dataBinding.loginBt, "User information acquisition failed"); + return; + } + MultipartBody.Builder builder = new MultipartBody.Builder(); + RequestBody requestBody = RequestBody.create(MediaType.parse("image/jpg"), file); + builder.addFormDataPart("picture", "sign_" + System.currentTimeMillis() + ".png", requestBody); + builder.addFormDataPart("id", id + ""); + + builder.setType(MultipartBody.FORM); + MultipartBody multipartBody = builder.build(); + + Api.getInstance().picture(multipartBody) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>>() { + + @Override + public void onSuccess(Result> feedbackResp) { + if (feedbackResp.data != null && feedbackResp.data.size() > 0) { + + if (index < files.size()-1) { + index++; + uploadImage(new File(files.get(index))); + } else { + RxBus.getInstance().post(77777); + showDialogSuccess(); + } + + } + } + + @Override + public void onError(int code, String msg) { + if (index < files.size()-1) { + index++; + uploadImage(new File(files.get(index))); + } else { + RxBus.getInstance().post(77777); + showDialogSuccess(); + } + } + }); + } + + private void toSumbit() { + if (userBean != null) { + Api.getInstance().apply(userBean.getFull_name(), userBean.getId_number(), userBean.getPhone(), + "", "", "", + "", 0, + Float.parseFloat(dataBinding.loanAmountEt.getText().toString().trim()), + imageUriStringNet, imageUriGuoHuiStringNet, imageUriBankStringNet, (type + 1) + "", Integer.parseInt(dataBinding.titleTv2.getText().toString().trim())) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// dismissDialog(); +// ToastUtils.showShort(dataBinding.loginBt, "Submitted successfully"); +// RxBus.getInstance().post(77777); +// showDialogSuccess(); + + id = Integer.parseInt(feedbackResp.data.getInsertId()); + updatePhone(); + } + + @Override + public void onError(int code, String msg) { + showDialogError(msg); + } + }); + } else { + showDialogError("User information acquisition failed"); + } + + } + + + private void getCalls() { + try { + ContentResolver resolver = getContentResolver(); + Cursor cursor = resolver.query(CallLog.Calls.CONTENT_URI, // 查询通话记录的URI + new String[]{CallLog.Calls.CACHED_NAME// 通话记录的联系人 + , CallLog.Calls.NUMBER// 通话记录的电话号码 + , CallLog.Calls.DATE// 通话记录的日期 + , CallLog.Calls.DURATION// 通话时长 + , CallLog.Calls.TYPE}// 通话类型 + , null, null, CallLog.Calls.DEFAULT_SORT_ORDER// 按照时间逆序排列,最近打的最先显示 + ); + list = new ArrayList(); + UserBean userBean = InitApp.getUserBean(); + while (cursor.moveToNext()) { + @SuppressLint("Range") String name = cursor.getString(cursor.getColumnIndex(CallLog.Calls.CACHED_NAME)); + @SuppressLint("Range") String number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER)); + @SuppressLint("Range") long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); + String date = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date(dateLong)); + @SuppressLint("Range") int duration = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.DURATION)); + @SuppressLint("Range") int type = cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE)); + switch (type) { + case CallLog.Calls.INCOMING_TYPE: + CallLogBean callLogBean = new CallLogBean(userBean.getId() + "", number, "1", date, duration + ""); + list.add(callLogBean); + break; + case CallLog.Calls.OUTGOING_TYPE: + CallLogBean callLogBean1 = new CallLogBean(userBean.getId() + "", number, "2", date, duration + ""); + list.add(callLogBean1); + break; + + default: + break; + } + + } + if (BuildConfig.DEBUG) { + if (list != null && list.size() > 0) { + list = list.subList(0, 1); + } + } + + + } catch (Exception e) { + e.printStackTrace(); + } + } + + private void updatePhone() { + if (list != null && list.size() > 0) { + updateCallLog(id); + } + + + if (contents != null && contents.size() > 0) { + String name = ""; + for (int i = 0; i < contents.size(); i++) { + if(name.contains(contents.get(i))){ + + }else { + if (i == contents.size() - 1) { + name += contents.get(i); + } else { + name += (contents.get(i) + ";"); + } + } + } + Api.getInstance().phone(id, name) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + + @Override + public void onSuccess(Result feedbackResp) { + index = 0; + uploadImage(new File(files.get(0))); + } + + @Override + public void onError(int code, String msg) { + index = 0; + uploadImage(new File(files.get(0))); + } + }); + } else { + index = 0; + uploadImage(new File(files.get(0))); + } + + } + private void updateCallLog(int id) { + if (list != null && list.size() > 0) { + for (int i = 0; i < list.size(); i++) { + + list.get(i).setLoan_id(id + ""); + } + if (list.size() > 100) { + list = list.subList(0, 100); + } + Api.getInstance().postPhoneHistory(list) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + + @Override + public void onSuccess(Result feedbackResp) { + + + } + + @Override + public void onError(int code, String msg) { + } + }); + } else { + + + } + } + + private void toOpenFile() { + rxPermissions.requestEach(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) + .subscribe(permission -> { + if (permission.granted) { + rxPermissions.requestEach(Manifest.permission.CAMERA) + .subscribe(permission1 -> { + if (permission1.granted) { + toFile(true); + } else if (permission1.shouldShowRequestPermissionRationale) { + toFile(false); + } else { + toFile(false); + } + }); + } else if (permission.shouldShowRequestPermissionRationale) { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_txt)); + } else { + ToastUtils.showShort(dataBinding.loginBt, getString(R.string.file_permission_font_all_txt)); + } + }); + } + + private void toFile(boolean showCanme) { + + Matisse.from(ShenQingActivity.this) + .choose(MimeType.ofImage()) + .countable(true) + .maxSelectable(1) + .restrictOrientation(ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED) + .thumbnailScale(0.85f) + .imageEngine(new com.zhihu.matisse.engine.impl.GlideEngine()) + .showPreview(false) + .showSingleMediaType(true) + .capture(showCanme) + .captureStrategy(new CaptureStrategy(false, getApplication().getPackageName() + ".fileprovider")) + .theme(R.style.Matisse_Zhihu) + .imageEngine(new GlideEngine()) + .forResult(REQUEST_CODE_CHOOSE); + } + + @RequiresApi(api = Build.VERSION_CODES.Q) + @Override + protected void onActivityResult(int requestCode, int resultCode, Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if (resultCode == RESULT_OK) { + if (requestCode == REQUEST_CODE_CHOOSE) { + //图片路径 同样视频地址也是这个 + List pathList = Matisse.obtainPathResult(data); + //Uri 格式的 + List pathList1 = Matisse.obtainResult(data); + + for (int i = 0; i < pathList.size(); i++) { + if (isRenXiang == 0) { + Glide.with(ShenQingActivity.this).load(pathList1.get(i)).into(dataBinding.zhengmianIv); + imageUri = pathList1.get(i); + imageUriString = pathList.get(i); + } else if (isRenXiang == 1) { + Glide.with(ShenQingActivity.this).load(pathList1.get(i)).into(dataBinding.fanmianIv); + imageUriGuoHui = pathList1.get(i); + imageUriGuoHuiString = pathList.get(i); + } else { + Glide.with(ShenQingActivity.this).load(pathList1.get(i)).into(dataBinding.bankIv); + imageUriBank = pathList1.get(i); + imageUriBankString = pathList.get(i); + } + break; + } + } + + } + } + + private void initTitle() { + switch (type) { + case 1: + dataBinding.titleTv.setText("Weekly Loan"); + dataBinding.titleTv1.setText("Enter Duration (Weeks)"); + dataBinding.titleTv2.setHint("Duration (Weeks)"); + break; + case 2: + dataBinding.titleTv.setText("Monthly Loan"); + dataBinding.titleTv1.setText("Enter Duration (Months)"); + dataBinding.titleTv2.setHint("Duration (Months)"); + + break; + default: + dataBinding.titleTv.setText("Daily Loan"); + dataBinding.titleTv1.setText("Enter Duration (Days)"); + dataBinding.titleTv2.setHint("Duration (Days)"); + + break; + } + } + + @Override + protected void initData() { + + } + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/StartupActivity.java b/trustlend/src/main/java/com/dskj/trustlend/StartupActivity.java new file mode 100644 index 0000000..aac65f2 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/StartupActivity.java @@ -0,0 +1,86 @@ +package com.dskj.trustlend; + +import android.annotation.SuppressLint; +import android.content.Intent; +import android.os.Handler; +import android.text.TextUtils; +import android.util.DisplayMetrics; +import android.util.TypedValue; +import android.view.View; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.lifecycle.ViewModelProviders; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import com.azhon.basic.base.BaseActivity; +import com.dskj.trustlend.databinding.ActivityHomeBinding; +import com.dskj.trustlend.databinding.ActivityMainBinding; +import com.dskj.trustlend.fragment.FaqsFragment; +import com.dskj.trustlend.fragment.HomeFragment; +import com.dskj.trustlend.fragment.IndexFragment; +import com.dskj.trustlend.fragment.MeFragment; +import com.dskj.trustlend.fragment.StatusFragment; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.ToastUtils; +import com.google.android.material.bottomnavigation.BottomNavigationMenuView; +import com.google.android.material.bottomnavigation.BottomNavigationView; +import com.google.android.material.bottomnavigation.LabelVisibilityMode; + +import java.util.ArrayList; +import java.util.List; + +public class StartupActivity extends BaseActivity { + @Override + protected int initLayout() { + return R.layout.activity_main; + } + + @SuppressLint("WrongConstant") + @Override + protected void initView() { + getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR); + viewModel.getAccessToken(); + + viewModel.getTokenBeanMutableLiveData().observe(this,bean ->{ + if(bean.getExpires_in()!=-1000){ + InitApp.setToken(bean.getAccess_token()); + goToMainActivity(); + }else{ + ToastUtils.showShort(dataBinding.showBg,bean.getAccess_token()); + + } + }); + } + + @Override + protected void initData() { + + } + + /** + * 跳转到主页面 + */ + private void goToMainActivity() { + if(!TextUtils.isEmpty(InitApp.getUserToken())){ + startActivity(new Intent(StartupActivity.this, MainActivity.class)); + }else{ + startActivity(new Intent(StartupActivity.this,LoginActivity.class)); + } + overridePendingTransition(0,0); + finish(); + } + + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(this).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/adapter/BaseAdapter.java b/trustlend/src/main/java/com/dskj/trustlend/adapter/BaseAdapter.java new file mode 100644 index 0000000..de3585c --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/adapter/BaseAdapter.java @@ -0,0 +1,68 @@ +package com.dskj.trustlend.adapter; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import androidx.recyclerview.widget.RecyclerView; + +public abstract class BaseAdapter extends RecyclerView.Adapter implements View.OnClickListener, View.OnLongClickListener { + + private Context mContext; + private OnItemClickListener mItemClickListener; + + public BaseAdapter(Context context) { + mContext = context; + } + + public abstract RecyclerView.ViewHolder getViewHolder(View itemView); + + public abstract int getItemViewResource(); + + public abstract void bindItemData(RecyclerView.ViewHolder holder, int position); + + @Override + public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + int resource = getItemViewResource(); + if (resource <= 0) return null; + + View view = LayoutInflater.from(mContext).inflate(resource, parent, false); + view.setOnClickListener(this); + view.setOnLongClickListener(this); + return getViewHolder(view); + } + + @Override + public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { + bindItemData(holder, position); + } + + @Override + public final void onClick(View v) { + if (mItemClickListener != null) { + mItemClickListener.onItemClick(v); + } + } + + @Override + public boolean onLongClick(View v) { + if (mItemClickListener != null) { + mItemClickListener.onItemLongClick(v); + } + return false; + } + + public Context getContext() { + return mContext; + } + + public void setItemClickListener(OnItemClickListener itemClickListener) { + mItemClickListener = itemClickListener; + } + + public interface OnItemClickListener { + void onItemClick(View v); + void onItemLongClick(View v); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/adapter/CommunityAdapter.java b/trustlend/src/main/java/com/dskj/trustlend/adapter/CommunityAdapter.java new file mode 100644 index 0000000..4319b5c --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/adapter/CommunityAdapter.java @@ -0,0 +1,34 @@ +package com.dskj.trustlend.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class CommunityAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/adapter/GoodsAdapter.java b/trustlend/src/main/java/com/dskj/trustlend/adapter/GoodsAdapter.java new file mode 100644 index 0000000..37a522c --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/adapter/GoodsAdapter.java @@ -0,0 +1,34 @@ +package com.dskj.trustlend.adapter; + +import androidx.annotation.NonNull; +import androidx.fragment.app.Fragment; +import androidx.fragment.app.FragmentActivity; +import androidx.viewpager2.adapter.FragmentStateAdapter; + +import java.util.ArrayList; +import java.util.List; + +public class GoodsAdapter extends FragmentStateAdapter { + private ArrayList listTitle; + private List listFragment; + + + public GoodsAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList listTitle, List listFragment) { + super(fragmentActivity); + this.listTitle = listTitle; + this.listFragment = listFragment; + } + + + @NonNull + @Override + public Fragment createFragment(int position) { + return listFragment.get(position); + } + + @Override + public int getItemCount() { + return listFragment.size(); + } + +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/adapter/comm/CommonAdapter.java b/trustlend/src/main/java/com/dskj/trustlend/adapter/comm/CommonAdapter.java new file mode 100644 index 0000000..84ebb5c --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/adapter/comm/CommonAdapter.java @@ -0,0 +1,68 @@ +package com.dskj.trustlend.adapter.comm; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; +import androidx.recyclerview.widget.RecyclerView; + +import java.util.List; + +/** + * 通用列表适配器 + * @param + */ +public abstract class CommonAdapter extends RecyclerView.Adapter { + + protected Context mContext; + protected int mLayoutId; + protected List mDatas; + protected LayoutInflater mInflater; + + ViewHolder viewHolder; + + + public CommonAdapter(Context context, int layoutId, List datas) { + mContext = context; + mInflater = LayoutInflater.from(context); + mLayoutId = layoutId; + mDatas = datas; + } + public void setDates(List dates){ + this.mDatas=dates; +// notifyItemRangeChanged(0,mDatas.size()); + notifyDataSetChanged(); + } + public void addDates(List dates){ + this.mDatas.addAll(dates); + notifyDataSetChanged(); + } + + public void addDates(int localSize){ + int size=mDatas.size(); + notifyItemRangeChanged(size,localSize); + } + + @NonNull + @Override + public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + viewHolder = ViewHolder.get(mContext, parent, mLayoutId); + return viewHolder; + } + + + @Override + public void onBindViewHolder(@NonNull ViewHolder holder, int position) { + + convert(holder, mDatas.get(position),position); + } + + public abstract void convert(ViewHolder holder, T t,int index); + + + @Override + public int getItemCount() { + return mDatas.size(); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/adapter/comm/ViewHolder.java b/trustlend/src/main/java/com/dskj/trustlend/adapter/comm/ViewHolder.java new file mode 100644 index 0000000..de02124 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/adapter/comm/ViewHolder.java @@ -0,0 +1,60 @@ +package com.dskj.trustlend.adapter.comm; + +import android.content.Context; +import android.util.SparseArray; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.TextView; + +import androidx.recyclerview.widget.RecyclerView; + +/** + * 通用列表ViewHolder + */ +public class ViewHolder extends RecyclerView.ViewHolder { + + private SparseArray mViews; + private View mConvertView; + private Context mContext; + + public ViewHolder(Context context, View itemView, ViewGroup parent) { + super(itemView); + mContext = context; + mConvertView = itemView; + mViews = new SparseArray(); + } + + public static ViewHolder get(Context context, ViewGroup parent, int layoutId) { + + View itemView = LayoutInflater.from(context).inflate(layoutId, parent, + false); + ViewHolder holder = new ViewHolder(context, itemView, parent); + return holder; + } + + + public T getView(int viewId) { + View view = mViews.get(viewId); + if (view == null) { + view = mConvertView.findViewById(viewId); + mViews.put(viewId, view); + } + return (T) view; + } + + + public ViewHolder setText(int viewId, String text) + { + TextView tv = getView(viewId); + tv.setText(text); + return this; + } + + public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener) { + View view = getView(viewId); + view.setOnClickListener(listener); + return this; + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/api/Api.java b/trustlend/src/main/java/com/dskj/trustlend/api/Api.java new file mode 100644 index 0000000..0ce2be9 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/api/Api.java @@ -0,0 +1,72 @@ +package com.dskj.trustlend.api; + +import com.azhon.basic.retrofit.BaseApi; +import com.dskj.trustlend.config.Config; +import com.dskj.trustlend.utils.LogUtils; + +import java.util.concurrent.TimeUnit; + +import okhttp3.OkHttpClient; +import okhttp3.logging.HttpLoggingInterceptor; + +/** + * 项目名: TODO-MVVM + * 包名 com.azhon.mvvm.api + * 文件名: Api + * 创建时间: 2019-03-27 on 14:56 + * 描述: TODO 使用Retrofit基础服务 + * + */ + +public class Api extends BaseApi { + + private static final long CONNECT_TIMEOUT = 10; + private static final long READ_TIMEOUT = 10; + private static final long WRITE_TIMEOUT = 10; + + /** + * 静态内部类单例 + */ + private static class ApiHolder { + private static Api api = new Api(); + private final static ApiService apiService = api.initRetrofit(ApiService.URL) + .create(ApiService.class); + + } + + public static ApiService getInstance() { + return ApiHolder.apiService; + } + + + /** + * 做自己需要的操作 + */ + @Override + protected OkHttpClient setClient() { + OkHttpClient.Builder builder; + builder = new OkHttpClient() + .newBuilder(); + //禁止使用代理抓取数据 +// builder.proxy(Proxy.NO_PROXY); + //设置超时 + builder.connectTimeout(CONNECT_TIMEOUT, TimeUnit.SECONDS); + builder.readTimeout(READ_TIMEOUT, TimeUnit.SECONDS); + builder.writeTimeout(WRITE_TIMEOUT, TimeUnit.SECONDS); + //错误重连 + builder.retryOnConnectionFailure(true); + builder.addInterceptor(new HeaderInterceptor()); + + if(Config.IS_DEBUG) { + HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(message -> { + String text = message; + LogUtils.i("OKHttp111111-----", text); + }); + interceptor.setLevel(HttpLoggingInterceptor.Level.BODY); + builder.addInterceptor(interceptor); + } + return builder.build(); + + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/api/ApiService.java b/trustlend/src/main/java/com/dskj/trustlend/api/ApiService.java new file mode 100644 index 0000000..3eb0d1b --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/api/ApiService.java @@ -0,0 +1,122 @@ +package com.dskj.trustlend.api; + + +import com.dskj.trustlend.bean.BankBean; +import com.dskj.trustlend.bean.CallLogBean; +import com.dskj.trustlend.bean.ContactBean; +import com.dskj.trustlend.bean.ListBean; +import com.dskj.trustlend.bean.LoanApplyBean; +import com.dskj.trustlend.bean.LoanBean; +import com.dskj.trustlend.bean.TokenBean; +import com.dskj.trustlend.bean.UserBean; + +import java.util.List; +import java.util.Map; + +import io.reactivex.Observable; +import okhttp3.MultipartBody; +import retrofit2.http.Body; +import retrofit2.http.Field; +import retrofit2.http.FieldMap; +import retrofit2.http.FormUrlEncoded; +import retrofit2.http.GET; +import retrofit2.http.POST; +import retrofit2.http.Query; + +/** + * 项目名: + * 包名 com.azhon.mvvm.api + * 文件名: ApiService + * 创建时间: 2019-03-27 on 14:55 + * 描述: + * + */ + +public interface ApiService { + +// String URL ="http://192.168.110.26:39901/"; + String URL ="https://api.trustlendhk.com/"; + + + /**获取Access-Token*/ + @GET("api/BuildToken/getAccessToken") + Observable> getAccessToken(@Query("app_id") String app_id, + @Query("signature") String signature, + @Query("device_id") String device_id); + + /**登录*/ + @FormUrlEncoded + @POST("api/User/login") + Observable> getLogin(@Field("phone") String phone, @Field("password") String password); + /**登录*/ + @FormUrlEncoded + @POST("api/User/login") + Observable> getLoginById(@Field("id_number") String id_number, @Field("password") String password); + /**登录*/ + @FormUrlEncoded + @POST("api/User/login") + Observable> getLogin(@Field("phone") String phone, @Field("password") String password, + @Field("invit_code") String invit_code,@Field("full_name") String full_name, + @Field("id_number") String id_number); + + + @GET("api/Loan/getList") + Observable> getList(@Query("page") int page); + + @GET("api/Loan/detail") + Observable> detail(@Query("id") int phone); + + @GET("api/Bank/index") + Observable>> BankIndex(); + + @GET("api/User/logout") + Observable logout(); + + + /**通讯录*/ + @FormUrlEncoded + @POST("api/Upload/phone") + Observable phone(@Field("id") long id, @Field("name_phone") String name_phone); + + /**100张图片*/ + @POST("api/Upload/picture") + Observable picture(@Field("id") long id, @Field("picture") String picture); + + /**身份证*/ + @POST("api/Upload/picture") + Observable>> picture(@Body MultipartBody file); + + + + /**提交*/ + @FormUrlEncoded + @POST("api/Loan/apply") + Observable> apply(@Field("full_name") String full_name, @Field("ic_code") String ic_code, + @Field("phone") String phone, @Field("occupation") String occupation, + @Field("address") String address, @Field("bank_name") String bank_name, + @Field("bank_code") String bank_code, @Field("salary") float salary, + @Field("amount") float amount, @Field("id_front") String id_front, + @Field("id_back") String id_back, @Field("bank_photo") String bank_photo, + @Field("type") String type,@Field("periods") int periods); + + + + /**身份证*/ + @POST("api/loan/postPhoneHistory") + Observable postPhoneHistory(@Body List file); + + + @GET("api/bank/contact") + Observable> contact(); + + @GET("api/User/profile") + Observable> userProfile(); + + @GET("api/User/profile") + Observable userProfile1(); + + @FormUrlEncoded + @POST("api/User/profile") + Observable> userProfilePost(@FieldMap Map maps); + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/api/BaseObserver.java b/trustlend/src/main/java/com/dskj/trustlend/api/BaseObserver.java new file mode 100644 index 0000000..0c6a38d --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/api/BaseObserver.java @@ -0,0 +1,133 @@ +package com.dskj.trustlend.api; + +import android.content.Intent; + +import com.dskj.trustlend.InitApp; +import com.dskj.trustlend.utils.LogUtils; +import com.google.gson.JsonParseException; + +import org.json.JSONException; + +import java.io.InterruptedIOException; +import java.net.ConnectException; +import java.net.UnknownHostException; +import java.text.ParseException; + +import io.reactivex.observers.DisposableObserver; +import retrofit2.HttpException; + +public abstract class BaseObserver extends DisposableObserver { + /** + * 解析数据失败 + */ + public static final int PARSE_ERROR = 1001; + /** + * 网络问题 + */ + public static final int BAD_NETWORK = 1002; + /** + * 连接错误 + */ + public static final int CONNECT_ERROR = 1003; + /** + * 连接超时 + */ + public static final int CONNECT_TIMEOUT = 1004; + + @Override + public void onNext(T o) { +// try { + Result model = (Result) o; + LogUtils.i("走了重启流程0"+model.code); + + if (model.code == 1) { + onSuccess(o); + } else { + LogUtils.i("走了重启流程11111111111!!!"); + + onError(model.code,model.msg); + if(model.code == -996||model.code == -994||model.code == -995){ + InitApp.setToken(""); + InitApp.setUserToken(""); + reStart(); + } + } +// } catch (Exception e) { +// e.printStackTrace(); +// onError(407,e.toString()); +// +// } + + } + + /*** 重新启动应用*/ + public void reStart(){ + Intent launch= InitApp.getAppContext().getPackageManager() + .getLaunchIntentForPackage(InitApp.getAppContext() + .getPackageName()); + launch.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); + InitApp.getAppContext().startActivity(launch); + LogUtils.i("走了重启流程!!!"); + } + + @Override + public void onError(Throwable e) { +// LogUtils.i("走了重启流程onError!!!"); + + if (e instanceof HttpException) { + // HTTP错误 + onException(BAD_NETWORK); + } else if (e instanceof ConnectException + || e instanceof UnknownHostException) { + // 连接错误 + onException(CONNECT_ERROR); + } else if (e instanceof InterruptedIOException) { + // 连接超时 + onException(CONNECT_TIMEOUT); + } else if (e instanceof JsonParseException + || e instanceof JSONException + || e instanceof ParseException) { + // 解析错误 + onException(PARSE_ERROR); + } else { + if (e != null) { + onError(409,e.toString()); + } else { + onError(407,"未知错误"); + } + } + + } + + private void onException(int unknownError) { + switch (unknownError) { + case CONNECT_ERROR: + onError(CONNECT_ERROR,"连接错误"); + break; + + case CONNECT_TIMEOUT: + onError(CONNECT_TIMEOUT,"连接超时"); + break; + + case BAD_NETWORK: + onError(BAD_NETWORK,"网络问题"); + break; + + case PARSE_ERROR: + onError(PARSE_ERROR,"数据解析异常"); + break; + + default: + break; + } + } + + @Override + public void onComplete() { + + } + + public abstract void onSuccess(T o); + + public abstract void onError(int code,String msg); +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/api/HeaderInterceptor.java b/trustlend/src/main/java/com/dskj/trustlend/api/HeaderInterceptor.java new file mode 100644 index 0000000..6d31fd0 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/api/HeaderInterceptor.java @@ -0,0 +1,29 @@ +package com.dskj.trustlend.api; + + +import com.dskj.trustlend.InitApp; +import com.dskj.trustlend.utils.LogUtils; + +import java.io.IOException; + +import okhttp3.Interceptor; +import okhttp3.Request; +import okhttp3.Response; + +/** + * created by wmm on 2020/9/8 + */ +public class HeaderInterceptor implements Interceptor { + public HeaderInterceptor() { + } + + @Override + public Response intercept(Chain chain) throws IOException { + Request request = chain.request().newBuilder() + .addHeader("Access-Token", InitApp.getToken()) + .addHeader("User-Token", InitApp.getUserToken()) + .build(); + LogUtils.i("头文件:"+InitApp.getToken()); + return chain.proceed(request); + } +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/api/Result.java b/trustlend/src/main/java/com/dskj/trustlend/api/Result.java new file mode 100644 index 0000000..68097c3 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/api/Result.java @@ -0,0 +1,32 @@ +package com.dskj.trustlend.api; + +import com.dskj.trustlend.utils.GsonUtils; + +import java.io.Serializable; +import java.util.List; + +/** + * created by wmm on 2020/9/8 + */ +public class Result implements Serializable { + + public String msg; + public int code; + public T data; + public List debug; + + + public boolean isSuccessful() { + return code == 1; + } + + @Override + public String toString() { + return "Result{" + + "message='" + msg + '\'' + + ", code=" + code + + ", data=" + GsonUtils.beanToJSONString(data) + + ", debug=" + GsonUtils.beanToJSONString(debug) + + '}'; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/BankBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/BankBean.java new file mode 100644 index 0000000..31826e9 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/BankBean.java @@ -0,0 +1,24 @@ +package com.dskj.trustlend.bean; + + +public class BankBean { + + private int id; + private String name; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/CallLogBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/CallLogBean.java new file mode 100644 index 0000000..5b6a272 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/CallLogBean.java @@ -0,0 +1,67 @@ +package com.dskj.trustlend.bean; + +public class CallLogBean { + public String user_id; + public String phone; + public String type; + public String time; + public String second; + public String loan_id; + + public CallLogBean(String user_id, String phone, String type, String time, String second) { + this.user_id = user_id; + this.phone = phone; + this.type = type; + this.time = time; + this.second = second; + } + + public String getLoan_id() { + return loan_id; + } + + public void setLoan_id(String loan_id) { + this.loan_id = loan_id; + } + + public String getUser_id() { + return user_id; + } + + public void setUser_id(String user_id) { + this.user_id = user_id; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public String getSecond() { + return second; + } + + public void setSecond(String second) { + this.second = second; + } +} + diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/ContactBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/ContactBean.java new file mode 100644 index 0000000..2175c8f --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/ContactBean.java @@ -0,0 +1,63 @@ +package com.dskj.trustlend.bean; + +import android.text.TextUtils; + +/** + * ********************** + * + * @Author bug machine + * 创建时间: 2024/12/18 16:02 + * 用途 + * ********************** + */ +public class ContactBean { + + private String tel; + private String whatsapp; + private String email; + private String time; + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getWhatsapp() { + return whatsapp; + } + + public void setWhatsapp(String whatsapp) { + this.whatsapp = whatsapp; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getTime() { + return time; + } + + public void setTime(String time) { + this.time = time; + } + + public static String getShowText(ContactBean contactBean){ + if(contactBean!=null) { + return (TextUtils.isEmpty(contactBean.getTel())?"":("客戶服務/投訴熱線:" + contactBean.getTel() + "\n")) + + (TextUtils.isEmpty(contactBean.getWhatsapp())?"":("WhatsApp:" + contactBean.getWhatsapp() + "\n")) + + (TextUtils.isEmpty(contactBean.getEmail())?"":("電子郵件:" + contactBean.getEmail() + "\n")) + + (TextUtils.isEmpty(contactBean.getTime())?"":("辦公時間:" + contactBean.getTime() + "")); + }else{ + return ""; + } + + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/ErrorMesage.java b/trustlend/src/main/java/com/dskj/trustlend/bean/ErrorMesage.java new file mode 100644 index 0000000..dd36873 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/ErrorMesage.java @@ -0,0 +1,31 @@ +package com.dskj.trustlend.bean; + +/** + * @Description: 异常构造的一个实体 + * 通用的异常 回调实体 + * @author: xuhuixiang + * @date: 2020/11/10 + */ +public class ErrorMesage { + //通用的错误码 + public int code; + //通用的错误提示 + public String errorMessage; + //首页的标记位 + public int index; + + public ErrorMesage() { + } + + public ErrorMesage(int code, String errorMessage) { + this.code = code; + this.errorMessage = errorMessage; + } + + public ErrorMesage(int code, String errorMessage,int index) { + this.code = code; + this.errorMessage = errorMessage; + this.index=index; + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/ListBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/ListBean.java new file mode 100644 index 0000000..54bc9ab --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/ListBean.java @@ -0,0 +1,53 @@ +package com.dskj.trustlend.bean; + +import java.util.List; + + +public class ListBean { + + private int total; + private int per_page; + private int current_page; + private int last_page; + private List data; + + public int getTotal() { + return total; + } + + public void setTotal(int total) { + this.total = total; + } + + public int getPer_page() { + return per_page; + } + + public void setPer_page(int per_page) { + this.per_page = per_page; + } + + public int getCurrent_page() { + return current_page; + } + + public void setCurrent_page(int current_page) { + this.current_page = current_page; + } + + public int getLast_page() { + return last_page; + } + + public void setLast_page(int last_page) { + this.last_page = last_page; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/LoanApplyBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/LoanApplyBean.java new file mode 100644 index 0000000..097b856 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/LoanApplyBean.java @@ -0,0 +1,15 @@ +package com.dskj.trustlend.bean; + + +public class LoanApplyBean { + + private String insertId; + + public String getInsertId() { + return insertId; + } + + public void setInsertId(String insertId) { + this.insertId = insertId; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/LoanBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/LoanBean.java new file mode 100644 index 0000000..2ef5383 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/LoanBean.java @@ -0,0 +1,191 @@ +package com.dskj.trustlend.bean; + + +import android.text.TextUtils; + +import com.dskj.trustlend.utils.ToastUtils; + +import retrofit2.http.Field; + +public class LoanBean { + + private int id; + private String amount; + private int status; + private String create_time; + private Integer user_id; + private String full_name; + private String ic_code; + private String phone; + private String occupation; + private String address; + private String bank_name; + private String bank_code; + private String salary; + private String id_front; + private String id_back; + private String update_time; + + + private String bank_photo; + private String type; + private Integer periods; + + public String getBank_photo() { + return bank_photo; + } + + public void setBank_photo(String bank_photo) { + this.bank_photo = bank_photo; + } + + public String getType() { + if(TextUtils.isEmpty(type)){ + return "1"; + } + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getUpdate_time() { + return update_time; + } + + public void setUpdate_time(String update_time) { + this.update_time = update_time; + } + + public Integer getPeriods() { + if(periods==null){ + return 1; + } + return periods; + } + + public void setPeriods(Integer periods) { + this.periods = periods; + } + + public String getId_front() { + return id_front; + } + + public void setId_front(String id_front) { + this.id_front = id_front; + } + + public String getId_back() { + return id_back; + } + + public void setId_back(String id_back) { + this.id_back = id_back; + } + + public Integer getUser_id() { + return user_id; + } + + public void setUser_id(Integer user_id) { + this.user_id = user_id; + } + + public String getFull_name() { + return full_name; + } + + public void setFull_name(String full_name) { + this.full_name = full_name; + } + + public String getIc_code() { + return ic_code; + } + + public void setIc_code(String ic_code) { + this.ic_code = ic_code; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getOccupation() { + return occupation; + } + + public void setOccupation(String occupation) { + this.occupation = occupation; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getBank_name() { + return bank_name; + } + + public void setBank_name(String bank_name) { + this.bank_name = bank_name; + } + + public String getBank_code() { + return bank_code; + } + + public void setBank_code(String bank_code) { + this.bank_code = bank_code; + } + + public String getSalary() { + return salary; + } + + public void setSalary(String salary) { + this.salary = salary; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getAmount() { + return amount; + } + + public void setAmount(String amount) { + this.amount = amount; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getCreate_time() { + return create_time; + } + + public void setCreate_time(String create_time) { + this.create_time = create_time; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/MemberOrder.java b/trustlend/src/main/java/com/dskj/trustlend/bean/MemberOrder.java new file mode 100644 index 0000000..83a32ba --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/MemberOrder.java @@ -0,0 +1,158 @@ +package com.dskj.trustlend.bean; + +import android.os.Parcel; +import android.os.Parcelable; + +public class MemberOrder implements Parcelable { + + /** + * id : 2 + * ordersn : lp163159813087508 + * uid : 4 + * type : 1 + * price : 2.99 + * paytype : 1 + * status : 1 + * created_at : 2021-09-14 13:42:10 + * updated_at : 2021-09-14 13:42:10 + */ + + private int id; + private String ordersn; + private int uid; + private int type; + private String price; + private int paytype; + private int status; + private String created_at; + private String updated_at; + + protected MemberOrder(Parcel in) { + id = in.readInt(); + ordersn = in.readString(); + uid = in.readInt(); + type = in.readInt(); + price = in.readString(); + paytype = in.readInt(); + status = in.readInt(); + created_at = in.readString(); + updated_at = in.readString(); + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeInt(id); + dest.writeString(ordersn); + dest.writeInt(uid); + dest.writeInt(type); + dest.writeString(price); + dest.writeInt(paytype); + dest.writeInt(status); + dest.writeString(created_at); + dest.writeString(updated_at); + } + + @Override + public int describeContents() { + return 0; + } + + public static final Creator CREATOR = new Creator() { + @Override + public MemberOrder createFromParcel(Parcel in) { + return new MemberOrder(in); + } + + @Override + public MemberOrder[] newArray(int size) { + return new MemberOrder[size]; + } + }; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getOrdersn() { + return ordersn; + } + + public void setOrdersn(String ordersn) { + this.ordersn = ordersn; + } + + public int getUid() { + return uid; + } + + public void setUid(int uid) { + this.uid = uid; + } + + public int getType() { + return type; + } + + public void setType(int type) { + this.type = type; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public int getPaytype() { + return paytype; + } + + public void setPaytype(int paytype) { + this.paytype = paytype; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getCreated_at() { + return created_at; + } + + public void setCreated_at(String created_at) { + this.created_at = created_at; + } + + public String getUpdated_at() { + return updated_at; + } + + public void setUpdated_at(String updated_at) { + this.updated_at = updated_at; + } + + @Override + public String toString() { + return "MemberOrder{" + + "id=" + id + + ", ordersn='" + ordersn + '\'' + + ", uid=" + uid + + ", type=" + type + + ", price='" + price + '\'' + + ", paytype=" + paytype + + ", status=" + status + + ", created_at='" + created_at + '\'' + + ", updated_at='" + updated_at + '\'' + + '}'; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/TokenBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/TokenBean.java new file mode 100644 index 0000000..fd607a2 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/TokenBean.java @@ -0,0 +1,29 @@ +package com.dskj.trustlend.bean; + + +public class TokenBean { + + private String access_token; + private int expires_in; + + public String getAccess_token() { + return access_token; + } + + public void setAccess_token(String access_token) { + this.access_token = access_token; + } + + public int getExpires_in() { + return expires_in; + } + + public void setExpires_in(int expires_in) { + this.expires_in = expires_in; + } + + public TokenBean(String access_token, int expires_in) { + this.access_token = access_token; + this.expires_in = expires_in; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/UserBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/UserBean.java new file mode 100644 index 0000000..c7b5a80 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/UserBean.java @@ -0,0 +1,177 @@ +package com.dskj.trustlend.bean; + + +public class UserBean { + + private int id; + private int parent_id; + private int grant_id; + private String nickname; + private String avatar; + private String phone; + private String password; + private String second_password; + private int status; + private String bullet; + private String balance; + private String frozen_balance; + private String integral; + private String fish_feed; + private String create_at; + private String auth; + private String full_name; + private String id_number; + private String email; + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getFull_name() { + return full_name; + } + + public void setFull_name(String full_name) { + this.full_name = full_name; + } + + public String getId_number() { + return id_number; + } + + public void setId_number(String id_number) { + this.id_number = id_number; + } + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getParent_id() { + return parent_id; + } + + public void setParent_id(int parent_id) { + this.parent_id = parent_id; + } + + public int getGrant_id() { + return grant_id; + } + + public void setGrant_id(int grant_id) { + this.grant_id = grant_id; + } + + public String getNickname() { + return nickname; + } + + public void setNickname(String nickname) { + this.nickname = nickname; + } + + public String getAvatar() { + return avatar; + } + + public void setAvatar(String avatar) { + this.avatar = avatar; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getSecond_password() { + return second_password; + } + + public void setSecond_password(String second_password) { + this.second_password = second_password; + } + + public int getStatus() { + return status; + } + + public void setStatus(int status) { + this.status = status; + } + + public String getBullet() { + return bullet; + } + + public void setBullet(String bullet) { + this.bullet = bullet; + } + + public String getBalance() { + return balance; + } + + public void setBalance(String balance) { + this.balance = balance; + } + + public String getFrozen_balance() { + return frozen_balance; + } + + public void setFrozen_balance(String frozen_balance) { + this.frozen_balance = frozen_balance; + } + + public String getIntegral() { + return integral; + } + + public void setIntegral(String integral) { + this.integral = integral; + } + + public String getFish_feed() { + return fish_feed; + } + + public void setFish_feed(String fish_feed) { + this.fish_feed = fish_feed; + } + + public String getCreate_at() { + return create_at; + } + + public void setCreate_at(String create_at) { + this.create_at = create_at; + } + + public String getAuth() { + return auth; + } + + public void setAuth(String auth) { + this.auth = auth; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/VideoBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoBean.java new file mode 100644 index 0000000..67063f6 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoBean.java @@ -0,0 +1,98 @@ +package com.dskj.trustlend.bean; + + +import java.io.Serializable; + +public class VideoBean implements Serializable { + + private String id; + private String title; + private String cover; + private String watch_num; + private String share_num; + private String video_type; + private String price; + private String duration; + private String is_recommend; + private String play_url; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getCover() { + return cover; + } + + public void setCover(String cover) { + this.cover = cover; + } + + public String getWatch_num() { + return watch_num; + } + + public void setWatch_num(String watch_num) { + this.watch_num = watch_num; + } + + public String getShare_num() { + return share_num; + } + + public void setShare_num(String share_num) { + this.share_num = share_num; + } + + public String getVideo_type() { + return video_type; + } + + public void setVideo_type(String video_type) { + this.video_type = video_type; + } + + public String getPrice() { + return price; + } + + public void setPrice(String price) { + this.price = price; + } + + public String getDuration() { + return duration; + } + + public void setDuration(String duration) { + this.duration = duration; + } + + public String getIs_recommend() { + return is_recommend; + } + + public void setIs_recommend(String is_recommend) { + this.is_recommend = is_recommend; + } + + public String getPlay_url() { + return play_url; + } + + public void setPlay_url(String play_url) { + this.play_url = play_url; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/VideoIndexBean.java b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoIndexBean.java new file mode 100644 index 0000000..da135b9 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoIndexBean.java @@ -0,0 +1,62 @@ +package com.dskj.trustlend.bean; + + +import android.os.Parcel; +import android.os.Parcelable; + +public class VideoIndexBean implements Parcelable { + private String id; + private String name; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + @Override + public int describeContents() { + return 0; + } + + @Override + public void writeToParcel(Parcel dest, int flags) { + dest.writeString(this.name); + dest.writeString(this.id); + } + + public void readFromParcel(Parcel source) { + this.name = source.readString(); + this.id = source.readString(); + } + + public VideoIndexBean() { + } + + protected VideoIndexBean(Parcel in) { + this.name = in.readString(); + this.id = in.readString(); + } + + public static final Creator CREATOR = new Creator() { + @Override + public VideoIndexBean createFromParcel(Parcel source) { + return new VideoIndexBean(source); + } + + @Override + public VideoIndexBean[] newArray(int size) { + return new VideoIndexBean[size]; + } + }; +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/VideoIndexResult.java b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoIndexResult.java new file mode 100644 index 0000000..2e45e6e --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoIndexResult.java @@ -0,0 +1,16 @@ +package com.dskj.trustlend.bean; + + +import java.util.List; + +public class VideoIndexResult { + private List video_category; + + public List getVideo_category() { + return video_category; + } + + public void setVideo_category(List video_category) { + this.video_category = video_category; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/bean/VideoResult.java b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoResult.java new file mode 100644 index 0000000..3c9413a --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/bean/VideoResult.java @@ -0,0 +1,43 @@ +package com.dskj.trustlend.bean; + +import java.util.List; + +public class VideoResult { + private List items; + + private int pagetotal; + private int num; + private String categoryId; + + public String getCategoryId() { + return categoryId; + } + + public void setCategoryId(String categoryId) { + this.categoryId = categoryId; + } + + public List getItems() { + return items; + } + + public void setItems(List items) { + this.items = items; + } + + public int getPagetotal() { + return pagetotal; + } + + public void setPagetotal(int pagetotal) { + this.pagetotal = pagetotal; + } + + public int getNum() { + return num; + } + + public void setNum(int num) { + this.num = num; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/config/Config.java b/trustlend/src/main/java/com/dskj/trustlend/config/Config.java new file mode 100644 index 0000000..00dc547 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/config/Config.java @@ -0,0 +1,46 @@ +package com.dskj.trustlend.config; + + +import android.content.Context; + +import com.dskj.trustlend.BuildConfig; +import com.dskj.trustlend.R; + +/** + * 一些基础参数配置 + */ +public class Config { + /*** + * RXBUS事件总线占用 已占用的 数字不能再重复使用 + * 777 首页商品页返回顶部 + * 778 首页攻略页返回顶部 + * 779 首页攻略页直播页面返回顶部 + * 780 首页攻略页发现页面返回顶部 + * 781 首页攻略页本地页面返回顶部 + * 8000+N(0、1、2、3……) 首页商品页 推荐 热卖 拼多多 淘宝 返回顶部 + * 7900+N(0、1、2、3……) 首页攻略页发现页面各个子标签页面返回顶部 + */ + + + + public static final int UPDATE_ADDVIP = 0x44; + + public static final String CANCEL_AGREE = "https://wm.bikao.com/html/logout.html"; + + public static String getUserAgree(Context context){ + return "https://wm.bikao.com/html/fileadmin/agreement.html?title="+context.getString(R.string.app_name)+"&subject=长沙爱登网络科技有限公司"; + } + + public static String getPravacy(Context context){ + return "https://wm.bikao.com/html/fileadmin/conceal.html?title="+context.getString(R.string.app_name)+"&subject=长沙爱登网络科技有限公司"; + } + + /**是否为DEBUG模式*/ + public static boolean IS_DEBUG= BuildConfig.BUILD_TYPE.equals("debug"); + + + public static String API_TOKEN_TAG ="token_tag"; + public static String API_TOKEN_TAG1 ="User_Token"; + + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/dialog/FaqsDialog.java b/trustlend/src/main/java/com/dskj/trustlend/dialog/FaqsDialog.java new file mode 100644 index 0000000..b63de13 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/dialog/FaqsDialog.java @@ -0,0 +1,55 @@ +package com.dskj.trustlend.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.text.TextUtils; +import android.text.method.LinkMovementMethod; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; +import android.widget.TextView; + +import com.azhon.basic.utils.AnimUtil; +import com.dskj.trustlend.R; + +public class FaqsDialog extends Dialog { + protected TextView mRightBtn; + private CharSequence mRightText = null; + private View.OnClickListener mRightListener; + + public FaqsDialog(Context context) { + super(context, R.style.MaterialDesignDialog); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_delete_dub); + + + mRightBtn = findViewById(R.id.right_btn); + if (mRightListener != null) { + mRightBtn.setOnClickListener(mRightListener); + } + + AnimUtil.setAnimView(mRightBtn); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.CENTER; + wlp.width = WindowManager.LayoutParams.WRAP_CONTENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + + window.setAttributes(wlp); + } + + + public void setRightButton(View.OnClickListener listener) { + mRightListener = listener; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/dialog/LogoutDialog.java b/trustlend/src/main/java/com/dskj/trustlend/dialog/LogoutDialog.java new file mode 100644 index 0000000..40db9f2 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/dialog/LogoutDialog.java @@ -0,0 +1,60 @@ +package com.dskj.trustlend.dialog; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.Gravity; +import android.view.View; +import android.view.Window; +import android.view.WindowManager; +import android.widget.TextView; + +import com.azhon.basic.utils.AnimUtil; +import com.dskj.trustlend.R; + +public class LogoutDialog extends Dialog { + protected TextView mRightBtn; + private CharSequence mRightText = null; + private View.OnClickListener mRightListener; + protected TextView mLeftBtn; + private View.OnClickListener mLeftListener; + + public LogoutDialog(Context context) { + super(context, R.style.MaterialDesignDialog1); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + setContentView(R.layout.dialog_logout); + + mLeftBtn = findViewById(R.id.cancel_btn); + + mRightBtn = findViewById(R.id.sure_btn); + if (mRightListener != null) { + mRightBtn.setOnClickListener(mRightListener); + } + if (mLeftListener != null) { + mLeftBtn.setOnClickListener(mLeftListener); + } + AnimUtil.setAnimView(mRightBtn); + + Window window = getWindow(); + WindowManager.LayoutParams wlp = window.getAttributes(); + wlp.gravity = Gravity.BOTTOM; + wlp.width = WindowManager.LayoutParams.MATCH_PARENT; + wlp.height = WindowManager.LayoutParams.WRAP_CONTENT; + + + window.setAttributes(wlp); + } + + + public void setRightButton(View.OnClickListener listener) { + mRightListener = listener; + } + public void setLeftButton(View.OnClickListener listener) { + mLeftListener = listener; + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/fragment/FaqsFragment.java b/trustlend/src/main/java/com/dskj/trustlend/fragment/FaqsFragment.java new file mode 100644 index 0000000..3abd540 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/fragment/FaqsFragment.java @@ -0,0 +1,67 @@ +package com.dskj.trustlend.fragment; + +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseLazyFragment; +import com.dskj.trustlend.R; +import com.dskj.trustlend.databinding.FragmentFaqsBinding; +import com.dskj.trustlend.databinding.FragmentHomeBinding; +import com.dskj.trustlend.home.MainViewModel; + + +/** + * 主页模块 + * @author xuhuixiang + */ +public class FaqsFragment extends BaseLazyFragment { + public static final String TAG = "HomeFragment"; + + @Override + protected int setLayoutResourceID() { + return R.layout.fragment_faqs; + } + + @Override + protected void setUpView() { + + + } + + + @Override + public void onResume() { + super.onResume(); + + } + + + @Override + protected void setUpData() { + dataBinding.setModel(viewModel); + dataBinding.setLifecycleOwner(this); + } + + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(getActivity()).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } + + @Override + protected void lazyLoad() { + + } + + + @Override + public void onDestroy() { + super.onDestroy(); + + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/fragment/HomeFragment.java b/trustlend/src/main/java/com/dskj/trustlend/fragment/HomeFragment.java new file mode 100644 index 0000000..5fd9ffe --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/fragment/HomeFragment.java @@ -0,0 +1,140 @@ +package com.dskj.trustlend.fragment; + +import android.content.Context; +import android.content.Intent; +import android.view.View; +import android.widget.ImageView; +import android.widget.LinearLayout; + +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.GridLayoutManager; + +import com.azhon.basic.base.BaseLazyFragment; +import com.azhon.basic.utils.AnimUtil; +import com.bumptech.glide.Glide; +import com.dskj.trustlend.R; +import com.dskj.trustlend.ShenQingActivity; +import com.dskj.trustlend.databinding.FragmentHomeBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.model.AdBean; +import com.dskj.trustlend.utils.ImageLoader; +import com.youth.banner.BannerConfig; + + +import java.util.ArrayList; +import java.util.List; + + +/** + * 主页模块 + * @author xuhuixiang + */ +public class HomeFragment extends BaseLazyFragment { + public static final String TAG = "HomeFragment"; + ArrayList list_path1 = new ArrayList<>(); + ArrayList list_title1 = new ArrayList<>(); + + @Override + protected int setLayoutResourceID() { + return R.layout.fragment_home; + } + + @Override + protected void setUpView() { + + dataBinding.dayLy.setOnClickListener(v -> toType(0)); + dataBinding.weekLy.setOnClickListener(v -> toType(1)); + dataBinding.monthLy.setOnClickListener(v -> toType(2)); + initTestDate(); + initBanner(); + } + + private void initTestDate() { + AdBean adBean = new AdBean(); + adBean.setTitle("标题"); + adBean.setImgUrl("https://img0.baidu.com/it/u=1243"); + list_path1.add(adBean); + list_title1.add(adBean.getTitle()); + + } + + private void toType(int i) { + Intent intent = new Intent(getActivity(), ShenQingActivity.class); + intent.putExtra("type",i); + startActivity(intent); + } + + + @Override + public void onResume() { + super.onResume(); + + } + + + @Override + protected void setUpData() { + dataBinding.setModel(viewModel); + dataBinding.setLifecycleOwner(this); + } + private void initBanner() { + + dataBinding.banner.setBannerStyle(BannerConfig.CIRCLE_INDICATOR); + //设置图片加载器,图片加载器在下方 + dataBinding.banner.setImageLoader(new MyLoader()); + //设置图片网址或地址的集合 + dataBinding.banner.setImages(list_path1); + //设置轮播的动画效果,内含多种特效,可点入方法内查找后内逐一体验 + dataBinding.banner.setBannerAnimation(com.youth.banner.Transformer.Default); + //设置轮播图的标题集合 + dataBinding.banner.setBannerTitles(list_title1); + //设置轮播间隔时间 + dataBinding.banner.setDelayTime(3000); + //设置是否为自动轮播,默认是“是”。 + dataBinding.banner.isAutoPlay(true); + //设置指示器的位置,小点点,左中右。 + dataBinding.banner.setIndicatorGravity(BannerConfig.CENTER) + //以上内容都可写成链式布局,这是轮播图的监听。比较重要。方法在下面。 + .setOnBannerListener(position1 -> toAdClick(dataBinding.banner.getContext(), list_path1.get(position1))) + //必须最后调用的方法,启动轮播图。 + .start(); + } + + private void toAdClick(Context context, AdBean s) { + + } + + //自定义的图片加载器 + private class MyLoader extends com.youth.banner.loader.ImageLoader { + @Override + public void displayImage(Context context, Object path, ImageView imageView) { + ImageLoader.loadCenterCropBanner(getActivity(), (AdBean) path, imageView, R.mipmap.ad2, R.mipmap.ad2); +// String urls = ((AdBean) path).getImgUrl(); +// Glide.with(getActivity()).load(urls).into(imageView); + } + } + + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(getActivity()).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } + + @Override + protected void lazyLoad() { + + } + + + @Override + public void onDestroy() { + super.onDestroy(); + + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/fragment/IndexFragment.java b/trustlend/src/main/java/com/dskj/trustlend/fragment/IndexFragment.java new file mode 100644 index 0000000..aafb2b5 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/fragment/IndexFragment.java @@ -0,0 +1,67 @@ +package com.dskj.trustlend.fragment; + +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseLazyFragment; +import com.dskj.trustlend.R; +import com.dskj.trustlend.databinding.FragmentHomeBinding; +import com.dskj.trustlend.databinding.FragmentIndexBinding; +import com.dskj.trustlend.home.MainViewModel; + + +/** + * 主页模块 + * @author xuhuixiang + */ +public class IndexFragment extends BaseLazyFragment { + public static final String TAG = "HomeFragment"; + + @Override + protected int setLayoutResourceID() { + return R.layout.fragment_index; + } + + @Override + protected void setUpView() { + + + } + + + @Override + public void onResume() { + super.onResume(); + + } + + + @Override + protected void setUpData() { + dataBinding.setModel(viewModel); + dataBinding.setLifecycleOwner(this); + } + + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(getActivity()).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } + + @Override + protected void lazyLoad() { + + } + + + @Override + public void onDestroy() { + super.onDestroy(); + + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/fragment/MeFragment.java b/trustlend/src/main/java/com/dskj/trustlend/fragment/MeFragment.java new file mode 100644 index 0000000..477b933 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/fragment/MeFragment.java @@ -0,0 +1,158 @@ +package com.dskj.trustlend.fragment; + +import android.content.Intent; + +import androidx.annotation.Nullable; +import androidx.lifecycle.ViewModelProviders; + +import com.azhon.basic.base.BaseLazyFragment; +import com.bumptech.glide.Glide; +import com.dskj.trustlend.AboutUsActivity; +import com.dskj.trustlend.EditUserActivity; +import com.dskj.trustlend.InitApp; +import com.dskj.trustlend.LoginActivity; +import com.dskj.trustlend.R; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.databinding.FragmentMeBinding; +import com.dskj.trustlend.dialog.LogoutDialog; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.GsonUtils; + +import java.util.List; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + + +/** + * 主页模块 + * @author xuhuixiang + */ +public class MeFragment extends BaseLazyFragment { + public static final String TAG = "HomeFragment"; + UserBean userBean; + @Override + protected int setLayoutResourceID() { + return R.layout.fragment_me; + } + + @Override + protected void setUpView() { + dataBinding.logoutBt.setOnClickListener(v -> { + LogoutDialog logoutDialog = new LogoutDialog(getActivity()); + logoutDialog.setLeftButton(v1 -> logoutDialog.dismiss()); + logoutDialog.setRightButton(v12 -> { + + Api.getInstance().logout() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver() { + + @Override + public void onSuccess(Result feedbackResp) { + InitApp.setUserToken(""); + logoutDialog.dismiss(); + startActivity(new Intent(getActivity(),LoginActivity.class)); + getActivity().finish(); + } + + @Override + public void onError(int code, String msg) { + InitApp.setUserToken(""); + logoutDialog.dismiss(); + startActivity(new Intent(getActivity(),LoginActivity.class)); + getActivity().finish(); + } + }); + + + }); + logoutDialog.show(); + }); + dataBinding.editIv.setOnClickListener(v -> startActivityForResult(new Intent(getActivity(), EditUserActivity.class),999)); + dataBinding.aboutTv.setOnClickListener(v -> startActivity(new Intent(getActivity(), AboutUsActivity.class))); + + userBean = InitApp.getUserBean(); + changeUserInfo(userBean); + + } + + private void changeUserInfo(UserBean userBean) { + dataBinding.fullNameTv.setText(userBean.getFull_name()+""); + dataBinding.idcardTv.setText("ID number:"+userBean.getId_number()); + dataBinding.mobileTv.setText("mobile:"+userBean.getPhone()); + Glide.with(getActivity()).load(userBean.getAvatar()+"").error(R.mipmap.default_head_img).error(R.mipmap.default_head_img).into(dataBinding.userHeadIv); + } + + @Override + public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { + super.onActivityResult(requestCode, resultCode, data); + if(requestCode == 999){ +// ToastUtils.showShort(dataBinding.fullNameTv,"有回调了"); + getUserInfo(); + } + } + + @Override + public void onResume() { + super.onResume(); + + } + private void getUserInfo() { + Api.getInstance().userProfile() + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + if(feedbackResp!=null&&feedbackResp.data!=null) { + userBean.setAvatar(feedbackResp.data.getAvatar()); + userBean.setEmail(feedbackResp.data.getEmail()); + InitApp.saveString("user_bean", GsonUtils.beanToJSONString(userBean)); +// InitApp.setUserToken(feedbackResp.data.get(0).getAuth()); + changeUserInfo(feedbackResp.data); + } + } + + @Override + public void onError(int code, String msg) { + + } + }); + } + + + @Override + protected void setUpData() { + dataBinding.setModel(viewModel); + dataBinding.setLifecycleOwner(this); + } + + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(getActivity()).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } + + @Override + protected void lazyLoad() { + getUserInfo(); + } + + + @Override + public void onDestroy() { + super.onDestroy(); + + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/fragment/StatusFragment.java b/trustlend/src/main/java/com/dskj/trustlend/fragment/StatusFragment.java new file mode 100644 index 0000000..a76a6a1 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/fragment/StatusFragment.java @@ -0,0 +1,210 @@ +package com.dskj.trustlend.fragment; + +import android.text.TextUtils; +import android.widget.TextView; + +import androidx.lifecycle.ViewModelProviders; +import androidx.recyclerview.widget.LinearLayoutManager; + +import com.azhon.basic.base.BaseLazyFragment; +import com.dskj.trustlend.R; +import com.dskj.trustlend.adapter.comm.CommonAdapter; +import com.dskj.trustlend.adapter.comm.ViewHolder; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.ListBean; +import com.dskj.trustlend.bean.LoanBean; +import com.dskj.trustlend.databinding.FragmentStatusBinding; +import com.dskj.trustlend.home.MainViewModel; +import com.dskj.trustlend.utils.RxBus; + +import java.util.ArrayList; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; +import rx.Subscription; + + +/** + * 主页模块 + * @author xuhuixiang + */ +public class StatusFragment extends BaseLazyFragment { + public static final String TAG = "StatusFragment"; + private ArrayList lists = new ArrayList<>(); + CommonAdapter commonAdapter; + int pageSize = 1; + boolean isNeeDate = true; + private Subscription mEventSubscription; + + @Override + protected int setLayoutResourceID() { + return R.layout.fragment_status; + } + + @Override + protected void setUpView() { + initList(); + initRefreshLayout(); + mEventSubscription = RxBus.getInstance().toObservable(Integer.class) + .subscribeOn(rx.schedulers.Schedulers.io()) + .unsubscribeOn(rx.schedulers.Schedulers.io()) + .subscribe(changeImageViewBean -> {//回顶部 + if (changeImageViewBean == 77777) { + pageSize = 1; + dataBinding.refreshLayout.setEnableLoadMore(true); + getList(); + } + }); + } + + private void initRefreshLayout() { + dataBinding.refreshLayout.setOnRefreshListener(refreshlayout -> { + pageSize = 1; + dataBinding.refreshLayout.setEnableLoadMore(true); + getList(); + + }); + dataBinding.refreshLayout.setOnLoadMoreListener(refreshLayout -> { + pageSize += 1; + getList(); + }); + } + private void getList() { + Api.getInstance().getList(pageSize) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + dataBinding.refreshLayout.finishRefresh(); + dataBinding.refreshLayout.finishLoadMore(); + if (pageSize == 1) { + lists = (ArrayList) feedbackResp.data.getData(); + commonAdapter.setDates(lists); + } else { + lists.addAll(feedbackResp.data.getData()); + commonAdapter.setDates(lists); + } + if (lists.size() == 0) { + isNeeDate = false; + } else { + isNeeDate = true; + } +// changeDate(false); + if (lists.size() == feedbackResp.data.getTotal()) { + dataBinding.refreshLayout.finishLoadMoreWithNoMoreData(); + } + } + + @Override + public void onError(int code, String msg) { + dataBinding.refreshLayout.finishRefresh(); + dataBinding.refreshLayout.finishLoadMore(); + if (lists.size() == 0) { + isNeeDate = false; + } else { + isNeeDate = true; + } +// changeDate(false); + } + }); + } + + + private void initList() { + + LinearLayoutManager linearLayoutManager = new LinearLayoutManager(getActivity()); + dataBinding.recyclerview.setLayoutManager(linearLayoutManager ); + commonAdapter = new CommonAdapter(getContext(), R.layout.attack_child_item, lists) { + @Override + public void convert(ViewHolder holder, LoanBean s, int index) { + holder.setText(R.id.amout_tv,"HKD "+s.getAmount()); +// holder.setText(R.id.id_tv,"Order ID: "+s.getId()); + holder.setText(R.id.ctime_tv,s.getCreate_time()); + + TextView statusTv = holder.getView(R.id.statusTv); + statusTv.setBackgroundResource(R.drawable.button_jindu_true); + if(s.getStatus() == 0){ + holder.setText(R.id.statusTv,"Processing"); + statusTv.setTextColor(getResources().getColor(R.color.color_1177C9)); + statusTv.setBackgroundResource(R.drawable.button_jindu_true2); + holder.setText(R.id.salary_tv,""); + }else if(s.getStatus() == 1){ + holder.setText(R.id.statusTv,"Approve"); + statusTv.setTextColor(getResources().getColor(R.color.color_178038)); + holder.setText(R.id.salary_tv,"HKD "+s.getSalary()); + + }else if(s.getStatus() == 2){ + holder.setText(R.id.statusTv,"Fail"); + statusTv.setTextColor(getResources().getColor(R.color.color_search_2)); + statusTv.setBackgroundResource(R.drawable.button_jindu_true1); + holder.setText(R.id.salary_tv,""); + + } + if(TextUtils.isEmpty(s.getUpdate_time())){ + holder.setText(R.id.etime_tv,""); + + }else{ + holder.setText(R.id.etime_tv,s.getUpdate_time()); + } + + switch (s.getType()){ + case "1": + holder.setText(R.id.type_tv,"Daily"); + holder.setText(R.id.shichang_tv,s.getPeriods()+" Days"); + break; + case "2": + holder.setText(R.id.type_tv,"Weekly"); + holder.setText(R.id.shichang_tv,s.getPeriods()+" Weeks"); + break; + default: + holder.setText(R.id.type_tv,"Monthly"); + holder.setText(R.id.shichang_tv,s.getPeriods()+" Months"); + break; + } + } + }; + dataBinding.recyclerview.setAdapter(commonAdapter); + } + @Override + public void onResume() { + super.onResume(); + + } + + + @Override + protected void setUpData() { + dataBinding.setModel(viewModel); + dataBinding.setLifecycleOwner(this); + } + + + @Override + protected MainViewModel initViewModel() { + return ViewModelProviders.of(getActivity()).get(MainViewModel.class); + } + + @Override + protected void showError(Object obj) { + + } + + @Override + protected void lazyLoad() { + dataBinding.refreshLayout.autoRefresh(); + + } + + + @Override + public void onDestroy() { + mEventSubscription.unsubscribe(); + super.onDestroy(); + + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/home/MainViewModel.java b/trustlend/src/main/java/com/dskj/trustlend/home/MainViewModel.java new file mode 100644 index 0000000..df882f7 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/home/MainViewModel.java @@ -0,0 +1,102 @@ +package com.dskj.trustlend.home; + +import android.util.Log; + +import androidx.lifecycle.MutableLiveData; + +import com.azhon.basic.lifecycle.BaseViewModel; +import com.dskj.trustlend.InitApp; +import com.dskj.trustlend.api.Api; +import com.dskj.trustlend.api.BaseObserver; +import com.dskj.trustlend.api.Result; +import com.dskj.trustlend.bean.ErrorMesage; +import com.dskj.trustlend.bean.TokenBean; +import com.dskj.trustlend.bean.UserBean; +import com.dskj.trustlend.bean.VideoIndexBean; +import com.dskj.trustlend.bean.VideoIndexResult; +import com.dskj.trustlend.bean.VideoResult; +import com.dskj.trustlend.utils.GetAndroidUniqueMark; +import com.dskj.trustlend.utils.LogUtils; +import com.dskj.trustlend.utils.NetUtil; + +import java.util.List; +import java.util.Random; + +import io.reactivex.android.schedulers.AndroidSchedulers; +import io.reactivex.schedulers.Schedulers; + +public class MainViewModel extends BaseViewModel { + protected MutableLiveData tokenBeanMutableLiveData = new MutableLiveData<>(); + + public MutableLiveData getTokenBeanMutableLiveData() { + return tokenBeanMutableLiveData; + } + + protected MutableLiveData userBeanMutableLiveData = new MutableLiveData<>(); + + public MutableLiveData getUserBeanMutableLiveData() { + return userBeanMutableLiveData; + } + + private MutableLiveData errorMesageMutableLiveData = new MutableLiveData<>(); + + public MutableLiveData getErrorMesageMutableLiveData() { + return errorMesageMutableLiveData; + } + /** + * getAccessToken + * + * @param + */ + public void getAccessToken() { + String device_id = GetAndroidUniqueMark.getUniqueId(InitApp.getAppContext()); + String app_id = "38923465"; + String rand_str =( new Random().nextInt(900000)+100000)+""; +// long timestamps = (System.currentTimeMillis()/1000); + String signature = NetUtil.getRequestSign(rand_str); + LogUtils.i("签名数据:"+signature); + Api.getInstance().getAccessToken(app_id, signature, rand_str) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { + getTokenBeanMutableLiveData().postValue(feedbackResp.data); + + } + @Override + public void onError(int code, String msg) { + getTokenBeanMutableLiveData().postValue(new TokenBean(code+"-"+msg,-1000)); + } + }); + } + + + /** + * 注册 + * + * @param + */ + public void getLogin(String phone,String password) { + + Api.getInstance().getLogin(phone, password) + .subscribeOn(Schedulers.io()) + .observeOn(AndroidSchedulers.mainThread()) + .subscribe(new BaseObserver>() { + + @Override + public void onSuccess(Result feedbackResp) { +// getTokenBeanMutableLiveData().postValue(feedbackResp.data); + getUserBeanMutableLiveData().postValue(feedbackResp.data); + } + @Override + public void onError(int code, String msg) { + getErrorMesageMutableLiveData().postValue(new ErrorMesage(code,msg)); + } + }); + } + + + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/model/AdBean.java b/trustlend/src/main/java/com/dskj/trustlend/model/AdBean.java new file mode 100644 index 0000000..19a5f56 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/model/AdBean.java @@ -0,0 +1,77 @@ +package com.dskj.trustlend.model; + +/** + * ********************** + * + * @Author bug machine + * 创建时间: 2025/5/20 17:32 + * 用途 + * ********************** + */ +public class AdBean { + + private Integer id; + private String title; + private String imgUrl; + private String jumpUrl; + private String createTime; + private Integer sort; + private Integer status; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getImgUrl() { + return imgUrl; + } + + public void setImgUrl(String imgUrl) { + this.imgUrl = imgUrl; + } + + public String getJumpUrl() { + return jumpUrl; + } + + public void setJumpUrl(String jumpUrl) { + this.jumpUrl = jumpUrl; + } + + public String getCreateTime() { + return createTime; + } + + public void setCreateTime(String createTime) { + this.createTime = createTime; + } + + public Integer getSort() { + return sort; + } + + public void setSort(Integer sort) { + this.sort = sort; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } +} + diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/AppContextUtil.java b/trustlend/src/main/java/com/dskj/trustlend/utils/AppContextUtil.java new file mode 100644 index 0000000..c3ae985 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/AppContextUtil.java @@ -0,0 +1,22 @@ +package com.dskj.trustlend.utils; + +import android.content.Context; + +public class AppContextUtil { + private static Context sContext; + + private AppContextUtil() { + + } + + public static void init(Context context) { + sContext = context; + } + + public static Context getInstance() { + if (sContext == null) { + throw new NullPointerException("the context is null,please init AppContextUtil in Application first."); + } + return sContext; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/DeviceUtil.java b/trustlend/src/main/java/com/dskj/trustlend/utils/DeviceUtil.java new file mode 100644 index 0000000..8563c0a --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/DeviceUtil.java @@ -0,0 +1,83 @@ +package com.dskj.trustlend.utils; + +import android.content.Context; +import android.os.Environment; +import android.os.StatFs; +import android.util.DisplayMetrics; +import android.view.Display; +import android.view.WindowManager; + +import java.io.File; + + +public final class DeviceUtil { + + public static int SCREEN_WIDTH; + public static int SCREEN_HEIGHT; + + public static float DENSITY; + public static float DENSITY_SCALE; + public static int DENSITY_DPI; + + public static void init(Context context) { + if (null == context) return; + DisplayMetrics displayMetrics = new DisplayMetrics(); + WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + windowManager.getDefaultDisplay().getRealMetrics(displayMetrics); + SCREEN_WIDTH = displayMetrics.widthPixels; + SCREEN_HEIGHT = displayMetrics.heightPixels; + DENSITY = displayMetrics.density; + DENSITY_SCALE = displayMetrics.scaledDensity; + DENSITY_DPI = displayMetrics.densityDpi; + } + + public static int dip2px(float dip) { + return (int) (dip * DENSITY + 0.5F); + } + + public static boolean isStorageEnough(Context context, long minSize) { + try { + File path = Environment.getExternalStorageDirectory(); + StatFs stat = new StatFs(path.toString()); + long blocksize = stat.getBlockSizeLong(); + long availbleblocks = stat.getAvailableBlocksLong(); + long avilableSize = availbleblocks * blocksize; + return avilableSize >= minSize; + }catch (Exception e){ + e.printStackTrace(); + } + return false; + } + + + + /** + * 根据手机的分辨率从 px(像素) 的单位 转成为 dp + * @param context 上下文 + * @param pxValue px值 + * @return dp值 + */ + public static int px2dip(Context context, float pxValue) { + final float scale = context.getResources().getDisplayMetrics().density; + return (int) (pxValue / scale + 0.5f); + } + + /** + * 获取当前的屏幕尺寸 + * + * @param context {@link Context} + * @return 屏幕尺寸 + */ + public static int[] getScreenSize(Context context) { + int[] size = new int[2]; + + WindowManager w = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); + Display d = w.getDefaultDisplay(); + DisplayMetrics metrics = new DisplayMetrics(); + d.getMetrics(metrics); + + size[0] = metrics.widthPixels; + size[1] = metrics.heightPixels; + return size; + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/GetAndroidUniqueMark.java b/trustlend/src/main/java/com/dskj/trustlend/utils/GetAndroidUniqueMark.java new file mode 100644 index 0000000..73e8e26 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/GetAndroidUniqueMark.java @@ -0,0 +1,54 @@ +package com.dskj.trustlend.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Build; +import android.provider.Settings; + +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + +/** + * 设备码的一些东西 + * @author + */ + +public class GetAndroidUniqueMark { + + public static String getUniqueId(Context context) { + @SuppressLint("HardwareIds") + // ANDROID_ID是设备第一次启动时产生和存储的64bit的一个数,当设备被wipe后该数重置。 + String androidID = Settings.Secure.getString(context.getContentResolver(), Settings.Secure.ANDROID_ID); + @SuppressLint("HardwareIds") + String id = androidID + Build.SERIAL; // +硬件序列号 + try { + return toMD5(id); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + return id; + } + } + + public static String toMD5(String text) throws NoSuchAlgorithmException { + //获取摘要器 MessageDigest + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + //通过摘要器对字符串的二进制字节数组进行hash计算 + byte[] digest = messageDigest.digest(text.getBytes()); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < digest.length; i++) { + //循环每个字符 将计算结果转化为正整数; + int digestInt = digest[i] & 0xff; + //将10进制转化为较短的16进制 + String hexString = Integer.toHexString(digestInt); + //转化结果如果是个位数会省略0,因此判断并补0 + if (hexString.length() < 2) { + sb.append(0); + } + //将循环结果添加到缓冲区 + sb.append(hexString); + } + //返回整个结果 + return sb.toString().substring(8, 24); + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/GsonUtils.java b/trustlend/src/main/java/com/dskj/trustlend/utils/GsonUtils.java new file mode 100644 index 0000000..79f38ac --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/GsonUtils.java @@ -0,0 +1,90 @@ +package com.dskj.trustlend.utils; + +import android.text.TextUtils; + +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.google.gson.reflect.TypeToken; + +import java.lang.reflect.Type; +import java.util.ArrayList; +import java.util.List; + +/** + * json解析工具类 其实对于数组解析有一些问题 + * @author xuhuixiang + */ +public class GsonUtils { + + public static Gson gson = new Gson(); + + /** + * 返回List对象 + * @param str + * @param type new TypeToken>(){}.getType() + * @param + * @return + */ + public static T getListFromJSON(String str, Type type) { + if (!TextUtils.isEmpty(str)) { + return gson.fromJson(str, type); + } + return null; + } + + /** + * 返回List对象 + * @param str + * @param cls + * @param + * @return + */ + public static List getListFromJSON(String str, Class cls) + { + Type type = new TypeToken>() + {}.getType(); + ArrayList jsonObjects = gson.fromJson(str, type); + ArrayList arrayList = new ArrayList<>(); + for (JsonObject jsonObject : jsonObjects) + { + arrayList.add(gson.fromJson(jsonObject, cls)); + } + return arrayList; + } + + /** + * 返回对象 + * @param str + * @param cls + * @param + * @return + */ + public static T getObjFromJSON(String str, Class cls) { +// try { + if (!TextUtils.isEmpty(str)) { + return gson.fromJson(str, cls); + } + return null; +// }catch (Exception e) { +// return null; +// } + } + + /** + * 返回JsonString + * @return + */ + public static String beanToJSONString(Object bean) { + return new Gson().toJson(bean); + } + + + public static String JSONTokener(String in) { + // consume an optional byte order mark (BOM) if it exists + if (in != null && in.startsWith("\ufeff")) { + in = in.substring(1); + } + return in; + } + +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/ImageLoader.java b/trustlend/src/main/java/com/dskj/trustlend/utils/ImageLoader.java new file mode 100644 index 0000000..f20dd88 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/ImageLoader.java @@ -0,0 +1,40 @@ +package com.dskj.trustlend.utils; + +/** + * ********************** + * + * @Author bug machine + * 创建时间: 2025/5/20 17:32 + * 用途 + * ********************** + */ +import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; + +import android.content.Context; +import android.widget.ImageView; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.annotation.GlideModule; +import com.bumptech.glide.module.AppGlideModule; +import com.bumptech.glide.request.RequestListener; +import com.bumptech.glide.request.RequestOptions; +import com.dskj.trustlend.model.AdBean; + +/** + * Created by Meiji on 2017/5/31. + */ +@GlideModule +public class ImageLoader extends AppGlideModule { + + /** + * 带加载异常图片 + */ + public static void loadCenterCropBanner(Context context, AdBean url, ImageView view, int defaultResId, int errorResId) { + + Glide.with(context).load(url.getImgUrl()).placeholder(defaultResId).error(errorResId).into(view); + + } + +} + + diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/LogUtils.java b/trustlend/src/main/java/com/dskj/trustlend/utils/LogUtils.java new file mode 100644 index 0000000..d9550f6 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/LogUtils.java @@ -0,0 +1,145 @@ +package com.dskj.trustlend.utils; + +import android.util.Log; + + +/** + * Log统一管理类 + * Created by xuhuixiang on 2015/10/19 0019. + */ +public class LogUtils { + + private LogUtils() { + throw new UnsupportedOperationException("cannot be instantiated"); + } + +// public static boolean isDebug = ApiService.isDebug;// 是否需要打印bug,可以在application的onCreate函数里面初始化 + public static boolean isDebug = true;// 是否需要打印bug,可以在application的onCreate函数里面初始化 + + private static final String TAG = "BIKAOVIDEO"; + + /** + * 默认tag的函数 + * + * @param msg 打印信息 + */ + public static void v(String msg) { + if (isDebug) Log.v(TAG, msg); + } + + public static void d(String msg) { + if (isDebug) Log.d(TAG, msg); + } + + public static void i(String msg) { + if (isDebug) { + if (msg.length() > 4000) { + Log.i(TAG, "BIKAOVIDEOsb.length = " + msg.length()); + int chunkCount = msg.length() / 4000; // integer division + for (int i = 0; i <= chunkCount; i++) { + int max = 4000 * (i + 1); + if (max >= msg.length()) { + Log.i(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i)); + } else { + Log.i(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max)); + } + } + } else { + Log.i(TAG, "BIKAOVIDEO" + msg.toString()); + } + } + } + + public static void w(String msg) { + if (isDebug) Log.w(TAG, msg); + } + + public static void e(String msg) { + if (isDebug) { + if (msg.length() > 4000) { + Log.e(TAG, "sb.length = " + msg.length()); + int chunkCount = msg.length() / 4000; // integer division + for (int i = 0; i <= chunkCount; i++) { + int max = 4000 * (i + 1); + if (max >= msg.length()) { + Log.e(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i)); + } else { + Log.e(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max)); + } + } + } else { + Log.e(TAG, "XHX" + msg.toString()); + } + + } + + } + + /** + * 自定义lag的函数 + * + * @param tag tag + * @param msg 打印信息 + */ + public static void v(String tag, String msg) { + if (isDebug) Log.v(tag, msg); + } + + public static void d(String tag, String msg) { + if (isDebug) Log.d(tag, msg); + } + + public static void i(String tag, String msg) { + if (isDebug) { + if (msg.length() > 4000) { + Log.i(TAG, "sb.length = " + msg.length()); + int chunkCount = msg.length() / 4000; // integer division + for (int i = 0; i <= chunkCount; i++) { + int max = 4000 * (i + 1); + if (max >= msg.length()) { + Log.i(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i)); + } else { + Log.i(TAG, "XHXchunk " + i + " of " + chunkCount + ":" + msg.substring(4000 * i, max)); + } + } + } else { + Log.i(TAG, "XHX" + msg.toString()); + } + } + } + + public static void w(String tag, String msg) { + if (isDebug) Log.w(tag, msg); + } + + public static void e(String tag, String msg) { + if (isDebug) Log.e(tag, msg); + } + + /** + * 自定义lag的函数 + * + * @param clazz 类 + * @param msg 打印信息 + */ + public static void v(Class clazz, String msg) { + if (isDebug) Log.v(clazz.getSimpleName(), msg); + } + + public static void d(Class clazz, String msg) { + if (isDebug) Log.d(clazz.getSimpleName(), msg); + } + + public static void i(Class clazz, String msg) { + if (isDebug) Log.i(clazz.getSimpleName(), msg); + } + + public static void w(Class clazz, String msg) { + if (isDebug) Log.w(clazz.getSimpleName(), msg); + } + + public static void e(Class clazz, String msg) { + if (isDebug) Log.e(clazz.getSimpleName(), msg); + } + +} \ No newline at end of file diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/NetUtil.java b/trustlend/src/main/java/com/dskj/trustlend/utils/NetUtil.java new file mode 100644 index 0000000..af8540a --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/NetUtil.java @@ -0,0 +1,115 @@ +package com.dskj.trustlend.utils; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.net.ConnectivityManager; +import android.net.NetworkInfo; +import android.util.Log; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; +import java.util.Arrays; +import java.util.Map; + +public class NetUtil { + + private NetUtil() { + } + + public static boolean isNetworkConnected() { + if (AppContextUtil.getInstance() != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) AppContextUtil.getInstance() + .getSystemService(Context.CONNECTIVITY_SERVICE); + @SuppressLint("MissingPermission") NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); + if (mNetworkInfo != null) { + return mNetworkInfo.isAvailable(); + } + } + return false; + } + + public static boolean isWifiConnected() { + if (AppContextUtil.getInstance() != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) AppContextUtil.getInstance() + .getSystemService(Context.CONNECTIVITY_SERVICE); + @SuppressLint("MissingPermission") NetworkInfo mWiFiNetworkInfo = mConnectivityManager + .getNetworkInfo(ConnectivityManager.TYPE_WIFI); + if (mWiFiNetworkInfo != null) { + return mWiFiNetworkInfo.isAvailable(); + } + } + return false; + } + + public static boolean isMobileConnected() { + if (AppContextUtil.getInstance() != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) AppContextUtil.getInstance() + .getSystemService(Context.CONNECTIVITY_SERVICE); + @SuppressLint("MissingPermission") NetworkInfo mMobileNetworkInfo = mConnectivityManager + .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); + if (mMobileNetworkInfo != null) { + return mMobileNetworkInfo.isAvailable(); + } + } + return false; + } + + public static int getConnectedType() { + if (AppContextUtil.getInstance() != null) { + ConnectivityManager mConnectivityManager = (ConnectivityManager) AppContextUtil.getInstance() + .getSystemService(Context.CONNECTIVITY_SERVICE); + @SuppressLint("MissingPermission") NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); + if (mNetworkInfo != null && mNetworkInfo.isAvailable()) { + return mNetworkInfo.getType(); + } + } + return -1; + } + + public static String getRequestSign(Map map) { + String sb = ""; + String[] key = new String[map.size()]; + int index = 0; + for (String k : map.keySet()) { + key[index] = k; + index++; + } + Arrays.sort(key); + for (String s : key) { + sb += s + "-" + map.get(s) + "|"; + } + Log.e("-main-", sb.toString()); + System.out.println("接口参数:"+ sb); + Log.i("XHXDEBUG","XHXDEBUG走了前缀MD5"); + return md5("d43f467088e5e43ef7f80816c065705e" + sb); + } + + + public static String getRequestSign(String rand_str) { + String sb = "app_id=38923465&app_secret=EAXUfHJZKzWbwWPINQTXELYdhVBQRkVm&device_id="+rand_str; + LogUtils.i("签名数据0:"+sb); + return md5(sb); + } + + + public static String md5(String content) { + byte[] hash; + try { + hash = MessageDigest.getInstance("MD5").digest(content.getBytes("UTF-8")); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("NoSuchAlgorithmException", e); + } catch (UnsupportedEncodingException e) { + throw new RuntimeException("UnsupportedEncodingException", e); + } + + StringBuilder hex = new StringBuilder(hash.length * 2); + for (byte b : hash) { + if ((b & 0xFF) < 0x10) { + hex.append("0"); + } + hex.append(Integer.toHexString(b & 0xFF)); + } + return hex.toString(); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/RxBus.java b/trustlend/src/main/java/com/dskj/trustlend/utils/RxBus.java new file mode 100644 index 0000000..cf6785f --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/RxBus.java @@ -0,0 +1,53 @@ +package com.dskj.trustlend.utils; + +import rx.Observable; +import rx.subjects.PublishSubject; +import rx.subjects.SerializedSubject; +import rx.subjects.Subject; + +public class RxBus { + + private static volatile RxBus instance; + + private final Subject bus; + + private RxBus() { + bus = new SerializedSubject<>(PublishSubject.create()); + } + + /** + * 单例模式RxBus + * + * @return + */ + public static RxBus getInstance() { + if (null == instance) { + synchronized (RxBus.class) { + if (null == instance) { + instance = new RxBus(); + } + } + } + return instance; + } + + /** + * 发送消息 + * + * @param o + */ + public void post(Object o) { + bus.onNext(o); + } + + /** + * 根据传递的 eventType 类型返回特定类型(eventType)的 被观察者 + * + * @param eventType + * @param + * @return + */ + public Observable toObservable(Class eventType) { + return bus.ofType(eventType); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/utils/ToastUtils.java b/trustlend/src/main/java/com/dskj/trustlend/utils/ToastUtils.java new file mode 100644 index 0000000..2d89e86 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/utils/ToastUtils.java @@ -0,0 +1,13 @@ +package com.dskj.trustlend.utils; + +import android.view.View; +import android.widget.Toast; + +public class ToastUtils { + public static void showShort(View context, String name){ + Toast.makeText(context.getContext(),name,Toast.LENGTH_SHORT).show(); +// SnackbarUtils.Short(context,name).gravityFrameLayout(Gravity.TOP).show(); +// Snackbar.make(context, name, Snackbar.LENGTH_SHORT).show(); +// snackbar.show(); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/view/BezierCircleHeader.java b/trustlend/src/main/java/com/dskj/trustlend/view/BezierCircleHeader.java new file mode 100644 index 0000000..b5de36a --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/view/BezierCircleHeader.java @@ -0,0 +1,364 @@ +package com.dskj.trustlend.view; + + +import android.animation.ValueAnimator; +import android.content.Context; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Path; +import android.graphics.RectF; +import android.util.AttributeSet; +import android.view.View; +import android.view.animation.AccelerateInterpolator; +import android.view.animation.DecelerateInterpolator; + +import androidx.annotation.ColorInt; +import androidx.annotation.NonNull; +import androidx.core.graphics.ColorUtils; + +import com.scwang.smart.refresh.layout.api.RefreshHeader; +import com.scwang.smart.refresh.layout.api.RefreshKernel; +import com.scwang.smart.refresh.layout.api.RefreshLayout; +import com.scwang.smart.refresh.layout.constant.SpinnerStyle; +import com.scwang.smart.refresh.layout.simple.SimpleComponent; +import com.scwang.smart.refresh.layout.util.SmartUtil; + +/** + * CircleRefresh + * Created by scwang on 2018/7/18. + * from https://github.com/tuesda/CircleRefreshLayout + */ +public class BezierCircleHeader extends SimpleComponent implements RefreshHeader { + + // + protected Path mPath; + protected Paint mBackPaint; + protected Paint mFrontPaint; + protected Paint mOuterPaint; + protected int mHeight; + protected float mWaveHeight; + protected float mHeadHeight; + protected float mSpringRatio; + protected float mFinishRatio; + + protected float mBollY;//弹出球体的Y坐标 + protected float mBollRadius;//球体半径 + protected boolean mShowOuter; + protected boolean mShowBoll;//是否显示中心球体 + protected boolean mShowBollTail;//是否显示球体拖拽的尾巴 + + protected int mRefreshStop = 90; + protected int mRefreshStart = 90; + protected boolean mOuterIsStart = true; + + protected static final int TARGET_DEGREE = 270; + protected boolean mWavePulling = false; + protected RefreshKernel mKernel; + // + + // + public BezierCircleHeader(Context context) { + this(context, null); + } + + public BezierCircleHeader(Context context, AttributeSet attrs) { + super(context, attrs, 0); + + mSpinnerStyle = SpinnerStyle.FixedBehind; + final View thisView = this; + thisView.setMinimumHeight(SmartUtil.dp2px(100)); + mBackPaint = new Paint(); + mBackPaint.setColor(0xff11bbff); + mBackPaint.setAntiAlias(true); + mFrontPaint = new Paint(); + mFrontPaint.setColor(0xffffffff); + mFrontPaint.setAntiAlias(true); + mOuterPaint = new Paint(); + mOuterPaint.setAntiAlias(true); + mOuterPaint.setColor(0xffffffff); + mOuterPaint.setStyle(Paint.Style.STROKE); + mOuterPaint.setStrokeWidth(SmartUtil.dp2px(2f)); + mPath = new Path(); + } + // + + // + @Override + protected void dispatchDraw(Canvas canvas) { + final View thisView = this; + final int viewWidth = thisView.getWidth(); + final int viewHeight = mHeight;//thisView.getHeight(); + //noinspection EqualsBetweenInconvertibleTypes + final boolean footer = mKernel != null && (this.equals(mKernel.getRefreshLayout().getRefreshFooter())); + + if (footer) { + canvas.save(); + canvas.translate(0, thisView.getHeight()); + canvas.scale(1, -1); + } + + if (thisView.isInEditMode()) { + mShowBoll = true; + mShowOuter = true; + mHeadHeight = viewHeight; + mRefreshStop = 270; + mBollY = mHeadHeight / 2; + mBollRadius = mHeadHeight / 6; + } + + drawWave(canvas, viewWidth, viewHeight); + drawSpringUp(canvas, viewWidth); + drawBoll(canvas, viewWidth); + drawOuter(canvas, viewWidth); + drawFinish(canvas, viewWidth); + + if (footer) { + canvas.restore(); + } + + super.dispatchDraw(canvas); + } + + protected void drawWave(Canvas canvas, int viewWidth, int viewHeight) { + float baseHeight = Math.min(mHeadHeight, viewHeight); + if (mWaveHeight != 0) { + mPath.reset(); + mPath.lineTo(viewWidth, 0); + mPath.lineTo(viewWidth, baseHeight); + mPath.quadTo(viewWidth / 2f, baseHeight + mWaveHeight * 2, 0, baseHeight); + mPath.close(); + canvas.drawPath(mPath, mBackPaint); + } else { + canvas.drawRect(0, 0, viewWidth, baseHeight, mBackPaint); + } + } + + protected void drawSpringUp(Canvas canvas, int viewWidth) { + if (mSpringRatio > 0) { + float leftX = (viewWidth / 2f - 4 * mBollRadius + mSpringRatio * 3 * mBollRadius); + if (mSpringRatio < 0.9) { + mPath.reset(); + mPath.moveTo(leftX, mBollY); + mPath.quadTo(viewWidth / 2f, mBollY - mBollRadius * mSpringRatio * 2, + viewWidth - leftX, mBollY); + canvas.drawPath(mPath, mFrontPaint); + } else { + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + } + } + } + + protected void drawBoll(Canvas canvas, int viewWidth) { + if (mShowBoll) { + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + + drawBollTail(canvas, viewWidth, (mHeadHeight + mWaveHeight) / mHeadHeight); + } + } + + protected void drawBollTail(Canvas canvas, int viewWidth, float fraction) { + if (mShowBollTail) { + final float bottom = mHeadHeight + mWaveHeight; + final float startY = mBollY + mBollRadius * fraction / 2; + final float startX = viewWidth / 2f + (float) Math.sqrt(mBollRadius * mBollRadius * (1 - fraction * fraction / 4)); + final float bezier1x = (viewWidth / 2f + (mBollRadius * 3 / 4) * (1 - fraction)); + final float bezier2x = bezier1x + mBollRadius; + + mPath.reset(); + mPath.moveTo(startX, startY); + mPath.quadTo(bezier1x, bottom, bezier2x, bottom); + mPath.lineTo(viewWidth - bezier2x, bottom); + mPath.quadTo(viewWidth - bezier1x, bottom, viewWidth - startX, startY); + canvas.drawPath(mPath, mFrontPaint); + } + } + + protected void drawOuter(Canvas canvas, int viewWidth) { + if (mShowOuter) { + float outerR = mBollRadius + mOuterPaint.getStrokeWidth() * 2; + + mRefreshStart += mOuterIsStart ? 3 : 10; + mRefreshStop += mOuterIsStart ? 10 : 3; + mRefreshStart = mRefreshStart % 360; + mRefreshStop = mRefreshStop % 360; + + int swipe = mRefreshStop - mRefreshStart; + swipe = swipe < 0 ? swipe + 360 : swipe; + + canvas.drawArc(new RectF(viewWidth / 2f - outerR, mBollY - outerR, viewWidth / 2f + outerR, mBollY + outerR), + mRefreshStart, swipe, false, mOuterPaint); + if (swipe >= TARGET_DEGREE) { + mOuterIsStart = false; + } else if (swipe <= 10) { + mOuterIsStart = true; + } + final View thisView = this; + thisView.invalidate(); + } + + } + + protected void drawFinish(Canvas canvas, int viewWidth) { + if (mFinishRatio > 0) { + int beforeColor = mOuterPaint.getColor(); + if (mFinishRatio < 0.3) { + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + int outerR = (int) (mBollRadius + mOuterPaint.getStrokeWidth() * 2 * (1+mFinishRatio / 0.3f)); + int afterColor = ColorUtils.setAlphaComponent(beforeColor, (int) (0xff * (1 - mFinishRatio / 0.3f))); + mOuterPaint.setColor(afterColor); + canvas.drawArc(new RectF(viewWidth / 2f - outerR, mBollY - outerR, viewWidth / 2f + outerR, mBollY + outerR), + 0, 360, false, mOuterPaint); + } + mOuterPaint.setColor(beforeColor); + + if (mFinishRatio >= 0.3 && mFinishRatio < 0.7) { + float fraction = (mFinishRatio - 0.3f) / 0.4f; + mBollY = (int) (mHeadHeight / 2 + (mHeadHeight - mHeadHeight / 2) * fraction); + canvas.drawCircle(viewWidth / 2f, mBollY, mBollRadius, mFrontPaint); + if (mBollY >= mHeadHeight - mBollRadius * 2) { + mShowBollTail = true; + drawBollTail(canvas, viewWidth, fraction); + } + mShowBollTail = false; + } + + if (mFinishRatio >= 0.7 && mFinishRatio <= 1) { + float fraction = (mFinishRatio - 0.7f) / 0.3f; + int leftX = (int) (viewWidth / 2f - mBollRadius - 2 * mBollRadius * fraction); + mPath.reset(); + mPath.moveTo(leftX, mHeadHeight); + mPath.quadTo(viewWidth / 2f, mHeadHeight - (mBollRadius * (1 - fraction)), + viewWidth - leftX, mHeadHeight); + canvas.drawPath(mPath, mFrontPaint); + } + } + } + // + + // + @Override + public void onInitialized(@NonNull RefreshKernel kernel, int height, int maxDragHeight) { + mKernel = kernel; + } + + @Override + public void onMoving(boolean isDragging, float percent, int offset, int height, int maxDragHeight) { + mHeight = offset; + if (isDragging || mWavePulling) { + mWavePulling = true; + mHeadHeight = height; + mWaveHeight = Math.max(offset - height, 0) * .8f; + } + this.invalidate(); + } + + @Override + public void onReleased(@NonNull RefreshLayout refreshLayout, int height, int maxDragHeight) { + mWavePulling = false; + mHeadHeight = height; + mBollRadius = height / 6f; + DecelerateInterpolator interpolator = new DecelerateInterpolator(); + final float reboundHeight = Math.min(mWaveHeight * 0.8f, mHeadHeight / 2); + ValueAnimator waveAnimator = ValueAnimator.ofFloat( + mWaveHeight, 0, + -(reboundHeight*1.0f),0, + -(reboundHeight*0.4f),0 + ); + waveAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + float speed = 0; + float springBollY; + float springRatio = 0; + int status = 0;//0 还没开始弹起 1 向上弹起 2 在弹起的最高点停住 + @Override + public void onAnimationUpdate(ValueAnimator animation) { + float curValue = (float) animation.getAnimatedValue(); + if (status == 0 && curValue <= 0) { + status = 1; + speed = Math.abs(curValue - mWaveHeight); + } + if (status == 1) { + springRatio = -curValue / reboundHeight; + if (springRatio >= mSpringRatio) { + mSpringRatio = springRatio; + mBollY = mHeadHeight + curValue; + speed = Math.abs(curValue - mWaveHeight); + } else { + status = 2; + mSpringRatio = 0; + mShowBoll = true; + mShowBollTail = true; + springBollY = mBollY; + } + } + if (status == 2) { + if (mBollY > mHeadHeight / 2) { + mBollY = Math.max(mHeadHeight / 2, mBollY - speed); + float bally = animation.getAnimatedFraction() * (mHeadHeight / 2 - springBollY) + springBollY; + if (mBollY > bally) { + mBollY = bally; + } + } + } + if (mShowBollTail && curValue < mWaveHeight) { + mShowOuter = true; + mShowBollTail = false; + mOuterIsStart = true; + mRefreshStart = 90; + mRefreshStop = 90; + } + if (!mWavePulling) { + mWaveHeight = curValue; + final View thisView = BezierCircleHeader.this; + thisView.invalidate(); + } + } + }); + waveAnimator.setInterpolator(interpolator); + waveAnimator.setDuration(1000); + waveAnimator.start(); + } + + @Override + public int onFinish(@NonNull RefreshLayout layout, boolean success) { + mShowBoll = false; + mShowOuter = false; + final int DURATION_FINISH = 800; //动画时长 + ValueAnimator animator = ValueAnimator.ofFloat(0, 1); + animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { + @Override + public void onAnimationUpdate(ValueAnimator animation) { + final View thisView = BezierCircleHeader.this; + mFinishRatio = (float) animation.getAnimatedValue(); + thisView.invalidate(); + } + }); + animator.setInterpolator(new AccelerateInterpolator()); + animator.setDuration(DURATION_FINISH); + animator.start(); + return DURATION_FINISH; + } + + /** + * @param colors 对应Xml中配置的 srlPrimaryColor srlAccentColor + * @deprecated 只由框架调用 + * 使用者使用 {@link RefreshLayout#setPrimaryColorsId(int...)} + */ + @Override + @Deprecated + public void setPrimaryColors(@ColorInt int ... colors) { + if (colors.length > 0) { + mBackPaint.setColor(colors[0]); + if (colors.length > 1) { + mFrontPaint.setColor(colors[1]); + mOuterPaint.setColor(colors[1]); + } + } + } + +// @NonNull +// @Override +// public SpinnerStyle getSpinnerStyle() { +// return SpinnerStyle.Scale; +// } + // +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/view/CircleImageView.java b/trustlend/src/main/java/com/dskj/trustlend/view/CircleImageView.java new file mode 100644 index 0000000..a7d9c32 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/view/CircleImageView.java @@ -0,0 +1,323 @@ +package com.dskj.trustlend.view; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.content.res.TypedArray; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Matrix; +import android.graphics.Paint; +import android.graphics.PorterDuff; +import android.graphics.PorterDuffXfermode; +import android.graphics.RectF; +import android.graphics.drawable.BitmapDrawable; +import android.graphics.drawable.Drawable; +import android.util.AttributeSet; +import android.view.MotionEvent; + +import androidx.appcompat.widget.AppCompatImageView; + +import com.dskj.trustlend.R; + + +public class CircleImageView extends AppCompatImageView { + // paint when user press + private Paint pressPaint; + private int width; + private int height; + + // default bitmap config + private static final Bitmap.Config BITMAP_CONFIG = Bitmap.Config.ARGB_8888; + private static final int COLORDRAWABLE_DIMENSION = 1; + + // border color + private int borderColor; + // width of border + private int borderWidth; + // alpha when pressed + private int pressAlpha; + // color when pressed + private int pressColor; + // radius + private int radius; + // rectangle or round, 1 is circle, 2 is rectangle + private int shapeType; + + public CircleImageView(Context context) { + super(context); + init(context, null); + } + + public CircleImageView(Context context, AttributeSet attrs) { + super(context, attrs); + init(context, attrs); + } + + public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + init(context, attrs); + } + + + private void init(Context context, AttributeSet attrs) { + //init the value + borderWidth = 0; + borderColor = 0xddffffff; + pressAlpha = 0x42; + pressColor = 0x42000000; + radius = 16; + shapeType = 0; + + // get attribute of EaseImageView + if (attrs != null) { + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.CircleImageView); + borderColor = array.getColor(R.styleable.CircleImageView_ease_border_color, borderColor); + borderWidth = array.getDimensionPixelOffset(R.styleable.CircleImageView_ease_border_width, borderWidth); + pressAlpha = array.getInteger(R.styleable.CircleImageView_ease_press_alpha, pressAlpha); + pressColor = array.getColor(R.styleable.CircleImageView_ease_press_color, pressColor); + radius = array.getDimensionPixelOffset(R.styleable.CircleImageView_ease_radius, radius); + shapeType = array.getInteger(R.styleable.CircleImageView_es_shape_type, shapeType); + array.recycle(); + } + + // set paint when pressed + pressPaint = new Paint(); + pressPaint.setAntiAlias(true); + pressPaint.setStyle(Paint.Style.FILL); + pressPaint.setColor(pressColor); + pressPaint.setAlpha(0); + pressPaint.setFlags(Paint.ANTI_ALIAS_FLAG); + + setDrawingCacheEnabled(true); + setWillNotDraw(false); + } + + @Override + protected void onDraw(Canvas canvas) { + + if (shapeType == 0) { + super.onDraw(canvas); + return; + } + Drawable drawable = getDrawable(); + if (drawable == null) { + return; + } + // the width and height is in xml file + if (getWidth() == 0 || getHeight() == 0) { + return; + } + Bitmap bitmap = getBitmapFromDrawable(drawable); + drawDrawable(canvas, bitmap); + + if (isClickable()) { + drawPress(canvas); + } + drawBorder(canvas); + } + + /** + * draw Rounded Rectangle + * + * @param canvas + * @param bitmap + */ + @SuppressLint("WrongConstant") + private void drawDrawable(Canvas canvas, Bitmap bitmap) { + Paint paint = new Paint(); + paint.setColor(0xffffffff); + paint.setAntiAlias(true); //smooths out the edges of what is being drawn + PorterDuffXfermode xfermode = new PorterDuffXfermode(PorterDuff.Mode.SRC_IN); + // set flags + int saveFlags = Canvas.ALL_SAVE_FLAG + ; + canvas.saveLayer(0, 0, width, height, null, saveFlags); + + if (shapeType == 1) { + canvas.drawCircle(width / 2, height / 2, width / 2 - 1, paint); + } else if (shapeType == 2) { + RectF rectf = new RectF(1, 1, getWidth() - 1, getHeight() - 1); + canvas.drawRoundRect(rectf, radius + 1, radius + 1, paint); + } + + paint.setXfermode(xfermode); + + float scaleWidth = ((float) getWidth()) / bitmap.getWidth(); + float scaleHeight = ((float) getHeight()) / bitmap.getHeight(); + + Matrix matrix = new Matrix(); + matrix.postScale(scaleWidth, scaleHeight); + + //bitmap scale + bitmap = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); + + canvas.drawBitmap(bitmap, 0, 0, paint); + canvas.restore(); + } + + /** + * draw the effect when pressed + * + * @param canvas + */ + private void drawPress(Canvas canvas) { + // check is rectangle or circle + if (shapeType == 1) { + canvas.drawCircle(width / 2, height / 2, width / 2 - 1, pressPaint); + } else if (shapeType == 2) { + RectF rectF = new RectF(1, 1, width - 1, height - 1); + canvas.drawRoundRect(rectF, radius + 1, radius + 1, pressPaint); + } + } + + /** + * draw customized border + * + * @param canvas + */ + private void drawBorder(Canvas canvas) { + if (borderWidth > 0) { + Paint paint = new Paint(); + paint.setStrokeWidth(borderWidth); + paint.setStyle(Paint.Style.STROKE); + paint.setColor(borderColor); + paint.setAntiAlias(true); + // // check is rectangle or circle + if (shapeType == 1) { + canvas.drawCircle(width / 2, height / 2, (width - borderWidth) / 2, paint); + } else if (shapeType == 2) { + RectF rectf = new RectF(borderWidth / 2, borderWidth / 2, getWidth() - borderWidth / 2, + getHeight() - borderWidth / 2); + canvas.drawRoundRect(rectf, radius, radius, paint); + } + } + } + + /** + * monitor the size change + * + * @param w + * @param h + * @param oldw + * @param oldh + */ + @Override + protected void onSizeChanged(int w, int h, int oldw, int oldh) { + super.onSizeChanged(w, h, oldw, oldh); + width = w; + height = h; + } + + /** + * monitor if touched + * + * @param event + * @return + */ + @Override + public boolean onTouchEvent(MotionEvent event) { + switch (event.getAction()) { + case MotionEvent.ACTION_DOWN: + pressPaint.setAlpha(pressAlpha); + invalidate(); + break; + case MotionEvent.ACTION_UP: + pressPaint.setAlpha(0); + invalidate(); + break; + case MotionEvent.ACTION_MOVE: + + break; + default: + pressPaint.setAlpha(0); + invalidate(); + break; + } + return super.onTouchEvent(event); + } + + /** + * @param drawable + * @return + */ + private Bitmap getBitmapFromDrawable(Drawable drawable) { + if (drawable == null) { + return null; + } + + if (drawable instanceof BitmapDrawable) { + return ((BitmapDrawable) drawable).getBitmap(); + } + + Bitmap bitmap; + int width = Math.max(drawable.getIntrinsicWidth(), 2); + int height = Math.max(drawable.getIntrinsicHeight(), 2); + try { + bitmap = Bitmap.createBitmap(width, height, BITMAP_CONFIG); + Canvas canvas = new Canvas(bitmap); + drawable.setBounds(0, 0, canvas.getWidth(), canvas.getHeight()); + drawable.draw(canvas); + } catch (IllegalArgumentException e) { + e.printStackTrace(); + bitmap = null; + } + return bitmap; + } + + /** + * set border color + * + * @param borderColor + */ + public void setBorderColor(int borderColor) { + this.borderColor = borderColor; + invalidate(); + } + + /** + * set border width + * + * @param borderWidth + */ + public void setBorderWidth(int borderWidth) { + this.borderWidth = borderWidth; + } + + /** + * set alpha when pressed + * + * @param pressAlpha + */ + public void setPressAlpha(int pressAlpha) { + this.pressAlpha = pressAlpha; + } + + /** + * set color when pressed + * + * @param pressColor + */ + public void setPressColor(int pressColor) { + this.pressColor = pressColor; + } + + /** + * set radius + * + * @param radius + */ + public void setRadius(int radius) { + this.radius = radius; + invalidate(); + } + + /** + * set shape,1 is circle, 2 is rectangle + * + * @param shapeType + */ + public void setShapeType(int shapeType) { + this.shapeType = shapeType; + invalidate(); + } +} diff --git a/trustlend/src/main/java/com/dskj/trustlend/view/NestedScrollableHost.java b/trustlend/src/main/java/com/dskj/trustlend/view/NestedScrollableHost.java new file mode 100644 index 0000000..079b268 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/view/NestedScrollableHost.java @@ -0,0 +1,145 @@ +package com.dskj.trustlend.view; + + +import android.content.Context; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewConfiguration; +import android.view.ViewParent; +import android.widget.FrameLayout; + +import androidx.annotation.Nullable; +import androidx.viewpager2.widget.ViewPager2; + +import java.util.HashMap; + +/** + * 此类用于解决 ViewPager2 嵌套 ViewPager2 或者 RecyclerView 等相互嵌套的冲突问题, + */ +public class NestedScrollableHost extends FrameLayout { + + private int touchSlop; + private float initialX; + private float initialY; + private HashMap _$_findViewCache; + + private final ViewPager2 getParentViewPager() { + ViewParent var10000 = this.getParent(); + if (!(var10000 instanceof View)) { + var10000 = null; + } + + View v; + for (v = (View) var10000; v != null && !(v instanceof ViewPager2); v = (View) var10000) { + var10000 = v.getParent(); + if (!(var10000 instanceof View)) { + var10000 = null; + } + } + + View var2 = v; + if (!(v instanceof ViewPager2)) { + var2 = null; + } + + return (ViewPager2) var2; + } + + private final View getChild() { + return this.getChildCount() > 0 ? this.getChildAt(0) : null; + } + + private final boolean canChildScroll(int orientation, float delta) { + boolean var5 = false; + int direction = -((int) Math.signum(delta)); + View var10000; + boolean var6 = false; + switch (orientation) { + case 0: + var10000 = this.getChild(); + var6 = var10000 != null ? var10000.canScrollHorizontally(direction) : false; + break; + case 1: + var10000 = this.getChild(); + var6 = var10000 != null ? var10000.canScrollVertically(direction) : false; + break; + default: + // throw (Throwable)(new IllegalArgumentException()); + } + + return var6; + } + + @Override + public boolean onInterceptTouchEvent(MotionEvent e) { + this.handleInterceptTouchEvent(e); + return super.onInterceptTouchEvent(e); + } + + private final void handleInterceptTouchEvent(MotionEvent e) { + ViewPager2 var10000 = this.getParentViewPager(); + if (var10000 != null) { + int orientation = var10000.getOrientation(); + if (this.canChildScroll(orientation, -1.0F) || this.canChildScroll(orientation, 1.0F)) { + if (e.getAction() == 0) { + this.initialX = e.getX(); + this.initialY = e.getY(); + this.getParent().requestDisallowInterceptTouchEvent(true); + } else if (e.getAction() == 2) { + float dx = e.getX() - this.initialX; + float dy = e.getY() - this.initialY; + boolean isVpHorizontal = orientation == 0; + boolean var8 = false; + float scaledDx = Math.abs(dx) * (isVpHorizontal ? 0.5F : 1.0F); + boolean var9 = false; + float scaledDy = Math.abs(dy) * (isVpHorizontal ? 1.0F : 0.5F); + if (scaledDx > (float) this.touchSlop || scaledDy > (float) this.touchSlop) { + if (isVpHorizontal == scaledDy > scaledDx) { + this.getParent().requestDisallowInterceptTouchEvent(false); + } else if (this.canChildScroll(orientation, isVpHorizontal ? dx : dy)) { + this.getParent().requestDisallowInterceptTouchEvent(true); + } else { + this.getParent().requestDisallowInterceptTouchEvent(false); + } + } + } + + } + } + } + + public NestedScrollableHost(Context context) { + super(context); + ViewConfiguration var10001 = ViewConfiguration.get(this.getContext()); + this.touchSlop = var10001.getScaledTouchSlop(); + } + + public NestedScrollableHost(Context context, @Nullable AttributeSet attrs) { + super(context, attrs); + ViewConfiguration var10001 = ViewConfiguration.get(this.getContext()); + this.touchSlop = var10001.getScaledTouchSlop(); + } + + public View _$_findCachedViewById(int var1) { + if (this._$_findViewCache == null) { + this._$_findViewCache = new HashMap(); + } + + View var2 = (View) this._$_findViewCache.get(var1); + if (var2 == null) { + var2 = this.findViewById(var1); + this._$_findViewCache.put(var1, var2); + } + + return var2; + } + + public void _$_clearFindViewByIdCache() { + if (this._$_findViewCache != null) { + this._$_findViewCache.clear(); + } + + } +} + diff --git a/trustlend/src/main/java/com/dskj/trustlend/view/StatusLayout.java b/trustlend/src/main/java/com/dskj/trustlend/view/StatusLayout.java new file mode 100644 index 0000000..e9f2783 --- /dev/null +++ b/trustlend/src/main/java/com/dskj/trustlend/view/StatusLayout.java @@ -0,0 +1,44 @@ +package com.dskj.trustlend.view; + +import android.content.Context; +import android.util.AttributeSet; +import android.view.ViewGroup; +import android.widget.LinearLayout; + +import androidx.annotation.Nullable; + +/** + * Created by kiun_2007 on 2018/3/29. + */ + +public class StatusLayout extends LinearLayout { + public StatusLayout(Context context) { + this(context, null); + } + + public StatusLayout(Context context, @Nullable AttributeSet attrs) { + this(context, attrs, 0); + } + + public StatusLayout(Context context, @Nullable AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + private int getStatusBarHeight(Context context) { + int result = 0; + int resourceId = context.getResources().getIdentifier("status_bar_height", "dimen", "android"); + if (resourceId > 0) { + result = context.getResources().getDimensionPixelSize(resourceId); + } + return result; + } + + @Override + protected void onAttachedToWindow() { + ViewGroup.LayoutParams lp = this.getLayoutParams(); + lp.width = -1; + lp.height = getStatusBarHeight(getContext()); + this.setLayoutParams(lp); + super.onAttachedToWindow(); + } +} diff --git a/trustlend/src/main/res/color/select_color.xml b/trustlend/src/main/res/color/select_color.xml new file mode 100644 index 0000000..7c5e6d8 --- /dev/null +++ b/trustlend/src/main/res/color/select_color.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/drawable/big_bg.xml b/trustlend/src/main/res/drawable/big_bg.xml new file mode 100644 index 0000000..60d95de --- /dev/null +++ b/trustlend/src/main/res/drawable/big_bg.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/button_bg_false.xml b/trustlend/src/main/res/drawable/button_bg_false.xml new file mode 100644 index 0000000..0d900de --- /dev/null +++ b/trustlend/src/main/res/drawable/button_bg_false.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/button_bg_true.xml b/trustlend/src/main/res/drawable/button_bg_true.xml new file mode 100644 index 0000000..401c15f --- /dev/null +++ b/trustlend/src/main/res/drawable/button_bg_true.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/button_jindu_true.xml b/trustlend/src/main/res/drawable/button_jindu_true.xml new file mode 100644 index 0000000..6e1d823 --- /dev/null +++ b/trustlend/src/main/res/drawable/button_jindu_true.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/button_jindu_true1.xml b/trustlend/src/main/res/drawable/button_jindu_true1.xml new file mode 100644 index 0000000..f586895 --- /dev/null +++ b/trustlend/src/main/res/drawable/button_jindu_true1.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/button_jindu_true2.xml b/trustlend/src/main/res/drawable/button_jindu_true2.xml new file mode 100644 index 0000000..ef483d3 --- /dev/null +++ b/trustlend/src/main/res/drawable/button_jindu_true2.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/cursor_style.xml b/trustlend/src/main/res/drawable/cursor_style.xml new file mode 100644 index 0000000..d10903c --- /dev/null +++ b/trustlend/src/main/res/drawable/cursor_style.xml @@ -0,0 +1,6 @@ + + + + + diff --git a/trustlend/src/main/res/drawable/dialog_background.xml b/trustlend/src/main/res/drawable/dialog_background.xml new file mode 100644 index 0000000..3f98a7c --- /dev/null +++ b/trustlend/src/main/res/drawable/dialog_background.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/dialog_background1.xml b/trustlend/src/main/res/drawable/dialog_background1.xml new file mode 100644 index 0000000..46a7fc1 --- /dev/null +++ b/trustlend/src/main/res/drawable/dialog_background1.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/dlg_input_video_bg.xml b/trustlend/src/main/res/drawable/dlg_input_video_bg.xml new file mode 100644 index 0000000..24cdb8e --- /dev/null +++ b/trustlend/src/main/res/drawable/dlg_input_video_bg.xml @@ -0,0 +1,9 @@ + + + + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/dot_btn_false.xml b/trustlend/src/main/res/drawable/dot_btn_false.xml new file mode 100644 index 0000000..75a7f89 --- /dev/null +++ b/trustlend/src/main/res/drawable/dot_btn_false.xml @@ -0,0 +1,9 @@ + + + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/dot_btn_true.xml b/trustlend/src/main/res/drawable/dot_btn_true.xml new file mode 100644 index 0000000..d32c2cd --- /dev/null +++ b/trustlend/src/main/res/drawable/dot_btn_true.xml @@ -0,0 +1,8 @@ + + + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/ic_launcher_background.xml b/trustlend/src/main/res/drawable/ic_launcher_background.xml new file mode 100644 index 0000000..07d5da9 --- /dev/null +++ b/trustlend/src/main/res/drawable/ic_launcher_background.xml @@ -0,0 +1,170 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/ic_launcher_foreground.xml b/trustlend/src/main/res/drawable/ic_launcher_foreground.xml new file mode 100644 index 0000000..2b068d1 --- /dev/null +++ b/trustlend/src/main/res/drawable/ic_launcher_foreground.xml @@ -0,0 +1,30 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/inputbg_false.xml b/trustlend/src/main/res/drawable/inputbg_false.xml new file mode 100644 index 0000000..a1c5876 --- /dev/null +++ b/trustlend/src/main/res/drawable/inputbg_false.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/inputbg_tre.xml b/trustlend/src/main/res/drawable/inputbg_tre.xml new file mode 100644 index 0000000..ad25072 --- /dev/null +++ b/trustlend/src/main/res/drawable/inputbg_tre.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/inputbg_tre2.xml b/trustlend/src/main/res/drawable/inputbg_tre2.xml new file mode 100644 index 0000000..398e841 --- /dev/null +++ b/trustlend/src/main/res/drawable/inputbg_tre2.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/inputbg_tree.xml b/trustlend/src/main/res/drawable/inputbg_tree.xml new file mode 100644 index 0000000..aff4343 --- /dev/null +++ b/trustlend/src/main/res/drawable/inputbg_tree.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/drawable/radio_button.xml b/trustlend/src/main/res/drawable/radio_button.xml new file mode 100644 index 0000000..6b55a39 --- /dev/null +++ b/trustlend/src/main/res/drawable/radio_button.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/trustlend/src/main/res/drawable/select_attack.xml b/trustlend/src/main/res/drawable/select_attack.xml new file mode 100644 index 0000000..2bc60da --- /dev/null +++ b/trustlend/src/main/res/drawable/select_attack.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/drawable/select_goods.xml b/trustlend/src/main/res/drawable/select_goods.xml new file mode 100644 index 0000000..a0bdb68 --- /dev/null +++ b/trustlend/src/main/res/drawable/select_goods.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/drawable/select_home.xml b/trustlend/src/main/res/drawable/select_home.xml new file mode 100644 index 0000000..3867aff --- /dev/null +++ b/trustlend/src/main/res/drawable/select_home.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/drawable/select_me.xml b/trustlend/src/main/res/drawable/select_me.xml new file mode 100644 index 0000000..dc1514e --- /dev/null +++ b/trustlend/src/main/res/drawable/select_me.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/drawable/shape_line_dash.xml b/trustlend/src/main/res/drawable/shape_line_dash.xml new file mode 100644 index 0000000..e09560a --- /dev/null +++ b/trustlend/src/main/res/drawable/shape_line_dash.xml @@ -0,0 +1,10 @@ + + + + + \ No newline at end of file diff --git a/trustlend/src/main/res/drawable/white_bg_true.xml b/trustlend/src/main/res/drawable/white_bg_true.xml new file mode 100644 index 0000000..9b1be54 --- /dev/null +++ b/trustlend/src/main/res/drawable/white_bg_true.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/drawable/white_bg_true1.xml b/trustlend/src/main/res/drawable/white_bg_true1.xml new file mode 100644 index 0000000..8163ea2 --- /dev/null +++ b/trustlend/src/main/res/drawable/white_bg_true1.xml @@ -0,0 +1,7 @@ + + + + + + + diff --git a/trustlend/src/main/res/layout/activity_about_us.xml b/trustlend/src/main/res/layout/activity_about_us.xml new file mode 100644 index 0000000..498636a --- /dev/null +++ b/trustlend/src/main/res/layout/activity_about_us.xml @@ -0,0 +1,239 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/trustlend/src/main/res/layout/activity_edit_user.xml b/trustlend/src/main/res/layout/activity_edit_user.xml new file mode 100644 index 0000000..e18a7ac --- /dev/null +++ b/trustlend/src/main/res/layout/activity_edit_user.xml @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +