/*
KadecotService
Copyright (c) 2016 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.deviceplugin.kadecot.service;
import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import org.deviceconnect.android.deviceplugin.kadecot.KadecotDeviceService;
import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.ENLObject;
import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.KadecotDevice;
import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.KadecotHomeAirConditioner;
import org.deviceconnect.android.deviceplugin.kadecot.kadecotdevice.KadecotResult;
import org.deviceconnect.android.deviceplugin.kadecot.profile.KadecotEchonetliteProfile;
import org.deviceconnect.android.deviceplugin.kadecot.profile.KadecotHomeAirConditionerProfile;
import org.deviceconnect.android.deviceplugin.kadecot.profile.KadecotLightProfile;
import org.deviceconnect.android.deviceplugin.kadecot.profile.KadecotPowerProfile;
import org.deviceconnect.android.deviceplugin.kadecot.profile.KadecotTemperatureProfile;
import org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfile;
import org.deviceconnect.android.deviceplugin.kadecot.profile.original.AirConditionerProfileConstants;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.LightProfile;
import org.deviceconnect.android.service.DConnectService;
import org.deviceconnect.message.DConnectMessage;
import static org.deviceconnect.android.profile.DConnectProfile.setResult;
public class KadecotService extends DConnectService {
/** Kadecot prefix. */
public static final String PREFIX_KADECOT = "kadecot";
/** "No result" string. */
public static final String NO_RESULT = "{}";
/** Index of prefix. */
public static final int IDX_PREFIX = 0;
/** Index of kadecot deviceId. */
public static final int IDX_DEVICEID = 1;
/** Index of profile name. */
public static final int IDX_PROFILENAME = 2;
private final KadecotDevice mDevice;
public KadecotService(final KadecotDevice kadecotDevice, final ENLObject object) {
super(kadecotDevice.getServiceId());
mDevice = kadecotDevice;
if (kadecotDevice.getNickname() != null) {
setName(kadecotDevice.getNickname() + "_" + kadecotDevice.getDeviceId());
} else {
setName(object.exchangeServiceId(kadecotDevice.getDeviceType()) + " (Kadecot)");
}
setNetworkType(NetworkType.WIFI);
setOnline(true);
String serviceId = kadecotDevice.getServiceId();
if (isSupported(LightProfile.PROFILE_NAME, serviceId)) {
addProfile(new KadecotLightProfile());
} else if (isSupported(AirConditionerProfile.PROFILE_NAME, serviceId)) {
addProfile(new KadecotHomeAirConditionerProfile());
addProfile(new KadecotTemperatureProfile());
addProfile(new KadecotPowerProfile());
}
addProfile(new KadecotEchonetliteProfile());
}
private static boolean isSupported(final String profileName, final String serviceId) {
String[] element = KadecotDeviceService.getElementFromServiceId(serviceId);
return profileName.equals(element[IDX_PROFILENAME]);
}
/**
* Creates an error of "unknown error" for Kadecot server response.
*
* @param response Intent to store the response.
*/
public static void createInvalidKadecotResponseError(final Intent response) {
MessageUtils.setUnknownError(response, "There is a problem with the response from the Kadecot server.");
}
/**
* Request Kadecot server.
*
* @param response Response.
* @param serviceId Service ID.
* @param property Request property.
* @param value Set property value.
* @return Request result. (Processing error is null.)
*/
public static KadecotResult requestKadecotServer(final Context context, final Intent response, final String serviceId, final int property,
final int value) {
String[] element = KadecotDeviceService.getElementFromServiceId(serviceId);
if (element[IDX_PREFIX].equals(PREFIX_KADECOT) && element[IDX_DEVICEID] != null
&& element[IDX_PROFILENAME].equals(AirConditionerProfileConstants.PROFILE_NAME)) {
KadecotHomeAirConditioner khac = new KadecotHomeAirConditioner();
String urlstr = khac.exchangeJsonString(element[IDX_DEVICEID], property, value);
Cursor cursor = context.getContentResolver().query(Uri.parse(urlstr), null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
KadecotResult result = new KadecotResult();
String strResult = cursor.getString(0);
result.setServerResult(strResult);
result.setPropertyName(KadecotDeviceService.getPropertyName(strResult));
result.setPropertyValue(KadecotDeviceService.getPropertyValue(strResult));
cursor.close();
return result;
} else {
createInvalidKadecotResponseError(response);
return null;
}
} else {
createInvalidKadecotResponseError(response);
return null;
}
}
/**
* Request Kadecot server.
*
* @param context Context.
* @param response Response.
* @param serviceId Service ID.
* @param property Request property.
* @return Request result. (Processing error is null.)
*/
public static KadecotResult requestKadecotServer(final Context context, final Intent response, final String serviceId, final int property) {
String[] element = KadecotDeviceService.getElementFromServiceId(serviceId);
if (element[IDX_PREFIX].equals(PREFIX_KADECOT) && element[IDX_DEVICEID] != null
&& element[IDX_PROFILENAME].equals(AirConditionerProfileConstants.PROFILE_NAME)) {
KadecotHomeAirConditioner khac = new KadecotHomeAirConditioner();
String urlstr = khac.exchangeJsonString(element[IDX_DEVICEID], property);
Cursor cursor = context.getContentResolver().query(Uri.parse(urlstr), null, null, null, null);
if (cursor != null) {
cursor.moveToFirst();
KadecotResult result = new KadecotResult();
String strResult = cursor.getString(0);
result.setServerResult(strResult);
result.setPropertyName(KadecotDeviceService.getPropertyName(strResult));
result.setPropertyValue(KadecotDeviceService.getPropertyValue(strResult));
cursor.close();
return result;
} else {
createInvalidKadecotResponseError(response);
return null;
}
} else {
createInvalidKadecotResponseError(response);
return null;
}
}
/**
* Get Power Status.
* @param response Response Message.
* @param result Kedecot Result.
*/
public static void getPowerStatus(Intent response, KadecotResult result) {
if (result != null) {
String propertyName = result.getPropertyName();
String propertyValue = result.getPropertyValue();
if (propertyName != null && propertyValue != null) {
if (propertyName.equals(KadecotHomeAirConditioner.PROP_OPERATIONSTATUS)) {
setResult(response, DConnectMessage.RESULT_OK);
switch (propertyValue) {
case "48": AirConditionerProfile.setPowerStatus(response, "ON"); break;
case "49": AirConditionerProfile.setPowerStatus(response, "OFF"); break;
default: AirConditionerProfile.setPowerStatus(response, "UNKNOWN"); break;
}
} else if (result.getServerResult().equals(NO_RESULT)) {
MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure.");
} else {
KadecotService.createInvalidKadecotResponseError(response);
}
} else {
KadecotService.createInvalidKadecotResponseError(response);
}
}
}
/**
* Set Power.
* @param response Response Message.
* @param result Kedecot Result.
*/
public static void powerOn(Intent response, KadecotResult result) {
if (result != null) {
String propertyName = result.getPropertyName();
String propertyValue = result.getPropertyValue();
if (propertyName != null && propertyValue != null) {
if (propertyName.equals(KadecotHomeAirConditioner.PROP_OPERATIONSTATUS)) {
switch (propertyValue) {
case "48": setResult(response, DConnectMessage.RESULT_OK); break;
case "49": setResult(response, DConnectMessage.RESULT_ERROR); break;
default: KadecotService.createInvalidKadecotResponseError(response); break;
}
} else if (result.getServerResult().equals(NO_RESULT)) {
MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure.");
} else {
KadecotService.createInvalidKadecotResponseError(response);
}
} else {
KadecotService.createInvalidKadecotResponseError(response);
}
}
}
/**
* Power Off.
* @param response Response Message.
* @param result Kadecot Result.
*/
public static void powerOff(final Intent response, final KadecotResult result) {
if (result != null) {
String propertyName = result.getPropertyName();
String propertyValue = result.getPropertyValue();
if (propertyName != null && propertyValue != null) {
if (propertyName.equals(KadecotHomeAirConditioner.PROP_OPERATIONSTATUS)) {
switch (propertyValue) {
case "48": setResult(response, DConnectMessage.RESULT_ERROR); break;
case "49": setResult(response, DConnectMessage.RESULT_OK); break;
default: KadecotService.createInvalidKadecotResponseError(response); break;
}
} else if (result.getServerResult().equals(NO_RESULT)) {
MessageUtils.setNotSupportAttributeError(response, "This device not support 'get' procedure.");
} else {
KadecotService.createInvalidKadecotResponseError(response);
}
} else {
KadecotService.createInvalidKadecotResponseError(response);
}
}
}
public boolean hasDeviceId(final String deviceId) {
String[] element = KadecotDeviceService.getElementFromServiceId(getId());
return deviceId.equals(element[IDX_DEVICEID]);
}
public KadecotDevice getDevice() {
return mDevice;
}
}