Skip to content

Commit 07138f3

Browse files
committed
Mapsforge themes compatibility improvements opensciencemap#100, fix #392
1 parent eddfa5a commit 07138f3

File tree

6 files changed

+42
-45
lines changed

6 files changed

+42
-45
lines changed

vtm-android-example/src/org/oscim/android/filepicker/ValidRenderTheme.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
/*
22
* Copyright 2010, 2011, 2012 mapsforge.org
3-
* Copyright 2016 devemux86
3+
* Copyright 2016-2017 devemux86
44
* Copyright 2017 Longri
55
*
66
* This program is free software: you can redistribute it and/or modify it under the
@@ -27,7 +27,6 @@
2727
import org.xml.sax.helpers.DefaultHandler;
2828

2929
import java.io.File;
30-
import java.io.FileInputStream;
3130

3231
import javax.xml.parsers.SAXParserFactory;
3332

@@ -43,7 +42,7 @@ public boolean accept(File file) {
4342
try {
4443
ThemeFile theme = new ExternalRenderTheme(file.getAbsolutePath());
4544
DefaultHandler renderThemeHandler;
46-
if (ThemeUtils.isMapsforgeTheme(new FileInputStream(file)))
45+
if (ThemeUtils.isMapsforgeTheme(theme))
4746
renderThemeHandler = new XmlMapsforgeThemeBuilder(theme);
4847
else
4948
renderThemeHandler = new XmlThemeBuilder(theme);

vtm-android-example/src/org/oscim/android/test/MapsforgeStyleActivity.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright 2016 devemux86
2+
* Copyright 2016-2017 devemux86
33
*
44
* This program is free software: you can redistribute it and/or modify it under the
55
* terms of the GNU Lesser General Public License as published by the Free Software
@@ -58,7 +58,7 @@ public boolean onOptionsItemSelected(MenuItem item) {
5858

5959
@Override
6060
protected void loadTheme(final String styleId) {
61-
mMap.setTheme(new AssetsRenderTheme(this, "", "vtm/stylemenu.xml", new XmlRenderThemeMenuCallback() {
61+
mMap.setTheme(new AssetsRenderTheme(getAssets(), "", "vtm/stylemenu.xml", new XmlRenderThemeMenuCallback() {
6262
@Override
6363
public Set<String> getCategories(XmlRenderThemeStyleMenu renderThemeStyleMenu) {
6464
// Use the selected style or the default

vtm-android/src/org/oscim/android/theme/AssetsRenderTheme.java

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
*/
1616
package org.oscim.android.theme;
1717

18-
import android.content.Context;
18+
import android.content.res.AssetManager;
1919
import android.text.TextUtils;
2020

