/* SWKeyEventProfile.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.KeyEventProfile; 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 plugin {@link KeyEventProfile} implementation. * * @author NTT DOCOMO, INC. */ public class SWKeyEventProfile extends KeyEventProfile { /** Key Event profile event management flag. */ private static int sFlagKeyEventEventManage = 0; /** Key Event profile event flag. (ondown) */ private static final int FLAG_ON_DOWN = 0x0001; /** Key Event profile event flag. (onup) */ private static final int FLAG_ON_UP = 0x0002; /** Key Event profile event flag. (onkeychange) */ private static final int FLAG_ON_KEY_CHANGE = 0x0004; /** * Attribute: {@value} . */ public static final String ATTRIBUTE_ON_KEY_CHANGE = "onKeyChange"; private final DConnectApi mGetOnKeyChangeApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_KEY_CHANGE; } @Override public boolean onRequest(final Intent request, final Intent response) { Bundle keyevent = SWApplication.getKeyEventCache(ATTRIBUTE_ON_KEY_CHANGE); if (keyevent == null) { response.putExtra(KeyEventProfile.PARAM_KEYEVENT, ""); } else { response.putExtra(KeyEventProfile.PARAM_KEYEVENT, keyevent); } setResult(response, DConnectMessage.RESULT_OK); return true; } }; private final DConnectApi mGetOnDownApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_DOWN; } @Override public boolean onRequest(final Intent request, final Intent response) { Bundle keyevent = SWApplication.getKeyEventCache(KeyEventProfile.ATTRIBUTE_ON_DOWN); if (keyevent == null) { response.putExtra(KeyEventProfile.PARAM_KEYEVENT, ""); } else { response.putExtra(KeyEventProfile.PARAM_KEYEVENT, keyevent); } setResult(response, DConnectMessage.RESULT_OK); return true; } }; private final DConnectApi mGetOnUpApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_UP; } @Override public boolean onRequest(final Intent request, final Intent response) { Bundle keyevent = SWApplication.getKeyEventCache(KeyEventProfile.ATTRIBUTE_ON_UP); if (keyevent == null) { response.putExtra(KeyEventProfile.PARAM_KEYEVENT, ""); } else { response.putExtra(KeyEventProfile.PARAM_KEYEVENT, keyevent); } setResult(response, DConnectMessage.RESULT_OK); return true; } }; private final DConnectApi mPutOnKeyChangeApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_KEY_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); displayKeyEventScreen(); setKeyEventEventFlag(FLAG_ON_KEY_CHANGE); } else if (error == EventError.INVALID_PARAMETER) { MessageUtils.setInvalidRequestParameterError(response); } else { MessageUtils.setUnknownError(response); } return true; } }; private final DConnectApi mPutOnDownApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_DOWN; } @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); displayKeyEventScreen(); setKeyEventEventFlag(FLAG_ON_DOWN); } else if (error == EventError.INVALID_PARAMETER) { MessageUtils.setInvalidRequestParameterError(response); } else { MessageUtils.setUnknownError(response); } return true; } }; private final DConnectApi mPutOnUpApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_UP; } @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); displayKeyEventScreen(); setKeyEventEventFlag(FLAG_ON_UP); } else if (error == EventError.INVALID_PARAMETER) { MessageUtils.setInvalidRequestParameterError(response); } else { MessageUtils.setUnknownError(response); } return true; } }; private final DConnectApi mDeleteOnKeyChangeApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_KEY_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 (!(resetKeyEventEventFlag(FLAG_ON_KEY_CHANGE))) { clearKeyEventScreen(); } } else if (error == EventError.INVALID_PARAMETER) { MessageUtils.setInvalidRequestParameterError(response); } else { MessageUtils.setUnknownError(response); } return true; } }; private final DConnectApi mDeleteOnDownApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_DOWN; } @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 (!(resetKeyEventEventFlag(FLAG_ON_DOWN))) { clearKeyEventScreen(); } } else if (error == EventError.INVALID_PARAMETER) { MessageUtils.setInvalidRequestParameterError(response); } else { MessageUtils.setUnknownError(response); } return true; } }; private final DConnectApi mDeleteOnUpApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_UP; } @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 (!(resetKeyEventEventFlag(FLAG_ON_UP))) { clearKeyEventScreen(); } } else if (error == EventError.INVALID_PARAMETER) { MessageUtils.setInvalidRequestParameterError(response); } else { MessageUtils.setUnknownError(response); } return true; } }; public SWKeyEventProfile() { addApi(mGetOnKeyChangeApi); addApi(mGetOnDownApi); addApi(mGetOnUpApi); addApi(mPutOnKeyChangeApi); addApi(mPutOnDownApi); addApi(mPutOnUpApi); addApi(mDeleteOnKeyChangeApi); addApi(mDeleteOnDownApi); addApi(mDeleteOnUpApi); } /** * Display Key Event screen. */ private void displayKeyEventScreen() { 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.keyevent_control); } else { return; // This function not implemented. Because SW could not redraw xml layout data. } sendToHostApp(intent); } /** * Clear KeyEvent screen. */ private void clearKeyEventScreen() { 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); } } /** * Set key event event flag. * * @param flag Set flag. */ private void setKeyEventEventFlag(final int flag) { sFlagKeyEventEventManage |= flag; } /** * Reset key event event flag. * * @param flag Reset flag. * @return true : Other event register. false : No event registration. */ private boolean resetKeyEventEventFlag(final int flag) { sFlagKeyEventEventManage &= ~(flag); return sFlagKeyEventEventManage == 0; } private void sendToHostApp(final Intent request) { ((SWService) getService()).sendRequest(request); } /** * Release KeyEvent. */ public void releaseKeyEvent() { sFlagKeyEventEventManage = 0; clearKeyEventScreen(); } }