package de.jkliemann.parkendd; import android.location.Location; import android.net.Uri; import android.os.Parcel; import android.os.Parcelable; import java.util.Arrays; import java.util.Comparator; /** * Created by jkliemann on 10.12.14. */ public class ParkingSpot implements Parcelable{ private String name; private String category; private String state; private String city; private String id; private String type; private String address; private double lat; private double lon; private int count; private int free; private Boolean forecast; public static enum byNAME implements Comparator<ParkingSpot>{ INSTANCE; @Override public int compare(ParkingSpot p1, ParkingSpot p2){ return p1.name().compareTo(p2.name()); } } public static enum byDISTANCE implements Comparator<ParkingSpot>{ INSTANCE; @Override public int compare(ParkingSpot p1, ParkingSpot p2){ if(p1.location() == null && p2.location() == null){ return 0; }else if(p1.location() == null && p2.location() != null){ return 1; }else if(p2.location() == null && p1.location() != null){ return -1; } Location currentLocation = ((ParkenDD) ParkenDD.applicationContext()).location(); Double d1 = new Double(Util.getDistance(p1.location(), currentLocation)); Double d2 = new Double(Util.getDistance(p2.location(), currentLocation)); return d1.compareTo(d2); } } public static enum byFREE implements Comparator<ParkingSpot>{ INSTANCE; @Override public int compare(ParkingSpot p1, ParkingSpot p2){ if(p1.state().equals("nodata") && p2.state().equals("closed")){ return -1; }else if(p1.state().equals("closed") && p2.state().equals("nodata")){ return 1; } if(p1.state().equals("nodata") && !p2.state().equals("closed") && !p2.state().equals("nodata")){ return 1; } if(p2.state().equals("nodata") && !p1.state().equals("closed") && !p1.state().equals("nodata")){ return -1; } Double b1 = new Double(p1.count() - p1.free()); Double b2 = new Double(p2.count() - p2.free()); return b1.compareTo(b2); } } public static enum byEUKLID implements Comparator<ParkingSpot>{ INSTANCE; @Override public int compare(ParkingSpot p1, ParkingSpot p2){ try{ return p1.rating().compareTo(p2.rating()); }catch (NullPointerException e) { return 0; } } } public ParkingSpot(String name, String state, String city, String id, int count, int free, double lat, double lon, Boolean forecast){ this.name = name; this.state = state; this.city = city; this.id = id; this.count = count; this.free = free; this.lat = lat; this.lon = lon; this.forecast = forecast; this.type = ""; } private Double rating(){ Location currentLocation = ((ParkenDD) ParkenDD.applicationContext()).location(); Double d; try{ d = new Double(Util.getDistance(this.location(), currentLocation)); }catch (NullPointerException e){ e.printStackTrace(); d = Double.MAX_VALUE; } Double b = (1 - ((double) this.free()) / ((double) this.count())); Double e = Math.sqrt(Math.pow(d, 2) + Math.pow(b, 2)) * (1 / (Math.pow(2 * (1 - b), 2) + 1)); //<Parkhaus Mitte> if(this.id().equals("dresdenparkhausmitte") && d < 2000 && b < 0.4){ e = (double)-1; } //</Parkhaus Mitte> if(this.state().equals("closed") || this.free() == 0){ e = Double.POSITIVE_INFINITY; } return e; } public void setCategory(String category){ this.category = category; } public void setState(String state) throws NullPointerException{ this.state = state; } public void setCount(int count) throws NullPointerException{ this.count = count; } public void setFree(int free) throws NullPointerException{ this.free = free; } public void setType(String type){ this.type = type; } public void setAddress(String address){ this.address = address; } public String name(){ return name; } public String category(){ return category; } public String state(){ return state; } public String id(){ return id; } public String type(){ return type; } public String address(){ return address; } public int count(){ return count; } public int free(){ return free; } public Uri geoUri(){ String location; if(lat != 0 && lon != 0){ location = "geo:0,0?q="+Double.toString(lat)+","+Double.toString(lon); }else{ location = "geo:0,0?q="+city+" " + name; } return Uri.parse(location); } public Location location(){ if(lat != 0 && lon != 0) { Location location = new Location("gps"); location.setLatitude(lat); location.setLongitude(lon); return location; }else{ return null; } } public Boolean forecast(){ return forecast; } static public ParkingSpot[] getSortedArray(ParkingSpot[] slotList, Comparator<ParkingSpot> comparator){ ParkingSpot[] sorted = slotList.clone(); Arrays.sort(sorted, comparator); return sorted; } //parcelable implementation public int describeContents(){ return 0; } public void writeToParcel(Parcel out, int flags){ out.writeString(name); out.writeString(category); out.writeString(state); out.writeString(city); out.writeString(id); out.writeString(type); out.writeString(address); out.writeDouble(lat); out.writeDouble(lon); out.writeInt(count); out.writeInt(free); out.writeByte((byte) (forecast ? 1:0)); } public static final Parcelable.Creator<ParkingSpot> CREATOR = new Parcelable.Creator<ParkingSpot>() { public ParkingSpot createFromParcel(Parcel in) { return new ParkingSpot(in); } public ParkingSpot[] newArray(int size) { return new ParkingSpot[size]; } }; private ParkingSpot(Parcel in){ name = in.readString(); category = in.readString(); state = in.readString(); city = in.readString(); id = in.readString(); type = in.readString(); address = in.readString(); lat = in.readDouble(); lon = in.readDouble(); count = in.readInt(); free = in.readInt(); forecast = in.readByte() != 0; } }