package com.xingyue.opencvtest;

import android.app.AlertDialog;
import android.content.IntentFilter;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.hardware.usb.UsbDevice;
import android.hardware.usb.UsbManager;
import android.os.RemoteException;
import android.provider.ContactsContract;
import android.provider.DocumentsContract;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.Display;
import android.view.View;
import android.view.WindowManager;
import android.widget.Button;

import org.opencv.android.BaseLoaderCallback;
import org.opencv.android.LoaderCallbackInterface;
import org.opencv.android.OpenCVLoader;
import org.opencv.android.Utils;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;
import org.opencv.core.Rect;
import org.opencv.imgproc.Imgproc;

import android.app.IT8951Manager;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;


public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    public String TAG="opencvtest";
    public IT8951Manager manager;
    private UsbManager usbManager;
    private BroadcastReceiver receiver;
    private IntentFilter intentFilter;
    private int mWidth,mHeight;
    private boolean isOpen,isDisplaying;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Button btn1 = (Button)findViewById(R.id.button1);
        btn1.setOnClickListener(this);
        Button btn2 = (Button)findViewById(R.id.button2);
        btn2.setOnClickListener(this);
        Button btn3 = (Button)findViewById(R.id.button3);
        btn3.setOnClickListener(this);
        Button btn4 = (Button)findViewById(R.id.button4);
        btn4.setOnClickListener(this);
        manager = (IT8951Manager) getSystemService("it8951");
        if(manager==null) {
            Log.e(TAG, "getSystemService it8951 faile");
        }else {
           OpenDevice();

        }
