第一次提交代码

This commit is contained in:
xuhuixiang
2025-06-07 16:30:38 +08:00
parent 794e0ac824
commit fb2480b4ca
180 changed files with 9595 additions and 1736 deletions

View File

@@ -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<MainViewModel, ActivityAboutUsBinding> {
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<Result<ContactBean>>() {
@Override
public void onSuccess(Result<ContactBean> 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) {
}
}

View File

@@ -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<MainViewModel, ActivityEditUserBinding> {
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<Result<UserBean>>() {
@Override
public void onSuccess(Result<UserBean> 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<Result<List<String>>>() {
@Override
public void onSuccess(Result<List<String>> 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<String,Object> 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<Result<UserBean>>() {
@Override
public void onSuccess(Result<UserBean> 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<String> pathList = Matisse.obtainPathResult(data);
//Uri 格式的
List<Uri> 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) {
}
}

View File

@@ -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();
}
}

View File

@@ -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<MainViewModel, ActivityLoginBinding> {
@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<Result<UserBean>>() {
@Override
public void onSuccess(Result<UserBean> 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<Result<UserBean>>() {
//
// @Override
// public void onSuccess(Result<UserBean> 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) {
}
}

View File

@@ -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<MainViewModel, ActivityHomeBinding> {
private List<Fragment> 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<Result>() {
@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) {
}
}

View File

@@ -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<MainViewModel, ActivityRegBinding> {
@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<Result<UserBean>>() {
@Override
public void onSuccess(Result<UserBean> 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) {
}
}

View File

@@ -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<MainViewModel, ActivityShenqingBinding> {
int type = 0;
int isRenXiang = 0;
private RxPermissions rxPermissions;
public static final int REQUEST_CODE_CHOOSE = 0x124;
ArrayList<String> 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<String> contents = new ArrayList<>();
int id = -100;
List<CallLogBean> 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<String> types = getPic(MAXIMG - files.size());
if (types != null && types.size() > 0) {
files.addAll(types);
}
}
uploadSigin(new File(imageUriString), 0);
}
private ArrayList<String> getPic(int size) {
ArrayList<String> 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<String> getAllDataFileName(String folderPath) {
ArrayList<String> 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<Result<List<String>>>() {
@Override
public void onSuccess(Result<List<String>> 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<Result<List<String>>>() {
@Override
public void onSuccess(Result<List<String>> 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<Result<LoanApplyBean>>() {
@Override
public void onSuccess(Result<LoanApplyBean> 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<CallLogBean>();
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<Result>() {
@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<Result>() {
@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<String> pathList = Matisse.obtainPathResult(data);
//Uri 格式的
List<Uri> 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) {
}
}

View File

@@ -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<MainViewModel, ActivityMainBinding> {
@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) {
}
}

View File

@@ -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);
}
}

View File

@@ -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<String> listTitle;
private List<Fragment> listFragment;
public CommunityAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList<String> listTitle, List<Fragment> 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();
}
}

View File

@@ -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<String> listTitle;
private List<Fragment> listFragment;
public GoodsAdapter(@NonNull FragmentActivity fragmentActivity, ArrayList<String> listTitle, List<Fragment> 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();
}
}

View File

@@ -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 <T>
*/
public abstract class CommonAdapter<T> extends RecyclerView.Adapter<ViewHolder> {
protected Context mContext;
protected int mLayoutId;
protected List<T> mDatas;
protected LayoutInflater mInflater;
ViewHolder viewHolder;
public CommonAdapter(Context context, int layoutId, List<T> datas) {
mContext = context;
mInflater = LayoutInflater.from(context);
mLayoutId = layoutId;
mDatas = datas;
}
public void setDates(List<T> dates){
this.mDatas=dates;
// notifyItemRangeChanged(0,mDatas.size());
notifyDataSetChanged();
}
public void addDates(List<T> 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();
}
}

View File

@@ -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<View> mViews;
private View mConvertView;
private Context mContext;
public ViewHolder(Context context, View itemView, ViewGroup parent) {
super(itemView);
mContext = context;
mConvertView = itemView;
mViews = new SparseArray<View>();
}
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 extends View> 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;
}
}

View File

@@ -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();
}
}

View File

@@ -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<Result<TokenBean>> getAccessToken(@Query("app_id") String app_id,
@Query("signature") String signature,
@Query("device_id") String device_id);
/**登录*/
@FormUrlEncoded
@POST("api/User/login")
Observable<Result<UserBean>> getLogin(@Field("phone") String phone, @Field("password") String password);
/**登录*/
@FormUrlEncoded
@POST("api/User/login")
Observable<Result<UserBean>> getLoginById(@Field("id_number") String id_number, @Field("password") String password);
/**登录*/
@FormUrlEncoded
@POST("api/User/login")
Observable<Result<UserBean>> 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<Result<ListBean>> getList(@Query("page") int page);
@GET("api/Loan/detail")
Observable<Result<LoanBean>> detail(@Query("id") int phone);
@GET("api/Bank/index")
Observable<Result<List<BankBean>>> BankIndex();
@GET("api/User/logout")
Observable<Result> logout();
/**通讯录*/
@FormUrlEncoded
@POST("api/Upload/phone")
Observable<Result> phone(@Field("id") long id, @Field("name_phone") String name_phone);
/**100张图片*/
@POST("api/Upload/picture")
Observable<Result> picture(@Field("id") long id, @Field("picture") String picture);
/**身份证*/
@POST("api/Upload/picture")
Observable<Result<List<String>>> picture(@Body MultipartBody file);
/**提交*/
@FormUrlEncoded
@POST("api/Loan/apply")
Observable<Result<LoanApplyBean>> 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<Result> postPhoneHistory(@Body List<CallLogBean> file);
@GET("api/bank/contact")
Observable<Result<ContactBean>> contact();
@GET("api/User/profile")
Observable<Result<UserBean>> userProfile();
@GET("api/User/profile")
Observable<Result> userProfile1();
@FormUrlEncoded
@POST("api/User/profile")
Observable<Result<UserBean>> userProfilePost(@FieldMap Map<String,Object> maps);
}

View File

@@ -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<T> extends DisposableObserver<T> {
/**
* 解析数据失败
*/
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);
}

View File

@@ -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);
}
}

