package com.robert.maps.applib.kml.XMLparser;
import java.util.ArrayList;
import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;
import android.content.Context;
import android.content.Intent;
import android.content.SharedPreferences;
import android.preference.PreferenceGroup;
import android.view.Menu;
import android.view.MenuItem;
import com.robert.maps.applib.MainPreferences;
import com.robert.maps.applib.R;
import com.robert.maps.applib.preference.PredefMapsPrefActivity;
import com.robert.maps.applib.tileprovider.TileSourceBase;
import com.robert.maps.applib.utils.CheckBoxPreferenceExt;
public class PredefMapsParser extends DefaultHandler {
private final TileSourceBase mRendererInfo;
private final String mMapId;
private static final String MAP = "map";
private static final String LAYER = "layer";
private static final String TIMEDEPENDENT = "timedependent";
private static final String CACHE = "cache";
private static final String TRUE = "true";
private static final String ID = "id";
private static final String NAME = "name";
private static final String DESCR = "descr";
private static final String BASEURL = "baseurl";
private static final String IMAGE_FILENAMEENDING = "IMAGE_FILENAMEENDING";
private static final String ZOOM_MINLEVEL = "ZOOM_MINLEVEL";
private static final String ZOOM_MAXLEVEL = "ZOOM_MAXLEVEL";
private static final String MAPTILE_SIZEPX = "MAPTILE_SIZEPX";
private static final String URL_BUILDER_TYPE = "URL_BUILDER_TYPE";
private static final String TILE_SOURCE_TYPE = "TILE_SOURCE_TYPE";
private static final String PROJECTION = "PROJECTION";
private static final String YANDEX_TRAFFIC_ON = "YANDEX_TRAFFIC_ON";
private static final String GOOGLESCALE = "GOOGLESCALE";
private Menu mSubmenu;
private boolean mNeedMaps;
private boolean mNeedOverlays;
private int mNeedProjection;
private PreferenceGroup mPrefMapsgroup;
private PreferenceGroup mPrefOverlaysgroup;
private Context mPrefActivity;
private SharedPreferences mSharedPreferences;
private ArrayList<String> mID;
private ArrayList<String> mName;
public PredefMapsParser(final ArrayList<String> arrayListID, final ArrayList<String> arrayListName, final boolean aGetMaps, final boolean aGetOverlays, final int aProjection) {
super();
mID = arrayListID;
mName = arrayListName;
mNeedMaps = aGetMaps;
mNeedOverlays = aGetOverlays;
mNeedProjection = aProjection;
mSubmenu = null;
mRendererInfo = null;
mMapId = null;
mPrefMapsgroup = null;
mPrefOverlaysgroup = null;
mPrefActivity = null;
}
public PredefMapsParser(final PreferenceGroup aPrefMapsgroup, final PreferenceGroup aPrefOverlaysgroup, final Context aPrefActivity) {
super();
mSubmenu = null;
mRendererInfo = null;
mMapId = null;
mPrefMapsgroup = aPrefMapsgroup;
mPrefOverlaysgroup = aPrefOverlaysgroup;
mPrefActivity = aPrefActivity;
}
public PredefMapsParser(final Menu aSubmenu, final SharedPreferences pref, boolean aNeedOverlays, int aProjection) {
super();
mSubmenu = aSubmenu;
mNeedOverlays = aNeedOverlays;
mNeedProjection = aProjection;
mSharedPreferences = pref;
mRendererInfo = null;
mMapId = null;
mPrefMapsgroup = null;
mPrefOverlaysgroup = null;
}
public PredefMapsParser(final Menu aSubmenu, final SharedPreferences pref) {
this(aSubmenu, pref, false, 0);
}
public PredefMapsParser(final TileSourceBase aRendererInfo, final String aMapId) {
super();
mSubmenu = null;
mRendererInfo = aRendererInfo;
mMapId = aMapId;
mPrefMapsgroup = null;
mPrefOverlaysgroup = null;
}
@Override
public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {
if(localName.equalsIgnoreCase(MAP)){
if (mRendererInfo != null) {
if(attributes.getValue(ID).equalsIgnoreCase(mMapId)){
mRendererInfo.ID = attributes.getValue(ID);
mRendererInfo.MAPID = attributes.getValue(ID);
mRendererInfo.NAME = attributes.getValue(NAME);
mRendererInfo.BASEURL = attributes.getValue(BASEURL);
mRendererInfo.ZOOM_MINLEVEL = Integer.parseInt(attributes.getValue(ZOOM_MINLEVEL));
mRendererInfo.ZOOM_MAXLEVEL = Integer.parseInt(attributes.getValue(ZOOM_MAXLEVEL));
mRendererInfo.IMAGE_FILENAMEENDING = attributes.getValue(IMAGE_FILENAMEENDING);
mRendererInfo.MAPTILE_SIZEPX = Integer.parseInt(attributes.getValue(MAPTILE_SIZEPX));
mRendererInfo.URL_BUILDER_TYPE = Integer.parseInt(attributes.getValue(URL_BUILDER_TYPE));
mRendererInfo.TILE_SOURCE_TYPE = Integer.parseInt(attributes.getValue(TILE_SOURCE_TYPE));
mRendererInfo.PROJECTION = Integer.parseInt(attributes.getValue(PROJECTION));
mRendererInfo.YANDEX_TRAFFIC_ON = Integer.parseInt(attributes.getValue(YANDEX_TRAFFIC_ON));
mRendererInfo.TIMEDEPENDENT = false;
if(attributes.getIndex(TIMEDEPENDENT)>-1)
mRendererInfo.TIMEDEPENDENT = Boolean.parseBoolean(attributes.getValue(TIMEDEPENDENT));
mRendererInfo.LAYER = false;
if(attributes.getIndex(LAYER)>-1)
mRendererInfo.LAYER = Boolean.parseBoolean(attributes.getValue(LAYER));
mRendererInfo.CACHE = "";
if(attributes.getIndex(CACHE)>-1)
mRendererInfo.CACHE = attributes.getValue(CACHE);
mRendererInfo.GOOGLESCALE = false;
if(attributes.getIndex(GOOGLESCALE)>-1)
mRendererInfo.GOOGLESCALE = Boolean.parseBoolean(attributes.getValue(GOOGLESCALE));
}
}
else if(mSubmenu != null) {
final int i = attributes.getIndex(LAYER);
boolean timeDependent = false;
final int j = attributes.getIndex(TIMEDEPENDENT);
if(j != -1)
timeDependent = Boolean.parseBoolean(attributes.getValue(TIMEDEPENDENT));
if(mSharedPreferences.getBoolean(MainPreferences.PREF_PREDEFMAPS_+attributes.getValue(ID), true)) {
final boolean isLayer = !(i == -1 || !attributes.getValue(LAYER).equalsIgnoreCase(TRUE));
if(mNeedOverlays && isLayer && !timeDependent
//&& (mNeedProjection == 0 || mNeedProjection == Integer.parseInt(attributes.getValue(PROJECTION)))
|| !mNeedOverlays && !isLayer) {
final MenuItem item = mSubmenu.add(R.id.isoverlay, Menu.NONE, Menu.NONE, attributes.getValue(NAME));
item.setTitleCondensed(attributes.getValue(ID));
}
}
}
else if(mPrefMapsgroup != null && mPrefOverlaysgroup != null) {
final int i = attributes.getIndex(LAYER);
final PreferenceGroup prefGroup = (i == -1 || !attributes.getValue(LAYER).equalsIgnoreCase(TRUE)) ? mPrefMapsgroup : mPrefOverlaysgroup;
final CheckBoxPreferenceExt pref = new CheckBoxPreferenceExt(mPrefActivity, MainPreferences.PREF_PREDEFMAPS_ + attributes.getValue(ID));
pref.setKey(MainPreferences.PREF_PREDEFMAPS_ + attributes.getValue(ID) + "_screen");
final Intent intent = new Intent(mPrefActivity, PredefMapsPrefActivity.class)
.putExtra("Key", MainPreferences.PREF_PREDEFMAPS_ + attributes.getValue(ID))
.putExtra(ID, attributes.getValue(ID))
.putExtra(NAME, attributes.getValue(NAME))
.putExtra(PROJECTION, Integer.parseInt(attributes.getValue(PROJECTION)))
.putExtra(MAPTILE_SIZEPX, Integer.parseInt(attributes.getValue(MAPTILE_SIZEPX)));
final int j = attributes.getIndex(GOOGLESCALE);
if(j > -1 && attributes.getValue(GOOGLESCALE).equalsIgnoreCase(TRUE))
intent.putExtra(GOOGLESCALE, true);
pref.setIntent(intent);
pref.setTitle(attributes.getValue(NAME));
pref.setSummary(attributes.getValue(DESCR));
prefGroup.addPreference(pref);
}
else if(mID != null) {
final int i = attributes.getIndex(LAYER);
boolean timeDependent = false;
final int j = attributes.getIndex(TIMEDEPENDENT);
if(j != -1)
timeDependent = Boolean.parseBoolean(attributes.getValue(TIMEDEPENDENT));
final boolean isLayer = !(i == -1 || !attributes.getValue(LAYER).equalsIgnoreCase(TRUE));
final int proj = Integer.parseInt(attributes.getValue(PROJECTION));
if(mNeedMaps && !isLayer || mNeedOverlays && isLayer && !timeDependent && (mNeedProjection == 0 || mNeedProjection == proj)) {
mID.add(attributes.getValue(ID));
mName.add(attributes.getValue(NAME));
}
}
}
super.startElement(uri, localName, name, attributes);
}
}