/* WebSocketInfoManager.java Copyright (c) 2016 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager; import android.content.Context; import android.content.Intent; import org.deviceconnect.message.intent.message.IntentDConnectMessage; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * イベント送信経路(WebSocket)管理クラス. * * @author NTT DOCOMO, INC. */ public class WebSocketInfoManager { /** * WebSocketを格納しておくMap. */ private Map<String, WebSocketInfo> mWebSocketInfoMap = new HashMap<>(); /** * コンテキスト. */ private Context mContext; /** * プラグイン管理クラス. */ private DevicePluginManager mDevicePluginManager; /** * WebSocketのイベントリスナー. */ private OnWebSocketEventListener mOnWebSocketEventListener; /** * コンストラクタ. * @param context コンテキスト */ public WebSocketInfoManager(final Context context) { mContext = context; mDevicePluginManager = ((DConnectApplication) mContext).getDevicePluginManager(); } /** * WebSocketのイベントを通知するリスナーを設定する. * * @param onWebSocketEventListener リスナー */ public void setOnWebSocketEventListener(final OnWebSocketEventListener onWebSocketEventListener) { mOnWebSocketEventListener = onWebSocketEventListener; } /** * WebSocketを追加する. * * @param origin WebSocketのオリジン、もしくはセッションキー * @param uri URI * @param webSocketId WebSocketの識別子. */ public void addWebSocketInfo(final String origin, final String uri, final String webSocketId) { WebSocketInfo info = new WebSocketInfo(); info.setRawId(webSocketId); info.setUri(uri); info.setOrigin(origin); info.setConnectTime(System.currentTimeMillis()); mWebSocketInfoMap.put(origin, info); } /** * WebSocketを削除する. * * @param origin WebSocketのオリジン、もしくはセッションキー */ public void removeWebSocketInfo(final String origin) { WebSocketInfo info = mWebSocketInfoMap.remove(origin); if (info != null) { notifyDisconnectWebSocket(info.getOrigin()); if (mOnWebSocketEventListener != null) { mOnWebSocketEventListener.onDisconnect(origin); } } } /** * 指定されたオリジン、もしくはセッションキーに対応するWebSocketを取得する. * * @param origin WebSocketのオリジン、もしくはセッションキー * @return WebSocketの情報 */ public WebSocketInfo getWebSocketInfo(final String origin) { return mWebSocketInfoMap.get(origin); } /** * 登録されているWebSocketの一覧を取得する. * * @return WebSocketの一覧 */ public List<WebSocketInfo> getWebSocketInfos() { return new ArrayList<>(mWebSocketInfoMap.values()); } /** * 全プラグインにWebSocketが切断されたことを通知する. * @param origin オリジン */ private void notifyDisconnectWebSocket(final String origin) { List<DevicePlugin> plugins = mDevicePluginManager.getDevicePlugins(); for (DevicePlugin plugin : plugins) { String serviceId = plugin.getPluginId(); Intent request = new Intent(); request.setComponent(plugin.getComponentName()); request.setAction(IntentDConnectMessage.ACTION_EVENT_TRANSMIT_DISCONNECT); request.putExtra("pluginId", serviceId); request.putExtra(IntentDConnectMessage.EXTRA_ORIGIN, origin); mContext.sendBroadcast(request); } } /** * WebSocketのイベントを通知するリスナー. * * @author NTT DOCOMO, INC. */ public interface OnWebSocketEventListener { /** * WebSocketが切断されたことを通知する. * @param origin WebSocketのオリジン、もしくはセッションキー */ void onDisconnect(String origin); } }