/*
DConnectService.java
Copyright (c) 2016 NTT DOCOMO,INC.
Released under the MIT license
http://opensource.org/licenses/mit-license.php
*/
package org.deviceconnect.android.service;
import android.content.Context;
import android.content.Intent;
import org.deviceconnect.android.message.MessageUtils;
import org.deviceconnect.android.profile.DConnectProfile;
import org.deviceconnect.android.profile.DConnectProfileProvider;
import org.deviceconnect.android.profile.ServiceInformationProfile;
import org.deviceconnect.profile.ServiceDiscoveryProfileConstants;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Device Connect APIサービス.
*
* @author NTT DOCOMO, INC.
*/
public class DConnectService implements DConnectProfileProvider, ServiceDiscoveryProfileConstants {
/**
* サービスID.
*/
private final String mId;
/**
* サポートするプロファイル一覧.
*/
private final Map<String, DConnectProfile> mProfiles = new HashMap<String, DConnectProfile>();
/**
* サービス名.
*/
private String mName;
/**
* サービスタイプ.
*/
private String mType;
/**
* オンラインフラグ.
*/
private boolean mIsOnline;
/**
* サービスのコンフィグ.
*/
private String mConfig;
/**
* コンテキスト.
*/
private Context mContext;
/**
* ステータス更新通知リスナー.
*/
private OnStatusChangeListener mStatusListener;
/**
* コンストラクタ.
* @param id サービスID
* @throws NullPointerException idに<code>null</code>が指定された場合
*/
public DConnectService(final String id) {
if (id == null) {
throw new NullPointerException("id is null.");
}
mId = id;
addProfile(new ServiceInformationProfile());
}
/**
* サービスIDを取得する.
* @return サービスID
*/
public String getId() {
return mId;
}
/**
* サービス名を設定する.
*
* @param name サービス名
*/
public void setName(final String name) {
mName = name;
}
/**
* サービス名を取得する.
*
* @return サービス名.
*/
public String getName() {
return mName;
}
/**
* サービスのネットワークタイプを設定する.
*
* @param type ネットワークタイプ
*/
public void setNetworkType(final NetworkType type) {
mType = type.getValue();
}
/**
* サービスのネットワークタイプを設定する.
* <p>
* {@link org.deviceconnect.profile.ServiceDiscoveryProfileConstants.NetworkType NetworkType}
* に定義されていないタイプの場合には、このメソッドを使用して独自のネットワークタイプを設定することができる。
* </p>
* @param type ネットワークタイプ
*/
public void setNetworkType(final String type) {
mType = type;
}
/**
* サービスのネットワークタイプを取得する.
* @return ネットワークタイプ
*/
public String getNetworkType() {
return mType;
}
/**
* ネットワークの状態を設定する.
*
* @param isOnline オンラインの場合はtrue、オフラインの場合はfalse
*/
public void setOnline(final boolean isOnline) {
mIsOnline = isOnline;
if (mStatusListener != null) {
mStatusListener.onStatusChange(this);
}
}
/**
* ネットワークの状態を取得する.
* @return オンラインの場合はtrue、オフラインの場合はfalse
*/
public boolean isOnline() {
return mIsOnline;
}
/**
* サービスのコンフィグを取得する.
* <p>
* コンフィグ情報が存在しない場合には{@code null}を返却する。
* </p>
* @return サービスのコンフィグ
*/
public String getConfig() {
return mConfig;
}
/**
* サービスのコンフィグを設定する.
* <p>
* コンフィグ情報が存在しない場合には、{@code null}を設定する。<br>
* デフォルトは、{@code null}が設定されている。
* </p>
* @param config コンフィグ情報
*/
public void setConfig(final String config) {
mConfig = config;
}
/**
* コンテキストを設定する.
* <p>
* {@link DConnectServiceManager}に追加されるときにコンテキストが設定される。
* </p>
* @param context コンテキスト
*/
void setContext(final Context context) {
mContext = context;
}
/**
* コンテキストを取得する.
* @return
*/
public Context getContext() {
return mContext;
}
@Override
public List<DConnectProfile> getProfileList() {
List<DConnectProfile> list = new ArrayList<DConnectProfile>();
for (DConnectProfile profile : mProfiles.values()) {
list.add(profile);
}
return list;
}
@Override
public DConnectProfile getProfile(final String name) {
if (name == null) {
return null;
}
return mProfiles.get(name.toLowerCase());
}
@Override
public void addProfile(final DConnectProfile profile) {
if (profile == null) {
return;
}
profile.setService(this);
mProfiles.put(profile.getProfileName().toLowerCase(), profile);
}
@Override
public void removeProfile(final DConnectProfile profile) {
if (profile == null) {
return;
}
mProfiles.remove(profile.getProfileName().toLowerCase());
}
/**
* サービスに命令が通知されたときに呼び出されるメソッド.
* <p>
* このメソッドの中でサービスに登録されている各プロファイルに命令を振り分ける。<br>
* 各プロファイルでは、requestに対するレスポンスをresponseに格納する。
* </p>
* <p>
* レスポンスにtrueが返却した場合には、Plugin SDKは、responseをDevice Connect Managerに返却する。<br>
* falseの場合には、Plugin SDKは、responseをDevice Connect Managerに返却しません。プラグイン側で、
* {@link org.deviceconnect.android.message.DConnectMessageService#sendResponse(Intent)}を用いて
* レスポンスを返却する必要があります。
* </p>
* @param request リクエスト
* @param response レスポンス
* @return 同期的にレスポンスを返却する場合にはtrue、それ以外はfalse
*/
public boolean onRequest(final Intent request, final Intent response) {
DConnectProfile profile = getProfile(DConnectProfile.getProfile(request));
if (profile == null) {
MessageUtils.setNotSupportProfileError(response);
return true;
}
return profile.onRequest(request, response);
}
/**
* ステータス更新通知リスナーを設定する.
*
* @param listener リスナー
*/
void setOnStatusChangeListener(final OnStatusChangeListener listener) {
mStatusListener = listener;
}
/**
* ステータス更新通知リスナー.
*
* @author NTT DOCOMO, INC.
*/
interface OnStatusChangeListener {
/**
* ステータスが変更されたサービスを通知する.
*
* @param service ステータスが変更されたサービス
*/
void onStatusChange(DConnectService service);
}
}