/* * Copyright (C) 2013-2014 Sony Computer Science Laboratories, Inc. All Rights Reserved. * Copyright (C) 2014 Sony Corporation. All Rights Reserved. */ package com.sonycsl.Kadecot.server; import android.content.Context; import android.content.Intent; import android.util.Log; import com.sonycsl.Kadecot.call.Notification; import com.sonycsl.Kadecot.core.Dbg; import com.sonycsl.Kadecot.device.DeviceManager; import java.io.IOException; import java.util.concurrent.Executors; public class ServerManager { private static final String TAG = ServerManager.class.getSimpleName(); private static ServerManager sInstance = null; private final Context mContext; private KadecotServerService mKadecotService; private KadecotWebSocketServer mWebSocketServer; private KadecotSnapServer mSnapServer; private ServerNetwork mServerNetwork; private DeviceManager mDeviceManager; private ServerSettings mServerSettings; private static final int mSnapPort = 31413; private final int STATUS_ON = 0; private final int STATUS_HOME_NETWORK_ACTIVE = 1; private final int STATUS_OFF = 2; private int mStatus = STATUS_OFF; private ServerManager(Context context) { mContext = context.getApplicationContext(); } public static synchronized ServerManager getInstance(Context context) { if (sInstance == null) { sInstance = new ServerManager(context); } return sInstance; } public void startServer(KadecotServerService service) { Dbg.print(mStatus); mKadecotService = service; if (mStatus == STATUS_OFF) { mStatus = STATUS_ON; getNetwork().startWatchingConnection(); onChangedServerSettings(); } } public void stopServer(KadecotServerService service) { Dbg.print(mStatus); if (mStatus == STATUS_OFF) { return; } if (mKadecotService == service) { mKadecotService = null; getNetwork().stopWatchingConnection(); // stopWebSocketServer(); // stopJSONPServer(); // stopForeground(); // stopHomeNetwork(); mStatus = STATUS_OFF; } } public void startHomeNetwork() { Dbg.print(mStatus); if (mStatus != STATUS_ON) { return; } mStatus = STATUS_HOME_NETWORK_ACTIVE; Executors.newSingleThreadExecutor().execute(new Runnable() { @Override public void run() { getDeviceManager().start(); } }); // changeNotification(); onChangedServerSettings(); } public void stopHomeNetwork() { Dbg.print(mStatus); if (mStatus == STATUS_HOME_NETWORK_ACTIVE) { getDeviceManager().stop(); stopWebSocketServer(); stopJSONPServer(); stopSnapServer(); stopForeground(); // changeNotification(); mStatus = STATUS_ON; onChangedServerSettings(); } } public void onChangedServerSettings() { Dbg.print(mStatus); getNetwork().watchConnection(); if (getSettings().isEnabledPersistentMode()) { startForeground(); } else { stopForeground(); } if (getSettings().isEnabledJSONPServer() && !isStartedJSONPServer()) { startJSONPServer(); } else if (!getSettings().isEnabledJSONPServer()) { stopJSONPServer(); } if (getSettings().isEnabledSnapServer() && !isStartedSnapServer()) { startSnapServer(); } else if (!getSettings().isEnabledSnapServer()) { stopSnapServer(); } if (getSettings().isEnabledWebSocketServer() && !isStartedWebSocketServer()) { startWebSocketServer(); Intent intent = new Intent("com.sonycsl.kadecot.intent.SERVER_STARTED"); mContext.sendBroadcast(intent); Log.d(TAG, "send broadcast" + intent); } else if (!getSettings().isEnabledWebSocketServer()) { stopWebSocketServer(); } changeNotification(); Notification.informAllOnNotifyServerSettings(mContext); } private void startForeground() { Dbg.print(mStatus); if (mStatus != STATUS_HOME_NETWORK_ACTIVE) { return; } if (mKadecotService != null) { mKadecotService.startForeground(); // persistent } } private void stopForeground() { Dbg.print(mStatus); if (mKadecotService != null) { mKadecotService.stopForeground(); // no persistent } } private void startWebSocketServer() { Dbg.print(mStatus); if (mStatus != STATUS_HOME_NETWORK_ACTIVE) { return; } getWebSocketServer().start(); } private void stopWebSocketServer() { Dbg.print(mStatus); getWebSocketServer().stop(); } public boolean isStartedWebSocketServer() { return getWebSocketServer().isStarted(); } private void startJSONPServer() { Dbg.print(mStatus); if (mStatus != STATUS_HOME_NETWORK_ACTIVE) { return; } try { getJSONPServer().start(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } changeNotification(); } private void startSnapServer() { if (mStatus != STATUS_HOME_NETWORK_ACTIVE) { return; } try { getSnapServer().start(mSnapPort); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } changeNotification(); } private void stopJSONPServer() { Dbg.print(mStatus); getJSONPServer().stop(); changeNotification(); } private void stopSnapServer() { Dbg.print(mStatus); getSnapServer().stop(); changeNotification(); } public boolean isStartedJSONPServer() { return getJSONPServer().isRunning(); } public boolean isStartedSnapServer() { return getSnapServer().isRunning(); } private void changeNotification() { if (mKadecotService != null) { mKadecotService.changeNotification(); } } private DeviceManager getDeviceManager() { if (mDeviceManager == null) { mDeviceManager = DeviceManager.getInstance(mContext); } return mDeviceManager; } private KadecotHttpServer getJSONPServer() { return KadecotHttpServer.getInstance(); } private KadecotSnapServer getSnapServer() { if (mSnapServer == null) { mSnapServer = KadecotSnapServer.getInstance(mContext); } return mSnapServer; } private KadecotWebSocketServer getWebSocketServer() { if (mWebSocketServer == null) { mWebSocketServer = KadecotWebSocketServer.getInstance(); } return mWebSocketServer; } private ServerSettings getSettings() { if (mServerSettings == null) { mServerSettings = ServerSettings.getInstance(mContext); } return mServerSettings; } private ServerNetwork getNetwork() { if (mServerNetwork == null) { mServerNetwork = ServerNetwork.getInstance(mContext); } return mServerNetwork; } }