package mediabrowser.apiinteraction.android;
import mediabrowser.apiinteraction.EmptyResponse;
import mediabrowser.apiinteraction.network.INetworkConnection;
import mediabrowser.model.apiclient.NetworkStatus;
import mediabrowser.model.logging.ILogger;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import java.net.*;
public class AndroidNetworkConnection implements INetworkConnection {
private Context context;
private ILogger logger;
public AndroidNetworkConnection(Context context, ILogger logger) {
this.context = context;
this.logger = logger;
}
@Override
public void SendWakeOnLan(String macAddress, int port, EmptyResponse response)
{
logger.Debug("Sending WakeOnLan over broadcast address. Mac: %s, Port: %d", macAddress, port);
try {
byte[] macBytes = getMacBytes(macAddress);
byte[] bytes = new byte[6 + 16 * macBytes.length];
for (int i = 0; i < 6; i++) {
bytes[i] = (byte) 0xff;
}
for (int i = 6; i < bytes.length; i += macBytes.length) {
System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
}
DatagramPacket packet = new DatagramPacket(bytes, bytes.length);
DatagramSocket socket = new DatagramSocket(port);
socket.setBroadcast(true);
socket.send(packet);
socket.close();
response.onResponse();
}
catch (Exception ex){
response.onError(ex);
}
}
@Override
public void SendWakeOnLan(String macAddress, String ipAddress, int port, EmptyResponse response)
{
logger.Debug("Sending WakeOnLan to %s. Mac: %s, Port: %d", ipAddress, macAddress, port);
try {
byte[] macBytes = getMacBytes(macAddress);
byte[] bytes = new byte[6 + 16 * macBytes.length];
for (int i = 0; i < 6; i++) {
bytes[i] = (byte) 0xff;
}
for (int i = 6; i < bytes.length; i += macBytes.length) {
System.arraycopy(macBytes, 0, bytes, i, macBytes.length);
}
InetAddress address = InetAddress.getByName(ipAddress);
DatagramPacket packet = new DatagramPacket(bytes, bytes.length, address, port);
DatagramSocket socket = new DatagramSocket();
socket.send(packet);
socket.close();
response.onResponse();
}
catch (Exception ex){
response.onError(ex);
}
}
@Override
public NetworkStatus getNetworkStatus() {
NetworkStatus status = new NetworkStatus();
logger.Debug("Testing local device network connection");
final ConnectivityManager conMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
final NetworkInfo activeNetwork = conMgr.getActiveNetworkInfo();
if (activeNetwork != null && activeNetwork.isConnected()) {
status.setIsNetworkAvailable(true);
logger.Debug("Android device is connected to a network");
} else {
logger.Debug("Local device is not connected to a network");
// notify user you are not online
status.setIsNetworkAvailable(false);
}
// Can't determine
status.setIsLocalNetworkAvailable(null);
//NetworkInfo network = conMgr.getNetworkInfo(ConnectivityManager.TYPE_ETHERNET);
//status.setIsEthernetNetworkAvailable(network != null && network.isConnected());
//network = conMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
//status.setIsWifiNetworkAvailable(network != null && network.isConnected());
return status;
}
private static byte[] getMacBytes(String macStr) throws IllegalArgumentException {
byte[] bytes = new byte[6];
String[] hex = macStr.split("(\\:|\\-)");
if (hex.length != 6) {
throw new IllegalArgumentException("Invalid MAC address.");
}
try {
for (int i = 0; i < 6; i++) {
bytes[i] = (byte) Integer.parseInt(hex[i], 16);
}
}
catch (NumberFormatException e) {
throw new IllegalArgumentException("Invalid hex digit in MAC address.");
}
return bytes;
}
}