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}