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