ShadowGeocoder.java revision 00acfbd3521893738d94b6f7726128ea32ab5c4f
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;
3606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
3706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    @Implementation
3806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public List<Address> getFromLocation(double latitude, double longitude, int maxResults) throws IOException {
3906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        wasCalled = true;
4006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.lastLatitude = latitude;
4106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.lastLongitude = longitude;
4206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        if (shouldSimulateGeocodeException) {
4306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard            throw new IOException("Simulated geocode exception");
4406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        }
4500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        Address address = makeAddress();
4606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setAddressLine(0, addressLine1);
4706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setLocality(city);
4806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setAdminArea(state);
4906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setPostalCode(zip);
5006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setCountryCode(countryCode);
5106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return oneElementList(address);
5206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
5306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
5406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    @Implementation
5506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public List<Address> getFromLocationName(String locationName, int maxResults) throws IOException {
56b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire        this.lastLocationName = locationName;
5706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        if (shouldSimulateGeocodeException) {
5806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard            throw new IOException("Simulated geocode exception");
5906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        }
6000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        if (returnNoResults) {
6100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            return new ArrayList<Address>();
6200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        } else {
6300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            Address address = makeAddress();
6400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            address.setLatitude(simulatedLatitude);
6500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            address.setLongitude(simulatedLongitude);
6600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal            return oneElementList(address);
6700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        }
6800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    }
6900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
7000acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    private Address makeAddress() {
7106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        Address address = new Address(Locale.getDefault());
7200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        shadowOf(address).setSimulatedHasLatLong(hasLatitude, hasLongitude);
7300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        return address;
7406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
7506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
7621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
7721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets up a simulated response for {@link #getFromLocation(double, double, int)}
7821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
7940c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param address     the address for the response
8040c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param city        the city for the response
8140c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param state       the state for the response
8240c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param zip         the zip code for the response
8321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param countryCode the country code for the response
8421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
8506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public void setSimulatedResponse(String address, String city, String state, String zip, String countryCode) {
8606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.addressLine1 = address;
8706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.city = city;
8806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.state = state;
8906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.zip = zip;
9006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.countryCode = countryCode;
9106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
9206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
9321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin
9421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
9521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets up a simulated response for {@link #getFromLocationName(String, int)}}
9621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
9721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param lat latitude for simulated response
9821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param lng longitude for simulated response
9921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
10021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    public void setSimulatedLatLong(double lat, double lng) {
10121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin        this.simulatedLatitude = lat;
10221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin        this.simulatedLongitude = lng;
10321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    }
10421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin
10521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
10621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets a flag to indicate whether or not {@link #getFromLocationName(String, int)} should throw an exception to
10721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * simulate a failure.
10821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
10921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param shouldSimulateException whether or not an exception should be thrown from {@link #getFromLocationName(String, int)}
11021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
11106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public void setShouldSimulateGeocodeException(boolean shouldSimulateException) {
11206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.shouldSimulateGeocodeException = true;
11306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
11406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
11521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
11621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Non-Android accessor that indicates whether {@link #getFromLocation(double, double, int)} was called.
11721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
11821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @return whether {@link #getFromLocation(double, double, int)} was called.
11921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
12006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public boolean wasGetFromLocationCalled() {
12106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return wasCalled;
12206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
12306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
12406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public double getLastLongitude() {
12506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return lastLongitude;
12606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
12706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
12806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public double getLastLatitude() {
12906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return lastLatitude;
13006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
13106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
132b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    public String getLastLocationName() {
133b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire        return lastLocationName;
134b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    }
135b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire
13606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private List<Address> oneElementList(Address address) {
13706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        ArrayList<Address> addresses = new ArrayList<Address>();
13806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        addresses.add(address);
13906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return addresses;
14006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
14100acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
14200acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    public void setSimulatedHasLatLong(boolean hasLatitude, boolean hasLongitude) {
14300acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        this.hasLatitude = hasLatitude;
14400acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        this.hasLongitude = hasLongitude;
14500acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    }
14600acfbd3521893738d94b6f7726128ea32ab5c4fpivotal
14700acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    public void setReturnNoResults(boolean returnNoResults) {
14800acfbd3521893738d94b6f7726128ea32ab5c4fpivotal        this.returnNoResults = returnNoResults;
14900acfbd3521893738d94b6f7726128ea32ab5c4fpivotal    }
15006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard}