package com.doumee.keyCabinet.ui.keyCabinet;
|
|
import androidx.annotation.Nullable;
|
import androidx.appcompat.app.AppCompatActivity;
|
|
import android.os.Bundle;
|
import android.os.Handler;
|
import android.os.Message;
|
import android.text.SpannableString;
|
import android.text.Spanned;
|
import android.text.TextUtils;
|
import android.text.style.TextAppearanceSpan;
|
import android.view.View;
|
import android.widget.TextView;
|
import android.widget.Toast;
|
|
import com.bumptech.glide.Glide;
|
import com.doumee.keyCabinet.MApplication;
|
import com.doumee.keyCabinet.R;
|
import com.doumee.keyCabinet.base.MyBaseActivity;
|
import com.doumee.keyCabinet.dao.DaoManager;
|
import com.doumee.keyCabinet.dao.FingerPrintDo;
|
import com.doumee.keyCabinet.databinding.ZwlrActivityBinding;
|
import com.doumee.keyCabinet.event.HttpEvent;
|
import com.doumee.keyCabinet.event.RefreshFingerEvent;
|
import com.doumee.keyCabinet.event.TimeClockEvent;
|
import com.doumee.keyCabinet.ui.keyCabinet.adapter.ZwListRcvAdapter;
|
import com.doumee.keyCabinet.ui.keyCabinet.adapter.ZwLrRcvAdapter;
|
import com.doumee.keyCabinet.utils.PhotoUtils;
|
import com.doumee.keyCabinet.utils.usb.DevComm;
|
import com.doumee.keyCabinet.utils.usb.IUsbConnState;
|
import com.doumee.lib_coremodel.bean.event.ActionEventData;
|
import com.doumee.lib_coremodel.http.utils.FrescoUtils;
|
import com.doumee.lib_coremodel.util.RecyclerHelp;
|
import com.example.datalibrary.model.User;
|
|
import org.greenrobot.eventbus.EventBus;
|
import org.greenrobot.eventbus.Subscribe;
|
import org.greenrobot.eventbus.ThreadMode;
|
|
import java.util.List;
|
|
import dagger.hilt.android.AndroidEntryPoint;
|
|
@AndroidEntryPoint
|
public class ZWLRActivity extends MyBaseActivity<ZWLRVM, ZwlrActivityBinding> {
|
private ZwLrRcvAdapter adapter;
|
private int userId;
|
private String userName;
|
private String userPic;
|
private String groupId;
|
private FingerPrintDo delFinger;
|
private Handler handler = new Handler(){
|
@Override
|
public void handleMessage(Message msg) {
|
switch (msg.what){
|
case 0:
|
getDB().clOk.setVisibility(View.GONE);
|
break;
|
}
|
}
|
};
|
|
@Override
|
public int getLayoutId() {
|
return R.layout.zwlr_activity;
|
}
|
|
@Override
|
public void initView(@Nullable Bundle savedInstanceState) {
|
isAddCountTimer = false;
|
normalConfig();
|
getDB().setModel(getVM());
|
adapter = new ZwLrRcvAdapter(this, R.layout.zwlr_rcv_item, new ZwLrRcvAdapter.OnItemClick() {
|
@Override
|
public void onItemDelete(FingerPrintDo item) {
|
if(delFinger==null){
|
delFinger = item;
|
deleteID(item.getFingerId());
|
}
|
}
|
});
|
RecyclerHelp.bindVL(this,getDB().recyclerView,0,false);
|
getDB().recyclerView.setAdapter(adapter);
|
userName = getStringFormBundle("userName");
|
groupId = getStringFormBundle("groupId");
|
userId = getIntFormBundle("userId");
|
if(userId==0){
|
Toast.makeText(mContext, "用户id错误", Toast.LENGTH_SHORT).show();
|
finish();
|
return;
|
}
|
userPic = getStringFormBundle("userPic");
|
getDB().tvName.setText(userName);
|
//PhotoUtils.datasToBitmap(this,userPic,getDB().sim);
|
FrescoUtils.displayImageFresco(userPic,getDB().sim);
|
getDB().tvJg2.setText(getErrPhoneText(), TextView.BufferType.SPANNABLE);
|
}
|
|
@Override
|
public void initData(@Nullable Bundle savedInstanceState) {
|
getDatas();
|
initDev();
|
}
|
|
private void getDatas(){
|
List<FingerPrintDo> printDos = DaoManager.getFingerPrintDao().getFingerByMemberId(userId);
|
if(printDos.size()>0) {
|
adapter.refreshData(printDos);
|
getVM().emptyVisibility.set(View.GONE);
|
if(printDos.size()>=3){
|
getDB().tvAdd.setVisibility(View.GONE);
|
}else {
|
getDB().tvAdd.setVisibility(View.VISIBLE);
|
}
|
}else {
|
getDB().tvAdd.setVisibility(View.VISIBLE);
|
getVM().emptyVisibility.set(View.VISIBLE);
|
}
|
}
|
|
@Override
|
protected void doRegister(int type, ActionEventData data) {
|
switch (type){
|
case 1:
|
//新增指纹
|
getDB().clTip.setVisibility(View.GONE);
|
getDB().clZw.setVisibility(View.VISIBLE);
|
getDB().tvZwTip.setText("请将手指放置在指纹采集器上进行录入");
|
tipDownCount = 60;
|
isShowTip = true;
|
enrollBtn();
|
break;
|
case 5:
|
getDB().nsv.setVisibility(getDB().nsv.getVisibility()==View.VISIBLE?View.GONE:View.VISIBLE);
|
break;
|
case 55:
|
getVM().infoObs.set("");
|
break;
|
default:
|
break;
|
}
|
}
|
|
private void showFingerTip(String tip){
|
if(!isFinishing()){
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
if(TextUtils.isEmpty(tip)){
|
getDB().tvZwTip.setText("请将手指放置在指纹采集器上进行录入");
|
}else {
|
getDB().tvZwTip.setText(tip);
|
}
|
}
|
});
|
}
|
}
|
|
private void showErrTip(String tip){
|
if(!isFinishing()){
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
//显示提示
|
getDB().clTip.setVisibility(View.VISIBLE);
|
getDB().clZw.setVisibility(View.GONE);
|
if(TextUtils.isEmpty(tip)){
|
getDB().tvJg1.setText("指纹录入失败,请重新录入");
|
}else {
|
getDB().tvJg1.setText(tip);
|
}
|
tipDownCount = 30;
|
isShowTip = true;
|
}
|
});
|
}
|
}
|
|
private void lrcg(int fingerId){
|
if(!isFinishing()){
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
getVM().addInfo("录入指纹:id="+fingerId);
|
//成功
|
getDB().clTip.setVisibility(View.GONE);
|
getDB().clZw.setVisibility(View.GONE);
|
getDB().clOk.setVisibility(View.VISIBLE);
|
handler.sendEmptyMessageDelayed(0,1000);
|
//新增指纹记录
|
FingerPrintDo addDo = new FingerPrintDo();
|
addDo.setMemberId(userId);
|
addDo.setMemberName(userName);
|
addDo.setGroupId(groupId);
|
addDo.setFingerId(fingerId);
|
addDo.setFace(userPic);
|
DaoManager.getFingerPrintDao().insert(addDo);
|
getDatas();
|
EventBus.getDefault().post(new RefreshFingerEvent());
|
}
|
});
|
}
|
}
|
|
private void showToast(String msg){
|
if(!isFinishing()){
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
Toast.makeText(mContext, msg, Toast.LENGTH_SHORT).show();
|
}
|
});
|
}
|
}
|
|
|
private SpannableString getErrPhoneText(){
|
String phone = MApplication.getConfigBean().getLinkPhone();
|
if(phone==null){
|
String text = "如有问题请联系管理员";
|
SpannableString styledText = new SpannableString(text);
|
styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
return styledText;
|
}
|
String text = "如有问题请联系管理员"+phone;
|
SpannableString styledText = new SpannableString(text);
|
styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip3), 0, text.length()-phone.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip1), text.length()-phone.length()+1, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
|
return styledText;
|
}
|
|
private int tipDownCount = 60;
|
private boolean isShowTip;
|
@Subscribe
|
public void TimeClockEvent(TimeClockEvent e){
|
if(isShowTip){
|
getDB().tvDjs.setVisibility(View.VISIBLE);
|
getDB().tvTitle.setVisibility(View.GONE);
|
if(tipDownCount==0){
|
isShowTip = false;
|
getDB().tvDjs.setVisibility(View.GONE);
|
finish();
|
}else {
|
tipDownCount--;
|
getDB().tvDjs.setText(tipDownCount+"s");
|
}
|
}
|
}
|
|
@Override
|
protected void onDestroy() {
|
super.onDestroy();
|
handler.removeCallbacksAndMessages(null);
|
handler = null;
|
mBCancel = true;
|
if(mDevComm!=null){
|
mDevComm.CloseComm();
|
}
|
}
|
|
@Subscribe(threadMode = ThreadMode.MAIN)
|
public void HttpEvent(HttpEvent e){
|
if(!isFinishing()){
|
getVM().addInfo(e.getMsg());
|
}
|
}
|
private static DevComm mDevComm;
|
//最大指纹数
|
private int maxFpCount = 500;
|
//是否结束录入
|
private boolean mBCancel = true;
|
private byte[] m_binImage = new byte[1024 * 100];
|
private byte[] m_bmpImage = new byte[1024 * 100];
|
private int m_nParam, m_nImgWidth, m_nImgHeight;
|
|
private final IUsbConnState m_IConnectionHandler = new IUsbConnState() {
|
@Override
|
public void onUsbConnected() {
|
String[] w_strInfo = new String[1];
|
if (mDevComm.Run_TestConnection() == DevComm.ERR_SUCCESS) {
|
if (mDevComm.Run_GetDeviceInfo(w_strInfo) == DevComm.ERR_SUCCESS) {
|
getVM().addInfo("连接usb成功");
|
}else {
|
getVM().addInfo("连接设备失败1," + mDevComm.Run_GetDeviceInfo(w_strInfo));
|
}
|
} else {
|
getVM().addInfo("连接设备失败2," + mDevComm.Run_TestConnection());
|
}
|
}
|
|
@Override
|
public void onUsbPermissionDenied() {
|
Toast.makeText(mContext, "无设备权限", Toast.LENGTH_SHORT).show();
|
}
|
|
@Override
|
public void onDeviceNotFound() {
|
Toast.makeText(mContext, "未发现设备", Toast.LENGTH_SHORT).show();
|
}
|
};
|
|
private void initDev(){
|
mDevComm = new DevComm(this, m_IConnectionHandler);
|
openDevice();
|
}
|
|
/**
|
* 开启设备
|
*/
|
private void openDevice() {
|
String[] w_strInfo = new String[1];
|
|
if (mDevComm != null) {
|
if (!mDevComm.IsInit()) {
|
if (mDevComm.OpenComm("USB", 19200) == false) {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
getVM().addInfo("初始化设备失败");
|
}
|
});
|
return;
|
}
|
}
|
if (mDevComm.Run_TestConnection() == DevComm.ERR_SUCCESS) {
|
if (mDevComm.Run_GetDeviceInfo(w_strInfo) == DevComm.ERR_SUCCESS) {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
getVM().addInfo("开启设备成功");
|
}
|
});
|
} else {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
getVM().addInfo("连接设备失败3," + mDevComm.Run_GetDeviceInfo(w_strInfo));
|
}
|
});
|
}
|
} else {
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
getVM().addInfo("连接设备失败4,"+mDevComm.Run_TestConnection());
|
}
|
});
|
mDevComm.CloseComm();
|
}
|
}
|
}
|
|
|
/**
|
* 录入指纹
|
*/
|
private void enrollBtn() {
|
int w_nRet;
|
int[] w_nState = new int[1];
|
|
if (!mDevComm.IsInit())
|
return;
|
int m_nUserID = getEmptyID();
|
EventBus.getDefault().post(new HttpEvent("userId="+m_nUserID));
|
if (m_nUserID > (maxFpCount) || m_nUserID < 1) {
|
Toast.makeText(mContext, "已达到最大指纹数", Toast.LENGTH_SHORT).show();
|
return;
|
}
|
|
// Check if fp is exist
|
w_nRet = mDevComm.Run_GetStatus(m_nUserID, w_nState);
|
|
if (w_nRet != DevComm.ERR_SUCCESS) {
|
Toast.makeText(mContext, DevComm.GetErrorMsg(w_nRet), Toast.LENGTH_SHORT).show();
|
return;
|
}
|
|
if (w_nState[0] == DevComm.GD_TEMPLATE_NOT_EMPTY) {
|
Toast.makeText(mContext, "模板已存在", Toast.LENGTH_SHORT).show();
|
return;
|
}
|
|
mDevComm.Run_SLEDControl(1);
|
mBCancel = false;
|
new Thread(new Runnable() {
|
int w_nRet, w_nUserID, w_nEnrollStep = 0, w_nGenCount = 3;
|
int[] w_nDupID = new int[1];
|
int[] w_nWidth = new int[1];
|
int[] w_nHeight = new int[1];
|
|
@Override
|
public void run() {
|
|
w_nUserID = m_nUserID;
|
|
while (w_nEnrollStep < w_nGenCount) {
|
if(w_nEnrollStep==1) {
|
showFingerTip("请第二次将手指放置在指纹采集器上进行录入");
|
}else if(w_nEnrollStep==2) {
|
showFingerTip("请第三次将手指放置在指纹采集器上进行录入");
|
}
|
EventBus.getDefault().post(new HttpEvent(String.format("输入手指 #%d!", w_nEnrollStep + 1)));
|
// 获取指纹
|
if (capturing() < 0)
|
return;
|
EventBus.getDefault().post(new HttpEvent("松开你的手指"));
|
showFingerTip("请松开你的手指");
|
// Up Cpatured Image
|
if (mDevComm.m_nConnected == 2) {
|
w_nRet = mDevComm.Run_UpImage(0, m_binImage, w_nWidth, w_nHeight);
|
|
if (w_nRet != DevComm.ERR_SUCCESS) {
|
EventBus.getDefault().post(new HttpEvent(DevComm.GetErrorMsg(w_nRet)));
|
return;
|
}
|
|
// Draw image
|
m_nImgWidth = w_nWidth[0];
|
m_nImgHeight = w_nHeight[0];
|
}
|
|
//生成指纹
|
w_nRet = mDevComm.Run_Generate(w_nEnrollStep);
|
|
if (w_nRet != DevComm.ERR_SUCCESS) {
|
if (w_nRet == DevComm.ERR_BAD_QUALITY) {
|
EventBus.getDefault().post(new HttpEvent("质量不佳。请重试"));
|
showErrTip("质量不佳。请重试");
|
continue;
|
} else {
|
EventBus.getDefault().post(new HttpEvent(DevComm.GetErrorMsg(w_nRet)));
|
showErrTip(DevComm.GetErrorMsg(w_nRet));
|
return;
|
}
|
}
|
w_nEnrollStep++;
|
}
|
|
// 合成指纹
|
if (w_nGenCount != 1) {
|
//. Merge Template
|
w_nRet = mDevComm.Run_Merge(0, w_nGenCount);
|
|
if (w_nRet != DevComm.ERR_SUCCESS) {
|
EventBus.getDefault().post(new HttpEvent(DevComm.GetErrorMsg(w_nRet)));
|
showErrTip(DevComm.GetErrorMsg(w_nRet));
|
return;
|
}
|
}
|
|
//. Store template
|
w_nRet = mDevComm.Run_StoreChar(w_nUserID, 0, w_nDupID);
|
|
if (w_nRet != DevComm.ERR_SUCCESS) {
|
if (w_nRet == DevComm.ERR_DUPLICATION_ID) {
|
showErrTip("指纹已录入,不能重复录入");
|
}else{
|
showErrTip("");
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
Toast.makeText(ZWLRActivity.this, DevComm.GetErrorMsg(w_nRet), Toast.LENGTH_SHORT).show();
|
}
|
});
|
}
|
} else{
|
lrcg(w_nUserID);
|
}
|
}
|
}).start();
|
}
|
|
/**
|
* 获取空指纹id
|
* @return
|
*/
|
private int getEmptyID() {
|
int w_nRet;
|
int[] w_nEmptyID = new int[1];
|
|
if (!mDevComm.IsInit())
|
return -1;
|
|
w_nRet = mDevComm.Run_GetEmptyID(1, maxFpCount, w_nEmptyID);
|
|
if (w_nRet != DevComm.ERR_SUCCESS) {
|
Toast.makeText(mContext, DevComm.GetErrorMsg(w_nRet), Toast.LENGTH_SHORT).show();
|
return -1;
|
}
|
return w_nEmptyID[0];
|
}
|
|
/**
|
* 获取指纹
|
* @return
|
*/
|
private int capturing() {
|
int w_nRet;
|
while (true) {
|
if(isFinishing()){
|
break;
|
}
|
w_nRet = mDevComm.Run_GetImage();
|
|
if (w_nRet == DevComm.ERR_CONNECTION) {
|
showErrTip("通信错误!");
|
return -1;
|
} else if (w_nRet == DevComm.ERR_SUCCESS)
|
break;
|
|
if (mBCancel) {
|
return -1;
|
}
|
}
|
return 0;
|
}
|
|
private void deleteID(int fingerId) {
|
int m_nUserID = fingerId;
|
int w_nRet;
|
|
if (!mDevComm.IsInit())
|
return;
|
|
w_nRet = mDevComm.Run_DelChar(m_nUserID, m_nUserID);
|
|
if (w_nRet != DevComm.ERR_SUCCESS&&w_nRet!=DevComm.ERR_TMPL_EMPTY) {
|
//模板不存在的也算删除
|
delFinger = null;
|
showToast(DevComm.GetErrorMsg(w_nRet));
|
return;
|
}
|
showToast("删除成功");
|
runOnUiThread(new Runnable() {
|
@Override
|
public void run() {
|
DaoManager.getFingerPrintDao().delete(delFinger);
|
delFinger = null;
|
getDatas();
|
EventBus.getDefault().post(new RefreshFingerEvent());
|
}
|
});
|
}
|
|
|
}
|