// Path: app/src/main/java/com/xargsgrep/portknocker/model/Host.java
// public class Host
// {
//     public static final int DEFAULT_DELAY = 1000;
//     public static final int DEFAULT_TCP_CONNECT_TIMEOUT = 100;
// 
//     private long id;
//     private String label;
//     private String hostname;
//     private int delay = DEFAULT_DELAY;
//     private int tcpConnectTimeout = DEFAULT_TCP_CONNECT_TIMEOUT;
//     private String launchIntentPackage;
//     private List<Port> ports = new ArrayList<>();
// 
//     @JsonIgnore
//     public long getId()
//     {
//         return id;
//     }
// 
//     public void setId(long id)
//     {
//         this.id = id;
//     }
// 
//     public String getLabel()
//     {
//         return label;
//     }
// 
//     public void setLabel(String label)
//     {
//         this.label = label;
//     }
// 
//     public String getHostname()
//     {
//         return hostname;
//     }
// 
//     public void setHostname(String hostname)
//     {
//         this.hostname = hostname;
//     }
// 
//     public int getDelay()
//     {
//         return delay;
//     }
// 
//     public void setDelay(int delay)
//     {
//         this.delay = delay;
//     }
// 
//     public String getLaunchIntentPackage()
//     {
//         return launchIntentPackage;
//     }
// 
//     public int getTcpConnectTimeout()
//     {
//         return tcpConnectTimeout;
//     }
// 
//     public void setTcpConnectTimeout(int tcpConnectTimeout)
//     {
//         this.tcpConnectTimeout = tcpConnectTimeout;
//     }
// 
//     public void setLaunchIntentPackage(String launchIntentPackage)
//     {
//         this.launchIntentPackage = launchIntentPackage;
//     }
// 
//     public List<Port> getPorts()
//     {
//         return ports;
//     }
// 
//     public void setPorts(List<Port> ports)
//     {
//         this.ports = ports;
//     }
// 
//     @JsonIgnore
//     public String getPortsString()
//     {
//         StringBuilder portsString = new StringBuilder();
// 
//         if (ports.size() > 0)
//         {
//             for (Port port : ports)
//             {
//                 portsString.append(port.getPort());
//                 portsString.append(":");
//                 portsString.append(port.getProtocol());
//                 portsString.append(", ");
//             }
//             portsString.replace(portsString.length() - 2, portsString.length(), "");
//         }
// 
//         return portsString.toString();
//     }
// }


import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.xargsgrep.portknocker.model.Host;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.List;

        File file = new File(storageDir, fileName);
        FileWriter fileWriter = new FileWriter(file);

        mapper.writeValue(fileWriter, hosts);

        return file.getAbsolutePath();
    }

    @NonNull
    public static File createPortKnockerFolderIfNotExists() {
        File storageDir = new File(Environment.getExternalStorageDirectory(), "PortKnocker");
        if (!storageDir.exists())
        {
            storageDir.mkdirs();
        }
        return storageDir;
    }

    public static List<Host> deserializeHosts(Context context, Uri fileUri) throws Exception
    {
        if (!isExternalStorageAccessible())
        {
            throw new Exception("External storage is not currently accessible");
        }

        ObjectMapper objectMapper = new ObjectMapper();
        ContentResolver resolver = context.getContentResolver();
        InputStream input = resolver.openInputStream(fileUri);

// Path: app/src/main/java/com/xargsgrep/portknocker/model/Host.java
// public class Host
// {
//     public static final int DEFAULT_DELAY = 1000;
//     public static final int DEFAULT_TCP_CONNECT_TIMEOUT = 100;
// 
//     private long id;
//     private String label;
//     private String hostname;
//     private int delay = DEFAULT_DELAY;
//     private int tcpConnectTimeout = DEFAULT_TCP_CONNECT_TIMEOUT;
//     private String launchIntentPackage;
//     private List<Port> ports = new ArrayList<>();
// 
//     @JsonIgnore
//     public long getId()
//     {
//         return id;
//     }
// 
//     public void setId(long id)
//     {
//         this.id = id;
//     }
// 
//     public String getLabel()
//     {
//         return label;
//     }
// 
//     public void setLabel(String label)
//     {
//         this.label = label;
//     }
// 
//     public String getHostname()
//     {
//         return hostname;
//     }
// 
//     public void setHostname(String hostname)
//     {
//         this.hostname = hostname;
//     }
// 
//     public int getDelay()
//     {
//         return delay;
//     }
// 
//     public void setDelay(int delay)
//     {
//         this.delay = delay;
//     }
// 
//     public String getLaunchIntentPackage()
//     {
//         return launchIntentPackage;
//     }
// 
//     public int getTcpConnectTimeout()
//     {
//         return tcpConnectTimeout;
//     }
// 
//     public void setTcpConnectTimeout(int tcpConnectTimeout)
//     {
//         this.tcpConnectTimeout = tcpConnectTimeout;
//     }
// 
//     public void setLaunchIntentPackage(String launchIntentPackage)
//     {
//         this.launchIntentPackage = launchIntentPackage;
//     }
// 
//     public List<Port> getPorts()
//     {
//         return ports;
//     }
// 
//     public void setPorts(List<Port> ports)
//     {
//         this.ports = ports;
//     }
// 
//     @JsonIgnore
//     public String getPortsString()
//     {
//         StringBuilder portsString = new StringBuilder();
// 
//         if (ports.size() > 0)
//         {
//             for (Port port : ports)
//             {
//                 portsString.append(port.getPort());
//                 portsString.append(":");
//                 portsString.append(port.getProtocol());
//                 portsString.append(", ");
//             }
//             portsString.replace(portsString.length() - 2, portsString.length(), "");
//         }
// 
//         return portsString.toString();
//     }
// }


// Path: app/src/main/java/com/xargsgrep/portknocker/utils/SerializationUtils.java
import android.content.ContentResolver;
import android.content.Context;
import android.net.Uri;
import android.os.Environment;
import android.support.annotation.NonNull;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.xargsgrep.portknocker.model.Host;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStream;
import java.util.List;


        File file = new File(storageDir, fileName);
        FileWriter fileWriter = new FileWriter(file);

        mapper.writeValue(fileWriter, hosts);

        return file.getAbsolutePath();
    }

    @NonNull
    public static File createPortKnockerFolderIfNotExists() {
        File storageDir = new File(Environment.getExternalStorageDirectory(), "PortKnocker");
        if (!storageDir.exists())
        {
            storageDir.mkdirs();
        }
        return storageDir;
    }

    public static List<Host> deserializeHosts(Context context, Uri fileUri) throws Exception
    {
        if (!isExternalStorageAccessible())
        {
            throw new Exception("External storage is not currently accessible");
        }

        ObjectMapper objectMapper = new ObjectMapper();
        ContentResolver resolver = context.getContentResolver();
        InputStream input = resolver.openInputStream(fileUri);

        return objectMapper.readValue(input, new TypeReference<List<Host>>() {});