diff options
60 files changed, 936 insertions, 862 deletions
diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml index f4f737e..c95b668 100644 --- a/main/AndroidManifest.xml +++ b/main/AndroidManifest.xml @@ -56,7 +56,7 @@ <activity android:name=".CachePopup" android:label="@string/app_name" - android:theme="@style/cgeo_transparent" + android:theme="@style/popup_dark" android:windowSoftInputMode="stateHidden" android:configChanges="keyboardHidden|orientation" > </activity> @@ -211,7 +211,7 @@ <activity android:name=".cgeonavigate" android:label="@string/app_name_compass" - android:screenOrientation="nosensor" > + android:screenOrientation="portrait"> </activity> <activity android:name=".cgeogpxes" @@ -226,14 +226,14 @@ <activity android:name=".LiveMapInfo" android:label="@string/app_name" - android:theme="@style/cgeo_transparent" + android:theme="@style/popup_dark" android:configChanges="keyboardHidden|orientation" > </activity> <provider android:name=".apps.LocusDataStorageProvider" android:authorities="cgeo.geocaching.apps.locusdatastorageprovider" /> <activity android:name="WaypointPopup" android:label="@string/app_name" - android:theme="@style/cgeo_transparent" + android:theme="@style/popup_dark" android:windowSoftInputMode="stateHidden" android:configChanges="keyboardHidden|orientation" > </activity> diff --git a/main/res/layout-land/coords.xml b/main/res/layout-land/coords.xml index c25a2c0..c2dc9c5 100644 --- a/main/res/layout-land/coords.xml +++ b/main/res/layout-land/coords.xml @@ -31,8 +31,8 @@ android:layout_weight="1"> <TableRow android:id="@+id/tableRow1"> <Button android:id="@+id/ButtonLat" - style="@style/button"/> - <EditText style="@style/edittext" + style="@style/button_full"/> + <EditText style="@style/edittext_full" android:id="@+id/EditTextLatDeg" android:gravity="right" android:inputType="number" @@ -40,63 +40,63 @@ <TextView android:id="@+id/LatSeparator1" android:text="°" /> <EditText android:id="@+id/EditTextLatMin" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LatSeparator2" android:text="," /> <EditText android:id="@+id/EditTextLatSec" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LatSeparator3" android:text="," /> <EditText android:id="@+id/EditTextLatSecFrac" - style="@style/edittext" + style="@style/edittext_full" android:inputType="number" android:selectAllOnFocus="true" /> </TableRow> <TableRow android:id="@+id/tableRow2"> <Button android:id="@+id/ButtonLon" - style="@style/button"/> + style="@style/button_full"/> <EditText android:id="@+id/EditTextLonDeg" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LonSeparator1" android:text="°" /> <EditText android:id="@+id/EditTextLonMin" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LonSeparator2" android:text="," /> <EditText android:id="@+id/EditTextLonSec" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LonSeparator3" android:text="," /> <EditText android:id="@+id/EditTextLonSecFrac" - style="@style/edittext" + style="@style/edittext_full" android:inputType="number" android:selectAllOnFocus="true" /> </TableRow> </TableLayout> <EditText android:id="@+id/latitude" - style="@style/edittext" + style="@style/edittext_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/latitude" /> <EditText android:id="@+id/longitude" - style="@style/edittext" + style="@style/edittext_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:hint="@string/longitude" /> @@ -104,20 +104,20 @@ android:id="@+id/linearLayout2" android:layout_width="fill_parent" android:layout_height="wrap_content" > - <Button style="@style/button" + <Button style="@style/button_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/current" android:layout_weight="1" android:text="@string/waypoint_my_coordinates" /> - <Button style="@style/button" + <Button style="@style/button_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/cache" android:layout_weight="1" android:text="@string/waypoint_cache_coordinates" /> </LinearLayout> - <Button style="@style/button" + <Button style="@style/button_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/done" diff --git a/main/res/layout/about.xml b/main/res/layout/about.xml index 4e64226..fc29654 100644 --- a/main/res/layout/about.xml +++ b/main/res/layout/about.xml @@ -81,7 +81,7 @@ android:layout_marginTop="10dip" android:orientation="horizontal" android:gravity="center_horizontal" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/donation_more" android:layout_width="280dip" android:singleLine="false" diff --git a/main/res/layout/auth.xml b/main/res/layout/auth.xml index 51c7d03..d94b08a 100644 --- a/main/res/layout/auth.xml +++ b/main/res/layout/auth.xml @@ -64,15 +64,15 @@ android:layout_height="wrap_content" android:orientation="vertical" android:padding="7dip" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/start" android:text="@string/auth_authorize" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/pin" android:visibility="gone" android:inputType="number" android:hint="@string/auth_pin_hint" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/pin_button" android:visibility="gone" android:text="@string/auth_finish" /> diff --git a/main/res/layout/cacheview_waypoints.xml b/main/res/layout/cacheview_waypoints.xml index 9ce5b57..faf90f5 100644 --- a/main/res/layout/cacheview_waypoints.xml +++ b/main/res/layout/cacheview_waypoints.xml @@ -18,7 +18,7 @@ <Button
android:id="@+id/add_waypoint"
- style="@style/button"
+ style="@style/button_full"
android:text="@string/cache_waypoints_add"
android:layout_marginTop="9dp" />
</LinearLayout>
diff --git a/main/res/layout/coords.xml b/main/res/layout/coords.xml index d673d00..3adcb2a 100644 --- a/main/res/layout/coords.xml +++ b/main/res/layout/coords.xml @@ -31,8 +31,8 @@ android:layout_weight="1"> <TableRow android:id="@+id/tableRow1"> <Button android:id="@+id/ButtonLat" - style="@style/button"/> - <EditText style="@style/edittext" + style="@style/button_full"/> + <EditText style="@style/edittext_full" android:id="@+id/EditTextLatDeg" android:gravity="right" android:inputType="number" @@ -40,75 +40,75 @@ <TextView android:id="@+id/LatSeparator1" android:text="°" /> <EditText android:id="@+id/EditTextLatMin" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LatSeparator2" android:text="," /> <EditText android:id="@+id/EditTextLatSec" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LatSeparator3" android:text="," /> <EditText android:id="@+id/EditTextLatSecFrac" - style="@style/edittext" + style="@style/edittext_full" android:inputType="number" android:selectAllOnFocus="true" /> </TableRow> <TableRow android:id="@+id/tableRow2"> <Button android:id="@+id/ButtonLon" - style="@style/button"/> + style="@style/button_full"/> <EditText android:id="@+id/EditTextLonDeg" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LonSeparator1" android:text="°" /> <EditText android:id="@+id/EditTextLonMin" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LonSeparator2" android:text="," /> <EditText android:id="@+id/EditTextLonSec" - style="@style/edittext" + style="@style/edittext_full" android:gravity="right" android:inputType="number" android:selectAllOnFocus="true" /> <TextView android:id="@+id/LonSeparator3" android:text="," /> <EditText android:id="@+id/EditTextLonSecFrac" - style="@style/edittext" + style="@style/edittext_full" android:inputType="number" android:selectAllOnFocus="true" /> </TableRow> </TableLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/latitude" android:hint="@string/latitude" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/longitude" android:hint="@string/longitude" /> - <Button style="@style/button" + <Button style="@style/button_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/current" android:text="@string/waypoint_my_coordinates" /> - <Button style="@style/button" + <Button style="@style/button_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/cache" android:text="@string/waypoint_cache_coordinates" /> - <Button style="@style/button" + <Button style="@style/button_full" android:layout_width="fill_parent" android:layout_height="wrap_content" android:id="@+id/done" diff --git a/main/res/layout/init.xml b/main/res/layout/init.xml index bbcc33f..f5dbd2d 100644 --- a/main/res/layout/init.xml +++ b/main/res/layout/init.xml @@ -43,14 +43,14 @@ android:textColorLink="?text_color_link" android:linksClickable="true" android:text="@string/legal_note" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/username" android:hint="@string/init_username" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/password" android:hint="@string/init_password" android:password="true" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/log_me_in" android:lines="2" android:singleLine="false" @@ -62,7 +62,7 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/init_gcvote" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/passvote" android:hint="@string/init_passvote" android:password="true" /> @@ -126,7 +126,7 @@ android:textColorLink="?text_color_link" android:linksClickable="true" android:text="@string/about_twitter" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/authorize_twitter" android:text="@string/init_twitter_authorize" /> <LinearLayout @@ -157,7 +157,7 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/init_signature" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/signature" android:hint="@string/init_signature" android:singleLine="false" @@ -167,13 +167,13 @@ <LinearLayout android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/signature_template" android:layout_width="wrap_content" android:layout_weight="2" android:textSize="14dip" android:text="@string/init_signature_template_button" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/signature_help" android:layout_width="wrap_content" android:layout_weight="1" @@ -651,7 +651,7 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/init_showwaypoints" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/showwaypointsthreshold" android:singleLine="true" android:lines="1" @@ -698,11 +698,11 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/select_mapfile" android:text="@string/init_select_mapfile" android:layout_width="wrap_content" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/mapfile" android:singleLine="true" android:lines="1" @@ -715,7 +715,7 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/init_altitude" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/altitude" android:singleLine="true" android:lines="1" @@ -795,7 +795,7 @@ android:textColorLink="?text_color_link" android:linksClickable="true" android:text="@string/init_sendToCgeo_name" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/webDeviceName" android:singleLine="true" android:lines="1" @@ -815,7 +815,7 @@ android:textColorLink="?text_color_link" android:linksClickable="true" android:text="@string/init_sendToCgeo_description" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/sendToCgeo_register" android:text="@string/init_sendToCgeo_register" /> <!-- ** --> @@ -843,13 +843,13 @@ android:layout_margin="3dip" android:orientation="horizontal" android:padding="3dip" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/backup_backup" android:layout_width="0dip" android:layout_weight="1" android:text="@string/init_backup_backup" android:onClick="backup" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/backup_restore" android:layout_width="0dip" android:layout_weight="1" diff --git a/main/res/layout/point_controls.xml b/main/res/layout/point_controls.xml index 4ec685d..22d05c7 100644 --- a/main/res/layout/point_controls.xml +++ b/main/res/layout/point_controls.xml @@ -16,17 +16,17 @@ <Button android:id="@+id/buttonLatitude" - style="@style/button" + style="@style/button_full" android:hint="@string/latitude" /> <Button android:id="@+id/buttonLongitude" - style="@style/button" + style="@style/button_full" android:hint="@string/longitude" /> <Button android:id="@+id/current" - style="@style/button" + style="@style/button_full" android:text="@string/waypoint_my_coordinates" /> <RelativeLayout style="@style/separator_horizontal_layout" > @@ -40,7 +40,7 @@ <EditText android:id="@+id/bearing" - style="@style/edittext" + style="@style/edittext_full" android:hint="@string/waypoint_bearing" android:inputType="numberDecimal" /> @@ -51,7 +51,7 @@ <EditText android:id="@+id/distance" - style="@style/edittext" + style="@style/edittext_full" android:layout_width="0dip" android:layout_weight="1" android:hint="@string/waypoint_distance" diff --git a/main/res/layout/search.xml b/main/res/layout/search.xml index 82fdac6..09fb886 100644 --- a/main/res/layout/search.xml +++ b/main/res/layout/search.xml @@ -30,13 +30,13 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_coordinates" /> </RelativeLayout> - <Button style="@style/button" + <Button style="@style/button_full" android:hint="@string/latitude" android:id="@+id/buttonLatitude"/> - <Button style="@style/button" + <Button style="@style/button_full" android:hint="@string/longitude" android:id="@+id/buttonLongitude"/> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/search_coordinates" android:text="@string/search_coordinates_button" /> <!-- ** --> @@ -45,11 +45,11 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_address" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/address" android:hint="@string/search_address" android:imeOptions="actionGo" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/search_address" android:text="@string/search_address_button" /> <!-- ** --> @@ -58,13 +58,13 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_gc" /> </RelativeLayout> - <AutoCompleteTextView style="@style/edittext" + <AutoCompleteTextView style="@style/edittext_full" android:id="@+id/geocode" android:hint="@string/search_gc" android:imeOptions="actionGo" android:text="GC" android:inputType="textCapCharacters" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/display_geocode" android:text="@string/search_gc_button" /> <!-- ** --> @@ -73,11 +73,11 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_kw" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/keyword" android:hint="@string/search_kw_prefill" android:imeOptions="actionGo" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/search_keyword" android:text="@string/search_kw_button" /> <!-- ** --> @@ -86,11 +86,11 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_fbu" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/username" android:hint="@string/search_fbu_prefill" android:imeOptions="actionGo" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/search_username" android:text="@string/search_fbu_button" /> <!-- ** --> @@ -99,11 +99,11 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_hbu" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/owner" android:hint="@string/search_hbu_prefill" android:imeOptions="actionGo" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/search_owner" android:text="@string/search_hbu_button" /> <!-- ** --> @@ -112,12 +112,12 @@ <TextView style="@style/separator_horizontal_headline" android:text="@string/search_tb" /> </RelativeLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/trackable" android:hint="@string/search_tb_hint" android:imeOptions="actionGo" android:inputType="textCapCharacters" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/display_trackable" android:text="@string/search_tb_button" /> </LinearLayout> diff --git a/main/res/layout/touch.xml b/main/res/layout/touch.xml index de17c3d..06a9d25 100644 --- a/main/res/layout/touch.xml +++ b/main/res/layout/touch.xml @@ -30,20 +30,20 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/type" android:layout_width="0dip" android:layout_weight="1"/> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/date" android:layout_width="0dip" android:layout_weight="1"/> </LinearLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/tracking" android:inputType="textCapCharacters" android:hint="@string/trackable_code" /> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/log" android:hint="@string/log_new_log_text" android:singleLine="false" @@ -73,7 +73,7 @@ android:textColor="?text_color" android:text="@string/visit_tweet" /> </LinearLayout> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/post" android:text="@string/log_post" /> </LinearLayout> diff --git a/main/res/layout/visit.xml b/main/res/layout/visit.xml index 80a3a5c..8018d48 100644 --- a/main/res/layout/visit.xml +++ b/main/res/layout/visit.xml @@ -35,16 +35,16 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/type" android:layout_width="0dip" android:layout_weight="1"/> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/date" android:layout_width="0dip" android:layout_weight="1"/> </LinearLayout> - <EditText style="@style/edittext" + <EditText style="@style/edittext_full" android:id="@+id/log" android:hint="@string/log_new_log_text" android:singleLine="false" @@ -75,7 +75,7 @@ android:textColor="?text_color" android:text="@string/visit_tweet" /> </LinearLayout> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/post" android:text="@string/log_post" /> <RelativeLayout style="@style/separator_horizontal_layout" > @@ -87,12 +87,12 @@ android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/save" android:layout_width="0dip" android:layout_weight="1" android:text="@string/log_save" /> - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/clear" android:layout_width="0dip" android:layout_weight="1" @@ -122,7 +122,7 @@ android:layout_height="wrap_content" android:gravity="right" android:orientation="vertical" > - <Button style="@style/button" + <Button style="@style/button_full" android:id="@+id/changebutton" android:layout_width="wrap_content" android:layout_weight="1" diff --git a/main/res/layout/waypoint_new.xml b/main/res/layout/waypoint_new.xml index b8237ea..397f0ee 100644 --- a/main/res/layout/waypoint_new.xml +++ b/main/res/layout/waypoint_new.xml @@ -37,17 +37,17 @@ <Button android:id="@+id/buttonLatitude" - style="@style/button" + style="@style/button_full" android:hint="@string/latitude" /> <Button android:id="@+id/buttonLongitude" - style="@style/button" + style="@style/button_full" android:hint="@string/longitude" /> <EditText android:id="@+id/bearing" - style="@style/edittext" + style="@style/edittext_full" android:hint="@string/waypoint_bearing" android:inputType="numberDecimal" /> @@ -58,7 +58,7 @@ <EditText android:id="@+id/distance" - style="@style/edittext" + style="@style/edittext_full" android:hint="@string/waypoint_distance" android:inputType="numberDecimal" android:layout_width="0dip" @@ -73,7 +73,7 @@ <AutoCompleteTextView android:id="@+id/name" - style="@style/edittext" + style="@style/edittext_full" android:hint="@string/waypoint_name" /> <Spinner @@ -83,7 +83,7 @@ <EditText android:id="@+id/note" - style="@style/edittext" + style="@style/edittext_full" android:layout_height="wrap_content" android:capitalize="sentences" android:hint="@string/waypoint_note" @@ -92,7 +92,7 @@ <Button android:id="@+id/add_waypoint" - style="@style/button" + style="@style/button_full" android:text="@string/waypoint_save" /> </LinearLayout> </ScrollView> diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml index 68c7969..c345f96 100644 --- a/main/res/values-de/strings.xml +++ b/main/res/values-de/strings.xml @@ -114,6 +114,8 @@ <string name="log_new_log">Loggen</string> <string name="log_new_log_text">Log-Text</string> <string name="log_announcement">Ankündigung</string> + <string name="log_today">Heute</string> + <string name="log_yesterday">Gestern</string> <!-- translation --> <string name="translate_to_sys_lang">Übersetze in %s</string> diff --git a/main/res/values-fr/strings.xml b/main/res/values-fr/strings.xml index 2e44468..0df35e0 100644 --- a/main/res/values-fr/strings.xml +++ b/main/res/values-fr/strings.xml @@ -114,6 +114,8 @@ <string name="log_new_log">Carnet</string> <string name="log_new_log_text">Message</string> <string name="log_announcement">Annonce</string> + <string name="log_today">Aujourd\'hui</string> + <string name="log_yesterday">Hier</string> <!-- translation --> <string name="translate_to_sys_lang">Traduire en %s</string> diff --git a/main/res/values-it/strings.xml b/main/res/values-it/strings.xml index 8e92675..c03e1dc 100644 --- a/main/res/values-it/strings.xml +++ b/main/res/values-it/strings.xml @@ -114,6 +114,8 @@ <string name="log_new_log">Log</string> <string name="log_new_log_text">Testo Log</string> <string name="log_announcement">Annuncio</string> + <string name="log_today">Oggi</string> + <string name="log_yesterday">Ieri</string> <!-- translation --> <string name="translate_to_sys_lang">Traduci in %s</string> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index f0ae0c3..5696e74 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -1,4 +1,4 @@ -<?xml version="1.0" encoding="UTF-8"?> +<?xml version="1.0" encoding="UTF-8"?> <resources> <string name="app_name">c:geo</string> <string name="app_name_compass">c:geo compass</string> @@ -114,6 +114,8 @@ <string name="log_new_log">Log</string> <string name="log_new_log_text">Log Text</string> <string name="log_announcement">Announcement</string> + <string name="log_today">Today</string> + <string name="log_yesterday">Yesterday</string> <!-- translation --> <string name="translate_to_sys_lang">Translate to %s</string> @@ -1061,50 +1063,14 @@ <!-- changelog --> <string name="changelog">\n - <b>Next maintenance release</b>\n\n - <b>Bugfixing:</b>\n - · Do not crash when exporting GPX with unknown attribute\n - · Do not allow refresh of the virtual "all caches" list\n\n\n - <b>2012.06.01</b>\n\n + <b>Next release</b>\n\n <b>New Features/Functions:</b>\n - · Add/remove cache to/from Favorites\n - · Export caches as GPX file\n - · Filter for D/T in lists\n - · Allow close of popup by click on map\n - · Support of v0.3.0 mapsforge offline maps\n - · Sorting of caches by store date\n - · New popup for waypoints on live map\n - · On-demand download of static maps\n - · Upload fieldnotes to geocaching.com\n - · Optionally move stored data to sd-card\n - · Display time since last log on TB page\n - · Popup on live map will give more details for unsaved caches\n - · View all caches from different lists at once\n - · Notification to user in case of new version, disturbances and similar occasions\n + · [template]\n \n <b>Bugfixing:</b>\n - · Static maps download for waypoints now off by default\n - · Waypoints on map do no longer disappear when moving map\n - · Static map download improved\n - · Distance information in nearby search corrected\n - · Adaption to changes on geocaching.com\n - · Warning displayed for incompatible or outdated map files\n - · No change of font color in selection mode\n - · List layout optimized for most efficient screen usage\n - · Watchlist status shown correct\n - · Faster reaction when opening popup on map\n - · Hiding of found/owned caches on map corrected\n - · Show all stored caches on map (limit of 500 caches removed)\n - · Position marker now shown above cache icons\n - · Wrong cache size in cache details corrected\n - · Display coordinates embedded in a log\n - · Circles on map still shown after orientation change\n - · Fixed possible crash when starting live map\n - · Fixed possible crash while using compass\n - · Less CPU-usage for the compass\n - · A lot of translation improvements\n + · [template]\n \n - <a href="https://github.com/cgeo/c-geo-opensource/issues?milestone=6&state=closed">Detailed list of all changes</a>\n + <a href="https://github.com/cgeo/c-geo-opensource/issues?milestone=7&state=closed">Detailed list of all changes</a>\n \n <b>Known Limitations/Bugs:</b>\n · Live map:\n @@ -1113,8 +1079,7 @@ In fast mode the cache type might be wrong in rare cases\n Fast mode only detectes Tradi, Multi, Mystery, Event caches\n · Other:\n - Log images with huge size cause a long loading time\n - Recursively opening several instances of the map can cause a crash\n\n\n + Log images with huge size cause a long loading time\n\n\n <b>Old releases</b>\n · Please refer to the release notes on the <a href="http://www.cgeo.org">c:geo-website</a>.\n \n</string> diff --git a/main/res/values/styles.xml b/main/res/values/styles.xml index ad3fc8d..394e3d0 100644 --- a/main/res/values/styles.xml +++ b/main/res/values/styles.xml @@ -2,7 +2,6 @@ <resources> <!-- system definitions --> - <style name="cgeo" parent="android:Theme.NoTitleBar"></style> <style name="button" parent="@android:style/Widget.Button"> <item name="android:padding">6dip</item> @@ -13,9 +12,6 @@ <item name="android:textSize">22dip</item> <item name="android:textColor">?text_color</item> <item name="android:background">?button</item> - <item name="android:focusable">true</item> - <item name="android:clickable">true</item> - <item name="android:gravity">center</item> </style> <style name="edittext" parent="@android:style/Widget.EditText"> @@ -26,7 +22,6 @@ <item name="android:textColor">?text_color</item> <item name="android:textColorHint">?text_color_hint</item> <item name="android:background">?input</item> - <item name="android:focusable">true</item> <item name="android:gravity">top|left</item> <item name="android:capitalize">none</item> </style> @@ -92,7 +87,7 @@ </style> <!-- button: full width --> - <style name="button"> + <style name="button_full" parent="button"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_marginLeft">10dip</item> @@ -101,7 +96,7 @@ </style> <!-- button: small --> - <style name="button_small"> + <style name="button_small" parent="button"> <item name="android:layout_width">125dip</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_gravity">right</item> @@ -114,7 +109,7 @@ </style> <!-- edittext --> - <style name="edittext"> + <style name="edittext_full" parent="edittext"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_marginLeft">10dip</item> @@ -122,7 +117,7 @@ <item name="android:layout_marginBottom">5dip</item> </style> - <style name="edittext_dialog"> + <style name="edittext_dialog" parent="edittext"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_marginLeft">10dip</item> @@ -199,11 +194,10 @@ <item name="android:background">@drawable/icon_bcg</item> </style> - <style name="location_current_type"> + <style name="location_current_style"> <item name="android:layout_width">wrap_content</item> <item name="android:layout_height">wrap_content</item> <item name="android:layout_alignParentBottom">true</item> - <item name="android:layout_alignParentRight">true</item> <item name="android:layout_gravity">right</item> <item name="android:paddingLeft">3dip</item> <item name="android:paddingRight">3dip</item> @@ -215,36 +209,17 @@ <item name="android:textColor">@color/text_dark</item> </style> - <style name="location_current_accuracy"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_alignParentBottom">true</item> + <style name="location_current_type" parent="location_current_style"> + <item name="android:layout_alignParentRight">true</item> + </style> + + <style name="location_current_accuracy" parent="location_current_style"> <item name="android:layout_centerHorizontal">true</item> - <item name="android:layout_gravity">right</item> - <item name="android:paddingLeft">3dip</item> - <item name="android:paddingRight">3dip</item> - <item name="android:lines">1</item> - <item name="android:singleLine">true</item> - <item name="android:scrollHorizontally">true</item> - <item name="android:ellipsize">marquee</item> - <item name="android:textSize">12dip</item> - <item name="android:textColor">@color/text_dark</item> </style> - <style name="location_current_satellites"> - <item name="android:layout_width">wrap_content</item> - <item name="android:layout_height">wrap_content</item> - <item name="android:layout_alignParentBottom">true</item> + <style name="location_current_satellites" parent="location_current_style"> <item name="android:layout_alignParentLeft">true</item> <item name="android:layout_gravity">left</item> - <item name="android:paddingLeft">3dip</item> - <item name="android:paddingRight">3dip</item> - <item name="android:lines">1</item> - <item name="android:singleLine">true</item> - <item name="android:scrollHorizontally">true</item> - <item name="android:ellipsize">marquee</item> - <item name="android:textSize">12dip</item> - <item name="android:textColor">@color/text_dark</item> </style> <!-- separators --> diff --git a/main/res/values/themes.xml b/main/res/values/themes.xml index 0c53d29..5c2c861 100644 --- a/main/res/values/themes.xml +++ b/main/res/values/themes.xml @@ -1,128 +1,124 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="cgeo_main" parent="android:Theme.Wallpaper.NoTitleBar"> - <!-- system elements --> - <item name="android:windowNoTitle">true</item> - <item name="android:windowContentOverlay">@null</item> - </style> - - <style name="cgeo" parent="android:Theme.NoTitleBar"> - <!-- system elements --> - <item name="android:buttonStyle">@style/button</item> - <item name="android:editTextStyle">@style/edittext</item> - <item name="android:windowContentOverlay">@null</item> - </style> - - <style name="cgeo_transparent" parent="android:Theme.Dialog"> - <!-- system elements --> - <item name="android:buttonStyle">@style/button</item> - <item name="android:editTextStyle">@style/edittext</item> - <item name="android:windowNoTitle">true</item> - <item name="android:windowIsTranslucent">true</item> - </style> - - <style name="dark" parent="cgeo"> - <!-- system values --> - - <!-- own values: colors --> - <item name="just_color">@color/just_black</item> - <item name="text_color">@color/text_dark</item> - <item name="text_color_headline">@color/text_headline_dark</item> - <item name="text_color_grey">@color/text_grey_dark</item> - <item name="text_color_hint">@color/text_hint_dark</item> - <item name="text_color_link">@color/link</item> - <item name="button_color_enabled">@color/button_enabled</item> - <item name="button_color_disabled">@color/button_disabled</item> - <item name="background_color">@color/background_dark</item> - <item name="background_color_notice">@color/background_dark_notice</item> - <item name="background_color_transparent">@color/background_dark_transparent</item> - <item name="separator_color">@color/separator_dark</item> - - <!-- own values: drawables --> - <item name="button">@drawable/action_button_dark</item> - <item name="input">@drawable/input_bcg_dark</item> - <item name="inventory">@drawable/inventory_background_dark</item> - <item name="favourite">@drawable/favourite_background_dark</item> - <item name="favourite_r">@drawable/favourite_background_red_dark</item> - <item name="favourite_o">@drawable/favourite_background_orange_dark</item> - <item name="favourite_g">@drawable/favourite_background_green_dark</item> - <item name="close">@drawable/map_close_dark</item> + + <style name="cgeo_main" parent="android:style/Theme.Wallpaper.NoTitleBar"> + <!-- system elements --> + <item name="android:windowContentOverlay">@null</item> + </style> + + <style name="cgeo" parent="android:style/Theme.NoTitleBar"> + <!-- system elements --> + <item name="android:buttonStyle">@style/button</item> + <item name="android:editTextStyle">@style/edittext</item> + <item name="android:windowContentOverlay">@null</item> + + <!-- own values: colors --> + <item name="just_color">@color/just_black</item> + <item name="text_color_link">@color/link</item> + <item name="button_color_enabled">@color/button_enabled</item> + <item name="button_color_disabled">@color/button_disabled</item> + </style> + + <style name="dark" parent="cgeo"> + <!-- system values --> + + <!-- own values: colors --> + <item name="text_color">@color/text_dark</item> + <item name="text_color_headline">@color/text_headline_dark</item> + <item name="text_color_grey">@color/text_grey_dark</item> + <item name="text_color_hint">@color/text_hint_dark</item> + <item name="background_color">@color/background_dark</item> + <item name="background_color_notice">@color/background_dark_notice</item> + <item name="background_color_transparent">@color/background_dark_transparent</item> + <item name="separator_color">@color/separator_dark</item> + + <!-- own values: drawables --> + <item name="button">@drawable/action_button_dark</item> + <item name="input">@drawable/input_bcg_dark</item> + <item name="inventory">@drawable/inventory_background_dark</item> + <item name="favourite">@drawable/favourite_background_dark</item> + <item name="favourite_r">@drawable/favourite_background_red_dark</item> + <item name="favourite_o">@drawable/favourite_background_orange_dark</item> + <item name="favourite_g">@drawable/favourite_background_green_dark</item> + <item name="close">@drawable/map_close_dark</item> <item name="log_img_icon">@drawable/log_img_dark</item> <item name="actionbar_compass">@drawable/actionbar_compass_dark</item> - <item name="progressSpinnerLarge">@android:style/Widget.ProgressBar.Large</item> - <!-- own values: other --> - <item name="compass">0</item> - </style> - - <style name="light" parent="cgeo"> - <!-- system values --> - - <!-- own values: colors --> - <item name="just_color">@color/just_black</item> - <item name="text_color">@color/text_light</item> - <item name="text_color_headline">@color/text_headline_light</item> - <item name="text_color_grey">@color/text_grey_light</item> - <item name="text_color_hint">@color/text_hint_light</item> - <item name="text_color_link">@color/link</item> - <item name="button_color_enabled">@color/button_enabled</item> - <item name="button_color_disabled">@color/button_disabled</item> - <item name="background_color">@color/background_light</item> - <item name="background_color_notice">@color/background_light_notice</item> - <item name="background_color_transparent">@color/background_light_transparent</item> - <item name="separator_color">@color/separator_light</item> - - <!-- own values: drawables --> - <item name="button">@drawable/action_button_light</item> - <item name="input">@drawable/input_bcg_light</item> - <item name="inventory">@drawable/inventory_background_light</item> - <item name="favourite">@drawable/favourite_background_light</item> - <item name="favourite_r">@drawable/favourite_background_red_light</item> - <item name="favourite_o">@drawable/favourite_background_orange_light</item> - <item name="favourite_g">@drawable/favourite_background_green_light</item> - <item name="close">@drawable/map_close_light</item> + <!-- own values: other --> + <item name="compass">0</item> + </style> + + <style name="light" parent="cgeo"> + <!-- system values --> + + <!-- own values: colors --> + <item name="text_color">@color/text_light</item> + <item name="text_color_headline">@color/text_headline_light</item> + <item name="text_color_grey">@color/text_grey_light</item> + <item name="text_color_hint">@color/text_hint_light</item> + <item name="background_color">@color/background_light</item> + <item name="background_color_notice">@color/background_light_notice</item> + <item name="background_color_transparent">@color/background_light_transparent</item> + <item name="separator_color">@color/separator_light</item> + + <!-- own values: drawables --> + <item name="button">@drawable/action_button_light</item> + <item name="input">@drawable/input_bcg_light</item> + <item name="inventory">@drawable/inventory_background_light</item> + <item name="favourite">@drawable/favourite_background_light</item> + <item name="favourite_r">@drawable/favourite_background_red_light</item> + <item name="favourite_o">@drawable/favourite_background_orange_light</item> + <item name="favourite_g">@drawable/favourite_background_green_light</item> + <item name="close">@drawable/map_close_light</item> <item name="log_img_icon">@drawable/log_img_light</item> <item name="actionbar_compass">@drawable/actionbar_compass_light</item> - <item name="progressSpinnerLarge">@android:style/Widget.ProgressBar.Large.Inverse</item> - + <!-- own values: other --> - <item name="compass">1</item> - </style> - - <style name="transparent" parent="cgeo_transparent"> - <!-- system values --> - - <!-- own values: colors --> - <item name="just_color">@color/just_black</item> - <item name="text_color">@color/text_dark</item> - <item name="text_color_headline">@color/text_headline_dark</item> - <item name="text_color_grey">@color/text_grey_dark</item> - <item name="text_color_hint">@color/text_hint_dark</item> - <item name="text_color_link">@color/link</item> - <item name="button_color_enabled">@color/button_enabled</item> - <item name="button_color_disabled">@color/button_disabled</item> - <item name="background_color">@color/background_dark</item> - <item name="background_color_notice">@color/background_dark_notice</item> - <item name="background_color_transparent">@color/background_dark_transparent</item> - <item name="separator_color">@color/separator_dark</item> - - <!-- own values: drawables --> - <item name="button">@drawable/action_button_dark</item> - <item name="input">@drawable/input_bcg_dark</item> - <item name="inventory">@drawable/inventory_background_dark</item> - <item name="favourite">@drawable/favourite_background_dark</item> - <item name="favourite_r">@drawable/favourite_background_red_dark</item> - <item name="favourite_o">@drawable/favourite_background_orange_dark</item> - <item name="favourite_g">@drawable/favourite_background_green_dark</item> - <item name="close">@drawable/map_close_dark</item> + <item name="compass">1</item> + </style> + + <style name="cgeo_popup" parent="android:style/Theme.Dialog"> + <!-- system elements --> + <item name="android:buttonStyle">@style/button</item> + <item name="android:editTextStyle">@style/edittext</item> + <item name="android:windowNoTitle">true</item> + </style> + + <!-- TODO: Popup probably doesn't need all these fields set. Should delete unnecessary ones. --> + <style name="popup_dark" parent="cgeo_popup"> + <!-- system values --> + + <!-- own values: colors --> + <item name="just_color">@color/just_black</item> + <item name="text_color">@color/text_dark</item> + <item name="text_color_headline">@color/text_headline_dark</item> + <item name="text_color_grey">@color/text_grey_dark</item> + <item name="text_color_hint">@color/text_hint_dark</item> + <item name="text_color_link">@color/link</item> + <item name="button_color_enabled">@color/button_enabled</item> + <item name="button_color_disabled">@color/button_disabled</item> + <item name="background_color">@color/background_dark</item> + <item name="background_color_notice">@color/background_dark_notice</item> + <item name="background_color_transparent">@color/background_dark_transparent</item> + <item name="separator_color">@color/separator_dark</item> + + <!-- own values: drawables --> + <item name="button">@drawable/action_button_dark</item> + <item name="input">@drawable/input_bcg_dark</item> + <item name="inventory">@drawable/inventory_background_dark</item> + <item name="favourite">@drawable/favourite_background_dark</item> + <item name="favourite_r">@drawable/favourite_background_red_dark</item> + <item name="favourite_o">@drawable/favourite_background_orange_dark</item> + <item name="favourite_g">@drawable/favourite_background_green_dark</item> + <item name="close">@drawable/map_close_dark</item> <item name="log_img_icon">@drawable/log_img_dark</item> <item name="actionbar_compass">@drawable/actionbar_compass_dark</item> - <item name="progressSpinnerLarge">@android:style/Widget.ProgressBar.Large</item> - + <!-- own values: other --> - <item name="compass">0</item> - </style> -</resources> + <item name="compass">0</item> + </style> + +</resources>
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index 588ba2a..bf81d5c 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -142,7 +142,6 @@ public abstract class AbstractPopupActivity extends AbstractActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // set layout - setTheme(R.style.transparent); setContentView(layout); setTitle(res.getString(R.string.detail)); diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index f5e2f52..bf80e5a 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -46,7 +46,6 @@ import android.content.Intent; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; import android.graphics.Bitmap; -import android.graphics.BitmapFactory; import android.graphics.Typeface; import android.graphics.drawable.BitmapDrawable; import android.graphics.drawable.Drawable; @@ -146,6 +145,7 @@ public class CacheDetailActivity extends AbstractActivity { if (geo.getAltitude() != 0.0) { final double diff = cache.getElevation() - geo.getAltitude(); dist.append(diff >= 0 ? " ↗" : " ↘"); + // TODO: move code related to different units (from the whole project) into utils code if (Settings.isUseMetricUnits()) { dist.append(Math.abs((int) diff)); dist.append(" m"); @@ -1830,7 +1830,7 @@ public class CacheDetailActivity extends AbstractActivity { } private Bitmap decode(final cgCache cache) { - return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(cache.getGeocode(), "preview", false).getPath()); + return StaticMapsProvider.getPreviewMap(cache.getGeocode()); } @Override diff --git a/main/src/cgeo/geocaching/DirectionProvider.java b/main/src/cgeo/geocaching/DirectionProvider.java index 2f54b41..14fd283 100644 --- a/main/src/cgeo/geocaching/DirectionProvider.java +++ b/main/src/cgeo/geocaching/DirectionProvider.java @@ -14,6 +14,12 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve private final SensorManager sensorManager; + // Previous values signalled to observers to avoid resending the same value when the + // device doesn't change orientation. The orientation is usually given with a 1 degree + // precision by Android, so it is not uncommon to obtain exactly the same value several + // times. + private float previous = -1; + public DirectionProvider(final Context context) { sensorManager = (SensorManager) context.getSystemService(Context.SENSOR_SERVICE); @@ -46,7 +52,11 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve @Override public void onSensorChanged(final SensorEvent event) { - notifyObservers(event.values[0]); + final float direction = event.values[0]; + if (direction != previous) { + notifyObservers(direction); + previous = direction; + } } /** @@ -57,18 +67,7 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve * @return the adjusted direction in degrees, in the [0, 360[ range */ public static float getDirectionNow(final Activity activity, final float direction) { - return Compatibility.getDirectionNow(direction, activity) % 360; - } - - /** - * Return the angle to turn of to go from an angle to the other - * - * @param from the origin angle in degrees, in the [0, 360[ range - * @param to the target angle in degreees, in the [0, 360[ range - * @return a value in degrees, in the [-180, 180[ range - */ - public static double difference(final double from, final double to) { - return (to - from + 360 + 180) % 360 - 180; + return Compatibility.getDirectionNow(direction, activity); } } diff --git a/main/src/cgeo/geocaching/LiveMapInfo.java b/main/src/cgeo/geocaching/LiveMapInfo.java index 822fbf6..2fee940 100644 --- a/main/src/cgeo/geocaching/LiveMapInfo.java +++ b/main/src/cgeo/geocaching/LiveMapInfo.java @@ -13,7 +13,6 @@ public class LiveMapInfo extends AbstractActivity { public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - setTheme(R.style.transparent); setContentView(R.layout.livemapinfo); final int showCount = Settings.getLiveMapHintShowCount(); diff --git a/main/src/cgeo/geocaching/LogEntry.java b/main/src/cgeo/geocaching/LogEntry.java index 31a9703..e03dc66 100644 --- a/main/src/cgeo/geocaching/LogEntry.java +++ b/main/src/cgeo/geocaching/LogEntry.java @@ -1,6 +1,7 @@ package cgeo.geocaching; import cgeo.geocaching.enumerations.LogType; +import cgeo.geocaching.utils.DateUtils; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -94,15 +95,6 @@ public final class LogEntry { } public int daysSinceLog() { - final Calendar logDate = Calendar.getInstance(); - logDate.setTimeInMillis(date); - logDate.set(Calendar.SECOND, 0); - logDate.set(Calendar.MINUTE, 0); - logDate.set(Calendar.HOUR, 0); - final Calendar today = Calendar.getInstance(); - today.set(Calendar.SECOND, 0); - today.set(Calendar.MINUTE, 0); - today.set(Calendar.HOUR, 0); - return (int) Math.round((today.getTimeInMillis() - logDate.getTimeInMillis()) / 86400000d); + return DateUtils.daysSince(date); } } diff --git a/main/src/cgeo/geocaching/LogTrackableActivity.java b/main/src/cgeo/geocaching/LogTrackableActivity.java index 2a0d503..578bd62 100644 --- a/main/src/cgeo/geocaching/LogTrackableActivity.java +++ b/main/src/cgeo/geocaching/LogTrackableActivity.java @@ -247,8 +247,8 @@ public class LogTrackableActivity extends AbstractActivity implements DateDialog }); final Button dateButton = (Button) findViewById(R.id.date); - dateButton.setText(Formatter.formatShortDate(date.getTime().getTime())); dateButton.setOnClickListener(new DateListener()); + setDate(date); if (tweetBox == null) { tweetBox = (LinearLayout) findViewById(R.id.tweet_box); @@ -281,7 +281,7 @@ public class LogTrackableActivity extends AbstractActivity implements DateDialog date = dateIn; final Button dateButton = (Button) findViewById(R.id.date); - dateButton.setText(Formatter.formatShortDate(date.getTime().getTime())); + dateButton.setText(Formatter.formatShortDateVerbally(date.getTime().getTime())); } public void setType(LogType type) { diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java index a95f4d2..7ddc4e0 100644 --- a/main/src/cgeo/geocaching/StaticMapsActivity.java +++ b/main/src/cgeo/geocaching/StaticMapsActivity.java @@ -135,42 +135,28 @@ public class StaticMapsActivity extends AbstractActivity { factory = new BitmapFactory(); } - for (int level = 1; level <= 5; level++) { - try { - if (waypoint_id != null) { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_" + level, false).getPath()); - if (image != null) { - maps.add(image); - } - } else { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath()); - if (image != null) { - maps.add(image); - } - } - } catch (Exception e) { - Log.e("StaticMapsActivity.LoadMapsThread.run.1: " + e.toString()); - } - } - - if (maps.isEmpty()) { + // try downloading 2 times + for (int trials = 0; trials < 2; trials++) { for (int level = 1; level <= 5; level++) { try { if (waypoint_id != null) { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "wp" + waypoint_id + "_" + level, false).getPath()); + final Bitmap image = StaticMapsProvider.getWaypointMap(geocode, waypoint_id, level); if (image != null) { maps.add(image); } } else { - final Bitmap image = BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, "" + level, false).getPath()); + final Bitmap image = StaticMapsProvider.getCacheMap(geocode, level); if (image != null) { maps.add(image); } } } catch (Exception e) { - Log.e("StaticMapsActivity.LoadMapsThread.run.2: " + e.toString()); + Log.e("StaticMapsActivity.LoadMapsThread.run: " + e.toString()); } } + if (!maps.isEmpty()) { + break; + } } loadMapsHandler.sendMessage(Message.obtain()); @@ -201,13 +187,13 @@ public class StaticMapsActivity extends AbstractActivity { if (waypoint_id == null) { showToast(res.getString(R.string.info_storing_static_maps)); StaticMapsProvider.storeCacheStaticMap(cache, this, true); - return StaticMapsProvider.doesExistStaticMapForCache(geocode); + return StaticMapsProvider.hasStaticMapForCache(geocode); } final cgWaypoint waypoint = cache.getWaypointById(waypoint_id); if (waypoint != null) { showToast(res.getString(R.string.info_storing_static_maps)); StaticMapsProvider.storeWaypointStaticMap(cache, this, waypoint, true); - return StaticMapsProvider.doesExistStaticMapForWaypoint(geocode, waypoint_id); + return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint_id); } showToast(res.getString(R.string.err_detail_not_load_map_static)); return false; diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java index 030efeb..6de1291 100644 --- a/main/src/cgeo/geocaching/StaticMapsProvider.java +++ b/main/src/cgeo/geocaching/StaticMapsProvider.java @@ -8,11 +8,14 @@ import cgeo.geocaching.network.Parameters; import cgeo.geocaching.utils.Log; import ch.boye.httpclientandroidlib.HttpResponse; + import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; import android.app.Activity; import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; import android.util.DisplayMetrics; import android.view.Display; import android.view.WindowManager; @@ -21,6 +24,7 @@ import java.io.File; import java.util.concurrent.TimeUnit; public class StaticMapsProvider { + private static final String PREFIX_PREVIEW = "preview"; private static final String GOOGLE_STATICMAP_URL = "http://maps.google.com/maps/api/staticmap"; private static final String SATELLITE = "satellite"; private static final String ROADMAP = "roadmap"; @@ -32,7 +36,7 @@ public class StaticMapsProvider { /** ThreadPool restricting this to 1 Thread. **/ private static final BlockingThreadPool pool = new BlockingThreadPool(1, Thread.MIN_PRIORITY); - public static File getMapFile(final String geocode, String prefix, final boolean createDirs) { + private static File getMapFile(final String geocode, String prefix, final boolean createDirs) { return LocalStorage.getStorageFile(geocode, MAP_FILENAME_PREFIX + prefix, false, createDirs); } @@ -48,7 +52,7 @@ public class StaticMapsProvider { final Parameters params = new Parameters( "center", latlonMap, "zoom", String.valueOf(zoom), - "size", width + "x" + height, + "size", String.valueOf(width) + 'x' + String.valueOf(height), "maptype", mapType, "markers", "icon:" + markerUrl + '|' + shadow + latlonMap, "sensor", "false"); @@ -80,7 +84,7 @@ public class StaticMapsProvider { downloadMaps(cache, display); } - public static void downloadMaps(cgCache cache, Display display) { + private static void downloadMaps(cgCache cache, Display display) { if ((!Settings.isStoreOfflineMaps() && !Settings.isStoreOfflineWpMaps()) || StringUtils.isBlank(cache.getGeocode())) { return; } @@ -114,7 +118,7 @@ public class StaticMapsProvider { String wpLatlonMap = waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA); String wpMarkerUrl = getWpMarkerUrl(waypoint); // download map images in separate background thread for higher performance - downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + "_", wpLatlonMap, edge, null, waitForResult); + downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + '_', wpLatlonMap, edge, null, waitForResult); } public static void storeCacheStaticMap(cgCache cache, Activity activity, final boolean waitForResult) { @@ -130,7 +134,7 @@ public class StaticMapsProvider { continue; } final String wpMarkerUrl = getWpMarkerUrl(waypoint); - waypoints.put("markers", "icon:" + wpMarkerUrl + "|" + waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA)); + waypoints.put("markers", "icon:" + wpMarkerUrl + '|' + waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA)); } // download map images in separate background thread for higher performance final String cacheMarkerUrl = getCacheMarkerUrl(cache); @@ -145,7 +149,7 @@ public class StaticMapsProvider { display.getMetrics(metrics); final int width = metrics.widthPixels; final int height = (int) (110 * metrics.density); - downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, "preview", "shadow:false|", latlonMap, width, height, null); + downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, PREFIX_PREVIEW, "shadow:false|", latlonMap, width, height, null); } private static int guessMaxDisplaySide(Display display) { @@ -182,14 +186,15 @@ public class StaticMapsProvider { } private static String getCacheMarkerUrl(final cgCache cache) { - String type = cache.getType().id; + StringBuilder url = new StringBuilder(MARKERS_URL); + url.append("marker_cache_").append(cache.getType().id); if (cache.isFound()) { - type += "_found"; + url.append("_found"); } else if (cache.isDisabled()) { - type += "_disabled"; + url.append("_disabled"); } - - return MARKERS_URL + "marker_cache_" + type + ".png"; + url.append(".png"); + return url.toString(); } private static String getWpMarkerUrl(final cgWaypoint waypoint) { @@ -198,11 +203,12 @@ public class StaticMapsProvider { } public static void removeWpStaticMaps(int wp_id, final String geocode) { + if (wp_id <= 0) { + return; + } for (int level = 1; level <= 5; level++) { try { - if (wp_id > 0) { - StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + "_" + level, false).delete(); - } + StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + wp_id + '_' + level, false).delete(); } catch (Exception e) { Log.e("StaticMapsProvider.removeWpStaticMaps: " + e.toString()); } @@ -215,9 +221,9 @@ public class StaticMapsProvider { * @param geocode * @return <code>true</code> if at least one mapfile exists; <code>false</code> otherwise */ - public static boolean doesExistStaticMapForCache(String geocode) { + public static boolean hasStaticMapForCache(String geocode) { for (int level = 1; level <= 5; level++) { - File mapFile = StaticMapsProvider.getMapFile(geocode, "" + level, false); + File mapFile = StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false); if (mapFile != null && mapFile.exists()) { return true; } @@ -232,7 +238,7 @@ public class StaticMapsProvider { * @param waypointId * @return <code>true</code> if at least one mapfile exists; <code>false</code> otherwise */ - public static boolean doesExistStaticMapForWaypoint(String geocode, int waypointId) { + public static boolean hasStaticMapForWaypoint(String geocode, int waypointId) { for (int level = 1; level <= 5; level++) { File mapFile = StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypointId + "_" + level, false); if (mapFile != null && mapFile.exists()) { @@ -241,4 +247,16 @@ public class StaticMapsProvider { } return false; } + + public static Bitmap getPreviewMap(final String geocode) { + return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, PREFIX_PREVIEW, false).getPath()); + } + + public static Bitmap getWaypointMap(final String geocode, int waypoint_id, int level) { + return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, WAYPOINT_PREFIX + waypoint_id + "_" + level, false).getPath()); + } + + public static Bitmap getCacheMap(final String geocode, int level) { + return BitmapFactory.decodeFile(StaticMapsProvider.getMapFile(geocode, String.valueOf(level), false).getPath()); + } } diff --git a/main/src/cgeo/geocaching/VisitCacheActivity.java b/main/src/cgeo/geocaching/VisitCacheActivity.java index c211157..e5410e7 100644 --- a/main/src/cgeo/geocaching/VisitCacheActivity.java +++ b/main/src/cgeo/geocaching/VisitCacheActivity.java @@ -510,7 +510,7 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D }); final Button dateButton = (Button) findViewById(R.id.date); - dateButton.setText(Formatter.formatShortDate(date.getTime().getTime())); + setDate(date); dateButton.setOnClickListener(new DateListener()); final EditText logView = (EditText) findViewById(R.id.log); @@ -548,7 +548,7 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D date = dateIn; final Button dateButton = (Button) findViewById(R.id.date); - dateButton.setText(Formatter.formatShortDate(date.getTime().getTime())); + dateButton.setText(Formatter.formatShortDateVerbally(date.getTime().getTime())); } public void setType(LogType type) { @@ -602,6 +602,7 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D @Override public void onClick(View arg0) { + //TODO: unify this method and the code in init() app.clearLogOffline(geocode); if (alreadyFound) { @@ -615,8 +616,8 @@ public class VisitCacheActivity extends AbstractActivity implements DateDialog.D setType(typeSelected); final Button dateButton = (Button) findViewById(R.id.date); - dateButton.setText(Formatter.formatShortDate(date.getTime().getTime())); dateButton.setOnClickListener(new DateListener()); + setDate(date); final EditText logView = (EditText) findViewById(R.id.log); logView.setText(""); diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java index 5817763..ca8c7db 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractPointNavigationApp.java @@ -2,14 +2,14 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; -import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.apps.AbstractApp; import android.app.Activity; /** * navigation app for simple point navigation (no differentiation between cache/waypoint/point) */ -abstract class AbstractPointNavigationApp extends AbstractNavigationApp { +abstract class AbstractPointNavigationApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp { protected AbstractPointNavigationApp(String name, String intent) { super(name, intent); @@ -20,46 +20,22 @@ abstract class AbstractPointNavigationApp extends AbstractNavigationApp { } @Override - public final boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, Geopoint coords) { - if (cache == null && waypoint == null && coords == null) { - return false; - } - - try { - if (isInstalled()) { - final Geopoint point = getCoordinates(cache, waypoint, coords); - if (point != null) { - navigate(activity, point); - return true; - } - } - } catch (Exception e) { - // nothing - } - - return false; + public void navigate(Activity activity, cgCache cache) { + navigate(activity, cache.getCoords()); } - protected abstract void navigate(Activity activity, Geopoint point); - - /** - * Return the first of the cache coordinates, the waypoint coordinates or the extra coordinates. <code>null</code> - * entities are skipped. - * - * @param cache a cache - * @param waypoint a waypoint - * @param coords extra coordinates - * @return the first non-null coordinates, or null if none are set - */ - private static Geopoint getCoordinates(final cgCache cache, final cgWaypoint waypoint, final Geopoint coords) { - if (cache != null && cache.getCoords() != null) { - return cache.getCoords(); - } + @Override + public void navigate(Activity activity, cgWaypoint waypoint) { + navigate(activity, waypoint.getCoords()); + } - if (waypoint != null && waypoint.getCoords() != null) { - return waypoint.getCoords(); - } + @Override + public boolean isEnabled(cgCache cache) { + return cache.getCoords() != null; + } - return coords; + @Override + public boolean isEnabled(cgWaypoint waypoint) { + return waypoint.getCoords() != null; } -}
\ No newline at end of file +} diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java index ff61404..213e806 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/AbstractStaticMapsApp.java @@ -8,13 +8,13 @@ import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; -import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.apps.AbstractApp; import org.apache.commons.lang3.StringUtils; import android.app.Activity; -abstract class AbstractStaticMapsApp extends AbstractNavigationApp { +abstract class AbstractStaticMapsApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp { public AbstractStaticMapsApp(String name) { super(name, null); } @@ -25,27 +25,23 @@ abstract class AbstractStaticMapsApp extends AbstractNavigationApp { } protected static boolean hasStaticMap(cgCache cache) { - if (cache != null) { - String geocode = cache.getGeocode(); - if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) { - return StaticMapsProvider.doesExistStaticMapForCache(geocode); - } + String geocode = cache.getGeocode(); + if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) { + return StaticMapsProvider.hasStaticMapForCache(geocode); } return false; } protected static boolean hasStaticMap(cgWaypoint waypoint) { - if (waypoint != null) { - String geocode = waypoint.getGeocode(); - int id = waypoint.getId(); - if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) { - return StaticMapsProvider.doesExistStaticMapForWaypoint(geocode, id); - } + String geocode = waypoint.getGeocode(); + int id = waypoint.getId(); + if (StringUtils.isNotEmpty(geocode) && cgeoapplication.getInstance().isOffline(geocode, null)) { + return StaticMapsProvider.hasStaticMapForWaypoint(geocode, id); } return false; } - protected static boolean invoke(final Activity activity, final cgCache cache, final cgWaypoint waypoint, final boolean download) { + protected static boolean invokeStaticMaps(final Activity activity, final cgCache cache, final cgWaypoint waypoint, final boolean download) { final ILogable logable = cache != null && cache.getListId() != 0 ? cache : waypoint; final String geocode = logable.getGeocode().toUpperCase(); if (geocode == null) { @@ -56,11 +52,4 @@ abstract class AbstractStaticMapsApp extends AbstractNavigationApp { StaticMapsActivity.startActivity(activity, geocode, download, waypoint); return true; } - - - @Override - public boolean isEnabled(Geopoint geopoint) { - return false; - } - } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java new file mode 100644 index 0000000..e47150f --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cache/navi/CacheNavigationApp.java @@ -0,0 +1,17 @@ +package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.cgCache; +import cgeo.geocaching.apps.App; + +import android.app.Activity; + +/** + * interface for navigation to a cache + * + */ +public interface CacheNavigationApp extends App { + void navigate(final Activity activity, final cgCache cache); + + @Override + boolean isEnabled(final cgCache cache); +}
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java b/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java index 1576617..da3d5f9 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/CompassApp.java @@ -4,11 +4,12 @@ import cgeo.geocaching.R; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; import cgeo.geocaching.cgeonavigate; +import cgeo.geocaching.apps.AbstractApp; import cgeo.geocaching.geopoint.Geopoint; import android.app.Activity; -class CompassApp extends AbstractNavigationApp { +class CompassApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp { CompassApp() { super(getString(R.string.compass_title), null); @@ -20,22 +21,28 @@ class CompassApp extends AbstractNavigationApp { } @Override - public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) { - - if (cache != null && cache.getGeocode() != null) { - cgeonavigate.startActivity(activity, cache.getGeocode(), cache.getName(), cache.getCoords(), null); - return true; - } - if (waypoint != null && waypoint.getCoords() != null) { - cgeonavigate.startActivity(activity, waypoint.getPrefix() + "/" + waypoint.getLookup(), waypoint.getName(), waypoint.getCoords(), null); - return true; - } - if (coords != null) { - cgeonavigate.startActivity(activity, getString(R.string.navigation_direct_navigation), getString(R.string.navigation_target), coords, null); - return true; - } - // search is not handled here - return false; + public void navigate(Activity activity, Geopoint coords) { + cgeonavigate.startActivity(activity, getString(R.string.navigation_direct_navigation), getString(R.string.navigation_target), coords, null); + } + + @Override + public void navigate(Activity activity, cgWaypoint waypoint) { + cgeonavigate.startActivity(activity, waypoint.getPrefix() + "/" + waypoint.getLookup(), waypoint.getName(), waypoint.getCoords(), null); + } + + @Override + public boolean isEnabled(cgWaypoint waypoint) { + return waypoint.getCoords() != null; + } + + @Override + public void navigate(Activity activity, cgCache cache) { + cgeonavigate.startActivity(activity, cache.getGeocode(), cache.getName(), cache.getCoords(), null); + } + + @Override + public boolean isEnabled(cgCache cache) { + return cache.getGeocode() != null; } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java index 1625ef7..f093937 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/DownloadStaticMapsApp.java @@ -3,7 +3,6 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.R; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; -import cgeo.geocaching.geopoint.Geopoint; import android.app.Activity; @@ -14,23 +13,22 @@ class DownloadStaticMapsApp extends AbstractStaticMapsApp { } @Override - public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) { - return invoke(activity, cache, waypoint, true); - } - - @Override public boolean isEnabled(cgCache cache) { - if (cache == null) { - return false; - } return !hasStaticMap(cache); } @Override public boolean isEnabled(cgWaypoint waypoint) { - if (waypoint == null) { - return false; - } return !hasStaticMap(waypoint); } + + @Override + public void navigate(Activity activity, cgCache cache) { + invokeStaticMaps(activity, cache, null, true); + } + + @Override + public void navigate(Activity activity, cgWaypoint waypoint) { + invokeStaticMaps(activity, null, waypoint, true); + } } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java new file mode 100644 index 0000000..fe4fd5d --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cache/navi/GeopointNavigationApp.java @@ -0,0 +1,13 @@ +package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.geopoint.Geopoint; + +import android.app.Activity; + +/** + * interface for navigation to a coordinate. This one cannot be enabled/disabled. + * + */ +public interface GeopointNavigationApp { + void navigate(final Activity activity, final Geopoint coords); +} diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java index 4e6e62b..eac33cc 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/GoogleMapsApp.java @@ -21,7 +21,7 @@ class GoogleMapsApp extends AbstractPointNavigationApp { } @Override - protected void navigate(Activity activity, Geopoint point) { + public void navigate(Activity activity, Geopoint point) { // INFO: q parameter works with Google Maps, but breaks cooperation with all other apps try { activity.startActivity(new Intent(Intent.ACTION_VIEW, diff --git a/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java index 31d99e9..7258e11 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/GoogleNavigationApp.java @@ -3,8 +3,6 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.IGeoData; import cgeo.geocaching.R; import cgeo.geocaching.Settings; -import cgeo.geocaching.cgCache; -import cgeo.geocaching.cgWaypoint; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.geopoint.Geopoint; @@ -14,7 +12,7 @@ import android.app.Activity; import android.content.Intent; import android.net.Uri; -class GoogleNavigationApp extends AbstractNavigationApp { +class GoogleNavigationApp extends AbstractPointNavigationApp { GoogleNavigationApp() { super(getString(R.string.cache_menu_tbt), null); @@ -25,33 +23,8 @@ class GoogleNavigationApp extends AbstractNavigationApp { return true; } - @Override - public boolean invoke(final Activity activity, final cgCache cache, final cgWaypoint waypoint, final Geopoint coords) { - if (activity == null) { - return false; - } - + private static boolean navigateToCoordinates(Activity activity, final Geopoint coords) { IGeoData geo = cgeoapplication.getInstance().currentGeo(); - boolean navigationResult = false; - if (coords != null) { - navigationResult = navigateToCoordinates(geo, activity, coords); - } - else if (waypoint != null) { - navigationResult = navigateToCoordinates(geo, activity, waypoint.getCoords()); - } - else if (cache != null) { - navigationResult = navigateToCoordinates(geo, activity, cache.getCoords()); - } - - if (!navigationResult) { - ActivityMixin.showToast(activity, getString(R.string.err_navigation_no)); - return false; - } - - return true; - } - - private static boolean navigateToCoordinates(IGeoData geo, Activity activity, final Geopoint coords) { final Geopoint coordsNow = geo == null ? null : geo.getCoords(); // Google Navigation @@ -89,4 +62,10 @@ class GoogleNavigationApp extends AbstractNavigationApp { return false; } + @Override + public void navigate(Activity activity, Geopoint coords) { + if (!navigateToCoordinates(activity, coords)) { + ActivityMixin.showToast(activity, getString(R.string.err_navigation_no)); + } + } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java b/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java index f1e03ed..8185f40 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/InternalMap.java @@ -3,37 +3,46 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.R; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; +import cgeo.geocaching.apps.AbstractApp; import cgeo.geocaching.enumerations.WaypointType; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.maps.CGeoMap; import android.app.Activity; -class InternalMap extends AbstractNavigationApp { +class InternalMap extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp { InternalMap() { super(getString(R.string.cache_menu_map), null); } @Override - public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) { - if (cache != null) { - CGeoMap.startActivityGeoCode(activity, cache.getGeocode()); - // may need some code from CGeoMap.startActivitySearch(activity, search, cache != null ? cache.getGeocode() : null, true); - } - else if (waypoint != null) { - CGeoMap.startActivityCoords(activity, waypoint.getCoords(), waypoint.getWaypointType(), waypoint.getName()); - } - else if (coords != null) { - CGeoMap.startActivityCoords(activity, coords, WaypointType.WAYPOINT, null); - } - + public boolean isInstalled() { return true; } @Override - public boolean isInstalled() { - return true; + public void navigate(Activity activity, Geopoint coords) { + CGeoMap.startActivityCoords(activity, coords, WaypointType.WAYPOINT, null); } + @Override + public void navigate(Activity activity, cgWaypoint waypoint) { + CGeoMap.startActivityCoords(activity, waypoint.getCoords(), waypoint.getWaypointType(), waypoint.getName()); + } + + @Override + public boolean isEnabled(cgWaypoint waypoint) { + return waypoint.getCoords() != null; + } + + @Override + public void navigate(Activity activity, cgCache cache) { + CGeoMap.startActivityGeoCode(activity, cache.getGeocode()); + } + + @Override + public boolean isEnabled(cgCache cache) { + return cache.getCoords() != null; + } } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java b/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java index d71a474..a20f2ce 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/LocusApp.java @@ -3,45 +3,30 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; import cgeo.geocaching.apps.AbstractLocusApp; -import cgeo.geocaching.geopoint.Geopoint; import android.app.Activity; -import java.util.ArrayList; +import java.util.Collections; -class LocusApp extends AbstractLocusApp implements NavigationApp { +class LocusApp extends AbstractLocusApp implements CacheNavigationApp, WaypointNavigationApp { + + @Override + public boolean isEnabled(cgWaypoint waypoint) { + return waypoint.getCoords() != null; + } /** * Show a single cache with waypoints or a single waypoint in Locus. * This method constructs a list of cache and waypoints only. * - * @see AbstractLocusApp#showInLocus */ @Override - public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) { - - final ArrayList<Object> points = new ArrayList<Object>(); - - // add cache if present - if (cache != null && cache.getCoords() != null) { - points.add(cache); - } - - // add waypoint if present - if (waypoint != null && waypoint.getCoords() != null) { - points.add(waypoint); - } - - return showInLocus(points, true, false, activity); - } - - @Override - public boolean isEnabled(cgWaypoint waypoint) { - return waypoint != null; + public void navigate(Activity activity, cgWaypoint waypoint) { + showInLocus(Collections.singletonList(waypoint), true, false, activity); } @Override - public boolean isEnabled(Geopoint geopoint) { - return geopoint != null; + public void navigate(Activity activity, cgCache cache) { + showInLocus(Collections.singletonList(cache), true, false, activity); } } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java index 95f6408..8219320 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java @@ -7,8 +7,8 @@ import cgeo.geocaching.cgWaypoint; import cgeo.geocaching.cgeoapplication; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.apps.AbstractAppFactory; +import cgeo.geocaching.apps.App; import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.utils.Log; import android.app.Activity; import android.app.AlertDialog; @@ -48,7 +48,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { /** The external navigon app */ NAVIGON(new NavigonApp(), 10); - NavigationAppsEnum(NavigationApp app, int id) { + NavigationAppsEnum(App app, int id) { this.app = app; this.id = id; } @@ -56,7 +56,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { /** * The app instance to use */ - public final NavigationApp app; + public final App app; /** * The id - used in c:geo settings */ @@ -119,7 +119,17 @@ public final class NavigationAppFactory extends AbstractAppFactory { for (NavigationAppsEnum navApp : getInstalledNavigationApps()) { if ((showInternalMap || !(navApp.app instanceof InternalMap)) && (showDefaultNavigation || defaultNavigationTool != navApp.id)) { - if (navApp.app.isEnabled(cache) || navApp.app.isEnabled(waypoint) || navApp.app.isEnabled(destination)) { + boolean add = false; + if (cache != null && navApp.app instanceof CacheNavigationApp && ((CacheNavigationApp) navApp.app).isEnabled(cache)) { + add = true; + } + if (waypoint != null && navApp.app instanceof WaypointNavigationApp && ((WaypointNavigationApp) navApp.app).isEnabled(waypoint)) { + add = true; + } + if (destination != null && navApp.app instanceof GeopointNavigationApp) { + add = true; + } + if (add) { items.add(navApp); } } @@ -134,7 +144,18 @@ public final class NavigationAppFactory extends AbstractAppFactory { @Override public void onClick(DialogInterface dialog, int item) { NavigationAppsEnum selectedItem = adapter.getItem(item); - selectedItem.app.invoke(activity, cache, waypoint, destination); + if (cache != null) { + CacheNavigationApp cacheApp = (CacheNavigationApp) selectedItem.app; + cacheApp.navigate(activity, cache); + } + else if (waypoint != null) { + WaypointNavigationApp waypointApp = (WaypointNavigationApp) selectedItem.app; + waypointApp.navigate(activity, waypoint); + } + else { + GeopointNavigationApp geopointApp = (GeopointNavigationApp) selectedItem.app; + geopointApp.navigate(activity, destination); + } } }); final AlertDialog alert = builder.create(); @@ -174,16 +195,22 @@ public final class NavigationAppFactory extends AbstractAppFactory { */ public static void addMenuItems(final Menu menu, final cgCache cache) { for (NavigationAppsEnum navApp : getInstalledNavigationApps()) { - if (navApp.app.isEnabled(cache)) { - menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName()); + if (navApp.app instanceof CacheNavigationApp) { + CacheNavigationApp cacheApp = (CacheNavigationApp) navApp.app; + if (cacheApp.isEnabled(cache)) { + menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName()); + } } } } public static void addMenuItems(final Menu menu, final cgWaypoint waypoint) { for (NavigationAppsEnum navApp : getInstalledNavigationApps()) { - if (navApp.app.isEnabled(waypoint)) { - menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName()); + if (navApp.app instanceof WaypointNavigationApp) { + WaypointNavigationApp waypointApp = (WaypointNavigationApp) navApp.app; + if (waypointApp.isEnabled(waypoint)) { + menu.add(0, MENU_ITEM_OFFSET + navApp.id, 0, navApp.app.getName()); + } } } } @@ -197,29 +224,37 @@ public final class NavigationAppFactory extends AbstractAppFactory { * @return */ public static boolean onMenuItemSelected(final MenuItem item, Activity activity, cgCache cache) { - return invokeApp(activity, cache, null, null, getAppFromMenuItem(item)); + navigateCache(activity, cache, getAppFromMenuItem(item)); + return true; + } + + private static void navigateCache(Activity activity, cgCache cache, App app) { + if (app instanceof CacheNavigationApp) { + CacheNavigationApp cacheApp = (CacheNavigationApp) app; + cacheApp.navigate(activity, cache); + } } public static boolean onMenuItemSelected(final MenuItem item, Activity activity, cgWaypoint waypoint) { - return invokeApp(activity, null, waypoint, null, getAppFromMenuItem(item)); + navigateWaypoint(activity, waypoint, getAppFromMenuItem(item)); + return true; } - private static boolean invokeApp(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint destination, final NavigationApp app) { - if (app == null) { - return false; + private static void navigateWaypoint(Activity activity, cgWaypoint waypoint, App app) { + if (app instanceof WaypointNavigationApp) { + WaypointNavigationApp waypointApp = (WaypointNavigationApp) app; + waypointApp.navigate(activity, waypoint); } - if (cache == null && waypoint == null && destination == null) { - return false; - } - try { - return app.invoke(activity, cache, waypoint, destination); - } catch (Exception e) { - Log.e("NavigationAppFactory.onMenuItemSelected: " + e.toString()); + } + + private static void navigateGeopoint(Activity activity, Geopoint destination, App app) { + if (app instanceof GeopointNavigationApp) { + GeopointNavigationApp geopointApp = (GeopointNavigationApp) app; + geopointApp.navigate(activity, destination); } - return false; } - private static NavigationApp getAppFromMenuItem(MenuItem item) { + private static App getAppFromMenuItem(MenuItem item) { final int id = item.getItemId(); for (NavigationAppsEnum navApp : NavigationAppsEnum.values()) { if (MENU_ITEM_OFFSET + navApp.id == id) { @@ -243,10 +278,10 @@ public final class NavigationAppFactory extends AbstractAppFactory { return; } - invokeApp(activity, cache, null, null, getDefaultNavigationApplication(defaultNavigation)); + navigateCache(activity, cache, getDefaultNavigationApplication(defaultNavigation)); } - private static NavigationApp getDefaultNavigationApplication(int defaultNavigation) { + private static App getDefaultNavigationApplication(int defaultNavigation) { if (defaultNavigation == 2) { return getNavigationAppFromSetting(Settings.getDefaultNavigationTool2()); } @@ -264,7 +299,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { ActivityMixin.showToast(activity, cgeoapplication.getInstance().getString(R.string.err_location_unknown)); return; } - invokeApp(activity, null, waypoint, null, getDefaultNavigationApplication(defaultNavigation)); + navigateWaypoint(activity, waypoint, getDefaultNavigationApplication(defaultNavigation)); } /** @@ -279,7 +314,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { return; } - invokeApp(activity, null, null, destination, getDefaultNavigationApplication(defaultNavigation)); + navigateGeopoint(activity, destination, getDefaultNavigationApplication(defaultNavigation)); } /** @@ -287,11 +322,11 @@ public final class NavigationAppFactory extends AbstractAppFactory { * * @return never <code>null</code> */ - public static NavigationApp getDefaultNavigationApplication() { + public static App getDefaultNavigationApplication() { return getNavigationAppFromSetting(Settings.getDefaultNavigationTool()); } - private static NavigationApp getNavigationAppFromSetting(final int defaultNavigationTool) { + private static App getNavigationAppFromSetting(final int defaultNavigationTool) { final List<NavigationAppsEnum> installedNavigationApps = getInstalledNavigationApps(); for (NavigationAppsEnum navigationApp : installedNavigationApps) { diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java index 69f63dc..7ea86fb 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigonApp.java @@ -16,7 +16,7 @@ class NavigonApp extends AbstractPointNavigationApp { } @Override - protected void navigate(Activity activity, Geopoint point) { + public void navigate(Activity activity, Geopoint point) { final Intent intent = new Intent(INTENT); /* diff --git a/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java index 27ec2fa..24ef81b 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/OruxMapsApp.java @@ -15,7 +15,7 @@ class OruxMapsApp extends AbstractPointNavigationApp { } @Override - protected void navigate(Activity activity, Geopoint point) { + public void navigate(Activity activity, Geopoint point) { final Intent intent = new Intent(INTENT); intent.putExtra("latitude", point.getLatitude());//latitude, wgs84 datum intent.putExtra("longitude", point.getLongitude());//longitude, wgs84 datum diff --git a/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java b/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java index 8044cc6..a481813 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/RMapsApp.java @@ -3,6 +3,7 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.R; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; +import cgeo.geocaching.apps.AbstractApp; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.GeopointFormatter.Format; @@ -11,7 +12,7 @@ import android.content.Intent; import java.util.ArrayList; -class RMapsApp extends AbstractNavigationApp { +class RMapsApp extends AbstractApp implements CacheNavigationApp, WaypointNavigationApp, GeopointNavigationApp { private static final String INTENT = "com.robert.maps.action.SHOW_POINTS"; @@ -20,29 +21,30 @@ class RMapsApp extends AbstractNavigationApp { } @Override - public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) { - try { - final ArrayList<String> locations = new ArrayList<String>(); - if (cache != null && cache.getCoords() != null) { - locations.add(cache.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA) - + ";" + cache.getGeocode() - + ";" + cache.getName()); - } else if (waypoint != null && waypoint.getCoords() != null) { - locations.add(waypoint.getCoords().format(Format.LAT_LON_DECDEGREE_COMMA) - + ";" + waypoint.getLookup() - + ";" + waypoint.getName()); - } - - if (!locations.isEmpty()) { - final Intent intent = new Intent(INTENT); - intent.putStringArrayListExtra("locations", locations); - activity.startActivity(intent); - return true; - } - } catch (Exception e) { - // nothing - } - - return false; + public void navigate(Activity activity, cgWaypoint waypoint) { + navigate(activity, waypoint.getCoords(), waypoint.getLookup(), waypoint.getName()); + } + + private static void navigate(Activity activity, Geopoint coords, String code, String name) { + final ArrayList<String> locations = new ArrayList<String>(); + locations.add(coords.format(Format.LAT_LON_DECDEGREE_COMMA) + ";" + code + ";" + name); + final Intent intent = new Intent(INTENT); + intent.putStringArrayListExtra("locations", locations); + activity.startActivity(intent); + } + + @Override + public boolean isEnabled(cgWaypoint waypoint) { + return waypoint.getCoords() != null; + } + + @Override + public void navigate(Activity activity, cgCache cache) { + navigate(activity, cache.getCoords(), cache.getGeocode(), cache.getName()); + } + + @Override + public void navigate(Activity activity, Geopoint coords) { + navigate(activity, coords, "", ""); } } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java b/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java index 3374691..b01539c 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/RadarApp.java @@ -16,7 +16,7 @@ class RadarApp extends AbstractPointNavigationApp { } @Override - protected void navigate(Activity activity, Geopoint point) { + public void navigate(Activity activity, Geopoint point) { final Intent radarIntent = new Intent(INTENT); radarIntent.putExtra("latitude", (float) point.getLatitude()); radarIntent.putExtra("longitude", (float) point.getLongitude()); diff --git a/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java b/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java index d805656..6be027f 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/StaticMapApp.java @@ -3,7 +3,6 @@ package cgeo.geocaching.apps.cache.navi; import cgeo.geocaching.R; import cgeo.geocaching.cgCache; import cgeo.geocaching.cgWaypoint; -import cgeo.geocaching.geopoint.Geopoint; import android.app.Activity; @@ -14,23 +13,22 @@ class StaticMapApp extends AbstractStaticMapsApp { } @Override - public boolean invoke(Activity activity, cgCache cache, cgWaypoint waypoint, final Geopoint coords) { - return invoke(activity, cache, waypoint, false); - } - - @Override public boolean isEnabled(cgCache cache) { - if (cache == null) { - return false; - } return hasStaticMap(cache); } @Override public boolean isEnabled(cgWaypoint waypoint) { - if (waypoint == null) { - return false; - } return hasStaticMap(waypoint); } + + @Override + public void navigate(Activity activity, cgCache cache) { + invokeStaticMaps(activity, cache, null, false); + } + + @Override + public void navigate(Activity activity, cgWaypoint waypoint) { + invokeStaticMaps(activity, null, waypoint, false); + } } diff --git a/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java b/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java index 41f958d..012b94f 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/StreetviewApp.java @@ -22,7 +22,7 @@ class StreetviewApp extends AbstractPointNavigationApp { } @Override - protected void navigate(Activity activity, Geopoint point) { + public void navigate(Activity activity, Geopoint point) { try { activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("google.streetview:cbll=" + point.getLatitude() + "," + point.getLongitude()))); diff --git a/main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java b/main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java new file mode 100644 index 0000000..7d3a706 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cache/navi/WaypointNavigationApp.java @@ -0,0 +1,15 @@ +package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.cgWaypoint; + +import android.app.Activity; + +/** + * interface for navigation to a waypoint + * + */ +public interface WaypointNavigationApp { + void navigate(final Activity activity, final cgWaypoint waypoint); + + boolean isEnabled(final cgWaypoint waypoint); +} diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java index 37f8b7d..ec9c406 100644 --- a/main/src/cgeo/geocaching/cgData.java +++ b/main/src/cgeo/geocaching/cgData.java @@ -2475,41 +2475,30 @@ public class cgData { public boolean saveLogOffline(String geocode, Date date, LogType type, String log) { if (StringUtils.isBlank(geocode)) { + Log.e("cgData.saveLogOffline: cannot log a blank geocode"); return false; } if (LogType.UNKNOWN == type && StringUtils.isBlank(log)) { + Log.e("cgData.saveLogOffline: cannot log an unknown log type and no message"); return false; } init(); - boolean status = false; - ContentValues values = new ContentValues(); + final ContentValues values = new ContentValues(); values.put("geocode", geocode); values.put("updated", System.currentTimeMillis()); values.put("type", type.id); values.put("log", log); values.put("date", date.getTime()); - try { - if (hasLogOffline(geocode)) { - final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode }); - - if (rows > 0) { - status = true; - } - } else { - final long id = database.insert(dbTableLogsOffline, null, values); - - if (id > 0) { - status = true; - } - } - } catch (Exception e) { - Log.e("cgData.saveLogOffline: " + e.toString()); + if (hasLogOffline(geocode)) { + final int rows = database.update(dbTableLogsOffline, values, "geocode = ?", new String[] { geocode }); + return rows > 0; + } else { + final long id = database.insert(dbTableLogsOffline, null, values); + return id != -1; } - - return status; } public LogEntry loadLogOffline(String geocode) { diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java index 08de15e..4951f9f 100644 --- a/main/src/cgeo/geocaching/cgeocaches.java +++ b/main/src/cgeo/geocaching/cgeocaches.java @@ -24,27 +24,16 @@ import cgeo.geocaching.network.Cookies; import cgeo.geocaching.network.Network; import cgeo.geocaching.network.Parameters; import cgeo.geocaching.sorting.CacheComparator; -import cgeo.geocaching.sorting.DateComparator; -import cgeo.geocaching.sorting.DifficultyComparator; +import cgeo.geocaching.sorting.ComparatorUserInterface; import cgeo.geocaching.sorting.EventDateComparator; -import cgeo.geocaching.sorting.FindsComparator; -import cgeo.geocaching.sorting.GeocodeComparator; -import cgeo.geocaching.sorting.InventoryComparator; -import cgeo.geocaching.sorting.NameComparator; -import cgeo.geocaching.sorting.PopularityComparator; -import cgeo.geocaching.sorting.RatingComparator; -import cgeo.geocaching.sorting.SizeComparator; -import cgeo.geocaching.sorting.StateComparator; -import cgeo.geocaching.sorting.StorageTimeComparator; -import cgeo.geocaching.sorting.TerrainComparator; import cgeo.geocaching.sorting.VisitComparator; -import cgeo.geocaching.sorting.VoteComparator; import cgeo.geocaching.ui.CacheListAdapter; import cgeo.geocaching.utils.GeoDirHandler; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; import ch.boye.httpclientandroidlib.HttpResponse; + import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; @@ -71,10 +60,8 @@ import android.widget.TextView; import java.util.ArrayList; import java.util.Collections; -import java.util.HashMap; import java.util.HashSet; import java.util.List; -import java.util.Map; import java.util.Set; public class cgeocaches extends AbstractListActivity { @@ -93,17 +80,7 @@ public class cgeocaches extends AbstractListActivity { private static final int MENU_CREATE_LIST = 7; private static final int MENU_DROP_LIST = 8; private static final int MENU_INVERT_SELECTION = 9; - private static final int MENU_SORT_DISTANCE = 10; - private static final int MENU_SORT_DIFFICULTY = 11; - private static final int MENU_SORT_TERRAIN = 12; - private static final int MENU_SORT_SIZE = 13; - private static final int MENU_SORT_FAVORITES = 14; - private static final int MENU_SORT_NAME = 15; - private static final int MENU_SORT_GEOCODE = 16; private static final int MENU_SWITCH_LIST = 17; - private static final int MENU_SORT_RATING = 18; - private static final int MENU_SORT_VOTE = 19; - private static final int MENU_SORT_INVENTORY = 20; private static final int MENU_IMPORT_WEB = 21; private static final int MENU_EXPORT = 22; private static final int MENU_REMOVE_FROM_HISTORY = 23; @@ -113,18 +90,14 @@ public class cgeocaches extends AbstractListActivity { private static final int SUBMENU_SHOW_MAP = 54; private static final int SUBMENU_MANAGE_LISTS = 55; private static final int SUBMENU_MANAGE_OFFLINE = 56; - private static final int SUBMENU_SORT = 57; + private static final int MENU_SORT = 57; private static final int SUBMENU_MANAGE_HISTORY = 60; - private static final int MENU_SORT_DATE = 61; - private static final int MENU_SORT_FINDS = 62; - private static final int MENU_SORT_STATE = 63; private static final int MENU_RENAME_LIST = 64; private static final int MENU_DROP_CACHES_AND_LIST = 65; private static final int MENU_DEFAULT_NAVIGATION = 66; private static final int MENU_NAVIGATION = 69; private static final int MENU_STORE_CACHE = 73; private static final int MENU_FILTER = 74; - private static final int MENU_SORT_STORAGE = 75; private static final int MSG_DONE = -1; private static final int MSG_RESTART_GEO_AND_DIR = -2; @@ -133,7 +106,6 @@ public class cgeocaches extends AbstractListActivity { private String action = null; private CacheListType type = null; private Geopoint coords = null; - private CacheType cacheType = Settings.getCacheType(); private SearchResult search = null; private final List<cgCache> cacheList = new ArrayList<cgCache>(); private CacheListAdapter adapter = null; @@ -141,7 +113,6 @@ public class cgeocaches extends AbstractListActivity { private View listFooter = null; private TextView listFooterText = null; private final Progress progress = new Progress(); - private Float northHeading = 0f; private String title = ""; private int detailTotal = 0; private int detailProgress = 0; @@ -151,41 +122,31 @@ public class cgeocaches extends AbstractListActivity { private int listId = StoredList.TEMPORARY_LIST_ID; private final GeoDirHandler geoDirHandler = new GeoDirHandler() { - @Override + @Override public void updateGeoData(final IGeoData geo) { if (adapter == null) { return; } - try { - if (geo.getCoords() != null) { - adapter.setActualCoordinates(geo.getCoords()); - } - - if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h - if (!Settings.isUseCompass()) { - adapter.setActualHeading(geo.getBearing()); - } - if (northHeading != null) { - adapter.setActualHeading(northHeading); - } - } - } catch (Exception e) { - Log.w("Failed to UpdateLocation location."); + if (geo.getCoords() != null) { + adapter.setActualCoordinates(geo.getCoords()); + } + if (!Settings.isUseCompass() || geo.getSpeed() > 5) { // use GPS when speed is higher than 18 km/h + adapter.setActualHeading(geo.getBearing()); } } - @Override - public void updateDirection(final float direction) { - if (!Settings.isLiveList()) { - return; - } + @Override + public void updateDirection(final float direction) { + if (adapter == null || !Settings.isLiveList()) { + return; + } - northHeading = DirectionProvider.getDirectionNow(cgeocaches.this, direction); - if (northHeading != null && adapter != null && (app.currentGeo().getSpeed() <= 5)) { // use compass when speed is lower than 18 km/h) { - adapter.setActualHeading(northHeading); - } - } + if (app.currentGeo().getSpeed() <= 5) { // use compass when speed is lower than 18 km/h) { + final float northHeading = DirectionProvider.getDirectionNow(cgeocaches.this, direction); + adapter.setActualHeading(northHeading); + } + } }; private ContextMenuInfo lastMenuInfo; @@ -248,11 +209,7 @@ public class cgeocaches extends AbstractListActivity { return; } - final Geopoint coordsNow = app.currentGeo().getCoords(); - if (coordsNow != null) { - adapter.setActualCoordinates(coordsNow); - adapter.setActualHeading(northHeading); - } + setAdapterCurrentCoordinates(false); } catch (Exception e) { showToast(res.getString(R.string.err_detail_cache_find_any)); Log.e("cgeocaches.loadCachesHandler: " + e.toString()); @@ -307,11 +264,7 @@ public class cgeocaches extends AbstractListActivity { return; } - final Geopoint coordsNow = app.currentGeo().getCoords(); - if (coordsNow != null) { - adapter.setActualCoordinates(coordsNow); - adapter.setActualHeading(northHeading); - } + setAdapterCurrentCoordinates(false); } catch (Exception e) { showToast(res.getString(R.string.err_detail_cache_find_next)); Log.e("cgeocaches.loadNextPageHandler: " + e.toString()); @@ -364,11 +317,7 @@ public class cgeocaches extends AbstractListActivity { } } - final Geopoint coordsNow = app.currentGeo().getCoords(); - if (coordsNow != null) { - adapter.setActualCoordinates(coordsNow); - adapter.setActualHeading(northHeading); - } + setAdapterCurrentCoordinates(false); showProgress(false); progress.dismiss(); @@ -487,7 +436,6 @@ public class cgeocaches extends AbstractListActivity { else { extras = new Bundle(); } - cacheType = Settings.getCacheType(); if (isInvokedFromAttachment()) { type = CacheListType.OFFLINE; if (coords == null) { @@ -663,12 +611,7 @@ public class cgeocaches extends AbstractListActivity { if (adapter != null) { adapter.setSelectMode(false); - final Geopoint coordsNow = app.currentGeo().getCoords(); - if (coordsNow != null) { - adapter.setActualCoordinates(coordsNow); - adapter.setActualHeading(northHeading); - adapter.forceSort(); - } + setAdapterCurrentCoordinates(true); } if (loadCachesHandler != null && search != null) { @@ -677,13 +620,23 @@ public class cgeocaches extends AbstractListActivity { // refresh standard list if it has changed (new caches downloaded) if (type == CacheListType.OFFLINE && listId >= StoredList.STANDARD_LIST_ID && search != null) { - SearchResult newSearch = cgeoapplication.getInstance().getBatchOfStoredCaches(true, coords, cacheType, listId); + SearchResult newSearch = cgeoapplication.getInstance().getBatchOfStoredCaches(true, coords, Settings.getCacheType(), listId); if (newSearch != null && newSearch.getTotal() != search.getTotal()) { refreshCurrentList(); } } } + private void setAdapterCurrentCoordinates(final boolean forceSort) { + final Geopoint coordsNow = app.currentGeo().getCoords(); + if (coordsNow != null) { + adapter.setActualCoordinates(coordsNow); + if (forceSort) { + adapter.forceSort(); + } + } + } + @Override public void onDestroy() { if (adapter != null) { @@ -705,34 +658,7 @@ public class cgeocaches extends AbstractListActivity { menu.add(0, MENU_FILTER, 0, res.getString(R.string.caches_filter)).setIcon(R.drawable.ic_menu_filter); if (type != CacheListType.HISTORY) { - final SubMenu subMenuSort = menu.addSubMenu(0, SUBMENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically); - subMenuSort.setHeaderTitle(res.getString(R.string.caches_sort_title)); - - // sort the context menu labels alphabetically for easier reading - final Map<String, Integer> comparators = new HashMap<String, Integer>(); - comparators.put(res.getString(R.string.caches_sort_distance), MENU_SORT_DISTANCE); - comparators.put(res.getString(R.string.caches_sort_difficulty), MENU_SORT_DIFFICULTY); - comparators.put(res.getString(R.string.caches_sort_terrain), MENU_SORT_TERRAIN); - comparators.put(res.getString(R.string.caches_sort_size), MENU_SORT_SIZE); - comparators.put(res.getString(R.string.caches_sort_favorites), MENU_SORT_FAVORITES); - comparators.put(res.getString(R.string.caches_sort_name), MENU_SORT_NAME); - comparators.put(res.getString(R.string.caches_sort_gccode), MENU_SORT_GEOCODE); - comparators.put(res.getString(R.string.caches_sort_rating), MENU_SORT_RATING); - comparators.put(res.getString(R.string.caches_sort_vote), MENU_SORT_VOTE); - comparators.put(res.getString(R.string.caches_sort_inventory), MENU_SORT_INVENTORY); - comparators.put(res.getString(R.string.caches_sort_date), MENU_SORT_DATE); - comparators.put(res.getString(R.string.caches_sort_finds), MENU_SORT_FINDS); - comparators.put(res.getString(R.string.caches_sort_state), MENU_SORT_STATE); - comparators.put(res.getString(R.string.caches_sort_storage), MENU_SORT_STORAGE); - - final List<String> sortedLabels = new ArrayList<String>(comparators.keySet()); - Collections.sort(sortedLabels); - for (String label : sortedLabels) { - Integer id = comparators.get(label); - subMenuSort.add(1, id, 0, label).setCheckable(true).setChecked(id == MENU_SORT_DISTANCE); - } - - subMenuSort.setGroupCheckable(1, true, true); + menu.add(0, MENU_SORT, 0, res.getString(R.string.caches_sort)).setIcon(R.drawable.ic_menu_sort_alphabetically); } menu.add(0, MENU_SWITCH_SELECT_MODE, 0, res.getString(R.string.caches_select_mode)).setIcon(R.drawable.ic_menu_agenda); @@ -797,7 +723,7 @@ public class cgeocaches extends AbstractListActivity { MENU_SWITCH_SELECT_MODE, SUBMENU_MANAGE_HISTORY, SUBMENU_SHOW_MAP, - SUBMENU_SORT, + MENU_SORT, MENU_REFRESH_STORED, MENU_DROP_CACHES, MENU_DROP_CACHES_AND_LIST, @@ -916,52 +842,10 @@ public class cgeocaches extends AbstractListActivity { } invalidateOptionsMenuCompatible(); return false; - case MENU_SORT_DISTANCE: - setComparator(item, null); - return false; - case MENU_SORT_DIFFICULTY: - setComparator(item, new DifficultyComparator()); - return false; - case MENU_SORT_TERRAIN: - setComparator(item, new TerrainComparator()); - return false; - case MENU_SORT_SIZE: - setComparator(item, new SizeComparator()); - return false; - case MENU_SORT_FAVORITES: - setComparator(item, new PopularityComparator()); - return false; - case MENU_SORT_NAME: - setComparator(item, new NameComparator()); - return false; - case MENU_SORT_GEOCODE: - setComparator(item, new GeocodeComparator()); - return false; - case MENU_SORT_STORAGE: - setComparator(item, new StorageTimeComparator()); - return false; case MENU_SWITCH_LIST: selectList(null); invalidateOptionsMenuCompatible(); return false; - case MENU_SORT_RATING: - setComparator(item, new RatingComparator()); - return false; - case MENU_SORT_VOTE: - setComparator(item, new VoteComparator()); - return false; - case MENU_SORT_INVENTORY: - setComparator(item, new InventoryComparator()); - return false; - case MENU_SORT_DATE: - setComparator(item, new DateComparator()); - return true; - case MENU_SORT_FINDS: - setComparator(item, new FindsComparator(app)); - return true; - case MENU_SORT_STATE: - setComparator(item, new StateComparator()); - return true; case MENU_FILTER: new FilterUserInterface(this).selectFilter(new RunnableWithArgument<IFilter>() { @Override @@ -978,6 +862,14 @@ public class cgeocaches extends AbstractListActivity { } }); return true; + case MENU_SORT: + new ComparatorUserInterface(this).selectComparator(adapter.getCacheComparator(), new RunnableWithArgument<CacheComparator>() { + @Override + public void run(CacheComparator selectedComparator) { + setComparator(selectedComparator); + } + }); + return true; case MENU_IMPORT_WEB: importWeb(); return false; @@ -997,12 +889,10 @@ public class cgeocaches extends AbstractListActivity { return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, search); } - private void setComparator(MenuItem item, - CacheComparator comparator) { + private void setComparator(final CacheComparator comparator) { if (adapter != null) { adapter.setComparator(comparator); } - item.setChecked(true); } @Override @@ -1414,7 +1304,7 @@ public class cgeocaches extends AbstractListActivity { @Override public void runSearch() { - search = GCParser.searchByCoords(coords, cacheType, Settings.isShowCaptcha()); + search = GCParser.searchByCoords(coords, Settings.getCacheType(), Settings.isShowCaptcha()); } } @@ -1428,7 +1318,7 @@ public class cgeocaches extends AbstractListActivity { @Override public void runSearch() { - search = GCParser.searchByKeyword(keyword, cacheType, Settings.isShowCaptcha()); + search = GCParser.searchByKeyword(keyword, Settings.getCacheType(), Settings.isShowCaptcha()); } } @@ -1442,7 +1332,7 @@ public class cgeocaches extends AbstractListActivity { @Override public void runSearch() { - search = GCParser.searchByUsername(username, cacheType, Settings.isShowCaptcha()); + search = GCParser.searchByUsername(username, Settings.getCacheType(), Settings.isShowCaptcha()); } } @@ -1456,7 +1346,7 @@ public class cgeocaches extends AbstractListActivity { @Override public void runSearch() { - search = GCParser.searchByOwner(username, cacheType, Settings.isShowCaptcha()); + search = GCParser.searchByOwner(username, Settings.getCacheType(), Settings.isShowCaptcha()); } } diff --git a/main/src/cgeo/geocaching/compatibility/Compatibility.java b/main/src/cgeo/geocaching/compatibility/Compatibility.java index d869c58..0821655 100644 --- a/main/src/cgeo/geocaching/compatibility/Compatibility.java +++ b/main/src/cgeo/geocaching/compatibility/Compatibility.java @@ -1,6 +1,7 @@ package cgeo.geocaching.compatibility; import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.utils.AngleUtils; import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.reflect.MethodUtils; @@ -40,23 +41,22 @@ public final class Compatibility { /** * Add 90, 180 or 270 degrees to the given rotation. - * <br/> - * Note: the result is not normalized and may fall outside your desired range. * * @param directionNowPre the direction in degrees before adjustment * @param activity the activity whose rotation is used to adjust the direction - * @return the adjusted direction + * @return the adjusted direction, in the [0, 360[ range */ public static float getDirectionNow(final float directionNowPre, final Activity activity) { + float offset = 0; if (isLevel8) { try { final int rotation = level8.getRotation(activity); if (rotation == Surface.ROTATION_90) { - return directionNowPre + 90; + offset = 90; } else if (rotation == Surface.ROTATION_180) { - return directionNowPre + 180; + offset = 180; } else if (rotation == Surface.ROTATION_270) { - return directionNowPre + 270; + offset = 270; } } catch (final Exception e) { // This should never happen: IllegalArgumentException, IllegalAccessException or InvocationTargetException @@ -66,10 +66,10 @@ public final class Compatibility { final Display display = activity.getWindowManager().getDefaultDisplay(); final int rotation = display.getOrientation(); if (rotation == Configuration.ORIENTATION_LANDSCAPE) { - return directionNowPre + 90; + offset = 90; } } - return directionNowPre; + return AngleUtils.normalize(directionNowPre + offset); } public static void dataChanged(final String name) { diff --git a/main/src/cgeo/geocaching/filter/FilterUserInterface.java b/main/src/cgeo/geocaching/filter/FilterUserInterface.java index 002511a..230bc91 100644 --- a/main/src/cgeo/geocaching/filter/FilterUserInterface.java +++ b/main/src/cgeo/geocaching/filter/FilterUserInterface.java @@ -3,7 +3,6 @@ package cgeo.geocaching.filter; import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.cgeoapplication; -import cgeo.geocaching.activity.IAbstractActivity; import cgeo.geocaching.enumerations.CacheType; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.RunnableWithArgument; @@ -35,11 +34,11 @@ public final class FilterUserInterface { } } - private final IAbstractActivity activity; + private final Activity activity; private final ArrayList<FactoryEntry> registry; private final Resources res; - public FilterUserInterface(final IAbstractActivity activity) { + public FilterUserInterface(final Activity activity) { this.activity = activity; this.res = cgeoapplication.getInstance().getResources(); @@ -73,10 +72,10 @@ public final class FilterUserInterface { } public void selectFilter(final RunnableWithArgument<IFilter> runAfterwards) { - final AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity); + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(R.string.caches_filter); - final ArrayAdapter<FactoryEntry> adapter = new ArrayAdapter<FactoryEntry>((Activity) activity, android.R.layout.select_dialog_item, registry); + final ArrayAdapter<FactoryEntry> adapter = new ArrayAdapter<FactoryEntry>(activity, android.R.layout.select_dialog_item, registry); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override @@ -107,10 +106,10 @@ public final class FilterUserInterface { return; } - final AlertDialog.Builder builder = new AlertDialog.Builder((Activity) activity); + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); builder.setTitle(menuTitle); - final ArrayAdapter<IFilter> adapter = new ArrayAdapter<IFilter>((Activity) activity, android.R.layout.select_dialog_item, filters); + final ArrayAdapter<IFilter> adapter = new ArrayAdapter<IFilter>(activity, android.R.layout.select_dialog_item, filters); builder.setAdapter(adapter, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int item) { diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index 2f99dd5..0fcdb6f 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -83,6 +83,19 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto /** max. number of caches displayed in the Live Map */ public static final int MAX_CACHES = 500; + /**Controls the behaviour of the map*/ + public enum MapMode { + /** Live Map where caches are loaded from online */ + LIVE_ONLINE, + /** Live Map where caches are loaded only from database */ + LIVE_OFFLINE, + /** Map around some coordinates */ + COORDS, + /** Map with a single cache (no reload on move) */ + SINGLE, + /** Map with a list of caches (no reload on move) */ + LIST + } /** Handler Messages */ private static final int HIDE_PROGRESS = 0; private static final int SHOW_PROGRESS = 1; @@ -97,6 +110,8 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto private static final String EXTRAS_WPTTYPE = "wpttype"; private static final String EXTRAS_MAPSTATE = "mapstate"; private static final String EXTRAS_SEARCH = "search"; + private static final String EXTRAS_MAP_MODE = "map_mode"; + private static final int MENU_SELECT_MAPVIEW = 1; private static final int MENU_MAP_LIVE = 2; private static final int MENU_STORE_CACHES = 3; @@ -171,8 +186,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto private long detailProgressTime = 0L; // views private ImageSwitcher myLocSwitch = null; + + /**Controls the map behaviour*/ + private MapMode mapMode = null; // other things - private boolean live = true; // live map (live, dead) or rest (displaying caches on map) + // private boolean live = true; // live map (live, dead) or rest (displaying caches on map) private boolean liveChanged = false; // previous state for loadTimer private boolean centered = false; // if map is already centered private boolean alreadyCentered = false; // -""- for setting my location @@ -203,7 +221,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // set title final StringBuilder title = new StringBuilder(); - if (live) { + if (mapMode == MapMode.LIVE_ONLINE) { title.append(res.getString(R.string.map_live)); } else { title.append(mapTitle); @@ -361,6 +379,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // Get parameters from the intent final Bundle extras = activity.getIntent().getExtras(); if (extras != null) { + mapMode = (MapMode) extras.get(EXTRAS_MAP_MODE); searchIntent = (SearchResult) extras.getParcelable(EXTRAS_SEARCH); geocodeIntent = extras.getString(EXTRAS_GEOCODE); coordsIntent = (Geopoint) extras.getParcelable(EXTRAS_COORDS); @@ -368,6 +387,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto mapStateIntent = extras.getIntArray(EXTRAS_MAPSTATE); mapTitle = extras.getString(EXTRAS_MAP_TITLE); } + else { + mapMode = Settings.isLiveMap() ? MapMode.LIVE_ONLINE : MapMode.LIVE_OFFLINE; + } if (StringUtils.isBlank(mapTitle)) { mapTitle = res.getString(R.string.map_map); } @@ -426,11 +448,8 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto mapView.getMapController().setZoom(Settings.getMapZoom()); - // live map, if no arguments are given - live = (searchIntent == null && geocodeIntent == null && coordsIntent == null); - if (null == mapStateIntent) { - followMyLocation = live; + followMyLocation = mapMode == MapMode.LIVE_OFFLINE || mapMode == MapMode.LIVE_ONLINE; } else { followMyLocation = 1 == mapStateIntent[3]; if ((overlayCaches.getCircles() ? 1 : 0) != mapStateIntent[4]) { @@ -575,18 +594,16 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } item = menu.findItem(MENU_MAP_LIVE); // live map - if (live) { - if (Settings.isLiveMap()) { - item.setTitle(res.getString(R.string.map_live_disable)); - } else { - item.setTitle(res.getString(R.string.map_live_enable)); - } + if (mapMode == MapMode.LIVE_ONLINE) { + item.setTitle(res.getString(R.string.map_live_disable)); + } else if (mapMode == MapMode.LIVE_OFFLINE) { + item.setTitle(res.getString(R.string.map_live_enable)); } else { item.setEnabled(false); item.setTitle(res.getString(R.string.map_live_enable)); } - menu.findItem(MENU_STORE_CACHES).setEnabled(live && !isLoading() && CollectionUtils.isNotEmpty(caches) && app.hasUnsavedCaches(search)); + menu.findItem(MENU_STORE_CACHES).setEnabled(isLiveMode() && !isLoading() && CollectionUtils.isNotEmpty(caches) && app.hasUnsavedCaches(search)); item = menu.findItem(MENU_CIRCLE_MODE); // show circles if (overlayCaches != null && overlayCaches.getCircles()) { @@ -596,9 +613,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } item = menu.findItem(MENU_AS_LIST); - item.setEnabled(live && CollectionUtils.isNotEmpty(caches)); + item.setEnabled(isLiveMode() && CollectionUtils.isNotEmpty(caches)); - menu.findItem(SUBMENU_STRATEGY).setEnabled(live); + menu.findItem(SUBMENU_STRATEGY).setEnabled(isLiveMode()); } catch (Exception e) { Log.e("cgeomap.onPrepareOptionsMenu: " + e.toString()); } @@ -606,6 +623,10 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto return true; } + private boolean isLiveMode() { + return mapMode == MapMode.LIVE_OFFLINE || mapMode == MapMode.LIVE_ONLINE; + } + @Override public boolean onOptionsItemSelected(MenuItem item) { final int id = item.getItemId(); @@ -616,13 +637,14 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto return true; case MENU_MAP_LIVE: Settings.setLiveMap(!Settings.isLiveMap()); + mapMode = Settings.isLiveMap() ? MapMode.LIVE_ONLINE : MapMode.LIVE_OFFLINE; liveChanged = true; search = null; searchIntent = null; ActivityMixin.invalidateOptionsMenu(activity); return true; case MENU_STORE_CACHES: - if (live && !isLoading() && CollectionUtils.isNotEmpty(caches)) { + if (isLiveMode() && !isLoading() && CollectionUtils.isNotEmpty(caches)) { final List<String> geocodes = new ArrayList<String>(); final List<cgCache> cachesProtected = caches.getAsList(); @@ -786,6 +808,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } mapIntent.putExtra(EXTRAS_WPTTYPE, waypointTypeIntent != null ? waypointTypeIntent.id : null); mapIntent.putExtra(EXTRAS_MAP_TITLE, mapTitle); + mapIntent.putExtra(EXTRAS_MAP_MODE, mapMode); final int[] mapState = currentMapState(); if (mapState != null) { @@ -941,7 +964,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (liveChanged) { moved = true; - } else if (live && Settings.isLiveMap() && !downloaded) { + } else if (mapMode == MapMode.LIVE_ONLINE && !downloaded) { moved = true; } else if (viewport == null) { moved = true; @@ -1052,23 +1075,15 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto @Override public void run() { - /** - * True if we are currently showing the live map or a single points through coordsIntent. - */ - final boolean isLiveMapOrCoords = searchIntent == null && geocodeIntent == null; - try { showProgressHandler.sendEmptyMessage(SHOW_PROGRESS); loadThreadRun = System.currentTimeMillis(); // stage 1 - pull and render from the DB only for live map - if (isLiveMapOrCoords) { - // live map - if (!live || !Settings.isLiveMap()) { + if (mapMode == MapMode.LIVE_ONLINE) { search = new SearchResult(app.getStoredInViewport(viewport, Settings.getCacheType())); - } else { + } else if (mapMode == MapMode.LIVE_OFFLINE) { search = new SearchResult(app.getCachedInViewport(viewport, Settings.getCacheType())); - } } else { // map started from another activity search = new SearchResult(searchIntent); @@ -1083,7 +1098,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto caches.addAll(cachesFromSearchResult); } - if (live) { + if (isLiveMode()) { final boolean excludeMine = Settings.isExcludeMyCaches(); final boolean excludeDisabled = Settings.isExcludeDisabledCaches(); @@ -1098,7 +1113,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto countVisibleCaches(); if (cachesCnt < Settings.getWayPointsThreshold() || geocodeIntent != null) { waypoints.clear(); - if (isLiveMapOrCoords) { + if (isLiveMode() || mapMode == MapMode.COORDS) { //All visible waypoints waypoints.addAll(app.getWaypointsInViewport(viewport, Settings.isExcludeMyCaches(), Settings.isExcludeDisabledCaches())); } else { @@ -1112,7 +1127,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto //render displayExecutor.execute(new DisplayRunnable(viewport)); - if (live && Settings.isLiveMap()) { + if (mapMode == MapMode.LIVE_ONLINE) { downloadExecutor.execute(new DownloadRunnable(viewport)); } } finally { @@ -1205,7 +1220,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (!cachesToDisplay.isEmpty()) { // Only show waypoints for single view or setting // when less than showWaypointsthreshold Caches shown - if (cachesToDisplay.size() == 1 || (cachesCnt < Settings.getWayPointsThreshold())) { + if (mapMode == MapMode.SINGLE || (cachesCnt < Settings.getWayPointsThreshold())) { for (cgWaypoint waypoint : waypointsToDisplay) { if (waypoint.getCoords() == null) { @@ -1570,6 +1585,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto public static void startActivitySearch(final Activity fromActivity, final SearchResult search, final String title) { final Intent mapIntent = newIntent(fromActivity); mapIntent.putExtra(EXTRAS_SEARCH, search); + mapIntent.putExtra(EXTRAS_MAP_MODE, MapMode.LIST); if (StringUtils.isNotBlank(title)) { mapIntent.putExtra(CGeoMap.EXTRAS_MAP_TITLE, title); } @@ -1577,11 +1593,14 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } public static void startActivityLiveMap(final Activity fromActivity) { - fromActivity.startActivity(newIntent(fromActivity)); + final Intent mapIntent = newIntent(fromActivity); + mapIntent.putExtra(EXTRAS_MAP_MODE, Settings.isLiveMap() ? MapMode.LIVE_ONLINE : MapMode.LIVE_OFFLINE); + fromActivity.startActivity(mapIntent); } public static void startActivityCoords(final Activity fromActivity, final Geopoint coords, final WaypointType type, final String title) { final Intent mapIntent = newIntent(fromActivity); + mapIntent.putExtra(EXTRAS_MAP_MODE, MapMode.COORDS); mapIntent.putExtra(EXTRAS_COORDS, coords); if (type != null) { mapIntent.putExtra(EXTRAS_WPTTYPE, type.id); @@ -1594,6 +1613,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto public static void startActivityGeoCode(final Activity fromActivity, final String geocode) { final Intent mapIntent = newIntent(fromActivity); + mapIntent.putExtra(EXTRAS_MAP_MODE, MapMode.SINGLE); mapIntent.putExtra(EXTRAS_GEOCODE, geocode); mapIntent.putExtra(EXTRAS_MAP_TITLE, geocode); fromActivity.startActivity(mapIntent); diff --git a/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java new file mode 100644 index 0000000..247bb3b --- /dev/null +++ b/main/src/cgeo/geocaching/sorting/ComparatorUserInterface.java @@ -0,0 +1,117 @@ +package cgeo.geocaching.sorting; + +import cgeo.geocaching.R; +import cgeo.geocaching.utils.Log; +import cgeo.geocaching.utils.RunnableWithArgument; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.res.Resources; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; + +public class ComparatorUserInterface { + private final Activity activity; + private final ArrayList<ComparatorEntry> registry; + private final Resources res; + + private static final class ComparatorEntry { + private final String name; + private final Class<? extends CacheComparator> cacheComparator; + + public ComparatorEntry(final String name, final Class<? extends CacheComparator> cacheComparator) { + this.name = name; + this.cacheComparator = cacheComparator; + } + + @Override + public String toString() { + return name; + } + } + + public ComparatorUserInterface(final Activity activity) { + this.activity = activity; + res = activity.getResources(); + + registry = new ArrayList<ComparatorUserInterface.ComparatorEntry>(20); + + register(R.string.caches_sort_distance, null); + register(R.string.caches_sort_difficulty, DifficultyComparator.class); + register(R.string.caches_sort_terrain, TerrainComparator.class); + register(R.string.caches_sort_size, SizeComparator.class); + register(R.string.caches_sort_favorites, PopularityComparator.class); + register(R.string.caches_sort_name, NameComparator.class); + register(R.string.caches_sort_gccode, GeocodeComparator.class); + register(R.string.caches_sort_rating, RatingComparator.class); + register(R.string.caches_sort_vote, VoteComparator.class); + register(R.string.caches_sort_inventory, InventoryComparator.class); + register(R.string.caches_sort_date, DateComparator.class); + register(R.string.caches_sort_finds, FindsComparator.class); + register(R.string.caches_sort_state, StateComparator.class); + register(R.string.caches_sort_storage, StorageTimeComparator.class); + + // sort the menu labels alphabetically for easier reading + Collections.sort(registry, new Comparator<ComparatorEntry>() { + + @Override + public int compare(ComparatorEntry lhs, ComparatorEntry rhs) { + return lhs.name.compareToIgnoreCase(rhs.name); + } + }); + } + + private void register(final int resourceId, Class<? extends CacheComparator> comparatorClass) { + registry.add(new ComparatorEntry(res.getString(resourceId), comparatorClass)); + } + + public void selectComparator(final CacheComparator current, final RunnableWithArgument<CacheComparator> runAfterwards) { + final AlertDialog.Builder builder = new AlertDialog.Builder(activity); + builder.setTitle(R.string.caches_sort_title); + + // adapter doesn't work correctly here, therefore using the string array based method + final String[] items = new String[registry.size()]; + for (int i = 0; i < items.length; i++) { + items[i] = registry.get(i).name; + } + builder.setSingleChoiceItems(items, getCurrentIndex(current), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int itemIndex) { + ComparatorEntry entry = registry.get(itemIndex); + try { + if (entry.cacheComparator == null) { + runAfterwards.run(null); + } + else { + CacheComparator comparator = entry.cacheComparator.newInstance(); + runAfterwards.run(comparator); + } + } catch (Exception e) { + Log.e("selectComparator", e); + } + dialog.dismiss(); + } + }); + + builder.create().show(); + } + + private int getCurrentIndex(final CacheComparator current) { + for (int index = 0; index < registry.size(); index++) { + final ComparatorEntry entry = registry.get(index); + if (current == null) { + if (entry.cacheComparator == null) { + return index; + } + } + else if (current.getClass().equals(entry.cacheComparator)) { + return index; + } + } + return -1; + } + +} diff --git a/main/src/cgeo/geocaching/sorting/DateComparator.java b/main/src/cgeo/geocaching/sorting/DateComparator.java index 7129905..3136d47 100644 --- a/main/src/cgeo/geocaching/sorting/DateComparator.java +++ b/main/src/cgeo/geocaching/sorting/DateComparator.java @@ -1,7 +1,9 @@ package cgeo.geocaching.sorting; import cgeo.geocaching.cgCache; +import cgeo.geocaching.cgeoapplication; +import java.util.ArrayList; import java.util.Date; /** @@ -16,10 +18,19 @@ public class DateComparator extends AbstractCacheComparator { @Override protected int compareCaches(cgCache cache1, cgCache cache2) { - Date date1 = cache1.getHiddenDate(); - Date date2 = cache2.getHiddenDate(); + final Date date1 = cache1.getHiddenDate(); + final Date date2 = cache2.getHiddenDate(); if (date1 != null && date2 != null) { - return date1.compareTo(date2); + final int dateDifference = date1.compareTo(date2); + // for equal dates, sort by distance + if (dateDifference == 0) { + final ArrayList<cgCache> list = new ArrayList<cgCache>(); + list.add(cache1); + list.add(cache2); + final DistanceComparator distanceComparator = new DistanceComparator(cgeoapplication.getInstance().currentGeo().getCoords(), list); + return distanceComparator.compare(cache1, cache2); + } + return dateDifference; } if (date1 != null) { return -1; diff --git a/main/src/cgeo/geocaching/sorting/FindsComparator.java b/main/src/cgeo/geocaching/sorting/FindsComparator.java index ad72ea3..6407b11 100644 --- a/main/src/cgeo/geocaching/sorting/FindsComparator.java +++ b/main/src/cgeo/geocaching/sorting/FindsComparator.java @@ -6,11 +6,7 @@ import cgeo.geocaching.enumerations.LogType; public class FindsComparator extends AbstractCacheComparator { - private cgeoapplication app; - - public FindsComparator(cgeoapplication app) { - this.app = app; - } + private final cgeoapplication app = cgeoapplication.getInstance(); @Override protected boolean canCompare(cgCache cache1, cgCache cache2) { @@ -25,15 +21,14 @@ public class FindsComparator extends AbstractCacheComparator { } private int getFindsCount(cgCache cache) { - int finds = 0; if (cache.getLogCounts().isEmpty()) { cache.setLogCounts(app.loadLogCounts(cache.getGeocode())); } Integer logged = cache.getLogCounts().get(LogType.FOUND_IT); if (logged != null) { - finds = logged; + return logged; } - return finds; + return 0; } } diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index bcfdde7..c6d3404 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -14,6 +14,7 @@ import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.sorting.CacheComparator; import cgeo.geocaching.sorting.DistanceComparator; import cgeo.geocaching.sorting.VisitComparator; +import cgeo.geocaching.utils.AngleUtils; import cgeo.geocaching.utils.Log; import org.apache.commons.collections.CollectionUtils; @@ -263,19 +264,15 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> { notifyDataSetChanged(); } - public void setActualCoordinates(final Geopoint coordsIn) { - if (coordsIn == null) { - return; - } - - coords = coordsIn; + public void setActualCoordinates(final Geopoint coords) { + this.coords = coords; updateSortByDistance(); for (final DistanceView distance : distances) { - distance.update(coordsIn); + distance.update(coords); } for (final CompassMiniView compass : compasses) { - compass.updateCurrentCoords(coordsIn); + compass.updateCurrentCoords(coords); } } @@ -304,13 +301,12 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> { return cacheComparator == null || cacheComparator instanceof DistanceComparator; } - public void setActualHeading(Float directionNow) { - if (directionNow == null) { + public void setActualHeading(final float direction) { + if (Math.abs(AngleUtils.difference(azimuth, direction)) < 10) { return; } - azimuth = directionNow; - + azimuth = direction; for (final CompassMiniView compass : compasses) { compass.updateAzimuth(azimuth); } diff --git a/main/src/cgeo/geocaching/ui/CompassMiniView.java b/main/src/cgeo/geocaching/ui/CompassMiniView.java index 1c96a09..44fb8e2 100644 --- a/main/src/cgeo/geocaching/ui/CompassMiniView.java +++ b/main/src/cgeo/geocaching/ui/CompassMiniView.java @@ -3,6 +3,7 @@ package cgeo.geocaching.ui; import cgeo.geocaching.R; import cgeo.geocaching.Settings; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.utils.AngleUtils; import android.content.Context; import android.graphics.Bitmap; @@ -159,7 +160,7 @@ final public class CompassMiniView extends View { } private float calculateAzimuthRelative() { - return (azimuth - heading + 360) % 360; + return AngleUtils.normalize(azimuth - heading); } @Override diff --git a/main/src/cgeo/geocaching/ui/CompassView.java b/main/src/cgeo/geocaching/ui/CompassView.java index 703f96f..b328527 100644 --- a/main/src/cgeo/geocaching/ui/CompassView.java +++ b/main/src/cgeo/geocaching/ui/CompassView.java @@ -1,7 +1,7 @@ package cgeo.geocaching.ui; -import cgeo.geocaching.DirectionProvider; import cgeo.geocaching.R; +import cgeo.geocaching.utils.AngleUtils; import cgeo.geocaching.utils.PeriodicHandler; import android.content.Context; @@ -23,19 +23,19 @@ public class CompassView extends View { /** * North direction currently SHOWN on compass (not measured) */ - private double azimuthShown = 0.0; + private float azimuthShown = 0; /** * cache direction currently SHOWN on compass (not measured) */ - private double cacheHeadingShown = 0.0; + private float cacheHeadingShown = 0; /** * cache direction measured from device, or 0.0 */ - private double cacheHeadingMeasured = 0.0; + private float cacheHeadingMeasured = 0; /** * North direction measured from device, or 0.0 */ - private double northMeasured = 0.0; + private float northMeasured = 0; private PaintFlagsDrawFilter setfil = null; private PaintFlagsDrawFilter remfil = null; private int compassUnderlayWidth = 0; @@ -103,7 +103,7 @@ public class CompassView extends View { } } - public synchronized void updateNorth(double northHeadingIn, double cacheHeadingIn) { + public synchronized void updateNorth(float northHeadingIn, float cacheHeadingIn) { if (initialDisplay) { // We will force the compass to move brutally if this is the first // update since it is visible. @@ -128,20 +128,20 @@ public class CompassView extends View { * the actual value * @return the new value */ - static protected double smoothUpdate(double goal, double actual) { - final double diff = DirectionProvider.difference(actual, goal); + static protected float smoothUpdate(float goal, float actual) { + final float diff = AngleUtils.difference(actual, goal); - double offset = 0.0; + float offset = 0; // If the difference is smaller than 1 degree, do nothing as it // causes the arrow to vibrate. Round away from 0. if (diff > 1.0) { - offset = Math.ceil(diff / 10.0); // for larger angles, rotate faster + offset = (float) Math.ceil(diff / 10.0); // for larger angles, rotate faster } else if (diff < 1.0) { - offset = Math.floor(diff / 10.0); + offset = (float) Math.floor(diff / 10.0); } - return (actual + offset + 360) % 360; + return AngleUtils.normalize(actual + offset); } private class RedrawHandler extends PeriodicHandler { @@ -152,10 +152,10 @@ public class CompassView extends View { @Override public void act() { - final double newAzimuthShown = smoothUpdate(northMeasured, azimuthShown); - final double newCacheHeadingShown = smoothUpdate(cacheHeadingMeasured, cacheHeadingShown); - if (Math.abs(DirectionProvider.difference(azimuthShown, newAzimuthShown)) >= 2 || - Math.abs(DirectionProvider.difference(cacheHeadingShown, newCacheHeadingShown)) >= 2) { + final float newAzimuthShown = smoothUpdate(northMeasured, azimuthShown); + final float newCacheHeadingShown = smoothUpdate(cacheHeadingMeasured, cacheHeadingShown); + if (Math.abs(AngleUtils.difference(azimuthShown, newAzimuthShown)) >= 2 || + Math.abs(AngleUtils.difference(cacheHeadingShown, newCacheHeadingShown)) >= 2) { synchronized(CompassView.this) { azimuthShown = newAzimuthShown; cacheHeadingShown = newCacheHeadingShown; @@ -169,16 +169,16 @@ public class CompassView extends View { @Override protected void onDraw(Canvas canvas) { // use local synchronized variables to avoid them being changed from the device during drawing - double azimuthDrawn; - double headingDrawn; + float azimuthDrawn; + float headingDrawn; synchronized (this) { azimuthDrawn = azimuthShown; headingDrawn = cacheHeadingShown; } - double azimuthTemp = azimuthDrawn; - final double azimuthRelative = (azimuthTemp - headingDrawn + 360) % 360; + float azimuthTemp = azimuthDrawn; + final float azimuthRelative = AngleUtils.normalize(azimuthTemp - headingDrawn); // compass margins int canvasCenterX = (compassRoseWidth / 2) + ((getWidth() - compassRoseWidth) / 2); diff --git a/main/src/cgeo/geocaching/ui/Formatter.java b/main/src/cgeo/geocaching/ui/Formatter.java index 6ee1a65..33793c1 100644 --- a/main/src/cgeo/geocaching/ui/Formatter.java +++ b/main/src/cgeo/geocaching/ui/Formatter.java @@ -1,5 +1,6 @@ package cgeo.geocaching.ui; +import cgeo.geocaching.R; import cgeo.geocaching.cgeoapplication; import android.content.Context; @@ -64,9 +65,29 @@ public abstract class Formatter { } /** + * Generate a numeric date string according to system-wide settings (locale, date format) + * such as "10/20/2010". Today and yesterday will be presented as strings "today" and "yesterday". + * + * @param date + * milliseconds since the epoch + * @return the formatted string + */ + public static String formatShortDateVerbally(long date) { + int diff = cgeo.geocaching.utils.DateUtils.daysSince(date); + switch (diff) { + case 0: + return cgeoapplication.getInstance().getString(R.string.log_today); + case 1: + return cgeoapplication.getInstance().getString(R.string.log_yesterday); + default: + return formatShortDate(date); + } + } + + /** * Generate a numeric date and time string according to system-wide settings (locale, * date format) such as "7 sept. at 12:35". - * + * * @param context * a Context * @param date diff --git a/main/src/cgeo/geocaching/utils/AngleUtils.java b/main/src/cgeo/geocaching/utils/AngleUtils.java new file mode 100644 index 0000000..e2b4a66 --- /dev/null +++ b/main/src/cgeo/geocaching/utils/AngleUtils.java @@ -0,0 +1,28 @@ +package cgeo.geocaching.utils; + +public class AngleUtils { + + private AngleUtils() { + // Do not instantiate + } + + /** + * Return the angle to turn of to go from an angle to the other + * + * @param from the origin angle in degrees + * @param to the target angle in degreees + * @return a value in degrees, in the [-180, 180[ range + */ + public static float difference(final float from, final float to) { + return normalize(to - from + 180) - 180; + } + + /** + * Normalize an angle so that it belongs to the [0, 360[ range. + * @param angle the angle in degrees + * @return the same angle in the [0, 360[ range + */ + public static float normalize(final float angle) { + return (angle >= 0 ? angle : (360 - ((-angle) % 360))) % 360; + } +} diff --git a/main/src/cgeo/geocaching/utils/DateUtils.java b/main/src/cgeo/geocaching/utils/DateUtils.java new file mode 100644 index 0000000..3004bdb --- /dev/null +++ b/main/src/cgeo/geocaching/utils/DateUtils.java @@ -0,0 +1,18 @@ +package cgeo.geocaching.utils; + +import java.util.Calendar; + +public class DateUtils { + public static int daysSince(long date) { + final Calendar logDate = Calendar.getInstance(); + logDate.setTimeInMillis(date); + logDate.set(Calendar.SECOND, 0); + logDate.set(Calendar.MINUTE, 0); + logDate.set(Calendar.HOUR, 0); + final Calendar today = Calendar.getInstance(); + today.set(Calendar.SECOND, 0); + today.set(Calendar.MINUTE, 0); + today.set(Calendar.HOUR, 0); + return (int) Math.round((today.getTimeInMillis() - logDate.getTimeInMillis()) / 86400000d); + } +} diff --git a/tests/src/cgeo/geocaching/utils/AngleUtilsTest.java b/tests/src/cgeo/geocaching/utils/AngleUtilsTest.java new file mode 100644 index 0000000..e214d84 --- /dev/null +++ b/tests/src/cgeo/geocaching/utils/AngleUtilsTest.java @@ -0,0 +1,30 @@ +package cgeo.geocaching.utils; + +import android.test.AndroidTestCase; + +public class AngleUtilsTest extends AndroidTestCase { + + public static void testNormalize() { + assertEquals(0.0f, AngleUtils.normalize(0)); + assertEquals(0.0f, AngleUtils.normalize(360)); + assertEquals(0.0f, AngleUtils.normalize(720)); + assertEquals(0.0f, AngleUtils.normalize(-360)); + assertEquals(0.0f, AngleUtils.normalize(-720)); + assertEquals(1.0f, AngleUtils.normalize(721)); + assertEquals(359.0f, AngleUtils.normalize(-721)); + } + + public static void testDifference() { + assertEquals(0.0f, AngleUtils.difference(12, 12)); + assertEquals(0.0f, AngleUtils.difference(372, 12)); + assertEquals(0.0f, AngleUtils.difference(12, 372)); + assertEquals(10.0f, AngleUtils.difference(10, 20)); + assertEquals(10.0f, AngleUtils.difference(355, 5)); + assertEquals(10.0f, AngleUtils.difference(715, -715)); + assertEquals(-10.0f, AngleUtils.difference(20, 10)); + assertEquals(-10.0f, AngleUtils.difference(5, 355)); + assertEquals(-10.0f, AngleUtils.difference(-715, 715)); + assertEquals(-180.0f, AngleUtils.difference(-90, 90)); + assertEquals(-180.0f, AngleUtils.difference(90, -90)); + } +} |