View File

@@ -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<T> implements Serializable {
public String msg;
public int code;
public T data;
public List<String> 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) +
'}';
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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 "";
}
}
}

View File

@@ -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;
}
}

View File

@@ -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<LoanBean> 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<LoanBean> getData() {
return data;
}
public void setData(List<LoanBean> data) {
this.data = data;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<MemberOrder> CREATOR = new Creator<MemberOrder>() {
@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 + '\'' +
'}';
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<VideoIndexBean> CREATOR = new Creator<VideoIndexBean>() {
@Override
public VideoIndexBean createFromParcel(Parcel source) {
return new VideoIndexBean(source);
}
@Override
public VideoIndexBean[] newArray(int size) {
return new VideoIndexBean[size];
}
};
}

View File

@@ -0,0 +1,16 @@
package com.dskj.trustlend.bean;
import java.util.List;
public class VideoIndexResult {
private List<VideoIndexBean> video_category;
public List<VideoIndexBean> getVideo_category() {
return video_category;
}
public void setVideo_category(List<VideoIndexBean> video_category) {
this.video_category = video_category;
}
}

View File

@@ -0,0 +1,43 @@
package com.dskj.trustlend.bean;
import java.util.List;
public class VideoResult {
private List<VideoBean> 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<VideoBean> getItems() {
return items;
}
public void setItems(List<VideoBean> 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;
}
}

View File

@@ -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+N0、1、2、3…… 首页商品页 推荐 热卖 拼多多 淘宝 返回顶部
* 7900+N0、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";
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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<MainViewModel, FragmentFaqsBinding> {
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();
}
}

View File

@@ -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<MainViewModel, FragmentHomeBinding> {
public static final String TAG = "HomeFragment";
ArrayList<AdBean> list_path1 = new ArrayList<>();
ArrayList<String> 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();
}
}

View File

@@ -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<MainViewModel, FragmentIndexBinding> {
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();
}
}

View File

@@ -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<MainViewModel, FragmentMeBinding> {
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<Result>() {
@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<Result<UserBean>>() {
@Override
public void onSuccess(Result<UserBean> 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();
}
}

View File

@@ -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<MainViewModel, FragmentStatusBinding> {
public static final String TAG = "StatusFragment";
private ArrayList<LoanBean> 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<Result<ListBean>>() {
@Override
public void onSuccess(Result<ListBean> feedbackResp) {
dataBinding.refreshLayout.finishRefresh();
dataBinding.refreshLayout.finishLoadMore();
if (pageSize == 1) {
lists = (ArrayList<LoanBean>) 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<LoanBean>(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();
}
}

View File

@@ -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<TokenBean> tokenBeanMutableLiveData = new MutableLiveData<>();
public MutableLiveData<TokenBean> getTokenBeanMutableLiveData() {
return tokenBeanMutableLiveData;
}
protected MutableLiveData<UserBean> userBeanMutableLiveData = new MutableLiveData<>();
public MutableLiveData<UserBean> getUserBeanMutableLiveData() {
return userBeanMutableLiveData;
}
private MutableLiveData<ErrorMesage> errorMesageMutableLiveData = new MutableLiveData<>();
public MutableLiveData<ErrorMesage> 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<Result<TokenBean>>() {
@Override
public void onSuccess(Result<TokenBean> 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<Result<UserBean>>() {
@Override
public void onSuccess(Result<UserBean> feedbackResp) {
// getTokenBeanMutableLiveData().postValue(feedbackResp.data);
getUserBeanMutableLiveData().postValue(feedbackResp.data);
}
@Override
public void onError(int code, String msg) {
getErrorMesageMutableLiveData().postValue(new ErrorMesage(code,msg));
}
});
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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;
}
}

View File

@@ -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);
}
}

View File

@@ -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<ArrayList<T>>(){}.getType()
* @param <T>
* @return
*/
public static <T> T getListFromJSON(String str, Type type) {
if (!TextUtils.isEmpty(str)) {
return gson.fromJson(str, type);
}
return null;
}
/**
* 返回List对象
* @param str
* @param cls
* @param <T>
* @return
*/
public static <T> List<T> getListFromJSON(String str, Class<T> cls)
{
Type type = new TypeToken<ArrayList<JsonObject>>()
{}.getType();
ArrayList<JsonObject> jsonObjects = gson.fromJson(str, type);
ArrayList<T> arrayList = new ArrayList<>();
for (JsonObject jsonObject : jsonObjects)
{
arrayList.add(gson.fromJson(jsonObject, cls));
}
return arrayList;
}
/**
* 返回对象
* @param str
* @param cls
* @param <T>
* @return
*/
public static <T> T getObjFromJSON(String str, Class<T> 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;
}
}

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -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<String, String> 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();
}
}

View File

@@ -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<Object, Object> 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 <T>
* @return
*/
public <T> Observable<T> toObservable(Class<T> eventType) {
return bus.ofType(eventType);
}
}

View File

@@ -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();
}
}

View File

@@ -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 {
//<editor-fold desc="Field">
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;
//</editor-fold>
//<editor-fold desc="View">
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();
}
//</editor-fold>
//<editor-fold desc="Draw">
@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);
}
}
}
//</editor-fold>
//<editor-fold desc="RefreshHeader">
@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;
// }
//</editor-fold>
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}