/* * Copyright (C) 2013 - 2014 Alexander "Evisceration" Martinz * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * */ package org.namelessrom.devicecontrol.services; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.Service; import android.content.Context; import android.content.Intent; import android.os.IBinder; import android.support.v7.app.NotificationCompat; import com.koushikdutta.async.AsyncServerSocket; import org.namelessrom.devicecontrol.R; import org.namelessrom.devicecontrol.models.WebServerConfig; import org.namelessrom.devicecontrol.net.NetworkInfo; import org.namelessrom.devicecontrol.net.ServerWrapper; import org.namelessrom.devicecontrol.theme.AppResources; import timber.log.Timber; public class WebServerService extends Service { public static final int NOTIFICATION_ONGOING = 7861; public static final String ACTION_START = "action_start"; public static final String ACTION_STOP = "action_stop"; private ServerWrapper mServerWrapper; @Override public IBinder onBind(final Intent intent) { return null; } @Override public void onDestroy() { stopServer(); super.onDestroy(); } @Override public void onCreate() { super.onCreate(); startForeground(NOTIFICATION_ONGOING, getNotification()); } private Notification getNotification() { final String title = getString(R.string.wireless_file_manager); final String text; if (mServerWrapper != null) { final String port = ((getServerSocket() != null) ? String.valueOf(getServerSocket().getLocalPort()) : String.valueOf(WebServerConfig.get().port)); text = getString(R.string.web_server_running, "http://" + NetworkInfo.getAnyIpAddress() + ":" + port); } else { text = getString(R.string.web_server_not_running); } final Intent intent = new Intent(this, WebServerService.class); intent.setAction(ACTION_STOP); final PendingIntent pendingIntent = PendingIntent.getService(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT); final NotificationCompat.Builder builder = new NotificationCompat.Builder(this); builder.setContentTitle(title) .setContentText(text) .setOngoing(true) .setSmallIcon(R.drawable.ic_wifi_tethering_white_24dp) .setColor(AppResources.get().getAccentColor()) .setContentIntent(pendingIntent) .setAutoCancel(true); addNotificationStopButton(builder); return builder.build(); } private void addNotificationStopButton(final NotificationCompat.Builder builder) { final Intent stop = new Intent(this, WebServerService.class); stop.setAction(WebServerService.ACTION_STOP); final PendingIntent stopIntent = PendingIntent.getService(this, 0, stop, PendingIntent.FLAG_UPDATE_CURRENT); builder.addAction(R.drawable.ic_close_black_24dp, getString(R.string.stop), stopIntent); } public void setNotification(Notification notification) { final NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); if (notification == null) { notification = getNotification(); } notificationManager.notify(NOTIFICATION_ONGOING, notification); } public void cancelNotification() { final NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.cancel(NOTIFICATION_ONGOING); } @Override public int onStartCommand(final Intent intent, final int flags, final int startId) { if (intent == null || intent.getAction() == null || intent.getAction().isEmpty()) { stopServer(); return START_NOT_STICKY; } final String action = intent.getAction(); if (ACTION_START.equals(action)) { Timber.v("creating server!"); mServerWrapper = new ServerWrapper(this); mServerWrapper.createServer(); } else { Timber.v("stopping service!"); stopServer(); } return START_NOT_STICKY; } private void stopServer() { if (mServerWrapper != null) { mServerWrapper.stopServer(); mServerWrapper = null; } cancelNotification(); stopForeground(true); stopSelf(); } public AsyncServerSocket getServerSocket() { if (mServerWrapper != null) { return mServerWrapper.getServerSocket(); } else { return null; } } }