package andraus.bluetoothhidemu.ui; import andraus.bluetoothhidemu.ButtonClickListener; import andraus.bluetoothhidemu.KeyboardKeyListener; import andraus.bluetoothhidemu.KeyboardTextWatcher; import andraus.bluetoothhidemu.R; import andraus.bluetoothhidemu.SpecialKeyListener; import andraus.bluetoothhidemu.TouchpadListener; import andraus.bluetoothhidemu.sock.SocketManager; import andraus.bluetoothhidemu.sock.payload.HidPointerPayload; import andraus.bluetoothhidemu.spoof.Spoof.SpoofMode; import andraus.bluetoothhidemu.view.EchoEditText; import android.content.Context; import android.view.Gravity; import android.view.KeyEvent; import android.view.View; import android.view.ViewGroup; import android.view.inputmethod.EditorInfo; import android.widget.ImageView; import android.widget.RadioGroup; import android.widget.ViewFlipper; /** * Controls layout for PS3 wireless keypad emulation. * Contains tabs for touchpad, navigation keys, etc. */ public class Ps3KeypadUiControls extends UiControls { private RadioGroup mTabsRadioGroup = null; private ViewFlipper mViewFlipper = null; private EchoEditText mEchoEditText = null; private ImageView mTouchpadImageView = null; private ImageView mLeftClickImageView = null; private ImageView mRightClickImageView = null; View mUpButton = null; View mDownButton = null; View mLeftButton = null; View mRightButton = null; View mEnterButton = null; View mEscButton = null; private KeyboardKeyListener mKeyboardKeyListener = null; private KeyboardTextWatcher mKeyboardTextWatcher = null; private TouchpadListener mTouchpadListener = null; private ButtonClickListener mLeftClickListener = null; private ButtonClickListener mRightClickListener = null; private HidPointerPayload mHidPayload; /** * Constructor * * @param context * @param socketManager * @param mode * @param mainLayout */ protected Ps3KeypadUiControls(Context context, SocketManager socketManager, SpoofMode mode, ViewGroup mainLayout) { super(context, socketManager, mode, mainLayout); mTouchpadImageView = (ImageView) mControlsLayout.findViewById(R.id.TouchpadImageView); mLeftClickImageView = (ImageView) mControlsLayout.findViewById(R.id.LeftButtonImageView); mRightClickImageView = (ImageView) mControlsLayout.findViewById(R.id.RightButtonImageView); mEchoEditText = (EchoEditText) mControlsLayout.findViewById(R.id.EchoEditText); mEchoEditText.setGravity(Gravity.CENTER); mEchoEditText.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI); setupTabs(); setupButtons(true); } /** * cleanup() */ @Override public void cleanup(ViewGroup mainLayout) { setupButtons(false); setControlsListeners(false); super.cleanup(mainLayout); } /** * animate() */ @Override public void animate(int visibility) { super.animate(visibility); if (visibility == View.VISIBLE) { if (mEchoEditText != null) mEchoEditText.requestFocus(); } } /** * onKeyDown() */ @Override public boolean processKeyDown(int keyCode, KeyEvent event) { return false; } /** * onKeyUp() */ @Override public boolean processKeyUp(int keyCode, KeyEvent event) { return false; } /** * setControlsListeners() */ @Override public void setControlsListeners(boolean enable) { if (enable) { if (mHidPayload == null) { mHidPayload = new HidPointerPayload(); } if (mTouchpadListener == null) { mTouchpadListener = new TouchpadListener(mContext, mSocketManager, mLeftClickImageView, mHidPayload); } if (mTouchpadImageView != null) mTouchpadImageView.setOnTouchListener(mTouchpadListener); if (mLeftClickListener == null) { mLeftClickListener = new ButtonClickListener(mContext, mSocketManager, HidPointerPayload.MOUSE_BUTTON_1, true, mHidPayload); } if (mLeftClickImageView != null) { mLeftClickImageView.setOnClickListener(mLeftClickListener); mLeftClickImageView.setOnLongClickListener(mLeftClickListener); } if (mRightClickListener == null) { mRightClickListener = new ButtonClickListener(mContext, mSocketManager, HidPointerPayload.MOUSE_BUTTON_2, false, mHidPayload); } if (mRightClickImageView != null) { mRightClickImageView.setOnClickListener(mRightClickListener); mRightClickImageView.setOnLongClickListener(mRightClickListener); } /* * EchoEditText needs both listeners below: * KeyboardKeyListener is used to intercept a couple of key events - enter and backspace. * KeyboardTextWatcher is used to intercept regular text keys. * * I would love to only use one of them, but unfortunately, it's not reliable. * */ if (mKeyboardKeyListener == null) { mKeyboardKeyListener = new KeyboardKeyListener(mSocketManager); } if (mEchoEditText != null) mEchoEditText.setKeyListener(mKeyboardKeyListener); if (mKeyboardTextWatcher == null) { mKeyboardTextWatcher = new KeyboardTextWatcher(mSocketManager); } if (mEchoEditText != null) mEchoEditText.addTextChangedListener(mKeyboardTextWatcher); } else { mTouchpadImageView.setOnTouchListener(null); mLeftClickImageView.setOnClickListener(null); mLeftClickImageView.setOnLongClickListener(null); mRightClickImageView.setOnClickListener(null); mRightClickImageView.setOnLongClickListener(null); mEchoEditText.setKeyListener(null); mEchoEditText.removeTextChangedListener(mKeyboardTextWatcher); } } /** * setupTabs() */ private void setupTabs() { mTabsRadioGroup = (RadioGroup) mControlsLayout.findViewById(R.id.NavRadioGroup); mViewFlipper = (ViewFlipper) mControlsLayout.findViewById(R.id.MainViewFlipper); mTabsRadioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() { @Override public void onCheckedChanged(RadioGroup group, int checkedId) { switch (checkedId) { case R.id.TouchpadRadioButton: mViewFlipper.setDisplayedChild(0); break; case R.id.NavKeysRadioButton: mViewFlipper.setDisplayedChild(1); break; } } }); } /** * setupButtons() * * @param enable */ private void setupButtons(boolean enable) { SpecialKeyListener specialKeyListener = new SpecialKeyListener(mContext, mSocketManager); if (enable) { mUpButton = (View) mControlsLayout.findViewById(R.id.UpButton); mUpButton.setOnTouchListener(specialKeyListener); mDownButton = (View) mControlsLayout.findViewById(R.id.DownButton); mDownButton.setOnTouchListener(specialKeyListener); mLeftButton = (View) mControlsLayout.findViewById(R.id.LeftButton); mLeftButton.setOnTouchListener(specialKeyListener); mRightButton = (View) mControlsLayout.findViewById(R.id.RightButton); mRightButton.setOnTouchListener(specialKeyListener); mEnterButton = (View) mControlsLayout.findViewById(R.id.EnterButton); mEnterButton.setOnTouchListener(specialKeyListener); mEscButton = (View) mControlsLayout.findViewById(R.id.EscButton); mEscButton.setOnTouchListener(specialKeyListener); } else { mUpButton.setOnTouchListener(null); mUpButton = null; mDownButton.setOnTouchListener(null); mDownButton = null; mLeftButton.setOnTouchListener(null); mLeftButton = null; mRightButton.setOnTouchListener(null); mRightButton = null; mEnterButton.setOnTouchListener(null); mEnterButton = null; mEscButton.setOnTouchListener(null); mEscButton = null; } } }