1package com.xtremelabs.robolectric.shadows;
2
3import com.google.android.maps.GeoPoint;
4import com.google.android.maps.MapController;
5import com.xtremelabs.robolectric.internal.Implementation;
6import com.xtremelabs.robolectric.internal.Implements;
7
8/**
9 * A Shadow of {@code MapController} that tracks its own state and keeps the state of the {@code MapView} it controlls
10 * up to date.
11 */
12@SuppressWarnings({"UnusedDeclaration"})
13@Implements(MapController.class)
14public class ShadowMapController {
15    private ShadowMapView shadowMapView;
16    private GeoPoint geoPointAnimatedTo;
17
18    @Implementation
19    public void animateTo(com.google.android.maps.GeoPoint geoPoint) {
20        setCenter(geoPoint);
21        geoPointAnimatedTo = geoPoint;
22    }
23
24    @Implementation
25    public void animateTo(com.google.android.maps.GeoPoint geoPoint, java.lang.Runnable runnable) {
26        animateTo(geoPoint);
27        runnable.run();
28    }
29
30    @Implementation
31    public void setCenter(com.google.android.maps.GeoPoint geoPoint) {
32        shadowMapView.mapCenter = geoPoint;
33    }
34
35    @Implementation
36    public void zoomToSpan(int latSpan, int lngSpan) {
37        shadowMapView.latitudeSpan = latSpan;
38        shadowMapView.longitudeSpan = lngSpan;
39    }
40
41    @Implementation
42    public boolean zoomIn() {
43        shadowMapView.zoomLevel++;
44        return true;
45    }
46
47    @Implementation
48    public boolean zoomOut() {
49        shadowMapView.zoomLevel--;
50        return true;
51    }
52
53    @Implementation
54    public int setZoom(int i) {
55        shadowMapView.zoomLevel = i;
56        return i;
57    }
58
59    /**
60     * Non-Android accessor that returns the {@code MapView} that is being controlled
61     *
62     * @return the {@code MapView} that is being controlled
63     */
64    public ShadowMapView getShadowMapView() {
65        return shadowMapView;
66    }
67
68    /**
69     * Non-Android accessor that returns the most recent value set by a call to either version of {@code animateTo()}
70     *
71     * @return the most recent value set by a call to either version of {@code animateTo()}
72     */
73    public GeoPoint getGeoPointAnimatedTo() {
74        return geoPointAnimatedTo;
75    }
76
77    /**
78     * Non-Android accessor that allows the {@code MapView} being controlled to be set explicitly.
79     *
80     * @param shadowMapView the {@link ShadowMapView} to be controlled (either created explicitly or obtained via a call
81     *                      to {@link com.xtremelabs.robolectric.RobolectricForMaps.shadowOf(com.google.android.maps.MapView)})
82     */
83    void setShadowMapView(ShadowMapView shadowMapView) {
84        this.shadowMapView = shadowMapView;
85    }
86}
87