From e1e1bea1efbc428857f8a7da806e0f52f1924969 Mon Sep 17 00:00:00 2001 From: Ricky Barrette Date: Mon, 5 Mar 2012 08:28:47 -0500 Subject: [PATCH] Refactored the entire library I also moved the directions listfragment, overlay, and other required classes from FMC into the library Change-Id: Iba27e29d89e864dbeca3a2670aed552a8be4f2b8 Signed-off-by: Ricky Barrette --- LocationLib/bin/locationlib.jar | Bin 53453 -> 62978 bytes LocationLib/res/layout/list_row.xml | 22 ++ LocationLib/res/layout/listview.xml | 7 + .../android/fragments/DirectionsAdapter.java | 118 ++++++ .../fragments/DirectionsListFragment.java | 97 +++++ .../MapFragmentBase.java | 6 +- .../SkyHoookUserOverlayMapFragment.java | 10 +- .../UserOverlayMapFragment.java | 12 +- .../location/OnDirectionSelectedListener.java | 24 ++ ...r.java => OnLocationSelectedListener.java} | 2 +- .../{location => overlays}/CompasOverlay.java | 6 +- .../android/overlays/DirectionsOverlay.java | 352 ++++++++++++++++++ .../android/overlays/PathOverlay.java | 86 +++++ .../{location => overlays}/RadiusOverlay.java | 8 +- .../SkyHookUserOverlay.java | 8 +- .../{location => overlays}/UserOverlay.java | 3 +- .../UserOverlayBase.java | 7 +- 17 files changed, 747 insertions(+), 21 deletions(-) create mode 100755 LocationLib/res/layout/list_row.xml create mode 100644 LocationLib/res/layout/listview.xml create mode 100644 LocationLib/src/com/TwentyCodes/android/fragments/DirectionsAdapter.java create mode 100644 LocationLib/src/com/TwentyCodes/android/fragments/DirectionsListFragment.java rename LocationLib/src/com/TwentyCodes/android/{location => fragments}/MapFragmentBase.java (90%) rename LocationLib/src/com/TwentyCodes/android/{SkyHook => fragments}/SkyHoookUserOverlayMapFragment.java (91%) rename LocationLib/src/com/TwentyCodes/android/{location => fragments}/UserOverlayMapFragment.java (87%) create mode 100644 LocationLib/src/com/TwentyCodes/android/location/OnDirectionSelectedListener.java rename LocationLib/src/com/TwentyCodes/android/location/{LocationSelectedListener.java => OnLocationSelectedListener.java} (85%) rename LocationLib/src/com/TwentyCodes/android/{location => overlays}/CompasOverlay.java (95%) create mode 100644 LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java create mode 100644 LocationLib/src/com/TwentyCodes/android/overlays/PathOverlay.java rename LocationLib/src/com/TwentyCodes/android/{location => overlays}/RadiusOverlay.java (93%) rename LocationLib/src/com/TwentyCodes/android/{SkyHook => overlays}/SkyHookUserOverlay.java (81%) rename LocationLib/src/com/TwentyCodes/android/{location => overlays}/UserOverlay.java (89%) rename LocationLib/src/com/TwentyCodes/android/{location => overlays}/UserOverlayBase.java (97%) diff --git a/LocationLib/bin/locationlib.jar b/LocationLib/bin/locationlib.jar index cf4031bfeb3a19a40b2bb63acbdaca004756521f..5f07e6d92cbeddcf669a79ab318d9e11ef42753f 100644 GIT binary patch delta 28151 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

