/* HvcHumanDetectProfile.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.hvc.profile; import android.content.Context; import android.content.Intent; import android.content.pm.PackageManager; import android.location.LocationManager; import org.deviceconnect.android.deviceplugin.hvc.BuildConfig; import org.deviceconnect.android.deviceplugin.hvc.HvcDeviceApplication; import org.deviceconnect.android.deviceplugin.hvc.HvcDeviceService; import org.deviceconnect.android.deviceplugin.hvc.R; import org.deviceconnect.android.deviceplugin.hvc.humandetect.HumanDetectKind; import org.deviceconnect.android.deviceplugin.hvc.humandetect.HumanDetectRequestParams; import org.deviceconnect.android.deviceplugin.hvc.request.HvcDetectRequestUtils; import org.deviceconnect.android.event.EventError; import org.deviceconnect.android.event.EventManager; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.HumanDetectionProfile; 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; /** * HVC HumanDetectProfile. * * @author NTT DOCOMO, INC. */ public class HvcHumanDetectionProfile extends HumanDetectionProfile { /** * log tag. */ private static final String TAG = HvcHumanDetectionProfile.class.getSimpleName(); /** * Debug. */ private static final Boolean DEBUG = BuildConfig.DEBUG; /** * error message. {@value} */ protected static final String ERROR_BLE_NOT_AVAILABLE = "ble not available."; // // Get Detection API // private final DConnectApi mGetHumanDetectionApi = new GetApi() { @Override public String getAttribute() { return "onDetection"; } @Override public boolean onRequest(final Intent request, final Intent response) { return doGetDetectionProc(request, response, getServiceID(request), HumanDetectKind.HUMAN); } }; private final DConnectApi mGetBodyDetectionApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_BODY_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doGetDetectionProc(request, response, getServiceID(request), HumanDetectKind.BODY); } }; private final DConnectApi mGetHandDetectionApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_HAND_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doGetDetectionProc(request, response, getServiceID(request), HumanDetectKind.HAND); } }; private final DConnectApi mGetFaceDetectionApi = new GetApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_FACE_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doGetDetectionProc(request, response, getServiceID(request), HumanDetectKind.FACE); } }; // // Put Detection API // private final DConnectApi mPutHumanDetectionApi = new PutApi() { @Override public String getAttribute() { return "onDetection"; } @Override public boolean onRequest(final Intent request, final Intent response) { return doPutDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.HUMAN); } }; private final DConnectApi mPutBodyDetectionApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_BODY_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doPutDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.BODY); } }; private final DConnectApi mPutHandDetectionApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_HAND_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doPutDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.HAND); } }; private final DConnectApi mPutFaceDetectionApi = new PutApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_FACE_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doPutDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.FACE); } }; // // Delete Detection API // private final DConnectApi mDeleteHumanDetectionApi = new DeleteApi() { @Override public String getAttribute() { return "onDetection"; } @Override public boolean onRequest(final Intent request, final Intent response) { return doDeleteDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.HUMAN); } }; private final DConnectApi mDeleteBodyDetectionApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_BODY_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doDeleteDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.BODY); } }; private final DConnectApi mDeleteHandDetectionApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_HAND_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doDeleteDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.HAND); } }; private final DConnectApi mDeleteFaceDetectionApi = new DeleteApi() { @Override public String getAttribute() { return ATTRIBUTE_ON_FACE_DETECTION; } @Override public boolean onRequest(final Intent request, final Intent response) { return doDeleteDetectionProc(request, response, getServiceID(request), getOrigin(request), HumanDetectKind.FACE); } }; /** * Constructor. */ public HvcHumanDetectionProfile() { addApi(mGetHumanDetectionApi); addApi(mGetBodyDetectionApi); addApi(mGetHandDetectionApi); addApi(mGetFaceDetectionApi); addApi(mPutHumanDetectionApi); addApi(mPutBodyDetectionApi); addApi(mPutHandDetectionApi); addApi(mPutFaceDetectionApi); addApi(mDeleteHumanDetectionApi); addApi(mDeleteBodyDetectionApi); addApi(mDeleteHandDetectionApi); addApi(mDeleteFaceDetectionApi); } /** * Get Detection Process. * * @param request request * @param response response * @param serviceId serviceId * @param detectKind detectKind * @return send response flag.(true:sent / false: unsent (Send after the * thread has been completed)) */ private boolean doGetDetectionProc(final Intent request, final Intent response, final String serviceId, final HumanDetectKind detectKind) { HvcDeviceApplication.getInstance().checkLocationEnable(); if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { // ble not available. MessageUtils.setNotSupportProfileError(response, ERROR_BLE_NOT_AVAILABLE); return true; } else { // get parameter. HumanDetectRequestParams requestParams; try { requestParams = HvcDetectRequestUtils.getRequestParams(request, response, detectKind); } catch (IllegalStateException e) { // BUG: detectKind unknown value. MessageUtils.setUnknownError(response, e.getMessage()); return true; } catch (NumberFormatException e) { // invalid request parameter error MessageUtils.setInvalidRequestParameterError(response, e.getMessage()); return true; } catch (IllegalArgumentException e) { // invalid request parameter error MessageUtils.setInvalidRequestParameterError(response, e.getMessage()); return true; } if (DEBUG) { requestParams.dumpLog(TAG); } // GET API. ((HvcDeviceService) getContext()).doGetDetectionProc(detectKind, requestParams, response, serviceId); // Since returning the response asynchronously, it returns false. return false; } } /** * do put detection process. * @param request request * @param response response * @param serviceId serviceId * @param origin origin * @param detectKind detectKind * @return send response flag.(true:sent / false: unsent (Send after the * thread has been completed)) */ private boolean doPutDetectionProc(final Intent request, final Intent response, final String serviceId, final String origin, final HumanDetectKind detectKind) { HvcDeviceApplication.getInstance().checkLocationEnable(); if (!getContext().getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH_LE)) { // ble not available. MessageUtils.setNotSupportProfileError(response, ERROR_BLE_NOT_AVAILABLE); return true; } else { // get parameter. HumanDetectRequestParams requestParams; try { requestParams = HvcDetectRequestUtils.getRequestParams(request, response, detectKind); } catch (IllegalStateException e) { // BUG: detectKind unknown value. MessageUtils.setUnknownError(response, e.getMessage()); return true; } catch (NumberFormatException e) { // invalid request parameter error MessageUtils.setInvalidRequestParameterError(response, e.getMessage()); return true; } catch (IllegalArgumentException e) { // invalid request parameter error MessageUtils.setInvalidRequestParameterError(response, e.getMessage()); return true; } if (DEBUG) { requestParams.dumpLog(TAG); } // register event. EventError error = EventManager.INSTANCE.addEvent(request); if (error == EventError.NONE) { ((HvcDeviceService) getContext()).registerDetectionEvent(detectKind, requestParams, response, serviceId, origin); return false; } else { MessageUtils.setIllegalDeviceStateError(response, "Can not register event."); return true; } } } /** * do delete detection process. * @param request request * @param response response * @param serviceId serviceId * @param origin origin * @param detectKind detectKind * @return send response flag.(true:sent / false: unsent (Send after the * thread has been completed)) */ private boolean doDeleteDetectionProc(final Intent request, final Intent response, final String serviceId, final String origin, final HumanDetectKind detectKind) { // unregister event. EventError error = EventManager.INSTANCE.removeEvent(request); if (error == EventError.NONE) { ((HvcDeviceService) getContext()).unregisterDetectionEvent(detectKind, response, serviceId, origin); return false; } else { MessageUtils.setIllegalDeviceStateError(response, "Can not unregister event."); return true; } } }