package andraus.bluetoothhidemu;

import andraus.bluetoothhidemu.sock.SocketManager;
import andraus.bluetoothhidemu.sock.payload.HidKeyPair;
import andraus.bluetoothhidemu.sock.payload.HidKeyboardPayload;
import android.text.Editable;
import android.text.InputType;
import android.text.method.KeyListener;
import android.text.method.TextKeyListener;
import android.text.method.TextKeyListener.Capitalize;
import android.view.KeyEvent;
import android.view.View;

/**
 * KeyListener to monitor keypresses
 */
public class KeyboardKeyListener implements KeyListener {
    
    //private static final String TAG = BluetoothHidEmuActivity.TAG;
    
    private SocketManager mSocketManager = null;
    
    private TextKeyListener mTextKeyListener = null;
    
    private HidKeyboardPayload mHidPayload = new HidKeyboardPayload();
    
    public KeyboardKeyListener(SocketManager socketManager) {
        super();
        
        mTextKeyListener = new TextKeyListener(Capitalize.NONE, false);
        mSocketManager = socketManager;
        
    }

    @Override
    public void clearMetaKeyState(View view, Editable content, int states) {
        mTextKeyListener.clearMetaKeyState(view, content, states);

    }

    @Override
    public int getInputType() {
        return InputType.TYPE_CLASS_TEXT | InputType.TYPE_TEXT_FLAG_NO_SUGGESTIONS;
    }

    @Override
    public boolean onKeyDown(View view, Editable content, int keyCode, KeyEvent event) {
        switch (keyCode) {
        
        case KeyEvent.KEYCODE_ENTER:
            TextKeyListener.clear(content);
            mHidPayload.assemblePayload(HidKeyPair.ENTER);
            mSocketManager.sendPayload(mHidPayload);
            return true;
        case KeyEvent.KEYCODE_DEL:
        	mHidPayload.assemblePayload(HidKeyPair.DEL);
            mSocketManager.sendPayload(mHidPayload);
        case KeyEvent.KEYCODE_VOLUME_UP:
        case KeyEvent.KEYCODE_VOLUME_DOWN:
            mHidPayload.assemblePayload(keyCode);
            mSocketManager.sendPayload(mHidPayload);
        default:
            return mTextKeyListener.onKeyDown(view, content, keyCode, event);
        }
    }

    @Override
    public boolean onKeyOther(View view, Editable content, KeyEvent event) {
        return mTextKeyListener.onKeyOther(view, content, event);
    }

    @Override
    public boolean onKeyUp(View view, Editable content, int keyCode, KeyEvent event) {
        
        if (keyCode == KeyEvent.KEYCODE_ENTER
                || keyCode == KeyEvent.KEYCODE_DEL
                || keyCode == KeyEvent.KEYCODE_VOLUME_UP) {
        	mHidPayload.assemblePayload(Character.MIN_VALUE);
            mSocketManager.sendPayload(mHidPayload);
        }
        return mTextKeyListener.onKeyUp(view, content, keyCode, event);
    }

}