/*
HostTouchProfile.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.profile;
import android.app.ActivityManager;
import android.app.Service;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.content.LocalBroadcastManager;
import org.deviceconnect.android.deviceplugin.host.HostDeviceApplication;
import org.deviceconnect.android.deviceplugin.host.HostDeviceService;
import org.deviceconnect.android.deviceplugin.host.activity.TouchProfileActivity;
import org.deviceconnect.android.event.EventError;
import org.deviceconnect.android.event.EventManager;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.TouchProfile;
import org.deviceconnect.android.profile.api.DConnectApi;
import org.deviceconnect.android.profile.api.DeleteApi;
import org.deviceconnect.android.profile.api.GetApi;
import org.deviceconnect.android.profile.api.PutApi;
import org.deviceconnect.message.DConnectMessage;
import org.deviceconnect.message.intent.message.IntentDConnectMessage;
/**
* Touch Profile.
*
* @author NTT DOCOMO, INC.
*/
public class HostTouchProfile extends TouchProfile {
/** Touch profile event management flag. */
private static int sFlagTouchEventManage = 0;
/** Touch profile event flag. (ontouch) */
private static final int FLAG_ON_TOUCH = 0x0001;
/** Touch profile event flag. (ontouchstart) */
private static final int FLAG_ON_TOUCH_START = 0x0002;
/** Touch profile event flag. (ontouchend) */
private static final int FLAG_ON_TOUCH_END = 0x0004;
/** Touch profile event flag. (ondoubletap) */
private static final int FLAG_ON_DOUBLE_TAP = 0x0008;
/** Touch profile event flag. (ontouchmove) */
private static final int FLAG_ON_TOUCH_MOVE = 0x0010;
/** Touch profile event flag. (ontouchcancel) */
private static final int FLAG_ON_TOUCH_CANCEL = 0x0020;
/** Touch profile event flag. (ontouchchange). */
private static final int FLAG_ON_TOUCH_CHANGE = 0x0040;
/** Finish touch profile activity action. */
public static final String ACTION_FINISH_TOUCH_ACTIVITY =
"org.deviceconnect.android.deviceplugin.host.touch.FINISH";
/**
* Attribute: {@value} .
*/
public static final String ATTRIBUTE_ON_TOUCH_CHANGE = "onTouchChange";
private final DConnectApi mGetOnTouchChangeApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(ATTRIBUTE_ON_TOUCH_CHANGE);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetOnTouchApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetOnTouchStartApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_START;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH_START);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetOnTouchEndApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_END;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH_END);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetOnDoubleTapApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_DOUBLE_TAP;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(TouchProfile.ATTRIBUTE_ON_DOUBLE_TAP);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetOnTouchMoveApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_MOVE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH_MOVE);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mGetOnTouchCancelApi = new GetApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_CANCEL;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
Bundle touches = getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH_CANCEL);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, IntentDConnectMessage.RESULT_OK);
return true;
}
};
private final DConnectApi mPutOnTouchChangeApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_TOUCH_CHANGE);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mPutOnTouchApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_TOUCH);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mPutOnTouchStartApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_START;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_TOUCH_START);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mPutOnTouchEndApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_END;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_TOUCH_END);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mPutOnDoubleTapApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_DOUBLE_TAP;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_DOUBLE_TAP);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mPutOnTouchMoveApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_MOVE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_TOUCH_MOVE);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mPutOnTouchCancelApi = new PutApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_CANCEL;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
String serviceId = getServiceID(request);
// Event registration.
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
execTouchProfileActivity(serviceId);
setTouchEventFlag(FLAG_ON_TOUCH_CANCEL);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not register event.");
}
return true;
}
};
private final DConnectApi mDeleteOnTouchChangeApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_CHANGE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_TOUCH_CHANGE);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
private final DConnectApi mDeleteOnTouchApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_TOUCH);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
private final DConnectApi mDeleteOnTouchStartApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_START;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_TOUCH_START);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
private final DConnectApi mDeleteOnTouchEndApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_END;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_TOUCH_END);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
private final DConnectApi mDeleteOnDoubleTap = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_DOUBLE_TAP;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_DOUBLE_TAP);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
private final DConnectApi mDeleteOnTouchMove = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_MOVE;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_TOUCH_MOVE);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
private final DConnectApi mDeleteOnTouchCancel = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_TOUCH_CANCEL;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
// Event release.
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
resetTouchEventFlag(FLAG_ON_TOUCH_CANCEL);
setResult(response, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setInvalidRequestParameterError(response,"Can not unregister event.");
}
return true;
}
};
public HostTouchProfile() {
addApi(mGetOnTouchChangeApi);
addApi(mGetOnTouchApi);
addApi(mGetOnTouchStartApi);
addApi(mGetOnTouchEndApi);
addApi(mGetOnDoubleTapApi);
addApi(mGetOnTouchMoveApi);
addApi(mGetOnTouchCancelApi);
addApi(mPutOnTouchChangeApi);
addApi(mPutOnTouchApi);
addApi(mPutOnTouchStartApi);
addApi(mPutOnTouchEndApi);
addApi(mPutOnDoubleTapApi);
addApi(mPutOnTouchMoveApi);
addApi(mPutOnTouchCancelApi);
addApi(mDeleteOnTouchChangeApi);
addApi(mDeleteOnTouchApi);
addApi(mDeleteOnTouchStartApi);
addApi(mDeleteOnTouchEndApi);
addApi(mDeleteOnDoubleTap);
addApi(mDeleteOnTouchMove);
addApi(mDeleteOnTouchCancel);
}
/**
* Execute Touch Profile Activity.
*
* @param serviceId service ID.
* @return Always true.
*/
private boolean execTouchProfileActivity(final String serviceId) {
ActivityManager mActivityManager = (ActivityManager) getContext().getSystemService(Service.ACTIVITY_SERVICE);
String mClassName = mActivityManager.getRunningTasks(1).get(0).topActivity.getClassName();
if (!(TouchProfileActivity.class.getName().equals(mClassName))) {
Intent mIntent = new Intent();
mIntent.setClass(getContext(), TouchProfileActivity.class);
mIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
mIntent.putExtra(DConnectMessage.EXTRA_SERVICE_ID, serviceId);
this.getContext().startActivity(mIntent);
}
return true;
}
/**
* Finish Touch Profile Activity.
*
* @return Always true.
*/
private boolean finishTouchProfileActivity() {
String className = getClassnameOfTopActivity();
if (TouchProfileActivity.class.getName().equals(className)) {
Intent intent = new Intent(HostTouchProfile.ACTION_FINISH_TOUCH_ACTIVITY);
LocalBroadcastManager.getInstance(getContext()).sendBroadcast(intent);
}
return true;
}
/**
* Set touch event flag.
*
* @param flag Set flag.
*/
private void setTouchEventFlag(final int flag) {
sFlagTouchEventManage |= flag;
}
/**
* Reset touch event flag.
*
* @param flag Reset flag.
*/
private void resetTouchEventFlag(final int flag) {
sFlagTouchEventManage &= ~(flag);
if (sFlagTouchEventManage == 0) {
finishTouchProfileActivity();
}
}
/**
* Get the class name of the Activity being displayed at the top of the screen.
*
* @return class name.
*/
private String getClassnameOfTopActivity() {
ActivityManager activityMgr = (ActivityManager) getContext().getSystemService(Service.ACTIVITY_SERVICE);
return activityMgr.getRunningTasks(1).get(0).topActivity.getClassName();
}
/**
* Check set Touch event manage flag.
*
* @return set flag is true, otherwise false.
*/
private boolean isSetTouchEventManageFlag() {
return sFlagTouchEventManage != 0;
}
/**
* Reset Touch profile.
*/
public void resetTouchProfile() {
if (isSetTouchEventManageFlag()) {
resetTouchEventFlag(FLAG_ON_TOUCH | FLAG_ON_TOUCH_START | FLAG_ON_TOUCH_END
| FLAG_ON_DOUBLE_TAP | FLAG_ON_TOUCH_MOVE | FLAG_ON_TOUCH_CANCEL
| FLAG_ON_TOUCH_CHANGE);
}
}
/**
* Get touch cache.
*
* @param attr Attribute.
* @return Touch cache data.
*/
public Bundle getTouchCache(final String attr) {
return getApp().getTouchCache(attr);
}
/**
* Get keyevent cache.
*
* @param attr Attribute.
* @return KeyEvent cache data.
*/
public Bundle getKeyEventCache(final String attr) {
return getApp().getKeyEventCache(attr);
}
public HostDeviceApplication getApp() {
return (HostDeviceApplication) ((HostDeviceService)getContext()).getApplication();
}
}