106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardpackage com.xtremelabs.robolectric.shadows;
206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport android.location.Address;
406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport android.location.Geocoder;
522c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implementation;
622c22c9aa4ca68c2deac6164edc1d82bc9645310Christian Williams & Phil Goodwinimport com.xtremelabs.robolectric.internal.Implements;
706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.io.IOException;
906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.util.ArrayList;
1006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.util.List;
1106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardimport java.util.Locale;
1206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
1300acfbd3521893738d94b6f7726128ea32ab5c4fpivotalimport static com.xtremelabs.robolectric.Robolectric.shadowOf;
1400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
1521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin/**
1621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * A shadow for Geocoder that supports simulated responses and failures
1721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */
1806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard@SuppressWarnings({"UnusedDeclaration"})
1906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard@Implements(Geocoder.class)
2006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardpublic class ShadowGeocoder {
2106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String addressLine1;
2206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String city;
2306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String state;
2406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String zip;
2506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String countryCode;
2606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private boolean wasCalled;
2706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double lastLatitude;
2806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double lastLongitude;
29b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    private String lastLocationName;
3006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double simulatedLatitude;
3106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double simulatedLongitude;
3206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private boolean shouldSimulateGeocodeException;
3300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    private boolean hasLatitude;
3400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    private boolean hasLongitude;
3500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    private boolean returnNoResults = false;
36a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala    private boolean didResolution;
3706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
3806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    @Implementation
3906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public List<Address> getFromLocation(double latitude, double longitude, int maxResults) throws IOException {
4006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        wasCalled = true;
4106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.lastLatitude = latitude;
4206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.lastLongitude = longitude;
4306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        if (shouldSimulateGeocodeException) {
4406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard            throw new IOException("Simulated geocode exception");
4506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        }
4600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        Address address = makeAddress();
4706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setAddressLine(0, addressLine1);
4806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setLocality(city);
4906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setAdminArea(state);
5006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setPostalCode(zip);
5106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setCountryCode(countryCode);
5206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return oneElementList(address);
5306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
5406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
5506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    @Implementation
5606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public List<Address> getFromLocationName(String locationName, int maxResults) throws IOException {
57a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala        didResolution = true;
58b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire        this.lastLocationName = locationName;
5906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        if (shouldSimulateGeocodeException) {
6006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard            throw new IOException("Simulated geocode exception");
6106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        }
6200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        if (returnNoResults) {
6300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            return new ArrayList<Address>();
6400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        } else {
6500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            Address address = makeAddress();
6600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            address.setLatitude(simulatedLatitude);
6700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            address.setLongitude(simulatedLongitude);
6800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            return oneElementList(address);
6900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        }
7000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    }
7100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
7200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    private Address makeAddress() {
7306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        Address address = new Address(Locale.getDefault());
7400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        shadowOf(address).setSimulatedHasLatLong(hasLatitude, hasLongitude);
7500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        return address;
7606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
7706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
7821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
7921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets up a simulated response for {@link #getFromLocation(double, double, int)}
8021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
8140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param address     the address for the response
8240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param city        the city for the response
8340c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param state       the state for the response
8440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param zip         the zip code for the response
8521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param countryCode the country code for the response
8621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
8706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public void setSimulatedResponse(String address, String city, String state, String zip, String countryCode) {
8806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.addressLine1 = address;
8906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.city = city;
9006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.state = state;
9106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.zip = zip;
9206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.countryCode = countryCode;
9306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
9406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
9521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin
9621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
9721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets up a simulated response for {@link #getFromLocationName(String, int)}}
9821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
9921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param lat latitude for simulated response
10021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param lng longitude for simulated response
10121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
10221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    public void setSimulatedLatLong(double lat, double lng) {
10321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin        this.simulatedLatitude = lat;
10421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin        this.simulatedLongitude = lng;
10521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    }
10621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin
10721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
10821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets a flag to indicate whether or not {@link #getFromLocationName(String, int)} should throw an exception to
10921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * simulate a failure.
11021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
11121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param shouldSimulateException whether or not an exception should be thrown from {@link #getFromLocationName(String, int)}
11221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
11306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public void setShouldSimulateGeocodeException(boolean shouldSimulateException) {
11406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.shouldSimulateGeocodeException = true;
11506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
11606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
11721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
11821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Non-Android accessor that indicates whether {@link #getFromLocation(double, double, int)} was called.
11921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
12021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @return whether {@link #getFromLocation(double, double, int)} was called.
12121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
12206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public boolean wasGetFromLocationCalled() {
12306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return wasCalled;
12406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
12506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
12606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public double getLastLongitude() {
12706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return lastLongitude;
12806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
12906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
13006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public double getLastLatitude() {
13106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return lastLatitude;
13206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
13306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
134b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    public String getLastLocationName() {
135b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire        return lastLocationName;
136b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    }
137b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire
13806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private List<Address> oneElementList(Address address) {
13906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        ArrayList<Address> addresses = new ArrayList<Address>();
14006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        addresses.add(address);
14106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return addresses;
14206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
14300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
14400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    public void setSimulatedHasLatLong(boolean hasLatitude, boolean hasLongitude) {
14500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        this.hasLatitude = hasLatitude;
14600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        this.hasLongitude = hasLongitude;
14700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    }
14800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
14900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    public void setReturnNoResults(boolean returnNoResults) {
15000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        this.returnNoResults = returnNoResults;
15100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    }
152a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala
153a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala    public boolean didResolution() {
154a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala        return didResolution;
155a302d91d236c969bb55d2e492db049b4456b807fAndrew Dai & Rick Kawala    }
15606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard}