/* FPLUGLightProfile.java Copyright (c) 2015 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.fplug.profile; import android.content.Intent; import android.os.Bundle; import org.deviceconnect.android.deviceplugin.fplug.FPLUGApplication; import org.deviceconnect.android.deviceplugin.fplug.FPLUGDeviceService; import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGController; import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGRequestCallback; import org.deviceconnect.android.deviceplugin.fplug.fplug.FPLUGResponse; import org.deviceconnect.android.message.MessageUtils; import org.deviceconnect.android.profile.LightProfile; 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.PostApi; import org.deviceconnect.message.DConnectMessage; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Light Profile. * * @author NTT DOCOMO, INC. */ public class FPLUGLightProfile extends LightProfile { private Map<String, FlashingExecutor> mFlashingMap = new HashMap<String, FlashingExecutor>(); private final DConnectApi mGetLightApi = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); FPLUGApplication app = ((FPLUGApplication) getContext().getApplicationContext()); List<FPLUGController> fplugs = app.getConnectedController(); FPLUGController fplug = app.getConnectedController(serviceId); if (fplugs == null) { MessageUtils.setNotFoundServiceError(response, "Not found fplug: " + serviceId); return true; } Bundle lightParam = new Bundle(); setLightId(lightParam, fplug.getAddress()); setName(lightParam, "F-PLUG LED"); setConfig(lightParam, ""); setOn(lightParam, false);//f-plug's status can not be take. So always OFF. List<Bundle> lightParams = new ArrayList<>(); lightParams.add(lightParam); setLights(response, lightParams); sendResultOK(response); return true; } }; private final DConnectApi mPostLightApi = new PostApi() { @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); String lightId = getLightId(request); long[] flashing = getFlashing(request); FPLUGApplication app = ((FPLUGApplication) getContext().getApplicationContext()); FPLUGController controller; if (lightId == null) { controller = app.getConnectedController(serviceId); } else if (lightId.length() != 0) { controller = app.getConnectedController(lightId); } else { MessageUtils.setInvalidRequestParameterError(response, "lightId is not specified."); return true; } if (controller == null) { MessageUtils.setInvalidRequestParameterError(response, "Not found fplug: " + lightId); return true; } if (flashing != null) { flashing(controller, flashing);//do not check result of flashing setResult(response, DConnectMessage.RESULT_OK); return true; } else { controller.requestLEDControl(true, new FPLUGRequestCallback() { @Override public void onSuccess(final FPLUGResponse fResponse) { sendResultOK(response); } @Override public void onError(final String message) { sendResultError(response); } @Override public void onTimeout() { sendResultTimeout(response); } }); return false; } } }; private final DConnectApi mDeleteLightApi = new DeleteApi() { @Override public boolean onRequest(final Intent request, final Intent response) { String serviceId = getServiceID(request); String lightId = getLightId(request); FPLUGApplication app = ((FPLUGApplication) getContext().getApplicationContext()); FPLUGController controller; if (lightId == null) { controller = app.getConnectedController(serviceId); } else if (lightId.length() != 0) { controller = app.getConnectedController(lightId); } else { MessageUtils.setInvalidRequestParameterError(response, "lightId is not specified."); return true; } if (controller == null) { MessageUtils.setInvalidRequestParameterError(response, "Not found fplug: " + lightId); return true; } controller.requestLEDControl(false, new FPLUGRequestCallback() { @Override public void onSuccess(final FPLUGResponse fResponse) { sendResultOK(response); } @Override public void onError(final String message) { sendResultError(response); } @Override public void onTimeout() { sendResultTimeout(response); } }); return false; } }; public FPLUGLightProfile() { addApi(mGetLightApi); addApi(mPostLightApi); addApi(mDeleteLightApi); } private void flashing(final FPLUGController controller, long[] flashing) { FlashingExecutor exe = mFlashingMap.get(controller.getAddress()); if (exe == null) { exe = new FlashingExecutor(); mFlashingMap.put(controller.getAddress(), exe); } exe.setLightControllable(new FlashingExecutor.LightControllable() { @Override public void changeLight(boolean isOn, final FlashingExecutor.CompleteListener listener) { controller.requestLEDControl(isOn, new FPLUGRequestCallback() { @Override public void onSuccess(FPLUGResponse response) { listener.onComplete(); } @Override public void onError(String message) { listener.onComplete(); } @Override public void onTimeout() { listener.onComplete(); } }); } }); exe.start(flashing); } private void sendResultOK(final Intent response) { setResult(response, DConnectMessage.RESULT_OK); ((FPLUGDeviceService) getContext()).sendResponse(response); } private void sendResultError(final Intent response) { MessageUtils.setUnknownError(response); ((FPLUGDeviceService) getContext()).sendResponse(response); } private void sendResultTimeout(final Intent response) { MessageUtils.setTimeoutError(response); ((FPLUGDeviceService) getContext()).sendResponse(response); } }