From 221c873ee48ed5f44680578d32b0bbf19fd9e4c1 Mon Sep 17 00:00:00 2001
From: weimingfei <fei_gaming@sina.com>
Date: 星期六, 18 十月 2025 15:23:59 +0800
Subject: [PATCH] 钥匙柜

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java |  330 +++++++++++++++++++++++++++++++++++++++++++++---------
 1 files changed, 273 insertions(+), 57 deletions(-)

diff --git a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
index e1e7a17..fcac3d4 100644
--- a/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -8,10 +8,15 @@
 import android.graphics.Bitmap;
 import android.graphics.drawable.BitmapDrawable;
 import android.hardware.Camera;
+import android.hardware.usb.UsbDevice;
+import android.hardware.usb.UsbManager;
 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.util.DisplayMetrics;
 import android.view.Gravity;
 import android.view.LayoutInflater;
@@ -19,6 +24,7 @@
 import android.view.ViewGroup;
 import android.widget.PopupWindow;
 import android.widget.RelativeLayout;
+import android.widget.TextView;
 import android.widget.Toast;
 
 import androidx.annotation.NonNull;
@@ -38,14 +44,21 @@
 import com.doumee.keyCabinet.BuildConfig;
 import com.doumee.keyCabinet.base.BannerPicResponsePara;
 import com.doumee.keyCabinet.bean.FaceUserBean;
+import com.doumee.keyCabinet.bean.LoginBean;
 import com.doumee.keyCabinet.databinding.MainActivityBinding;
 import com.doumee.keyCabinet.event.GetFacesEvent;
+import com.doumee.keyCabinet.event.HeartEvent;
+import com.doumee.keyCabinet.event.KeyDoorEvent;
+import com.doumee.keyCabinet.event.KeyResultEvent;
+import com.doumee.keyCabinet.event.KeyStatusListener;
+import com.doumee.keyCabinet.event.OpenGridEvent;
 import com.doumee.keyCabinet.event.ReLoginEvent;
 import com.doumee.keyCabinet.event.TimeClockEvent;
 import com.doumee.keyCabinet.ui.face.ActivationActivity;
 import com.doumee.keyCabinet.ui.face.FaceActivity;
 import com.doumee.keyCabinet.ui.guide.GuideActivity;
 import com.doumee.keyCabinet.ui.keyCabinet.ChangeUrlActivity;
+import com.doumee.keyCabinet.ui.keyCabinet.KeyCabinetActivity;
 import com.doumee.keyCabinet.ui.keyCabinet.ManageLoginActivity;
 import com.doumee.keyCabinet.ui.service.FaceUpdateService;
 import com.doumee.keyCabinet.ui.service.HeartbeatService;
@@ -64,6 +77,9 @@
 import com.doumee.keyCabinet.utils.face.ImportFileManager;
 import com.doumee.keyCabinet.utils.face.RegisterConfigUtils;
 import com.doumee.keyCabinet.utils.face.model.SingleBaseConfig;
+import com.doumee.keyCabinet.utils.i485.SerialPortModel;
+import com.doumee.keyCabinet.utils.i485.SerialPortReadObserver;
+import com.doumee.keyCabinet.utils.i485.SportUtils;
 import com.doumee.keyCabinet.utils.update.PermissionUtils;
 import com.doumee.keyCabinet.utils.update.PermissiondDialog;
 import com.doumee.keyCabinet.utils.update.UpdateUtil;
@@ -84,12 +100,15 @@
 import com.example.datalibrary.view.PreviewTexture;
 import com.yanzhenjie.permission.runtime.Permission;
 import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Logger;
 import org.greenrobot.eventbus.Subscribe;
 
 import java.util.ArrayList;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Random;
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.concurrent.Executors;
@@ -130,15 +149,15 @@
             if(!isFinishing()){
                 switch (msg.what) {
                     case 0:
-                    initM();
+                    //initM();
                     TimeUtils.updateTimeUi(getVM().dayObs, getVM().timeObs);
                     handler.sendEmptyMessageDelayed(0, 1000);
                     EventBus.getDefault().post(new TimeClockEvent());
-                    if (isDBLoad && isNeedUpdateFace && !isUpdatingFace) {
+                    /*if (isDBLoad && isNeedUpdateFace && !isUpdatingFace) {
                         isNeedUpdateFace = false;
                         getVM().getFaceLD();
                     }
-                    getVM().upBraceletLog();
+                    getVM().upBraceletLog();*/
                     case 2:
                         getVM().resetReq();
                         break;
@@ -155,19 +174,21 @@
 
     @Override
     public void initView(@Nullable Bundle savedInstanceState) {
-        //isToGuild = true;
+        isAddCountTimer = false;
         SpUtil.initWH(this);
         normalConfig();
         getDB().setModel(getVM());
         //initRGBCheck();
+        handler.sendEmptyMessageDelayed(0, 1000);
         //鍚姩蹇冭烦
         Intent intent = new Intent(MainActivity.this, HeartbeatService.class);
         startService(intent);
         //鍚姩鏇存柊浜鸿劯
         Intent intent2 = new Intent(MainActivity.this, FaceUpdateService.class);
         startService(intent2);
-        //getPermission();
-        //getDB().tvName.setText(String.format(getString(R.string.main_name),MApplication.getConfigBean().getName(), LMobileInfo.getDeviceUniqueId()));
+        getPermission();
+        Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
+        initPort();
     }
 
     private void initM(){
@@ -225,6 +246,44 @@
                 }
             }
         });
