/* TouchProfileActivity.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.host.activity; import java.util.ArrayList; import java.util.List; import org.deviceconnect.android.deviceplugin.host.HostDeviceApplication; import org.deviceconnect.android.deviceplugin.host.R; import org.deviceconnect.android.deviceplugin.host.profile.HostTouchProfile; import org.deviceconnect.android.event.Event; import org.deviceconnect.android.event.EventManager; import org.deviceconnect.android.profile.TouchProfile; import org.deviceconnect.message.DConnectMessage; import android.app.Activity; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.os.Bundle; import android.support.v4.content.LocalBroadcastManager; import android.util.Log; import android.view.GestureDetector; import android.view.GestureDetector.SimpleOnGestureListener; import android.view.MotionEvent; import android.view.View; import android.widget.Button; import static org.deviceconnect.android.deviceplugin.host.profile.HostTouchProfile.ATTRIBUTE_ON_TOUCH_CHANGE; /** * Touch Profile Activity. * * @author NTT DOCOMO, INC. */ public class TouchProfileActivity extends Activity { /** Application class instance. */ private HostDeviceApplication mApp; /** Gesture detector. */ GestureDetector mGestureDetector; /** Service Id. */ String mServiceId; /** * Implementation of BroadcastReceiver. */ private final BroadcastReceiver mReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { String action = intent.getAction(); if (HostTouchProfile.ACTION_FINISH_TOUCH_ACTIVITY.equals(action)) { finish(); } } }; @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.touch_main); // Get Application class instance. mApp = (HostDeviceApplication) this.getApplication(); // Get serviceId. Intent intent = getIntent(); mServiceId = intent.getStringExtra(DConnectMessage.EXTRA_SERVICE_ID); // Create GestureDetector instance. mGestureDetector = new GestureDetector(this, mSimpleOnGestureListener); // onclicklistener register. Button button = (Button) findViewById(R.id.button_touch_close); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(final View v) { finish(); } }); } @Override protected void onDestroy() { super.onDestroy(); } @Override protected void onPause() { super.onPause(); LocalBroadcastManager.getInstance(this).unregisterReceiver(mReceiver); } @Override protected void onResume() { super.onResume(); IntentFilter filter = new IntentFilter(); filter.addAction(HostTouchProfile.ACTION_FINISH_TOUCH_ACTIVITY); LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, filter); } @Override public boolean onTouchEvent(final MotionEvent event) { List<Event> events; String state = null; switch (event.getAction() & MotionEvent.ACTION_MASK) { case MotionEvent.ACTION_DOWN: // 1st touch only. case MotionEvent.ACTION_POINTER_DOWN: // Others touch. state = HostDeviceApplication.STATE_START; // "ontouch" event processing. events = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, TouchProfile.ATTRIBUTE_ON_TOUCH); if (events != null) { sendEventData(state, event, events); } // "ontouchstart" event processing. events = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, TouchProfile.ATTRIBUTE_ON_TOUCH_START); break; case MotionEvent.ACTION_UP: // Last touch remove only. case MotionEvent.ACTION_POINTER_UP: // Others touch move. state = HostDeviceApplication.STATE_END; // "ontouchend" event processing. events = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, TouchProfile.ATTRIBUTE_ON_TOUCH_END); break; case MotionEvent.ACTION_MOVE: state = HostDeviceApplication.STATE_MOVE; // "ontouchmove" event processing. events = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, TouchProfile.ATTRIBUTE_ON_TOUCH_MOVE); break; case MotionEvent.ACTION_CANCEL: state = HostDeviceApplication.STATE_CANCEL; // "ontouchcancel" event processing. events = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, TouchProfile.ATTRIBUTE_ON_TOUCH_CANCEL); break; default: return mGestureDetector.onTouchEvent(event); } if (events != null) { sendEventData(state, event, events); } return mGestureDetector.onTouchEvent(event); } /** * Gesture Listener. */ private final SimpleOnGestureListener mSimpleOnGestureListener = new SimpleOnGestureListener() { @Override public boolean onDoubleTap(final MotionEvent event) { List<Event> events = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, TouchProfile.ATTRIBUTE_ON_DOUBLE_TAP); sendEventData(HostDeviceApplication.STATE_DOUBLE_TAP, event, events); return super.onDoubleTap(event); } }; /** * Send event data. * * @param state MotionEvent state. * @param event MotionEvent. * @param events Event request list. */ private void sendEventData(final String state, final MotionEvent event, final List<Event> events) { List<Event> touchEvents = EventManager.INSTANCE.getEventList(mServiceId, TouchProfile.PROFILE_NAME, null, ATTRIBUTE_ON_TOUCH_CHANGE); Bundle touchdata = new Bundle(); List<Bundle> touchlist = new ArrayList<Bundle>(); Bundle touches = new Bundle(); for (int n = 0; n < event.getPointerCount(); n++) { int pointerId = event.getPointerId(n); touchdata.putInt(TouchProfile.PARAM_ID, pointerId); touchdata.putFloat(TouchProfile.PARAM_X, event.getX(n)); touchdata.putFloat(TouchProfile.PARAM_Y, event.getY(n)); touchlist.add((Bundle) touchdata.clone()); } touches.putParcelableArray(TouchProfile.PARAM_TOUCHES, touchlist.toArray(new Bundle[touchlist.size()])); for (int i = 0; i < events.size(); i++) { Event eventdata = events.get(i); String attr = eventdata.getAttribute(); Intent intent = EventManager.createEventMessage(eventdata); intent.putExtra(TouchProfile.PARAM_TOUCH, touches); getBaseContext().sendBroadcast(intent); mApp.setTouchCache(attr, touches); } for (int i = 0; i < touchEvents.size(); i++) { Event eventdata = touchEvents.get(i); String attr = eventdata.getAttribute(); touches.putString("state", state); Intent intent = EventManager.createEventMessage(eventdata); intent.putExtra(TouchProfile.PARAM_TOUCH, touches); getBaseContext().sendBroadcast(intent); mApp.setTouchCache(attr, touches); } } }