From 4a8ff39b0fab0627ef8f7459587d514cc01c3676 Mon Sep 17 00:00:00 2001
From: rk <94314517@qq.com>
Date: 星期一, 20 十月 2025 10:52:02 +0800
Subject: [PATCH] Merge branch 'wuhuyancao' of http://139.186.142.91:10010/r/productDev/dmvisit into wuhuyancao

---
 keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java | 1186 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 1,186 insertions(+), 0 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
new file mode 100644
index 0000000..fcac3d4
--- /dev/null
+++ b/keyCabinet-android/app/src/main/java/com/doumee/keyCabinet/ui/main/MainActivity.java
@@ -0,0 +1,1186 @@
+package com.doumee.keyCabinet.ui.main;
+
+import android.app.ActivityManager;
+import android.app.AlarmManager;
+import android.app.PendingIntent;
+import android.content.Context;
+import android.content.Intent;
+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;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.PopupWindow;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+import android.widget.Toast;
+
+import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
+import androidx.lifecycle.Observer;
+
+import com.alibaba.fastjson.JSON;
+import com.baidu.idl.main.facesdk.model.BDFaceSDKCommon;
+import com.bigkoo.convenientbanner.holder.CBViewHolderCreator;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.DataSource;
+import com.bumptech.glide.load.engine.GlideException;
+import com.bumptech.glide.request.RequestListener;
+import com.bumptech.glide.request.target.SimpleTarget;
+import com.bumptech.glide.request.target.Target;
+import com.bumptech.glide.request.transition.Transition;
+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;
+import com.doumee.keyCabinet.ui.face.AddFaceActivity;
+import com.doumee.keyCabinet.ui.face.ErrActivity;
+import com.doumee.keyCabinet.ui.face.UserInfoManager;
+import com.doumee.keyCabinet.ui.face.UserManagerActivity;
+import com.doumee.keyCabinet.ui.view.BannerViewImageHolder;
+import com.doumee.keyCabinet.utils.BraceletLogUtils;
+import com.doumee.keyCabinet.utils.CrashHandler;
+import com.doumee.keyCabinet.utils.LMobileInfo;
+import com.doumee.keyCabinet.utils.TimeUtils;
+import com.doumee.keyCabinet.utils.face.FaceSDKManager;
+import com.doumee.keyCabinet.utils.face.FaceUtils;
+import com.doumee.keyCabinet.utils.face.GateConfigUtils;
+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;
+import com.doumee.lib_coremodel.bean.event.ActionEventData;
+import com.doumee.keyCabinet.MApplication;
+import com.doumee.keyCabinet.R;
+import com.doumee.keyCabinet.base.MyBaseActivity;
+import com.doumee.keyCabinet.bean.MemberBean;
+import com.doumee.keyCabinet.utils.AdListResponseParam;
+import com.doumee.lib_coremodel.http.utils.GsonTools;
+import com.doumee.lib_coremodel.util.SpUtil;
+import com.doumee.lib_coremodel.util.StringUtil;
+import com.example.datalibrary.api.FaceApi;
+import com.example.datalibrary.listener.DBLoadListener;
+import com.example.datalibrary.listener.SdkInitListener;
+import com.example.datalibrary.model.ImportFeatureResult;
+import com.example.datalibrary.model.User;
+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;
+import java.util.concurrent.Future;
+
+import dagger.hilt.android.AndroidEntryPoint;
+import timber.log.Timber;
+
+import static android.Manifest.permission.RECEIVE_BOOT_COMPLETED;
+
+@AndroidEntryPoint
+public class MainActivity extends MyBaseActivity<MainVM, MainActivityBinding> {
+    private List<AdListResponseParam> lbs = new ArrayList<>();
+    //鏄惁宸叉縺娲�
+    public static boolean isFaceOk = false;
+    private boolean isActivation = false;
+    private boolean isDBLoad;
+    private PopupWindow popupWindow;
+    private Future future;
+
+    //鐩告満鐩稿叧
+    private Camera[] mCamera;
+    private PreviewTexture[] previewTextures;
+    private static final int PREFER_WIDTH = 640;
+    private static final int PREFER_HEIGHT = 480;
+    //鏄惁鏈夎鏇存柊浜鸿劯
+    private boolean isNeedUpdateFace;
+    //鏄惁姝e湪鏇存柊涓�
+    private boolean isUpdatingFace;
+    private boolean isUpdateVersion;
+    private int downCount = 0;
+    private Long lastDownTime;
+    private Long showTime;
+
+    private Handler handler = new Handler(){
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            if(!isFinishing()){
+                switch (msg.what) {
+                    case 0:
+                    //initM();
+                    TimeUtils.updateTimeUi(getVM().dayObs, getVM().timeObs);
+                    handler.sendEmptyMessageDelayed(0, 1000);
+                    EventBus.getDefault().post(new TimeClockEvent());
+                    /*if (isDBLoad && isNeedUpdateFace && !isUpdatingFace) {
+                        isNeedUpdateFace = false;
+                        getVM().getFaceLD();
+                    }
+                    getVM().upBraceletLog();*/
+                    case 2:
+                        getVM().resetReq();
+                        break;
+                }
+            }
+        }
+    };
+
+
+    @Override
+    public int getLayoutId() {
+        return R.layout.main_activity;
+    }
+
+    @Override
+    public void initView(@Nullable Bundle savedInstanceState) {
+        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();
+        Timber.tag("====>").d(LMobileInfo.getDeviceUniqueId());
+        initPort();
+    }
+
+    private void initM(){
+        ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
+        ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
+        activityManager.getMemoryInfo(memoryInfo);
+
+        long totalMemory = memoryInfo.totalMem/(1024*1024);
+        long availableMemory = memoryInfo.availMem/(1024*1024);
+        long usedMemory = totalMemory - availableMemory;
+        //getDB().tvM.setText("鎬诲唴瀛橈細"+totalMemory+",浣跨敤鍐呭瓨锛�"+usedMemory+",鍙敤鍐呭瓨锛�"+availableMemory);
+        if((availableMemory<400&&showTime!=null&&(System.currentTimeMillis()-showTime>5000))||
+                ("02:00:00".equals(StringUtil.getHM()))){
+            //鍙敤鍐呭瓨灏忎簬400M,鎴栬�呮瘡澶╁噷鏅�2鐐癸紝閲嶅惎app
+            restartApp();
+        }
+    }
+
+    private void upErrInfo(){
+        List<SpUtil.SPBean> datas = SpUtil.getMatchingStrings(CrashHandler.FILE_NAME);
+        for(SpUtil.SPBean data : datas){
+            getVM().upErrInfo(data);
+        }
+    }
+
+    @Override
+    public void initData(@Nullable Bundle savedInstanceState) {
+        //handler.sendEmptyMessageDelayed(0,1000);
+        getDB().tvId.setText("NO锛�"+LMobileInfo.getDeviceUniqueId());
+        getDB().tvVersion.setText("V"+BuildConfig.VERSION_NAME);
+        getVM().getFaceLD().observe(this, new Observer<List<FaceUserBean>>() {
+            @Override
+            public void onChanged(List<FaceUserBean> beans) {
+                //鏇存柊浜鸿劯鏁版嵁
+                if(beans!=null&&beans.size()>0){
+                    initModel(beans);
+                }
+            }
+        });
+        getDB().img.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                if(lastDownTime!=null){
+                    if(System.currentTimeMillis()-lastDownTime>1000){
+                        downCount=0;
+                    }
+                }
+                lastDownTime = System.currentTimeMillis();
+                Timber.d("downCount="+downCount);
+                downCount++;
+                if(downCount>4) {
+                    downCount=0;
+                    lastDownTime=null;
+                    initPopupWindow();
+                }
+            }
+        });
+        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鎵撳紑");
+    }
+
+
+
+    boolean isOne;
+    private void setBanner(List<BannerPicResponsePara> bannerList){
+        getDB().banner.setPages(new CBViewHolderCreator<BannerViewImageHolder>() {
+            @Override
+            public BannerViewImageHolder createHolder() {
+                return new BannerViewImageHolder();
+            }
+        },bannerList ).setPageIndicator(new int[]{R.drawable.bg_dot_gray, R.drawable.bg_dot_blue});
+        isOne = bannerList.size()==1;
+        if(!isOne) {
+            getDB().banner.startTurning(3000);
+        }else {
+            getDB().banner.stopTurning();
+        }
+    }
+
+    private boolean isHavePermission = false;
+    //鑾峰彇鏉冮檺
+    private void getPermission(){
+        PermissionUtils.getPermission(this, new PermissionUtils.CallBack() {
+            @Override
+            public void sucess() {
+                //鏄剧ず
+                isHavePermission = true;
+                checkUpdate();
+            }
+
+            @Override
+            public void fail(List<String> permissions) {
+                showNoPermissionTip();
+            }
+        }, new String[]{Permission.WRITE_EXTERNAL_STORAGE,RECEIVE_BOOT_COMPLETED});
+    }
+
+    private Long lastDownTime1;
+    private int downCount1;
+    private Long lastDownTime2;
+    private int downCount2;
+    @Override
+    protected void doRegister(int type, ActionEventData data) {
+        switch (type){
+            case 2:
+            case 3:
+                /*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:
+                isShowTip = false;
+                getDB().clTip.setVisibility(View.GONE);
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    protected void onResume() {
+        super.onResume();
+        showTime = System.currentTimeMillis();
+        MApplication.setLoginBean(new LoginBean());
+        if(!isFaceOk) {
+            //initLicense();
+        }
+        if(isHavePermission) {
+            checkUpdate();
+        }
+        triggerGarbageCollection();
+        getVM().resetReq();
+        if(!isOne) {
+            getDB().banner.startTurning(3000);
+        }else {
+            getDB().banner.stopTurning();
+        }
+    }
+
+    // 杩欐槸涓�涓ず渚嬫柟娉曪紝鐢ㄤ簬鎵嬪姩瑙﹀彂鍨冨溇鍥炴敹
+    public void triggerGarbageCollection() {
+        // 璇锋眰杩涜鍨冨溇鍥炴敹
+        System.gc();
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+        if (future != null && !future.isDone()) {
+            future.cancel(true);
+        }
+        FaceApi.getInstance().cleanRecords();
+        handler.removeCallbacksAndMessages(null);
+        handler = null;
+        faceHandler.removeCallbacksAndMessages(null);
+        faceHandler = null;
+        portHandler.removeCallbacksAndMessages(null);
+        portHandler = null;
+    }
+
+    private void restartApp(){
+        // 鍒涘缓涓�涓柊鐨勫惎鍔ㄦ剰鍥�
+        Intent intent = new Intent(mContext, GuideActivity.class);
+        // 璁剧疆FLAG_ACTIVITY_CLEAR_TASK鏍囧織浣�
+        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
+        // 浣跨敤PendingIntent鍖呰鍚姩鎰忓浘
+        PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, PendingIntent.FLAG_ONE_SHOT);
+        // 鑾峰彇AlarmManager瀹炰緥
+        AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
+        // 鍦�500姣鍚庤Е鍙戦噸鍚搷浣�
+        alarmManager.set(AlarmManager.RTC, System.currentTimeMillis() + 10, pendingIntent);
+
+        android.os.Process.killProcess(android.os.Process.myPid());
+        System.exit(1);
+    }
+
+    @Subscribe
+    public void GetFacesEvent(GetFacesEvent event){
+        if(!isFinishing()&&!isUpdatingFace){
+            if(isDBLoad){
+                isNeedUpdateFace = false;
+                //鏌ヨ浜鸿劯
+                getVM().getFaceDatas();
+            }else {
+                isNeedUpdateFace = true;
+            }
+        }
+    }
+
+    @Subscribe
+    public void ReLoginEvent(ReLoginEvent event){
+        if(!isFinishing()){
+            handler.sendEmptyMessageDelayed(2,20000);
+            getVM().devLogin();
+        }
+    }
+
+    //鍒ゆ柇璁惧鏄惁宸叉縺娲�
+    private void initLicense() {
+        FaceSDKManager.getInstance().init(mContext, new SdkInitListener() {
+            @Override
+            public void initStart() {
+
+            }
+
+            public void initLicenseSuccess() {
+                //宸叉縺娲�
+                isFaceOk = true;
+                initDBApi();
+            }
+
+            @Override
+            public void initLicenseFail(int errorCode, String msg) {
+                //鏈縺娲伙紝璺宠浆婵�娲婚〉闈�
+                TimerTask task = new TimerTask() {
+                    @Override
+                    public void run() {
+                        /*
+                         *瑕佹墽琛岀殑鎿嶄綔*/
+
+                        startActivity(new Intent(mContext, ActivationActivity.class));
+                    }
+                };
+                Timer timer = new Timer();
+                timer.schedule(task, 2000);
+            }
+
+            @Override
+            public void initModelSuccess() {
+
+            }
+
+            @Override
+            public void initModelFail(int errorCode, String msg) {
+
+            }
+        });
+    }
+
+    private void initDBApi(){
+        if (future != null && !future.isDone()) {
+            future.cancel(true);
+        }
+        isDBLoad = false;
+        future = Executors.newSingleThreadExecutor().submit(new Runnable() {
+            @Override
+            public void run() {
+                FaceApi.getInstance().init(new DBLoadListener() {
+
+                    @Override
+                    public void onStart(int successCount) {
+                        if (successCount < 5000 && successCount != 0){
+
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    loadProgress(10);
+                                }
+                            });
+                        }
+                    }
+
+                    @Override
+                    public void onLoad(final int finishCount, final int successCount, final float progress) {
+                        if (successCount > 5000 || successCount == 0) {
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    getDB().progressBar.setProgress((int) (progress * 100));
+                                    getDB().progressText.setText(((int) (progress * 100)) + "%");
+                                }
+                            });
+                        }
+                    }
+
+                    @Override
+                    public void onComplete(final List<User> users , final int successCount) {
+//                        FileUtils.saveDBList(HomeActivity.this, users);
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                FaceApi.getInstance().setUsers(users);
+                                initFaceSDKManager(null);
+                                if (successCount > 5000 || successCount == 0) {
+                                    getDB().progressGroup.setVisibility(View.GONE);
+                                    isDBLoad = true;
+                                    isFaceOk = true;
+                                }
+                            }
+                        });
+                    }
+
+                    @Override
+                    public void onFail(final int finishCount, final int successCount, final List<User> users) {
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                FaceApi.getInstance().setUsers(users);
+                                initFaceSDKManager(null);
+                                getDB().progressGroup.setVisibility(View.GONE);
+                                Toast.makeText(MainActivity.this, String.format(getString(R.string.main_tip3),successCount,finishCount), Toast.LENGTH_SHORT).show();
+                                isDBLoad = true;
+                                isFaceOk = true;
+                            }
+                        });
+                    }
+                }, mContext);
+            }
+        });
+    }
+
+    private void loadProgress(float i){
+        getDB().progressGroup.setVisibility(View.VISIBLE);
+        new Handler().postDelayed(new Runnable() {
+            @Override
+            public void run() {
+                getDB().progressBar.setProgress((int) ((i / 5000f) * 100));
+                getDB().progressText.setText(((int) ((i / 5000f) * 100)) + "%");
+                if (i < 5000){
+                    loadProgress(i + 100);
+                }else {
+                    getDB().progressGroup.setVisibility(View.GONE);
+                    isDBLoad = true;
+                    isFaceOk = true;
+                }
+            }
+        },10);
+    }
+
+    private void initModel(List<FaceUserBean> userBeans) {
+        if (com.example.datalibrary.manager.FaceSDKManager.initStatus == com.example.datalibrary.manager.FaceSDKManager.SDK_MODEL_LOAD_SUCCESS) {
+            waitUpdate(userBeans);
+        }else {
+            initFaceSDKManager(userBeans);
+        }
+    }
+
+    private void initFaceSDKManager(List<FaceUserBean> userBeans){
+        //寮�濮嬪悗鍘诲垵濮嬪寲
+        com.example.datalibrary.manager.FaceSDKManager.getInstance().initModel(mContext,
+                FaceUtils.getInstance().getBDFaceSDKConfig() , new SdkInitListener() {
+                    @Override
+                    public void initStart() {
+                    }
+
+                    @Override
+                    public void initLicenseSuccess() {
+                    }
+
+                    @Override
+                    public void initLicenseFail(int errorCode, String msg) {
+                    }
+
+                    @Override
+                    public void initModelSuccess() {
+                        com.example.datalibrary.manager.FaceSDKManager.initModelSuccess = true;
+                        runOnUiThread(new Runnable() {
+                            @Override
+                            public void run() {
+                                Toast.makeText(mContext, getString(R.string.main_tip4), Toast.LENGTH_SHORT).show();
+                                getDB().progressGroup.setVisibility(View.GONE);
+                                if(userBeans!=null){
+                                    waitUpdate(userBeans);
+                                }
+                            }
+                        });
+                    }
+
+                    @Override
+                    public void initModelFail(int errorCode, String msg) {
+                        com.example.datalibrary.manager.FaceSDKManager.initModelSuccess = false;
+                        if (errorCode != -12) {
+                            runOnUiThread(new Runnable() {
+                                @Override
+                                public void run() {
+                                    Toast.makeText(mContext, getString(R.string.main_tip5), Toast.LENGTH_SHORT).show();
+                                }
+                            });
+                        }
+                    }
+                });
+    }
+
+    @Override
+    protected void onPause() {
+        super.onPause();
+        showTime = null;
+    }
+
+    private int finishCount;
+    private List<FaceUserBean> selectBeans = new ArrayList<>();
+    //寰呮洿鏂版暟鎹�
+    private List<FaceUserBean> waitBeans = new ArrayList<>();
+
+    private Handler faceHandler = new Handler(){
+
+        @Override
+        public void handleMessage(@NonNull Message msg) {
+            if(!isFinishing()){
+                switch (msg.what){
+                    case 0:
+                        if(finishCount<selectBeans.size()){
+                            isUpdatingFace = true;
+                            repeatCount = 0;
+                            updateFace(selectBeans.get(finishCount));
+                        }else {
+                            //缁撴潫
+                            isUpdatingFace = false;
+                            //System.out.println("==UpdatingFace==>鏇存柊缁撴潫锛�");
+                            // 娓呴櫎鍐呭瓨缂撳瓨
+                            Glide.get(MainActivity.this).clearMemory();
+                        }
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }
+    };
+
+    private void waitUpdate(List<FaceUserBean> userBeans){
+        if(isUpdatingFace){
+            //姝e湪鏇存柊
+            waitBeans.addAll(userBeans);
+        }else {
+            selectBeans.clear();
+            selectBeans.addAll(waitBeans);
+            waitBeans.clear();
+            selectBeans.addAll(userBeans);
+            finishCount=0;
+            faceHandler.sendEmptyMessage(0);
+        }
+    }
+
+    private int repeatCount = 0;
+    private void updateFace(FaceUserBean bean){
+        Timber.d("==UpdatingFace==>瀹屾垚鏁伴噺 "+finishCount);
+        if (TextUtils.isEmpty(bean.getFaceImg())||bean.getFaceImg().endsWith("null")) {
+            finishCount++;
+            faceHandler.sendEmptyMessage(0);
+            return;
+        }
+        repeatCount++;
+        //System.out.println("==UpdatingFace==>寮�濮嬶細" + bean.getName());
+        Glide.with(this)
+                .asBitmap()
+                .load(bean.getFaceImg())
+                .addListener(new RequestListener<Bitmap>() {
+                    @Override
+                    public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Bitmap> target, boolean isFirstResource) {
+                        if(repeatCount==1) {
+                            finishCount++;
+                        }
+                        faceHandler.sendEmptyMessage(0);
+                        return false;
+                    }
+
+                    @Override
+                    public boolean onResourceReady(Bitmap bitmap, Object model, Target<Bitmap> target, DataSource dataSource, boolean isFirstResource) {
+                        if(repeatCount==1) {
+                            finishCount++;
+                        }
+                        if (bitmap != null) {
+                            //System.out.println("==UpdatingFace==>寮�濮嬭В鏋愪汉鑴�");
+                            byte[] secondFeature = new byte[512];
+                            ImportFeatureResult result = null;
+                            // 10銆佽蛋浜鸿劯SDK鎺ュ彛锛岄�氳繃浜鸿劯妫�娴嬨�佺壒寰佹彁鍙栨嬁鍒颁汉鑴哥壒寰佸��
+                            try {
+                                result = ImportFileManager.getInstance().getFeature(bitmap, secondFeature,
+                                        BDFaceSDKCommon.FeatureType.BDFACE_FEATURE_TYPE_LIVE_PHOTO);
+                            }catch (OutOfMemoryError e){
+                                e.printStackTrace();
+                                faceHandler.sendEmptyMessage(0);
+                                return false;
+                            }catch (Exception e){
+                                e.printStackTrace();
+                                faceHandler.sendEmptyMessage(0);
+                                return false;
+                            }
+
+                            // 11銆佸垽鏂槸鍚︽彁鍙栨垚鍔燂細128涓烘垚鍔燂紝-1涓哄弬鏁颁负绌猴紝-2琛ㄧず鏈娴嬪埌浜鸿劯
+                            float ret = result.getResult();
+                            //System.out.println("==UpdatingFace==>鎻愬彇鐗瑰緛鍊�" + ret);
+                            // 鎻愬彇鐗瑰緛鍊�
+                            if (ret != -1) {
+                                //鏈変汉鑴�
+                                // 鍒ゆ柇璐ㄩ噺妫�娴嬶紝閽堝妯$硦搴︺�侀伄鎸°�佽搴�
+                                if (ret == 128) {
+                                    Timber.d("==UpdatingFace==>鍥剧墖鐗瑰緛鎶藉彇鎴愬姛: %s", JSON.toJSONString(bean));
+                                    User user = new User();
+                                    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);
+                                    faceHandler.sendEmptyMessage(0);
+                                } else {
+                                    Timber.e("==UpdatingFace==>鍥剧墖鐗瑰緛鎶藉彇澶辫触: %s", JSON.toJSONString(bean));
+                                    if(repeatCount>3) {
+                                        faceHandler.sendEmptyMessage(0);
+                                    }else {
+                                        updateFace(bean);
+                                    }
+                                }
+                            } else {
+                                // 涓婁紶鍥剧墖鏃犱汉鑴搁殣钘�
+                                Timber.e("==UpdatingFace==>鍥剧墖鐗瑰緛鎶藉彇澶辫触: %s", JSON.toJSONString(bean));
+                                if(repeatCount>3) {
+                                    faceHandler.sendEmptyMessage(0);
+                                }else {
+                                    updateFace(bean);
+                                }
+                            }
+                        } else {
+                            if(repeatCount>3) {
+                                faceHandler.sendEmptyMessage(0);
+                            }else {
+                                updateFace(bean);
+                            }
+                        }
+                        return false;
+                    }
+                })
+                .into(new SimpleTarget<Bitmap>() {
+
+                    @Override
+                    public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition<? super Bitmap> transition) {
+
+                    }
+                });
+    }
+
+    private void insertOrUpdate(User newDo){
+        //鎻掑叆鏁版嵁搴�
+        //System.out.println("==isOk==>bean" + GsonTools.changeGsonToJson(newDo));
+        User user = FaceApi.getInstance().getByUserId(newDo.getGroupId(), newDo.getUserId());
+        //System.out.println("==isOk==>鏌ヨ" + user.getId()+","+user.getUserId()+","+user.getUserName());
+        boolean isSave = false;
+        if (user == null) {
+            //鏂板
+            isSave = FaceApi.getInstance().registerUserIntoDBmanager(newDo.getGroupId(),
+                    newDo.getUserId(), newDo.getUserName(), newDo.getImageName(), newDo.getUserInfo(), newDo.getFeature());
+            //System.out.println("==isOk==>淇濆瓨鎴愬姛");
+        } else {
+            //鏇存柊
+            user.setUserName(newDo.getUserName());
+            user.setImageName(newDo.getImageName());
+            user.setFeature(newDo.getFeature());
+            isSave = FaceApi.getInstance().userUpdateOnly(user);
+            //System.out.println("==isOk==>鏇存柊鎴愬姛");
+        }
+
+        if (isSave) {
+            //淇濆瓨鎴愬姛
+            //System.out.println("==UpdatingFace==>淇敼鎴愬姛");
+            UserInfoManager.getInstance();
+        } else {
+            Timber.d("==isOk==>浜鸿劯淇濆瓨澶辫触: %s", JSON.toJSONString(newDo));
+        }
+    }
+
+    //寮圭獥
+    private void initPopupWindow() {
+        if(popupWindow!=null&&popupWindow.isShowing()){
+            return;
+        }
+        View contentView = LayoutInflater.from(mContext).inflate(R.layout.popup_menu_home, null);
+        popupWindow = new PopupWindow(contentView, ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
+        // 鐐瑰嚮妗嗗鍙互浣垮緱popupwindow娑堝け
+        popupWindow.setFocusable(false);
+        popupWindow.setOutsideTouchable(false);
+        popupWindow.setTouchable(true);
+        popupWindow.setBackgroundDrawable(new BitmapDrawable());
+        popupWindow.showAtLocation(getDB().clRoot, Gravity.CENTER, 0, 0);
+        RelativeLayout relativeRegister = contentView.findViewById(R.id.relative_register);
+        RelativeLayout mPopRelativeManager = contentView.findViewById(R.id.relative_manager);
+        RelativeLayout mPopRelativeCamra = contentView.findViewById(R.id.relative_camra);
+        RelativeLayout mRlErr = contentView.findViewById(R.id.rl_err);
+        relativeRegister.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(AddFaceActivity.class);
+            }
+        });
+        mPopRelativeManager.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(UserManagerActivity.class);
+            }
+        });
+        mPopRelativeCamra.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                //startActivity();
+            }
+        });
+        mRlErr.setOnClickListener(new View.OnClickListener() {
+            @Override
+            public void onClick(View v) {
+                startActivity(ErrActivity.class);
+            }
+        });
+        //鑷姩鍏抽棴
+        initHandler();
+    }
+
+    private void initHandler() {
+        new Handler(new Handler.Callback() {
+            @Override
+            public boolean handleMessage(Message msg) {
+                // 瀹炵幇椤甸潰璺宠浆
+                popupWindow.dismiss();
+                return false;
+            }
+        }).sendEmptyMessageDelayed(0, 5000);
+    }
+
+    private void initRGBCheck(){
+        if(true){
+            return;
+        }
+        String index = SpUtil.getString("rbgCameraId");
+        if(index==null){
+            index = "0";
+        }
+        setRgbCameraId(Integer.parseInt(index));
+        /*if (isSetCameraId()){
+            return;
+        }
+        int mCameraNum = Camera.getNumberOfCameras();
+        Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
+        for (int i = 0; i < Camera.getNumberOfCameras(); i++) {
+            Camera.getCameraInfo(i, cameraInfo);
+        }
+        if (mCameraNum > 1){
+            try {
+                mCamera = new Camera[mCameraNum];
+                previewTextures = new PreviewTexture[mCameraNum];
+                mCamera[0] = Camera.open(0);
+                previewTextures[0] = new PreviewTexture(this, getDB().checkRgbTexture);
+                previewTextures[0].setCamera(mCamera[0], PREFER_WIDTH, PREFER_HEIGHT);
+                mCamera[0].setPreviewCallback(new Camera.PreviewCallback() {
+                    @Override
+                    public void onPreviewFrame(byte[] data, Camera camera) {
+                        int check = StreamUtil.checkNirRgb(data, PREFER_WIDTH, PREFER_HEIGHT);
+                        if (check == 1){
+                            setRgbCameraId(0);
+                        }
+                        release(0);
+                    }
+                });
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+            try {
+                mCamera[1] = Camera.open(1);
+                previewTextures[1] = new PreviewTexture(this, getDB().checkNirTexture);
+                previewTextures[1].setCamera(mCamera[1], PREFER_WIDTH, PREFER_HEIGHT);
+                mCamera[1].setPreviewCallback(new Camera.PreviewCallback() {
+                    @Override
+                    public void onPreviewFrame(byte[] data, Camera camera) {
+                        int check = StreamUtil.checkNirRgb(data, PREFER_WIDTH, PREFER_HEIGHT);
+                        if (check == 1){
+                            setRgbCameraId(1);
+                        }
+                        release(1);
+                    }
+                });
+            }catch (Exception e){
+                e.printStackTrace();
+            }
+        } else {
+            setRgbCameraId(0);
+        }*/
+    }
+
+    private void setRgbCameraId(int index){
+        //Toast.makeText(mContext, "璁剧疆鐩告満"+index, Toast.LENGTH_SHORT).show();
+        SpUtil.saveString("rbgCameraId",index+"");
+        BraceletLogUtils.saveLog("璁剧疆鐩告満("+index+")");
+        SingleBaseConfig.getBaseConfig().setRBGCameraId(index);
+        SingleBaseConfig.getBaseConfig().setRgbRevert(true);
+        SingleBaseConfig.getBaseConfig().setRgbDetectDirection(90);
+        SingleBaseConfig.getBaseConfig().setRgbVideoDirection(270);
+        GateConfigUtils.modityJson();
+        RegisterConfigUtils.modityJson();
+    }
+    private boolean isSetCameraId(){
+        if (SingleBaseConfig.getBaseConfig().getRBGCameraId() == -1){
+            return false;
+        }else {
+            return true;
+        }
+    }
+
+    private void release(int id){
+        if (mCamera != null && mCamera[id] != null) {
+            if (mCamera[id] != null) {
+                mCamera[id].setPreviewCallback(null);
+                mCamera[id].stopPreview();
+                previewTextures[id].release();
+                mCamera[id].release();
+                mCamera[id] = null;
+            }
+        }
+    }
+
+    private void checkUpdate(){
+        //鐗堟湰鏇存柊
+        new UpdateUtil(this).setShowToast(false).getServerVerCode(new UpdateUtil.VersionCallBack() {
+            @Override
+            public void isNeedUpdate(boolean isUpdate) {
+                isUpdateVersion = isUpdate;
+            }
+        });
+    }
+
+    private PermissiondDialog permissiondDialog;
+    private void showNoPermissionTip() {
+        try {
+            Toast.makeText(this,getString(R.string.guide_permiss_1) , Toast.LENGTH_LONG).show();
+            if (permissiondDialog == null) {
+                permissiondDialog = new PermissiondDialog(this, getString(R.string.help), getString(R.string.guide_permiss_2), getString(R.string.cancel),
+                        getString(R.string.empower), new PermissiondDialog.OnClickListener() {
+                    @Override
+                    public void clickOk() {
+                        permissiondDialog.dismiss();
+                        PermissionUtils.gotoPermission(getContext());
+                    }
+
+                    @Override
+                    public void clickNo() {
+                        permissiondDialog.dismiss();
+                        finish();
+                    }
+                });
+            }
+            if (!permissiondDialog.isShowing()) {
+                permissiondDialog.show();
+            }
+        } catch (Exception e) {
+
+        }
+    }
+
+    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() {
+        super.onRestart();
+        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