package net.screenfreeze.deskcon;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import android.annotation.SuppressLint;
import android.app.AlarmManager;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.MulticastLock;
import android.os.IBinder;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.util.Log;
public class DiscoveryService extends Service {
private static SharedPreferences sharedPrefs;
private static int PORT;
private static ResponseServer responseserver;
@Override
public IBinder onBind(Intent intent) {
return null;
}
@SuppressLint("ShowToast")
@Override
public void onCreate() {
sharedPrefs = PreferenceManager.getDefaultSharedPreferences(this);
PORT = Integer.parseInt(sharedPrefs.getString("control_port", "9096"));
super.onCreate();
}
@Override
public void onDestroy() {
Log.d("Control: ", "stop Server");
//controlserver.cancel(true);
responseserver.stopServer();
super.onDestroy();
}
// workaround: sys stops task when UI closes
@SuppressLint("NewApi")
@Override
public void onTaskRemoved(Intent rootIntent){
Intent restartServiceIntent = new Intent(getApplicationContext(), this.getClass());
restartServiceIntent.setPackage(getPackageName());
PendingIntent restartServicePendingIntent = PendingIntent.getService(getApplicationContext(), 1, restartServiceIntent, PendingIntent.FLAG_ONE_SHOT);
AlarmManager alarmService = (AlarmManager) getApplicationContext().getSystemService(Context.ALARM_SERVICE);
alarmService.set(
AlarmManager.ELAPSED_REALTIME,
SystemClock.elapsedRealtime() + 1000,
restartServicePendingIntent);
super.onTaskRemoved(rootIntent);
}
@SuppressLint("NewApi")
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
responseserver = new ResponseServer();
Thread rs = new Thread(responseserver);
rs.start();
return START_STICKY;
}
private class ResponseServer implements Runnable {
private DatagramSocket serverSocketUDP;
private boolean isStopped = false;
@Override
public void run() {
Log.d("Discovery: ", "start UDP Server");
try {
serverSocketUDP = new DatagramSocket(5108);
} catch (Exception e) {
e.printStackTrace();
Log.d("Dsicovery: ", "could not start");
return;
}
WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
MulticastLock lock = wifi.createMulticastLock("net.screenfreeze.deskcon");
lock.acquire();
//begin serving
while (!isStopped) {
byte[] receiveData = new byte[128];
DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
try {
serverSocketUDP.receive(receivePacket);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
InetAddress address = receivePacket.getAddress();
String msg = new String(receiveData, 0, receivePacket.getLength());
Log.d("udp from: ", "msg "+msg+" "+address);
handleReceiveUdp(msg);
}
lock.release();
}
// force server stop
private void stopServer() {
isStopped = true;
serverSocketUDP.close();
}
}
private void handleReceiveUdp(String msg) {
String[] split = msg.split("::");
String code = split[0];
String info = split[1];
// Start the Update Service
if (code.equals("startupdateservice01")) {
Intent statusUpdateServiceIntent = new Intent(this, StatusUpdateService.class);
startService(statusUpdateServiceIntent);
}
}
}