package com.joyplus.joylink; import java.util.Timer; import java.util.TimerTask; import android.app.ActionBar; import android.app.Activity; import android.content.ActivityNotFoundException; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.graphics.Bitmap; import android.graphics.drawable.BitmapDrawable; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.Display; import android.view.GestureDetector; import android.view.Gravity; 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.ImageButton; import android.widget.LinearLayout; import android.widget.RelativeLayout; import com.wind.s1mobile.common.Protocol.ControlEvent; import com.wind.s1mobile.common.S1Constant; import com.wind.s1mobile.common.Utils; import com.wind.s1mobile.common.packet.ControlEventPacket; import com.wind.s1mobile.common.packet.SystemInfo; import com.wind.s1mobile.receiver.TcpServiceThread; import com.wind.s1mobile.send.Remote; public class ControlTouchpad extends Activity implements View.OnTouchListener, View.OnClickListener { // public ControlTouchpad() { // super("ControlTouchpad"); // // TODO Auto-generated constructor stub // } private String TAG = "ControlTouchpad"; private App app; View mContentView = null; private GestureDetector gestureDetector = null; public static Remote mRemote; public static Context mContext; private float screenWidth; private float screenHeight; private float scaleX; private float scaleY; // public static byte[] imageByte; // public static Bitmap mShotScreenBitmap; private LinearLayout mShotScreenView; private LinearLayout mTPModeLayout; private float mLastMotionX; private float mLastMotionY; private ControlEventPacket mControlEventPacket; // private Thread mTcpServiceThread; private TcpServiceThread mTcpServiceThread; private Thread thread; private Utils mUtils; private float serverScreenWidth = 1280; private float serverScreenHeight = 720; // private Button mouseButton; // private ToggleButton autoShotScreenButton; // private Button manualShotScreenButton; // // private Button settingButton; // private Button cleanScreenButton; // private Button toolHomeButton; // private Button toolBackButton; // private Button toolRecentButton; // private Button toolMenuButton; private Timer sendShotScreenTimer; private SendShotScreenTask sendShotScreenTask; // private RelativeLayout touchpadToolsArea; private int toolsBarHeight = 30 * 2 + 133; private int toolsBarWidth = 76 + 127 + 20; // private HorizontalScrollView toolsAreaScroll; private ControlGSensor mControlGSensor; private boolean isChecked; private boolean SHOWKEYBOARD = false; private ImageButton mSlidingMenuButtonL; private ImageButton mTPButton1; private ImageButton mTPButton2; private ImageButton mTPButton3; public Handler mSyncHandler = new Handler() { public void handleMessage(android.os.Message msg) { int what = msg.what; if (what == ControlEvent.SCREEN_SHOT.getId()) { // syncServerInfo(msg); System.out.println("SYNC_SCREEN_SCALE_INFO:"); Bitmap mShotScreenBitmap = (Bitmap) Utils .Bytes2Bimap((byte[]) msg.obj); // bindShotScreen(mShotScreenBitmap); } }; }; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_touchpad_mode); getActionBar().setDisplayOptions(ActionBar.DISPLAY_SHOW_CUSTOM); getActionBar().setCustomView(R.layout.actionbar_layout_tp); mSlidingMenuButtonL = (ImageButton) getActionBar().getCustomView() .findViewById(R.id.slidingMenuButtonL); mSlidingMenuButtonL.setOnClickListener(this); mTPButton1 = (ImageButton) getActionBar().getCustomView().findViewById( R.id.TPMenuButton1); mTPButton1.setOnClickListener(this); mTPButton2 = (ImageButton) getActionBar().getCustomView().findViewById( R.id.TPMenuButton2); mTPButton2.setOnClickListener(this); mTPButton3 = (ImageButton) getActionBar().getCustomView().findViewById( R.id.TPMenuButton3); mTPButton3.setOnClickListener(this); app = (App) getApplicationContext(); mControlGSensor = new ControlGSensor(app.getmRemote()); // ControlGSensor.mSensorMode = // this.getResources().getConfiguration().orientation; mControlGSensor.mSensorMode = this.getResources().getConfiguration().orientation; mShotScreenView = (LinearLayout) findViewById(R.id.shotScreenView); mShotScreenView.setOnTouchListener(this); mTPModeLayout = (LinearLayout) findViewById(R.id.tpModeLayout); mControlEventPacket = new ControlEventPacket(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(S1Constant.ACTION_RECEIVER_SHOTSCREEN); registerReceiver(mReceiver, intentFilter); // mRemote = MouseMode.mRemote; mRemote = app.getmRemote(); mContext = getBaseContext(); mUtils = new Utils(mContext); isChecked = false; setLayoutSize(); } @Override public void onClick(View view) { if (view == mTPButton1) { OnClick7(view); } else if (view == mTPButton2) { OnClick8(view); } else if (view == mTPButton3) { OnClick10(view); } else if (view == mSlidingMenuButtonL) { finish(); } } @Override public boolean onCreateOptionsMenu(Menu menu) { // getMenuInflater().inflate(R.menu.activity_tp_mode_screen, menu); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { return true; } @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; } } return super.dispatchKeyEvent(event); } private void sendKeyCode(int keycode) { SystemInfo systemInfo = new SystemInfo(); systemInfo.setKeycode(keycode); ControlEventPacket packet = new ControlEventPacket( ControlEvent.SEND_KEY_CODE); packet.setSystemInfo(systemInfo); mRemote.queuePacket(packet); } @Override public boolean dispatchTrackballEvent(MotionEvent ev) { // TODO Auto-generated method stub return super.dispatchTrackballEvent(ev); } private void sendTouchEvent(ControlEventPacket mouseEventPacket) { mRemote.queuePacket(mouseEventPacket); } public void bindShotScreen(Bitmap bitmap) { System.out.println("bingScreenShot()->bitmap:" + bitmap); // System.out.println("1"); if (bitmap != null) { System.out.println("2"); float[] finalSize = Utils.getImageSize(screenWidth, screenHeight, bitmap); float finalWidth = finalSize[0]; float finalHeight = finalSize[1]; setScaleXY(finalWidth, finalHeight); if (finalWidth == screenWidth && finalHeight < screenHeight) { mTPModeLayout.setGravity(Gravity.CENTER_VERTICAL); } else if (finalHeight == screenHeight && finalWidth < screenWidth) { mTPModeLayout.setGravity(Gravity.CENTER_HORIZONTAL); } this.mShotScreenView .setLayoutParams(new RelativeLayout.LayoutParams(Math .round(finalWidth), Math.round(finalHeight))); this.mShotScreenView.setBackgroundDrawable(new BitmapDrawable( bitmap)); findViewById(R.id.textViewJP).setVisibility(View.GONE); } } private BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (action.equals(S1Constant.ACTION_RECEIVER_SHOTSCREEN)) { Object object = (Object) intent .getSerializableExtra(S1Constant.INTENT_EXTRA_SHOTSCREEN); Bitmap mShotScreenBitmap = (Bitmap) Utils .Bytes2Bimap((byte[]) object); bindShotScreen(mShotScreenBitmap); } else { } } }; @Override public boolean onTouch(View v, MotionEvent event) { int pointerId = (event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK) >> MotionEvent.ACTION_POINTER_ID_SHIFT; // System.out.println("pointerId:" + pointerId); int pointerCount = event.getPointerCount(); try { switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: mLastMotionX = event.getX(); mLastMotionY = event.getY(); mControlEventPacket.setTouchInfo( ControlEvent.TP_MODE_LEFT_MOUSE_DOWN, event.getX() * scaleX, event.getY() * scaleY); sendTouchEvent(mControlEventPacket); break; case MotionEvent.ACTION_MOVE: if (pointerCount == 1) { float eventX = event.getX(); float eventY = event.getY(); float deltaX = mLastMotionX - eventX; mLastMotionX = eventX; float deltaY = mLastMotionY - eventY; mLastMotionY = eventY; mControlEventPacket.setTouchInfo(ControlEvent.TP_MODE_DRAG, -(deltaX * scaleX), -(deltaY * scaleY)); sendTouchEvent(mControlEventPacket); // System.out.print("pointerCount==1:" + eventX + ":" + // eventY); } else if (pointerCount > 1) { float eventX = event.getX(event .getPointerId(pointerCount - 2)); float eventY = event.getY(event .getPointerId(pointerCount - 2)); float eventSX = event.getX(event .getPointerId(pointerCount - 1)); float eventSY = event.getY(event .getPointerId(pointerCount - 1)); mControlEventPacket.setTouchInfo( ControlEvent.TP_MODE_DRAG_RIGHT, eventX * scaleX, eventY * scaleY); mControlEventPacket.setPointer2X(eventSX * scaleX); mControlEventPacket.setPointer2Y(eventSY * scaleY); sendTouchEvent(mControlEventPacket); // System.out.print("pointerCount==2:"+eventSX+":"+eventSY); } break; case MotionEvent.ACTION_UP: mLastMotionX = event.getX(pointerId); mLastMotionY = event.getY(pointerId); mControlEventPacket.setTouchInfo( ControlEvent.TP_MODE_LEFT_MOUSE_UP, mLastMotionX * scaleX, mLastMotionY * scaleY); sendTouchEvent(mControlEventPacket); break; case MotionEvent.ACTION_POINTER_DOWN: float eventX = event.getX(event.getPointerId(pointerCount - 2)); float eventY = event.getY(event.getPointerId(pointerCount - 2)); float eventSX = event .getX(event.getPointerId(pointerCount - 1)); float eventSY = event .getY(event.getPointerId(pointerCount - 1)); mControlEventPacket.setTouchInfo( ControlEvent.TP_MODE_RIGHT_MOUSE_DOWN, eventX * scaleX, eventY * scaleY); mControlEventPacket.setPointer2X(eventSX * scaleX); mControlEventPacket.setPointer2Y(eventSY * scaleY); sendTouchEvent(mControlEventPacket); // System.out.print("pointerCount==2:"+eventSX+":"+eventSY); break; case MotionEvent.ACTION_POINTER_UP: float eventX1 = event .getX(event.getPointerId(pointerCount - 2)); float eventY1 = event .getY(event.getPointerId(pointerCount - 2)); float eventSX1 = event.getX(event .getPointerId(pointerCount - 1)); float eventSY1 = event.getY(event .getPointerId(pointerCount - 1)); mControlEventPacket.setTouchInfo( ControlEvent.TP_MODE_RIGHT_MOUSE_UP, eventX1 * scaleX, eventY1 * scaleY); mControlEventPacket.setPointer2X(eventSX1 * scaleX); mControlEventPacket.setPointer2Y(eventSY1 * scaleY); sendTouchEvent(mControlEventPacket); // System.out.print("pointerCount==2:"+eventSX1+":"+eventSY1); break; } } catch (Exception e) { e.printStackTrace(); } return true; } private void setScaleXY(float touchAreaWidth, float touchAreaHeight) { scaleX = (float) serverScreenWidth / touchAreaWidth; scaleY = (float) serverScreenHeight / touchAreaHeight; // System.out.println("scaleXY:" + scaleX + ":" + scaleY); } private void setScreenSize() { WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); screenWidth = display.getWidth() - toolsBarWidth; // System.out.println("setScreenSize()1" + screenWidth + ":" + // screenHeight); // if (screenWidth == 1024 && screenHeight == 552) { screenHeight = display.getHeight() - toolsBarHeight; // } else { // screenHeight = display.getHeight(); // } // System.out.println("setScreenSize()->serverScreenWidth:"+serverScreenWidth+"serverScreenHeight:" // +serverScreenHeight+ "screenWidth:"+screenWidth + "screenHeight:" + // screenHeight); setScaleXY(screenWidth, screenHeight); } @Override protected void onResume() { mControlGSensor.mSensorMode = this.getResources().getConfiguration().orientation; // ControlGSensor.mSensorMode = // this.getResources().getConfiguration().orientation; super.onResume(); } private void cleanScreen() { mShotScreenView.setBackgroundDrawable(null); } private void sendShotScreen() { // System.out.println("sendShotScreen()"); mTcpServiceThread = app.getmTcpServiceThread(); if (mTcpServiceThread == null) { mTcpServiceThread = new TcpServiceThread(this, mSyncHandler); app.setmTcpServiceThread(mTcpServiceThread); thread = new Thread(mTcpServiceThread); thread.start(); } // setScreenSize(toolsBarHeight); ControlEventPacket controlEventPacket = new ControlEventPacket(); controlEventPacket.setControlEvent(ControlEvent.SCREEN_SHOT); SystemInfo systemInfo = new SystemInfo(); // System.out.println("sendShotScreen() screenWidth:" + screenWidth + // " screenHeight:" + screenHeight); systemInfo.setScreenWidth(screenWidth); systemInfo.setScreenHeight(screenHeight); systemInfo.setServerWifiAddress(mUtils.getWiFiIpAddress()); controlEventPacket.setSystemInfo(systemInfo); sendTouchEvent(controlEventPacket); } private Handler sendShotScreenHandler = new Handler() { public void handleMessage(android.os.Message msg) { if (msg.what == 1) { sendShotScreen(); } }; }; class SendShotScreenTask extends TimerTask { @Override public void run() { Message message = new Message(); message.what = 1; sendShotScreenHandler.sendMessage(message); } } // @Override // public void onCheckedChanged(CompoundButton buttonView, boolean // isChecked) { // // if (buttonView == autoShotScreenButton) { // // if (isChecked) { // startSendShotScreenTimer(); // // } else { // stopSendShotScreenTimer(); // } // } // } private void startSendShotScreenTimer() { sendShotScreenTimer = new Timer(); if (sendShotScreenTask != null) { sendShotScreenTask.cancel(); } sendShotScreenTask = new SendShotScreenTask(); sendShotScreenTimer.schedule(sendShotScreenTask, 0, 5000); } private void stopSendShotScreenTimer() { // autoShotScreenButton.setChecked(false); if (sendShotScreenTimer != null) { sendShotScreenTimer.cancel(); } } private void setLayoutSize() { // LinearLayout mLinearLayout = (LinearLayout) // findViewById(R.id.touchpad_tools_area); // toolsBarHeight = 25*2 + 47;// mLinearLayout.getMeasuredHeight(); // mLinearLayout.getMeasuredHeight(); setScreenSize(); } @Override protected void onRestart() { // TODO Auto-generated method stub System.out.println("onRestart()"); super.onRestart(); } @Override protected void onStart() { System.out.println("onStart()"); super.onStart(); } @Override protected void onPause() { System.out.println("onPause()"); stopSendShotScreenTimer(); super.onPause(); } @Override protected void onStop() { System.out.println("onStop()"); stopSendShotScreenTimer(); super.onStop(); } @Override protected void onDestroy() { System.out.println("onDestroy()"); stopSendShotScreenTimer(); unregisterReceiver(mReceiver); if (thread != null) { thread.interrupt(); thread = null; } super.onDestroy(); } public void OnClick1(View v) { } // @Override // public void onClick(View view) { // if (view == mouseButton) { // this.finish(); // } else if (view == manualShotScreenButton) { // stopSendShotScreenTimer(); // sendShotScreen(); // } else if (view == settingButton) { // // Intent startSettings = new Intent(this, SettingListActivity.class); // // startSettings.putExtra(S1Constant.INTENT_EXTRA_CONFIGURATION, // this.getResources().getConfiguration().orientation); // // startActivity(startSettings); // } else if (view == cleanScreenButton) { // cleanScreen(); // } 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 == toolRecentButton) { // sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_TASK)); // } else if (view == toolMenuButton) { // sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_MENU)); // } // } public void OnClick2(View v) { sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_MENU)); } public void OnClick3(View v) { sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_HOME)); } public void OnClick4(View v) { sendTouchEvent(new ControlEventPacket(ControlEvent.SEND_KEY_BACK)); } public void OnClick5(View v) { } public void OnClick6(View v) { if (isChecked) { isChecked = false; startSendShotScreenTimer(); } else { isChecked = true; stopSendShotScreenTimer(); } } public void OnClick7(View v) { findViewById(R.id.textViewJP).setVisibility(View.VISIBLE); LinearLayout mLinearLayout = (LinearLayout) findViewById(R.id.shotScreenView); setScaleXY(mLinearLayout.getMeasuredWidth(), mLinearLayout.getMeasuredHeight()); stopSendShotScreenTimer(); sendShotScreen(); } public void OnClick8(View v) { cleanScreen(); } public void OnClick9(View v) { Intent intent = new Intent(this, ControlMouse.class); intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT); try { startActivity(intent); finish(); } catch (ActivityNotFoundException ex) { Log.e(TAG, "Call ControlMouse failed", ex); } } public void OnClick10(View v) { Intent startSettings = new Intent(this, ControlSetting.class); startSettings.putExtra(S1Constant.INTENT_EXTRA_CONFIGURATION, this .getResources().getConfiguration().orientation); startActivity(startSettings); } public void OnClickKeyboard(View view) { if (!SHOWKEYBOARD) showSoftKeyboard(); else hideSoftKeyboard(view); } 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); } public class MyLayout extends LinearLayout { public MyLayout(Context context) { super(context); // TODO Auto-generated constructor stub } @Override public void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); } } }