J@|b5JaF?y~AeeLo*xLV)g=xyG?&TQQ)Ys51Rf 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 delta 18792 zcmZU)1CS<5*EQPHHl}UcHl}Ucw(X~FKW*E#rp;;Fw(XvtJMTI7{r~%Yx1uT{Yv+!v z$c)ULYptCXbO|<90EVC_0|t%;0u2oflIm`nh#&!$;%*95bf9hsNCp3IIWYjaNf|;M z^#Ah?{Br=+v;j2&@sBOGkNQ78TL^3a_%wAO`@sCSqR9}){vWTVIYPvLo0uaM0^S}$ zHBplU{_9^uHV*rbf0p0hhLC_Geb|6$4(!GI&NERV{CwMkk}xa-mLss&=Yn#Wdhni< zr>K&#~)dku27;m`rX&4(SFgM3>5G=+9e{ zv2-J_}G8V?i|>a-h9X&S2?h1?O}R9e?RLmZT){~jz9OE)vuio|+sXD}k#l=G>U zr~?^MjbEp}9{yN*;z8fagLZH8F(KWyo>(Yr(PM`+fylcN+FV5P_dMV;?C8RN(#)Dt7{h!2yd5xt zNZiRmvx5dp(c<=Y)5%$wtxAvk>T;^InicP}M$;aowwwZFY@9e4ucBqut zd6O-aqYMuy!obJTo}-xMu}Z%eCeBKDHseoB1VuTLGna2ec-q*hcB#en3S?EASFI3L zHKZo3V;U{B5QpbCDQOehg#R+*O`-%VFGqHo)>4%Y>+-Z+nq{hGMs@}y$KtYvEEL}c5Y=9;)g z7?3sq^RX9-t`9+vYLIA4pdvWa#+vz&Y)ItzCgY9~+Y(XHQE$Qw7Hjgp6@s-V&UeOJ zXpF!!4Q33`aUR8zs4%D5-|}WGX%koid8ub(I>m)mL!QcZnev;0t_$A!PvgaXXTQ2J zO{yafmewE;Fqx+y>&>*E%6=}d1*IjMUBPSe;XcUihP8FR`gM(=2DCnUn5c*~6R zTjZNo)W1rYYIkFiSDEIlX@v%}JSQf)ck1ydQIY^62J;6HqhmuUXMq&mVEiFAp!63C zY-9qpqh#KM(Y$I6+v*IaIk15Em zsnpaQ*f1S^t)C@E5N+J^<9o?b5BY*wl~JlFJ{p7kV#dKIZ9=2kEitR_jrT!TFk+Oi zGqeFnY~9f>>0BzmRK;0hVD5J^ck`tI8|wYCZ@l{$e}F+FvWjl>;Dm`@qfEc^pVgSV z_^R@3UcvL`tt(Y~qXSZQHg03o>VeLSibYK)y*mYiG;*sV$~H=a->{v@^N7CKRf|eX zX}PPZb-bb#$a}9o-C~p#mq!VR@3VaDXnT#M4LQ%D*T++i^#(ZjM5q@x4#Bbkx8HC~ zdQCoPI)5=2x|X(q7cuv(s==6eaF3uEch?g`8t@RBL~t%`(Zd$mp!-bxkXODk!!*tE zn1fQPvcL4u+l@XM#Miq~zN!1B9o!|@T)^uK?)TekCkOfoiT_8_cm8;ky1@IYWijgl z@M+d|sdL$sR}2{6XeP&_31$r$K(otu*$ijWZfeje(R(DNrBb28s7bf#M{6I0{Hq(E+r*c8Up*S2I;PzrTO}ZX<(IDTM|vo}EnMtFYZW>7Kl?U7g_B*@zJCFzsJ>guc_EJj=NaS92&~)rf$rx!4(^IiL*`beG+?(-q zg?TitubB3JaK4devAVoUaZjvzA0>r0nbA)vRS!?S|Jfg|-SA`3FCjoc+!6ox24Td^ z1*|=WYHDXJ{q`Sp(qzO;|1VxiWS#i8V8EgLFQnnLr*7Kf>iE~XphfpDE~+7;1{&JK z02wbKfunZ_fD(-lAG9TGf6A^ksZ=Q;$sk&?z3Xdm&HSiPq86CyYO(-g@E_XP?xUuz z9u`|$AQk8+C{=|dVmelKcC#5rtc|IRCzj5FB{N8g}DS=b5yDFaU z)7-2l-8&zCC;U5a&cAy#1VHK`0rN@)MrOaJM!JyJ03Gu}U0JQsPPAzZ?eaXiPAcl- zPA+%uoLOyA8%XP+G3@!I=CznBCm9|-S z=-Ik;ko3f1SN650gbY>@t})f}ks2M!x_;J6hNhfr!%0A3J`RSP?C`bz#?~GWcS9-9 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 diff --git a/LocationLib/res/layout/list_row.xml b/LocationLib/res/layout/list_row.xml new file mode 100755 index 0000000..e6ab51b --- /dev/null +++ b/LocationLib/res/layout/list_row.xml @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/LocationLib/res/layout/listview.xml b/LocationLib/res/layout/listview.xml new file mode 100644 index 0000000..fd8cccf --- /dev/null +++ b/LocationLib/res/layout/listview.xml @@ -0,0 +1,7 @@ + + + + \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsAdapter.java b/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsAdapter.java new file mode 100644 index 0000000..d9464ef --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsAdapter.java @@ -0,0 +1,118 @@ +/** + * @author Twenty Codes, LLC + * @author ricky barrette + * @date Sep 22, 2010 + */ +package com.TwentyCodes.android.fragments; + +import android.content.Context; +import android.text.Html; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.TextView; + +import com.TwentyCodes.android.location.R; +import com.TwentyCodes.android.overlays.DirectionsOverlay; + +/** + * this is a custom listview adaptor that wills a listview that has 2 textviews in each row. + * @author ricky barrette + */ +public class DirectionsAdapter extends BaseAdapter { + + private LayoutInflater mInflater; + private DirectionsOverlay mDirections; + + + /** + * Creates a new DirectionsAdapter + * @author ricky barrette + */ + public DirectionsAdapter(Context context, DirectionsOverlay directions) { + mInflater = LayoutInflater.from(context); + mDirections = directions; + } + + /** + * returns the size of the main list + * @see android.widget.Adapter#getCount() + * @return + * @author ricky barrette + */ + @Override + public int getCount() { + return mDirections.getDirections().size() + 1; + } + + /** + * (non-Javadoc) + * @see android.widget.Adapter#getItem(int) + * @param position + * @return + * @author ricky barrette + */ + @Override + public Object getItem(int position) { + return position; + } + + /** + * returns the current position in the list + * @see android.widget.Adapter#getItemId(int) + * @param position + * @return + * @author ricky barrette + */ + @Override + public long getItemId(int position) { + return position; + } + + /** + * inflates the row from xml, and sets the textviews to their intended vales + * @see android.widget.Adapter#getView(int, android.view.View, android.view.ViewGroup) + * @param position + * @param convertView + * @param parent + * @return + * @author ricky barrette + */ + @Override + public View getView(int position, View convertView, ViewGroup parent) { + ViewHolder holder; + if (convertView == null) { + convertView = mInflater.inflate(R.layout.list_row, null); + holder = new ViewHolder(); + holder.text = (TextView) convertView.findViewById(R.id.TextView01); + holder.text2 = (TextView) convertView.findViewById(R.id.TextView02); + + convertView.setTag(holder); + } else { + holder = (ViewHolder) convertView.getTag(); + } + + /** + * Display the copyrights on the bottom of the directions list + */ + if (position == mDirections.getDirections().size()){ + holder.text.setText(mDirections.getCopyrights()); + holder.text2.setText(""); + } else { + holder.text.setText(Html.fromHtml(mDirections.getDirections().get(position))); + holder.text2.setText(mDirections.getDurations().get(position) +" : "+ mDirections.getDistances().get(position)); + } + return convertView; + } + + /** + * this class will hold the TextViews + * @author ricky barrette + */ + class ViewHolder { + TextView text; + TextView text2; + } + +} \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsListFragment.java b/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsListFragment.java new file mode 100644 index 0000000..f1d453d --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsListFragment.java @@ -0,0 +1,97 @@ +/** + * DirectionsListFragment.java + * @date Nov 25, 2011 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.fragments; + +import java.util.ArrayList; + +import android.support.v4.app.ListFragment; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import com.TwentyCodes.android.location.OnDirectionSelectedListener; +import com.TwentyCodes.android.overlays.DirectionsOverlay; +import com.google.android.maps.GeoPoint; + +/** + * This fragment will be used to display directions to the user. + * When a specific direction is clicked, the corrispoding geopoint is returned via listener + * @author ricky barrette + */ +public class DirectionsListFragment extends ListFragment { + + private OnDirectionSelectedListener mListener; + private ArrayList mPoints; + + /** + * Creates a new Directions List Fragment + * @author ricky barrette + */ + public DirectionsListFragment() { + super(); + } + + /** + * Creates a new Directions List Fragment + * @param listener + * @author ricky barrette + */ + public DirectionsListFragment(OnDirectionSelectedListener listener) { + this(); + mListener = listener; + } + + /** + * Deletes all content in the listview + * @author ricky barrette + */ + public void clear() { + this.setListAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, new ArrayList())); + } + + /** + * Called when a list item is clicked. + * Checks to see if the list item is a direction, if to it reports the selected direction's geopoint to the listener + * (non-Javadoc) + * @see android.widget.AdapterView.OnItemClickListener#onItemClick(android.widget.AdapterView, android.view.View, int, long) + */ + @Override + public void onListItemClick(ListView l, View w, int position, long id) { + if(position < mPoints.size()) + if(mListener != null) + mListener.onDirectionSelected(mPoints.get(position)); + } + + /** + * (non-Javadoc) + * @see android.support.v4.app.Fragment#onStart() + */ + @Override + public void onStart() { + this.setListShown(true); + super.onStart(); + } + + /** + * Displays the directions from the provided DirectionsOverlay object + * @param directions + * @author ricky barrette + */ + public void setDirections(final DirectionsOverlay directions) { + mPoints = directions.getPoints(); + this.setListAdapter(new DirectionsAdapter(getActivity(), directions)); + } + + /** + * Sets the text to be displayed while the list is empty + * @param text + * @author ricky barrette + */ + public void SetEmptyText(String text){ + this.setEmptyText(text); + } +} diff --git a/LocationLib/src/com/TwentyCodes/android/location/MapFragmentBase.java b/LocationLib/src/com/TwentyCodes/android/fragments/MapFragmentBase.java similarity index 90% rename from LocationLib/src/com/TwentyCodes/android/location/MapFragmentBase.java rename to LocationLib/src/com/TwentyCodes/android/fragments/MapFragmentBase.java index 7466da7..72abe18 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/MapFragmentBase.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/MapFragmentBase.java @@ -4,7 +4,7 @@ * @author ricky barrette * @author Twenty Codes, LLC */ -package com.TwentyCodes.android.location; +package com.TwentyCodes.android.fragments; import android.os.Bundle; import android.support.v4.app.Fragment; @@ -12,6 +12,10 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.TwentyCodes.android.location.MapView; +import com.TwentyCodes.android.location.R; +import com.TwentyCodes.android.location.R.id; +import com.TwentyCodes.android.location.R.layout; import com.google.android.maps.GeoPoint; import com.google.android.maps.Overlay; diff --git a/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHoookUserOverlayMapFragment.java b/LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java similarity index 91% rename from LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHoookUserOverlayMapFragment.java rename to LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java index f72d6f8..91445ac 100644 --- a/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHoookUserOverlayMapFragment.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java @@ -4,12 +4,12 @@ * @author ricky barrette * @author Twenty Codes, LLC */ -package com.TwentyCodes.android.SkyHook; +package com.TwentyCodes.android.fragments; import com.TwentyCodes.android.location.CompassListener; import com.TwentyCodes.android.location.GeoPointLocationListener; -import com.TwentyCodes.android.location.MapFragmentBase; import com.TwentyCodes.android.location.MapView; +import com.TwentyCodes.android.overlays.SkyHookUserOverlay; import com.google.android.maps.GeoPoint; /** @@ -88,7 +88,7 @@ public class SkyHoookUserOverlayMapFragment extends MapFragmentBase implements G /** * (non-Javadoc) - * @see com.TwentyCodes.android.location.MapFragmentBase#onMapViewCreate(com.TwentyCodes.android.location.MapView) + * @see com.TwentyCodes.android.fragments.MapFragmentBase#onMapViewCreate(com.TwentyCodes.android.location.MapView) */ @Override public void onMapViewCreate(MapView map) { @@ -104,7 +104,7 @@ public class SkyHoookUserOverlayMapFragment extends MapFragmentBase implements G /** * (non-Javadoc) - * @see com.TwentyCodes.android.location.MapFragmentBase#onPause() + * @see com.TwentyCodes.android.fragments.MapFragmentBase#onPause() */ @Override public void onPause() { @@ -115,7 +115,7 @@ public class SkyHoookUserOverlayMapFragment extends MapFragmentBase implements G /** * (non-Javadoc) - * @see com.TwentyCodes.android.location.MapFragmentBase#onResume() + * @see com.TwentyCodes.android.fragments.MapFragmentBase#onResume() */ @Override public void onResume() { diff --git a/LocationLib/src/com/TwentyCodes/android/location/UserOverlayMapFragment.java b/LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java similarity index 87% rename from LocationLib/src/com/TwentyCodes/android/location/UserOverlayMapFragment.java rename to LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java index bc91270..0b1fd2c 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/UserOverlayMapFragment.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java @@ -4,8 +4,12 @@ * @author ricky barrette * @author Twenty Codes, LLC */ -package com.TwentyCodes.android.location; +package com.TwentyCodes.android.fragments; +import com.TwentyCodes.android.location.CompassListener; +import com.TwentyCodes.android.location.GeoPointLocationListener; +import com.TwentyCodes.android.location.MapView; +import com.TwentyCodes.android.overlays.UserOverlay; import com.google.android.maps.GeoPoint; /** @@ -84,7 +88,7 @@ public class UserOverlayMapFragment extends MapFragmentBase implements GeoPointL /** * (non-Javadoc) - * @see com.TwentyCodes.android.location.MapFragmentBase#onMapViewCreate(com.TwentyCodes.android.location.MapView) + * @see com.TwentyCodes.android.fragments.MapFragmentBase#onMapViewCreate(com.TwentyCodes.android.location.MapView) */ @Override public void onMapViewCreate(MapView map) { @@ -100,7 +104,7 @@ public class UserOverlayMapFragment extends MapFragmentBase implements GeoPointL /** * (non-Javadoc) - * @see com.TwentyCodes.android.location.MapFragmentBase#onPause() + * @see com.TwentyCodes.android.fragments.MapFragmentBase#onPause() */ @Override public void onPause() { @@ -111,7 +115,7 @@ public class UserOverlayMapFragment extends MapFragmentBase implements GeoPointL /** * (non-Javadoc) - * @see com.TwentyCodes.android.location.MapFragmentBase#onResume() + * @see com.TwentyCodes.android.fragments.MapFragmentBase#onResume() */ @Override public void onResume() { diff --git a/LocationLib/src/com/TwentyCodes/android/location/OnDirectionSelectedListener.java b/LocationLib/src/com/TwentyCodes/android/location/OnDirectionSelectedListener.java new file mode 100644 index 0000000..8f546f8 --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/location/OnDirectionSelectedListener.java @@ -0,0 +1,24 @@ +/** + * OnDirectionSelectedListener.java + * @date Mar 5, 2012 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.location; + +import com.google.android.maps.GeoPoint; + +/** + * A simple interfrace for a directions list fragment + * @author ricky barrette + */ +public interface OnDirectionSelectedListener { + + /** + * Called when the user selects a direction from a directions list + * @param point + * @author ricky barrette + */ + public void onDirectionSelected(GeoPoint point); + +} diff --git a/LocationLib/src/com/TwentyCodes/android/location/LocationSelectedListener.java b/LocationLib/src/com/TwentyCodes/android/location/OnLocationSelectedListener.java similarity index 85% rename from LocationLib/src/com/TwentyCodes/android/location/LocationSelectedListener.java rename to LocationLib/src/com/TwentyCodes/android/location/OnLocationSelectedListener.java index 61a0d25..a62cb75 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/LocationSelectedListener.java +++ b/LocationLib/src/com/TwentyCodes/android/location/OnLocationSelectedListener.java @@ -6,7 +6,7 @@ import com.google.android.maps.GeoPoint; * This interface will be used to pass the selected location from the dialogs to the listening instance * @author ricky barrette */ -public interface LocationSelectedListener { +public interface OnLocationSelectedListener { public void onLocationSelected(GeoPoint point); } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/CompasOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java similarity index 95% rename from LocationLib/src/com/TwentyCodes/android/location/CompasOverlay.java rename to LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java index c5a47e4..1bc3c1e 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/CompasOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java @@ -4,7 +4,7 @@ * @author ricky barrette * @author Twenty Codes, LLC */ -package com.TwentyCodes.android.location; +package com.TwentyCodes.android.overlays; import android.content.Context; import android.content.res.Resources; @@ -15,7 +15,11 @@ import android.graphics.Matrix; import android.graphics.Point; import android.util.TypedValue; +import com.TwentyCodes.android.location.CompassListener; +import com.TwentyCodes.android.location.CompassSensor; +import com.TwentyCodes.android.location.GeoUtils; import com.TwentyCodes.android.location.R; +import com.TwentyCodes.android.location.R.drawable; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java new file mode 100644 index 0000000..3a0d069 --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java @@ -0,0 +1,352 @@ +/** + * DirectionsOverlay.java + * @date Nov 10, 2011 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.overlays; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.util.ArrayList; + +import org.apache.http.client.ClientProtocolException; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.impl.client.DefaultHttpClient; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import android.graphics.Color; +import android.util.Log; + +import com.TwentyCodes.android.debug.Debug; +import com.TwentyCodes.android.location.MapView; +import com.google.android.maps.GeoPoint; + +/** + * This Overlay class will be used to display provided by the Google Directions API on a map + * @author ricky barrette + */ +public class DirectionsOverlay { + + private static final String TAG = "DirectionsOverlay"; + ArrayList mPath; + ArrayList mDirections; + private MapView mMapView; + private OnDirectionsCompleteListener mListener; + private String mCopyRights; + private ArrayList mPoints; + private ArrayList mDistance; + private ArrayList mDuration; + private ArrayList mWarnings; + + /** + * Downloads and Creates a new DirectionsOverlay from the provided points + * @param origin point + * @param destination point + * @author ricky barrette + * @throws IOException + * @throws ClientProtocolException + * @throws IllegalStateException + * @throws JSONException + */ + public DirectionsOverlay(MapView map, GeoPoint origin, GeoPoint destination, OnDirectionsCompleteListener listener) throws IllegalStateException, ClientProtocolException, IOException, JSONException { + mMapView = map; + mListener = listener; + String json = downloadJSON(generateUrl(origin, destination)); + drawPath(json); + } + + /** + * Creates a new DirectionsOverlay from the provided String JSON + * @param json + * @throws JSONException + * @author ricky barrette + */ + public DirectionsOverlay(MapView map, String json, OnDirectionsCompleteListener listener) throws JSONException{ + mListener = listener; + mMapView = map; + drawPath(json); + } + + /** + * Downloads Google Directions JSON from the Internet + * @param url + * @return + * @throws IllegalStateException + * @throws ClientProtocolException + * @throws IOException + * @author ricky barrette + */ + private String downloadJSON(String url) throws IllegalStateException, ClientProtocolException, IOException { + if(Debug.DEBUG) + Log.d(TAG, url); + if(url == null) + throw new NullPointerException(); + StringBuffer response = new StringBuffer(); + BufferedReader br = new BufferedReader(new InputStreamReader(new DefaultHttpClient().execute(new HttpGet(url)).getEntity().getContent())); + String buff = null; + while ((buff = br.readLine()) != null) + response.append(buff); + return response.toString(); + } + + /** + * Creates a new DirectionsOverlay from the json provided + * @param json of Google Directions API + * @author ricky barrette + * @return + * @throws JSONException + */ + public void drawPath(String json) throws JSONException{ + if(Debug.DEBUG){ + Log.d(TAG, "drawPath"); + Log.d(TAG, json); + } + mPath = new ArrayList(); + mDirections = new ArrayList(); + mPoints = new ArrayList(); + mDistance = new ArrayList(); + mDuration = new ArrayList(); + + //get first route + JSONObject route = new JSONObject(json).getJSONArray("routes").getJSONObject(0); + + mCopyRights = route.getString("copyrights"); + //route.getString("status"); + + JSONObject leg = route.getJSONArray("legs").getJSONObject(0); + getDistance(leg); + getDuration(leg); +// mMapView.getOverlays().add(new PathOverlay(getGeoPoint(leg.getJSONObject("start_location")), 12, Color.GREEN)); +// mMapView.getOverlays().add(new PathOverlay(getGeoPoint(leg.getJSONObject("end_location")), 12, Color.RED)); + + leg.getString("start_address"); + leg.getString("end_address"); + +// JSONArray warnings = leg.getJSONArray("warnings"); +// for(int i = 0; i < warnings.length(); i++){ +// mWarnings.add(warnings.get)w +// }w + + /* + * here we will parse the steps of the directions + */ + if(Debug.DEBUG) + Log.d(TAG, "processing steps"); + JSONArray steps = leg.getJSONArray("steps"); + JSONObject step = null; + for(int i = 0; i < steps.length(); i++){ + if(Debug.DEBUG) + Log.d(TAG, "step "+i); + + step = steps.getJSONObject(i); + + if(Debug.DEBUG){ + Log.d(TAG, "start "+getGeoPoint(step.getJSONObject("start_location")).toString()); + Log.d(TAG, "end "+getGeoPoint(step.getJSONObject("end_location")).toString()); + } + +// if(Debug.DEBUG) +// mMapView.getOverlays().add(new PathOverlay(getGeoPoint(step.getJSONObject("start_location")), getGeoPoint(step.getJSONObject("end_location")), Color.MAGENTA)); + + decodePoly(step); + + mDuration.add(getDuration(step)); + + mDistance.add(getDistance(step)); + + mDirections.add(step.getString("html_instructions")); +// Log.d("TEST", step.getString("html_instructions")); + mPoints.add(getGeoPoint(step.getJSONObject("start_location"))); + + } + if(Debug.DEBUG) + Log.d(TAG, "finished parsing"); + + if(mMapView != null){ + mMapView.getOverlays().addAll(mPath); + mMapView.postInvalidate(); + } + + if(mListener != null) + mListener.onDirectionsComplete(DirectionsOverlay.this); + } + + /** + * @param origin + * @param destination + * @return The Google API url for our directions + * @author ricky barrette + */ + private String generateUrl(GeoPoint origin, GeoPoint destination){ + return "http://maps.googleapis.com/maps/api/directions/json?&origin="+ + Double.toString(origin.getLatitudeE6() / 1.0E6)+ + ","+ + Double.toString(origin.getLongitudeE6() / 1.0E6)+ + "&destination="+ + Double.toString(destination.getLatitudeE6() / 1.0E6)+ + ","+ + Double.toString(destination.getLongitudeE6() / 1.0E6)+ + "&sensor=true&mode=walking"; + } + + + /** + * Deocodes googles polyline + * @param encoded + * @return a list of geopoints representing the path + * @author Mark McClure http://facstaff.unca.edu/mcmcclur/googlemaps/encodepolyline/ + * @author ricky barrette + * @throws JSONException + */ + private void decodePoly(JSONObject step) throws JSONException { + if(Debug.DEBUG) + Log.d(TAG, "decodePoly"); + + String encoded = step.getJSONObject("polyline").getString("points"); + int index = 0, len = encoded.length(); + int lat = 0, lng = 0; + + GeoPoint last = null; + while (index < len) { + int b, shift = 0, result = 0; + do { + b = encoded.charAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlat = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lat += dlat; + + shift = 0; + result = 0; + do { + b = encoded.charAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + int dlng = ((result & 1) != 0 ? ~(result >> 1) : (result >> 1)); + lng += dlng; + + GeoPoint p = new GeoPoint((int) (((double) lat / 1E5) * 1E6), (int) (((double) lng / 1E5) * 1E6)); + + if(Debug.DEBUG){ + Log.d(TAG, "current = "+ p.toString()); + if(last != null) + Log.d(TAG, "last = "+ last.toString()); + } + + + if(last != null) + mPath.add(new PathOverlay(last, p, Color.RED)); + + last = p; + } + + } + + /** + * Converts a JSON location object into a GeoPoint + * @param point + * @return Geopoint parsed from the provided JSON Object + * @throws JSONException + * @author ricky barrette + */ + private GeoPoint getGeoPoint(JSONObject point) throws JSONException{ + return new GeoPoint((int) (point.getDouble("lat")*1E6), (int) (point.getDouble("lng")*1E6)); + } + + /** + * @param step + * @return the duration of a step + * @throws JSONException + * @author ricky barrette + */ + private String getDuration(JSONObject step) throws JSONException{ + return step.getJSONObject("duration").getString("text"); + } + + /** + * @param step + * @return the distance of a step + * @throws JSONException + * @author ricky barrette + */ + private String getDistance(JSONObject step) throws JSONException{ + return step.getJSONObject("distance").getString("text"); + } + + /** + * @return the array of PathOverlays + * @author ricky barrette + */ + public ArrayList getPath(){ + return mPath; + } + + /** + * Removes the directions overlay from the map view + * @author ricky barrette + */ + public void removePath() { + if(mMapView.getOverlays().removeAll(mPath)); + } + + /** + * @author ricky barrette + */ + public interface OnDirectionsCompleteListener{ + public void onDirectionsComplete(DirectionsOverlay directionsOverlay); + } + + /** + * @return + * @author ricky barrette + */ + public ArrayList getDirections() { + return mDirections; + } + + /** + * @return + * @author ricky barrette + */ + public ArrayList getPoints() { + return mPoints; + } + + /** + * @return + * @author ricky barrette + */ + public ArrayList getDurations(){ + return mDuration; + } + + /** + * @return + * @author ricky barrette + */ + public ArrayList getDistances(){ + return mDistance; + } + + /** + * @return + * @author ricky barrette + */ + public String getCopyrights(){ + return mCopyRights; + } + + /** + * @return + * @author ricky barrette + */ + public ArrayList getWarnings() { + return mWarnings; + } +} \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/PathOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/PathOverlay.java new file mode 100644 index 0000000..22e306d --- /dev/null +++ b/LocationLib/src/com/TwentyCodes/android/overlays/PathOverlay.java @@ -0,0 +1,86 @@ +/** + * PathOverlay.java + * @date Nov 11, 2011 + * @author ricky barrette + * @author Twenty Codes, LLC + */ +package com.TwentyCodes.android.overlays; + +import android.graphics.Canvas; +import android.graphics.Paint; +import android.graphics.Point; +import android.graphics.RectF; + +import com.google.android.maps.GeoPoint; +import com.google.android.maps.MapView; +import com.google.android.maps.Overlay; +import com.google.android.maps.Projection; + +/** + * This overlay class is used to draw a path and points on a map + * @author ricky barrette + */ +public class PathOverlay extends Overlay { + + private static final int PATH = 0; + private static final int POINT = 1; + private GeoPoint mStart; + private GeoPoint mEnd; + private int mColor; + private int mMode; + private int mRadius; + + /** + * Creates a new PathOverlay in path mode + * @author ricky barrette + */ + public PathOverlay(GeoPoint start, GeoPoint end, int color) { + mStart = start; + mEnd = end; + mColor = color; + mMode = PATH; + } + + /** + * Creates a new PathOverlay in point mode. This is used to draw end points. + * @param point + * @param radius + * @param color + * @author ricky barrette + */ + public PathOverlay(GeoPoint point, int radius, int color){ + mMode = POINT; + mRadius = radius; + mStart = point; + } + + /** + * + * @param canvas canvas to be drawn on + * @param mapView + * @param shadow + * @param when + */ + @Override + public void draw(Canvas canvas, MapView mapView, boolean shadow) { + Projection projection = mapView.getProjection(); + Paint paint = new Paint(); + paint.setColor(mColor); + paint.setAntiAlias(true); + Point point = new Point(); + projection.toPixels(mStart, point); + + switch (mMode){ + case POINT: + RectF oval = new RectF(point.x - mRadius, point.y - mRadius, point.x + mRadius, point.y + mRadius); + canvas.drawOval(oval, paint); + case PATH: + Point point2 = new Point(); + projection.toPixels(mEnd, point2); + paint.setStrokeWidth(5); + paint.setAlpha(120); + canvas.drawLine(point.x, point.y, point2.x, point2.y, paint); + } + super.draw(canvas, mapView, shadow); + } +} \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/RadiusOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java similarity index 93% rename from LocationLib/src/com/TwentyCodes/android/location/RadiusOverlay.java rename to LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java index 75ccc48..4ef0675 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/RadiusOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java @@ -3,7 +3,7 @@ * @author ricky barrette */ -package com.TwentyCodes.android.location; +package com.TwentyCodes.android.overlays; import android.graphics.Canvas; import android.graphics.Color; @@ -12,6 +12,8 @@ import android.graphics.Paint.Style; import android.graphics.Point; import android.graphics.RectF; +import com.TwentyCodes.android.location.GeoUtils; +import com.TwentyCodes.android.location.OnLocationSelectedListener; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView; import com.google.android.maps.Overlay; @@ -30,7 +32,7 @@ public class RadiusOverlay extends Overlay{ private float mRadius = 0; private int mColor = Color.GREEN; private GeoPoint mRadiusPoint; - private LocationSelectedListener mListener; + private OnLocationSelectedListener mListener; /** * Creates a new RadiusOverlay @@ -150,7 +152,7 @@ public class RadiusOverlay extends Overlay{ return 0; } - public void setLocationSelectedListener(LocationSelectedListener listener) { + public void setLocationSelectedListener(OnLocationSelectedListener listener) { this.mListener = listener; } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookUserOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java similarity index 81% rename from LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookUserOverlay.java rename to LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java index 1e01ba0..26f0fff 100644 --- a/LocationLib/src/com/TwentyCodes/android/SkyHook/SkyHookUserOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java @@ -3,11 +3,11 @@ * @author ricky barrette * @date Oct 2, 2010 */ -package com.TwentyCodes.android.SkyHook; +package com.TwentyCodes.android.overlays; import android.content.Context; -import com.TwentyCodes.android.location.UserOverlayBase; +import com.TwentyCodes.android.SkyHook.SkyHook; import com.google.android.maps.MapView; /** @@ -38,7 +38,7 @@ public class SkyHookUserOverlay extends UserOverlayBase{ /** * Called when the location provider needs to be disabled * (non-Javadoc) - * @see com.TwentyCodes.android.location.UserOverlayBase#onMyLocationDisabled() + * @see com.TwentyCodes.android.overlays.UserOverlayBase#onMyLocationDisabled() */ @Override public void onMyLocationDisabled() { @@ -48,7 +48,7 @@ public class SkyHookUserOverlay extends UserOverlayBase{ /** * Called when the location provider needs to be enabled * (non-Javadoc) - * @see com.TwentyCodes.android.location.UserOverlayBase#onMyLocationEnabled() + * @see com.TwentyCodes.android.overlays.UserOverlayBase#onMyLocationEnabled() */ @Override public void onMyLocationEnabled() { diff --git a/LocationLib/src/com/TwentyCodes/android/location/UserOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java similarity index 89% rename from LocationLib/src/com/TwentyCodes/android/location/UserOverlay.java rename to LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java index f67898d..fb9e504 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/UserOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java @@ -3,10 +3,11 @@ * @author ricky barrette * @date Dec 28, 2010 */ -package com.TwentyCodes.android.location; +package com.TwentyCodes.android.overlays; import android.content.Context; +import com.TwentyCodes.android.location.AndroidGPS; import com.google.android.maps.MapView; /** diff --git a/LocationLib/src/com/TwentyCodes/android/location/UserOverlayBase.java b/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlayBase.java similarity index 97% rename from LocationLib/src/com/TwentyCodes/android/location/UserOverlayBase.java rename to LocationLib/src/com/TwentyCodes/android/overlays/UserOverlayBase.java index 1d46356..c9fe986 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/UserOverlayBase.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlayBase.java @@ -4,7 +4,7 @@ * @author ricky barrette * @author Twenty Codes, LLC */ -package com.TwentyCodes.android.location; +package com.TwentyCodes.android.overlays; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -22,7 +22,12 @@ import android.os.Handler; import android.os.SystemClock; import android.util.Log; +import com.TwentyCodes.android.location.CompassListener; +import com.TwentyCodes.android.location.GeoPointLocationListener; +import com.TwentyCodes.android.location.GeoUtils; import com.TwentyCodes.android.location.R; +import com.TwentyCodes.android.location.R.drawable; +import com.TwentyCodes.android.location.R.string; import com.TwentyCodes.android.debug.Debug; import com.google.android.maps.GeoPoint; import com.google.android.maps.MapView;