/* DConnectWebService.java Copyright (c) 2014 NTT DOCOMO,INC. Released under the MIT license http://opensource.org/licenses/mit-license.php */ package org.deviceconnect.android.manager; import android.app.PendingIntent; import android.app.Service; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.content.IntentFilter; import android.net.ConnectivityManager; import android.os.Binder; import android.os.Build; import android.os.IBinder; import android.support.v4.app.NotificationCompat; import org.deviceconnect.android.manager.setting.SettingActivity; import org.deviceconnect.android.manager.util.DConnectUtil; import org.deviceconnect.server.DConnectServer; import org.deviceconnect.server.DConnectServerConfig; import org.deviceconnect.server.nanohttpd.DConnectServerNanoHttpd; import java.util.logging.Logger; /** * Webサーバ用のサービス. * @author NTT DOCOMO, INC. */ public class DConnectWebService extends Service { /** ロガー. */ protected final Logger mLogger = Logger.getLogger("dconnect.manager"); /** Notification Id. */ private static final int ONGOING_NOTIFICATION_ID = 8080; /** Webサーバ. */ private DConnectServer mWebServer; /** DConnectの設定. */ private DConnectSettings mSettings; /** バインドクラス. */ private final IBinder mLocalBinder = new LocalBinder(); @Override public IBinder onBind(final Intent intent) { return mLocalBinder; } @Override public boolean onUnbind(final Intent intent) { return super.onUnbind(intent); } @Override public void onCreate() { super.onCreate(); mSettings = DConnectSettings.getInstance(); mSettings.load(this); // Webサーバの起動フラグがONになっている場合には起動を行う if (mSettings.isWebServerStartFlag()) { startWebServer(); } } @Override public void onDestroy() { stopWebServer(); super.onDestroy(); } @Override public int onStartCommand(final Intent intent, final int flags, final int startId) { return START_STICKY; } /** * Webサーバを起動する. */ public synchronized void startWebServer() { if (mWebServer == null) { mSettings.load(this); DConnectServerConfig.Builder builder = new DConnectServerConfig.Builder(); builder.port(mSettings.getWebPort()) .documentRootPath(mSettings.getDocumentRootPath()); if (BuildConfig.DEBUG) { mLogger.info("Web Server was Started."); mLogger.info("Host: " + mSettings.getHost()); mLogger.info("Port: " + mSettings.getWebPort()); mLogger.info("Document Root: " + mSettings.getDocumentRootPath()); } mWebServer = new DConnectServerNanoHttpd(builder.build(), this); mWebServer.start(); showNotification(); IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); registerReceiver(mWiFiReceiver, filter); } } /** * Webサーバを停止する. */ public synchronized void stopWebServer() { if (mWebServer != null) { unregisterReceiver(mWiFiReceiver); mWebServer.shutdown(); mWebServer = null; hideNotification(); } if (BuildConfig.DEBUG) { mLogger.info("Web Server was Stopped."); } } public synchronized boolean isRunning() { return mWebServer != null; } /** * サービスをフォアグランドに設定する。 */ private void showNotification() { Intent notificationIntent = new Intent(getApplicationContext(), SettingActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity( getApplicationContext(), 0, notificationIntent, 0); NotificationCompat.Builder builder = new NotificationCompat.Builder(getApplicationContext()); builder.setContentIntent(pendingIntent); builder.setTicker(getString(R.string.service_web_server)); builder.setContentTitle(getString(R.string.service_web_server)); builder.setContentText(DConnectUtil.getIPAddress(this) + ":" + mSettings.getWebPort()); int iconType = Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP ? R.drawable.icon : R.drawable.on_icon; builder.setSmallIcon(iconType); startForeground(ONGOING_NOTIFICATION_ID, builder.build()); } /** * フォアグランドを停止する。 */ private void hideNotification() { stopForeground(true); } /** * DConnectWebServiceとバインドするためのクラス. */ public class LocalBinder extends Binder { /** * DConnectWebServiceのインスタンスを取得する. * * @return DConnectWebServiceのインスタンス */ public DConnectWebService getDConnectWebService() { return DConnectWebService.this; } } /** * ネットワークiの接続状態の変化を受け取るレシーバー. */ private final BroadcastReceiver mWiFiReceiver = new BroadcastReceiver() { @Override public void onReceive(final Context context, final Intent intent) { showNotification(); } }; }