diff --git a/LocationLib/AndroidManifest.xml b/LocationLib/AndroidManifest.xml index 5aa7dd1..df6d148 100644 --- a/LocationLib/AndroidManifest.xml +++ b/LocationLib/AndroidManifest.xml @@ -15,8 +15,8 @@ + android:minSdkVersion="8" + android:targetSdkVersion="15" /> - - - + + + + + + \ No newline at end of file diff --git a/LocationLib/res/layout/powered_by_skyhook.xml b/LocationLib/res/layout/powered_by_skyhook.xml index 035bcc1..2bdfd79 100644 --- a/LocationLib/res/layout/powered_by_skyhook.xml +++ b/LocationLib/res/layout/powered_by_skyhook.xml @@ -4,7 +4,7 @@ android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="#ffffff" - tools:ignore="ContentDescription" > + tools:ignore="ContentDescription,Overdraw" > -1) - registerWakeUp(); - super.onDestroy(); - } - - /* - * I believe that this method is no longer needed as we are not supporting pre 2.1 - */ -// /** -// * To keep backwards compatibility we override onStart which is the equivalent of onStartCommand in pre android 2.x -// * @author ricky barrette -// */ -// @Override -// public void onStart(Intent intent, int startId) { -// Log.i(SkyHook.TAG, "onStart.Service started with start id of: " + startId); -// parseIntent(intent); -// this.mSkyhook.getUpdates(); -// } - - /** - * This method is called when startService is called. only used in 2.x android. - * @author ricky barrette - */ - @Override - public int onStartCommand(Intent intent, int flags, int startId) { - Log.i(SkyHook.TAG , "onStartCommand.Service started with start id of: " + startId); - mStartID = startId; - parseIntent(intent); - this.mSkyhook.getUpdates(); - return START_STICKY; - } - - /** - * Parses the incoming intent for the service options - * - * @author ricky barrette - */ - private void parseIntent(Intent intent){ - - this.mIntent = intent; - - if(intent != null){ - if (intent.hasExtra(LocationLibraryConstants.INTENT_EXTRA_PERIOD_BETWEEN_UPDATES)) - mPeriod = intent.getLongExtra(LocationLibraryConstants.INTENT_EXTRA_PERIOD_BETWEEN_UPDATES, LocationLibraryConstants.FAIL_SAFE_UPDATE_INVERVAL); - - if (intent.hasExtra(LocationLibraryConstants.INTENT_EXTRA_REQUIRED_ACCURACY)) - mRequiredAccuracy = intent.getIntExtra(LocationLibraryConstants.INTENT_EXTRA_REQUIRED_ACCURACY, LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY); - } - } - - /** - * registers our Receiver the starts the service with the alarm manager - * @author ricky barrette - */ - private void registerWakeUp(){ - AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); - am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + this.mPeriod, PendingIntent.getService(this, REQUEST_CODE, this.mIntent, 0)); - } - /** * a convince method for getting an intent to start the service * @param context @@ -187,7 +49,6 @@ public class SkyHookService extends Service implements GeoPointLocationListener, public static Intent getStartServiceIntent(final Context context){ return new Intent(context, SkyHookService.class); } - /** * a convince method for stopping the service and removing its que from the alarm manager * @param context @@ -199,34 +60,72 @@ public class SkyHookService extends Service implements GeoPointLocationListener, @Override public void run(){ context.stopService(new Intent(context, SkyHookService.class)); - ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).cancel(PendingIntent.getService(context, REQUEST_CODE, new Intent(context, SkyHookService.class), 0)); + ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).cancel(PendingIntent.getService(context, REQUEST_CODE, new Intent(context, SkyHookService.class), 0)); } }; } + private SkyHook mSkyhook; + protected long mPeriod = -1; + private GeoPoint mLocation; + private int mStartID; + private int mRequiredAccuracy; - @Override - public void onLocationChanged(GeoPoint point, int accuracy) { - this.mLocation = point; - this.mAccuracy = accuracy; - /* - * fail safe - * if the accuracy is greater than the minimum required accuracy - * then continue - * else stop to report location - */ - if(accuracy < (this.mRequiredAccuracy > -1 ? this.mRequiredAccuracy : LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY) || LocationLibraryConstants.REPORT_FIRST_LOCATION) - this.stopSelf(this.mStartID); - + private Intent mIntent; + + private int mAccuracy; + + /** + * broadcasts location to anything listening for updates + * + * @author ricky barrette + */ + private void braodcastLocation() { + if (mLocation != null) { + final Intent locationUpdate = new Intent(); + if(mIntent.getAction() != null) + locationUpdate.setAction(mIntent.getAction()); + else + locationUpdate.setAction(LocationLibraryConstants.INTENT_ACTION_UPDATE); + locationUpdate.putExtra(LocationManager.KEY_LOCATION_CHANGED, convertLocation()); + sendBroadcast(locationUpdate); + } + } + + /** + * converts skyhook's location object into android's location object + * @return converted location + * @author ricky barrette + */ + public Location convertLocation(){ + final Location location = new Location("location"); + location.setLatitude(mLocation.getLatitudeE6() /1e6); + location.setLongitude(mLocation.getLongitudeE6() /1e6); + location.setAccuracy(mAccuracy); + return location; } @Override public void done() { // unused - + } + /* + * I believe that this method is no longer needed as we are not supporting pre 2.1 + */ + // /** + // * To keep backwards compatibility we override onStart which is the equivalent of onStartCommand in pre android 2.x + // * @author ricky barrette + // */ + // @Override + // public void onStart(Intent intent, int startId) { + // Log.i(SkyHook.TAG, "onStart.Service started with start id of: " + startId); + // parseIntent(intent); + // this.mSkyhook.getUpdates(); + // } + @Override - public WPSContinuation handleError(WPSReturnCode arg0) { + public WPSContinuation handleError(final WPSReturnCode arg0) { // unused return null; } @@ -234,12 +133,113 @@ public class SkyHookService extends Service implements GeoPointLocationListener, @Override public void handleSuccess() { // unused - + + } + + /** + * (non-Javadoc) + * @see android.app.Service#onBind(android.content.Intent) + * @param arg0 + * @return + * @author Ricky Barrette barrette + */ + @Override + public IBinder onBind(final Intent arg0) { + return null; } @Override - public void onFirstFix(boolean isFistFix) { + public void onCreate(){ + super.onCreate(); + mSkyhook = new SkyHook(this); + mSkyhook.setLocationListener(this); + + /* + * fail safe + * this will stop the service after the maximum running time, if location has not been reported + */ + new Handler().postDelayed(new Runnable(){ + @Override + public void run(){ + stopSelfResult(mStartID); + } + }, LocationLibraryConstants.MAX_LOCATION_SERVICE_RUN_TIME); + } + + /** + * aborts location services + * (non-Javadoc) + * @see android.app.Service#onDestroy() + * @author Ricky Barrette + */ + @Override + public void onDestroy(){ + mSkyhook.removeUpdates(); + braodcastLocation(); + //ask android to restart service if mPeriod is set + if(mPeriod > -1) + registerWakeUp(); + super.onDestroy(); + } + + @Override + public void onFirstFix(final boolean isFistFix) { // unused - + + } + + @Override + public void onLocationChanged(final GeoPoint point, final int accuracy) { + mLocation = point; + mAccuracy = accuracy; + /* + * fail safe + * if the accuracy is greater than the minimum required accuracy + * then continue + * else stop to report location + */ + if(accuracy < (mRequiredAccuracy > -1 ? mRequiredAccuracy : LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY) || LocationLibraryConstants.REPORT_FIRST_LOCATION) + this.stopSelf(mStartID); + + } + + /** + * This method is called when startService is called. only used in 2.x android. + * @author ricky barrette + */ + @Override + public int onStartCommand(final Intent intent, final int flags, final int startId) { + Log.i(SkyHook.TAG , "onStartCommand.Service started with start id of: " + startId); + mStartID = startId; + parseIntent(intent); + mSkyhook.getUpdates(); + return START_STICKY; + } + + /** + * Parses the incoming intent for the service options + * + * @author ricky barrette + */ + private void parseIntent(final Intent intent){ + + mIntent = intent; + + if(intent != null){ + if (intent.hasExtra(LocationLibraryConstants.INTENT_EXTRA_PERIOD_BETWEEN_UPDATES)) + mPeriod = intent.getLongExtra(LocationLibraryConstants.INTENT_EXTRA_PERIOD_BETWEEN_UPDATES, LocationLibraryConstants.FAIL_SAFE_UPDATE_INVERVAL); + + if (intent.hasExtra(LocationLibraryConstants.INTENT_EXTRA_REQUIRED_ACCURACY)) + mRequiredAccuracy = intent.getIntExtra(LocationLibraryConstants.INTENT_EXTRA_REQUIRED_ACCURACY, LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY); + } + } + + /** + * registers our Receiver the starts the service with the alarm manager + * @author ricky barrette + */ + private void registerWakeUp(){ + final AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + mPeriod, PendingIntent.getService(this, REQUEST_CODE, mIntent, 0)); } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java b/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java index d83824f..2ca4906 100644 --- a/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java +++ b/LocationLib/src/com/TwentyCodes/android/debug/LocationLibraryConstants.java @@ -6,8 +6,6 @@ */ package com.TwentyCodes.android.debug; -import com.TwentyCodes.android.location.BaseLocationReceiver; - import android.app.AlarmManager; import android.hardware.SensorManager; import android.location.LocationManager; @@ -17,10 +15,10 @@ import android.location.LocationManager; * @author ricky barrette */ public final class LocationLibraryConstants { - + static{ SUPPORTS_FROYO = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO; - + SUPPORTS_GINGERBREAD = android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.GINGERBREAD; } @@ -41,37 +39,37 @@ public final class LocationLibraryConstants { * @author ricky barrette */ public static final long MAX_LOCATION_SERVICE_RUN_TIME = 60000l; - + /** * Forces single shot location services to return the first location * @author ricky barrette */ public static final boolean REPORT_FIRST_LOCATION = false; - + /** * Minimum Required accuracy to report * @author ricky barrette */ public static final int MINIMUM_REQUIRED_ACCURACY = 100; - + public static final boolean SUPPORTS_FROYO; - + public static final boolean SUPPORTS_GINGERBREAD; public static final String INTENT_ACTION_UPDATE = "TwentyCodes.intent.action.LocationUpdate"; - + public static final String INTENT_EXTRA_LOCATION_CHANGED = LocationManager.KEY_LOCATION_CHANGED; - + /** * Used to tell the service how frequently it needs to run. This is required if you want a multishot service */ public static final String INTENT_EXTRA_PERIOD_BETWEEN_UPDATES = "period_beween_updates"; - + /** * Used to tell the service how accurate of a location you want reported */ public static final String INTENT_EXTRA_REQUIRED_ACCURACY = "required_accuracy"; - + /** * used if the INTENT_EXTRA_PERIOD_BETWEEN_UPDATES is present, but contains no data */ diff --git a/LocationLib/src/com/TwentyCodes/android/debug/SkyHookRegistrationBehavior.java b/LocationLib/src/com/TwentyCodes/android/debug/SkyHookRegistrationBehavior.java index 29004cf..9d580c1 100644 --- a/LocationLib/src/com/TwentyCodes/android/debug/SkyHookRegistrationBehavior.java +++ b/LocationLib/src/com/TwentyCodes/android/debug/SkyHookRegistrationBehavior.java @@ -15,16 +15,16 @@ public enum SkyHookRegistrationBehavior { /** * Used to force SkyHookRegistration.getUserName to behave normally */ - NORMAL, - + NORMAL, + /** * Used to force SkyHookRegistration.getUserName to return the testing user name */ - USE_TESTING_USERNAME, - + USE_TESTING_USERNAME, + /** * Used to force SkyHookRegistration.getUserName to return null */ RETURN_NULL; - + } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/fragments/BaseMapFragment.java b/LocationLib/src/com/TwentyCodes/android/fragments/BaseMapFragment.java index 2b17c81..9118f60 100644 --- a/LocationLib/src/com/TwentyCodes/android/fragments/BaseMapFragment.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/BaseMapFragment.java @@ -28,7 +28,7 @@ public abstract class BaseMapFragment extends Fragment { private MapView mMapView; private boolean isGPSDialogEnabled; private ProgressBar mProgress; - + /** * Creates a new MapFragment * @author ricky barrette @@ -36,11 +36,11 @@ public abstract class BaseMapFragment extends Fragment { public BaseMapFragment() { super(); } - - public void addOverlay(Overlay overlay){ + + public void addOverlay(final Overlay overlay){ mMapView.getOverlays().add(overlay); } - + /** * changes the map mode * @author ricky barrette @@ -57,17 +57,17 @@ public abstract class BaseMapFragment extends Fragment { isGPSDialogEnabled = false; mProgress.setVisibility(View.GONE); } - + /** - * Enables the Acquiring GPS dialog if the location has not been acquired - * - * @author ricky barrette - */ - public void enableGPSProgess(){ - isGPSDialogEnabled = true; - mProgress.setVisibility(View.VISIBLE); - } - + * Enables the Acquiring GPS dialog if the location has not been acquired + * + * @author ricky barrette + */ + public void enableGPSProgess(){ + isGPSDialogEnabled = true; + mProgress.setVisibility(View.VISIBLE); + } + /** * @return mapview * @author ricky barrette @@ -75,120 +75,120 @@ public abstract class BaseMapFragment extends Fragment { public MapView getMap(){ return mMapView; } - + /** - * Forces the map to redraw + * Forces the map to redraw * @author ricky barrette */ public void invalidate(){ - mMapView.invalidate(); - } - + mMapView.invalidate(); + } + /** * @return true if the GPS progress is showing * @author ricky barrette */ public boolean isGPSProgessShowing(){ - return isGPSDialogEnabled; - } - + return isGPSDialogEnabled; + } + /** * @return true if the map is in satellite mode * @author ricky barrette */ public boolean isSatellite(){ - return mMapView.isSatellite(); - } - + return mMapView.isSatellite(); + } + /** * Called when the fragment view is first created * (non-Javadoc) * @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater, android.view.ViewGroup, android.os.Bundle) */ @Override - public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - View view = inflater.inflate(R.layout.base_map_fragment, container, false); - + public View onCreateView(final LayoutInflater inflater, final ViewGroup container, final Bundle savedInstanceState) { + final View view = inflater.inflate(R.layout.base_map_fragment, container, false); + mMapView = (MapView) view.findViewById(R.id.mapview); mMapView.setClickable(true); - + mProgress = (ProgressBar) view.findViewById(R.id.mapProgressBar); onMapViewCreate(mMapView); - + return view; } - - /** + + /** * Called when the mapview has been initialized. here you want to init and add your custom overlays * @param map * @author ricky barrette */ public abstract void onMapViewCreate(MapView map); - - /** + + /** * Removes an overlay from the mapview * @param overlay * @author ricky barrette */ - public void removeOverlay(Object overlay){ + public void removeOverlay(final Object overlay){ mMapView.getOverlays().remove(overlay); } - + /** * Enables or disables the built in zoom controls * @param isShowing * @author ricky barrette */ - public void setBuiltInZoomControls(boolean isShowing){ - mMapView.setBuiltInZoomControls(isShowing); - } - - /** - * Sets where or not the map view is interactive - * @param isClickable - * @author ricky barrette - */ - public void setClickable(boolean isClickable){ - mMapView.setClickable(isClickable); - } - - /** - * Sets double tap zoom - * @param isDoubleTapZoonEnabled - * @author ricky barrette - */ - public void setDoubleTapZoonEnabled(boolean isDoubleTapZoonEnabled){ - mMapView.setDoubleTapZoonEnabled(isDoubleTapZoonEnabled); - } - - /** + public void setBuiltInZoomControls(final boolean isShowing){ + mMapView.setBuiltInZoomControls(isShowing); + } + + /** + * Sets where or not the map view is interactive + * @param isClickable + * @author ricky barrette + */ + public void setClickable(final boolean isClickable){ + mMapView.setClickable(isClickable); + } + + /** + * Sets double tap zoom + * @param isDoubleTapZoonEnabled + * @author ricky barrette + */ + public void setDoubleTapZoonEnabled(final boolean isDoubleTapZoonEnabled){ + mMapView.setDoubleTapZoonEnabled(isDoubleTapZoonEnabled); + } + + /** * Sets the center of the map to the provided point * @param point * @author ricky barrette */ - public boolean setMapCenter(GeoPoint point){ + public boolean setMapCenter(final GeoPoint point){ if(point == null) return false; mMapView.getController().setCenter(point); return true; } - + /** * Sets the view of the map. true is sat, false is map * @param isSat * @author ricky barrette */ - public void setSatellite(boolean isSat){ - mMapView.setSatellite(isSat); - } - - /** - * Sets the zoom level of the map - * @param zoom - * @author ricky barrette - */ - public void setZoom(int zoom){ - mMapView.getController().setZoom(zoom); - } + public void setSatellite(final boolean isSat){ + mMapView.setSatellite(isSat); + } + + /** + * Sets the zoom level of the map + * @param zoom + * @author ricky barrette + */ + public void setZoom(final int zoom){ + mMapView.getController().setZoom(zoom); + } } \ 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 index 572ef61..c9ff5d5 100644 --- a/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsAdapter.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsAdapter.java @@ -17,20 +17,29 @@ 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. + * 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 { - + + /** + * this class will hold the TextViews + * @author ricky barrette + */ + class ViewHolder { + TextView text; + TextView text2; + } private final LayoutInflater mInflater; + + private final DirectionsOverlay mDirections; - /** * Creates a new DirectionsAdapter * @author ricky barrette */ - public DirectionsAdapter(Context context, DirectionsOverlay directions) { + public DirectionsAdapter(final Context context, final DirectionsOverlay directions) { mInflater = LayoutInflater.from(context); mDirections = directions; } @@ -54,7 +63,7 @@ public class DirectionsAdapter extends BaseAdapter { * @author ricky barrette */ @Override - public Object getItem(int position) { + public Object getItem(final int position) { return position; } @@ -66,7 +75,7 @@ public class DirectionsAdapter extends BaseAdapter { * @author ricky barrette */ @Override - public long getItemId(int position) { + public long getItemId(final int position) { return position; } @@ -82,37 +91,27 @@ public class DirectionsAdapter extends BaseAdapter { @Override public View getView(final int position, View convertView, final ViewGroup parent) { final 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(); - } + 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); - /** - * 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; - } + convertView.setTag(holder); + } else + holder = (ViewHolder) convertView.getTag(); - /** - * this class will hold the TextViews - * @author ricky barrette - */ - class ViewHolder { - TextView text; - TextView text2; + /** + * 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; } } \ 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 index 2daa46b..0d0fb94 100644 --- a/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsListFragment.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/DirectionsListFragment.java @@ -17,18 +17,18 @@ import com.TwentyCodes.android.overlays.DirectionsOverlay; import com.google.android.maps.GeoPoint; /** - * This fragment will be used to display directions to the user. + * 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 { - + /** * 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 @@ -37,7 +37,7 @@ public class DirectionsListFragment extends ListFragment { public void onDirectionSelected(GeoPoint point); } - + private OnDirectionSelectedListener mListener; private ArrayList mPoints; @@ -54,17 +54,17 @@ public class DirectionsListFragment extends ListFragment { * @param listener * @author ricky barrette */ - public DirectionsListFragment(OnDirectionSelectedListener listener) { + public DirectionsListFragment(final 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())); + setListAdapter(new ArrayAdapter(getActivity(), android.R.layout.simple_list_item_1, new ArrayList())); } /** @@ -74,19 +74,19 @@ public class DirectionsListFragment extends ListFragment { * @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) { + public void onListItemClick(final ListView l, final View w, final int position, final 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); + setListShown(true); super.onStart(); } @@ -97,7 +97,7 @@ public class DirectionsListFragment extends ListFragment { */ public void setDirections(final DirectionsOverlay directions) { mPoints = directions.getPoints(); - this.setListAdapter(new DirectionsAdapter(getActivity(), directions)); + setListAdapter(new DirectionsAdapter(getActivity(), directions)); } /** @@ -105,7 +105,7 @@ public class DirectionsListFragment extends ListFragment { * @param text * @author ricky barrette */ - public void SetEmptyText(String text){ - this.setEmptyText(text); + public void SetEmptyText(final String text){ + setEmptyText(text); } } diff --git a/LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java b/LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java index bdae0ca..17c7c90 100644 --- a/LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/SkyHoookUserOverlayMapFragment.java @@ -31,16 +31,16 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G public SkyHoookUserOverlayMapFragment() { super(); } - + /** * Tells the useroverlay to pan the map to follow the user * @param followUser * @author ricky barrette */ - public void followUser(boolean followUser){ + public void followUser(final boolean followUser){ mUserOverlay.followUser(followUser); } - + /** * @return return the current destination * @author ricky barrette @@ -56,20 +56,20 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G public GeoPoint getUserLocation() { return mUserOverlay.getUserLocation(); } - + /** * Called when the compass is updated * (non-Javadoc) * @see com.TwentyCodes.android.location.CompassListener#onCompassUpdate(float) */ @Override - public void onCompassUpdate(float bearing) { + public void onCompassUpdate(final float bearing) { if(mCompassListener != null) mCompassListener.onCompassUpdate(bearing); } @Override - public void onFirstFix(boolean isFistFix) { + public void onFirstFix(final boolean isFistFix) { if(mGeoPointLocationListener != null) mGeoPointLocationListener.onFirstFix(isFistFix); } @@ -79,7 +79,7 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G * @author ricky barrette */ @Override - public void onLocationChanged(GeoPoint point, int accuracy) { + public void onLocationChanged(final GeoPoint point, final int accuracy) { if(mGeoPointLocationListener != null) mGeoPointLocationListener.onLocationChanged(point, accuracy); } @@ -89,16 +89,16 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G * @see com.TwentyCodes.android.fragments.BaseMapFragment#onMapViewCreate(com.TwentyCodes.android.location.MapView) */ @Override - public void onMapViewCreate(MapView map) { - mUserOverlay = new SkyHookUserOverlay(map, this.getActivity().getApplicationContext()); + public void onMapViewCreate(final MapView map) { + mUserOverlay = new SkyHookUserOverlay(map, getActivity().getApplicationContext()); mUserOverlay.registerListener(this); mUserOverlay.setCompassListener(this); mUserOverlay.enableCompass(); mUserOverlay.followUser(true); - + map.getOverlays().add(mUserOverlay); } - + /** * (non-Javadoc) * @see com.TwentyCodes.android.fragments.BaseMapFragment#onPause() @@ -109,7 +109,7 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G mUserOverlay.disableMyLocation(); removeOverlay(mUserOverlay); } - + /** * (non-Javadoc) * @see com.TwentyCodes.android.fragments.BaseMapFragment#onResume() @@ -122,7 +122,7 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G addOverlay(mUserOverlay); } } - + /** * reorders the overlays to the UserOverlay always on top * @author ricky barrette @@ -131,7 +131,7 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G getMap().getOverlays().remove(mUserOverlay); getMap().getOverlays().add(mUserOverlay); } - + /** * @param needleResId * @param backgroundResId @@ -139,15 +139,15 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G * @param y * @author ricky barrette */ - public void setCompassDrawables(int needleResId, int backgroundResId, int x, int y){ + public void setCompassDrawables(final int needleResId, final int backgroundResId, final int x, final int y){ mUserOverlay.setCompassDrawables(needleResId, backgroundResId, x, y); } - + /** * @param listener * @author ricky barrette */ - public void setCompassListener(CompassListener listener){ + public void setCompassListener(final CompassListener listener){ mCompassListener = listener; } @@ -156,7 +156,7 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G * @param destination * @author ricky barrette */ - public void setDestination(GeoPoint destination){ + public void setDestination(final GeoPoint destination){ mUserOverlay.setDestination(destination); } @@ -164,7 +164,7 @@ public class SkyHoookUserOverlayMapFragment extends BaseMapFragment implements G * @param listener * @author ricky barrette */ - public void setGeoPointLocationListener(GeoPointLocationListener listener){ + public void setGeoPointLocationListener(final GeoPointLocationListener listener){ mGeoPointLocationListener = listener; } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java b/LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java index 2016eeb..306e206 100644 --- a/LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java +++ b/LocationLib/src/com/TwentyCodes/android/fragments/UserOverlayMapFragment.java @@ -37,10 +37,10 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL * @param followUser * @author ricky barrette */ - public void followUser(boolean followUser){ + public void followUser(final boolean followUser){ mUserOverlay.followUser(followUser); } - + /** * @return return the current destination * @author ricky barrette @@ -56,20 +56,20 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL public GeoPoint getUserLocation() { return mUserOverlay.getUserLocation(); } - + /** * Called when the compass is updated * (non-Javadoc) * @see com.TwentyCodes.android.location.CompassListener#onCompassUpdate(float) */ @Override - public void onCompassUpdate(float bearing) { + public void onCompassUpdate(final float bearing) { if(mCompassListener != null) mCompassListener.onCompassUpdate(bearing); } @Override - public void onFirstFix(boolean isFistFix) { + public void onFirstFix(final boolean isFistFix) { if(mGeoPointLocationListener != null) mGeoPointLocationListener.onFirstFix(isFistFix); } @@ -79,23 +79,23 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL * @author ricky barrette */ @Override - public void onLocationChanged(GeoPoint point, int accuracy) { + public void onLocationChanged(final GeoPoint point, final int accuracy) { if(mGeoPointLocationListener != null) mGeoPointLocationListener.onLocationChanged(point, accuracy); } - + /** * (non-Javadoc) * @see com.TwentyCodes.android.fragments.BaseMapFragment#onMapViewCreate(com.TwentyCodes.android.location.MapView) */ @Override - public void onMapViewCreate(MapView map) { - mUserOverlay = new UserOverlay(map, this.getActivity().getApplicationContext()); + public void onMapViewCreate(final MapView map) { + mUserOverlay = new UserOverlay(map, getActivity().getApplicationContext()); mUserOverlay.registerListener(this); mUserOverlay.setCompassListener(this); mUserOverlay.enableCompass(); mUserOverlay.followUser(true); - + map.getOverlays().add(mUserOverlay); } @@ -109,7 +109,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL mUserOverlay.disableMyLocation(); removeOverlay(mUserOverlay); } - + /** * (non-Javadoc) * @see com.TwentyCodes.android.fragments.BaseMapFragment#onResume() @@ -122,7 +122,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL addOverlay(mUserOverlay); } } - + /** * reorders the overlays to the UserOverlay always on top * @author ricky barrette @@ -131,7 +131,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL getMap().getOverlays().remove(mUserOverlay); getMap().getOverlays().add(mUserOverlay); } - + /** * @param needleResId * @param backgroundResId @@ -139,7 +139,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL * @param y * @author ricky barrette */ - public void setCompassDrawables(int needleResId, int backgroundResId, int x, int y){ + public void setCompassDrawables(final int needleResId, final int backgroundResId, final int x, final int y){ mUserOverlay.setCompassDrawables(needleResId, backgroundResId, x, y); } @@ -147,7 +147,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL * @param listener * @author ricky barrette */ - public void setCompassListener(CompassListener listener){ + public void setCompassListener(final CompassListener listener){ mCompassListener = listener; } @@ -156,7 +156,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL * @param destination * @author ricky barrette */ - public void setDestination(GeoPoint destination){ + public void setDestination(final GeoPoint destination){ mUserOverlay.setDestination(destination); } @@ -164,7 +164,7 @@ public class UserOverlayMapFragment extends BaseMapFragment implements GeoPointL * @param listener * @author ricky barrette */ - public void setGeoPointLocationListener(GeoPointLocationListener listener){ + public void setGeoPointLocationListener(final GeoPointLocationListener listener){ mGeoPointLocationListener = listener; } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/AndroidGPS.java b/LocationLib/src/com/TwentyCodes/android/location/AndroidGPS.java index 5c7f32a..a94549d 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/AndroidGPS.java +++ b/LocationLib/src/com/TwentyCodes/android/location/AndroidGPS.java @@ -22,22 +22,22 @@ import com.google.android.maps.GeoPoint; * @author ricky barrette */ public class AndroidGPS implements LocationListener { - + private static final String TAG = "AndroidGPS"; private final LocationManager mLocationManager; private GeoPointLocationListener mListener; private LocationListener mLocationListener; private boolean isFirstFix; - + /** * Creates a new SkyHookFallback * @author ricky barrette */ - public AndroidGPS(Context context) { + public AndroidGPS(final Context context) { mLocationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); isFirstFix = true; } - + /** * Remove updates from androids location services * @author ricky barrette @@ -50,25 +50,11 @@ public class AndroidGPS implements LocationListener { isFirstFix = true; } - /** - * Attempts to enable periodic location updates - * @param listener - * @author ricky barrette - */ - public void enableLocationUpdates(LocationListener listener) { - if(Debug.DEBUG) - Log.d(SkyHook.TAG, "enableLocationUpdates()"); - if(mLocationListener == null){ - mLocationListener = listener; - requestUpdates(); - } - } - /** * request periodic location updates from androids location services * @author ricky barrette */ - public void enableLocationUpdates(GeoPointLocationListener listener) { + public void enableLocationUpdates(final GeoPointLocationListener listener) { if(Debug.DEBUG) Log.d(SkyHook.TAG, "enableLocationUpdates()"); if (mListener == null) { @@ -77,6 +63,20 @@ public class AndroidGPS implements LocationListener { } } + /** + * Attempts to enable periodic location updates + * @param listener + * @author ricky barrette + */ + public void enableLocationUpdates(final LocationListener listener) { + if(Debug.DEBUG) + Log.d(SkyHook.TAG, "enableLocationUpdates()"); + if(mLocationListener == null){ + mLocationListener = listener; + requestUpdates(); + } + } + /** * (non-Javadoc) * @see android.location.LocationListener#onLocationChanged(android.location.Location) @@ -84,19 +84,18 @@ public class AndroidGPS implements LocationListener { * @author ricky barrette */ @Override - public void onLocationChanged(Location location) { + public void onLocationChanged(final Location location) { if(mListener != null) { mListener.onLocationChanged(new GeoPoint( (int) (location.getLatitude() * 1e6), (int) (location.getLongitude() * 1e6)), (int) location.getAccuracy()); mListener.onFirstFix(isFirstFix); } - - if(mLocationListener != null){ + + if(mLocationListener != null) mLocationListener.onLocationChanged(location); - } - + isFirstFix = false; } - + /** * (non-Javadoc) * @see android.location.LocationListener#onProviderDisabled(java.lang.String) @@ -104,7 +103,7 @@ public class AndroidGPS implements LocationListener { * @author ricky barrette */ @Override - public void onProviderDisabled(String arg0) { + public void onProviderDisabled(final String arg0) { // UNUSED } @@ -116,10 +115,10 @@ public class AndroidGPS implements LocationListener { * @author ricky barrette */ @Override - public void onProviderEnabled(String arg0) { + public void onProviderEnabled(final String arg0) { // UNUSED } - + /** * (non-Javadoc) * @see android.location.LocationListener#onStatusChanged(java.lang.String, int, android.os.Bundle) @@ -129,7 +128,7 @@ public class AndroidGPS implements LocationListener { * @author ricky barrette */ @Override - public void onStatusChanged(String arg0, int arg1, Bundle arg2) { + public void onStatusChanged(final String arg0, final int arg1, final Bundle arg2) { // UNUSED } @@ -140,7 +139,7 @@ public class AndroidGPS implements LocationListener { private void requestUpdates() { try { mLocationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, this); - } catch (IllegalArgumentException e) { + } catch (final IllegalArgumentException e) { e.printStackTrace(); /* We do no handle this exception as it is caused if the android version is < 1.6. since the PASSIVE_PROVIDER call is not required * to function we can ignore it. diff --git a/LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java b/LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java index 1a618bb..666be75 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java +++ b/LocationLib/src/com/TwentyCodes/android/location/BaseLocationReceiver.java @@ -16,25 +16,25 @@ import android.location.LocationManager; * @author ricky barrette */ public abstract class BaseLocationReceiver extends BroadcastReceiver { - + public Context mContext; - /** - * (non-Javadoc) - * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) - */ - @Override - public void onReceive(Context context, Intent intent) { - mContext = context; - final String key = LocationManager.KEY_LOCATION_CHANGED; - if (intent.hasExtra(key)) - onLocationUpdate((Location)intent.getExtras().get(key)); - } - /** * called when a location update is received * @param parcelableExtra * @author ricky barrette */ public abstract void onLocationUpdate(Location location); + + /** + * (non-Javadoc) + * @see android.content.BroadcastReceiver#onReceive(android.content.Context, android.content.Intent) + */ + @Override + public void onReceive(final Context context, final Intent intent) { + mContext = context; + final String key = LocationManager.KEY_LOCATION_CHANGED; + if (intent.hasExtra(key)) + onLocationUpdate((Location)intent.getExtras().get(key)); + } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java b/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java index b0258e6..f1ef0c6 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java +++ b/LocationLib/src/com/TwentyCodes/android/location/CompassSensor.java @@ -28,13 +28,13 @@ import com.TwentyCodes.android.debug.LocationLibraryConstants; * @author ricky barrette */ public class CompassSensor{ - + /** * A simple listener interface to get updates from CompassSensor * @author ricky barrette */ public interface CompassListener { - + /** * Called when there is an update from the Compass Sensor * @param bearing @@ -42,7 +42,7 @@ public class CompassSensor{ */ public void onCompassUpdate(float bearing); } - + public static final String TAG = "CompassSensor"; private static final int BEARING = 0; private final Display mDisplay; @@ -55,7 +55,7 @@ public class CompassSensor{ static{ mHandler = new Handler(){ @Override - public void handleMessage(Message msg){ + public void handleMessage(final Message msg){ if(mListener != null) if(msg.what == BEARING) mListener.onCompassUpdate((Float) msg.obj); @@ -65,20 +65,25 @@ public class CompassSensor{ private final SensorEventListener mCallBack = new SensorEventListener() { - private float[] mRotationMatrix = new float[16]; -// private float[] mRemapedRotationMatrix = new float[16]; - private float[] mI = new float[16]; + private final float[] mRotationMatrix = new float[16]; + // private float[] mRemapedRotationMatrix = new float[16]; + private final float[] mI = new float[16]; private float[] mGravity = new float[3]; private float[] mGeomag = new float[3]; - private float[] mOrientVals = new float[3]; + private final float[] mOrientVals = new float[3]; private double mAzimuth = 0; -// double mPitch = 0; -// double mRoll = 0; -// private float mInclination; + // double mPitch = 0; + // double mRoll = 0; + // private float mInclination; + @Override + public void onAccuracyChanged(final Sensor sensor, final int accuracy) { + } + + @Override public void onSensorChanged(final SensorEvent sensorEvent) { - if(Debug.DEBUG){ + if(Debug.DEBUG) switch (sensorEvent.accuracy){ case SensorManager.SENSOR_STATUS_UNRELIABLE: Log.v(TAG , "UNRELIABLE"); @@ -92,91 +97,86 @@ public class CompassSensor{ case SensorManager.SENSOR_STATUS_ACCURACY_HIGH: Log.v(TAG , "HIGH"); break; - + + } + + // If the sensor data is unreliable return + if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) + return; + + // Gets the value of the sensor that has been changed + switch (sensorEvent.sensor.getType()) { + case Sensor.TYPE_ACCELEROMETER: + mGravity = sensorEvent.values.clone(); + break; + case Sensor.TYPE_MAGNETIC_FIELD: + mGeomag = sensorEvent.values.clone(); + break; + } + + // If gravity and geomag have values then find rotation matrix + if (mGravity != null && mGeomag != null) { + + // checks that the rotation matrix is found + final boolean success = SensorManager.getRotationMatrix(mRotationMatrix, mI, mGravity, mGeomag); + if (success) { + + // switch (mDisplay.getOrientation()){ + // case Surface.ROTATION_0: + // Log.v(TAG , "0"); + // // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Y, mRemapedRotationMatrix); + // break; + // case Surface.ROTATION_90: + // Log.v(TAG , "90"); + // // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Y, mRemapedRotationMatrix); + // break; + // case Surface.ROTATION_180: + // Log.v(TAG , "180"); + // // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_MINUS_Y, mRemapedRotationMatrix); + // break; + // case Surface.ROTATION_270: + // Log.v(TAG , "270"); + // // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, mRemapedRotationMatrix); + // break; + // } + + /* + * remap cords due to Display.getRotation() + */ + SensorManager.getOrientation(mRotationMatrix, mOrientVals); + // mInclination = SensorManager.getInclination(mI); + mAzimuth = Math.toDegrees(mOrientVals[0]); + // mPitch = Math.toDegrees(mOrientVals[1]); + // mRoll = Math.toDegrees(mOrientVals[2]); + + /* + * compensate for magentic delination + */ + mAzimuth += mDelination; + + /* + * compensate for device orentation + */ + switch (mDisplay.getRotation()){ + case Surface.ROTATION_0: + break; + case Surface.ROTATION_90: + mAzimuth = mAzimuth + 90; + break; + case Surface.ROTATION_180: + mAzimuth = mAzimuth +180; + break; + case Surface.ROTATION_270: + mAzimuth = mAzimuth - 90; + break; + } } } - // If the sensor data is unreliable return - if (sensorEvent.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) - return; - - // Gets the value of the sensor that has been changed - switch (sensorEvent.sensor.getType()) { - case Sensor.TYPE_ACCELEROMETER: - mGravity = sensorEvent.values.clone(); - break; - case Sensor.TYPE_MAGNETIC_FIELD: - mGeomag = sensorEvent.values.clone(); - break; - } - - // If gravity and geomag have values then find rotation matrix - if (mGravity != null && mGeomag != null) { - - // checks that the rotation matrix is found - boolean success = SensorManager.getRotationMatrix(mRotationMatrix, mI, mGravity, mGeomag); - if (success) { - -// switch (mDisplay.getOrientation()){ -// case Surface.ROTATION_0: -// Log.v(TAG , "0"); -// // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Y, mRemapedRotationMatrix); -// break; -// case Surface.ROTATION_90: -// Log.v(TAG , "90"); -// // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_X, SensorManager.AXIS_Y, mRemapedRotationMatrix); -// break; -// case Surface.ROTATION_180: -// Log.v(TAG , "180"); -// // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_MINUS_Y, mRemapedRotationMatrix); -// break; -// case Surface.ROTATION_270: -// Log.v(TAG , "270"); -// // SensorManager.remapCoordinateSystem(mRotationMatrix, SensorManager.AXIS_MINUS_X, SensorManager.AXIS_Y, mRemapedRotationMatrix); -// break; -// } - - /* - * remap cords due to Display.getRotation() - */ - SensorManager.getOrientation(mRotationMatrix, mOrientVals); -// mInclination = SensorManager.getInclination(mI); - mAzimuth = Math.toDegrees(mOrientVals[0]); -// mPitch = Math.toDegrees(mOrientVals[1]); -// mRoll = Math.toDegrees(mOrientVals[2]); - - /* - * compensate for magentic delination - */ - mAzimuth += mDelination; - - /* - * compensate for device orentation - */ - switch (mDisplay.getOrientation()){ - case Surface.ROTATION_0: - break; - case Surface.ROTATION_90: - mAzimuth = mAzimuth + 90; - break; - case Surface.ROTATION_180: - mAzimuth = mAzimuth +180; - break; - case Surface.ROTATION_270: - mAzimuth = mAzimuth - 90; - break; - } - } - } - - mHandler.sendMessage(mHandler.obtainMessage(BEARING, (float) mAzimuth)); + mHandler.sendMessage(mHandler.obtainMessage(BEARING, (float) mAzimuth)); } + }; - @Override - public void onAccuracyChanged(Sensor sensor, int accuracy) { - } - }; - /** * Creates a new CompassSensor * @author ricky barrette @@ -186,7 +186,7 @@ public class CompassSensor{ mDisplay = ((WindowManager) mContext.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay(); mSensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); } - + /** * Disables compass updates * @author ricky barrette @@ -201,7 +201,7 @@ public class CompassSensor{ * @param listener * @author ricky barrette */ - public void enable(CompassListener listener){ + public void enable(final CompassListener listener){ if(mListener == null) { mListener = listener; if(mSensorManager != null) @@ -216,21 +216,20 @@ public class CompassSensor{ }).start(); } } - + /** * Updates the Geomagnetic Field Declination based off of the provided location * @param location last known (lat,lon,altitude), null will reset * @author ricky barrette */ public void setDeclination(final Location location){ - if (location != null) { - final GeomagneticField geomagneticField = new GeomagneticField(Double.valueOf(location.getLatitude()).floatValue(), - Double.valueOf(location.getLongitude()).floatValue(), - Double.valueOf(location.getAltitude()).floatValue(), - System.currentTimeMillis()); - mDelination = geomagneticField.getDeclination(); - } else { - mDelination = 0; - } + if (location != null) { + final GeomagneticField geomagneticField = new GeomagneticField(Double.valueOf(location.getLatitude()).floatValue(), + Double.valueOf(location.getLongitude()).floatValue(), + Double.valueOf(location.getAltitude()).floatValue(), + System.currentTimeMillis()); + mDelination = geomagneticField.getDeclination(); + } else + mDelination = 0; } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/GeoPointLocationListener.java b/LocationLib/src/com/TwentyCodes/android/location/GeoPointLocationListener.java index dd25135..f8fed65 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/GeoPointLocationListener.java +++ b/LocationLib/src/com/TwentyCodes/android/location/GeoPointLocationListener.java @@ -12,7 +12,14 @@ import com.google.android.maps.GeoPoint; * @author ricky barrette */ public interface GeoPointLocationListener { - + + /** + * Called when first fix is aquired + * @param isFirstFix + * @author ricky barrette + */ + public void onFirstFix(boolean isFirstFix); + /** * Called when the location has changed * @param point @@ -20,11 +27,4 @@ public interface GeoPointLocationListener { * @author ricky barrette */ public void onLocationChanged(GeoPoint point, int accuracy); - - /** - * Called when first fix is aquired - * @param isFirstFix - * @author ricky barrette - */ - public void onFirstFix(boolean isFirstFix); } diff --git a/LocationLib/src/com/TwentyCodes/android/location/GeoUtils.java b/LocationLib/src/com/TwentyCodes/android/location/GeoUtils.java index 6b15590..054f0c3 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/GeoUtils.java +++ b/LocationLib/src/com/TwentyCodes/android/location/GeoUtils.java @@ -35,72 +35,72 @@ import com.google.android.maps.MapView; * @author Google Inc. */ public class GeoUtils { - + public static final int EARTH_RADIUS_KM = 6371; - public static final double MILLION = 1000000; - - /** - * Calculates the bearing from the user location to the destination location, or returns the bearing for north if there is no destination. - * This method is awesome for making a compass point toward the destination rather than North. - * @param user location - * @param dest location - * @param bearing Degrees East from compass - * @return Degrees East of dest location - * @author ricky barrette - */ + public static final double MILLION = 1000000; + + /** + * computes the bearing of lat2/lon2 in relationship from lat1/lon1 in degrees East + * @param lat1 source lat + * @param lon1 source lon + * @param lat2 destination lat + * @param lon2 destination lon + * @return the bearing of lat2/lon2 in relationship from lat1/lon1 in degrees East of true north + * @author Google Inc. + */ + public static double bearing(final double lat1, final double lon1, final double lat2, final double lon2) { + final double lat1Rad = Math.toRadians(lat1); + final double lat2Rad = Math.toRadians(lat2); + final double deltaLonRad = Math.toRadians(lon2 - lon1); + final double y = Math.sin(deltaLonRad) * Math.cos(lat2Rad); + final double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad); + return radToBearing(Math.atan2(y, x)); + } + + /** + * computes the bearing of lat2/lon2 in relationship from lat1/lon1 in degrees East of true north + * @param p1 source geopoint + * @param p2 destination geopoint + * @return the bearing of p2 in relationship from p1 in degrees East + * @author Google Inc. + */ + public static Double bearing(final GeoPoint p1, final GeoPoint p2) { + final double lat1 = p1.getLatitudeE6() / MILLION; + final double lon1 = p1.getLongitudeE6() / MILLION; + final double lat2 = p2.getLatitudeE6() / MILLION; + final double lon2 = p2.getLongitudeE6() / MILLION; + return bearing(lat1, lon1, lat2, lon2); + } + + /** + * Calculates the bearing from the user location to the destination location, or returns the bearing for north if there is no destination. + * This method is awesome for making a compass point toward the destination rather than North. + * @param user location + * @param dest location + * @param bearing Degrees East from compass + * @return Degrees East of dest location + * @author ricky barrette + */ public static float calculateBearing(final GeoPoint user, final GeoPoint dest, float bearing) { - - if( (user == null) || (dest == null) ) + + if( user == null || dest == null ) return bearing; - - float heading = bearing(user, dest).floatValue(); - - bearing = (360 - heading) + bearing; - + + final float heading = bearing(user, dest).floatValue(); + + bearing = 360 - heading + bearing; + if (bearing > 360) return bearing - 360; - + return bearing; } - /** - * computes the bearing of lat2/lon2 in relationship from lat1/lon1 in degrees East - * @param lat1 source lat - * @param lon1 source lon - * @param lat2 destination lat - * @param lon2 destination lon - * @return the bearing of lat2/lon2 in relationship from lat1/lon1 in degrees East of true north - * @author Google Inc. - */ - public static double bearing(final double lat1, final double lon1, final double lat2, final double lon2) { - double lat1Rad = Math.toRadians(lat1); - double lat2Rad = Math.toRadians(lat2); - double deltaLonRad = Math.toRadians(lon2 - lon1); - double y = Math.sin(deltaLonRad) * Math.cos(lat2Rad); - double x = Math.cos(lat1Rad) * Math.sin(lat2Rad) - Math.sin(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad); - return radToBearing(Math.atan2(y, x)); - } - - /** - * computes the bearing of lat2/lon2 in relationship from lat1/lon1 in degrees East of true north - * @param p1 source geopoint - * @param p2 destination geopoint - * @return the bearing of p2 in relationship from p1 in degrees East - * @author Google Inc. - */ - public static Double bearing(final GeoPoint p1, final GeoPoint p2) { - double lat1 = p1.getLatitudeE6() / MILLION; - double lon1 = p1.getLongitudeE6() / MILLION; - double lat2 = p2.getLatitudeE6() / MILLION; - double lon2 = p2.getLongitudeE6() / MILLION; - return bearing(lat1, lon1, lat2, lon2); - } - - /** - * Calculates a geopoint x meters away of the geopoint supplied. The new geopoint + /** + * Calculates a geopoint x meters away of the geopoint supplied. The new geopoint * shares the same latitude as geopoint point, this way they are on the same latitude arc. * - * @param point central geopoint + * @param point central geopoint * @param distance in meters from the geopoint * @return geopoint that is x meters away from the geopoint supplied * @author ricky barrette @@ -108,11 +108,11 @@ public class GeoUtils { public static GeoPoint distanceFrom(final GeoPoint point, double distance){ //convert meters into kilometers distance = distance / 1000; - + // convert lat and lon of geopoint to radians - double lat1Rad = Math.toRadians((point.getLatitudeE6() / 1e6)); - double lon1Rad = Math.toRadians((point.getLongitudeE6() / 1e6)); - + final double lat1Rad = Math.toRadians(point.getLatitudeE6() / 1e6); + final double lon1Rad = Math.toRadians(point.getLongitudeE6() / 1e6); + /* * kilometers = acos(sin(lat1Rad)sin(lat2Rad)+cos(lat1Rad)cos(lat2Rad)cos(lon2Rad-lon1Rad)6371 * @@ -123,36 +123,55 @@ public class GeoUtils { * NOTE: sec(x) = 1/cos(x) * * NOTE: that lat2Rad is = lat1Rad because we want to keep the new geopoint on the same lat arc - * therefore i saw no need to create a new variable for lat2Rad, + * therefore i saw no need to create a new variable for lat2Rad, * and simply inputed lat1Rad in place of lat2Rad in the equation * * NOTE: this equation has be tested in the field against another gps device, and the distanceKm() from google * and has been proven to be damn close */ - double lon2Rad = lon1Rad + Math.acos( Math.cos((distance/6371)) * (1 / Math.cos(lat1Rad)) - * (1 / Math.cos(lat1Rad)) - Math.tan(lat1Rad) * Math.tan(lat1Rad)); - + final double lon2Rad = lon1Rad + Math.acos( Math.cos(distance/6371) * (1 / Math.cos(lat1Rad)) + * (1 / Math.cos(lat1Rad)) - Math.tan(lat1Rad) * Math.tan(lat1Rad)); + //return a geopoint that is x meters away from the geopoint supplied return new GeoPoint(point.getLatitudeE6(), (int) (Math.toDegrees(lon2Rad) * 1e6)); } - - /** - * computes the distance between to lat1/lon1 and lat2/lon2 based on the curve of the earth - * @param lat1 source lat - * @param lon1 source lon - * @param lat2 destination lat - * @param lon2 destination lon - * @return the distance between to lat1/lon1 and lat2/lon2 - * @author Google Inc. - */ - public static double distanceKm(final double lat1, final double lon1, final double lat2, final double lon2) { - double lat1Rad = Math.toRadians(lat1); - double lat2Rad = Math.toRadians(lat2); - double deltaLonRad = Math.toRadians(lon2 - lon1); - return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) * EARTH_RADIUS_KM; - } - - /** + + /** + * computes the distance between to lat1/lon1 and lat2/lon2 based on the curve of the earth + * @param lat1 source lat + * @param lon1 source lon + * @param lat2 destination lat + * @param lon2 destination lon + * @return the distance between to lat1/lon1 and lat2/lon2 + * @author Google Inc. + */ + public static double distanceKm(final double lat1, final double lon1, final double lat2, final double lon2) { + final double lat1Rad = Math.toRadians(lat1); + final double lat2Rad = Math.toRadians(lat2); + final double deltaLonRad = Math.toRadians(lon2 - lon1); + return Math.acos(Math.sin(lat1Rad) * Math.sin(lat2Rad) + Math.cos(lat1Rad) * Math.cos(lat2Rad) * Math.cos(deltaLonRad)) * EARTH_RADIUS_KM; + } + + /** + * computes the distance between to p1 and p2 based on the curve of the earth + * @param p1 + * @param p2 + * @return the distance between to p1 and p2 + * @author Google Inc. + */ + public static double distanceKm(final GeoPoint p1, final GeoPoint p2) { + //if we are handed a null, return -1 so we don't break + if(p1 == null || p2 == null) + return -1; + + final double lat1 = p1.getLatitudeE6() / MILLION; + final double lon1 = p1.getLongitudeE6() / MILLION; + final double lat2 = p2.getLatitudeE6() / MILLION; + final double lon2 = p2.getLongitudeE6() / MILLION; + return distanceKm(lat1, lon1, lat2, lon2); + } + + /** * Converts distance into a human readbale string * @param distance in kilometers * @param returnMetric true if metric, false for US @@ -160,8 +179,8 @@ public class GeoUtils { * @author ricky barrette */ public static String distanceToString(double distance, final boolean returnMetric) { - DecimalFormat threeDForm = new DecimalFormat("#.###"); - DecimalFormat twoDForm = new DecimalFormat("#.##"); + final DecimalFormat threeDForm = new DecimalFormat("#.###"); + final DecimalFormat twoDForm = new DecimalFormat("#.##"); if (returnMetric) { if (distance < 1) { @@ -177,12 +196,12 @@ public class GeoUtils { } return twoDForm.format(distance) + " mi"; } - - /** - * a convince method for testing if 2 circles on the the surface of the earth intersect. - * we will use this method to test if the users accuracy circle intersects a marked locaton's radius + + /** + * a convince method for testing if 2 circles on the the surface of the earth intersect. + * we will use this method to test if the users accuracy circle intersects a marked locaton's radius * if ( (accuracyCircleRadius + locationRadius) - fudgeFactor) > acos(sin(lat1Rad)sin(lat2Rad)+cos(lat1Rad)cos(lat2Rad)cos(lon2Rad-lon1Rad)6371 - * @param userPoint + * @param userPoint * @param accuracyRadius in KM * @param locationPoint * @param locationRadius in KM @@ -191,31 +210,12 @@ public class GeoUtils { * @author ricky barrette */ public static boolean isIntersecting(final GeoPoint userPoint, final float accuracyRadius, final GeoPoint locationPoint, final float locationRadius, final float fudgeFactor){ - if(((accuracyRadius + locationRadius) - fudgeFactor) > distanceKm(locationPoint, userPoint)) + if(accuracyRadius + locationRadius - fudgeFactor > distanceKm(locationPoint, userPoint)) return true; return false; } - - /** - * computes the distance between to p1 and p2 based on the curve of the earth - * @param p1 - * @param p2 - * @return the distance between to p1 and p2 - * @author Google Inc. - */ - public static double distanceKm(final GeoPoint p1, final GeoPoint p2) { - //if we are handed a null, return -1 so we don't break - if(p1 == null || p2 == null) - return -1; - - double lat1 = p1.getLatitudeE6() / MILLION; - double lon1 = p1.getLongitudeE6() / MILLION; - double lat2 = p2.getLatitudeE6() / MILLION; - double lon2 = p2.getLongitudeE6() / MILLION; - return distanceKm(lat1, lon1, lat2, lon2); - } - - /** + + /** * determines when the specified point is off the map * @param point * @return true is the point is off the map @@ -226,58 +226,57 @@ public class GeoUtils { return false; if (point == null) return false; - GeoPoint center = map.getMapCenter(); - double distance = GeoUtils.distanceKm(center, point); - double distanceLat = GeoUtils.distanceKm(center, new GeoPoint((center.getLatitudeE6() + (int) (map.getLatitudeSpan() / 2)), center.getLongitudeE6())); - double distanceLon = GeoUtils.distanceKm(center, new GeoPoint(center.getLatitudeE6(), (center.getLongitudeE6() + (int) (map.getLongitudeSpan() / 2)))); - if (distance > distanceLat || distance > distanceLon){ - return true; - } + final GeoPoint center = map.getMapCenter(); + final double distance = GeoUtils.distanceKm(center, point); + final double distanceLat = GeoUtils.distanceKm(center, new GeoPoint(center.getLatitudeE6() + map.getLatitudeSpan() / 2, center.getLongitudeE6())); + final double distanceLon = GeoUtils.distanceKm(center, new GeoPoint(center.getLatitudeE6(), center.getLongitudeE6() + map.getLongitudeSpan() / 2)); + if (distance > distanceLat || distance > distanceLon) + return true; return false; } - - /** - * computes a geopoint the is the central geopoint between p1 and p1 - * @param p1 first geopoint - * @param p2 second geopoint - * @return a MidPoint object - * @author ricky barrette - */ - public static MidPoint midPoint(final GeoPoint p1, final GeoPoint p2) { - int minLatitude = (int)(+81 * 1E6); - int maxLatitude = (int)(-81 * 1E6); - int minLongitude = (int)(+181 * 1E6); - int maxLongitude = (int)(-181 * 1E6); - List mPoints = new ArrayList(); - int latitude = p1.getLatitudeE6(); - int longitude = p1.getLongitudeE6(); - if (latitude != 0 && longitude !=0) { - minLatitude = (minLatitude > latitude) ? latitude : minLatitude; - maxLatitude = (maxLatitude < latitude) ? latitude : maxLatitude; - minLongitude = (minLongitude > longitude) ? longitude : minLongitude; - maxLongitude = (maxLongitude < longitude) ? longitude : maxLongitude; - mPoints.add(new Point(latitude, longitude)); - } - - latitude = p2.getLatitudeE6(); - longitude = p2.getLongitudeE6(); - if (latitude != 0 && longitude !=0) { - minLatitude = (minLatitude > latitude) ? latitude : minLatitude; - maxLatitude = (maxLatitude < latitude) ? latitude : maxLatitude; - minLongitude = (minLongitude > longitude) ? longitude : minLongitude; - maxLongitude = (maxLongitude < longitude) ? longitude : maxLongitude; - mPoints.add(new Point(latitude, longitude)); - } - return new MidPoint(new GeoPoint((maxLatitude + minLatitude)/2, (maxLongitude + minLongitude)/2 ), minLatitude, minLongitude, maxLatitude, maxLongitude); - } - - /** - * converts radians to bearing - * @param rad - * @return bearing - * @author Google Inc. - */ - public static double radToBearing(final double rad) { - return (Math.toDegrees(rad) + 360) % 360; - } + + /** + * computes a geopoint the is the central geopoint between p1 and p1 + * @param p1 first geopoint + * @param p2 second geopoint + * @return a MidPoint object + * @author ricky barrette + */ + public static MidPoint midPoint(final GeoPoint p1, final GeoPoint p2) { + int minLatitude = (int)(+81 * 1E6); + int maxLatitude = (int)(-81 * 1E6); + int minLongitude = (int)(+181 * 1E6); + int maxLongitude = (int)(-181 * 1E6); + final List mPoints = new ArrayList(); + int latitude = p1.getLatitudeE6(); + int longitude = p1.getLongitudeE6(); + if (latitude != 0 && longitude !=0) { + minLatitude = minLatitude > latitude ? latitude : minLatitude; + maxLatitude = maxLatitude < latitude ? latitude : maxLatitude; + minLongitude = minLongitude > longitude ? longitude : minLongitude; + maxLongitude = maxLongitude < longitude ? longitude : maxLongitude; + mPoints.add(new Point(latitude, longitude)); + } + + latitude = p2.getLatitudeE6(); + longitude = p2.getLongitudeE6(); + if (latitude != 0 && longitude !=0) { + minLatitude = minLatitude > latitude ? latitude : minLatitude; + maxLatitude = maxLatitude < latitude ? latitude : maxLatitude; + minLongitude = minLongitude > longitude ? longitude : minLongitude; + maxLongitude = maxLongitude < longitude ? longitude : maxLongitude; + mPoints.add(new Point(latitude, longitude)); + } + return new MidPoint(new GeoPoint((maxLatitude + minLatitude)/2, (maxLongitude + minLongitude)/2 ), minLatitude, minLongitude, maxLatitude, maxLongitude); + } + + /** + * converts radians to bearing + * @param rad + * @return bearing + * @author Google Inc. + */ + public static double radToBearing(final double rad) { + return (Math.toDegrees(rad) + 360) % 360; + } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/LocationService.java b/LocationLib/src/com/TwentyCodes/android/location/LocationService.java index 64a690b..996d0df 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/LocationService.java +++ b/LocationLib/src/com/TwentyCodes/android/location/LocationService.java @@ -37,37 +37,53 @@ import com.TwentyCodes.android.debug.LocationLibraryConstants; * @author ricky barrette */ public class LocationService extends Service implements LocationListener { - + public static final String TAG = "LocationService"; private static final int REQUEST_CODE = 7893749; + /** + *a convince method for getting an intent to start the service + * @param context + * @return a intent that will start the service + * @author ricky barrette + */ + public static Intent getStartServiceIntent(final Context context){ + return new Intent(context, LocationService.class); + } + /** + * a convince method for stopping the service and removing it's alarm + * @param context + * @return a runnable that will stop the service + * @author ricky barrette + */ + public static Runnable stopService(final Context context){ + return new Runnable(){ + @Override + public void run(){ + context.stopService(new Intent(context, LocationService.class)); + ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).cancel(PendingIntent.getService(context, REQUEST_CODE, new Intent(context, LocationService.class), 0)); + } + }; + } private WakeLock mWakeLock; private long mPeriod = -1; private Location mLocation; private int mStartId; private AndroidGPS mLocationManager; private int mRequiredAccuracy; + + private Intent mIntent; + /* * this runnable will be qued when the service is created. this will be used as a fail safe */ - private Runnable failSafe = new Runnable() { + private final Runnable failSafe = new Runnable() { @Override public void run(){ stopSelf(mStartId); } }; - - /** - * registers this service to be waken up by android's alarm manager - * @author ricky barrette - */ - private void registerwakeUp(){ - Log.d(TAG, "registerwakeUp()"); - AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); - am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + this.mPeriod, PendingIntent.getService(this, REQUEST_CODE, this.mIntent, 0)); - } - /** * broadcasts location to anything listening for updates, * since this is the last function of the service, we call finish()u @@ -76,7 +92,7 @@ public class LocationService extends Service implements LocationListener { private void broadcastLocation() { Log.d(TAG, "broadcastLocation()"); if (mLocation != null) { - Intent locationUpdate = new Intent(); + final Intent locationUpdate = new Intent(); if(mIntent.getAction() != null) locationUpdate.setAction(mIntent.getAction()); else @@ -87,6 +103,19 @@ public class LocationService extends Service implements LocationListener { } } + /** + * (non-Javadoc) + * @see android.app.Service#onBind(android.content.Intent) + * @param arg0 + * @return + * @author ricky barrette + */ + @Override + public IBinder onBind(final Intent arg0) { + // UNUSED + return null; + } + /** * called when the service is created. this will initialize the location manager, and acquire a wakelock * (non-Javadoc) @@ -96,19 +125,19 @@ public class LocationService extends Service implements LocationListener { @Override public void onCreate(){ mLocationManager = new AndroidGPS(this); - PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); + final PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE); mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); mWakeLock.acquire(); - + /* * que the fail safe runnable to kill the report location and kill it self after the MAX_RUN_TIME has been meet */ new Handler().postDelayed(failSafe, LocationLibraryConstants.MAX_LOCATION_SERVICE_RUN_TIME); super.onCreate(); } - + /** - * called when the service is destroyed. + * called when the service is destroyed. * this will remove any wakelock or location service running, and register to be waken back up * (non-Javadoc) * @see android.app.Service#onDestroy() @@ -123,119 +152,89 @@ public class LocationService extends Service implements LocationListener { if(mPeriod > -1) registerwakeUp(); } - + + @Override + public void onLocationChanged(final Location location) { + if(Debug.DEBUG) + Log.d(TAG, "got location +- "+ location.getAccuracy() +"m"); + mLocation = location; + if(location.getAccuracy() <= (mRequiredAccuracy > -1 ? mRequiredAccuracy : LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY) || LocationLibraryConstants.REPORT_FIRST_LOCATION) + stopSelf(mStartId); + } + + @Override + public void onProviderDisabled(final String provider) { + // TODO Auto-generated method stub + + } + + @Override + public void onProviderEnabled(final String provider) { + // TODO Auto-generated method stub + + } + /** * To keep backwards compatibility we override onStart which is the equivalent of onStartCommand in pre android 2.x * @author ricky barrette */ @Override - public void onStart(Intent intent, int startId) { + public void onStart(final Intent intent, final int startId) { if(Debug.DEBUG) Log.i(TAG, "onStart.Service started with start id of: " + startId); mStartId = startId; - + parseIntent(intent); - + mLocationManager.enableLocationUpdates(this); } - + /** * This method is called when startService is called. only used in 2.x android. * @author ricky barrette */ @Override - public int onStartCommand(Intent intent, int flags, int startId) { + public int onStartCommand(final Intent intent, final int flags, final int startId) { if(Debug.DEBUG) Log.i(TAG , "onStartCommand.Service started with start id of: " + startId); - mStartId = startId; - - parseIntent(intent); - - mLocationManager.enableLocationUpdates(this); + mStartId = startId; + + parseIntent(intent); + + mLocationManager.enableLocationUpdates(this); return START_STICKY; - } - + } + + @Override + public void onStatusChanged(final String provider, final int status, final Bundle extras) { + // TODO Auto-generated method stub + + } + /** * Parses the incoming intent for the service options * * @author ricky barrette */ - private void parseIntent(Intent intent){ - - this.mIntent = intent; - + private void parseIntent(final Intent intent){ + + mIntent = intent; + if (intent.hasExtra(LocationLibraryConstants.INTENT_EXTRA_PERIOD_BETWEEN_UPDATES)) mPeriod = intent.getLongExtra(LocationLibraryConstants.INTENT_EXTRA_PERIOD_BETWEEN_UPDATES, LocationLibraryConstants.FAIL_SAFE_UPDATE_INVERVAL); - + if (intent.hasExtra(LocationLibraryConstants.INTENT_EXTRA_REQUIRED_ACCURACY)) mRequiredAccuracy = intent.getIntExtra(LocationLibraryConstants.INTENT_EXTRA_REQUIRED_ACCURACY, LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY); } - - /** - * (non-Javadoc) - * @see android.app.Service#onBind(android.content.Intent) - * @param arg0 - * @return - * @author ricky barrette - */ - @Override - public IBinder onBind(Intent arg0) { - // UNUSED - return null; - } /** - *a convince method for getting an intent to start the service - * @param context - * @return a intent that will start the service + * registers this service to be waken up by android's alarm manager * @author ricky barrette */ - public static Intent getStartServiceIntent(final Context context){ - return new Intent(context, LocationService.class); - } - - /** - * a convince method for stopping the service and removing it's alarm - * @param context - * @return a runnable that will stop the service - * @author ricky barrette - */ - public static Runnable stopService(final Context context){ - return new Runnable(){ - @Override - public void run(){ - context.stopService(new Intent(context, LocationService.class)); - ((AlarmManager) context.getSystemService(Context.ALARM_SERVICE)).cancel(PendingIntent.getService(context, REQUEST_CODE, new Intent(context, LocationService.class), 0)); - } - }; - } - - @Override - public void onLocationChanged(Location location) { - if(Debug.DEBUG) - Log.d(TAG, "got location +- "+ location.getAccuracy() +"m"); - mLocation = location; - if(location.getAccuracy() <= (mRequiredAccuracy > -1 ? mRequiredAccuracy : LocationLibraryConstants.MINIMUM_REQUIRED_ACCURACY) || LocationLibraryConstants.REPORT_FIRST_LOCATION){ - stopSelf(mStartId); - } - } - - @Override - public void onProviderDisabled(String provider) { - // TODO Auto-generated method stub - - } - - @Override - public void onProviderEnabled(String provider) { - // TODO Auto-generated method stub - - } - - @Override - public void onStatusChanged(String provider, int status, Bundle extras) { - // TODO Auto-generated method stub - + private void registerwakeUp(){ + Log.d(TAG, "registerwakeUp()"); + final AlarmManager am = (AlarmManager) getSystemService(Context.ALARM_SERVICE); + am.set(AlarmManager.RTC_WAKEUP, Calendar.getInstance().getTimeInMillis() + mPeriod, PendingIntent.getService(this, REQUEST_CODE, mIntent, 0)); } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/MapView.java b/LocationLib/src/com/TwentyCodes/android/location/MapView.java index 31c889b..19ccbf9 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/MapView.java +++ b/LocationLib/src/com/TwentyCodes/android/location/MapView.java @@ -5,14 +5,14 @@ */ package com.TwentyCodes.android.location; -import com.TwentyCodes.android.debug.Debug; - import android.content.Context; import android.graphics.Canvas; import android.util.AttributeSet; import android.util.Log; import android.view.MotionEvent; +import com.TwentyCodes.android.debug.Debug; + /** * We use this MapView Because it has double tap zoom capability and exception handling * @author ricky barrette @@ -23,21 +23,12 @@ public class MapView extends com.google.android.maps.MapView { private long mLastTouchTime; private boolean mDoubleTapZoonEnabled = true; - /** - * @param context - * @param apiKey - * @author ricky barrette - */ - public MapView(Context context, String apiKey) { - super(context, apiKey); - } - /** * @param context * @param attrs * @author ricky barrette */ - public MapView(Context context, AttributeSet attrs) { + public MapView(final Context context, final AttributeSet attrs) { super(context, attrs); } @@ -47,57 +38,38 @@ public class MapView extends com.google.android.maps.MapView { * @param defStyle * @author ricky barrette */ - public MapView(Context context, AttributeSet attrs, int defStyle) { + public MapView(final Context context, final AttributeSet attrs, final int defStyle) { super(context, attrs, defStyle); } - - @Override - public boolean onInterceptTouchEvent(MotionEvent ev) { - if (ev.getAction() == MotionEvent.ACTION_DOWN) { - - long thisTime = System.currentTimeMillis(); - if (this.mDoubleTapZoonEnabled && thisTime - mLastTouchTime < 250) { - // Double tap - this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); - mLastTouchTime = -1; - } else { - // Too slow - mLastTouchTime = thisTime; - } - } - - return super.onInterceptTouchEvent(ev); + /** + * @param context + * @param apiKey + * @author ricky barrette + */ + public MapView(final Context context, final String apiKey) { + super(context, apiKey); } - + /** * We will override the draw method to help prevent issues * (non-Javadoc) * @see android.view.View#draw(android.graphics.Canvas) * @author ricky barrette */ - @Override - public void draw(Canvas canvas) { - try { - if(this.getZoomLevel() >= 21) { - this.getController().setZoom(20); - } - super.draw(canvas); - } - catch(Exception ex) { -// getController().setCenter(this.getMapCenter()); -// getController().setZoom(this.getZoomLevel() - 2); - if(Debug.DEBUG) - Log.d(TAG, "Internal error in MapView:" + Log.getStackTraceString(ex)); - } - } - - /** - * @param isDoubleTapZoonEnabled the isDoubleTapZoonEnabled to set - * @author ricky barrette - */ - public void setDoubleTapZoonEnabled(boolean isDoubleTapZoonEnabled) { - this.mDoubleTapZoonEnabled = isDoubleTapZoonEnabled; + @Override + public void draw(final Canvas canvas) { + try { + if(getZoomLevel() >= 21) + getController().setZoom(20); + super.draw(canvas); + } + catch(final Exception ex) { + // getController().setCenter(this.getMapCenter()); + // getController().setZoom(this.getZoomLevel() - 2); + if(Debug.DEBUG) + Log.d(TAG, "Internal error in MapView:" + Log.getStackTraceString(ex)); + } } /** @@ -107,4 +79,30 @@ public class MapView extends com.google.android.maps.MapView { public boolean getDoubleTapZoonEnabled() { return mDoubleTapZoonEnabled; } + + @Override + public boolean onInterceptTouchEvent(final MotionEvent ev) { + + if (ev.getAction() == MotionEvent.ACTION_DOWN) { + + final long thisTime = System.currentTimeMillis(); + if (mDoubleTapZoonEnabled && thisTime - mLastTouchTime < 250) { + // Double tap + getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); + mLastTouchTime = -1; + } else + // Too slow + mLastTouchTime = thisTime; + } + + return super.onInterceptTouchEvent(ev); + } + + /** + * @param isDoubleTapZoonEnabled the isDoubleTapZoonEnabled to set + * @author ricky barrette + */ + public void setDoubleTapZoonEnabled(final boolean isDoubleTapZoonEnabled) { + mDoubleTapZoonEnabled = isDoubleTapZoonEnabled; + } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/MidPoint.java b/LocationLib/src/com/TwentyCodes/android/location/MidPoint.java index 1325b4e..26ca914 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/MidPoint.java +++ b/LocationLib/src/com/TwentyCodes/android/location/MidPoint.java @@ -8,11 +8,11 @@ package com.TwentyCodes.android.location; import com.google.android.maps.GeoPoint; /** - * This MidPoint object will hold the information form the calculations performed by GeoUtils.midPoint(). + * This MidPoint object will hold the information form the calculations performed by GeoUtils.midPoint(). * @author ricky barrette */ public class MidPoint { - + private final int mMinLatitude; private final int mMaxLatitude; private final int mMinLongitude; @@ -23,23 +23,14 @@ public class MidPoint { * Creates a new MidPoint * @author ricky barrette */ - public MidPoint(GeoPoint midPoint, int minLatitude, int minLongitude, int maxLatitude, int maxLongitude) { + public MidPoint(final GeoPoint midPoint, final int minLatitude, final int minLongitude, final int maxLatitude, final int maxLongitude) { mMinLatitude = minLatitude; mMaxLatitude = maxLatitude; mMinLongitude = minLongitude; mMaxLongitude = maxLongitude; mMidPoint = midPoint; } - - /** - * zooms the provided map view to the span of this mid point - * @param mMapView - * @author ricky barrette - */ - public void zoomToSpan(com.google.android.maps.MapView mMapView){ - mMapView.getController().zoomToSpan((mMaxLatitude - mMinLatitude), (mMaxLongitude - mMinLongitude)); - } - + /** * returns the calculated midpoint * @return @@ -48,4 +39,13 @@ public class MidPoint { public GeoPoint getMidPoint(){ return mMidPoint; } + + /** + * zooms the provided map view to the span of this mid point + * @param mMapView + * @author ricky barrette + */ + public void zoomToSpan(final com.google.android.maps.MapView mMapView){ + mMapView.getController().zoomToSpan(mMaxLatitude - mMinLatitude, mMaxLongitude - mMinLongitude); + } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java index 8f5ff10..0e5c751 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java +++ b/LocationLib/src/com/TwentyCodes/android/location/PassiveLocationListener.java @@ -27,9 +27,9 @@ public class PassiveLocationListener { */ public static final void requestPassiveLocationUpdates(final Context context, final Intent receiverIntent){ if (LocationLibraryConstants.SUPPORTS_FROYO) { - final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); - final PendingIntent locationListenerPassivePendingIntent = PendingIntent.getBroadcast(context, 0, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT); - locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListenerPassivePendingIntent); - } + final LocationManager locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE); + final PendingIntent locationListenerPassivePendingIntent = PendingIntent.getBroadcast(context, 0, receiverIntent, PendingIntent.FLAG_UPDATE_CURRENT); + locationManager.requestLocationUpdates(LocationManager.PASSIVE_PROVIDER, 0, 0, locationListenerPassivePendingIntent); + } } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/location/ReverseGeocoder.java b/LocationLib/src/com/TwentyCodes/android/location/ReverseGeocoder.java index 5b4e612..11e8c5c 100644 --- a/LocationLib/src/com/TwentyCodes/android/location/ReverseGeocoder.java +++ b/LocationLib/src/com/TwentyCodes/android/location/ReverseGeocoder.java @@ -36,114 +36,114 @@ public class ReverseGeocoder { private static final String TAG = "ReverseGeocoder"; /** - * Performs a google maps search for the address - * @param location - * @return JSON Array on google place marks nearby + * Performs a google maps search for the address + * @param address to search + * @return JSON Array of google place marks + * @throws IOException + * @throws JSONException * @author ricky barrette - * @throws IOException - * @throws JSONException */ - public static JSONArray getFromLocation(final Location location) throws IOException, JSONException { - String urlStr = "http://maps.google.com/maps/geo?q=" + location.getLatitude() + "," + location.getLongitude() + "&output=json&sensor=false"; - StringBuffer response = new StringBuffer(); - HttpClient client = new DefaultHttpClient(); - + public static JSONArray addressSearch(final String address) throws IOException, JSONException { + String urlStr = "http://maps.google.com/maps/geo?q=" + address + "&output=json&sensor=false"; + urlStr = urlStr.replace(' ', '+'); + final StringBuffer response = new StringBuffer(); + final HttpClient client = new DefaultHttpClient(); + if(Debug.DEBUG) Log.d(TAG, urlStr); - HttpResponse hr = client.execute(new HttpGet(urlStr)); - HttpEntity entity = hr.getEntity(); + final HttpResponse hr = client.execute(new HttpGet(urlStr)); + final HttpEntity entity = hr.getEntity(); - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); + final BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); String buff = null; while ((buff = br.readLine()) != null) response.append(buff); - + if(Debug.DEBUG) Log.d(TAG, response.toString()); - + return new JSONObject(response.toString()).getJSONArray("Placemark"); } - - /** - * Performs a google maps search for the closest address to the location - * @param lat - * @param lon - * @return string address, or lat, lon if search fails - * @author ricky barrette - */ - public static String getAddressFromLocation(final Location location) { - String urlStr = "http://maps.google.com/maps/geo?q=" + location.getLatitude() + "," + location.getLongitude() + "&output=json&sensor=false"; - StringBuffer response = new StringBuffer(); - HttpClient client = new DefaultHttpClient(); - + + /** + * Performs a google maps search for the closest address to the location + * @param lat + * @param lon + * @return string address, or lat, lon if search fails + * @author ricky barrette + */ + public static String getAddressFromLocation(final Location location) { + final String urlStr = "http://maps.google.com/maps/geo?q=" + location.getLatitude() + "," + location.getLongitude() + "&output=json&sensor=false"; + final StringBuffer response = new StringBuffer(); + final HttpClient client = new DefaultHttpClient(); + if(Debug.DEBUG) Log.d(TAG, urlStr); try { - HttpResponse hr = client.execute(new HttpGet(urlStr)); - HttpEntity entity = hr.getEntity(); + final HttpResponse hr = client.execute(new HttpGet(urlStr)); + final HttpEntity entity = hr.getEntity(); - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); + final BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); String buff = null; while ((buff = br.readLine()) != null) response.append(buff); - } catch (IOException e) { + } catch (final IOException e) { e.printStackTrace(); } - + if(Debug.DEBUG) Log.d(TAG, response.toString()); - + JSONArray responseArray = null; try { responseArray = new JSONObject(response.toString()).getJSONArray("Placemark"); - } catch (JSONException e) { - return location.getLatitude() +", "+ location.getLongitude() +" ± "+ location.getAccuracy()+"m"; + } catch (final JSONException e) { + return location.getLatitude() +", "+ location.getLongitude() +" +/- "+ location.getAccuracy()+"m"; } if(Debug.DEBUG) Log.d(TAG,responseArray.length() + " result(s)"); - + try { - JSONObject jsl = responseArray.getJSONObject(0); + final JSONObject jsl = responseArray.getJSONObject(0); return jsl.getString("address"); - } catch (JSONException e) { + } catch (final JSONException e) { e.printStackTrace(); } - return location.getLatitude() +", "+ location.getLongitude() +" ± "+ location.getAccuracy()+"m"; + return location.getLatitude() +", "+ location.getLongitude() +" +/- "+ location.getAccuracy()+"m"; } - /** - * Performs a google maps search for the address - * @param address to search - * @return JSON Array of google place marks - * @throws IOException - * @throws JSONException - * @author ricky barrette - */ - public static JSONArray addressSearch(final String address) throws IOException, JSONException { - String urlStr = "http://maps.google.com/maps/geo?q=" + address + "&output=json&sensor=false"; - urlStr = urlStr.replace(' ', '+'); - StringBuffer response = new StringBuffer(); - HttpClient client = new DefaultHttpClient(); - + /** + * Performs a google maps search for the address + * @param location + * @return JSON Array on google place marks nearby + * @author ricky barrette + * @throws IOException + * @throws JSONException + */ + public static JSONArray getFromLocation(final Location location) throws IOException, JSONException { + final String urlStr = "http://maps.google.com/maps/geo?q=" + location.getLatitude() + "," + location.getLongitude() + "&output=json&sensor=false"; + final StringBuffer response = new StringBuffer(); + final HttpClient client = new DefaultHttpClient(); + if(Debug.DEBUG) Log.d(TAG, urlStr); - HttpResponse hr = client.execute(new HttpGet(urlStr)); - HttpEntity entity = hr.getEntity(); + final HttpResponse hr = client.execute(new HttpGet(urlStr)); + final HttpEntity entity = hr.getEntity(); - BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); + final BufferedReader br = new BufferedReader(new InputStreamReader(entity.getContent())); String buff = null; while ((buff = br.readLine()) != null) response.append(buff); - + if(Debug.DEBUG) Log.d(TAG, response.toString()); - + return new JSONObject(response.toString()).getJSONArray("Placemark"); } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/BaseUserOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/BaseUserOverlay.java index ab0d824..d2e6bb2 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/BaseUserOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/BaseUserOverlay.java @@ -33,13 +33,13 @@ import com.google.android.maps.Projection; * @author ricky barrette */ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocationListener, CompassListener { - + /** * This thread is responsible for animating the user icon * @author ricky barrette */ public class AnimationThread extends Thread { - + private boolean isAborted; public void abort(){ @@ -51,59 +51,57 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * (non-Javadoc) * @see java.lang.Thread#run() */ - @Override + @Override public void run(){ super.run(); int index = 0; boolean isCountingDown = false; - while (true) { + while (true) synchronized (this) { - if (isAborted) { + if (isAborted) break; - } - + switch(index){ - case 1: - mUserArrow = R.drawable.user_arrow_animation_2; - if(isCountingDown) + case 1: + mUserArrow = R.drawable.user_arrow_animation_2; + if(isCountingDown) + index--; + else + index++; + + try { + sleep(100l); + } catch (final InterruptedException e) { + e.printStackTrace(); + } + break; + case 2: + mUserArrow = R.drawable.user_arrow_animation_3; index--; - else + isCountingDown = true; + try { + sleep(200l); + } catch (final InterruptedException e) { + e.printStackTrace(); + } + break; + default: + mUserArrow = R.drawable.user_arrow_animation_1; index++; - - try { - sleep(100l); - } catch (InterruptedException e) { - e.printStackTrace(); - } - break; - case 2: - mUserArrow = R.drawable.user_arrow_animation_3; - index--; - isCountingDown = true; - try { - sleep(200l); - } catch (InterruptedException e) { - e.printStackTrace(); - } - break; - default: - mUserArrow = R.drawable.user_arrow_animation_1; - index++; - isCountingDown = false; - try { - sleep(2000l); - } catch (InterruptedException e) { - e.printStackTrace(); - return; - } - break; + isCountingDown = false; + try { + sleep(2000l); + } catch (final InterruptedException e) { + e.printStackTrace(); + return; + } + break; } } - } - + } } - + private final String TAG = "UserOverlayBase"; private boolean isEnabled; private int mUserArrow = R.drawable.user_arrow_animation_1; @@ -111,30 +109,30 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio private float mBearing = 0; private int mAccuracy; private GeoPoint mPoint; - private Context mContext; - private MapView mMapView; + private final Context mContext; + private final MapView mMapView; private boolean isFistFix = true; private GeoPointLocationListener mListener; public boolean isFollowingUser = true; - private CompasOverlay mCompass; + private final CompasOverlay mCompass; private boolean isCompassEnabled; - + private CompassListener mCompassListener; - + /** * Construct a new UserOverlay * @param mapView * @param context * @author ricky barrette */ - public BaseUserOverlay(MapView mapView, Context context) { + public BaseUserOverlay(final MapView mapView, final Context context) { super(); mContext = context; mMapView = mapView; mCompass = new CompasOverlay(context); mUserArrow = R.drawable.user_arrow_animation_1; } - + /** * Construct a new UserOverlayTODO Auto-generated method stub * @param mapView @@ -142,11 +140,11 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * @param followUser * @author ricky barrette */ - public BaseUserOverlay(MapView mapView, Context context, boolean followUser) { + public BaseUserOverlay(final MapView mapView, final Context context, final boolean followUser) { this(mapView, context); isFollowingUser = followUser; } - + /** * Disables the compass * @author ricky barrette @@ -155,7 +153,7 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio isCompassEnabled = false; mMapView.getOverlays().remove(mCompass); } - + /** * Stops location updates and removes the overlay from view * @author ricky barrette @@ -169,7 +167,7 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio mListener.onFirstFix(false); mAnimationThread.abort(); } - + /** * we override this methods so we can provide a drawable and a location to draw on the canvas. * (non-Javadoc) @@ -180,12 +178,12 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * @author ricky barrette */ @Override - public void draw(Canvas canvas, MapView mapView, boolean shadow){ + public void draw(Canvas canvas, final MapView mapView, final boolean shadow){ if (isEnabled && mPoint != null) { - Point center = new Point(); - Point left = new Point(); - Projection projection = mapView.getProjection(); - GeoPoint leftGeo = GeoUtils.distanceFrom(mPoint, mAccuracy); + final Point center = new Point(); + final Point left = new Point(); + final Projection projection = mapView.getProjection(); + final GeoPoint leftGeo = GeoUtils.distanceFrom(mPoint, mAccuracy); projection.toPixels(leftGeo, left); projection.toPixels(mPoint, center); canvas = drawAccuracyCircle(center, left, canvas); @@ -194,7 +192,7 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * the following log is used to demonstrate if the leftGeo point is the correct */ if(Debug.DEBUG) - Log.d(TAG, (GeoUtils.distanceKm(mPoint, leftGeo) * 1000)+"m"); + Log.d(TAG, GeoUtils.distanceKm(mPoint, leftGeo) * 1000+"m"); } super.draw(canvas, mapView, shadow); } @@ -207,96 +205,95 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * @return modified canvas * @author ricky barrette */ - private Canvas drawAccuracyCircle(Point center, Point left, Canvas canvas) { - Paint paint = new Paint(); - - /* - * get radius of the circle being drawn by - */ - int circleRadius = center.x - left.x; - if(circleRadius <= 0){ - circleRadius = left.x - center.x; - } - /* - * paint a blue circle on the map - */ - paint.setAntiAlias(true); - paint.setStrokeWidth(2.0f); - paint.setColor(Color.BLUE); - paint.setStyle(Style.STROKE); - canvas.drawCircle(center.x, center.y, circleRadius, paint); + private Canvas drawAccuracyCircle(final Point center, final Point left, final Canvas canvas) { + final Paint paint = new Paint(); + + /* + * get radius of the circle being drawn by + */ + int circleRadius = center.x - left.x; + if(circleRadius <= 0) + circleRadius = left.x - center.x; + /* + * paint a blue circle on the map + */ + paint.setAntiAlias(true); + paint.setStrokeWidth(2.0f); + paint.setColor(Color.BLUE); + paint.setStyle(Style.STROKE); + canvas.drawCircle(center.x, center.y, circleRadius, paint); /* * fill the radius with a alpha blue */ paint.setAlpha(30); - paint.setStyle(Style.FILL); - canvas.drawCircle(center.x, center.y, circleRadius, paint); - - /* - * for testing - * draw a dot over the left geopoint - */ - if(Debug.DEBUG){ - paint.setColor(Color.RED); - RectF oval = new RectF(left.x - 1, left.y - 1, left.x + 1, left.y + 1); + paint.setStyle(Style.FILL); + canvas.drawCircle(center.x, center.y, circleRadius, paint); + + /* + * for testing + * draw a dot over the left geopoint + */ + if(Debug.DEBUG){ + paint.setColor(Color.RED); + final RectF oval = new RectF(left.x - 1, left.y - 1, left.x + 1, left.y + 1); canvas.drawOval(oval, paint); - } - - return canvas; + } + + return canvas; } - - /** - * draws user arrow that points north based on bearing onto the supplied canvas - * @param point to draw user arrow on - * @param bearing of the device - * @param canvas to draw on - * @return modified canvas - * @author ricky barrette - */ - private Canvas drawUser(Point point, float bearing, Canvas canvas){ - Bitmap user = BitmapFactory.decodeResource(mContext.getResources(), mUserArrow); - Matrix matrix = new Matrix(); - matrix.postRotate(bearing); - Bitmap rotatedBmp = Bitmap.createBitmap( - user, - 0, 0, - user.getWidth(), - user.getHeight(), - matrix, - true - ); - canvas.drawBitmap( - rotatedBmp, - point.x - (rotatedBmp.getWidth() / 2), - point.y - (rotatedBmp.getHeight() / 2), - null - ); - return canvas; - } - - /** - * Enables the compass - * @author ricky barrette - */ - public void enableCompass(){ - if(! this.isCompassEnabled){ - this.mMapView.getOverlays().add(this.mCompass); - this.isCompassEnabled = true; - } - } - - /** - * Attempts to enable MyLocation, registering for updates from provider - * @author ricky barrette - */ - public void enableMyLocation(){ - if(Debug.DEBUG) - Log.d(TAG,"enableMyLocation()"); - if (! isEnabled) { - - mAnimationThread = new AnimationThread(); - mAnimationThread.start(); - + + /** + * draws user arrow that points north based on bearing onto the supplied canvas + * @param point to draw user arrow on + * @param bearing of the device + * @param canvas to draw on + * @return modified canvas + * @author ricky barrette + */ + private Canvas drawUser(final Point point, final float bearing, final Canvas canvas){ + final Bitmap user = BitmapFactory.decodeResource(mContext.getResources(), mUserArrow); + final Matrix matrix = new Matrix(); + matrix.postRotate(bearing); + final Bitmap rotatedBmp = Bitmap.createBitmap( + user, + 0, 0, + user.getWidth(), + user.getHeight(), + matrix, + true + ); + canvas.drawBitmap( + rotatedBmp, + point.x - rotatedBmp.getWidth() / 2, + point.y - rotatedBmp.getHeight() / 2, + null + ); + return canvas; + } + + /** + * Enables the compass + * @author ricky barrette + */ + public void enableCompass(){ + if(! isCompassEnabled){ + mMapView.getOverlays().add(mCompass); + isCompassEnabled = true; + } + } + + /** + * Attempts to enable MyLocation, registering for updates from provider + * @author ricky barrette + */ + public void enableMyLocation(){ + if(Debug.DEBUG) + Log.d(TAG,"enableMyLocation()"); + if (! isEnabled) { + + mAnimationThread = new AnimationThread(); + mAnimationThread.start(); + onMyLocationEnabled(); isEnabled = true; mCompass.enable(this); @@ -304,37 +301,37 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio if(mListener != null) mListener.onFirstFix(false); } - } - - /** - * Allows the map to follow the user - * @param followUser - * @author ricky barrette - */ - public void followUser(boolean followUser){ - if(Debug.DEBUG) - Log.d(TAG,"followUser()"); - isFollowingUser = followUser; - } - - /** + } + + /** + * Allows the map to follow the user + * @param followUser + * @author ricky barrette + */ + public void followUser(final boolean followUser){ + if(Debug.DEBUG) + Log.d(TAG,"followUser()"); + isFollowingUser = followUser; + } + + /** * @return return the current destination * @author ricky barrette */ public GeoPoint getDestination(){ return mCompass.getDestination(); } - - /** - * returns the users current bearing - * @return - * @author ricky barrette - */ - public float getUserBearing(){ - return mBearing; - } - - /** + + /** + * returns the users current bearing + * @return + * @author ricky barrette + */ + public float getUserBearing(){ + return mBearing; + } + + /** * returns the users current location * @return * @author ricky barrette @@ -342,9 +339,9 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio public GeoPoint getUserLocation(){ return mPoint; } - + @Override - public void onCompassUpdate(float bearing) { + public void onCompassUpdate(final float bearing) { if(mCompassListener != null) mCompassListener.onCompassUpdate(bearing); mBearing = bearing; @@ -360,34 +357,32 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * @author ricky barrette */ @Override - public void onLocationChanged(GeoPoint point, int accuracy) { - + public void onLocationChanged(final GeoPoint point, final int accuracy) { + if(mCompass != null) mCompass.setLocation(point); - + /* * if this is the first fix * set map center the users location, and zoom to the max zoom level */ if(point != null && isFistFix){ mMapView.getController().setCenter(point); - mMapView.getController().setZoom( (mMapView.getMaxZoomLevel() - 2) ); + mMapView.getController().setZoom( mMapView.getMaxZoomLevel() - 2 ); if(mListener != null) mListener.onFirstFix(true); isFistFix = false; } - + //update the users point, and accuracy for the UI mPoint = point; mAccuracy = accuracy; mMapView.invalidate(); - if(mListener != null){ + if(mListener != null) mListener.onLocationChanged(point, accuracy); - } - - if (isFollowingUser) { + + if (isFollowingUser) panToUserIfOffMap(point); - } } /** @@ -397,43 +392,41 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio public abstract void onMyLocationDisabled(); /** - * Called when the enableMyLocation() is called. This is where you want to ask your location provider for updates - * @author ricky barrette - */ - public abstract void onMyLocationEnabled(); - + * Called when the enableMyLocation() is called. This is where you want to ask your location provider for updates + * @author ricky barrette + */ + public abstract void onMyLocationEnabled(); + /** * pans the map view if the user is off screen. * @author ricky barrette */ - private void panToUserIfOffMap(GeoPoint user) { - GeoPoint center = mMapView.getMapCenter(); - double distance = GeoUtils.distanceKm(center, user); - double distanceLat = GeoUtils.distanceKm(center, new GeoPoint((center.getLatitudeE6() + (int) (mMapView.getLatitudeSpan() / 2)), center.getLongitudeE6())); - double distanceLon = GeoUtils.distanceKm(center, new GeoPoint(center.getLatitudeE6(), (center.getLongitudeE6() + (int) (mMapView.getLongitudeSpan() / 2)))); - - double whichIsGreater = (distanceLat > distanceLon) ? distanceLat : distanceLon; - + private void panToUserIfOffMap(final GeoPoint user) { + final GeoPoint center = mMapView.getMapCenter(); + final double distance = GeoUtils.distanceKm(center, user); + final double distanceLat = GeoUtils.distanceKm(center, new GeoPoint(center.getLatitudeE6() + mMapView.getLatitudeSpan() / 2, center.getLongitudeE6())); + final double distanceLon = GeoUtils.distanceKm(center, new GeoPoint(center.getLatitudeE6(), center.getLongitudeE6() + mMapView.getLongitudeSpan() / 2)); + + final double whichIsGreater = distanceLat > distanceLon ? distanceLat : distanceLon; + /** * if the user is one the map, keep them their * else don't pan to user unless they pan pack to them */ if( ! (distance > whichIsGreater) ) - if (distance > distanceLat || distance > distanceLon){ + if (distance > distanceLat || distance > distanceLon) mMapView.getController().animateTo(user); - } } - + /** * Attempts to register the listener for location updates * @param listener * @author Ricky Barrette */ - public void registerListener(GeoPointLocationListener listener){ + public void registerListener(final GeoPointLocationListener listener){ Log.d(TAG,"registerListener()"); - if (mListener == null){ + if (mListener == null) mListener = listener; - } } /** @@ -444,7 +437,7 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * @param y * @author ricky barrette */ - public void setCompassDrawables(int needleResId, int backgroundResId, int x, int y) { + public void setCompassDrawables(final int needleResId, final int backgroundResId, final int x, final int y) { mCompass.setDrawables(needleResId, backgroundResId, x, y); } @@ -453,19 +446,19 @@ public abstract class BaseUserOverlay extends Overlay implements GeoPointLocatio * @param listener * @author ricky barrette */ - public void setCompassListener(CompassListener listener){ + public void setCompassListener(final CompassListener listener){ mCompassListener = listener; } - + /** * Sets the destination for the compass * @author ricky barrette */ - public void setDestination(GeoPoint destination){ + public void setDestination(final GeoPoint destination){ if(mCompass != null) mCompass.setDestination(destination); } - + /** * UnResgisters the listener. after this call you will no longer get location updates * @author Ricky Barrette diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java index e769035..88d4aab 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/CompasOverlay.java @@ -45,20 +45,20 @@ public class CompasOverlay extends Overlay implements CompassListener { * Creates a new CompasOverlay * @author ricky barrette */ - public CompasOverlay(Context context) { + public CompasOverlay(final Context context) { mContext = context; mCompassSensor = new CompassSensor(context); mX = convertDipToPx(40); mY = mX; } - + /** * Creates a new CompasOverlay * @param context * @param destination * @author ricky barrette */ - public CompasOverlay(Context context, GeoPoint destination){ + public CompasOverlay(final Context context, final GeoPoint destination){ this(context); mDestination = destination; } @@ -73,14 +73,14 @@ public class CompasOverlay extends Overlay implements CompassListener { * @param y dip * @author ricky barrette */ - public CompasOverlay(Context context, GeoPoint destination, int needleResId, int backgroundResId, int x, int y){ + public CompasOverlay(final Context context, final GeoPoint destination, final int needleResId, final int backgroundResId, final int x, final int y){ this(context, destination); mX = convertDipToPx(x); mY = convertDipToPx(y); mNeedleResId = needleResId; mBackgroundResId = backgroundResId; } - + /** * Creates a new CompasOverlay * @param context @@ -90,7 +90,7 @@ public class CompasOverlay extends Overlay implements CompassListener { * @param y * @author ricky barrette */ - public CompasOverlay(Context context, int needleResId, int backgroundResId, int x, int y){ + public CompasOverlay(final Context context, final int needleResId, final int backgroundResId, final int x, final int y){ this(context, null, needleResId, backgroundResId, x, y); } @@ -100,8 +100,8 @@ public class CompasOverlay extends Overlay implements CompassListener { * @return px * @author ricky barrette */ - private int convertDipToPx(int i) { - Resources r = mContext.getResources(); + private int convertDipToPx(final int i) { + final Resources r = mContext.getResources(); return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, i, r.getDisplayMetrics()); } @@ -114,7 +114,7 @@ public class CompasOverlay extends Overlay implements CompassListener { mCompassSensor.disable(); mListener = null; } - + /** * (non-Javadoc) * @see com.google.android.maps.Overlay#draw(android.graphics.Canvas, com.google.android.maps.MapView, boolean) @@ -122,43 +122,43 @@ public class CompasOverlay extends Overlay implements CompassListener { */ @Override public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) { - + if(isEnabled){ //set the center of the compass in the top left corner of the screen - Point point = new Point(); + final Point point = new Point(); point.set(mX, mY); - + //draw compass background - Bitmap compass = BitmapFactory.decodeResource( mContext.getResources(), mBackgroundResId); - canvas.drawBitmap(compass, - point.x - (compass.getWidth() / 2), - point.y - (compass.getHeight() / 2), - null - ); - + final Bitmap compass = BitmapFactory.decodeResource( mContext.getResources(), mBackgroundResId); + canvas.drawBitmap(compass, + point.x - compass.getWidth() / 2, + point.y - compass.getHeight() / 2, + null + ); + //draw the compass needle - Bitmap arrowBitmap = BitmapFactory.decodeResource( mContext.getResources(), mNeedleResId); - Matrix matrix = new Matrix(); - matrix.postRotate(GeoUtils.calculateBearing(mLocation, mDestination, mBearing)); - Bitmap rotatedBmp = Bitmap.createBitmap( - arrowBitmap, - 0, 0, - arrowBitmap.getWidth(), - arrowBitmap.getHeight(), - matrix, - true - ); + final Bitmap arrowBitmap = BitmapFactory.decodeResource( mContext.getResources(), mNeedleResId); + final Matrix matrix = new Matrix(); + matrix.postRotate(GeoUtils.calculateBearing(mLocation, mDestination, mBearing)); + final Bitmap rotatedBmp = Bitmap.createBitmap( + arrowBitmap, + 0, 0, + arrowBitmap.getWidth(), + arrowBitmap.getHeight(), + matrix, + true + ); canvas.drawBitmap( - rotatedBmp, - point.x - (rotatedBmp.getWidth() / 2), - point.y - (rotatedBmp.getHeight() / 2), - null - ); + rotatedBmp, + point.x - rotatedBmp.getWidth() / 2, + point.y - rotatedBmp.getHeight() / 2, + null + ); mapView.invalidate(); } - super.draw(canvas, mapView, shadow); + super.draw(canvas, mapView, shadow); } - + /** * Enables the compass overlay * @author ricky barrette @@ -169,17 +169,17 @@ public class CompasOverlay extends Overlay implements CompassListener { mCompassSensor.enable(this); } } - + /** * Enables the compass overlay * @param listener * @author ricky barrette */ - public void enable(CompassListener listener){ + public void enable(final CompassListener listener){ mListener = listener; enable(); } - + /** * @return the current bearing * @author ricky barrette @@ -187,7 +187,7 @@ public class CompasOverlay extends Overlay implements CompassListener { public float getBearing(){ return mBearing; } - + /** * @return return the current destination * @author ricky barrette @@ -203,24 +203,24 @@ public class CompasOverlay extends Overlay implements CompassListener { * @author ricky barrette */ @Override - public void onCompassUpdate(float bearing) { + public void onCompassUpdate(final float bearing) { mBearing = bearing; - + /* * pass it down the chain */ if(mListener != null) mListener.onCompassUpdate(bearing); } - + /** * @param destination * @author ricky barrette */ - public void setDestination(GeoPoint destination){ + public void setDestination(final GeoPoint destination){ mDestination = destination; } - + /** * @param needleResId * @param backgroundResId @@ -228,18 +228,18 @@ public class CompasOverlay extends Overlay implements CompassListener { * @param y dip * @author ricky barrette */ - public void setDrawables(int needleResId, int backgroundResId, int x, int y){ + public void setDrawables(final int needleResId, final int backgroundResId, final int x, final int y){ mX = convertDipToPx(x); mY = convertDipToPx(y); mNeedleResId = needleResId; mBackgroundResId = backgroundResId; } - + /** * @param location * @author ricky barrette */ - public void setLocation(GeoPoint location){ + public void setLocation(final GeoPoint location){ mLocation = location; } diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java index c715709..53f232c 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/DirectionsOverlay.java @@ -30,14 +30,14 @@ import com.google.android.maps.GeoPoint; * @author ricky barrette */ public class DirectionsOverlay { - + /** * @author ricky barrette */ public interface OnDirectionsCompleteListener{ public void onDirectionsComplete(DirectionsOverlay directionsOverlay); } - + private static final String TAG = "DirectionsOverlay"; private ArrayList mPath; private ArrayList mDirections; @@ -48,24 +48,24 @@ public class DirectionsOverlay { 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 + * @throws IOException + * @throws ClientProtocolException + * @throws IllegalStateException + * @throws JSONException */ public DirectionsOverlay(final MapView map, final GeoPoint origin, final GeoPoint destination, final OnDirectionsCompleteListener listener) throws IllegalStateException, ClientProtocolException, IOException, JSONException { mMapView = map; mListener = listener; - String json = downloadJSON(generateUrl(origin, destination)); + final String json = downloadJSON(generateUrl(origin, destination)); drawPath(json); } - + /** * Creates a new DirectionsOverlay from the provided String JSON * @param json @@ -77,65 +77,66 @@ public class DirectionsOverlay { mMapView = map; drawPath(json); } - + /** * Deocodes googles polyline * @param encoded - * @return a list of geopoints representing the path + * @return a list of geopoints representing the path * @author Mark McClure http://facstaff.unca.edu/mcmcclur/googlemaps/encodepolyline/ * @author ricky barrette - * @throws JSONException + * @throws JSONException */ private void decodePoly(final 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; + final String encoded = step.getJSONObject("polyline").getString("points"); + int index = 0; + final int 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; + 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); + final 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; + shift = 0; + result = 0; + do { + b = encoded.charAt(index++) - 63; + result |= (b & 0x1f) << shift; + shift += 5; + } while (b >= 0x20); + final 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){ + final GeoPoint p = new GeoPoint((int) (lat / 1E5 * 1E6), (int) (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)); -// else -// mPath.add(new PathOverlay(p, 5, Color.GREEN)); - - last = p; - } - + } + + + if(last != null) + mPath.add(new PathOverlay(last, p, Color.RED)); + // else + // mPath.add(new PathOverlay(p, 5, Color.GREEN)); + + last = p; + } + } - + /** - * Downloads Google Directions JSON from the Internet + * Downloads Google Directions JSON from the Internet * @param url * @return * @throws IllegalStateException @@ -148,21 +149,21 @@ public class DirectionsOverlay { 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())); + final StringBuffer response = new StringBuffer(); + final 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 + * @return + * @throws JSONException */ public void drawPath(final String json) throws JSONException{ if(Debug.DEBUG){ @@ -174,75 +175,75 @@ public class DirectionsOverlay { mPoints = new ArrayList(); mDistance = new ArrayList(); mDuration = new ArrayList(); - + //get first route - JSONObject route = new JSONObject(json).getJSONArray("routes").getJSONObject(0); - + final JSONObject route = new JSONObject(json).getJSONArray("routes").getJSONObject(0); + mCopyRights = route.getString("copyrights"); //route.getString("status"); - - JSONObject leg = route.getJSONArray("legs").getJSONObject(0); + + final 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)); - + // 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 - + + // 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"); + final 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)); - + + // 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")); + // 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 + * @return The Google API url for our directions * @author ricky barrette */ private String generateUrl(final GeoPoint origin, final GeoPoint destination){ @@ -256,7 +257,7 @@ public class DirectionsOverlay { Double.toString(destination.getLongitudeE6() / 1.0E6)+ "&sensor=true&mode=walking"; } - + /** * @return * @author ricky barrette @@ -264,7 +265,7 @@ public class DirectionsOverlay { public String getCopyrights(){ return mCopyRights; } - + /** * @return * @author ricky barrette @@ -282,7 +283,7 @@ public class DirectionsOverlay { private String getDistance(final JSONObject step) throws JSONException{ return step.getJSONObject("distance").getString("text"); } - + /** * @return * @author ricky barrette @@ -293,7 +294,7 @@ public class DirectionsOverlay { /** * @param step - * @return the duration of a step + * @return the duration of a step * @throws JSONException * @author ricky barrette */ @@ -327,7 +328,7 @@ public class DirectionsOverlay { public ArrayList getPath(){ return mPath; } - + /** * @return * @author ricky barrette @@ -349,6 +350,6 @@ public class DirectionsOverlay { * @author ricky barrette */ public void removePath() { - if(mMapView.getOverlays().removeAll(mPath)); + if(mMapView.getOverlays().removeAll(mPath)); } } \ 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 index 5712fc8..bb5bebd 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/PathOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/PathOverlay.java @@ -41,7 +41,7 @@ public final class PathOverlay extends Overlay { mMode = PATH; mRadius = 0; } - + /** * Creates a new PathOverlay in point mode. This is used to draw end points. * @param point @@ -56,29 +56,29 @@ public final class PathOverlay extends Overlay { mEnd = mStart; mColor = color; } - + /** * * @param canvas canvas to be drawn on - * @param mapView - * @param shadow + * @param mapView + * @param shadow * @param when */ @Override - public void draw(Canvas canvas, MapView mapView, boolean shadow) { + public void draw(final Canvas canvas, final MapView mapView, final boolean shadow) { final Projection projection = mapView.getProjection(); final Paint paint = new Paint(); paint.setColor(mColor); paint.setAntiAlias(true); - Point point = new Point(); + final 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); + final 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(); + final Point point2 = new Point(); projection.toPixels(mEnd, point2); paint.setStrokeWidth(5); paint.setAlpha(120); @@ -86,20 +86,20 @@ public final class PathOverlay extends Overlay { } super.draw(canvas, mapView, shadow); } - + /** * @return the end point of this path * @author ricky barrette */ public GeoPoint getEndPoint(){ - return this.mEnd; + return mEnd; } - + /** * @return the start point of this path * @author ricky barrette */ public GeoPoint getStartPoint(){ - return this.mStart; + return mStart; } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java index a12121d..7422542 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/RadiusOverlay.java @@ -1,7 +1,7 @@ /** -* @author Twenty Codes -* @author ricky barrette -*/ + * @author Twenty Codes + * @author ricky barrette + */ package com.TwentyCodes.android.overlays; @@ -21,7 +21,7 @@ import com.google.android.maps.OverlayItem; import com.google.android.maps.Projection; /** - * This class will used to draw a radius of a specified size in a specified location, then inserted into + * This class will used to draw a radius of a specified size in a specified location, then inserted into * an overlay list to be displayed a map * @author ricky barrette */ @@ -33,32 +33,32 @@ public class RadiusOverlay extends Overlay{ private int mColor = Color.GREEN; private GeoPoint mRadiusPoint; private OnLocationSelectedListener mListener; - + /** * Creates a new RadiusOverlay * @author ricky barrette */ public RadiusOverlay(){ } - + /** * Creates a new RadiusOverlay object that can be inserted into an overlay list. - * @param point center of radius geopoint + * @param point center of radius geopoint * @param radius radius in meters * @param color desired color of the radius from Color API * @author ricky barrette */ - public RadiusOverlay(GeoPoint point, float radius, int color) { + public RadiusOverlay(final GeoPoint point, final float radius, final int color) { mPoint = point; mRadius = radius; mColor = color; } - + /** * draws a specific radius on the mapview that is handed to it * @param canvas canvas to be drawn on - * @param mapView - * @param shadow + * @param mapView + * @param shadow * @param when */ @Override @@ -68,44 +68,43 @@ public class RadiusOverlay extends Overlay{ final Point center = new Point(); final Point left = new Point(); final Projection projection = mapView.getProjection(); - - /* - * Calculate a geopoint that is "radius" meters away from geopoint point and - * convert the given GeoPoint and leftGeo to onscreen pixel coordinates, - * relative to the top-left of the MapView that provided this Projection. - */ - mRadiusPoint = GeoUtils.distanceFrom(mPoint , mRadius); - projection.toPixels(mRadiusPoint, left); - projection.toPixels(mPoint, center); - - /* - * get radius of the circle being drawn by - */ - int circleRadius = center.x - left.x; - if(circleRadius <= 0){ - circleRadius = left.x - center.x; - } - - /* - * paint a circle on the map - */ - paint.setAntiAlias(true); - paint.setStrokeWidth(2.0f); - paint.setColor(mColor); - paint.setStyle(Style.STROKE); - canvas.drawCircle(center.x, center.y, circleRadius, paint); - - //draw a dot over the geopoint - RectF oval = new RectF(center.x - 2, center.y - 2, center.x + 2, center.y + 2); + + /* + * Calculate a geopoint that is "radius" meters away from geopoint point and + * convert the given GeoPoint and leftGeo to onscreen pixel coordinates, + * relative to the top-left of the MapView that provided this Projection. + */ + mRadiusPoint = GeoUtils.distanceFrom(mPoint , mRadius); + projection.toPixels(mRadiusPoint, left); + projection.toPixels(mPoint, center); + + /* + * get radius of the circle being drawn by + */ + int circleRadius = center.x - left.x; + if(circleRadius <= 0) + circleRadius = left.x - center.x; + + /* + * paint a circle on the map + */ + paint.setAntiAlias(true); + paint.setStrokeWidth(2.0f); + paint.setColor(mColor); + paint.setStyle(Style.STROKE); + canvas.drawCircle(center.x, center.y, circleRadius, paint); + + //draw a dot over the geopoint + final RectF oval = new RectF(center.x - 2, center.y - 2, center.x + 2, center.y + 2); canvas.drawOval(oval, paint); - + //fill the radius with a nice green paint.setAlpha(25); - paint.setStyle(Style.FILL); - canvas.drawCircle(center.x, center.y, circleRadius, paint); + paint.setStyle(Style.FILL); + canvas.drawCircle(center.x, center.y, circleRadius, paint); } } - + /** * @return the selected location * @author ricky barrette @@ -113,12 +112,17 @@ public class RadiusOverlay extends Overlay{ public GeoPoint getLocation(){ return mPoint; } - + + public int getZoomLevel() { + // GeoUtils.GeoUtils.distanceFrom(mPoint , mRadius) + return 0; + } + @Override - public boolean onTap(GeoPoint p, MapView mapView) { + public boolean onTap(final GeoPoint p, final MapView mapView) { mPoint = p; - if(this.mListener != null) - this.mListener.onLocationSelected(p); + if(mListener != null) + mListener.onLocationSelected(p); return super.onTap(p, mapView); } @@ -126,33 +130,28 @@ public class RadiusOverlay extends Overlay{ * @param color * @author ricky barrette */ - public void setColor(int color){ + public void setColor(final int color){ mColor = color; } - + /** * @param location * @author ricky barrette */ - public void setLocation(GeoPoint location){ + public void setLocation(final GeoPoint location){ mPoint = location; } - + + public void setLocationSelectedListener(final OnLocationSelectedListener listener) { + mListener = listener; + } + /** * @param radius in meters * @author ricky barrette - * @param radius + * @param radius */ - public void setRadius(int radius){ + public void setRadius(final int radius){ mRadius = radius; } - - public int getZoomLevel() { -// GeoUtils.GeoUtils.distanceFrom(mPoint , mRadius) - return 0; - } - - public void setLocationSelectedListener(OnLocationSelectedListener listener) { - this.mListener = listener; - } } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java index 360fcc0..9540cb1 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/SkyHookUserOverlay.java @@ -17,12 +17,12 @@ import com.google.android.maps.MapView; public class SkyHookUserOverlay extends BaseUserOverlay{ private final SkyHook mSkyHook; - - public SkyHookUserOverlay(MapView mapView, Context context) { + + public SkyHookUserOverlay(final MapView mapView, final Context context) { super(mapView, context); mSkyHook = new SkyHook(context); } - + /** * Construct a new SkyHookUserOverlay * @param mapView @@ -30,11 +30,16 @@ public class SkyHookUserOverlay extends BaseUserOverlay{ * @param followUser * @author ricky barrette */ - public SkyHookUserOverlay(MapView mapView, Context context, boolean followUser) { + public SkyHookUserOverlay(final MapView mapView, final Context context, final boolean followUser) { super(mapView, context, followUser); mSkyHook = new SkyHook(context); } + @Override + public void onFirstFix(final boolean isFistFix) { + // unused + } + /** * Called when the location provider needs to be disabled * (non-Javadoc) @@ -56,9 +61,4 @@ public class SkyHookUserOverlay extends BaseUserOverlay{ mSkyHook.getUpdates(); } - @Override - public void onFirstFix(boolean isFistFix) { - // unused - } - } \ No newline at end of file diff --git a/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java b/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java index 468ba7f..2863b58 100644 --- a/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java +++ b/LocationLib/src/com/TwentyCodes/android/overlays/UserOverlay.java @@ -11,23 +11,28 @@ import com.TwentyCodes.android.location.AndroidGPS; import com.google.android.maps.MapView; /** - * This is the standard version of the UserOverlay. + * This is the standard version of the UserOverlay. * @author ricky barrette */ public class UserOverlay extends BaseUserOverlay{ private final AndroidGPS mAndroidGPS; - public UserOverlay(MapView mapView, Context context) { + public UserOverlay(final MapView mapView, final Context context) { super(mapView, context); mAndroidGPS = new AndroidGPS(context); } - - public UserOverlay(MapView mapView, Context context, boolean followUser) { + + public UserOverlay(final MapView mapView, final Context context, final boolean followUser) { super(mapView, context, followUser); mAndroidGPS = new AndroidGPS(context); } + @Override + public void onFirstFix(final boolean isFistFix) { + // unused + } + @Override public void onMyLocationDisabled() { mAndroidGPS.disableLocationUpdates(); @@ -38,9 +43,4 @@ public class UserOverlay extends BaseUserOverlay{ mAndroidGPS.enableLocationUpdates(this); } - @Override - public void onFirstFix(boolean isFistFix) { - // unused - } - } \ No newline at end of file