ShadowGeocoder.java revision b22dbaacb93d4360a5b7d9f2f19b7bae5f638861
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
1321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin/**
1421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin * A shadow for Geocoder that supports simulated responses and failures
1521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin */
1606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard@SuppressWarnings({"UnusedDeclaration"})
1706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard@Implements(Geocoder.class)
1806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richardpublic class ShadowGeocoder {
1906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String addressLine1;
2006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String city;
2106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String state;
2206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String zip;
2306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private String countryCode;
2406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private boolean wasCalled;
2506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double lastLatitude;
2606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double lastLongitude;
27b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    private String lastLocationName;
2806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double simulatedLatitude;
2906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private double simulatedLongitude;
3006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private boolean shouldSimulateGeocodeException;
3106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
3206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    @Implementation
3306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public List<Address> getFromLocation(double latitude, double longitude, int maxResults) throws IOException {
3406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        wasCalled = true;
3506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.lastLatitude = latitude;
3606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.lastLongitude = longitude;
3706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        if (shouldSimulateGeocodeException) {
3806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard            throw new IOException("Simulated geocode exception");
3906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        }
4006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        Address address = new Address(Locale.getDefault());
4106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setAddressLine(0, addressLine1);
4206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setLocality(city);
4306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setAdminArea(state);
4406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setPostalCode(zip);
4506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setCountryCode(countryCode);
4606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return oneElementList(address);
4706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
4806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
4906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    @Implementation
5006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public List<Address> getFromLocationName(String locationName, int maxResults) throws IOException {
51b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire        this.lastLocationName = locationName;
5206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        if (shouldSimulateGeocodeException) {
5306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard            throw new IOException("Simulated geocode exception");
5406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        }
5506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        Address address = new Address(Locale.getDefault());
5606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setLatitude(simulatedLatitude);
5706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        address.setLongitude(simulatedLongitude);
5806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return oneElementList(address);
5906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
6006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
6121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
6221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets up a simulated response for {@link #getFromLocation(double, double, int)}
6321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
6440c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param address     the address for the response
6540c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param city        the city for the response
6640c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param state       the state for the response
6740c6251719cccc0a84ae99c976d2836b14374ce6Christian Williams     * @param zip         the zip code for the response
6821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param countryCode the country code for the response
6921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
7006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public void setSimulatedResponse(String address, String city, String state, String zip, String countryCode) {
7106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.addressLine1 = address;
7206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.city = city;
7306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.state = state;
7406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.zip = zip;
7506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.countryCode = countryCode;
7606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
7706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
7821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin
7921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
8021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets up a simulated response for {@link #getFromLocationName(String, int)}}
8121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
8221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param lat latitude for simulated response
8321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param lng longitude for simulated response
8421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
8521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    public void setSimulatedLatLong(double lat, double lng) {
8621b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin        this.simulatedLatitude = lat;
8721b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin        this.simulatedLongitude = lng;
8821b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    }
8921b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin
9021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
9121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Sets a flag to indicate whether or not {@link #getFromLocationName(String, int)} should throw an exception to
9221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * simulate a failure.
9321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
9421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @param shouldSimulateException whether or not an exception should be thrown from {@link #getFromLocationName(String, int)}
9521b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
9606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public void setShouldSimulateGeocodeException(boolean shouldSimulateException) {
9706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        this.shouldSimulateGeocodeException = true;
9806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
9906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
10021b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin    /**
10121b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * Non-Android accessor that indicates whether {@link #getFromLocation(double, double, int)} was called.
10221b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     *
10321b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     * @return whether {@link #getFromLocation(double, double, int)} was called.
10421b1db51a5579d5808a6c1f6393d44adcf3e6ecaPhil Goodwin     */
10506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public boolean wasGetFromLocationCalled() {
10606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return wasCalled;
10706abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
10806abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
10906abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public double getLastLongitude() {
11006abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return lastLongitude;
11106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
11206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
11306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    public double getLastLatitude() {
11406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return lastLatitude;
11506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
11606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard
117b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    public String getLastLocationName() {
118b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire        return lastLocationName;
119b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire    }
120b22dbaacb93d4360a5b7d9f2f19b7bae5f638861pivotal-jiwire
12106abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    private List<Address> oneElementList(Address address) {
12206abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        ArrayList<Address> addresses = new ArrayList<Address>();
12306abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        addresses.add(address);
12406abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard        return addresses;
12506abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard    }
12606abdc35948a13a609c6e6c972d6fa19603b7fe9Joe Moore & Ryan Richard}