aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/files
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/files')
-rw-r--r--main/src/cgeo/geocaching/files/AbstractFileListActivity.java28
-rw-r--r--main/src/cgeo/geocaching/files/FileParser.java9
-rw-r--r--main/src/cgeo/geocaching/files/FileTypeDetector.java14
-rw-r--r--main/src/cgeo/geocaching/files/GPXImporter.java49
-rw-r--r--main/src/cgeo/geocaching/files/GPXParser.java114
-rw-r--r--main/src/cgeo/geocaching/files/IFileSelectionView.java2
-rw-r--r--main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java190
-rw-r--r--main/src/cgeo/geocaching/files/LocParser.java2
-rw-r--r--main/src/cgeo/geocaching/files/LocalStorage.java40
-rw-r--r--main/src/cgeo/geocaching/files/SimpleDirChooser.java4
10 files changed, 234 insertions, 218 deletions
diff --git a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
index 2a05cbc..fa84df9 100644
--- a/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
+++ b/main/src/cgeo/geocaching/files/AbstractFileListActivity.java
@@ -38,7 +38,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
private String searchInfo;
@Override
- public void handleMessage(Message msg) {
+ public void handleMessage(final Message msg) {
if (msg.obj != null && waitDialog != null) {
if (searchInfo == null) {
searchInfo = res.getString(R.string.file_searching_in) + " ";
@@ -52,7 +52,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
private String getDefaultFolders() {
final ArrayList<String> names = new ArrayList<>();
- for (File dir : getExistingBaseFolders()) {
+ for (final File dir : getExistingBaseFolders()) {
names.add(dir.getPath());
}
return StringUtils.join(names, '\n');
@@ -62,7 +62,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
final private Handler loadFilesHandler = new Handler() {
@Override
- public void handleMessage(Message msg) {
+ public void handleMessage(final Message msg) {
if (waitDialog != null) {
waitDialog.dismiss();
}
@@ -76,17 +76,17 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
};
@Override
- public void onCreate(Bundle savedInstanceState) {
+ public void onCreate(final Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setTheme();
setContentView(R.layout.gpx);
- Bundle extras = getIntent().getExtras();
+ final Bundle extras = getIntent().getExtras();
if (extras != null) {
listId = extras.getInt(Intents.EXTRA_LIST_ID);
}
- if (listId <= StoredList.TEMPORARY_LIST_ID) {
+ if (listId <= StoredList.TEMPORARY_LIST.id) {
listId = StoredList.STANDARD_LIST_ID;
}
@@ -100,7 +100,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
true,
new DialogInterface.OnCancelListener() {
@Override
- public void onCancel(DialogInterface arg0) {
+ public void onCancel(final DialogInterface arg0) {
if (searchingThread != null && searchingThread.isAlive()) {
searchingThread.notifyEnd();
}
@@ -171,7 +171,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
} else {
Log.w("No external media mounted.");
}
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("AbstractFileListActivity.loadFiles.run", e);
}
@@ -181,7 +181,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
Collections.sort(files, new Comparator<File>() {
@Override
- public int compare(File lhs, File rhs) {
+ public int compare(final File lhs, final File rhs) {
return lhs.getName().compareToIgnoreCase(rhs.getName());
}
});
@@ -189,7 +189,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
loadFilesHandler.sendMessage(Message.obtain(loadFilesHandler));
}
- private void listDirs(List<File> list, List<File> directories, FileListSelector selector, Handler feedbackHandler) {
+ private void listDirs(final List<File> list, final List<File> directories, final FileListSelector selector, final Handler feedbackHandler) {
for (final File dir : directories) {
FileUtils.listDir(list, dir, selector, feedbackHandler);
}
@@ -204,7 +204,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
* @return <code>true</code> if the filename belongs to the list
*/
protected boolean filenameBelongsToList(final String filename) {
- for (String ext : extensions) {
+ for (final String ext : extensions) {
if (StringUtils.endsWithIgnoreCase(filename, ext)) {
return true;
}
@@ -213,7 +213,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
}
protected List<File> getExistingBaseFolders() {
- ArrayList<File> result = new ArrayList<>();
+ final ArrayList<File> result = new ArrayList<>();
for (final File dir : getBaseFolders()) {
if (dir.exists() && dir.isDirectory()) {
result.add(dir);
@@ -245,7 +245,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
boolean shouldEnd = false;
@Override
- public boolean isSelected(File file) {
+ public boolean isSelected(final File file) {
return filenameBelongsToList(file.getName());
}
@@ -254,7 +254,7 @@ public abstract class AbstractFileListActivity<T extends ArrayAdapter<File>> ext
return shouldEnd;
}
- public synchronized void setShouldEnd(boolean shouldEnd) {
+ public synchronized void setShouldEnd(final boolean shouldEnd) {
this.shouldEnd = shouldEnd;
}
}
diff --git a/main/src/cgeo/geocaching/files/FileParser.java b/main/src/cgeo/geocaching/files/FileParser.java
index 973e65f..9521c70 100644
--- a/main/src/cgeo/geocaching/files/FileParser.java
+++ b/main/src/cgeo/geocaching/files/FileParser.java
@@ -4,6 +4,7 @@ import cgeo.geocaching.Geocache;
import cgeo.geocaching.utils.CancellableHandler;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.CharEncoding;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
@@ -43,7 +44,7 @@ public abstract class FileParser {
* @throws ParserException
*/
public Collection<Geocache> parse(final File file, final CancellableHandler progressHandler) throws IOException, ParserException {
- BufferedInputStream stream = new BufferedInputStream(new FileInputStream(file));
+ final BufferedInputStream stream = new BufferedInputStream(new FileInputStream(file));
try {
return parse(stream, progressHandler);
} finally {
@@ -53,8 +54,8 @@ public abstract class FileParser {
protected static StringBuilder readStream(@NonNull final InputStream is, @Nullable final CancellableHandler progressHandler) throws IOException {
final StringBuilder buffer = new StringBuilder();
- ProgressInputStream progressInputStream = new ProgressInputStream(is);
- final BufferedReader input = new BufferedReader(new InputStreamReader(progressInputStream, "UTF-8"));
+ final ProgressInputStream progressInputStream = new ProgressInputStream(is);
+ final BufferedReader input = new BufferedReader(new InputStreamReader(progressInputStream, CharEncoding.UTF_8));
try {
String line;
@@ -77,7 +78,7 @@ public abstract class FileParser {
}
}
- protected static void fixCache(Geocache cache) {
+ protected static void fixCache(final Geocache cache) {
if (cache.getInventory() != null) {
cache.setInventoryItems(cache.getInventory().size());
} else {
diff --git a/main/src/cgeo/geocaching/files/FileTypeDetector.java b/main/src/cgeo/geocaching/files/FileTypeDetector.java
index 389b83a..d1a1892 100644
--- a/main/src/cgeo/geocaching/files/FileTypeDetector.java
+++ b/main/src/cgeo/geocaching/files/FileTypeDetector.java
@@ -3,6 +3,7 @@ package cgeo.geocaching.files;
import cgeo.geocaching.utils.Log;
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.CharEncoding;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
@@ -10,7 +11,6 @@ import android.content.ContentResolver;
import android.net.Uri;
import java.io.BufferedReader;
-import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
@@ -20,7 +20,7 @@ public class FileTypeDetector {
private final ContentResolver contentResolver;
private final Uri uri;
- public FileTypeDetector(Uri uri, ContentResolver contentResolver) {
+ public FileTypeDetector(final Uri uri, final ContentResolver contentResolver) {
this.uri = uri;
this.contentResolver = contentResolver;
}
@@ -34,12 +34,10 @@ public class FileTypeDetector {
if (is == null) {
return FileType.UNKNOWN;
}
- reader = new BufferedReader(new InputStreamReader(is));
+ reader = new BufferedReader(new InputStreamReader(is, CharEncoding.UTF_8));
type = detectHeader(reader);
reader.close();
- } catch (FileNotFoundException e) {
- Log.e("FileTypeDetector", e);
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("FileTypeDetector", e);
} finally {
IOUtils.closeQuietly(reader);
@@ -48,7 +46,7 @@ public class FileTypeDetector {
return type;
}
- private static FileType detectHeader(BufferedReader reader)
+ private static FileType detectHeader(final BufferedReader reader)
throws IOException {
String line = reader.readLine();
if (isZip(line)) {
@@ -68,7 +66,7 @@ public class FileTypeDetector {
return FileType.UNKNOWN;
}
- private static boolean isZip(String line) {
+ private static boolean isZip(final String line) {
return StringUtils.length(line) >= 4
&& StringUtils.startsWith(line, "PK") && line.charAt(2) == 3
&& line.charAt(3) == 4;
diff --git a/main/src/cgeo/geocaching/files/GPXImporter.java b/main/src/cgeo/geocaching/files/GPXImporter.java
index 52f68e1..e7523f3 100644
--- a/main/src/cgeo/geocaching/files/GPXImporter.java
+++ b/main/src/cgeo/geocaching/files/GPXImporter.java
@@ -113,7 +113,7 @@ public class GPXImporter {
fileType = getFileTypeFromMimeType(mimeType);
}
- ImportThread importer = getImporterFromFileType(uri, contentResolver,
+ final ImportThread importer = getImporterFromFileType(uri, contentResolver,
fileType);
if (importer != null) {
@@ -139,14 +139,15 @@ public class GPXImporter {
final String mimeType) {
if (GPX_MIME_TYPES.contains(mimeType)) {
return FileType.GPX;
- } else if (ZIP_MIME_TYPES.contains(mimeType)) {
+ }
+ if (ZIP_MIME_TYPES.contains(mimeType)) {
return FileType.ZIP;
}
- return FileType.UNKNOWN;
+ return FileType.UNKNOWN;
}
- private ImportThread getImporterFromFileType(Uri uri,
- ContentResolver contentResolver, FileType fileType) {
+ private ImportThread getImporterFromFileType(final Uri uri,
+ final ContentResolver contentResolver, final FileType fileType) {
switch (fileType) {
case ZIP:
return new ImportGpxZipAttachmentThread(uri, contentResolver,
@@ -178,7 +179,7 @@ public class GPXImporter {
final Handler importStepHandler;
final CancellableHandler progressHandler;
- protected ImportThread(int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ protected ImportThread(final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
this.listId = listId;
this.importStepHandler = importStepHandler;
this.progressHandler = progressHandler;
@@ -210,7 +211,7 @@ public class GPXImporter {
} catch (final ParserException e) {
Log.i("Importing caches failed - data format error", e);
importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_FINISHED_WITH_ERROR, R.string.gpx_import_error_parser, 0, e.getLocalizedMessage()));
- } catch (final CancellationException e) {
+ } catch (final CancellationException ignored) {
Log.i("Importing caches canceled");
importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_CANCELED));
} catch (final Exception e) {
@@ -244,7 +245,7 @@ public class GPXImporter {
static class ImportLocFileThread extends ImportThread {
private final File file;
- public ImportLocFileThread(final File file, int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ public ImportLocFileThread(final File file, final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
this.file = file;
}
@@ -262,7 +263,7 @@ public class GPXImporter {
private final Uri uri;
private final ContentResolver contentResolver;
- public ImportLocAttachmentThread(Uri uri, ContentResolver contentResolver, int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ public ImportLocAttachmentThread(final Uri uri, final ContentResolver contentResolver, final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
this.uri = uri;
this.contentResolver = contentResolver;
@@ -284,7 +285,7 @@ public class GPXImporter {
static abstract class ImportGpxThread extends ImportThread {
- protected ImportGpxThread(int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ protected ImportGpxThread(final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
}
@@ -293,7 +294,7 @@ public class GPXImporter {
try {
// try to parse cache file as GPX 10
return doImport(new GPX10Parser(listId));
- } catch (final ParserException pe) {
+ } catch (final ParserException ignored) {
// didn't work -> lets try GPX11
return doImport(new GPX11Parser(listId));
}
@@ -305,13 +306,13 @@ public class GPXImporter {
static class ImportGpxFileThread extends ImportGpxThread {
private final File cacheFile;
- public ImportGpxFileThread(final File file, int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ public ImportGpxFileThread(final File file, final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
this.cacheFile = file;
}
@Override
- protected Collection<Geocache> doImport(GPXParser parser) throws IOException, ParserException {
+ protected Collection<Geocache> doImport(final GPXParser parser) throws IOException, ParserException {
Log.i("Import GPX file: " + cacheFile.getAbsolutePath());
importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_READ_FILE, R.string.gpx_import_loading_caches, (int) cacheFile.length()));
Collection<Geocache> caches = parser.parse(cacheFile, progressHandler);
@@ -333,17 +334,21 @@ public class GPXImporter {
private final Uri uri;
private final ContentResolver contentResolver;
- public ImportGpxAttachmentThread(Uri uri, ContentResolver contentResolver, int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ public ImportGpxAttachmentThread(final Uri uri, final ContentResolver contentResolver, final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
this.uri = uri;
this.contentResolver = contentResolver;
}
@Override
- protected Collection<Geocache> doImport(GPXParser parser) throws IOException, ParserException {
+ protected Collection<Geocache> doImport(final GPXParser parser) throws IOException, ParserException {
Log.i("Import GPX from uri: " + uri);
- importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_READ_FILE, R.string.gpx_import_loading_caches, -1));
final InputStream is = contentResolver.openInputStream(uri);
+ int streamSize = is.available();
+ if (streamSize == 0) {
+ streamSize = -1;
+ }
+ importStepHandler.sendMessage(importStepHandler.obtainMessage(IMPORT_STEP_READ_FILE, R.string.gpx_import_loading_caches, streamSize));
try {
return parser.parse(is, progressHandler);
} finally {
@@ -354,12 +359,12 @@ public class GPXImporter {
static abstract class ImportGpxZipThread extends ImportGpxThread {
- protected ImportGpxZipThread(int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ protected ImportGpxZipThread(final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
}
@Override
- protected Collection<Geocache> doImport(GPXParser parser) throws IOException, ParserException {
+ protected Collection<Geocache> doImport(final GPXParser parser) throws IOException, ParserException {
Collection<Geocache> caches = Collections.emptySet();
// can't assume that GPX file comes before waypoint file in zip -> so we need two passes
// 1. parse GPX files
@@ -403,7 +408,7 @@ public class GPXImporter {
static class ImportGpxZipFileThread extends ImportGpxZipThread {
private final File cacheFile;
- public ImportGpxZipFileThread(final File file, int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ public ImportGpxZipFileThread(final File file, final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
this.cacheFile = file;
Log.i("Import zipped GPX: " + file);
@@ -419,7 +424,7 @@ public class GPXImporter {
private final Uri uri;
private final ContentResolver contentResolver;
- public ImportGpxZipAttachmentThread(Uri uri, ContentResolver contentResolver, int listId, Handler importStepHandler, CancellableHandler progressHandler) {
+ public ImportGpxZipAttachmentThread(final Uri uri, final ContentResolver contentResolver, final int listId, final Handler importStepHandler, final CancellableHandler progressHandler) {
super(listId, importStepHandler, progressHandler);
this.uri = uri;
this.contentResolver = contentResolver;
@@ -434,14 +439,14 @@ public class GPXImporter {
final private CancellableHandler progressHandler = new CancellableHandler() {
@Override
- public void handleRegularMessage(Message msg) {
+ public void handleRegularMessage(final Message msg) {
progress.setProgress(msg.arg1);
}
};
final private Handler importStepHandler = new Handler() {
@Override
- public void handleMessage(Message msg) {
+ public void handleMessage(final Message msg) {
switch (msg.what) {
case IMPORT_STEP_START:
final Message cancelMessage = importStepHandler.obtainMessage(IMPORT_STEP_CANCEL);
diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java
index 89ee887..bedee43 100644
--- a/main/src/cgeo/geocaching/files/GPXParser.java
+++ b/main/src/cgeo/geocaching/files/GPXParser.java
@@ -8,6 +8,8 @@ import cgeo.geocaching.R;
import cgeo.geocaching.Trackable;
import cgeo.geocaching.Waypoint;
import cgeo.geocaching.connector.ConnectorFactory;
+import cgeo.geocaching.connector.IConnector;
+import cgeo.geocaching.connector.capability.ILogin;
import cgeo.geocaching.enumerations.CacheSize;
import cgeo.geocaching.enumerations.CacheType;
import cgeo.geocaching.enumerations.LoadFlags;
@@ -120,12 +122,12 @@ public abstract class GPXParser extends FileParser {
private final class UserDataListener implements EndTextElementListener {
private final int index;
- public UserDataListener(int index) {
+ public UserDataListener(final int index) {
this.index = index;
}
@Override
- public void end(String user) {
+ public void end(final String user) {
userData[index] = validate(user);
}
}
@@ -226,7 +228,7 @@ public abstract class GPXParser extends FileParser {
String stringName;
try {
stringName = CgeoApplication.getInstance().getResources().getResourceName(stringId);
- } catch (final NullPointerException e) {
+ } catch (final NullPointerException ignored) {
return null;
}
if (stringName == null) {
@@ -250,13 +252,13 @@ public abstract class GPXParser extends FileParser {
}
}
- protected GPXParser(int listIdIn, String namespaceIn, String versionIn) {
+ protected GPXParser(final int listIdIn, final String namespaceIn, final String versionIn) {
listId = listIdIn;
namespace = namespaceIn;
version = versionIn;
}
- static Date parseDate(String inputUntrimmed) throws ParseException {
+ static Date parseDate(final String inputUntrimmed) throws ParseException {
String input = inputUntrimmed.trim();
// remove milliseconds to reduce number of needed patterns
final MatcherWrapper matcher = new MatcherWrapper(PATTERN_MILLISECONDS, input);
@@ -280,7 +282,7 @@ public abstract class GPXParser extends FileParser {
root.getChild(namespace, "url").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
scriptUrl = body;
}
});
@@ -289,7 +291,7 @@ public abstract class GPXParser extends FileParser {
waypoint.setStartElementListener(new StartElementListener() {
@Override
- public void start(Attributes attrs) {
+ public void start(final Attributes attrs) {
try {
if (attrs.getIndex("lat") > -1 && attrs.getIndex("lon") > -1) {
final String latitude = attrs.getValue("lat");
@@ -301,7 +303,7 @@ public abstract class GPXParser extends FileParser {
}
}
} catch (final NumberFormatException e) {
- Log.w("Failed to parse waypoint's latitude and/or longitude.");
+ Log.w("Failed to parse waypoint's latitude and/or longitude", e);
}
}
});
@@ -399,7 +401,7 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "time").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
try {
cache.setHidden(parseDate(body));
} catch (final Exception e) {
@@ -412,7 +414,7 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "name").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
name = body;
String content = body.trim();
@@ -431,7 +433,7 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "desc").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
desc = body;
cache.setShortDescription(validate(body));
@@ -442,7 +444,7 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "cmt").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
cmt = body;
cache.setDescription(validate(body));
@@ -453,8 +455,8 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "type").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
- final String[] content = body.split("\\|");
+ public void end(final String body) {
+ final String[] content = StringUtils.split(body, '|');
if (content.length > 0) {
type = content[0].toLowerCase(Locale.US).trim();
}
@@ -477,7 +479,7 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "url").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String url) {
+ public void end(final String url) {
final MatcherWrapper matcher = new MatcherWrapper(PATTERN_GUID, url);
if (matcher.matches()) {
final String guid = matcher.group(1);
@@ -497,7 +499,7 @@ public abstract class GPXParser extends FileParser {
waypoint.getChild(namespace, "urlname").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String urlName) {
+ public void end(final String urlName) {
if (cache.getName().equals(cache.getGeocode()) && StringUtils.startsWith(cache.getGeocode(), "WM")) {
cache.setName(StringUtils.trim(urlName));
}
@@ -520,7 +522,7 @@ public abstract class GPXParser extends FileParser {
gcCache.setStartElementListener(new StartElementListener() {
@Override
- public void start(Attributes attrs) {
+ public void start(final Attributes attrs) {
try {
if (attrs.getIndex("id") > -1) {
cache.setCacheId(attrs.getValue("id"));
@@ -532,7 +534,7 @@ public abstract class GPXParser extends FileParser {
cache.setDisabled(!attrs.getValue("available").equalsIgnoreCase("true"));
}
} catch (final RuntimeException e) {
- Log.w("Failed to parse cache attributes.");
+ Log.w("Failed to parse cache attributes", e);
}
}
});
@@ -541,7 +543,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "name").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String cacheName) {
+ public void end(final String cacheName) {
cache.setName(validate(cacheName));
}
});
@@ -550,7 +552,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "owner").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String ownerUserId) {
+ public void end(final String ownerUserId) {
cache.setOwnerUserId(validate(ownerUserId));
}
});
@@ -559,7 +561,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "placed_by").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String ownerDisplayName) {
+ public void end(final String ownerDisplayName) {
cache.setOwnerDisplayName(validate(ownerDisplayName));
}
});
@@ -568,8 +570,13 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "type").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
- cache.setType(CacheType.getByPattern(validate(body)));
+ public void end(final String bodyIn) {
+ String body = validate(bodyIn);
+ // lab caches wrongly contain a prefix in the type
+ if (body.startsWith("Geocache|")) {
+ body = StringUtils.substringAfter(body, "Geocache|").trim();
+ }
+ cache.setType(CacheType.getByPattern(body));
}
});
@@ -577,7 +584,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "container").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
cache.setSize(CacheSize.getById(validate(body)));
}
});
@@ -597,7 +604,7 @@ public abstract class GPXParser extends FileParser {
gcAttribute.setStartElementListener(new StartElementListener() {
@Override
- public void start(Attributes attrs) {
+ public void start(final Attributes attrs) {
try {
if (attrs.getIndex("id") > -1 && attrs.getIndex("inc") > -1) {
final int attributeId = Integer.parseInt(attrs.getValue("id"));
@@ -607,7 +614,7 @@ public abstract class GPXParser extends FileParser {
cache.getAttributes().add(internalId);
}
}
- } catch (final NumberFormatException e) {
+ } catch (final NumberFormatException ignored) {
// nothing
}
}
@@ -617,7 +624,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "difficulty").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
try {
cache.setDifficulty(Float.parseFloat(body));
} catch (final NumberFormatException e) {
@@ -630,7 +637,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "terrain").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
try {
cache.setTerrain(Float.parseFloat(body));
} catch (final NumberFormatException e) {
@@ -643,7 +650,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "country").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String country) {
+ public void end(final String country) {
if (StringUtils.isBlank(cache.getLocation())) {
cache.setLocation(validate(country));
} else {
@@ -656,7 +663,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "state").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String state) {
+ public void end(final String state) {
final String trimmedState = state.trim();
if (StringUtils.isNotEmpty(trimmedState)) { // state can be completely empty
if (StringUtils.isBlank(cache.getLocation())) {
@@ -672,7 +679,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "encoded_hints").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String encoded) {
+ public void end(final String encoded) {
cache.setHint(validate(encoded));
}
});
@@ -680,7 +687,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "short_description").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String shortDesc) {
+ public void end(final String shortDesc) {
cache.setShortDescription(validate(shortDesc));
}
});
@@ -688,7 +695,7 @@ public abstract class GPXParser extends FileParser {
gcCache.getChild(nsGC, "long_description").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String desc) {
+ public void end(final String desc) {
cache.setDescription(validate(desc));
}
});
@@ -703,14 +710,14 @@ public abstract class GPXParser extends FileParser {
gcTB.setStartElementListener(new StartElementListener() {
@Override
- public void start(Attributes attrs) {
+ public void start(final Attributes attrs) {
trackable = new Trackable();
try {
if (attrs.getIndex("ref") > -1) {
trackable.setGeocode(attrs.getValue("ref"));
}
- } catch (final RuntimeException e) {
+ } catch (final RuntimeException ignored) {
// nothing
}
}
@@ -733,7 +740,7 @@ public abstract class GPXParser extends FileParser {
gcTB.getChild(nsGC, "name").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String tbName) {
+ public void end(final String tbName) {
trackable.setName(validate(tbName));
}
});
@@ -747,14 +754,14 @@ public abstract class GPXParser extends FileParser {
gcLog.setStartElementListener(new StartElementListener() {
@Override
- public void start(Attributes attrs) {
+ public void start(final Attributes attrs) {
log = new LogEntry("", 0, LogType.UNKNOWN, "");
try {
if (attrs.getIndex("id") > -1) {
log.id = Integer.parseInt(attrs.getValue("id"));
}
- } catch (final NumberFormatException e) {
+ } catch (final NumberFormatException ignored) {
// nothing
}
}
@@ -765,6 +772,13 @@ public abstract class GPXParser extends FileParser {
@Override
public void end() {
if (log.type != LogType.UNKNOWN) {
+ if (log.type.isFoundLog() && StringUtils.isNotBlank(log.author)) {
+ final IConnector connector = ConnectorFactory.getConnector(cache);
+ if (connector instanceof ILogin && StringUtils.equals(log.author, ((ILogin) connector).getUserName())) {
+ cache.setFound(true);
+ cache.setVisitedDate(log.date);
+ }
+ }
logs.add(log);
}
}
@@ -774,7 +788,7 @@ public abstract class GPXParser extends FileParser {
gcLog.getChild(nsGC, "date").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
try {
log.date = parseDate(body).getTime();
} catch (final Exception e) {
@@ -787,7 +801,7 @@ public abstract class GPXParser extends FileParser {
gcLog.getChild(nsGC, "type").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
final String logType = validate(body);
log.type = LogType.getByType(logType);
}
@@ -797,7 +811,7 @@ public abstract class GPXParser extends FileParser {
gcLog.getChild(nsGC, "finder").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String finderName) {
+ public void end(final String finderName) {
log.author = validate(finderName);
}
});
@@ -806,7 +820,7 @@ public abstract class GPXParser extends FileParser {
gcLog.getChild(nsGC, "text").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String logText) {
+ public void end(final String logText) {
log.log = validate(logText);
}
});
@@ -814,7 +828,7 @@ public abstract class GPXParser extends FileParser {
try {
progressStream = new ProgressInputStream(stream);
- BufferedReader reader = new BufferedReader(new InputStreamReader(progressStream, CharEncoding.UTF_8));
+ final BufferedReader reader = new BufferedReader(new InputStreamReader(progressStream, CharEncoding.UTF_8));
Xml.parse(new InvalidXMLCharacterFilterReader(reader), root.getContentHandler());
return DataStore.loadCaches(result, EnumSet.of(LoadFlag.DB_MINIMAL));
} catch (final SAXException e) {
@@ -833,7 +847,7 @@ public abstract class GPXParser extends FileParser {
gsak.getChild(gsakNamespace, "Watch").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String watchList) {
+ public void end(final String watchList) {
cache.setOnWatchlist(Boolean.valueOf(watchList.trim()));
}
});
@@ -847,7 +861,7 @@ public abstract class GPXParser extends FileParser {
gsak.getChild(gsakNamespace, "Parent").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String body) {
+ public void end(final String body) {
parentCacheCode = body;
}
});
@@ -855,7 +869,7 @@ public abstract class GPXParser extends FileParser {
gsak.getChild(gsakNamespace, "FavPoints").setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String favoritePoints) {
+ public void end(final String favoritePoints) {
try {
cache.setFavoritePoints(Integer.parseInt(favoritePoints));
}
@@ -894,7 +908,7 @@ public abstract class GPXParser extends FileParser {
cgeoVisited.setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String visited) {
+ public void end(final String visited) {
wptVisited = Boolean.valueOf(visited.trim());
}
});
@@ -904,7 +918,7 @@ public abstract class GPXParser extends FileParser {
cgeoUserDefined.setEndTextElementListener(new EndTextElementListener() {
@Override
- public void end(String userDefined) {
+ public void end(final String userDefined) {
wptUserDefined = Boolean.valueOf(userDefined.trim());
}
});
@@ -917,7 +931,7 @@ public abstract class GPXParser extends FileParser {
* @param cache
* currently imported cache
*/
- protected void afterParsing(Geocache cache) {
+ protected void afterParsing(final Geocache cache) {
// can be overridden by sub classes
}
@@ -930,7 +944,7 @@ public abstract class GPXParser extends FileParser {
*/
protected abstract Element getCacheParent(Element waypoint);
- protected static String validate(String input) {
+ protected static String validate(final String input) {
if ("nil".equalsIgnoreCase(input)) {
return "";
}
diff --git a/main/src/cgeo/geocaching/files/IFileSelectionView.java b/main/src/cgeo/geocaching/files/IFileSelectionView.java
index 5bbc1b2..0407ee4 100644
--- a/main/src/cgeo/geocaching/files/IFileSelectionView.java
+++ b/main/src/cgeo/geocaching/files/IFileSelectionView.java
@@ -8,7 +8,7 @@ public interface IFileSelectionView {
String getCurrentFile();
- void setCurrentFile(String string);
+ void setCurrentFile(final String name);
void close();
diff --git a/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java b/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java
index a7a3e1b..8a089d2 100644
--- a/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java
+++ b/main/src/cgeo/geocaching/files/InvalidXMLCharacterFilterReader.java
@@ -1,98 +1,94 @@
-package cgeo.geocaching.files;
-
-import org.apache.commons.lang3.StringUtils;
-
-import java.io.FilterReader;
-import java.io.IOException;
-import java.io.Reader;
-
-/**
- * Filter reader which can filter out invalid XML characters and character references.
- *
- */
-public class InvalidXMLCharacterFilterReader extends FilterReader
-{
-
- public InvalidXMLCharacterFilterReader(Reader in) {
- super(in);
- }
-
- /**
- * Every overload of {@link Reader#read()} method delegates to this one so
- * it is enough to override only this one. <br />
- * To skip invalid characters this method shifts only valid chars to left
- * and returns decreased value of the original read method. So after last
- * valid character there will be some unused chars in the buffer.
- *
- * @return Number of read valid characters or <code>-1</code> if end of the
- * underling reader was reached.
- */
- @Override
- public int read(char[] cbuf, int off, int len) throws IOException {
- int read = super.read(cbuf, off, len);
- // check for end
- if (read == -1) {
- return -1;
- }
- // target position
- int pos = off - 1;
-
- int entityStart = -1;
- for (int readPos = off; readPos < off + read; readPos++) {
- boolean useChar = true;
- switch (cbuf[readPos]) {
- case '&':
- pos++;
- entityStart = readPos;
- break;
- case ';':
- pos++;
- if (entityStart >= 0) {
- int entityLength = readPos - entityStart + 1;
- if (entityLength <= 5) {
- String entity = new String(cbuf, entityStart, entityLength);
- if (StringUtils.startsWith(entity, "&#")) {
- String numberString = StringUtils.substringBetween(entity, "&#", ";");
- final int value;
- if (StringUtils.startsWith(numberString, "x")) {
- value = Integer.parseInt(numberString.substring(1), 16);
- }
- else {
- value = Integer.parseInt(numberString);
- }
- if (!isValidXMLChar((char) value)) {
- pos -= entityLength;
- useChar = false;
- }
- }
- }
- }
- break;
- default:
- if (isValidXMLChar(cbuf[readPos])) {
- pos++;
- } else {
- continue;
- }
- }
- // copy, and skip unwanted characters
- if (pos < readPos && useChar) {
- cbuf[pos] = cbuf[readPos];
- }
- }
- return pos - off + 1;
- }
-
- private static boolean isValidXMLChar(char c) {
- if ((c == 0x9) ||
- (c == 0xA) ||
- (c == 0xD) ||
- ((c >= 0x20) && (c <= 0xD7FF)) ||
- ((c >= 0xE000) && (c <= 0xFFFD)) ||
- ((c >= 0x10000) && (c <= 0x10FFFF)))
- {
- return true;
- }
- return false;
- }
+package cgeo.geocaching.files;
+
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.FilterReader;
+import java.io.IOException;
+import java.io.Reader;
+
+/**
+ * Filter reader which can filter out invalid XML characters and character references.
+ *
+ */
+public class InvalidXMLCharacterFilterReader extends FilterReader
+{
+
+ public InvalidXMLCharacterFilterReader(Reader in) {
+ super(in);
+ }
+
+ /**
+ * Every overload of {@link Reader#read()} method delegates to this one so
+ * it is enough to override only this one. <br />
+ * To skip invalid characters this method shifts only valid chars to left
+ * and returns decreased value of the original read method. So after last
+ * valid character there will be some unused chars in the buffer.
+ *
+ * @return Number of read valid characters or <code>-1</code> if end of the
+ * underling reader was reached.
+ */
+ @Override
+ public int read(char[] cbuf, int off, int len) throws IOException {
+ int read = super.read(cbuf, off, len);
+ // check for end
+ if (read == -1) {
+ return -1;
+ }
+ // target position
+ int pos = off - 1;
+
+ int entityStart = -1;
+ for (int readPos = off; readPos < off + read; readPos++) {
+ boolean useChar = true;
+ switch (cbuf[readPos]) {
+ case '&':
+ pos++;
+ entityStart = readPos;
+ break;
+ case ';':
+ pos++;
+ if (entityStart >= 0) {
+ int entityLength = readPos - entityStart + 1;
+ if (entityLength <= 5) {
+ String entity = new String(cbuf, entityStart, entityLength);
+ if (StringUtils.startsWith(entity, "&#")) {
+ String numberString = StringUtils.substringBetween(entity, "&#", ";");
+ final int value;
+ if (StringUtils.startsWith(numberString, "x")) {
+ value = Integer.parseInt(numberString.substring(1), 16);
+ }
+ else {
+ value = Integer.parseInt(numberString);
+ }
+ if (!isValidXMLChar((char) value)) {
+ pos -= entityLength;
+ useChar = false;
+ }
+ }
+ }
+ }
+ break;
+ default:
+ if (isValidXMLChar(cbuf[readPos])) {
+ pos++;
+ } else {
+ continue;
+ }
+ }
+ // copy, and skip unwanted characters
+ if (pos < readPos && useChar) {
+ cbuf[pos] = cbuf[readPos];
+ }
+ }
+ return pos - off + 1;
+ }
+
+ private static boolean isValidXMLChar(char c) {
+ return (c == 0x9) ||
+ (c == 0xA) ||
+ (c == 0xD) ||
+ ((c >= 0x20) && (c <= 0xD7FF)) ||
+ ((c >= 0xE000) && (c <= 0xFFFD)) ||
+ ((c >= 0x10000) && (c <= 0x10FFFF));
+ }
} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/files/LocParser.java b/main/src/cgeo/geocaching/files/LocParser.java
index 2871d77..13f8cca 100644
--- a/main/src/cgeo/geocaching/files/LocParser.java
+++ b/main/src/cgeo/geocaching/files/LocParser.java
@@ -88,7 +88,7 @@ public final class LocParser extends FileParser {
}
// >> premium only
- final String[] points = fileContent.split("<waypoint>");
+ final String[] points = StringUtils.splitByWholeSeparator(fileContent, "<waypoint>");
// parse coordinates
for (String pointString : points) {
diff --git a/main/src/cgeo/geocaching/files/LocalStorage.java b/main/src/cgeo/geocaching/files/LocalStorage.java
index 63a1844..8896833 100644
--- a/main/src/cgeo/geocaching/files/LocalStorage.java
+++ b/main/src/cgeo/geocaching/files/LocalStorage.java
@@ -7,7 +7,9 @@ import cgeo.geocaching.utils.Log;
import ch.boye.httpclientandroidlib.Header;
import ch.boye.httpclientandroidlib.HttpResponse;
+
import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.CharEncoding;
import org.apache.commons.lang3.StringUtils;
import org.eclipse.jdt.annotation.NonNull;
import org.eclipse.jdt.annotation.Nullable;
@@ -69,7 +71,7 @@ public final class LocalStorage {
return getStorageSpecific(true);
}
- private static File getStorageSpecific(boolean secondary) {
+ private static File getStorageSpecific(final boolean secondary) {
return Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED) ^ secondary ?
getExternalStorageBase() :
new File(getInternalStorageBase(), LocalStorage.cache);
@@ -202,7 +204,7 @@ public final class LocalStorage {
saveHeader(HEADER_ETAG, saved ? response : null, targetFile);
saveHeader(HEADER_LAST_MODIFIED, saved ? response : null, targetFile);
return saved;
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("LocalStorage.saveEntityToFile", e);
}
@@ -242,7 +244,7 @@ public final class LocalStorage {
public static String getSavedHeader(final File baseFile, final String name) {
try {
final File file = filenameForHeader(baseFile, name);
- final Reader f = new InputStreamReader(new FileInputStream(file), "UTF-8");
+ final Reader f = new InputStreamReader(new FileInputStream(file), CharEncoding.UTF_8);
try {
// No header will be more than 256 bytes
final char[] value = new char[256];
@@ -251,7 +253,7 @@ public final class LocalStorage {
} finally {
f.close();
}
- } catch (final FileNotFoundException e) {
+ } catch (final FileNotFoundException ignored) {
// Do nothing, the file does not exist
} catch (final Exception e) {
Log.w("could not read saved header " + name + " for " + baseFile, e);
@@ -291,7 +293,7 @@ public final class LocalStorage {
} finally {
IOUtils.closeQuietly(inputStream);
}
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("LocalStorage.saveToFile", e);
FileUtils.deleteIgnoringFailure(targetFile);
}
@@ -321,10 +323,10 @@ public final class LocalStorage {
// close here already to catch any issue with closing
input.close();
output.close();
- } catch (FileNotFoundException e) {
+ } catch (final FileNotFoundException e) {
Log.e("LocalStorage.copy: could not copy file", e);
return false;
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("LocalStorage.copy: could not copy file", e);
return false;
} finally {
@@ -345,7 +347,7 @@ public final class LocalStorage {
}
// Flushing is only necessary if the stream is not immediately closed afterwards.
// We rely on all callers to do that correctly outside of this method
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("LocalStorage.copy: error when copying data", e);
return false;
}
@@ -398,7 +400,7 @@ public final class LocalStorage {
if (!FileUtils.delete(file)) {
Log.w("LocalStorage.deleteFilesPrefix: Can't delete file " + file.getName());
}
- } catch (Exception e) {
+ } catch (final Exception e) {
Log.e("LocalStorage.deleteFilesPrefix", e);
}
}
@@ -417,7 +419,7 @@ public final class LocalStorage {
public static File[] getFilesWithPrefix(final String geocode, final String filenamePrefix) {
final FilenameFilter filter = new FilenameFilter() {
@Override
- public boolean accept(File dir, String filename) {
+ public boolean accept(final File dir, final String filename) {
return filename.startsWith(filenamePrefix);
}
};
@@ -430,24 +432,24 @@ public final class LocalStorage {
*/
public static List<File> getStorages() {
- String extStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
- List<File> storages = new ArrayList<>();
+ final String extStorage = Environment.getExternalStorageDirectory().getAbsolutePath();
+ final List<File> storages = new ArrayList<>();
storages.add(new File(extStorage));
- File file = new File(FILE_SYSTEM_TABLE_PATH);
+ final File file = new File(FILE_SYSTEM_TABLE_PATH);
if (file.canRead()) {
Reader fr = null;
BufferedReader br = null;
try {
- fr = new InputStreamReader(new FileInputStream(file), "UTF-8");
+ fr = new InputStreamReader(new FileInputStream(file), CharEncoding.UTF_8);
br = new BufferedReader(fr);
String s = br.readLine();
while (s != null) {
if (s.startsWith("dev_mount")) {
- String[] tokens = StringUtils.split(s);
+ final String[] tokens = StringUtils.split(s);
if (tokens.length >= 3) {
- String path = tokens[2]; // mountpoint
+ final String path = tokens[2]; // mountpoint
if (!extStorage.equals(path)) {
- File directory = new File(path);
+ final File directory = new File(path);
if (directory.exists() && directory.isDirectory()) {
storages.add(directory);
}
@@ -456,9 +458,9 @@ public final class LocalStorage {
}
s = br.readLine();
}
- } catch (IOException e) {
+ } catch (final IOException e) {
Log.e("Could not get additional mount points for user content. " +
- "Proceeding with external storage only (" + extStorage + ")");
+ "Proceeding with external storage only (" + extStorage + ")", e);
} finally {
IOUtils.closeQuietly(fr);
IOUtils.closeQuietly(br);
diff --git a/main/src/cgeo/geocaching/files/SimpleDirChooser.java b/main/src/cgeo/geocaching/files/SimpleDirChooser.java
index 2aadf16..687aaa0 100644
--- a/main/src/cgeo/geocaching/files/SimpleDirChooser.java
+++ b/main/src/cgeo/geocaching/files/SimpleDirChooser.java
@@ -142,7 +142,7 @@ public class SimpleDirChooser extends AbstractListActivity {
for (final File currentDir : dirs) {
listDirs.add(new Option(currentDir.getName(), currentDir.getAbsolutePath(), currentDir.canWrite()));
}
- } catch (final RuntimeException e) {
+ } catch (final RuntimeException ignored) {
}
Collections.sort(listDirs, Option.NAME_COMPARATOR);
if (dir.getParent() != null) {
@@ -263,7 +263,7 @@ public class SimpleDirChooser extends AbstractListActivity {
private boolean checked = false;
private boolean writeable = false;
- private static Comparator<Option> NAME_COMPARATOR = new Comparator<SimpleDirChooser.Option>() {
+ private final static Comparator<Option> NAME_COMPARATOR = new Comparator<SimpleDirChooser.Option>() {
@Override
public int compare(final Option lhs, final Option rhs) {