/* LinkingLightProfile.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.deviceplugin.linking.linking.profile; import android.content.Intent; import android.os.Bundle; import org.deviceconnect.android.deviceplugin.linking.LinkingApplication; import org.deviceconnect.android.deviceplugin.linking.LinkingDevicePluginService; import org.deviceconnect.android.deviceplugin.linking.linking.LinkingDevice; import org.deviceconnect.android.deviceplugin.linking.linking.LinkingDeviceManager; import org.deviceconnect.android.deviceplugin.linking.linking.service.LinkingDeviceService; 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.List; /** * Light Profile. * * @author NTT DOCOMO, INC. */ public class LinkingLightProfile extends LightProfile { private FlashingExecutor mFlashingExecutor; public LinkingLightProfile() { addApi(mGetLightApi); addApi(mPostLightApi); addApi(mDeleteLightApi); } private final DConnectApi mGetLightApi = new GetApi() { @Override public boolean onRequest(final Intent request, final Intent response) { LinkingDevice device = getDevice(response); if (device == null) { return true; } Bundle lightParam = new Bundle(); setLightId(lightParam, device.getBdAddress()); setName(lightParam, "Linking LED"); setOn(lightParam, false); List<Bundle> lightParams = new ArrayList<>(); lightParams.add(lightParam); setResult(response, DConnectMessage.RESULT_OK); setLights(response, lightParams); sendResponse(response); return true; } }; private final DConnectApi mPostLightApi = new PostApi() { @Override public boolean onRequest(final Intent request, final Intent response) { LinkingDevice device = getDevice(response); if (device == null) { return true; } String lightId = getLightId(request); if (lightId != null && !device.getBdAddress().equals(lightId)) { MessageUtils.setInvalidRequestParameterError(response, "lightId is invalid."); return true; } long[] flashing; try { flashing = getFlashing(request); } catch (Exception e) { MessageUtils.setInvalidRequestParameterError(response, "flashing is negative."); return true; } LinkingDeviceManager manager = getLinkingDeviceManager(); if (flashing != null) { flashing(manager, device, flashing); } else { manager.sendLEDCommand(device, true); } setResult(response, DConnectMessage.RESULT_OK); sendResponse(response); return true; } }; private final DConnectApi mDeleteLightApi = new DeleteApi() { @Override public boolean onRequest(final Intent request, final Intent response) { LinkingDevice device = getDevice(response); if (device == null) { return true; } String lightId = getLightId(request); if (lightId != null && !device.getBdAddress().equals(lightId)) { MessageUtils.setInvalidRequestParameterError(response, "lightId is invalid."); return true; } getLinkingDeviceManager().sendLEDCommand(device, false); setResult(response, DConnectMessage.RESULT_OK); sendResponse(response); return true; } }; private synchronized void flashing(final LinkingDeviceManager manager, final LinkingDevice device, final long[] flashing) { if (mFlashingExecutor == null) { mFlashingExecutor = new FlashingExecutor(); } mFlashingExecutor.setLightControllable(new FlashingExecutor.LightControllable() { @Override public void changeLight(final boolean isOn, final FlashingExecutor.CompleteListener listener) { manager.sendLEDCommand(device, isOn); listener.onComplete(); } }); mFlashingExecutor.start(flashing); } private LinkingDevice getDevice(final Intent response) { LinkingDevice device = ((LinkingDeviceService) getService()).getLinkingDevice(); if (!device.isConnected()) { MessageUtils.setIllegalDeviceStateError(response, "device not connected"); return null; } if (!device.isSupportLED()) { MessageUtils.setIllegalDeviceStateError(response, "device has not LED"); return null; } return device; } private LinkingDeviceManager getLinkingDeviceManager() { LinkingDevicePluginService service = (LinkingDevicePluginService) getContext(); LinkingApplication app = (LinkingApplication) service.getApplication(); return app.getLinkingDeviceManager(); } }