package org.deviceconnect.android.deviceplugin.irkit.service;
import android.content.Intent;
import org.deviceconnect.android.deviceplugin.irkit.IRKitManager;
import org.deviceconnect.android.deviceplugin.irkit.data.IRKitDBHelper;
import org.deviceconnect.android.deviceplugin.irkit.data.VirtualDeviceData;
import org.deviceconnect.android.deviceplugin.irkit.data.VirtualProfileData;
import org.deviceconnect.android.deviceplugin.irkit.profile.IRKitLightProfile;
import org.deviceconnect.android.deviceplugin.irkit.profile.IRKitPowerProfile;
import org.deviceconnect.android.deviceplugin.irkit.profile.IRKitTVProfile;
import org.deviceconnect.android.message.DConnectMessageService;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.LightProfile;
import org.deviceconnect.android.service.DConnectService;
import org.deviceconnect.android.service.DConnectServiceProvider;
import org.deviceconnect.message.DConnectMessage;
import java.util.List;
public class VirtualService extends DConnectService {
private final IRKitDBHelper mDBHelper;
private final DConnectServiceProvider mServiceProvider;
public VirtualService(final VirtualDeviceData device, final IRKitDBHelper dbHelper,
final DConnectServiceProvider provider) {
super(device.getServiceId());
mDBHelper = dbHelper;
mServiceProvider = provider;
setName(device.getDeviceName());
setNetworkType(NetworkType.WIFI);
List<VirtualProfileData> profiles =
mDBHelper.getVirtualProfiles(device.getServiceId(), null);
for (VirtualProfileData profile : profiles) {
if (LightProfile.PROFILE_NAME.equalsIgnoreCase(profile.getProfile())) {
addProfile(new IRKitLightProfile());
} else if (IRKitTVProfile.PROFILE_NAME.equalsIgnoreCase(profile.getProfile())) {
addProfile(new IRKitTVProfile());
addProfile(new IRKitPowerProfile());
}
}
}
@Override
public boolean isOnline() {
if (!isIRExist()) {
return false;
}
IRKitService ikKit = getIRKitService();
if (ikKit == null) {
return false;
}
return ikKit.isOnline();
}
private IRKitService getIRKitService() {
for (DConnectService irKit : mServiceProvider.getServiceList()) {
if (irKit instanceof IRKitService
&& this.getId().startsWith(irKit.getId())) {
return (IRKitService) irKit;
}
}
return null;
}
/**
* ライト用の赤外線を送信する.
* @param serviceId サービスID
* @param method HTTP Method
* @param uri URI
* @param response レスポンス
* @return true:同期 false:非同期
*/
public boolean sendTVRequest(final String serviceId, final String method, final String uri,
final Intent response) {
boolean send = true;
IRKitDBHelper helper = new IRKitDBHelper(getContext());
List<VirtualProfileData> requests = helper.getVirtualProfiles(serviceId, "TV");
if (requests.size() == 0) {
MessageUtils.setInvalidRequestParameterError(response, "Invalid ServiceId");
return send;
}
VirtualProfileData vData = null;
for (VirtualProfileData req : requests) {
if (req.getUri().equalsIgnoreCase(uri)
&& req.getMethod().equals(method)
&& req.getIr() != null) {
vData = req;
break;
}
}
if (vData != null) {
send = sendIR(vData.getIr(), response);
} else {
MessageUtils.setInvalidRequestParameterError(response, "IR is not registered for that request");
}
return send;
}
/**
* 一つでも赤外線が登録されているかをチェックする.
* @return true:登録されている, false:登録されていない
*/
private boolean isIRExist() {
List<VirtualProfileData> requests = mDBHelper.getVirtualProfiles(getId(), null);
for (VirtualProfileData request : requests) {
if (request.getIr() != null && request.getIr().contains("{\"format\":\"raw\",")) {
return true;
}
}
return false;
}
/**
* 赤外線を送信する.
* @param message 赤外線
* @param response レスポンス
* @return true:同期 false:非同期
*/
public boolean sendIR(final String message, final Intent response) {
IRKitService irKit = getIRKitService();
if (irKit == null) {
MessageUtils.setIllegalServerStateError(response, "IRKit is disconnected.");
return true;
}
IRKitManager.INSTANCE.sendMessage(irKit.getIp(), message, new IRKitManager.PostMessageCallback() {
@Override
public void onPostMessage(boolean result) {
if (result) {
response.putExtra(DConnectMessage.EXTRA_RESULT, DConnectMessage.RESULT_OK);
} else {
MessageUtils.setUnknownError(response);
}
((DConnectMessageService) getContext()).sendResponse(response);
}
});
return false;
}
}