package com.cpiekarski.fourteeners.utils; import android.content.Context; import android.content.res.Resources; import android.content.res.XmlResourceParser; import android.util.Log; import com.cpiekarski.fourteeners.R; import com.cpiekarski.fourteeners.SummitRegister; import com.google.android.gms.analytics.HitBuilders; import com.google.android.gms.analytics.Tracker; import com.google.android.gms.analytics.StandardExceptionParser; import java.util.ArrayList; import java.util.List; import java.util.TreeMap; /** * Maintains a TreeMap for known peaks. * * */ public class Mountains { private final String TAG = "Mountains"; private TreeMap<String, Mountain> mMnts; private Context mCtx; private Tracker mTracker; private TreeMap<String, ArrayList<String>> mRanges; public static Mountains instance = null; //private TreeMap<Location, String> mLocs; /** * Use Mountains class as a singleton * @param context * @return */ public static Mountains getInstance(Context context) { if(instance == null) { instance = new Mountains(context); instance.parseFourteeners(); } return instance; } public Mountains(Context context) { mMnts = new TreeMap<String, Mountain>(); mCtx = context; mRanges = new TreeMap<String, ArrayList<String>>(); SummitRegister application = (SummitRegister) mCtx.getApplicationContext(); mTracker = application.getDefaultTracker(); } public String[] getRanges() { return (String[]) mRanges.keySet().toArray(new String[7]); } public String[] getNamesInRange(String range) { if ( mRanges.containsKey(range) ) { ArrayList<String> al = mRanges.get(range); return al.toArray(new String[0]); } return null; } public String[] getAllPeakNames() { return mMnts.keySet().toArray(new String[0]); } /** * O(C) * @return the number of peaks in the list */ public int getSize() { return mMnts.size(); } /** * Get a known mountain by name only. * @param name * @return */ public Mountain getMountain(String name) { Mountain mnt = mMnts.get(name); return mnt; } /** * Get a known mountain by name and range. * O(log n) * * @param name of the Mountain * @param range the Mountain is in * @return The correct mountain object */ public Mountain getMountain(String name, String range) { //TODO: add range check Mountain mnt = mMnts.get(name); return mnt; } /** * O(n log n) add and sort by name */ public void parseFourteeners() { SRLOG.v(TAG, "Parsing fourteener data..."); Resources res = mCtx.getResources(); XmlResourceParser xrp = res.getXml(R.xml.mountain_data); try{ xrp.next(); // skip first 'mountains' element while (xrp.getEventType() != XmlResourceParser.END_DOCUMENT) { xrp.next(); // get first 'mountain' element if(xrp.getEventType() == XmlResourceParser.START_TAG) { // double check its the right element if(xrp.getName().equals("mountain")) { // extract the data you want int count = xrp.getAttributeCount(); String name = xrp.getAttributeValue(null, "name"); String rank = xrp.getAttributeValue(null, "rank"); String elev = xrp.getAttributeValue(null, "elevation"); String range = xrp.getAttributeValue(null, "range"); String longitude = xrp.getAttributeValue(null, "long"); String latitude = xrp.getAttributeValue(null, "lat"); String county = xrp.getAttributeValue(null, "county"); Mountain m = new Mountain(name, range , county, Double.parseDouble(longitude), Double.parseDouble(latitude), Integer.parseInt(rank), Integer.parseInt(elev)); mMnts.put(name, m); if(mRanges.containsKey(range)) { ArrayList<String> al = mRanges.get(range); al.add(name); } else { ArrayList<String> nal = new ArrayList<String>(); nal.add(name); mRanges.put(range, nal); } SRLOG.v(TAG, "Mountain Attribute Count " + count); SRLOG.v(TAG, "Peak Name " + name); SRLOG.v(TAG, "Peak Elevation " + elev); } } } } catch (Exception e) { SRLOG.e(TAG, e.toString()); mTracker.send(new HitBuilders.ExceptionBuilder() .setDescription(new StandardExceptionParser(mCtx, null) .getDescription(Thread.currentThread().getName(), e)) .setFatal(false) .build() ); } finally { xrp.close(); SRLOG.i(TAG, "Fourteener data parsed"); } } }