package com.allenliu.classicbt;

import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.allenliu.classicbt.listener.ConnectResultlistner;
import com.allenliu.classicbt.listener.PinResultListener;
import com.allenliu.classicbt.listener.ResultListener;
import com.allenliu.classicbt.listener.ScanResultListener;

/**
 * @author AllenLiu
 * @version 1.0
 * @date 2019/5/9

 */
public class BtReceiver extends BroadcastReceiver {


    private ScanResultListener scanResultListener;
    private PinResultListener pinResultListener;
    private ResultListener cancelPinResultListener;
    private final String TAG = "BtReceiver";
   private ConnectResultlistner serverConnectResultListener;
   private ConnectResultlistner clientConnectResultListener;
    public void setPinResultListener(PinResultListener pinResultListener) {
        this.pinResultListener = pinResultListener;
    }

    public void setCancelPinResultListener(ResultListener cancelPinResultListener) {
        this.cancelPinResultListener = cancelPinResultListener;
    }

    public void setScanResultListener(ScanResultListener scanResultListener) {
        this.scanResultListener = scanResultListener;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        // Get the BluetoothDevice object from the Intent
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        // When discovery finds a device
        if (BluetoothDevice.ACTION_FOUND.equals(action)) {
            // Add the name and address to an array adapter to show in a ListView
            if (scanResultListener != null) {
                scanResultListener.onDeviceFound(device);
            }
            //配对请求
        } else if (BluetoothDevice.ACTION_PAIRING_REQUEST.equals(action)) {
//            try {
//
//                //1.确认配对
//                Method setPairingConfirmation = device.getClass().getDeclaredMethod("setPairingConfirmation", boolean.class);
//                setPairingConfirmation.invoke(device, true);
//                //2.终止有序广播
//                abortBroadcast();//如果没有将广播终止,则会出现一个一闪而过的配对框。
//                //3.调用setPin方法进行配对...
////                boolean ret = ClsUtils.setPin(device.getClass(), device, pin);
//                Method removeBondMethod = device.getClass().getDeclaredMethod("setPin", new Class[]{byte[].class});
//                Boolean returnValue = (Boolean) removeBondMethod.invoke(device, new Object[]{pin.getBytes()});
//            } catch (Exception e) {
//                // TODO Auto-generated catch block
//                e.printStackTrace();
//                if (pinResultListener != null) {
//                    pinResultListener.pairFailed(device);
//                }
//
//            }
        } else if (BluetoothDevice.ACTION_BOND_STATE_CHANGED.equals(action)) {
            switch (device.getBondState()) {
                case BluetoothDevice.BOND_NONE:
                    Log.d(TAG, "取消配对");
                    if (pinResultListener != null)
                        pinResultListener.pairFailed(device);
                    break;
                case BluetoothDevice.BOND_BONDING:
                    Log.d(TAG, "配对中");
                    if (pinResultListener != null)
                        pinResultListener.pairing(device);
                    break;
                case BluetoothDevice.BOND_BONDED:
                    Log.d(TAG, "配对成功");
                    if (pinResultListener != null)
                        pinResultListener.paired(device);
                    break;

            }
        }else if ((BluetoothAdapter.ACTION_STATE_CHANGED.equals(action)&&intent.getIntExtra(BluetoothAdapter.EXTRA_STATE, -1)
                == BluetoothAdapter.STATE_OFF)||BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(action)){

                if(serverConnectResultListener!=null)
                    serverConnectResultListener.disconnected();
                if(clientConnectResultListener!=null)
                    clientConnectResultListener.disconnected();


        }

    }

    public void setServerConnectResultListener(ConnectResultlistner serverConnectResultListener) {
        this.serverConnectResultListener=serverConnectResultListener;
    }

    public void setClientConnectResultListener(ConnectResultlistner clientConnectResultListener) {
        this.clientConnectResultListener=clientConnectResultListener;
    }
}