/* WearTouchProfileActivity.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.wear.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.os.PowerManager; import android.support.annotation.NonNull; import android.support.v4.content.LocalBroadcastManager; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.WindowManager; import org.deviceconnect.android.deviceplugin.wear.R; import org.deviceconnect.android.deviceplugin.wear.WearApplication; import org.deviceconnect.android.deviceplugin.wear.WearConst; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * WearTouchProfileActivity. * * @author NTT DOCOMO, INC. */ public class WearTouchProfileActivity extends Activity { /** Gesture detector. */ private GestureDetector mGestureDetector; /** Device NodeID . */ private final List<String> mIds = Collections.synchronizedList(new ArrayList<String>()); /** * Wakelock. */ private PowerManager.WakeLock mWakeLock; /** Event flag. */ private int mRegisterEvent = 0; /** Event flag define (touch). */ private static final int REGIST_FLAG_TOUCH_TOUCH = 0x01; /** Event flag define (touchstart). */ private static final int REGIST_FLAG_TOUCH_TOUCHSTART = 0x02; /** Event flag define (touchend). */ private static final int REGIST_FLAG_TOUCH_TOUCHEND = 0x04; /** Event flag define (doubletap). */ private static final int REGIST_FLAG_TOUCH_DOUBLETAP = 0x08; /** Event flag define (touchmove). */ private static final int REGIST_FLAG_TOUCH_TOUCHMOVE = 0x10; /** Event flag define (touchcancel). */ private static final int REGIST_FLAG_TOUCH_TOUCHCANCEL = 0x20; /** Touch profile event flag. (ontouchchange). */ private static final int REGIST_FLAG_TOUCH_TOUCHCHANGE = 0x0040; /** * Constructor. */ public WearTouchProfileActivity() { } @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE); mWakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), "TouchWakelockTag"); getWindow().addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON); if (!mWakeLock.isHeld()) { mWakeLock.acquire(); } // Get intent data. setRegisterEvent(getIntent()); setContentView(R.layout.activity_wear_touch_profile); mGestureDetector = new GestureDetector(this, mSimpleOnGestureListener); // For service destruction suppression. Intent i = new Intent(WearConst.ACTION_WEAR_PING_SERVICE); LocalBroadcastManager.getInstance(this).sendBroadcast(i); } @Override protected void onNewIntent(Intent intent) { setRegisterEvent(intent); } @Override protected void onDestroy() { super.onDestroy(); mWakeLock.release(); } @Override public boolean dispatchTouchEvent(@NonNull final MotionEvent event) { boolean execFlag = false; int action = (event.getAction() & MotionEvent.ACTION_MASK); String strAction = null; switch (action) { case MotionEvent.ACTION_DOWN: // 1st touch only. case MotionEvent.ACTION_POINTER_DOWN: // Others touch. // "ontouch" event processing. if ((mRegisterEvent & REGIST_FLAG_TOUCH_TOUCH) != 0) { sendEventData(WearConst.PARAM_TOUCH_TOUCH, event); } // "ontouchstart" event processing. if ((mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHCHANGE) != 0 || (mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHSTART) != 0) { strAction = WearConst.PARAM_TOUCH_TOUCHSTART; execFlag = true; } break; case MotionEvent.ACTION_UP: // Last touch remove only. case MotionEvent.ACTION_POINTER_UP: // Others touch move. // "ontouchend" event processing. if ((mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHCHANGE) != 0 || (mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHEND) != 0) { strAction = WearConst.PARAM_TOUCH_TOUCHEND; execFlag = true; } break; case MotionEvent.ACTION_MOVE: // "ontouchmove" event processing. if ((mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHCHANGE) != 0 || (mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHMOVE) != 0) { strAction = WearConst.PARAM_TOUCH_TOUCHMOVE; execFlag = true; } break; case MotionEvent.ACTION_CANCEL: // "ontouchcancel" event processing. if ((mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHCHANGE) != 0 || (mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHCANCEL) != 0) { strAction = WearConst.PARAM_TOUCH_TOUCHCANCEL; execFlag = true; } break; default: return mGestureDetector.onTouchEvent(event); } if (execFlag) { sendEventData(strAction, event); } return mGestureDetector.onTouchEvent(event) || super.dispatchTouchEvent(event); } /** * Gesture Listener. */ private final SimpleOnGestureListener mSimpleOnGestureListener = new SimpleOnGestureListener() { @Override public boolean onDoubleTap(final MotionEvent event) { if ((mRegisterEvent & REGIST_FLAG_TOUCH_TOUCHCHANGE) != 0 || (mRegisterEvent & REGIST_FLAG_TOUCH_DOUBLETAP) != 0) { sendEventData(WearConst.PARAM_TOUCH_DOUBLETAP, event); } return super.onDoubleTap(event); } }; /** * Send event data. * * @param action Action. * @param event MotionEvent. */ private void sendEventData(final String action, final MotionEvent event) { int dataCount = event.getPointerCount(); StringBuilder data = new StringBuilder(String.valueOf(dataCount)); data.append(",").append(action); for (int n = 0; n < dataCount; n++) { int pointerId = event.getPointerId(n); data.append(",").append(pointerId).append(",").append(event.getX(n)).append(",").append(event.getY(n)); } sendEvent(WearConst.WEAR_TO_DEVICE_TOUCH_DATA, data.toString()); } private void sendEvent(final String path, final String data) { synchronized (mIds) { for (String id : mIds) { ((WearApplication) getApplication()).sendMessage(id, path, data); } } } private void setRegisterEvent(Intent intent) { String type = intent.getStringExtra(WearConst.PARAM_TOUCH_REGIST); String id = intent.getStringExtra(WearConst.PARAM_TOUCH_ID); setRegisterEvent(type, id); } /** * Set register event. * * @param regist Request event. */ private void setRegisterEvent(final String regist, String id) { if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCH_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_TOUCH; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHSTART_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_TOUCHSTART; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHEND_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_TOUCHEND; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONDOUBLETAP_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_DOUBLETAP; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHMOVE_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_TOUCHMOVE; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHCANCEL_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_TOUCHCANCEL; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHCHANGE_REGISTER.equals(regist)) { if (!mIds.contains(id)) { mIds.add(id); } mRegisterEvent |= REGIST_FLAG_TOUCH_TOUCHCHANGE; } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCH_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_TOUCH); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHSTART_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_TOUCHSTART); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHEND_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_TOUCHEND); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONDOUBLETAP_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_DOUBLETAP); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHMOVE_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_TOUCHMOVE); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHCANCEL_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_TOUCHCANCEL); if (mRegisterEvent == 0) { finish(); } } else if (WearConst.DEVICE_TO_WEAR_TOUCH_ONTOUCHCHANGE_UNREGISTER.equals(regist)) { mIds.remove(id); mRegisterEvent &= ~(REGIST_FLAG_TOUCH_TOUCHCHANGE); if (mRegisterEvent == 0) { finish(); } } } }