package com.joyplus.joylink; import java.util.ArrayList; import android.app.ActionBar; import android.app.ProgressDialog; import android.content.ActivityNotFoundException; import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.ActivityInfo; import android.os.Bundle; import android.os.Message; import android.util.Log; import android.view.Display; import android.view.GestureDetector; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; import android.view.MotionEvent; import android.view.View; import android.view.WindowManager; import android.view.inputmethod.InputMethodManager; import android.widget.CheckBox; import android.widget.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import android.widget.TextView; import com.wind.s1mobile.common.Protocol.ControlEvent; import com.wind.s1mobile.common.S1Constant; import com.wind.s1mobile.common.Utils; import com.wind.s1mobile.common.WifiConnectManager; import com.wind.s1mobile.common.packet.ControlEventPacket; import com.wind.s1mobile.common.packet.SystemInfo; import com.wind.s1mobile.receiver.ReceiverService; public class ControlMouse extends BaseActivity implements View.OnTouchListener, View.OnClickListener { private String TAG = "MouseMode"; private App app; private GestureDetector gestureDetector = null; private boolean isBeginScroll = false; public static int mTouchState = S1Constant.TOUCH_STATE_REST; private int mTouchSlop = 16; private float spanX; private float spanY; private LinearLayout touchPadView; private LinearLayout upAndDownScrollView; private LinearLayout leftAndRightScrollView; private LinearLayout noTouchView; private RelativeLayout touchpad_bottom_area; private RelativeLayout toolsArea; private ControlEventPacket mControlEventPacket; private float mLastMotionX; private float mLastMotionY; private long currentTimeMillis; private boolean isDown = false; private boolean isTouch = false; private Utils mUtils; private Thread receiverServerThread; public static int screenWidth; public static int screenHeight; private int toolsBarHeight = 160; private long exitTime = 0; private ArrayList<SystemInfo> serverList; private ProgressDialog mProgressDialog; private boolean isTimeout = true; private CharSequence[] searchResult; // private SensorManager mSensorManager; // private WakeLock mWakeLock; // ControlGSensor mControlGSensor; private float mFirstMotionX; private float mFirstMotionY; private float mSecondMotionX; private float mSecondMotionY; private boolean isPointerDown = false; private float scaleX; private float scaleY; private float serverScreenWidth = S1Constant.SERVER_SCREEN_WIDTH; private float serverScreenHeight = S1Constant.SERVER_SCREEN_HEIGHT; private boolean isSetRequestedOrientation = false; private static String inputServerIP; private boolean isChecked = true; private CheckBox mCheckBox4 = null; private ImageButton mSlidingMenuButton; private boolean SHOWKEYBOARD = false; public ControlMouse() { super("ControlMouse"); // TODO Auto-generated constructor stub } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); app = (App) getApplicationContext(); // requestWindowFeature(Window.FEATURE_NO_TITLE); // getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LOW_PROFILE); // getWindow().getDecorView().setSystemUiVisibility(View.STATUS_BAR_HIDDEN); setContentView(R.layout.activity_mouse_mode); getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getActionBar().setCustomView(R.layout.actionbar_layout); TextView mTextView = (TextView) getActionBar().getCustomView() .findViewById(R.id.actionBarTitle); mTextView.setText("鼠标"); mSlidingMenuButton = (ImageButton) getActionBar().getCustomView() .findViewById(R.id.slidingMenuButton1); mSlidingMenuButton.setOnClickListener(this); setProgressBarVisibility(false); System.out.println("MouseMode onCreate()"); // getWindow().addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN); // getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE // | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); // System.out.println("Touchpad onCreate"); Intent intent = new Intent(ControlMouse.this, ReceiverService.class); startService(intent); mUtils = new Utils(this); mUtils.getWiFiIpAddress(); setScreenSize(); this.touchPadView = (LinearLayout) findViewById(R.id.touchpad_bg); this.touchPadView.setOnTouchListener(this); this.upAndDownScrollView = (LinearLayout) findViewById(R.id.scrollUpAndDown_bg); this.upAndDownScrollView.setOnTouchListener(this); this.leftAndRightScrollView = (LinearLayout) findViewById(R.id.scroll_left_and_right_bg); this.leftAndRightScrollView.setOnTouchListener(this); this.noTouchView = (LinearLayout) findViewById(R.id.no_touch_bg); this.noTouchView.setOnTouchListener(this); this.touchpad_bottom_area = (RelativeLayout) findViewById(R.id.touchpad_bottom_area); setLayoutSize(); mControlEventPacket = new ControlEventPacket(); // getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE // | WindowManager.LayoutParams.SOFT_INPUT_STATE_HIDDEN); super.ChangeTouchModeNone(); // showAlertDialog(); // inputMessage.setOnClickListener(this); // inputMessage.setOnEditorActionListener(this); if (!isSetRequestedOrientation) { // receiverServerThread = new Thread(new ReceiverServerThead(this, // mSyncHandler)); // receiverServerThread.start(); createGestureListener(); // searchServer(); } } @Override public void onClick(View view) { if (view == mSlidingMenuButton) { getSlidingMenu().toggle(); } } public void OnClickSlidingMenu(View v) { super.OnClickSlidingMenu(); } public void OnClickHome(View v) { super.OnClickHome(this); } public void OnClickRemoteMouse(View v) { super.OnClickRemoteMouse(this); } public void OnClickRemoteControl(View v) { super.OnClickRemoteControl(this); } public void OnClickSetting(View v) { super.OnClickSetting(this); } @SuppressWarnings("deprecation") private void createGestureListener() { gestureDetector = new GestureDetector(gestureListener); } @Override public boolean onCreateOptionsMenu(Menu menu) { // getMenuInflater().inflate(R.menu.activity_touchpad, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { return true; } @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: setTouchMode(v); break; case MotionEvent.ACTION_MOVE: break; case MotionEvent.ACTION_UP: break; } return false; } // @Override // public boolean onTouch(View v, MotionEvent event) { // // switch (event.getAction()) { // case MotionEvent.ACTION_DOWN: // MODE = 1; // setTouchMode(v); // break; // case MotionEvent.ACTION_MOVE: // if (MODE >= 2) { // float newDist = spacing(event); // if (newDist > oldDist) { // zoomOut(); // } // if (newDist < oldDist) { // zoomIn(); // } // break; // } // break; // case MotionEvent.ACTION_UP: // MODE = 0; // break; // case MotionEvent.ACTION_POINTER_UP: // MODE -= 1; // break; // case MotionEvent.ACTION_POINTER_DOWN: // MODE -= 1; // break; // } // // return false; // } @Override public boolean onTouchEvent(MotionEvent event) { // System.out.println("onTouchEvent"); int pointerId = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; int pointerCount = event.getPointerCount(); long moveTimeSpan; try { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // System.out.println("onTouchEvent()->ACTION_DOWN"); // checkSocketConnect(); mLastMotionX = event.getX(); mLastMotionY = event.getY(); currentTimeMillis = System.currentTimeMillis(); sendTouchEvent(new ControlEventPacket(ControlEvent.MOUSE_MODE)); isPointerDown = false; isDown = true; isTouch = true; isBeginScroll = false; break; case MotionEvent.ACTION_MOVE: if (pointerCount == 1) { if (!isPointerDown) { // System.out.println("onTouchEvent()->ACTION_MOVE"); float eventX = event.getX(); float deltaX = mLastMotionX - eventX; mLastMotionX = eventX; moveTimeSpan = (System.currentTimeMillis() - currentTimeMillis); float eventY = event.getY(); float deltaY = mLastMotionY - eventY; mLastMotionY = eventY; executeTouchAction(moveTimeSpan, deltaX, deltaY); super.waitForMouseMove(); } } else if (pointerCount > 1) { float eventX = event.getX(event .getPointerId(pointerCount - 2)); float deltaX = mFirstMotionX - eventX; mFirstMotionX = eventX; float eventY = event.getY(event .getPointerId(pointerCount - 2)); float deltaY = mFirstMotionY - eventY; mFirstMotionY = eventY; // dump here..... float eventSX = event.getX(event .getPointerId(pointerCount - 1)); float deltaSX = mSecondMotionX - eventSX; mSecondMotionX = eventSX; float eventSY = event.getY(event .getPointerId(pointerCount - 1)); float deltaSY = mSecondMotionY - eventSY; mSecondMotionY = eventSY; if (mFirstMotionX > (mFirstMotionX + mSecondMotionX) / 2) { mControlEventPacket.setTouchInfo( ControlEvent.MOUSE_MODE_DOUBLE_MOVE, deltaX * scaleX, deltaY * scaleY); mControlEventPacket.setPointer2X(deltaSX * scaleX); mControlEventPacket.setPointer2Y(deltaSY * scaleY); } else { mControlEventPacket.setTouchInfo( ControlEvent.MOUSE_MODE_DOUBLE_MOVE, -(deltaX * scaleX), -(deltaY * scaleY)); mControlEventPacket.setPointer2X(-(deltaSX * scaleX)); mControlEventPacket.setPointer2Y(-(deltaSY * scaleY)); } sendTouchEvent(mControlEventPacket); } break; case MotionEvent.ACTION_UP: // System.out.println("onTouchEvent()->ACTION_UP"); if (isPointerDown) { sendTouchEvent(new ControlEventPacket( ControlEvent.MOUSE_MODE_ACTION_UP)); isPointerDown = false; } isDown = false; spanX = 0; spanY = 0; sendTouchEvent(new ControlEventPacket( ControlEvent.LEFT_MOUSE_UP)); break; case MotionEvent.ACTION_POINTER_DOWN: isPointerDown = true; mFirstMotionX = event .getX(event.getPointerId(pointerCount - 2)); mFirstMotionY = event .getY(event.getPointerId(pointerCount - 2)); mSecondMotionX = event.getX(event .getPointerId(pointerCount - 1)); mSecondMotionY = event.getY(event .getPointerId(pointerCount - 1)); sendTouchEvent(new ControlEventPacket( ControlEvent.MOUSE_MODE_POINTER_DOWN)); break; case MotionEvent.ACTION_POINTER_UP: sendTouchEvent(new ControlEventPacket( ControlEvent.MOUSE_MODE_POINTER_UP)); break; } } catch (Exception e) { e.printStackTrace(); } return gestureDetector.onTouchEvent(event); } GestureDetector.OnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() { public boolean onDown(MotionEvent e) { return false; } public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { return false; } public void onLongPress(MotionEvent e) { super.onLongPress(e); } public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { return true; } public void onShowPress(MotionEvent e) { } public boolean onSingleTapUp(MotionEvent e) { if (mTouchState == S1Constant.TOUCH_STATE_MOUSE) { sendTouchEvent(new ControlEventPacket(ControlEvent.SINGLE_CLICK)); } return true; } @Override public boolean onDoubleTap(MotionEvent e) { return true; } }; private void setTouchMode(View v) { if (v == this.touchPadView) { mTouchState = S1Constant.TOUCH_STATE_MOUSE; } else if (v == this.upAndDownScrollView) { mTouchState = S1Constant.TOUCH_STATE_UP_AND_DOWN_SCROLL; } else if (v == this.leftAndRightScrollView) { mTouchState = S1Constant.TOUCH_STATE_LEFT_AND_RIGHT_SCROLL; } else { mTouchState = S1Constant.TOUCH_STATE_NO_TOUCH; } } private void executeTouchAction(long moveTimeSpan, float deltaX, float deltaY) { String prefsName = getPackageName() + "_preferences"; // [PACKAGE_NAME]_preferences SharedPreferences prefs = getSharedPreferences(prefsName, Context.MODE_PRIVATE); int mouseSpeed = prefs.getInt("mouseSpeed", 2); deltaX = -(deltaX * mouseSpeed); deltaY = -(deltaY * mouseSpeed); spanX += Math.abs(deltaX); spanY += Math.abs(deltaY); boolean isXMoved = spanX > mTouchSlop; boolean isYMoved = spanY > mTouchSlop; if (mTouchState == S1Constant.TOUCH_STATE_LEFT_AND_RIGHT_SCROLL) { if (isDown) { sendTouchEvent(new ControlEventPacket( ControlEvent.LEFT_AND_RIGHT_SCROLL_MODE)); sendTouchEvent(new ControlEventPacket( ControlEvent.LEFT_MOUSE_DOWN)); isDown = false; } else { mControlEventPacket.setTouchInfo(ControlEvent.TP_MODE_DRAG, deltaX, 0); sendTouchEvent(mControlEventPacket); } } else if (mTouchState == S1Constant.TOUCH_STATE_UP_AND_DOWN_SCROLL) { if (isDown) { sendTouchEvent(new ControlEventPacket( ControlEvent.UP_AND_DOWN_SCROLL_MODE)); sendTouchEvent(new ControlEventPacket( ControlEvent.LEFT_MOUSE_DOWN)); isDown = false; } else { sendTouchEvent(new ControlEventPacket(ControlEvent.MOVE_DRAG)); } mControlEventPacket.setTouchInfo(ControlEvent.TP_MODE_DRAG, 0, deltaY); sendTouchEvent(mControlEventPacket); } else if (mTouchState == S1Constant.TOUCH_STATE_NO_TOUCH) { // do nothing } else if (mTouchState == S1Constant.TOUCH_STATE_MOUSE) { if (isTouch) { sendTouchEvent(new ControlEventPacket(ControlEvent.MOUSE_MODE)); isTouch = false; } boolean isOnlyMoveMouseIcon = true; if (moveTimeSpan < 300) { if (isXMoved || isYMoved) { isBeginScroll = true; isDown = false; } } else { if (!isBeginScroll) { if (!isPointerDown) { if (isDown) { mUtils.Vibrate(25); sendTouchEvent(new ControlEventPacket( ControlEvent.LEFT_MOUSE_DOWN)); isDown = false; } } isOnlyMoveMouseIcon = false; } } if (isOnlyMoveMouseIcon) { mControlEventPacket.setTouchInfo( ControlEvent.ONLY_MOVE_MOUSE_ICON, deltaX, deltaY); sendTouchEvent(mControlEventPacket); } else { mControlEventPacket.setTouchInfo(ControlEvent.TP_MODE_DRAG, deltaX, deltaY); sendTouchEvent(mControlEventPacket); } } } public void OnClickTopLeft(View v) { } public void OnClickTopRight(View v) { Intent intent = new Intent(this, ControlTouchpad.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); try { startActivity(intent); finish(); } catch (ActivityNotFoundException ex) { Log.e(TAG, "Call Main failed", ex); } } @Override public boolean dispatchKeyEvent(KeyEvent event) { if (event.getAction() != KeyEvent.ACTION_UP) {// 不响应按键抬起时的动作 if (SHOWKEYBOARD) { if (event.getKeyCode() == KeyEvent.KEYCODE_UNKNOWN) { ControlEventPacket controlEventPacket = new ControlEventPacket( ControlEvent.SEND_INPUT_MSG); controlEventPacket.setInputMessage(event.getCharacters()); sendTouchEvent(controlEventPacket); // } else if (event.getKeyCode() == KeyEvent.KEYCODE_ENTER){ // sendTouchEvent(new // ControlEventPacket(ControlEvent.SINGLE_CLICK)); } else sendKeyCode(event.getKeyCode()); return true; } if (event.getKeyCode() == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { sendKeyCode(KeyEvent.KEYCODE_BACK); finish(); return true; } } return super.dispatchKeyEvent(event); } @Override protected void onDestroy() { if (receiverServerThread != null) { receiverServerThread.interrupt(); receiverServerThread = null; } super.onDestroy(); } @SuppressWarnings("deprecation") private void setScreenSize() { WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); screenWidth = display.getWidth(); screenHeight = display.getHeight(); if (screenWidth == 600 && screenHeight == 976) { setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); isSetRequestedOrientation = true; } // System.out.println("setScreenSize()->screenWidth:" + screenWidth + // " screenHeight:" + screenHeight); } private void setLayoutSize() { // System.out.println("setLayoutSize():" + screenWidth + ":" + // screenHeight); if (screenWidth == 480 && screenHeight == 800) { toolsBarHeight = 80; } else if (screenWidth == 320 && screenHeight == 480) { toolsBarHeight = 53; } else if (screenWidth == 1024 && screenHeight == 552) { toolsBarHeight = 53; } screenHeight = screenHeight - toolsBarHeight; setScaleXY(screenWidth, screenHeight); } private boolean isAlreadyInList(ArrayList<SystemInfo> serverList, String wifiIPAddress) { boolean isExists = false; int listSize = serverList.size(); for (int i = 0; i < listSize; i++) { if (serverList.get(i).getServerWifiAddress().equals(wifiIPAddress)) { isExists = true; break; } } return isExists; } private void sendMessage(int info) { Message message = Message.obtain(); message.what = info; mLoadingHandler.sendMessage(message); } @Override protected void onResume() { // TODO Auto-generated method stub ControlGSensor mControlGSensor = new ControlGSensor(getRemote()); mControlGSensor.mSensorMode = this.getResources().getConfiguration().orientation; // ControlGSensor.mSensorMode = // this.getResources().getConfiguration().orientation; super.onResume(); } private void checkSocketConnect() { if (inputServerIP == null || "".equals(inputServerIP)) { ControlMouse.inputServerIP = super.getRemoteServerAddress(); } startAccessServerThread(S1Constant.ACCESS_SERVER_TYPE_CHECK_CONNECT); } // @Override // public void onCheckedChanged(CompoundButton buttonView, boolean // isChecked) { // if (buttonView == keyboardButton) { // // if (isChecked) { // setIputMessageVisibility(true); // } else { // setIputMessageVisibility(false); // } // } // } private void setScaleXY(float touchAreaWidth, float touchAreaHeight) { scaleX = (float) serverScreenWidth / touchAreaWidth; scaleY = (float) serverScreenHeight / touchAreaHeight; System.out.println("scaleXY:" + scaleX + ":" + scaleY); } private void ConnectionServerAP() { WifiConnectManager wifiAdmin = new WifiConnectManager(this); wifiAdmin.openWifi(); wifiAdmin.addNetwork(wifiAdmin.CreateWifiInfo("Android", "12345678", S1Constant.WIFI_CONNECT_WIFICIPHER_WPA)); } // @Override // public void onClick(View view) { // if (view == sendMessageButton) { // ControlEventPacket controlEventPacket = new // ControlEventPacket(ControlEvent.SEND_INPUT_MSG); // controlEventPacket.setInputMessage(this.inputMessage.getText().toString()); // sendTouchEvent(controlEventPacket); // // mRemote.sendInputMessage(controlEventPacket); // this.inputMessage.setText(""); // // System.out.println("Touchpad-> onClick()--sendMessageButton"); // } else if (view == delMessageButton) { // // System.out.println("delMessageButton"); // sendTouchEvent(new ControlEventPacket(ControlEvent.DEL_INPUT_MSG)); // } else if (view == touchpadButton) { // startActivity(new Intent(this, TouchpadMode.class)); // } else if (view == toolHomeButton) { // sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_HOME)); // } else if (view == toolBackButton) { // sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_BACK)); // } else if (view == toolMenuButton) { // sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_MENU)); // } else if (view == toolSettingsButton) { // // Intent startSettings = new Intent(this, SettingListActivity.class); // // startSettings.putExtra(S1Constant.INTENT_EXTRA_CONFIGURATION, // this.getResources().getConfiguration().orientation); // // startActivity(startSettings); // } else if (view == toolRecentButton) { // sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_TASK)); // } else if (view == toolConnect) { // ConnectionServerAP(); // } // } public void OnClickB1(View v) { sendKeyCode(KeyEvent.KEYCODE_HOME); } public void OnClickB2(View v) { if (!SHOWKEYBOARD) showSoftKeyboard(); else hideSoftKeyboard(v); } public void OnClickB3(View v) { Intent intent = new Intent(this, ControlTouchpad.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); try { startActivity(intent); finish(); } catch (ActivityNotFoundException ex) { Log.e(TAG, "Call ControlTouchpad failed", ex); } } public void OnClickB4(View v) { sendKeyCode(KeyEvent.KEYCODE_MENU); // if (isChecked) { // isChecked = false; // setIputMessageVisibility(true); // } else { // isChecked = true; // setIputMessageVisibility(false); // } } public void OnClickB5(View v) { sendKeyCode(KeyEvent.KEYCODE_BACK); } public void OnClickBSDel(View v) { sendTouchEvent(new ControlEventPacket(ControlEvent.DEL_INPUT_MSG)); } public void OnClickBSSend(View v) { } public void showSoftKeyboard() { SHOWKEYBOARD = true; InputMethodManager m = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); m.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS); } public void hideSoftKeyboard(View view) { SHOWKEYBOARD = false; InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); imm.hideSoftInputFromWindow(view.getWindowToken(), 0); } @Override void ConnectOK(String name) { // TODO Auto-generated method stub } @Override void ConnectFailed() { // TODO Auto-generated method stub } }