/*
LightProfile
Copyright (c) 2015 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.profile;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import org.deviceconnect.profile.LightProfileConstants;
import java.util.List;
/**
* Light プロファイル.
* <p>
* スマートデバイス上のライトを操作要求するAPI.
* </p>
*
* @deprecated
* swagger定義ファイルで定数を管理することになったので、このクラスは使用しないこととする。
* プロファイルを実装する際は本クラスではなく、{@link DConnectProfile} クラスを継承すること。
*
* @author NTT DOCOMO, INC.
*/
public abstract class LightProfile extends DConnectProfile implements LightProfileConstants {
@Override
public String getProfileName() {
return PROFILE_NAME;
}
/**
* 明るさのチェックする.
* <p>
* brightnessが0より小さい、または、1.0よりも大きい場合にはエラーとする。
* </p>
* <p>
* brightnessがnullの場合には無視する。
* </p>
* @param brightness 明るさ
* @return 範囲外の場合はtrue、それ以外はfalse
*/
private static boolean checkBrightness(final Double brightness) {
return (brightness != null && (brightness < 0.0 || brightness > 1.0));
}
/**
* Attributeがnullかどうか.
*
* @param request リクエストパラメータ
* @return Attributeがnullの場合はtrue
*/
private boolean isNullAttribute(final Intent request) {
return getAttribute(request) == null;
}
/**
* Interfaceがnullかどうか.
*
* @param request リクエストパラメータ
* @return Interfaceがnullの場合はtrue
*/
private boolean isNullInterface(final Intent request) {
return getInterface(request) == null;
}
/**
* Attributeがlight/groupかどうか.
*
* @param request リクエストパラメータ
* @return Attributeがnullの場合はtrue
*/
private boolean isLightGroupAttribute(final Intent request) {
String attribute = getAttribute(request);
return isNullInterface(request) && ATTRIBUTE_GROUP.equalsIgnoreCase(attribute);
}
/**
* Attributeがlight/group/createかどうか.
*
* @param request リクエストパラメータ
* @return Attributeがnullの場合はtrue
*/
private boolean isLightGroupCreateAttribute(final Intent request) {
String myInterface = getInterface(request);
String attribute = getAttribute(request);
return INTERFACE_GROUP.equalsIgnoreCase(myInterface)
&& ATTRIBUTE_CREATE.equalsIgnoreCase(attribute);
}
/**
* Attributeがlight/group/clearかどうか.
*
* @param request リクエストパラメータ
* @return Attributeがnullの場合はtrue
*/
private boolean isLightGroupClearAttribute(final Intent request) {
String myInterface = getInterface(request);
String attribute = getAttribute(request);
return INTERFACE_GROUP.equalsIgnoreCase(myInterface)
&& ATTRIBUTE_CLEAR.equalsIgnoreCase(attribute);
}
/**
* リクエストからlightIdを取得する.
* <p>
* lightIdが省略された場合にはnullを返却する。
* </p>
* @param request リクエスト
* @return lightId
*/
public static final String getLightId(final Intent request) {
return request.getStringExtra(PARAM_LIGHT_ID);
}
/**
* リクエストからgroupIdを取得する.
* <p>
* 省略された場合にはnullを返却する。
* </p>
* @deprecated 廃止します。
* @param request リクエスト
* @return groupId
*/
public static final String getGroupId(final Intent request) {
return request.getStringExtra(PARAM_GROUP_ID);
}
/**
* リクエストからlightIdsを取得する.
* <p>
* 省略された場合にはnullを返却する。
* </p>
* @param request リクエスト
* @return lightIds
*/
public static final String[] getLightIds(final Intent request) {
String lightIds = request.getStringExtra(PARAM_LIGHT_IDS);
if (lightIds == null) {
return null;
}
return lightIds.split(",");
}
/**
* リクエストからライト名を取得する.
* <p>
* ライト名が省略された場合にはnullを返却する。
* </p>
* @param request リクエスト
* @return ライト名
*/
public static final String getName(final Intent request) {
return request.getStringExtra(PARAM_NAME);
}
/**
* リクエストからgroupNameを取得する.
* <p>
* 省略された場合にはnullを返却する。
* </p>
* @deprecated 廃止します。
* @param request リクエスト
* @return groupName
*/
public static final String getGroupName(final Intent request) {
return request.getStringExtra(PARAM_GROUP_NAME);
}
/**
* リクエストから色を取得する.
* <p>
* 色が指定されていない場合にはnullを返却する。
* </p>
* <p>
* 16進数のRGB形式になっていない場合には、IllegalArgumentExceptionを発生する。
* </p>
* @param request リクエスト
* @return 色情報
* @throws IllegalArgumentException 色指定がフォーマットエラーの場合に発生
*/
public static final Integer getColor(final Intent request) {
Bundle bundle = request.getExtras();
if (bundle == null) {
return null;
}
String color = bundle.getString(PARAM_COLOR);
if (color == null) {
return null;
}
if (color.length() != 6) {
throw new IllegalArgumentException("color is invalid.");
}
try {
int r = Integer.parseInt(color.substring(0, 2), 16);
int g = Integer.parseInt(color.substring(2, 4), 16);
int b = Integer.parseInt(color.substring(4, 6), 16);
return Color.rgb(r, g, b);
} catch (Exception e) {
throw new IllegalArgumentException("color is invalid.");
}
}
/**
* ライトの明るさを取得する.
* <p>
* 省略された場合にはnullを返却する。
* </p>
* @param request リクエスト
* @return ライトの明るさ
* @throws IllegalArgumentException brightnessのフォーマットが不正な場合に発生
*/
public static final Double getBrightness(final Intent request) {
Bundle bundle = request.getExtras();
if (bundle == null) {
return null;
}
Object param = bundle.get(PARAM_BRIGHTNESS);
if (param == null) {
return null;
}
try {
Double brightness = null;
if (param instanceof String) {
brightness = Double.parseDouble((String) param);
} else {
brightness = (Double) param;
}
if (checkBrightness(brightness)) {
throw new IllegalArgumentException("brightness should be a value between 0 and 1.0");
}
return brightness;
} catch (Exception e) {
throw new IllegalArgumentException("brightness is invalid.");
}
}
/**
* 点滅間隔を取得する.
* <p>
* flashingが省略された場合にはnullを返却する。
* </p>
* @param request リクエスト
* @return 点滅間隔
* @throws IllegalArgumentException flashingのフォーマットが不正な場合に発生
*/
public static final long[] getFlashing(final Intent request) {
String flashing = request.getStringExtra(PARAM_FLASHING);
if (flashing == null) {
return null;
}
if (flashing.length() == 0) {
throw new IllegalArgumentException("flashing is invalid.");
}
String[] split = flashing.split(",");
long[] list = new long[split.length];
for (int i = 0; i < split.length; i++) {
try {
list[i] = Integer.parseInt(split[i]);
if (list[i] <= 0) {
throw new IllegalArgumentException("flashing is negative value.");
}
} catch (NumberFormatException e) {
throw new IllegalArgumentException("flashing is invalid.");
}
}
return list;
}
/**
* レスポンスにライト情報一覧を設定する.
*
* @param response レスポンスデータ
* @param lights ライト情報一覧
*/
public static final void setLights(final Intent response, final List<Bundle> lights) {
Bundle[] bundles = new Bundle[lights.size()];
lights.toArray(bundles);
setLights(response, bundles);
}
/**
* レスポンスにライト情報一覧を設定する.
*
* @param response レスポンスデータ
* @param lights ライト情報一覧
*/
public static final void setLights(final Intent response, final Bundle[] lights) {
response.putExtra(PARAM_LIGHTS, lights);
}
/**
* レスポンスにライト情報一覧を設定する.
*
* @param group レスポンスデータ
* @param lights ライト情報一覧
*/
public static final void setLights(final Bundle group, final List<Bundle> lights) {
Bundle[] bundles = new Bundle[lights.size()];
lights.toArray(bundles);
setLights(group, bundles);
}
/**
* レスポンスにライト情報一覧を設定する.
*
* @param group レスポンスデータ
* @param lights ライト情報一覧
*/
public static final void setLights(final Bundle group, final Bundle[] lights) {
group.putParcelableArray(PARAM_LIGHTS, lights);
}
/**
* レスポンスにライトIDを設定する.
*
* @param response レスポンスデータ
* @param lightId ライトID
*/
public static final void setLightId(final Intent response, final String lightId) {
response.putExtra(PARAM_LIGHT_ID, lightId);
}
/**
* ライト情報にライトIDを設定する.
*
* @param light レスポンスデータ
* @param lightId ライトID
*/
public static final void setLightId(final Bundle light, final String lightId) {
light.putString(PARAM_LIGHT_ID, lightId);
}
/**
* レスポンスに名前を設定する.
*
* @param response レスポンスデータ
* @param name 名前
*/
public static final void setName(final Intent response, final String name) {
response.putExtra(PARAM_NAME, name);
}
/**
* ライト情報に名前を設定する.
*
* @param light ライト情報
* @param name 名前
*/
public static final void setName(final Bundle light, final String name) {
light.putString(PARAM_NAME, name);
}
/**
* ライト情報に点灯状態を設定する.
*
* @param light ライト情報
* @param on 点灯状態 (true: 点灯 false: 消灯)
*/
public static final void setOn(final Bundle light, final boolean on) {
light.putBoolean(PARAM_ON, on);
}
/**
* ライト情報に固有の設定を設定する.
*
* @param light ライト情報
* @param config 設定
*/
public static final void setConfig(final Bundle light, final String config) {
light.putString(PARAM_CONFIG, config);
}
/**
* レスポンスにライトグループ一覧を設定する.
*
* @deprecated 廃止します。
* @param response レスポンスデータ
* @param lightGroups ライトグループ一覧
*/
public static final void setLightGroups(final Intent response, final List<Bundle> lightGroups) {
Bundle[] bundles = new Bundle[lightGroups.size()];
lightGroups.toArray(bundles);
setLightGroups(response, bundles);
}
/**
* レスポンスにライトグループ一覧を設定する.
*
* @deprecated 廃止します。
* @param response レスポンスデータ
* @param lightGroups ライトグループ一覧
*/
public static final void setLightGroups(final Intent response, final Bundle[] lightGroups) {
response.putExtra(PARAM_LIGHT_GROUPS, lightGroups);
}
/**
* レスポンスにグループIDを設定する.
*
* @deprecated 廃止します。
* @param response レスポンスデータ
* @param groupId グループID
*/
public static final void setGroupId(final Intent response, final String groupId) {
response.putExtra(PARAM_GROUP_ID, groupId);
}
/**
* ライトグループ情報にライトグループIDを設定する.
*
* @deprecated 廃止します。
* @param lightGroup ライトグループ情報
* @param groupId グループID
*/
public static final void setGroupId(final Bundle lightGroup, final String groupId) {
lightGroup.putString(PARAM_GROUP_ID, groupId);
}
/**
* ライトグループ情報にライトグループ名を設定する.
*
* @deprecated 廃止します。
* @param lightGroup ライトグループ情報
* @param name グループ名前
*/
public static final void setGroupName(final Bundle lightGroup, final String name) {
lightGroup.putString(PARAM_NAME, name);
}
/**
* ライトグループ情報にライトグループの設定を設定する.
*
* @deprecated 廃止します。
* @param lightGroup ライトグループ情報
* @param config グループの設定
*/
public static final void setGroupConfig(final Bundle lightGroup, final String config) {
lightGroup.putString(PARAM_CONFIG, config);
}
}