/*
SWTouchProfile.java
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.sw.profile;
import android.content.Intent;
import android.os.Bundle;
import com.sonyericsson.extras.liveware.aef.control.Control;
import org.deviceconnect.android.deviceplugin.sw.R;
import org.deviceconnect.android.deviceplugin.sw.SWApplication;
import org.deviceconnect.android.deviceplugin.sw.service.SWService;
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;
/**
* SonySW device plug-in {@link TouchProfile} implementation.
*
* @author NTT DOCOMO, INC.
*/
public class SWTouchProfile 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. (ontouchchange). */
private static final int FLAG_ON_TOUCH_CHANGE = 0x0040;
/**
* 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 = SWApplication.getTouchCache(ATTRIBUTE_ON_TOUCH_CHANGE);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, DConnectMessage.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 = SWApplication.getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, DConnectMessage.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 = SWApplication.getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH_START);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, DConnectMessage.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 = SWApplication.getTouchCache(TouchProfile.ATTRIBUTE_ON_TOUCH_END);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, DConnectMessage.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 = SWApplication.getTouchCache(TouchProfile.ATTRIBUTE_ON_DOUBLE_TAP);
if (touches == null) {
response.putExtra(TouchProfile.PARAM_TOUCH, "");
} else {
response.putExtra(TouchProfile.PARAM_TOUCH, touches);
}
setResult(response, DConnectMessage.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) {
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
displayTouchScreen();
setTouchEventFlag(FLAG_ON_TOUCH_CHANGE);
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
displayTouchScreen();
setTouchEventFlag(FLAG_ON_TOUCH);
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
displayTouchScreen();
setTouchEventFlag(FLAG_ON_TOUCH_START);
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
displayTouchScreen();
setTouchEventFlag(FLAG_ON_TOUCH_END);
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.addEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
displayTouchScreen();
setTouchEventFlag(FLAG_ON_DOUBLE_TAP);
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
if (!(resetTouchEventFlag(FLAG_ON_TOUCH_CHANGE))) {
clearTouchScreen();
}
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
if (!(resetTouchEventFlag(FLAG_ON_TOUCH))) {
clearTouchScreen();
}
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
if (!(resetTouchEventFlag(FLAG_ON_TOUCH_START))) {
clearTouchScreen();
}
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
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) {
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
if (!(resetTouchEventFlag(FLAG_ON_TOUCH_END))) {
clearTouchScreen();
}
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
return true;
}
};
private final DConnectApi mDeleteOnDoubleTapApi = new DeleteApi() {
@Override
public String getAttribute() {
return ATTRIBUTE_ON_DOUBLE_TAP;
}
@Override
public boolean onRequest(final Intent request, final Intent response) {
EventError error = EventManager.INSTANCE.removeEvent(request);
if (error == EventError.NONE) {
setResult(response, DConnectMessage.RESULT_OK);
if (!(resetTouchEventFlag(FLAG_ON_DOUBLE_TAP))) {
clearTouchScreen();
}
} else if (error == EventError.INVALID_PARAMETER) {
MessageUtils.setInvalidRequestParameterError(response);
} else {
MessageUtils.setUnknownError(response);
}
return true;
}
};
public SWTouchProfile() {
addApi(mGetOnTouchApi);
addApi(mGetOnTouchStartApi);
addApi(mGetOnTouchEndApi);
addApi(mGetOnDoubleTapApi);
addApi(mGetOnTouchChangeApi);
// SW not support "GET TouchMove".
// SW not support "GET TouchCancel".
addApi(mPutOnTouchApi);
addApi(mPutOnTouchStartApi);
addApi(mPutOnTouchEndApi);
addApi(mPutOnDoubleTapApi);
addApi(mPutOnTouchChangeApi);
// SW not support "PUT TouchMove".
// SW not support "PUT TouchCancel".
addApi(mDeleteOnTouchApi);
addApi(mDeleteOnTouchStartApi);
addApi(mDeleteOnTouchEndApi);
addApi(mDeleteOnDoubleTapApi);
addApi(mDeleteOnTouchChangeApi);
// SW not support "DELETE TouchMove".
// SW not support "DELETE TouchCancel".
}
/**
* Display Touch screen.
*/
private void displayTouchScreen() {
Intent intent = new Intent(Control.Intents.CONTROL_PROCESS_LAYOUT_INTENT);
if (((SWService) getService()).getWatchType() == SWService.WatchType.SW2) {
intent.putExtra(Control.Intents.EXTRA_DATA_XML_LAYOUT, R.layout.touch_control_sw2);
} else {
return; // This function not implemented. Because SW could not redraw xml layout data.
}
sendToHostApp(intent);
}
/**
* Clear Touch screen.
*/
private void clearTouchScreen() {
if (((SWService) getService()).getWatchType() == SWService.WatchType.SW2) {
Intent intent = new Intent(Control.Intents.CONTROL_CLEAR_DISPLAY_INTENT);
sendToHostApp(intent);
intent = new Intent(Control.Intents.CONTROL_PROCESS_LAYOUT_INTENT);
intent.putExtra(Control.Intents.EXTRA_DATA_XML_LAYOUT, R.layout.touch_clear_control_sw2);
sendToHostApp(intent);
} else {
return; // This function not implemented. Because SW could not redraw xml layout data.
}
}
/**
* Set touch event flag.
*
* @param flag Set flag.
*/
private void setTouchEventFlag(final int flag) {
sFlagTouchEventManage |= flag;
}
/**
* Reset touch event flag.
*
* @param flag Reset flag.
* @return true : Other event register. false : No event registration.
*/
private boolean resetTouchEventFlag(final int flag) {
sFlagTouchEventManage &= ~(flag);
if (sFlagTouchEventManage == 0) {
return false;
}
return true;
}
private void sendToHostApp(final Intent request) {
((SWService) getService()).sendRequest(request);
}
/**
* Release Touch Event.
*/
public void releaseTouchEvent() {
sFlagTouchEventManage = 0;
clearTouchScreen();
}
}