aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/res/layout/init.xml83
-rw-r--r--main/res/values-de/strings.xml4
-rw-r--r--main/res/values/strings.xml3
-rw-r--r--main/src/cgeo/geocaching/Settings.java89
-rw-r--r--main/src/cgeo/geocaching/SettingsActivity.java59
-rw-r--r--main/src/cgeo/geocaching/maps/AbstractMapProvider.java5
-rw-r--r--main/src/cgeo/geocaching/maps/AbstractMapSource.java14
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java53
-rw-r--r--main/src/cgeo/geocaching/maps/MapProviderFactory.java95
-rw-r--r--main/src/cgeo/geocaching/maps/google/GoogleMapProvider.java51
-rw-r--r--main/src/cgeo/geocaching/maps/interfaces/MapProvider.java10
-rw-r--r--main/src/cgeo/geocaching/maps/interfaces/MapSource.java4
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java108
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapSource.java4
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapView.java3
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();
}