package org.witness.informacam.share;
import info.guardianproject.iocipher.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;
import org.witness.informacam.InformaCam;
import org.witness.informacam.R;
import org.witness.informacam.models.media.IMedia;
import org.witness.informacam.share.www.SimpleWebServer;
import org.witness.informacam.utils.Constants.Models;
import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.support.v4.app.NotificationCompat;
import android.util.Log;
import ch.boye.httpclientandroidlib.conn.util.InetAddressUtils;
public class WebShareService extends Service {
private static SimpleWebServer mServer;
private File mRoot = new File("/");
private String mHost = null;
private int mPort = 9999;
public final static String ACTION_SERVER_START = "start";
public final static String ACTION_SERVER_STOP = "stop";
private String[] mMediaList = null;
WakeLock mWakeLock;
private final static String TAG = "WebShareService";
private static String mOnionSite = null;
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
if (mWakeLock != null && mWakeLock.isHeld())
mWakeLock.release();
}
private void initMediaShare ()
{
InformaCam informaCam = InformaCam.getInstance();
int sorting = Models.IMediaManifest.Sort.DATE_DESC;
List<IMedia> listMedia = informaCam.mediaManifest.sortBy(sorting);
if (mMediaList != null && mMediaList.length > 0)
{
ArrayList<IMedia> listMediaSelect = new ArrayList<IMedia>();
for (String mediaId : mMediaList)
{
for (IMedia media : listMedia)
if (media._id.equals(mediaId))
listMediaSelect.add(media);
}
mServer.setMedia(this, listMediaSelect);
}
else
{
mServer.setMedia(this, listMedia);
}
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
if (intent != null && intent.getAction() != null)
{
if (intent.getAction().equals(ACTION_SERVER_START))
{
if (intent.hasExtra("medialist"))
mMediaList = intent.getStringArrayExtra("medialist");
if (intent.hasExtra("host"))
mHost = intent.getExtras().getString("host");
if (intent.hasExtra("port"))
mPort = intent.getExtras().getInt("port");
if (intent.hasExtra("root"))
mRoot = new File(intent.getExtras().getString("root"));
startServer();
}
else if (intent.getAction().equals(ACTION_SERVER_STOP))
{
stopServer();
}
}
return START_STICKY;
}
private void startServer ()
{
Thread thread = new Thread ()
{
public void run ()
{
final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG);
mWakeLock.acquire();
boolean logQuiet = true;
mServer = new SimpleWebServer(mHost,mPort,mRoot,logQuiet);
showNotification ();
initMediaShare();
try {
mServer.start();
} catch (IOException ioe) {
System.err.println("Couldn't start server:\n" + ioe);
System.exit(-1);
}
}
};
thread.start();
}
private void stopServer ()
{
Thread thread = new Thread ()
{
public void run ()
{
if (mWakeLock != null && mWakeLock.isHeld())
mWakeLock.release();
stopForeground(true);
try {
mServer.stop();
} catch (Exception ioe) {
System.err.println("Couldn't stop server:\n" + ioe);
System.exit(-1);
}
}
};
thread.start();
}
public static boolean isRunning ()
{
return (mServer != null && mServer.isAlive());
}
public static String getOnionSite ()
{
return mOnionSite;
}
public static void setOnionSite (String onionSite)
{
mOnionSite = onionSite;
}
private void showNotification ()
{
Intent intentLaunch = getPackageManager().getLaunchIntentForPackage(getPackageName());
PendingIntent pendingIntent=PendingIntent.getActivity(this, 0,
intentLaunch, Intent.FLAG_ACTIVITY_NEW_TASK);
Notification notification=new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_action_backup)
.setContentTitle(getString(R.string.remote_share_activated))
.setContentIntent(pendingIntent)
.setOngoing(true).build();
startForeground(992000, notification);
}
}