package com.basic.security.fragment; import android.content.pm.PackageManager; import android.graphics.Outline; import android.os.Bundle; import android.os.SystemClock; import android.support.annotation.NonNull; import android.support.v4.content.ContextCompat; import android.view.LayoutInflater; import android.view.TextureView; import android.view.View; import android.view.ViewGroup; import android.view.ViewOutlineProvider; import android.widget.ImageView; import android.widget.RelativeLayout; import com.basic.security.base.BaseApplication; import com.basic.security.base.BaseFragment; import com.basic.security.manager.DetectResultManager; import com.basic.security.manager.FacePositionManager; import com.basic.security.manager.GuestManager; import com.basic.security.manager.RecognizeManager; import com.basic.security.manager.SystemInitManager; import com.basic.security.utils.Constants; import com.basic.security.utils.DetectedResult; import com.basic.security.utils.FaceId; import com.basic.security.utils.FacePosition; import com.basic.security.utils.LayoutUtil; import com.basic.security.utils.ResolutionAdaptation; import com.basic.security.utils.StyleBuilder; import com.basic.security.utils.socket.outdoor.OutdoorGuestSocketServer; import com.basic.security.widget.H264Player; import com.basic.security.widget.Preview; import com.basic.security.widget.RecognizeFaceInfoView; import org.androidannotations.annotations.AfterViews; import org.androidannotations.annotations.Click; import org.androidannotations.annotations.EFragment; import org.androidannotations.annotations.UiThread; import org.androidannotations.annotations.ViewById; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; @EFragment public class CameraFragment extends BaseFragment { public static final int CAMERA_OK = 1024; public static DetectedResult lastDetectedResult = null; public static boolean drawFaceRectFinished = true; static CfCompareFeatureThread CfCompareFeatureThread = new CfCompareFeatureThread(); static DetectedResult detectedResult = null; public final LinkedList detectedResultQueue = new LinkedList(); @ViewById public View overlay; @ViewById public View nic_back_person_manager; @ViewById public View topBackground2_guest_mode, topBlurView2_guest_mode; @ViewById public TextureView textureView; @ViewById public H264Player h264Player; @ViewById public ImageView camera2; @ViewById public View camera2_separator, textureViewParent; @ViewById public Preview rgb_camera, gray_camera; @ViewById public RelativeLayout faceOuterBorderViewParent; public List recognizeFaceInfoViewList = new ArrayList<>(); public long lastTimeDetectedFaceInCamera; long prevDrawTime = System.currentTimeMillis(); private boolean initCamera = false; public void clearAllFaceRectWhenTimeout() { BaseApplication.getApplication().executorService.execute(() -> { while (true) { if (com.basic.security.utils.Constants.showLog) { try { SystemClock.sleep(400); if (System.currentTimeMillis() - lastTimeDetectedFaceInCamera > (Constants.USE_GRAY_CAMERA ? 500 : 400)) { hideAllFaceRects(); } } catch (Exception e) { e.printStackTrace(); } } } }); } @UiThread public void hideAllFaceRects() { try { for (RecognizeFaceInfoView recognizeFaceInfoView : recognizeFaceInfoViewList) { recognizeFaceInfoView.setVisibility(View.INVISIBLE); } } catch (Exception e) { e.printStackTrace(); } if (Constants.indoorOutdoorInOne) { if (mainActivity().secondaryDisplay != null) { mainActivity().secondaryDisplay.hideAllFaceRects(); } } } @UiThread public void drawFaceRect(DetectedResult detectedResult) { try { lastDetectedResult = detectedResult; drawFaceRectFinished = false; prevDrawTime = System.currentTimeMillis(); if (faceOuterBorderViewParent == null || detectedResult == null) { drawFaceRectFinished = true; return; } for (RecognizeFaceInfoView recognizeFaceInfoView : recognizeFaceInfoViewList) { recognizeFaceInfoView.setVisibility(View.INVISIBLE); } int i = 0; if (Constants.indoorOutdoorInOne) { if (mainActivity().secondaryDisplay != null) { mainActivity().secondaryDisplay.drawFaceRect(detectedResult); } } for (FacePosition facePosition : detectedResult.facePositions) { RecognizeFaceInfoView recognizeFaceInfoView = null; if (recognizeFaceInfoViewList.size() - 1 < i) { recognizeFaceInfoView = new RecognizeFaceInfoView(getContext()); recognizeFaceInfoViewList.add(recognizeFaceInfoView); if (Constants.indoorOutdoorInOne) { faceOuterBorderViewParent.addView(recognizeFaceInfoView, 4); } else { faceOuterBorderViewParent.addView(recognizeFaceInfoView, 3); } } else { recognizeFaceInfoView = recognizeFaceInfoViewList.get(i); } if (Constants.indoorOutdoorInOne) { if (textureViewParent != null) { recognizeFaceInfoView.showAtPosition(facePosition, textureViewParent.getHeight(), textureViewParent.getWidth(), detectedResult.width, detectedResult.height ); } } else { recognizeFaceInfoView.showAtPosition(facePosition, rgb_camera.getHeight(), rgb_camera.getWidth(), detectedResult.width, detectedResult.height ); } i++; } } catch (Exception e) { e.printStackTrace(); } finally { drawFaceRectFinished = true; } } public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { return inflater.inflate(ResolutionAdaptation.fragment_camera(), container, false); } public void addDetectedResult(DetectedResult detectedResult) { if (!CfCompareFeatureThread.isRunning) { CameraFragment.detectedResult = detectedResult; BaseApplication.getApplication().executorService.execute(CfCompareFeatureThread); } } @Click public void nic_back_person_manager() { SystemInitManager.showSecondDisplay(mainActivity()); mainActivity().fragment_menu.person_manage1(); } public void showCameraInGuestMode() { } public void showCameraInGuestMode(boolean showBorder) { if (Constants.indoorOutdoorInOne) { try { if (showBorder) { LayoutUtil.applyStyle(faceOuterBorderViewParent, StyleBuilder.newStyleBuild().marginTop(20).marginRight(0).marginBottom(161).marginLeft(20).buildStyle()); hideOverlay(); topBlurView2_guest_mode.setVisibility(View.VISIBLE); topBackground2_guest_mode.setVisibility(View.VISIBLE); } else { overlay.setVisibility(View.VISIBLE); topBlurView2_guest_mode.setVisibility(View.INVISIBLE); topBackground2_guest_mode.setVisibility(View.INVISIBLE); cameraExitGuestMode(); } } catch (Exception e) { e.printStackTrace(); } } } @UiThread public void showOverlay() { if (overlay != null) { overlay.setVisibility(View.VISIBLE); } if (nic_back_person_manager != null) { nic_back_person_manager.setVisibility(View.GONE); } if (Constants.indoorOutdoorInOne) { showCameraInGuestMode(); } } @UiThread public void hideOverlay() { if (Constants.indoorOutdoorInOne) { showCameraInGuestMode(); } if (overlay != null) { overlay.setVisibility(View.INVISIBLE); } if (nic_back_person_manager != null) { if ( mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_wait_face || mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_wait_idcard || mainActivity().currentFragment == mainActivity().fragment_su_logged_nic_wait_face || mainActivity().currentFragment == mainActivity().fragment_su_logged_nic_wait_detail || mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_compare_success ) { nic_back_person_manager.setVisibility(View.VISIBLE); } else { nic_back_person_manager.setVisibility(View.GONE); } } } @AfterViews public void afterViews() { h264Player.setVisibility(View.GONE); if (ContextCompat.checkSelfPermission(mainActivity(), android.Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { requestPermissions(new String[]{android.Manifest.permission.CAMERA}, CAMERA_OK); } else { openCamera(); } if (Constants.indoorOutdoorInOne) { camera2.setClipToOutline(true); camera2.setOutlineProvider(new ViewOutlineProvider() { public void getOutline(View view, Outline outline) { outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), getResources().getDimension(com.basic.security.utils.RUtils.R_dimen_corner_radius)); } }); } } public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); switch (requestCode) { case CAMERA_OK: openCamera(); resetCamera(); break; default: break; } } public void resetCamera() { rgb_camera.resetCamera = false; rgb_camera.reset(); } private void openCamera() { rgb_camera.setOutlineProvider(new ViewOutlineProvider() { public void getOutline(View view, Outline outline) { outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), getActivity().getResources().getDimension(com.basic.security.utils.RUtils.R_dimen_corner_radius)); } }); rgb_camera.setClipToOutline(true); if (Constants.indoorOutdoorInOne) { textureView.setOutlineProvider(new ViewOutlineProvider() { public void getOutline(View view, Outline outline) { outline.setRoundRect(0, 0, view.getWidth(), view.getHeight(), getActivity().getResources().getDimension(com.basic.security.utils.RUtils.R_dimen_corner_radius)); } }); textureView.setClipToOutline(true); textureView.setSurfaceTextureListener(rgb_camera); } if (getActivity() == null) { return; } FaceId.initSdk(getActivity(), rgb_camera, gray_camera, detectedResult -> { if (detectedResult.facePositions.size() > 0) { if (mainActivity().currentFragment == mainActivity().fragment_su_auto_wait_face || mainActivity().currentFragment == mainActivity().fragment_admin_face_login || mainActivity().currentFragment == mainActivity().fragment_su_logged_ic_wait_face || mainActivity().currentFragment == mainActivity().fragment_su_logged_nic_wait_face) { mainActivity().refreshCurrentFragmentShowTime(); } lastTimeDetectedFaceInCamera = System.currentTimeMillis(); addDetectedResult(detectedResult); } }); RecognizeManager.processRecognizeResult(); clearAllFaceRectWhenTimeout(); } @UiThread public void cameraEnterGuestMode() { if (GuestManager.twoCameras()) { camera2.setVisibility(View.VISIBLE); camera2_separator.setVisibility(View.VISIBLE); LayoutUtil.applyStyle(faceOuterBorderViewParent, StyleBuilder.newStyleBuild().marginTop(20).marginRight(0).marginBottom(300).marginLeft(20).buildStyle()); } else { if (Constants.indoorOutdoorInOne) { camera2.setVisibility(View.GONE); camera2_separator.setVisibility(View.GONE); LayoutUtil.applyStyle(faceOuterBorderViewParent, StyleBuilder.newStyleBuild().marginTop(20).marginRight(0).marginBottom(161).marginLeft(20).buildStyle()); } } } @UiThread public void cameraExitGuestMode() { LayoutUtil.applyStyle(faceOuterBorderViewParent, StyleBuilder.newStyleBuild().marginTop(0).marginRight(0).marginBottom(0).marginLeft(0).buildStyle()); camera2.setVisibility(View.GONE); camera2_separator.setVisibility(View.GONE); } static class CfCompareFeatureThread implements Runnable { public boolean isRunning = false; @Override public void run() { try { if (detectedResult != null) { if (detectedResult.shouldExtractFeature) { for (FacePosition facePosition : detectedResult.facePositions) { facePosition.readFaceFeature(); FacePositionManager.processFaceFeature(facePosition); } DetectResultManager.setDetectResult(detectedResult); OutdoorGuestSocketServer.setDetectedResult(detectedResult); } else if (drawFaceRectFinished) { BaseApplication.getApplication().activity.fragment_camera.drawFaceRect(detectedResult); } } } catch (Exception e) { e.printStackTrace(); } isRunning = false; } } }