diff options
Diffstat (limited to 'main')
9 files changed, 110 insertions, 41 deletions
diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java index e46516f..a9a3f94 100644 --- a/main/src/cgeo/geocaching/Settings.java +++ b/main/src/cgeo/geocaching/Settings.java @@ -431,12 +431,7 @@ public final class Settings { } public static boolean isValidMapFile() { - return checkMapfile(getMapFile()); - } - - private static boolean checkMapfile(final String mapFileIn) { - - return MapsforgeMapProvider.isValidMapFile(mapFileIn); + return isValidMapFile(getMapFile()); } public static boolean isValidMapFile(final String mapFileIn) { diff --git a/main/src/cgeo/geocaching/cgeoinit.java b/main/src/cgeo/geocaching/cgeoinit.java index a5f1641..aec2f8e 100644 --- a/main/src/cgeo/geocaching/cgeoinit.java +++ b/main/src/cgeo/geocaching/cgeoinit.java @@ -8,6 +8,7 @@ import cgeo.geocaching.connector.gc.Login; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.enumerations.StatusCode; import cgeo.geocaching.maps.MapProviderFactory; +import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.network.Cookies; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; @@ -46,6 +47,7 @@ import android.widget.Spinner; import android.widget.TextView; import java.io.File; +import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -551,9 +553,12 @@ public class cgeoinit extends AbstractActivity { webAuth.setOnClickListener(new webAuth()); // Map source settings - Collection<String> mapSourceValues = MapProviderFactory.getMapSources().values(); + Collection<String> mapSourceNames = new ArrayList<String>(); + for (MapSource mapSource : MapProviderFactory.getMapSources().values()) { + mapSourceNames.add(mapSource.getName()); + } Spinner mapSourceSelector = (Spinner) findViewById(R.id.mapsource); - ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, mapSourceValues.toArray(new String[mapSourceValues.size()])); + ArrayAdapter<CharSequence> adapter = new ArrayAdapter<CharSequence>(this, android.R.layout.simple_spinner_item, mapSourceNames.toArray(new String[mapSourceNames.size()])); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); mapSourceSelector.setAdapter(adapter); int mapsource = Settings.getMapSource(); diff --git a/main/src/cgeo/geocaching/maps/AbstractMapSource.java b/main/src/cgeo/geocaching/maps/AbstractMapSource.java new file mode 100644 index 0000000..3966b60 --- /dev/null +++ b/main/src/cgeo/geocaching/maps/AbstractMapSource.java @@ -0,0 +1,32 @@ +package cgeo.geocaching.maps; + +import cgeo.geocaching.maps.interfaces.MapProvider; +import cgeo.geocaching.maps.interfaces.MapSource; + +public class AbstractMapSource implements MapSource { + + private final String name; + private MapProvider mapProvider; + + public AbstractMapSource(MapProvider mapProvider, final String name) { + this.mapProvider = mapProvider; + this.name = name; + } + + @Override + public String getName() { + return name; + } + + @Override + public boolean isAvailable() { + return true; + } + + @Override + public String toString() { + // needed for adapter in selection lists + return getName(); + } + +} diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 4414277..99af3e1 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -32,6 +32,7 @@ import cgeo.geocaching.maps.interfaces.MapActivityImpl; import cgeo.geocaching.maps.interfaces.MapControllerImpl; import cgeo.geocaching.maps.interfaces.MapItemFactory; import cgeo.geocaching.maps.interfaces.MapProvider; +import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.maps.interfaces.MapViewImpl; import cgeo.geocaching.maps.interfaces.OnMapDragListener; import cgeo.geocaching.maps.interfaces.OtherCachersOverlayItemImpl; @@ -558,6 +559,15 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); + for (Integer mapSourceId : MapProviderFactory.getMapSources().keySet()) { + final MenuItem menuItem = menu.findItem(mapSourceId); + if (menuItem != null) { + final MapSource mapSource = MapProviderFactory.getMapSources().get(mapSourceId); + if (mapSource != null) { + menuItem.setEnabled(mapSource.isAvailable()); + } + } + } MenuItem item; try { @@ -720,9 +730,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto return true; } default: - if (MapProviderFactory.isValidSourceId(MapProviderFactory.getMapSourceFromMenuId(id))) { + int mapSource = MapProviderFactory.getMapSourceFromMenuId(id); + if (MapProviderFactory.isValidSourceId(mapSource)) { item.setChecked(true); - int mapSource = MapProviderFactory.getMapSourceFromMenuId(id); changeMapSource(mapSource); diff --git a/main/src/cgeo/geocaching/maps/MapProviderFactory.java b/main/src/cgeo/geocaching/maps/MapProviderFactory.java index 10ca12a..3f10fb3 100644 --- a/main/src/cgeo/geocaching/maps/MapProviderFactory.java +++ b/main/src/cgeo/geocaching/maps/MapProviderFactory.java @@ -2,6 +2,7 @@ package cgeo.geocaching.maps; import cgeo.geocaching.maps.google.GoogleMapProvider; import cgeo.geocaching.maps.interfaces.MapProvider; +import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.maps.mapsforge.MapsforgeMapProvider; import android.view.Menu; @@ -17,29 +18,33 @@ public class MapProviderFactory { private static MapProviderFactory instance = null; private final MapProvider[] mapProviders; - private SortedMap<Integer, String> mapSources; + private SortedMap<Integer, MapSource> mapSources; private MapProviderFactory() { // add GoogleMapProvider only if google api is available in order to support x86 android emulator - boolean googleMaps = true; - try { - Class.forName("com.google.android.maps.MapActivity"); - } catch (ClassNotFoundException e) { - googleMaps = false; - } - if (googleMaps) { + if (isGoogleMapsInstalled()) { mapProviders = new MapProvider[] { new GoogleMapProvider(GOOGLEMAP_BASEID), new MapsforgeMapProvider(MFMAP_BASEID) }; } else { mapProviders = new MapProvider[] { new MapsforgeMapProvider(MFMAP_BASEID) }; } - mapSources = new TreeMap<Integer, String>(); + mapSources = new TreeMap<Integer, MapSource>(); for (MapProvider mp : mapProviders) { mapSources.putAll(mp.getMapSources()); } } + private static boolean isGoogleMapsInstalled() { + boolean googleMaps = true; + try { + Class.forName("com.google.android.maps.MapActivity"); + } catch (ClassNotFoundException e) { + googleMaps = false; + } + return googleMaps; + } + private static synchronized void initInstance() { if (null == instance) { instance = new MapProviderFactory(); @@ -53,7 +58,7 @@ public class MapProviderFactory { return instance; } - public static SortedMap<Integer, String> getMapSources() { + public static SortedMap<Integer, MapSource> getMapSources() { return getInstance().mapSources; } @@ -102,10 +107,10 @@ public class MapProviderFactory { } public static void addMapviewMenuItems(Menu parentMenu, int groupId, int currentSource) { - SortedMap<Integer, String> mapSources = getInstance().mapSources; + SortedMap<Integer, MapSource> mapSources = getInstance().mapSources; for (int key : mapSources.keySet()) { - parentMenu.add(groupId, key, 0, mapSources.get(key)).setCheckable(true).setChecked(key == currentSource); + parentMenu.add(groupId, key, 0, mapSources.get(key).getName()).setCheckable(true).setChecked(key == currentSource); } } diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java b/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java index 1cccbe3..2253730 100644 --- a/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java +++ b/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java @@ -2,9 +2,11 @@ package cgeo.geocaching.maps.google; import cgeo.geocaching.R; import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.maps.AbstractMapSource; import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.maps.interfaces.MapItemFactory; import cgeo.geocaching.maps.interfaces.MapProvider; +import cgeo.geocaching.maps.interfaces.MapSource; import com.google.android.maps.MapActivity; @@ -15,10 +17,10 @@ import java.util.Map; public class GoogleMapProvider implements MapProvider { - public final static int MAP = 1; - public final static int SATELLITE = 2; + private final static int MAP = 1; + private final static int SATELLITE = 2; - private final Map<Integer, String> mapSources; + private final Map<Integer, MapSource> mapSources; private int baseId; private final MapItemFactory mapItemFactory; @@ -27,16 +29,15 @@ public class GoogleMapProvider implements MapProvider { baseId = _baseId; final Resources resources = cgeoapplication.getInstance().getResources(); - mapSources = new HashMap<Integer, String>(); - mapSources.put(baseId + MAP, resources.getString(R.string.map_source_google_map)); - mapSources.put(baseId + SATELLITE, resources.getString(R.string.map_source_google_satellite)); + mapSources = new HashMap<Integer, MapSource>(); + mapSources.put(baseId + MAP, new AbstractMapSource(this, resources.getString(R.string.map_source_google_map))); + mapSources.put(baseId + SATELLITE, new AbstractMapSource(this, resources.getString(R.string.map_source_google_satellite))); mapItemFactory = new GoogleMapItemFactory(); } @Override - public Map<Integer, String> getMapSources() { - + public Map<Integer, MapSource> getMapSources() { return mapSources; } diff --git a/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java b/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java index 626a410..ba80512 100644 --- a/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java +++ b/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java @@ -13,7 +13,7 @@ import java.util.Map; */ public interface MapProvider { - public Map<Integer, String> getMapSources(); + public Map<Integer, MapSource> getMapSources(); public boolean isMySource(int sourceId); diff --git a/main/src/cgeo/geocaching/maps/interfaces/MapSource.java b/main/src/cgeo/geocaching/maps/interfaces/MapSource.java new file mode 100644 index 0000000..4e8c96e --- /dev/null +++ b/main/src/cgeo/geocaching/maps/interfaces/MapSource.java @@ -0,0 +1,7 @@ +package cgeo.geocaching.maps.interfaces; + +public interface MapSource { + public String getName(); + + public boolean isAvailable(); +} diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java index 026dd50..fcb526a 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java @@ -3,9 +3,11 @@ package cgeo.geocaching.maps.mapsforge; import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.cgeoapplication; +import cgeo.geocaching.maps.AbstractMapSource; import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.maps.interfaces.MapItemFactory; import cgeo.geocaching.maps.interfaces.MapProvider; +import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.maps.mapsforge.v024.MapsforgeMapActivity024; import cgeo.geocaching.maps.mapsforge.v024.MapsforgeMapItemFactory024; @@ -22,11 +24,11 @@ import java.util.Map; public class MapsforgeMapProvider implements MapProvider { - public final static int MAPNIK = 1; - public final static int CYCLEMAP = 3; - public final static int OFFLINE = 4; + private final static int MAPNIK = 1; + final static int CYCLEMAP = 3; + final static int OFFLINE = 4; - private final Map<Integer, String> mapSources; + private final Map<Integer, MapSource> mapSources; private final int baseId; private boolean oldMap = false; @@ -36,15 +38,14 @@ public class MapsforgeMapProvider implements MapProvider { baseId = _baseId; final Resources resources = cgeoapplication.getInstance().getResources(); - mapSources = new HashMap<Integer, String>(); - mapSources.put(baseId + MAPNIK, resources.getString(R.string.map_source_osm_mapnik)); - mapSources.put(baseId + CYCLEMAP, resources.getString(R.string.map_source_osm_cyclemap)); - mapSources.put(baseId + OFFLINE, resources.getString(R.string.map_source_osm_offline)); + mapSources = new HashMap<Integer, MapSource>(); + mapSources.put(baseId + MAPNIK, new AbstractMapSource(this, resources.getString(R.string.map_source_osm_mapnik))); + mapSources.put(baseId + CYCLEMAP, new AbstractMapSource(this, resources.getString(R.string.map_source_osm_cyclemap))); + mapSources.put(baseId + OFFLINE, new OfflineMapSource(this, resources.getString(R.string.map_source_osm_offline))); } @Override - public Map<Integer, String> getMapSources() { - + public Map<Integer, MapSource> getMapSources() { return mapSources; } @@ -123,8 +124,21 @@ public class MapsforgeMapProvider implements MapProvider { } return R.layout.map_mapsforge; } + @Override public MapItemFactory getMapItemFactory() { return mapItemFactory; } + + private final class OfflineMapSource extends AbstractMapSource { + + public OfflineMapSource(MapProvider mapProvider, final String name) { + super(mapProvider, name); + } + + @Override + public boolean isAvailable() { + return Settings.isValidMapFile(); + } + } } |