2121
import org.oscim.theme.IRenderTheme.ThemeException;
@@ -33,36 +33,33 @@
3333
public class AssetsRenderTheme implements ThemeFile {
3434
private static final long serialVersionUID = 1L;
3535

36-
private final InputStream mInputStream;
36+
private final AssetManager mAssetManager;
37+
private final String mFileName;
3738
private XmlRenderThemeMenuCallback mMenuCallback;
3839
private final String mRelativePathPrefix;
3940

4041
/**
41-
* @param context the Android context.
42+
* @param assetManager the Android asset manager.
4243
* @param relativePathPrefix the prefix for all relative resource paths.
4344
* @param fileName the path to the XML render theme file.
4445
* @throws ThemeException if an error occurs while reading the render theme XML.
4546
*/
46-
public AssetsRenderTheme(Context context, String relativePathPrefix, String fileName) throws ThemeException {
47-
this(context, relativePathPrefix, fileName, null);
47+
public AssetsRenderTheme(AssetManager assetManager, String relativePathPrefix, String fileName) throws ThemeException {
48+
this(assetManager, relativePathPrefix, fileName, null);
4849
}
4950

5051
/**
51-
* @param context the Android context.
52+
* @param assetManager the Android asset manager.
5253
* @param relativePathPrefix the prefix for all relative resource paths.
5354
* @param fileName the path to the XML render theme file.
5455
* @param menuCallback the interface callback to create a settings menu on the fly.
5556
* @throws ThemeException if an error occurs while reading the render theme XML.
5657
*/
57-
public AssetsRenderTheme(Context context, String relativePathPrefix, String fileName, XmlRenderThemeMenuCallback menuCallback) throws ThemeException {
58+
public AssetsRenderTheme(AssetManager assetManager, String relativePathPrefix, String fileName, XmlRenderThemeMenuCallback menuCallback) throws ThemeException {
59+
mAssetManager = assetManager;
5860
mRelativePathPrefix = relativePathPrefix;
61+
mFileName = fileName;
5962
mMenuCallback = menuCallback;
60-
61-
try {
62-
mInputStream = context.getAssets().open((TextUtils.isEmpty(mRelativePathPrefix) ? "" : mRelativePathPrefix) + fileName);
63-
} catch (IOException e) {
64-
throw new ThemeException(e.getMessage());
65-
}
6663
}
6764

6865
@Override
@@ -73,7 +70,7 @@ public boolean equals(Object obj) {
7370
return false;
7471
}
7572
AssetsRenderTheme other = (AssetsRenderTheme) obj;
76-
if (mInputStream != other.mInputStream) {
73+
if (getRenderThemeAsStream() != other.getRenderThemeAsStream()) {
7774
return false;
7875
}
7976
if (!Utils.equals(mRelativePathPrefix, other.mRelativePathPrefix)) {
@@ -94,7 +91,11 @@ public String getRelativePathPrefix() {
9491

9592
@Override
9693
public InputStream getRenderThemeAsStream() throws ThemeException {
97-
return mInputStream;
94+
try {
95+
return mAssetManager.open((TextUtils.isEmpty(mRelativePathPrefix) ? "" : mRelativePathPrefix) + mFileName);
96+
} catch (IOException e) {
97+
throw new ThemeException(e.getMessage());
98+
}
9899
}
99100

100101
@Override

vtm/src/org/oscim/theme/StreamRenderTheme.java

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
import org.oscim.theme.IRenderTheme.ThemeException;
1818
import org.oscim.utils.Utils;
1919

20+
import java.io.BufferedInputStream;
21+
import java.io.IOException;
2022
import java.io.InputStream;
2123

2224
/**
@@ -45,7 +47,8 @@ public StreamRenderTheme(String relativePathPrefix, InputStream inputStream) {
4547
*/
4648
public StreamRenderTheme(String relativePathPrefix, InputStream inputStream, XmlRenderThemeMenuCallback menuCallback) {
4749
mRelativePathPrefix = relativePathPrefix;
48-
mInputStream = inputStream;
50+
mInputStream = new BufferedInputStream(inputStream);
51+
mInputStream.mark(0);
4952
mMenuCallback = menuCallback;
5053
}
5154

@@ -78,6 +81,11 @@ public String getRelativePathPrefix() {
7881

7982
@Override
8083
public InputStream getRenderThemeAsStream() throws ThemeException {
84+
try {
85+
mInputStream.reset();
86+
} catch (IOException e) {
87+
throw new ThemeException(e.getMessage());
88+
}
8189
return mInputStream;
8290
}
8391

vtm/src/org/oscim/theme/ThemeLoader.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ public static IRenderTheme load(ThemeFile theme) throws ThemeException {
4848

4949
public static IRenderTheme load(ThemeFile theme, ThemeCallback themeCallback) throws ThemeException {
5050
IRenderTheme t;
51-
if (ThemeUtils.isMapsforgeTheme(theme.getRenderThemeAsStream()))
51+
if (ThemeUtils.isMapsforgeTheme(theme))
5252
t = USE_ATLAS ? XmlMapsforgeAtlasThemeBuilder.read(theme, themeCallback) : XmlMapsforgeThemeBuilder.read(theme, themeCallback);
5353
else
5454
t = USE_ATLAS ? XmlAtlasThemeBuilder.read(theme, themeCallback) : XmlThemeBuilder.read(theme, themeCallback);

vtm/src/org/oscim/theme/ThemeUtils.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,15 @@
1515
*/
1616
package org.oscim.theme;
1717

18-
import org.oscim.utils.IOUtils;
18+
import org.oscim.backend.XMLReaderAdapter;
1919
import org.slf4j.Logger;
2020
import org.slf4j.LoggerFactory;
2121
import org.xml.sax.Attributes;
22-
import org.xml.sax.InputSource;
2322
import org.xml.sax.SAXException;
24-
import org.xml.sax.XMLReader;
2523
import org.xml.sax.helpers.DefaultHandler;
2624

27-
import java.io.InputStream;
2825
import java.util.concurrent.atomic.AtomicBoolean;
2926

30-
import javax.xml.parsers.SAXParserFactory;
31-
3227
/**
3328
* A utility class with theme specific helper methods.
3429
*/
@@ -37,34 +32,28 @@ public final class ThemeUtils {
3732
private static final Logger log = LoggerFactory.getLogger(ThemeUtils.class);
3833

3934
/**
40-
* Check if the given InputStream is a Mapsforge render theme.
35+
* Check if the given theme is a Mapsforge one.
4136
*/
42-
public static boolean isMapsforgeTheme(InputStream is) {
37+
public static boolean isMapsforgeTheme(ThemeFile theme) {
4338
try {
4439
final AtomicBoolean isMapsforgeTheme = new AtomicBoolean(false);
45-
SAXParserFactory factory = SAXParserFactory.newInstance();
46-
factory.setNamespaceAware(true);
47-
XMLReader xmlReader = factory.newSAXParser().getXMLReader();
48-
xmlReader.setContentHandler(new DefaultHandler() {
49-
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
50-
if (localName.equals("rendertheme")) {
51-
isMapsforgeTheme.set(uri.equals("http://mapsforge.org/renderTheme"));
52-
// We have all info, break parsing
53-
throw new SAXTerminationException();
54-
}
55-
}
56-
});
5740
try {
58-
xmlReader.parse(new InputSource(is));
41+
new XMLReaderAdapter().parse(new DefaultHandler() {
42+
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
43+
if (localName.equals("rendertheme")) {
44+
isMapsforgeTheme.set(uri.equals("http://mapsforge.org/renderTheme"));
45+
// We have all info, break parsing
46+
throw new SAXTerminationException();
47+
}
48+
}
49+
}, theme.getRenderThemeAsStream());
5950
} catch (SAXTerminationException e) {
6051
// Do nothing
6152
}
6253
return isMapsforgeTheme.get();
6354
} catch (Exception e) {
6455
log.error(e.getMessage(), e);
6556
return false;
66-
} finally {
67-
IOUtils.closeQuietly(is);
6857
}
6958
}
7059

0 commit comments

Comments
 (0)