diff options
| author | Bananeweizen <Bananeweizen@gmx.de> | 2012-11-04 15:34:03 +0100 |
|---|---|---|
| committer | Bananeweizen <Bananeweizen@gmx.de> | 2012-11-04 15:34:03 +0100 |
| commit | 26954590cf375f0a0e968cd5197758a617cf3bb9 (patch) | |
| tree | fdbc0e5450fc1daad8b7dbf8265aee403fb8eb74 | |
| parent | 1b7141301c350e1e328978bb4a1496cb4889dd3b (diff) | |
| download | cgeo-26954590cf375f0a0e968cd5197758a617cf3bb9.zip cgeo-26954590cf375f0a0e968cd5197758a617cf3bb9.tar.gz cgeo-26954590cf375f0a0e968cd5197758a617cf3bb9.tar.bz2 | |
fix #1940: Quicker change of OSM offline maps
| -rw-r--r-- | main/res/layout/init.xml | 83 | ||||
| -rw-r--r-- | main/res/values-de/strings.xml | 4 | ||||
| -rw-r--r-- | main/res/values/strings.xml | 3 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/Settings.java | 89 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/SettingsActivity.java | 59 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/AbstractMapProvider.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/AbstractMapSource.java | 14 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/CGeoMap.java | 53 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/MapProviderFactory.java | 95 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java | 51 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/interfaces/MapProvider.java | 10 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/interfaces/MapSource.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java | 108 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapSource.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java | 3 |
15 files changed, 344 insertions, 241 deletions
diff --git a/main/res/layout/init.xml b/main/res/layout/init.xml index c2887e3..41e3aad 100644 --- a/main/res/layout/init.xml +++ b/main/res/layout/init.xml @@ -669,7 +669,7 @@ android:textColorLink="?text_color_link" android:linksClickable="true" android:text="@string/init_showwaypoint_description" /> -<!-- ** --> +<!-- maps --> <RelativeLayout style="@style/separator_horizontal_layout" > <View style="@style/separator_horizontal" /> <TextView style="@style/separator_horizontal_headline" @@ -693,22 +693,36 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:prompt="@string/init_mapsource_select" /> - <LinearLayout - android:id="@+id/init_mapfilegroup" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" > - <Button style="@style/button_full" - android:id="@+id/select_mapfile" - android:text="@string/init_select_mapfile" - android:layout_width="wrap_content" /> - <EditText style="@style/edittext_full" - android:id="@+id/mapfile" - android:singleLine="true" - android:lines="1" - android:scrollHorizontally="true" - android:inputType="textNoSuggestions" /> - </LinearLayout> + <TextView + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginLeft="10dip" + android:layout_marginRight="10dip" + android:layout_marginBottom="5dip" + android:layout_gravity="left" + android:padding="3dip" + android:textSize="14dip" + android:textColor="?text_color" + android:textColorLink="?text_color_link" + android:linksClickable="true" + android:autoLink="web" + android:text="@string/init_map_directory_description" /> + <LinearLayout + android:id="@+id/init_mapdir_group" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" > + <Button style="@style/button_full" + android:id="@+id/select_map_directory" + android:text="@string/init_select_map_directory" + android:layout_width="wrap_content" /> + <EditText style="@style/edittext_full" + android:id="@+id/map_directory" + android:singleLine="true" + android:lines="1" + android:scrollHorizontally="true" + android:inputType="textNoSuggestions" /> + </LinearLayout> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" @@ -718,23 +732,24 @@ android:textSize="14dip" android:textColor="?text_color" android:text="@string/init_rendertheme_folder" /> - <LinearLayout - android:id="@+id/init_themefilegroup" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" > - <Button style="@style/button_full" - android:id="@+id/select_themefolder" - android:text="@string/init_select_themefolder" - android:layout_width="wrap_content" /> - <EditText style="@style/edittext_full" - android:id="@+id/themefolder" - android:singleLine="true" - android:lines="1" - android:scrollHorizontally="true" - android:inputType="textNoSuggestions" /> - </LinearLayout> -<!-- ** --> + <LinearLayout + android:id="@+id/init_themefilegroup" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:orientation="horizontal" > + <Button style="@style/button_full" + android:id="@+id/select_themefolder" + android:text="@string/init_select_themefolder" + android:layout_width="wrap_content" /> + <EditText style="@style/edittext_full" + android:id="@+id/themefolder" + android:singleLine="true" + android:lines="1" + android:scrollHorizontally="true" + android:inputType="textNoSuggestions" /> + </LinearLayout> + +<!-- GPX --> <RelativeLayout style="@style/separator_horizontal_layout" > <View style="@style/separator_horizontal" /> <TextView style="@style/separator_horizontal_headline" diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index a1f54a1..2ff55b9 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -425,12 +425,12 @@ <string name="init_backup_last">Backup verfügbar von</string> <string name="init_backup_last_no">Keine Datei mit Datenbanksicherung gefunden.</string> <string name="init_mapsources">Kartenherkunft</string> - <string name="init_mapsources_description">Hier kann die Quelle der benutzen Karte gewählt werden. Alternativ zu Google Maps stehen verschiedene OpenStreetMap-Stile zur Verfügung und daneben auch Karten-Dateien für die Offline-Nutzung (siehe http://code.google.com/p/mapsforge/ für die Details).</string> + <string name="init_mapsources_description">Hier kann die Quelle der benutzten Karte gewählt werden. Alternativ zu Google Maps stehen verschiedene OpenStreetMap-Stile zur Verfügung und daneben auch Karten-Dateien für die Offline-Nutzung (siehe http://code.google.com/p/mapsforge/ für die Details).</string> <string name="init_mapsource_select">Kartenquelle wählen</string> - <string name="init_select_mapfile">…</string> <string name="init_select_themefolder">…</string> <string name="init_select_gpx_exportdir">…</string> <string name="init_select_gpx_importdir">…</string> + <string name="init_map_directory_description">Verzeichnis mit Offline-Karten</string> <string name="init_gpx_exportdir">Verzeichnis für GPX-Exporte</string> <string name="init_gpx_importdir">Verzeichnis für GPX-Importe</string> <string name="init_gpx_exportdir_description">Hier kann das Verzeichnis für GPX-Exporte gewählt werden.</string> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 2e48af3..c17068d 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -428,8 +428,9 @@ <string name="init_mapsources">Map Sources</string> <string name="init_mapsources_description">Here you can select the source for your maps. As an alternative to Google maps various OpenStreetMap styles are available and even offline map files (See <a href="http://code.google.com/p/mapsforge/">http://code.google.com/p/mapsforge/</a> for details).</string> <string name="init_mapsource_select">Select Map Source</string> - <string name="init_select_mapfile">…</string> <string name="init_select_themefolder">…</string> + <string name="init_map_directory_description">Directory with offline maps</string> + <string name="init_select_map_directory">…</string> <string name="init_select_gpx_exportdir">…</string> <string name="init_select_gpx_importdir">…</string> <string name="init_gpx_exportdir">GPX Export Directory</string> diff --git a/main/src/cgeo/geocaching/Settings.java b/main/src/cgeo/geocaching/Settings.java index dc7bd99..a59de1d 100644 --- a/main/src/cgeo/geocaching/Settings.java +++ b/main/src/cgeo/geocaching/Settings.java @@ -8,9 +8,12 @@ import cgeo.geocaching.enumerations.LiveMapStrategy.Strategy; import cgeo.geocaching.enumerations.LogType; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.maps.MapProviderFactory; +import cgeo.geocaching.maps.google.GoogleMapProvider; import cgeo.geocaching.maps.interfaces.GeoPointImpl; import cgeo.geocaching.maps.interfaces.MapProvider; +import cgeo.geocaching.maps.interfaces.MapSource; import cgeo.geocaching.maps.mapsforge.MapsforgeMapProvider; +import cgeo.geocaching.maps.mapsforge.MapsforgeMapProvider.OfflineMapSource; import cgeo.geocaching.utils.CryptUtils; import cgeo.geocaching.utils.FileUtils; import cgeo.geocaching.utils.FileUtils.FileSelector; @@ -106,6 +109,7 @@ public final class Settings { private static final String KEY_GPX_IMPORT_DIR = "gpxImportDir"; private static final String KEY_PLAIN_LOGS = "plainLogs"; private static final String KEY_NATIVE_UA = "nativeUa"; + private static final String KEY_MAP_DIRECTORY = "mapDirectory"; private final static int unitsMetric = 1; @@ -432,7 +436,7 @@ public final class Settings { public static MapProvider getMapProvider() { if (mapProvider == null) { - mapProvider = MapProviderFactory.getMapProvider(getMapSource()); + mapProvider = getMapSource().getMapProvider(); } return mapProvider; } @@ -442,12 +446,38 @@ public final class Settings { } public static boolean setMapFile(final String mapFile) { - return editSharedSettings(new PrefRunnable() { + boolean result = editSharedSettings(new PrefRunnable() { @Override public void edit(Editor edit) { edit.putString(KEY_MAPFILE, mapFile); } }); + if (mapFile != null) { + setMapFileDirectory(new File(mapFile).getParent()); + } + return result; + } + + public static String getMapFileDirectory() { + final String mapDir = sharedPrefs.getString(KEY_MAP_DIRECTORY, null); + if (mapDir != null) { + return mapDir; + } + final String mapFile = getMapFile(); + if (mapFile != null) { + return new File(mapFile).getParent(); + } + return null; + } + + public static boolean setMapFileDirectory(final String mapFileDirectory) { + return editSharedSettings(new PrefRunnable() { + @Override + public void edit(Editor edit) { + edit.putString(KEY_MAP_DIRECTORY, mapFileDirectory); + MapsforgeMapProvider.getInstance().updateOfflineMaps(); + } + }); } public static boolean isValidMapFile() { @@ -821,11 +851,55 @@ public final class Settings { }); } - public static int getMapSource() { - return sharedPrefs.getInt(KEY_MAP_SOURCE, 0); + public static MapSource getMapSource() { + final int id = getConvertedMapId(); + final MapSource map = MapProviderFactory.getMapSource(id); + if (map != null) { + return map; + } + // fallback to first available map + return MapProviderFactory.getDefaultSource(); } - public static void setMapSource(final int newMapSource) { + private final static int GOOGLEMAP_BASEID = 30; + private final static int MAP = 1; + private final static int SATELLITE = 2; + + private final static int MFMAP_BASEID = 40; + private final static int MAPNIK = 1; + private final static int CYCLEMAP = 3; + private final static int OFFLINE = 4; + + /** + * convert old preference ids for maps (based on constant values) into new hash based ids + * + * @return + */ + private static int getConvertedMapId() { + final int id = sharedPrefs.getInt(KEY_MAP_SOURCE, 0); + switch (id) { + case GOOGLEMAP_BASEID + MAP: + return GoogleMapProvider.GOOGLE_MAP_ID.hashCode(); + case GOOGLEMAP_BASEID + SATELLITE: + return GoogleMapProvider.GOOGLE_SATELLITE_ID.hashCode(); + case MFMAP_BASEID + MAPNIK: + return MapsforgeMapProvider.MAPSFORGE_MAPNIK_ID.hashCode(); + case MFMAP_BASEID + CYCLEMAP: + return MapsforgeMapProvider.MAPSFORGE_CYCLEMAP_ID.hashCode(); + case MFMAP_BASEID + OFFLINE: { + final String mapFile = Settings.getMapFile(); + if (StringUtils.isNotEmpty(mapFile)) { + return mapFile.hashCode(); + } + break; + } + default: + break; + } + return id; + } + + public static void setMapSource(final MapSource newMapSource) { if (!MapProviderFactory.isSameActivity(getMapSource(), newMapSource)) { mapProvider = null; } @@ -833,9 +907,12 @@ public final class Settings { @Override public void edit(Editor edit) { - edit.putInt(KEY_MAP_SOURCE, newMapSource); + edit.putInt(KEY_MAP_SOURCE, newMapSource.getNumericalId()); } }); + if (newMapSource instanceof OfflineMapSource) { + setMapFile(((OfflineMapSource) newMapSource).getFileName()); + } } public static void setAnyCoordinates(final Geopoint coords) { diff --git a/main/src/cgeo/geocaching/SettingsActivity.java b/main/src/cgeo/geocaching/SettingsActivity.java index e86ab56..80bdf69 100644 --- a/main/src/cgeo/geocaching/SettingsActivity.java +++ b/main/src/cgeo/geocaching/SettingsActivity.java @@ -61,7 +61,6 @@ public class SettingsActivity extends AbstractActivity { private final static int SELECT_GPX_IMPORT_REQUEST = 3; private final static int SELECT_THEMEFOLDER_REQUEST = 4; - private ProgressDialog loginDialog = null; private ProgressDialog webDialog = null; private boolean enableTemplatesMenu = false; @@ -558,22 +557,10 @@ public class SettingsActivity extends AbstractActivity { webAuth.setOnClickListener(new webAuth()); // Map source settings - 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, mapSourceNames.toArray(new String[mapSourceNames.size()])); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - mapSourceSelector.setAdapter(adapter); - int mapsource = Settings.getMapSource(); - mapSourceSelector.setSelection(MapProviderFactory.getSourceOrdinalFromId(mapsource)); - mapSourceSelector.setOnItemSelectedListener(new cgeoChangeMapSource()); + updateMapSourceMenu(); - initMapfileEdittext(false); - - Button selectMapfile = (Button) findViewById(R.id.select_mapfile); - selectMapfile.setOnClickListener(new View.OnClickListener() { + Button selectMapDirectory = (Button) findViewById(R.id.select_map_directory); + selectMapDirectory.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { @@ -750,11 +737,27 @@ public class SettingsActivity extends AbstractActivity { }); } - private void initMapfileEdittext(boolean setFocus) { - EditText mfmapFileEdit = (EditText) findViewById(R.id.mapfile); - mfmapFileEdit.setText(Settings.getMapFile()); + private void updateMapSourceMenu() { + Collection<String> mapSourceNames = new ArrayList<String>(); + for (MapSource mapSource : MapProviderFactory.getMapSources()) { + mapSourceNames.add(mapSource.getName()); + } + Spinner mapSourceSelector = (Spinner) findViewById(R.id.mapsource); + 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); + final int index = MapProviderFactory.getMapSources().indexOf(Settings.getMapSource()); + mapSourceSelector.setSelection(index); + mapSourceSelector.setOnItemSelectedListener(new cgeoChangeMapSource()); + + initMapDirectoryEdittext(false); + } + + private void initMapDirectoryEdittext(boolean setFocus) { + final EditText mapDirectoryEdit = (EditText) findViewById(R.id.map_directory); + mapDirectoryEdit.setText(Settings.getMapFileDirectory()); if (setFocus) { - mfmapFileEdit.requestFocus(); + mapDirectoryEdit.requestFocus(); } } @@ -824,7 +827,7 @@ public class SettingsActivity extends AbstractActivity { String passvoteNew = StringUtils.trimToEmpty(((EditText) findViewById(R.id.passvote)).getText().toString()); // don't trim signature, user may want to have whitespace at the beginning String signatureNew = ((EditText) findViewById(R.id.signature)).getText().toString(); - String mapFileNew = StringUtils.trimToEmpty(((EditText) findViewById(R.id.mapfile)).getText().toString()); + String mapDirectoryNew = StringUtils.trimToEmpty(((EditText) findViewById(R.id.map_directory)).getText().toString()); String altitudeNew = StringUtils.trimToNull(((EditText) findViewById(R.id.altitude)).getText().toString()); int altitudeNewInt = parseNumber(altitudeNew, 0); @@ -836,7 +839,7 @@ public class SettingsActivity extends AbstractActivity { final boolean status2 = Settings.setGCvoteLogin(passvoteNew); final boolean status3 = Settings.setSignature(signatureNew); final boolean status4 = Settings.setAltCorrection(altitudeNewInt); - final boolean status5 = Settings.setMapFile(mapFileNew); + final boolean status5 = Settings.setMapFileDirectory(mapDirectoryNew); Settings.setShowWaypointsThreshold(waypointThreshold); String importNew = StringUtils.trimToEmpty(((EditText) findViewById(R.id.gpx_importdir)).getText().toString()); @@ -868,14 +871,14 @@ public class SettingsActivity extends AbstractActivity { private static class cgeoChangeMapSource implements OnItemSelectedListener { @Override - public void onItemSelected(AdapterView<?> arg0, View arg1, int arg2, + public void onItemSelected(AdapterView<?> arg0, View arg1, int position, long arg3) { - Settings.setMapSource(MapProviderFactory.getSourceIdFromOrdinal(arg2)); + Settings.setMapSource(MapProviderFactory.getMapSources().get(position)); } @Override public void onNothingSelected(AdapterView<?> arg0) { - arg0.setSelection(MapProviderFactory.getSourceIdFromOrdinal(Settings.getMapSource())); + arg0.setSelection(MapProviderFactory.getMapSources().indexOf(Settings.getMapSource())); } } @@ -965,13 +968,15 @@ public class SettingsActivity extends AbstractActivity { if (requestCode == SELECT_MAPFILE_REQUEST) { if (resultCode == RESULT_OK) { if (data.hasExtra("mapfile")) { - Settings.setMapFile(data.getStringExtra("mapfile")); + final String mapFile = data.getStringExtra("mapfile"); + Settings.setMapFile(mapFile); if (!Settings.isValidMapFile(Settings.getMapFile())) { showToast(res.getString(R.string.warn_invalid_mapfile)); } } } - initMapfileEdittext(true); + updateMapSourceMenu(); + initMapDirectoryEdittext(true); } if (requestCode == SELECT_GPX_EXPORT_REQUEST) { checkDirectory(resultCode, data, R.id.gpx_exportdir, new RunnableWithArgument<String>() { diff --git a/main/src/cgeo/geocaching/maps/AbstractMapProvider.java b/main/src/cgeo/geocaching/maps/AbstractMapProvider.java index 273c9a8..620b953 100644 --- a/main/src/cgeo/geocaching/maps/AbstractMapProvider.java +++ b/main/src/cgeo/geocaching/maps/AbstractMapProvider.java @@ -6,8 +6,7 @@ import cgeo.geocaching.maps.interfaces.MapSource; public abstract class AbstractMapProvider implements MapProvider { @Override - public boolean isMySource(int sourceId) { - final MapSource source = MapProviderFactory.getMapSource(sourceId); - return source != null && source.hasMapProvider(this); + public void registerMapSource(MapSource mapSource) { + MapProviderFactory.registerMapSource(mapSource); } } diff --git a/main/src/cgeo/geocaching/maps/AbstractMapSource.java b/main/src/cgeo/geocaching/maps/AbstractMapSource.java index b18e0ce..90a61d2 100644 --- a/main/src/cgeo/geocaching/maps/AbstractMapSource.java +++ b/main/src/cgeo/geocaching/maps/AbstractMapSource.java @@ -6,9 +6,11 @@ import cgeo.geocaching.maps.interfaces.MapSource; public abstract class AbstractMapSource implements MapSource { private final String name; - private MapProvider mapProvider; + private final MapProvider mapProvider; + private final String id; - public AbstractMapSource(MapProvider mapProvider, final String name) { + public AbstractMapSource(final String id, final MapProvider mapProvider, final String name) { + this.id = id; this.mapProvider = mapProvider; this.name = name; } @@ -30,8 +32,12 @@ public abstract class AbstractMapSource implements MapSource { } @Override - public boolean hasMapProvider(MapProvider mapProvider) { - return this.mapProvider.equals(mapProvider); + public int getNumericalId() { + return id.hashCode(); } + @Override + public MapProvider getMapProvider() { + return mapProvider; + } } diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 6062469..3e136b7 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -170,6 +170,8 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto private static final int[][] INSET_FOUND = { { 0, 0, 21, 28 }, { 0, 0, 25, 35 } }; // top left, 12x12 / 16x16 private static final int[][] INSET_USERMODIFIEDCOORDS = { { 21, 28, 0, 0 }, { 19, 25, 0, 0 } }; // bottom right, 12x12 / 26x26 private static final int[][] INSET_PERSONALNOTE = { { 0, 28, 21, 0 }, { 0, 25, 19, 0 } }; // bottom left, 12x12 / 26x26 + private static final int MENU_GROUP_MAP_SOURCES = 1; + private static final int MENU_GROUP_MAP_STRATEGY = 2; private SparseArray<LayerDrawable> overlaysCache = new SparseArray<LayerDrawable>(); /** Count of caches currently visible */ @@ -394,11 +396,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // Get fresh map information from the bundle if any if (savedInstanceState != null) { - currentSourceId = savedInstanceState.getInt(BUNDLE_MAP_SOURCE, Settings.getMapSource()); + currentSourceId = savedInstanceState.getInt(BUNDLE_MAP_SOURCE, Settings.getMapSource().getNumericalId()); mapStateIntent = savedInstanceState.getIntArray(BUNDLE_MAP_STATE); isLiveEnabled = savedInstanceState.getBoolean(BUNDLE_LIVE_ENABLED, false); } else { - currentSourceId = Settings.getMapSource(); + currentSourceId = Settings.getMapSource().getNumericalId(); } // If recreating from an obsolete map source, we may need a restart @@ -536,7 +538,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto @Override public boolean onCreateOptionsMenu(Menu menu) { - SubMenu submenu = menu.addSubMenu(1, MENU_SELECT_MAPVIEW, 0, res.getString(R.string.map_view_map)).setIcon(R.drawable.ic_menu_mapmode); + SubMenu submenu = menu.addSubMenu(0, MENU_SELECT_MAPVIEW, 0, res.getString(R.string.map_view_map)).setIcon(R.drawable.ic_menu_mapmode); addMapViewMenuItems(submenu); menu.add(0, MENU_MAP_LIVE, 0, res.getString(R.string.map_live_disable)).setIcon(R.drawable.ic_menu_refresh); @@ -549,11 +551,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto Strategy strategy = Settings.getLiveMapStrategy(); SubMenu subMenuStrategy = menu.addSubMenu(0, SUBMENU_STRATEGY, 0, res.getString(R.string.map_strategy)).setIcon(R.drawable.ic_menu_preferences); subMenuStrategy.setHeaderTitle(res.getString(R.string.map_strategy_title)); - subMenuStrategy.add(2, MENU_STRATEGY_FASTEST, 0, Strategy.FASTEST.getL10n()).setCheckable(true).setChecked(strategy == Strategy.FASTEST); - subMenuStrategy.add(2, MENU_STRATEGY_FAST, 0, Strategy.FAST.getL10n()).setCheckable(true).setChecked(strategy == Strategy.FAST); - subMenuStrategy.add(2, MENU_STRATEGY_AUTO, 0, Strategy.AUTO.getL10n()).setCheckable(true).setChecked(strategy == Strategy.AUTO); - subMenuStrategy.add(2, MENU_STRATEGY_DETAILED, 0, Strategy.DETAILED.getL10n()).setCheckable(true).setChecked(strategy == Strategy.DETAILED); - subMenuStrategy.setGroupCheckable(2, true, true); + subMenuStrategy.add(MENU_GROUP_MAP_STRATEGY, MENU_STRATEGY_FASTEST, 0, Strategy.FASTEST.getL10n()).setCheckable(true).setChecked(strategy == Strategy.FASTEST); + subMenuStrategy.add(MENU_GROUP_MAP_STRATEGY, MENU_STRATEGY_FAST, 0, Strategy.FAST.getL10n()).setCheckable(true).setChecked(strategy == Strategy.FAST); + subMenuStrategy.add(MENU_GROUP_MAP_STRATEGY, MENU_STRATEGY_AUTO, 0, Strategy.AUTO.getL10n()).setCheckable(true).setChecked(strategy == Strategy.AUTO); + subMenuStrategy.add(MENU_GROUP_MAP_STRATEGY, MENU_STRATEGY_DETAILED, 0, Strategy.DETAILED.getL10n()).setCheckable(true).setChecked(strategy == Strategy.DETAILED); + subMenuStrategy.setGroupCheckable(MENU_GROUP_MAP_STRATEGY, true, true); menu.add(0, MENU_AS_LIST, 0, res.getString(R.string.map_as_list)).setIcon(R.drawable.ic_menu_agenda); @@ -561,20 +563,17 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } private static void addMapViewMenuItems(final Menu menu) { - MapProviderFactory.addMapviewMenuItems(menu, 1, Settings.getMapSource()); - menu.setGroupCheckable(1, true, true); + MapProviderFactory.addMapviewMenuItems(menu, MENU_GROUP_MAP_SOURCES); + menu.setGroupCheckable(MENU_GROUP_MAP_SOURCES, true, true); } @Override public boolean onPrepareOptionsMenu(Menu menu) { super.onPrepareOptionsMenu(menu); - for (Integer mapSourceId : MapProviderFactory.getMapSources().keySet()) { - final MenuItem menuItem = menu.findItem(mapSourceId); + for (MapSource mapSource : MapProviderFactory.getMapSources()) { + final MenuItem menuItem = menu.findItem(mapSource.getNumericalId()); if (menuItem != null) { - final MapSource mapSource = MapProviderFactory.getMapSource(mapSourceId); - if (mapSource != null) { - menuItem.setEnabled(mapSource.isAvailable()); - } + menuItem.setEnabled(mapSource.isAvailable()); } } @@ -730,12 +729,10 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto return true; } default: - int mapSource = MapProviderFactory.getMapSourceFromMenuId(id); - if (MapProviderFactory.isValidSourceId(mapSource)) { + final MapSource mapSource = MapProviderFactory.getMapSource(id); + if (mapSource != null) { item.setChecked(true); - changeMapSource(mapSource); - return true; } } @@ -816,21 +813,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto * the new map source, which can be the same as the current one * @return true if a restart is needed, false otherwise */ - private boolean changeMapSource(final int mapSource) { - // If the current or the requested map source is invalid, request the first available map source instead - // and restart the activity. - if (!MapProviderFactory.isValidSourceId(mapSource)) { - Log.e("CGeoMap.onCreate: invalid map source requested: " + mapSource); - currentSourceId = MapProviderFactory.getSourceIdFromOrdinal(0); - Settings.setMapSource(currentSourceId); - mapRestart(); - return true; - } - - final boolean restartRequired = !MapProviderFactory.isSameActivity(currentSourceId, mapSource); + private boolean changeMapSource(final MapSource mapSource) { + final boolean restartRequired = !MapProviderFactory.isSameActivity(Settings.getMapSource(), mapSource); Settings.setMapSource(mapSource); - currentSourceId = mapSource; + currentSourceId = mapSource.getNumericalId(); if (restartRequired) { mapRestart(); diff --git a/main/src/cgeo/geocaching/maps/MapProviderFactory.java b/main/src/cgeo/geocaching/maps/MapProviderFactory.java index 778c921..cb1f87f 100644 --- a/main/src/cgeo/geocaching/maps/MapProviderFactory.java +++ b/main/src/cgeo/geocaching/maps/MapProviderFactory.java @@ -1,5 +1,6 @@ package cgeo.geocaching.maps; +import cgeo.geocaching.Settings; import cgeo.geocaching.maps.google.GoogleMapProvider; import cgeo.geocaching.maps.interfaces.MapProvider; import cgeo.geocaching.maps.interfaces.MapSource; @@ -7,30 +8,19 @@ import cgeo.geocaching.maps.mapsforge.MapsforgeMapProvider; import android.view.Menu; -import java.util.SortedMap; -import java.util.TreeMap; +import java.util.ArrayList; +import java.util.List; public class MapProviderFactory { - private final static int GOOGLEMAP_BASEID = 30; - private final static int MFMAP_BASEID = 40; - - private final static MapProvider[] mapProviders; - private final static SortedMap<Integer, MapSource> mapSources; + private final static ArrayList<MapSource> mapSources = new ArrayList<MapSource>(); static { // add GoogleMapProvider only if google api is available in order to support x86 android emulator 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, MapSource>(); - for (MapProvider mp : mapProviders) { - mapSources.putAll(mp.getMapSources()); + GoogleMapProvider.getInstance(); } + MapsforgeMapProvider.getInstance(); } private static boolean isGoogleMapsInstalled() { @@ -43,65 +33,52 @@ public class MapProviderFactory { return googleMaps; } - public static SortedMap<Integer, MapSource> getMapSources() { + public static List<MapSource> getMapSources() { return mapSources; } - public static boolean isValidSourceId(int sourceId) { - return mapSources.containsKey(sourceId); + public static boolean isSameActivity(final MapSource source1, final MapSource source2) { + final MapProvider provider1 = source1.getMapProvider(); + final MapProvider provider2 = source2.getMapProvider(); + return provider1 == provider2 && provider1.isSameActivity(source1, source2); } - public static boolean isSameActivity(int sourceId1, int sourceId2) { - for (MapProvider mp : mapProviders) { - if (mp.isMySource(sourceId1) && mp.isMySource(sourceId2)) { - return mp.isSameActivity(sourceId1, sourceId2); - } + public static void addMapviewMenuItems(final Menu parentMenu, final int groupId) { + final int currentSource = Settings.getMapSource().getNumericalId(); + for (int i = 0; i < mapSources.size(); i++) { + final MapSource mapSource = mapSources.get(i); + final int id = mapSource.getNumericalId(); + parentMenu.add(groupId, id, i, mapSource.getName()).setCheckable(true).setChecked(id == currentSource); } - return false; } - public static MapProvider getMapProvider(int sourceId) { - for (MapProvider mp : mapProviders) { - if (mp.isMySource(sourceId)) { - return mp; + public static MapSource getMapSource(int id) { + for (MapSource mapSource : mapSources) { + if (mapSource.getNumericalId() == id) { + return mapSource; } } - return mapProviders[0]; + return null; } - public static int getSourceOrdinalFromId(int sourceId) { - int sourceOrdinal = 0; - for (int key : mapSources.keySet()) { - if (sourceId == key) { - return sourceOrdinal; - } - sourceOrdinal++; - } - return 0; + public static void registerMapSource(final MapSource mapSource) { + mapSources.add(mapSource); } - public static int getSourceIdFromOrdinal(int sourceOrdinal) { - int count = 0; - for (int key : mapSources.keySet()) { - if (sourceOrdinal == count) { - return key; - } - count++; - } - return mapSources.firstKey(); + public static MapSource getDefaultSource() { + return mapSources.get(0); } - public static void addMapviewMenuItems(Menu parentMenu, int groupId, int currentSource) { - for (Integer key : mapSources.keySet()) { - parentMenu.add(groupId, key, 0, mapSources.get(key).getName()).setCheckable(true).setChecked(key == currentSource); + /** + * remove offline map sources after changes of the settings + */ + public static void deleteOfflineMapSources() { + final ArrayList<MapSource> deletion = new ArrayList<MapSource>(); + for (MapSource mapSource : mapSources) { + if (mapSource instanceof MapsforgeMapProvider.OfflineMapSource) { + deletion.add(mapSource); + } } - } - - public static int getMapSourceFromMenuId(int menuId) { - return menuId; - } - - public static MapSource getMapSource(int sourceId) { - return mapSources.get(sourceId); + mapSources.removeAll(deletion); } } diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java b/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java index 41f342e..6973338 100644 --- a/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java +++ b/main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java @@ -4,7 +4,6 @@ import cgeo.geocaching.R; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.maps.AbstractMapProvider; 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; @@ -13,36 +12,32 @@ import com.google.android.maps.MapActivity; import android.content.res.Resources; -import java.util.HashMap; -import java.util.Map; - public final class GoogleMapProvider extends AbstractMapProvider { - private final static int MAP = 1; - private final static int SATELLITE = 2; - - private final Map<Integer, MapSource> mapSources; + public static final String GOOGLE_MAP_ID = "GOOGLE_MAP"; + public static final String GOOGLE_SATELLITE_ID = "GOOGLE_SATELLITE"; + private static GoogleMapProvider instance; private final MapItemFactory mapItemFactory; - public GoogleMapProvider(final int baseid) { + private GoogleMapProvider() { final Resources resources = cgeoapplication.getInstance().getResources(); - mapSources = new HashMap<Integer, MapSource>(); - mapSources.put(baseid + MAP, new GoogleMapSource(this, resources.getString(R.string.map_source_google_map))); - mapSources.put(baseid + SATELLITE, new GoogleMapSatelliteSource(this, resources.getString(R.string.map_source_google_satellite))); + registerMapSource(new GoogleMapSource(this, resources.getString(R.string.map_source_google_map))); + registerMapSource(new GoogleSatelliteSource(this, resources.getString(R.string.map_source_google_satellite))); mapItemFactory = new GoogleMapItemFactory(); } - @Override - public Map<Integer, MapSource> getMapSources() { - return mapSources; + public static GoogleMapProvider getInstance() { + if (instance == null) { + instance = new GoogleMapProvider(); + } + return instance; } - public static boolean isSatelliteSource(final int sourceId) { - final MapSource mapSource = MapProviderFactory.getMapSource(sourceId); - return mapSource != null && mapSource instanceof GoogleMapSatelliteSource; + public static boolean isSatelliteSource(final MapSource mapSource) { + return mapSource != null && mapSource instanceof GoogleSatelliteSource; } @Override @@ -66,22 +61,30 @@ public final class GoogleMapProvider extends AbstractMapProvider { } @Override - public boolean isSameActivity(int sourceId1, int sourceId2) { + public boolean isSameActivity(final MapSource source1, final MapSource source2) { return true; } - private static class GoogleMapSource extends AbstractMapSource { + private static abstract class AbstractGoogleMapSource extends AbstractMapSource { + + public AbstractGoogleMapSource(final String id, final MapProvider mapProvider, final String name) { + super(id, mapProvider, name); + } + + } + + private static final class GoogleMapSource extends AbstractGoogleMapSource { public GoogleMapSource(final MapProvider mapProvider, final String name) { - super(mapProvider, name); + super(GOOGLE_MAP_ID, mapProvider, name); } } - private static final class GoogleMapSatelliteSource extends GoogleMapSource { + private static final class GoogleSatelliteSource extends AbstractGoogleMapSource { - public GoogleMapSatelliteSource(MapProvider mapProvider, String name) { - super(mapProvider, name); + public GoogleSatelliteSource(MapProvider mapProvider, String name) { + super(GOOGLE_SATELLITE_ID, mapProvider, name); } } diff --git a/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java b/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java index 15330e2..e403032 100644 --- a/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java +++ b/main/src/cgeo/geocaching/maps/interfaces/MapProvider.java @@ -2,19 +2,13 @@ package cgeo.geocaching.maps.interfaces; import android.app.Activity; -import java.util.Map; - /** * Defines functions of a factory class to get implementation specific objects * (GeoPoints, OverlayItems, ...) */ public interface MapProvider { - public Map<Integer, MapSource> getMapSources(); - - public boolean isMySource(int sourceId); - - public boolean isSameActivity(int sourceId1, int sourceId2); + public boolean isSameActivity(final MapSource source1, final MapSource source2); public Class<? extends Activity> getMapClass(); @@ -23,4 +17,6 @@ public interface MapProvider { public int getMapLayoutId(); public MapItemFactory getMapItemFactory(); + + public void registerMapSource(final MapSource mapSource); } diff --git a/main/src/cgeo/geocaching/maps/interfaces/MapSource.java b/main/src/cgeo/geocaching/maps/interfaces/MapSource.java index bdbe5fe..f2f0232 100644 --- a/main/src/cgeo/geocaching/maps/interfaces/MapSource.java +++ b/main/src/cgeo/geocaching/maps/interfaces/MapSource.java @@ -5,5 +5,7 @@ public interface MapSource { public boolean isAvailable(); - public boolean hasMapProvider(MapProvider mapProvider); + public int getNumericalId(); + + public MapProvider getMapProvider(); } diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java index 7eeff76..299bf30 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java @@ -10,6 +10,7 @@ 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; +import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; import org.mapsforge.android.maps.mapgenerator.MapGeneratorInternal; @@ -20,43 +21,55 @@ import android.app.Activity; import android.content.res.Resources; import java.io.File; -import java.util.HashMap; -import java.util.Map; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; public final class MapsforgeMapProvider extends AbstractMapProvider { - private final static int MAPNIK = 1; - private final static int CYCLEMAP = 3; - private final static int OFFLINE = 4; - - private final Map<Integer, MapSource> mapSources; - - private final int baseId; + public static final String MAPSFORGE_CYCLEMAP_ID = "MAPSFORGE_CYCLEMAP"; + public static final String MAPSFORGE_MAPNIK_ID = "MAPSFORGE_MAPNIK"; private boolean oldMap = false; private MapItemFactory mapItemFactory = new MapsforgeMapItemFactory(); + private static MapsforgeMapProvider instance; - public MapsforgeMapProvider(int _baseId) { - baseId = _baseId; + private MapsforgeMapProvider() { final Resources resources = cgeoapplication.getInstance().getResources(); - mapSources = new HashMap<Integer, MapSource>(); - mapSources.put(baseId + MAPNIK, new MapsforgeMapSource(this, resources.getString(R.string.map_source_osm_mapnik), MapGeneratorInternal.MAPNIK)); - mapSources.put(baseId + CYCLEMAP, new MapsforgeMapSource(this, resources.getString(R.string.map_source_osm_cyclemap), MapGeneratorInternal.OPENCYCLEMAP)); - mapSources.put(baseId + OFFLINE, new OfflineMapSource(this, resources.getString(R.string.map_source_osm_offline), MapGeneratorInternal.DATABASE_RENDERER)); + registerMapSource(new MapsforgeMapSource(MAPSFORGE_MAPNIK_ID, this, resources.getString(R.string.map_source_osm_mapnik), MapGeneratorInternal.MAPNIK)); + registerMapSource(new MapsforgeMapSource(MAPSFORGE_CYCLEMAP_ID, this, resources.getString(R.string.map_source_osm_cyclemap), MapGeneratorInternal.OPENCYCLEMAP)); + + updateOfflineMaps(); } - @Override - public Map<Integer, MapSource> getMapSources() { - return mapSources; + public static MapsforgeMapProvider getInstance() { + if (instance == null) { + instance = new MapsforgeMapProvider(); + } + return instance; } - public static int getMapsforgeSource(int sourceId) { - MapProvider mp = MapProviderFactory.getMapProvider(sourceId); - if (mp instanceof MapsforgeMapProvider) { - MapsforgeMapProvider mfp = (MapsforgeMapProvider) mp; - return sourceId - mfp.baseId; + public static List<String> getOfflineMaps() { + final String mapFile = Settings.getMapFile(); + if (StringUtils.isEmpty(mapFile)) { + return Collections.emptyList(); + } + + try { + File directory = new File(mapFile).getParentFile(); + ArrayList<String> mapFileList = new ArrayList<String>(); + for (File file : directory.listFiles()) { + if (file.getName().endsWith(".map")) { + if (MapsforgeMapProvider.isValidMapFile(file.getAbsolutePath())) { + mapFileList.add(file.getAbsolutePath()); + } + } + } + return mapFileList; + } catch (Exception e) { + Log.e("Settings.getOfflineMaps: " + e); } - return 0; + return Collections.emptyList(); } public static boolean isValidMapFile(String mapFileIn) { @@ -83,19 +96,16 @@ public final class MapsforgeMapProvider extends AbstractMapProvider { } @Override - public boolean isSameActivity(int sourceId1, int sourceId2) { - final int mfSourceId1 = getMapsforgeSource(sourceId1); - final int mfSourceId2 = getMapsforgeSource(sourceId2); - return mfSourceId1 == mfSourceId2 || + public boolean isSameActivity(final MapSource source1, final MapSource source2) { + return source1 == source2 || !isMapfile024(Settings.getMapFile()) || - mfSourceId1 != OFFLINE && mfSourceId2 != OFFLINE; + (!(source1 instanceof OfflineMapSource) && !(source2 instanceof OfflineMapSource)); } @Override public Class<? extends Activity> getMapClass() { - int sourceId = getMapsforgeSource(Settings.getMapSource()); - - if (sourceId == OFFLINE && isMapfile024(Settings.getMapFile())) { + final MapSource source = Settings.getMapSource(); + if (source instanceof OfflineMapSource && isMapfile024(Settings.getMapFile())) { oldMap = true; mapItemFactory = new MapsforgeMapItemFactory024(); return MapsforgeMapActivity024.class; @@ -126,15 +136,41 @@ public final class MapsforgeMapProvider extends AbstractMapProvider { return mapItemFactory; } - private static final class OfflineMapSource extends MapsforgeMapSource { + /** + * Offline maps use the hash of the filename as ID. That way changed files can easily be detected. Also we do no + * longer need to differentiate between internal map sources and offline map sources, as they all just have an + * numerical ID (based on the hash code). + */ + public static final class OfflineMapSource extends MapsforgeMapSource { - public OfflineMapSource(MapProvider mapProvider, final String name, MapGeneratorInternal generator) { - super(mapProvider, name, generator); + private final String fileName; + + public OfflineMapSource(final String fileName, MapProvider mapProvider, final String name, final MapGeneratorInternal generator) { + super(fileName, mapProvider, name, generator); + this.fileName = fileName; } @Override public boolean isAvailable() { - return Settings.isValidMapFile(); + return isValidMapFile(fileName); + } + + public String getFileName() { + return fileName; + } + } + + public void updateOfflineMaps() { + MapProviderFactory.deleteOfflineMapSources(); + final Resources resources = cgeoapplication.getInstance().getResources(); + final List<String> offlineMaps = getOfflineMaps(); + for (String mapFile : offlineMaps) { + final String mapName = StringUtils.capitalize(StringUtils.substringBeforeLast(new File(mapFile).getName(), ".")); + registerMapSource(new OfflineMapSource(mapFile, this, resources.getString(R.string.map_source_osm_offline) + " - " + mapName, MapGeneratorInternal.DATABASE_RENDERER)); + } + // have a default entry, if no map files are available. otherwise we cannot select "offline" in the settings + if (offlineMaps.isEmpty()) { + registerMapSource(new OfflineMapSource("", this, resources.getString(R.string.map_source_osm_offline), MapGeneratorInternal.DATABASE_RENDERER)); } } } diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapSource.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapSource.java index e59750f..861e567 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapSource.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapSource.java @@ -9,8 +9,8 @@ class MapsforgeMapSource extends AbstractMapSource { private final MapGeneratorInternal generator; - public MapsforgeMapSource(MapProvider mapProvider, String name, MapGeneratorInternal generator) { - super(mapProvider, name); + public MapsforgeMapSource(final String id, MapProvider mapProvider, String name, MapGeneratorInternal generator) { + super(id, mapProvider, name); this.generator = generator; } diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java index 9e570c4..1e4a756 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java @@ -4,7 +4,6 @@ import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.geopoint.Viewport; import cgeo.geocaching.maps.CachesOverlay; -import cgeo.geocaching.maps.MapProviderFactory; import cgeo.geocaching.maps.PositionOverlay; import cgeo.geocaching.maps.ScaleOverlay; import cgeo.geocaching.maps.interfaces.GeneralOverlay; @@ -191,7 +190,7 @@ public class MapsforgeMapView extends MapView implements MapViewImpl { public void setMapSource() { MapGeneratorInternal newMapType = MapGeneratorInternal.MAPNIK; - final MapSource mapSource = MapProviderFactory.getMapSource(Settings.getMapSource()); + final MapSource mapSource = Settings.getMapSource(); if (mapSource instanceof MapsforgeMapSource) { newMapType = ((MapsforgeMapSource) mapSource).getGenerator(); } |
