aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/res/layout/gpx.xml5
-rw-r--r--main/src/cgeo/geocaching/SelectMapfileActivity.java55
-rw-r--r--main/src/cgeo/geocaching/files/AbstractFileListActivity.java8
-rw-r--r--main/src/cgeo/geocaching/maps/mapsforge/MapsforgeMapProvider.java29
-rw-r--r--main/src/cgeo/geocaching/settings/SettingsActivity.java18
5 files changed, 95 insertions, 20 deletions
diff --git a/main/res/layout/gpx.xml b/main/res/layout/gpx.xml
index c48c28f..948c265 100644
--- a/main/res/layout/gpx.xml
+++ b/main/res/layout/gpx.xml
@@ -6,6 +6,11 @@
<include layout="@layout/actionbar" />
+ <Button
+ android:id="@+id/select_dir"
+ style="@style/button_full"
+ android:visibility="gone"/>
+
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
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<FileSelectio
super("map");
}
+ @InjectView(R.id.select_dir) protected Button selectDirectory;
+
private String mapFile;
+ private static int REQUEST_DIRECTORY = 1;
+
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
+ Views.inject(this);
+
mapFile = Settings.getMapFile();
+
+ selectDirectory.setOnClickListener(new OnClickListener() {
+
+ @Override
+ public void onClick(View v) {
+ try {
+ final Intent dirChooser = new Intent(FileManagerIntents.ACTION_PICK_DIRECTORY);
+ dirChooser.putExtra(FileManagerIntents.EXTRA_TITLE,
+ getString(R.string.simple_dir_chooser_title));
+ dirChooser.putExtra(FileManagerIntents.EXTRA_BUTTON_TEXT,
+ getString(android.R.string.ok));
+ startActivityForResult(dirChooser, REQUEST_DIRECTORY);
+ } catch (android.content.ActivityNotFoundException ex) {
+ // OI file manager not available
+ final Intent dirChooser = new Intent(SelectMapfileActivity.this, SimpleDirChooser.class);
+ dirChooser.putExtra(Intents.EXTRA_START_DIR, LocalStorage.getStorage().getAbsolutePath());
+ startActivityForResult(dirChooser, REQUEST_DIRECTORY);
+ }
+ }
+ });
+ selectDirectory.setText(getResources().getString(R.string.simple_dir_chooser_title));
+ selectDirectory.setVisibility(View.VISIBLE);
}
@Override
@@ -70,4 +107,22 @@ public class SelectMapfileActivity extends AbstractFileListActivity<FileSelectio
return this;
}
+ @Override
+ protected void onActivityResult(final int requestCode, final int resultCode, final Intent data) {
+ super.onActivityResult(requestCode, resultCode, data);
+ if (resultCode != RESULT_OK) {
+ return;
+ }
+
+ if (requestCode == REQUEST_DIRECTORY) {
+ final String directory = new File(data.getData().getPath()).getAbsolutePath();
+ mapFile = directory;
+ close();
+ }
+ }
+
+ @Override
+ protected boolean requireFiles() {
+ return false;
+ }
}
diff --git a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
index b0aba58..d074bc0 100644
--- a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
+++ b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
@@ -66,7 +66,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> 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<T extends ArrayAdapter<File>> ext
if (searchingThread != null && searchingThread.isAlive()) {
searchingThread.notifyEnd();
}
- if (files.isEmpty()) {
+ if (files.isEmpty() && requireFiles()) {
finish();
}
}
@@ -121,6 +121,10 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
}
+ protected boolean requireFiles() {
+ return true;
+ }
+
protected abstract T getAdapter(List<File> 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<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());
+ File directory = new File(Settings.getMapFileDirectory());
+
+ if (directory.isDirectory()) {
+ try {
+ 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());
+ }
}
}
+ 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();