From 6801b895e450b5ac3e7501f028bb40c8c625d6e6 Mon Sep 17 00:00:00 2001 From: Emux Date: Mon, 11 Jan 2021 17:30:44 +0200 Subject: [PATCH] Mapsforge themes compatibility improvements #100 (#802) --- .../android/theme/AssetsRenderTheme.java | 12 ++++++--- .../android/theme/ContentRenderTheme.java | 11 +++++--- vtm-themes/src/org/oscim/theme/VtmThemes.java | 6 ++++- .../org/oscim/theme/ExternalRenderTheme.java | 10 ++++++-- .../org/oscim/theme/StreamRenderTheme.java | 20 +++++++-------- vtm/src/org/oscim/theme/ThemeFile.java | 7 +++++- .../org/oscim/theme/XmlAtlasThemeBuilder.java | 4 +-- vtm/src/org/oscim/theme/XmlThemeBuilder.java | 25 ++++++++++--------- 8 files changed, 59 insertions(+), 36 deletions(-) diff --git a/vtm-android/src/org/oscim/android/theme/AssetsRenderTheme.java b/vtm-android/src/org/oscim/android/theme/AssetsRenderTheme.java index c9c943ec..ff969d49 100644 --- a/vtm-android/src/org/oscim/android/theme/AssetsRenderTheme.java +++ b/vtm-android/src/org/oscim/android/theme/AssetsRenderTheme.java @@ -1,6 +1,6 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org - * Copyright 2016-2017 devemux86 + * Copyright 2016-2021 devemux86 * Copyright 2017 Andrey Novikov * * This program is free software: you can redistribute it and/or modify it under the @@ -18,10 +18,8 @@ package org.oscim.android.theme; import android.content.res.AssetManager; import android.text.TextUtils; - import org.oscim.theme.IRenderTheme.ThemeException; import org.oscim.theme.ThemeFile; -import org.oscim.theme.ThemeUtils; import org.oscim.theme.XmlRenderThemeMenuCallback; import org.oscim.utils.Utils; @@ -37,6 +35,7 @@ public class AssetsRenderTheme implements ThemeFile { private final AssetManager mAssetManager; private final String mFileName; + private boolean mMapsforgeTheme; private XmlRenderThemeMenuCallback mMenuCallback; private final String mRelativePathPrefix; @@ -102,7 +101,12 @@ public class AssetsRenderTheme implements ThemeFile { @Override public boolean isMapsforgeTheme() { - return ThemeUtils.isMapsforgeTheme(this); + return mMapsforgeTheme; + } + + @Override + public void setMapsforgeTheme(boolean mapsforgeTheme) { + mMapsforgeTheme = mapsforgeTheme; } @Override diff --git a/vtm-android/src/org/oscim/android/theme/ContentRenderTheme.java b/vtm-android/src/org/oscim/android/theme/ContentRenderTheme.java index 1acc33d8..d90e06a5 100644 --- a/vtm-android/src/org/oscim/android/theme/ContentRenderTheme.java +++ b/vtm-android/src/org/oscim/android/theme/ContentRenderTheme.java @@ -1,5 +1,5 @@ /* - * Copyright 2020 devemux86 + * Copyright 2020-2021 devemux86 * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -18,7 +18,6 @@ import android.content.ContentResolver; import android.net.Uri; import org.oscim.theme.IRenderTheme.ThemeException; import org.oscim.theme.ThemeFile; -import org.oscim.theme.ThemeUtils; import org.oscim.theme.XmlRenderThemeMenuCallback; import org.oscim.utils.Utils; @@ -33,6 +32,7 @@ public class ContentRenderTheme implements ThemeFile { private static final long serialVersionUID = 1L; private final ContentResolver mContentResolver; + private boolean mMapsforgeTheme; private XmlRenderThemeMenuCallback mMenuCallback; private final String mRelativePathPrefix; private final Uri mUri; @@ -99,7 +99,12 @@ public class ContentRenderTheme implements ThemeFile { @Override public boolean isMapsforgeTheme() { - return ThemeUtils.isMapsforgeTheme(this); + return mMapsforgeTheme; + } + + @Override + public void setMapsforgeTheme(boolean mapsforgeTheme) { + mMapsforgeTheme = mapsforgeTheme; } @Override diff --git a/vtm-themes/src/org/oscim/theme/VtmThemes.java b/vtm-themes/src/org/oscim/theme/VtmThemes.java index 0a275b05..c5ce9f45 100644 --- a/vtm-themes/src/org/oscim/theme/VtmThemes.java +++ b/vtm-themes/src/org/oscim/theme/VtmThemes.java @@ -1,7 +1,7 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org * Copyright 2013 Hannes Janetzek - * Copyright 2016-2017 devemux86 + * Copyright 2016-2021 devemux86 * Copyright 2017 nebular * Copyright 2017 Andrey Novikov * @@ -64,6 +64,10 @@ public enum VtmThemes implements ThemeFile { return false; } + @Override + public void setMapsforgeTheme(boolean mapsforgeTheme) { + } + @Override public void setMenuCallback(XmlRenderThemeMenuCallback menuCallback) { } diff --git a/vtm/src/org/oscim/theme/ExternalRenderTheme.java b/vtm/src/org/oscim/theme/ExternalRenderTheme.java index 1208fd2a..58e741b3 100644 --- a/vtm/src/org/oscim/theme/ExternalRenderTheme.java +++ b/vtm/src/org/oscim/theme/ExternalRenderTheme.java @@ -1,7 +1,7 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org * Copyright 2013 Hannes Janetzek - * Copyright 2016-2017 devemux86 + * Copyright 2016-2021 devemux86 * Copyright 2017 Andrey Novikov * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). @@ -34,6 +34,7 @@ public class ExternalRenderTheme implements ThemeFile { private static final long serialVersionUID = 1L; private final long mFileModificationDate; + private boolean mMapsforgeTheme; private XmlRenderThemeMenuCallback mMenuCallback; private final String mPath; @@ -110,7 +111,12 @@ public class ExternalRenderTheme implements ThemeFile { @Override public boolean isMapsforgeTheme() { - return ThemeUtils.isMapsforgeTheme(this); + return mMapsforgeTheme; + } + + @Override + public void setMapsforgeTheme(boolean mapsforgeTheme) { + mMapsforgeTheme = mapsforgeTheme; } @Override diff --git a/vtm/src/org/oscim/theme/StreamRenderTheme.java b/vtm/src/org/oscim/theme/StreamRenderTheme.java index 961d1a5c..00ad4522 100644 --- a/vtm/src/org/oscim/theme/StreamRenderTheme.java +++ b/vtm/src/org/oscim/theme/StreamRenderTheme.java @@ -1,5 +1,5 @@ /* - * Copyright 2016-2017 devemux86 + * Copyright 2016-2021 devemux86 * Copyright 2017 Andrey Novikov * * This program is free software: you can redistribute it and/or modify it under the @@ -18,8 +18,6 @@ package org.oscim.theme; import org.oscim.theme.IRenderTheme.ThemeException; import org.oscim.utils.Utils; -import java.io.BufferedInputStream; -import java.io.IOException; import java.io.InputStream; /** @@ -30,6 +28,7 @@ public class StreamRenderTheme implements ThemeFile { private static final long serialVersionUID = 1L; private final InputStream mInputStream; + private boolean mMapsforgeTheme; private XmlRenderThemeMenuCallback mMenuCallback; private final String mRelativePathPrefix; @@ -48,8 +47,7 @@ public class StreamRenderTheme implements ThemeFile { */ public StreamRenderTheme(String relativePathPrefix, InputStream inputStream, XmlRenderThemeMenuCallback menuCallback) { mRelativePathPrefix = relativePathPrefix; - mInputStream = new BufferedInputStream(inputStream); - mInputStream.mark(0); + mInputStream = inputStream; mMenuCallback = menuCallback; } @@ -82,17 +80,17 @@ public class StreamRenderTheme implements ThemeFile { @Override public InputStream getRenderThemeAsStream() throws ThemeException { - try { - mInputStream.reset(); - } catch (IOException e) { - throw new ThemeException(e.getMessage()); - } return mInputStream; } @Override public boolean isMapsforgeTheme() { - return ThemeUtils.isMapsforgeTheme(this); + return mMapsforgeTheme; + } + + @Override + public void setMapsforgeTheme(boolean mapsforgeTheme) { + mMapsforgeTheme = mapsforgeTheme; } @Override diff --git a/vtm/src/org/oscim/theme/ThemeFile.java b/vtm/src/org/oscim/theme/ThemeFile.java index b75b9d9d..077fc1d5 100644 --- a/vtm/src/org/oscim/theme/ThemeFile.java +++ b/vtm/src/org/oscim/theme/ThemeFile.java @@ -1,7 +1,7 @@ /* * Copyright 2010, 2011, 2012 mapsforge.org * Copyright 2013 Hannes Janetzek - * Copyright 2016-2017 devemux86 + * Copyright 2016-2021 devemux86 * Copyright 2017 Andrey Novikov * * This file is part of the OpenScienceMap project (http://www.opensciencemap.org). @@ -51,6 +51,11 @@ public interface ThemeFile extends Serializable { */ boolean isMapsforgeTheme(); + /** + * @param mapsforgeTheme true if theme file is in Mapsforge format + */ + void setMapsforgeTheme(boolean mapsforgeTheme); + /** * @param menuCallback the interface callback to create a settings menu on the fly. */ diff --git a/vtm/src/org/oscim/theme/XmlAtlasThemeBuilder.java b/vtm/src/org/oscim/theme/XmlAtlasThemeBuilder.java index 9e99c641..9b02a26f 100644 --- a/vtm/src/org/oscim/theme/XmlAtlasThemeBuilder.java +++ b/vtm/src/org/oscim/theme/XmlAtlasThemeBuilder.java @@ -1,6 +1,6 @@ /* * Copyright 2017 Longri - * Copyright 2017-2020 devemux86 + * Copyright 2017-2021 devemux86 * * This program is free software: you can redistribute it and/or modify it under the * terms of the GNU Lesser General Public License as published by the Free Software @@ -117,7 +117,7 @@ public class XmlAtlasThemeBuilder extends XmlThemeBuilder { @Override RenderTheme createTheme(Rule[] rules) { - return new AtlasRenderTheme(mMapBackground, mTextScale, rules, mLevels, mMapsforgeTheme, regionMap, atlasList); + return new AtlasRenderTheme(mMapBackground, mTextScale, rules, mLevels, mTheme.isMapsforgeTheme(), regionMap, atlasList); } @Override diff --git a/vtm/src/org/oscim/theme/XmlThemeBuilder.java b/vtm/src/org/oscim/theme/XmlThemeBuilder.java index e3693e23..9e2743b2 100644 --- a/vtm/src/org/oscim/theme/XmlThemeBuilder.java +++ b/vtm/src/org/oscim/theme/XmlThemeBuilder.java @@ -2,7 +2,7 @@ * Copyright 2010, 2011, 2012, 2013 mapsforge.org * Copyright 2013 Hannes Janetzek * Copyright 2014 Ludwig M Brinckmann - * Copyright 2016-2020 devemux86 + * Copyright 2016-2021 devemux86 * Copyright 2016-2017 Longri * Copyright 2016-2020 Andrey Novikov * Copyright 2018-2019 Gustl22 @@ -175,7 +175,6 @@ public class XmlThemeBuilder { private final ThemeCallback mThemeCallback; RenderTheme mRenderTheme; - final boolean mMapsforgeTheme; private final float mScale; private Set mCategories; @@ -193,7 +192,6 @@ public class XmlThemeBuilder { mTheme = theme; mPullParser = pullParser; mThemeCallback = themeCallback; - mMapsforgeTheme = theme.isMapsforgeTheme(); mScale = CanvasAdapter.getScale(); } @@ -215,14 +213,14 @@ public class XmlThemeBuilder { } public void endDocument() { - if (mMapsforgeTheme) { + if (mTheme.isMapsforgeTheme()) { // Building rule for Mapsforge themes mRulesList.add(buildingRule()); } Rule[] rules = new Rule[mRulesList.size()]; for (int i = 0, n = rules.length; i < n; i++) - rules[i] = mRulesList.get(i).onComplete(mMapsforgeTheme ? new int[1] : null); + rules[i] = mRulesList.get(i).onComplete(mTheme.isMapsforgeTheme() ? new int[1] : null); mRenderTheme = createTheme(rules); @@ -237,7 +235,7 @@ public class XmlThemeBuilder { } RenderTheme createTheme(Rule[] rules) { - return new RenderTheme(mMapBackground, mTextScale, rules, mLevels, mTransformKeyMap, mTransformTagMap, mMapsforgeTheme); + return new RenderTheme(mMapBackground, mTextScale, rules, mLevels, mTransformKeyMap, mTransformTagMap, mTheme.isMapsforgeTheme()); } public void endElement() { @@ -431,13 +429,13 @@ public class XmlThemeBuilder { else if ("NODE".equals(val)) element = Rule.Element.NODE; } else if ("k".equals(name)) { - if (mMapsforgeTheme) { + if (mTheme.isMapsforgeTheme()) { if (!"*".equals(value)) keys = value; } else keys = value; } else if ("v".equals(name)) { - if (mMapsforgeTheme) { + if (mTheme.isMapsforgeTheme()) { if (!"*".equals(value)) values = value; } else @@ -935,7 +933,10 @@ public class XmlThemeBuilder { if ("schemaLocation".equals(name)) continue; - if ("version".equals(name)) + if ("xmlns".equals(name)) + mTheme.setMapsforgeTheme("http://mapsforge.org/renderTheme".equals(value)); + + else if ("version".equals(name)) version = Integer.parseInt(value); else if ("map-background".equals(name)) { @@ -956,7 +957,7 @@ public class XmlThemeBuilder { validateExists("version", version, elementName); - int renderThemeVersion = mMapsforgeTheme ? RENDER_THEME_VERSION_MAPSFORGE : RENDER_THEME_VERSION_VTM; + int renderThemeVersion = mTheme.isMapsforgeTheme() ? RENDER_THEME_VERSION_MAPSFORGE : RENDER_THEME_VERSION_VTM; if (version > renderThemeVersion) throw new ThemeException("invalid render theme version:" + version); @@ -1006,7 +1007,7 @@ public class XmlThemeBuilder { b.themeCallback(mThemeCallback); String symbol = null; - if (mMapsforgeTheme) { + if (mTheme.isMapsforgeTheme()) { // Reset default priority b.priority = DEFAULT_PRIORITY; } @@ -1051,7 +1052,7 @@ public class XmlThemeBuilder { else if ("priority".equals(name)) { b.priority = Integer.parseInt(value); - if (mMapsforgeTheme) { + if (mTheme.isMapsforgeTheme()) { // Mapsforge: higher priorities are drawn first (0 = default priority) // VTM: lower priorities are drawn first (0 = highest priority) b.priority = FastMath.clamp(DEFAULT_PRIORITY - b.priority, 0, Integer.MAX_VALUE);