From e6606ad7690c84c9ee03c9195859382e9ae1de6b Mon Sep 17 00:00:00 2001 From: rsudev Date: Fri, 18 Oct 2013 12:13:35 +0200 Subject: Fixes part of #2976, allow to manually select map directory Add a directory selection button to map selection. Fix issues with updating map sources preference after selecting a map file. Fix issues with listing map source if only a directory was defined. --- .../src/cgeo/geocaching/SelectMapfileActivity.java | 55 ++++++++++++++++++++++ .../geocaching/files/AbstractFileListActivity.java | 8 +++- .../maps/mapsforge/MapsforgeMapProvider.java | 29 ++++++------ .../cgeo/geocaching/settings/SettingsActivity.java | 18 +++++-- 4 files changed, 90 insertions(+), 20 deletions(-) (limited to 'main/src/cgeo/geocaching') diff --git a/main/src/cgeo/geocaching/SelectMapfileActivity.java b/main/src/cgeo/geocaching/SelectMapfileActivity.java index 8b50c1f..9d86fa5 100644 --- a/main/src/cgeo/geocaching/SelectMapfileActivity.java +++ b/main/src/cgeo/geocaching/SelectMapfileActivity.java @@ -1,14 +1,23 @@ package cgeo.geocaching; +import butterknife.InjectView; +import butterknife.Views; + import cgeo.geocaching.files.AbstractFileListActivity; import cgeo.geocaching.files.IFileSelectionView; import cgeo.geocaching.files.LocalStorage; +import cgeo.geocaching.files.SimpleDirChooser; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.FileSelectionListAdapter; +import org.openintents.intents.FileManagerIntents; + import android.content.Context; import android.content.Intent; import android.os.Bundle; +import android.view.View; +import android.view.View.OnClickListener; +import android.widget.Button; import java.io.File; import java.util.ArrayList; @@ -20,12 +29,40 @@ public class SelectMapfileActivity extends AbstractFileListActivity> ext if (waitDialog != null) { waitDialog.dismiss(); } - if (CollectionUtils.isEmpty(files)) { + if (CollectionUtils.isEmpty(files) && requireFiles()) { showToast(res.getString(R.string.file_list_no_files)); finish(); } else if (adapter != null) { @@ -104,7 +104,7 @@ public abstract class AbstractFileListActivity> ext if (searchingThread != null && searchingThread.isAlive()) { searchingThread.notifyEnd(); } - if (files.isEmpty()) { + if (files.isEmpty() && requireFiles()) { finish(); } } @@ -121,6 +121,10 @@ public abstract class AbstractFileListActivity> ext } + protected boolean requireFiles() { + return true; + } + protected abstract T getAdapter(List files); private void setAdapter() { diff --git a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java index d099b79..b1f15d2 100644 --- a/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java +++ b/main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java @@ -50,25 +50,24 @@ public final class MapsforgeMapProvider extends AbstractMapProvider { } public static List getOfflineMaps() { - final String mapFile = Settings.getMapFile(); - if (StringUtils.isEmpty(mapFile)) { - return Collections.emptyList(); - } - try { - File directory = new File(mapFile).getParentFile(); - ArrayList mapFileList = new ArrayList(); - for (File file : directory.listFiles()) { - if (file.getName().endsWith(".map")) { - if (MapsforgeMapProvider.isValidMapFile(file.getAbsolutePath())) { - mapFileList.add(file.getAbsolutePath()); + File directory = new File(Settings.getMapFileDirectory()); + + if (directory.isDirectory()) { + try { + ArrayList mapFileList = new ArrayList(); + for (File file : directory.listFiles()) { + if (file.getName().endsWith(".map")) { + if (MapsforgeMapProvider.isValidMapFile(file.getAbsolutePath())) { + mapFileList.add(file.getAbsolutePath()); + } } } + Collections.sort(mapFileList, String.CASE_INSENSITIVE_ORDER); + return mapFileList; + } catch (Exception e) { + Log.e("MapsforgeMapProvider.getOfflineMaps: ", e); } - Collections.sort(mapFileList, String.CASE_INSENSITIVE_ORDER); - return mapFileList; - } catch (Exception e) { - Log.e("MapsforgeMapProvider.getOfflineMaps: ", e); } return Collections.emptyList(); } diff --git a/main/src/cgeo/geocaching/settings/SettingsActivity.java b/main/src/cgeo/geocaching/settings/SettingsActivity.java index d2c73f3..38b9932 100644 --- a/main/src/cgeo/geocaching/settings/SettingsActivity.java +++ b/main/src/cgeo/geocaching/settings/SettingsActivity.java @@ -440,9 +440,21 @@ public class SettingsActivity extends PreferenceActivity { case R.string.pref_mapDirectory: if (data.hasExtra(Intents.EXTRA_MAP_FILE)) { final String mapFile = data.getStringExtra(Intents.EXTRA_MAP_FILE); - Settings.setMapFile(mapFile); - if (!Settings.isValidMapFile(Settings.getMapFile())) { - ActivityMixin.showToast(this, R.string.warn_invalid_mapfile); + File file = new File(mapFile); + if (!file.isDirectory()) { + Settings.setMapFile(mapFile); + if (!Settings.isValidMapFile(Settings.getMapFile())) { + ActivityMixin.showToast(this, R.string.warn_invalid_mapfile); + } else { + // Ensure map source preference is updated accordingly. + // TODO: There should be a better way to find and select the map source for a map file + Integer mapSourceId = mapFile.hashCode(); + ListPreference mapSource = (ListPreference) getPreference(R.string.pref_mapsource); + mapSource.setValue(mapSourceId.toString()); + VALUE_CHANGE_LISTENER.onPreferenceChange(mapSource, mapSourceId); + } + } else { + Settings.setMapFileDirectory(mapFile); } } initMapSourcePreference(); -- cgit v1.1