+        getDB().tv1.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //绠$悊鍛樼櫥褰�
+                if(lastDownTime1!=null){
+                    if(System.currentTimeMillis()-lastDownTime1>1000){
+                        downCount1=0;
+                    }
+                }
+                lastDownTime1 = System.currentTimeMillis();
+                downCount1++;
+                System.out.println();
+                Timber.tag("==>").d(""+downCount1);
+                if(downCount1>4) {
+                    downCount1=0;
+                    lastDownTime1=null;
+                    startActivity(ManageLoginActivity.class);
+                }
+            }
+        });
+        getDB().tvId.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //鏇存敼url
+                if(lastDownTime2!=null){
+                    if(System.currentTimeMillis()-lastDownTime2>1000){
+                        downCount2=0;
+                    }
+                }
+                lastDownTime2 = System.currentTimeMillis();
+                downCount2++;
+                if(downCount2>4) {
+                    downCount2=0;
+                    lastDownTime2=null;
+                    startActivity(ChangeUrlActivity.class);
+                }
+            }
+        });
         upErrInfo();
         getVM().devHeart();
         BraceletLogUtils.saveLog("app鎵撳紑");
@@ -273,45 +332,26 @@
     @Override
     protected void doRegister(int type, ActionEventData data) {
         switch (type){
-            case 1:
-                {
-                    //绠$悊鍛樼櫥褰�
-                    if(lastDownTime1!=null){
-                        if(System.currentTimeMillis()-lastDownTime1>1000){
-                            downCount1=0;
-                        }
-                    }
-                    lastDownTime1 = System.currentTimeMillis();
-                    downCount1++;
-                    if(downCount1>4) {
-                        downCount1=0;
-                        lastDownTime1=null;
-                        startActivity(ManageLoginActivity.class);
-                    }
-                }
-                break;
             case 2:
             case 3:
-                Bundle b = new Bundle();
-                b.putString("flag",type==2?"0":"1");
-                startActivity(FaceActivity.class,b);
+                /*tipDownCount = 10;
+                isShowTip = true;
+                getDB().tvDjs.setText(tipDownCount+"s");
+                getDB().tvTip21.setText(getTipText("AC101"), TextView.BufferType.SPANNABLE);
+                getDB().clTip.setVisibility(View.VISIBLE);*/
+                //鏍¢獙鏄惁鐧诲綍
+                if(MApplication.getConfigBean().getId()==null){
+                    Toast.makeText(mContext, "璁惧鏈坊鍔狅紝鏃犳硶鎿嶄綔", Toast.LENGTH_SHORT).show();
+                    getVM().devLogin();
+                    return;
+                }
+                MApplication.getLoginBean().setFlag(type==2?0:1);
+                startActivity(FaceActivity.class);
+                //startActivity(KeyCabinetActivity.class,b);
                 break;
             case 4:
-                {
-                    //鏇存敼url
-                    if(lastDownTime2!=null){
-                        if(System.currentTimeMillis()-lastDownTime2>1000){
-                            downCount2=0;
-                        }
-                    }
-                    lastDownTime2 = System.currentTimeMillis();
-                    downCount2++;
-                    if(downCount2>4) {
-                        downCount2=0;
-                        lastDownTime2=null;
-                        startActivity(ChangeUrlActivity.class);
-                    }
-                }
+                isShowTip = false;
+                getDB().clTip.setVisibility(View.GONE);
                 break;
             default:
                 break;
@@ -322,7 +362,7 @@
     protected void onResume() {
         super.onResume();
         showTime = System.currentTimeMillis();
-        MApplication.saveMemberBean(new MemberBean());
+        MApplication.setLoginBean(new LoginBean());
         if(!isFaceOk) {
             //initLicense();
         }
@@ -355,6 +395,8 @@
         handler = null;
         faceHandler.removeCallbacksAndMessages(null);
         faceHandler = null;
+        portHandler.removeCallbacksAndMessages(null);
+        portHandler = null;
     }
 
     private void restartApp(){
@@ -606,14 +648,6 @@
                             //缁撴潫
                             isUpdatingFace = false;
                             //System.out.println("==UpdatingFace==>鏇存柊缁撴潫锛�");
-                            FaceUserBean bean = selectBeans.get(selectBeans.size()-1);
-                            if(!TextUtils.isEmpty(bean.getEditTime())){
-                                Date date = StringUtil.StrToDate(bean.getEditTime());
-                                Calendar cal = Calendar.getInstance();
-                                cal.setTime(date);
-                                cal.add(Calendar.SECOND,1);
-                                SpUtil.saveString("LastTime",StringUtil.DateToStr(cal.getTime()));
-                            }
                             // 娓呴櫎鍐呭瓨缂撳瓨
                             Glide.get(MainActivity.this).clearMemory();
                         }
@@ -642,7 +676,7 @@
     private int repeatCount = 0;
     private void updateFace(FaceUserBean bean){
         Timber.d("==UpdatingFace==>瀹屾垚鏁伴噺 "+finishCount);
-        if (TextUtils.isEmpty(bean.getFaceUrl())||bean.getFaceUrl().endsWith("null")) {
+        if (TextUtils.isEmpty(bean.getFaceImg())||bean.getFaceImg().endsWith("null")) {
             finishCount++;
             faceHandler.sendEmptyMessage(0);
             return;
@@ -651,7 +685,7 @@
         //System.out.println("==UpdatingFace==>寮�濮嬶細" + bean.getName());
         Glide.with(this)
                 .asBitmap()
-                .load(bean.getFaceUrl())
+                .load(bean.getFaceImg())
                 .addListener(new RequestListener<Bitmap>() {
                     @Override
                     public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
@@ -695,10 +729,10 @@
                                 if (ret == 128) {
                                     Timber.d("==UpdatingFace==>鍥剧墖鐗瑰緛鎶藉彇鎴愬姛: %s", JSON.toJSONString(bean));
                                     User user = new User();
-                                    user.setUserId(bean.getId());
-                                    user.setGroupId(bean.getType());
-                                    user.setUserName(bean.getName());
-                                    user.setImageName(bean.getFaceUrl());
+                                    user.setUserId(bean.getMemberId());
+                                    user.setGroupId(bean.getGroupId());
+                                    user.setUserName(bean.getMemberName());
+                                    user.setImageName(bean.getFaceImg());
                                     user.setUserInfo(GsonTools.changeGsonToJson(bean));
                                     user.setFeature(secondFeature);
                                     insertOrUpdate(user);
@@ -952,12 +986,57 @@
         }
     }
 
+    private int tipDownCount = 10;
+    private boolean isShowTip;
     @Subscribe
     public void TimeClockEvent(TimeClockEvent e){
-
+        if(isShowTip){
+            if(tipDownCount==0){
+                isShowTip = false;
+                getDB().clTip.setVisibility(View.GONE);
+            }else {
+                tipDownCount--;
+                getDB().tvDjs.setText(tipDownCount+"s");
+            }
+        }
     }
 
+    /**
+     * 鐩戝惉寮�闂�
+     * @param e
+     */
+    @Subscribe
+    public void OpenGridEvent(OpenGridEvent e){
+        if(!isFinishing()){
+            EventBus.getDefault().post(new KeyDoorEvent(MApplication.nextBoolean()?"0":"1"));
+        }
+    }
 
+    /**
+     * 鐩戝惉閽ュ寵
+     * @param e
+     */
+    @Subscribe
+    public void KeyStatusListener(KeyStatusListener e){
+        if(!isFinishing()){
+            if(e.getStatus()==0){
+                //寮�濮�
+                Random random = new Random();
+                EventBus.getDefault().post(new KeyResultEvent(random.nextBoolean()?"0":"1"));
+            }else {
+                //缁撴潫
+            }
+        }
+    }
+
+    private SpannableString getTipText(String name){
+        String text = name+"鏌滈棬鏈叧闂�";
+        SpannableString styledText = new SpannableString(text);
+        styledText.setSpan(new TextAppearanceSpan(this, R.style.style_tip1),
+                0, name.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        styledText.setSpan(new TextAppearanceSpan(this,R.style.style_tip2), name.length()+1, text.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
+        return styledText;
+    }
 
     @Override
     protected void onRestart() {
@@ -965,6 +1044,143 @@
         getVM().devHeart();
     }
 
+    @Subscribe
+    public void HeartEvent(HeartEvent e){
+        if(!isFinishing()){
+            getVM().devHeart();
+        }
+    }
 
+    private SerialPortModel gridPort;
+    private SerialPortReadObserver gridReadObserver = new SerialPortReadObserver() {
+        @Override
+        public void onResult(String result) {
 
+        }
+
+        @Override
+        public void onResultBytes(byte[] bytes) {
+            if(gridPort!=null && !gridPort.isOk()){
+                gridPort.setOk(true);
+            }
+        }
+    };
+    private SerialPortModel keyPort;
+    private SerialPortReadObserver keyReadObserver = new SerialPortReadObserver() {
+        @Override
+        public void onResult(String result) {
+
+        }
+
+        @Override
+        public void onResultBytes(byte[] bytes) {
+            if(keyPort!=null && !keyPort.isOk()){
+                keyPort.setOk(true);
+            }
+        }
+    };
+    private SerialPortModel jiuPort;
+    private SerialPortReadObserver jiuReadObserver = new SerialPortReadObserver() {
+        @Override
+        public void onResult(String result) {
+
+        }
+
+        @Override
+        public void onResultBytes(byte[] bytes) {
+            if(jiuPort!=null && !jiuPort.isOk()){
+                jiuPort.setOk(true);
+            }
+        }
+    };
+
+    List<String> ports;
+    private int index = 0;
+    private Handler portHandler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            switch (msg.what){
+                case 0:
+                    if(index>=1&&!checkEnd()){
+                        index--;
+                        chosePort(ports.get(index));
+                    }
+                    break;
+                default:
+                    break;
+            }
+        }
+    };
+    //鍒濆鍖栦覆鍙�
+    private void initPort(){
+        ports = SportUtils.getSerialPortPaths(this);
+        if(ports.size()>0){
+            index = ports.size()-1;
+            chosePort(ports.get(ports.size()-1));
+        }
+    }
+
+    private void chosePort(String path){
+        if(gridPort==null||!gridPort.isOk()){
+            closePort(gridPort);
+            gridPort = new SerialPortModel(path,9600 ,8
+                    ,1 , 0);
+            boolean isSucc = gridPort.open();
+            if(isSucc) {
+                String msg = isSucc ? "鎴愬姛" : "澶辫触";
+                //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
+                gridPort.startRead(gridReadObserver);
+                //todo 鍙戦�佹煖鏍兼牎楠屼俊鎭�
+            }
+        }
+        if(keyPort==null||!keyPort.isOk()){
+            closePort(keyPort);
+            keyPort = new SerialPortModel(path,115200 ,8
+                    ,1 , 0);
+            boolean isSucc = keyPort.open();
+            if(isSucc) {
+                String msg = isSucc ? "鎴愬姛" : "澶辫触";
+                //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
+                keyPort.startRead(keyReadObserver);
+                //todo 鍙戦�侀挜鍖欐牎楠屼俊鎭�
+            }
+        }
+        if(jiuPort==null||!jiuPort.isOk()){
+            closePort(jiuPort);
+            jiuPort = new SerialPortModel(path,9600 ,8
+                    ,1 , 0);
+            boolean isSucc = jiuPort.open();
+            if(isSucc) {
+                String msg = isSucc ? "鎴愬姛" : "澶辫触";
+                //getVM().append("涓插彛 "+ settingBean.getDevicePath() + " -杩炴帴"+msg);
+                jiuPort.startRead(jiuReadObserver);
+                //todo 鍙戦�侀厭绮炬牎楠屼俊鎭�
+            }
+        }
+
+        portHandler.sendEmptyMessageDelayed(0,2000);
+    }
+
+    private void closePort(SerialPortModel port){
+        if(port==null){
+            return;
+        }
+        port.startRead(null);
+        port.stopRead();
+        port.close();
+        port = null;
+    }
+
+    private boolean checkEnd(){
+        if(gridPort==null||!gridPort.isOk()){
+            return false;
+        }
+        if(keyPort==null||!keyPort.isOk()){
+            return false;
+        }
+        if(jiuPort==null||!jiuPort.isOk()){
+            return false;
+        }
+        return true;
+    }
 }

--
Gitblit v1.9.3