/*
        Display display = ((WindowManager) getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
        int width = display.getWidth();
        int height=display.getHeight();

        Log.d(TAG,"w="+width+"H="+height);
*/
        usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
        receiver = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                String action = intent.getAction();
                switch(action) {
                /*
                case UsbManager.ACTION_USB_ACCESSORY_ATTACHED:
                case UsbManager.ACTION_USB_ACCESSORY_DETACHED:
                    //Name of extra for ACTION_USB_ACCESSORY_ATTACHED and ACTION_USB_ACCESSORY_DETACHED broadcasts containing the UsbAccessory object for the accessory.
                    UsbAccessory accessory = intent.getParcelableExtra(UsbManager.EXTRA_ACCESSORY);
                    addText(accessory.toString());
                    break;
                    */
                    case UsbManager.ACTION_USB_DEVICE_ATTACHED:
                        Log.d(TAG,"usb attched");
                        //OpenDevice();
                        break;
                    case UsbManager.ACTION_USB_DEVICE_DETACHED:
                        //Name of extra for ACTION_USB_DEVICE_ATTACHED and ACTION_USB_DEVICE_DETACHED broadcasts containing the UsbDevice object for the device.
                        //UsbDevice device = intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
                        Log.d(TAG,"usb detached");
                        //CloseDevice();
                        break;
                }
            }
        };
        intentFilter = new IntentFilter();
        intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
        intentFilter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
        registerReceiver(receiver, intentFilter);
    }
    //使用OpenCV Engine service，需要运行设备事先安装OpenCV Manager
    private BaseLoaderCallback mLoaderCallback = new BaseLoaderCallback(this) {
        @Override
        public void onManagerConnected(int status) {
            switch (status) {
                case LoaderCallbackInterface.SUCCESS: {
                    Log.i(TAG, "OpenCV loaded successfully");
                }
                break;
                default: {
                    super.onManagerConnected(status);
                }
                break;
            }
        }
    };


    @Override
    protected void onResume() {
        super.onResume();
        if (!OpenCVLoader.initDebug()) {
            Log.d(TAG, "Internal OpenCV library not found. Using OpenCV Manager for initialization");
            OpenCVLoader.initAsync(OpenCVLoader.OPENCV_VERSION_3_0_0, this, mLoaderCallback);
        } else {
            Log.d(TAG, "OpenCV library found inside package. Using it!");
            mLoaderCallback.onManagerConnected(LoaderCallbackInterface.SUCCESS);
        }
    }

    public  void OpenDevice(){
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    int status = manager.It8951ManagerOpenDeviceAPI();
                    Log.e(TAG, "OpenDevice status=" + status);
                    if (status == 0) {
                        String str = manager.GetIt8951SceenInfoAPI();
                        String[] list = str.split("x");
                        int W = Integer.valueOf(list[0]);
                        int H = Integer.valueOf(list[1]);
                        mWidth = W;
                        mHeight = H;
                        isOpen = true;
                        Log.e(TAG, "Width=" + mWidth + "   Height=" + mHeight);
                    } else {
                        isOpen = false;
                    }
                } catch (Exception e) {

                }
            }
        }).start();
    }

    public void CloseDevice() {
        try {
                manager.It8951ManagerCloseDeviceAPI();
        } catch (Exception e) {

        }
    }

    public byte[] getGrayImage(Bitmap bmp){
        //将彩色Bitmap对象转成8位4通道的Mat.
        Mat mat_bmp = new Mat(bmp.getHeight() , bmp.getWidth(), CvType.CV_8UC4);
        Utils.bitmapToMat(bmp,mat_bmp);
        //将彩色Mat对象转成单通道的灰度Mat.
        Mat mat_gray0 = new Mat();
        Imgproc.cvtColor(mat_bmp, mat_gray0, Imgproc.COLOR_BGRA2GRAY, 1);
        Mat mat_gray = new Mat();
        Core.flip(mat_gray0,mat_gray,1);  //镜像转换
       // Mat TwoValue_mat = new Mat();
      //  Imgproc.threshold(mat_gray , TwoValue_mat, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);
        byte [] bytebuffer = new byte[mat_gray.height()*mat_gray.width()];
        mat_gray.get(0, 0, bytebuffer);
        return  bytebuffer;
    }

    public byte[] getGrayImage42(Bitmap newBmp){
        Bitmap bmp1 = Bitmap.createBitmap(newBmp,0, 0,2880,1080);
        Bitmap bmp2 = Bitmap.createBitmap(newBmp,0, 1080,2880,1080);
        //将彩色Bitmap对象转成8位4通道的Mat.
        Mat mat_bmp1 = new Mat(bmp1.getHeight() , bmp1.getWidth(), CvType.CV_8UC4);
        Utils.bitmapToMat(bmp1,mat_bmp1);
        Mat mat_bmp2 = new Mat(bmp2.getHeight() , bmp1.getWidth(), CvType.CV_8UC4);
        Utils.bitmapToMat(bmp2,mat_bmp2);
        //将彩色Mat对象转成单通道的灰度Mat.
        Mat mat_gray1 = new Mat();
        Imgproc.cvtColor(mat_bmp1, mat_gray1, Imgproc.COLOR_BGRA2GRAY, 1);
        Mat mat_gray2 = new Mat();
        Imgproc.cvtColor(mat_bmp2, mat_gray2, Imgproc.COLOR_BGRA2GRAY, 1);
        Mat target_mat2 = new Mat();
        Core.flip(mat_gray2,target_mat2,0);
        byte [] bytebuffer = new byte[mWidth*mHeight];
        byte [] buffer1 = new byte[mWidth*1080];
        mat_gray1.get(0, 0, buffer1);
        byte [] buffer2 = new byte[mWidth*1080];
        target_mat2.get(0, 0, buffer2);
        System.arraycopy(buffer1, 0, bytebuffer, 0, buffer1.length);
        System.arraycopy(buffer2, 0, bytebuffer, buffer1.length, buffer2.length);
        // Mat TwoValue_mat = new Mat();
        //  Imgproc.threshold(mat_gray , TwoValue_mat, 0, 255, Imgproc.THRESH_BINARY | Imgproc.THRESH_OTSU);
        return  bytebuffer;
    }

    private Bitmap scaleBitmap(Bitmap origin, int newWidth, int newHeight) {
        if (origin == null) {
            return null;
        }
        int height = origin.getHeight();
        int width = origin.getWidth();
        float scaleWidth = ((float) newWidth) / width;
        float scaleHeight = ((float) newHeight) / height;
        Matrix matrix = new Matrix();
        matrix.postScale(-scaleWidth, scaleHeight);// 使用后乘
        Bitmap newBM = Bitmap.createBitmap(origin, 0, 0, width, height, matrix, false);
        //matrix.setScale(-1, 1);
        if (!origin.isRecycled()) {
            origin.recycle();
        }
        return newBM;
    }

    public  void DisplayImage(final int draw_id){
        new Thread(new Runnable() {
            @Override
            public void run() {
                byte [] data;

                Bitmap bitmap=BitmapFactory.decodeResource(getBaseContext().getResources(), draw_id);
                Bitmap target_bitmap = scaleBitmap(bitmap,mWidth,mHeight);
                Log.e(TAG,"开始转换");
                if(mWidth==2880){
                    data = getGrayImage42(target_bitmap);
                }else {
                    data = getGrayImage(target_bitmap);
                }
                Log.e(TAG,"结束转换 data len ="+data.length);
                try {
                    int status =  manager.DisplayImageAPI(data,mWidth,mHeight);
                    Log.e(TAG,"display image status="+status);
                }catch (Exception e){

                }
                isDisplaying=false;
            }
        }).start();
    }

    public  void showAlertDialog(String str){
        AlertDialog.Builder builder  = new AlertDialog.Builder(MainActivity.this);
        builder.setTitle("提示" ) ;
        builder.setMessage(str) ;
        builder.setPositiveButton("是" ,  null );
        builder.show();
    }

    @Override
    public void onClick(View view) {
        if(!isOpen){
            showAlertDialog("没有此设备！！");
            return;
        }
        if(isDisplaying)
            return;
        isDisplaying=true;
        switch (view.getId()){
            case R.id.button1:
                   DisplayImage(R.drawable.test1);
                break;
            case R.id.button2:
                DisplayImage(R.drawable.test2);
                break;
            case R.id.button3:
                DisplayImage(R.drawable.test3);
                break;
            case R.id.button4:
                DisplayImage(R.drawable.test4);
                break;
        }
    }

    @Override
    protected void onDestroy() {
       unregisterReceiver(receiver);
       CloseDevice();
       super.onDestroy();
    }

}
