diff options
author | Arne Schwabe <arne@rfc2549.org> | 2014-04-20 21:38:19 +0200 |
---|---|---|
committer | Arne Schwabe <arne@rfc2549.org> | 2014-05-17 13:08:14 +0200 |
commit | be26c1845210a1c8824677ed6e2d093073ea5c84 (patch) | |
tree | 81d02773f4fd9edc5d05b44c770be89994a9c207 | |
parent | 496878826d638367c129b02e66f992202e0d36c9 (diff) | |
download | cgeo-be26c1845210a1c8824677ed6e2d093073ea5c84.zip cgeo-be26c1845210a1c8824677ed6e2d093073ea5c84.tar.gz cgeo-be26c1845210a1c8824677ed6e2d093073ea5c84.tar.bz2 |
Implement ActionBar using AppCompat in cgeo
This a first version of an ActionBar implementation with following properties:
- The application should be usuable (there still might be bugs left from the conversation to Action)
- Provides a more modern feeling on all devices
- gets rid of the "dots of shame" on Android 3.0+ devices
- The Maps classes MUST inherit from Activity instead of ActionBarActivity. There these classes use the old ActionBar on Android 2.3 devices and the real ActionBar on 3.0+
- This can be fixed when cgeo is ported to Google Maps API v2.0 API which usesFragment
- The Dialog classes (CachePopup and WaypointPopup) have been converted to DialogFragments
- The AppCombat themes provide no Theme.Dialog theme
- this will later ease using these Fragment in other Activities
- Use an almost empty activity which just shows the DialogFragment
- Use the 'old' ActionBar but which overflow menu button to fit into Holo Design Style
- Using a real ActionBar for Dialogs is not really support by Android and trying to force the frame into showing an Actionbar on a dialog leeds to strange bugs/effects
- Most of the icon are still the Android 2.3 Menu Icon. These need to be replaced with Holo Style Icons
- for most menu icon the ifRoom and/or withText attributes should be reviewed and set
- The ActionBar of the main Activity is transparent. This is more or less by accident but looks good
- Review Up Action of activities. Is going back to Main Activity always the semantically right thing to do?
- Shortpress/Longpress on the Actionbars Compass Icon for primary/secondary Navigation clashes the normal ActionBar behaviour of long pressing to show the text of the action
This commit contains many fixes and suggestions from rsudev
95 files changed, 1617 insertions, 959 deletions
diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml index 7836d07..14395ec 100644 --- a/main/AndroidManifest.xml +++ b/main/AndroidManifest.xml @@ -7,7 +7,7 @@ <uses-sdk android:minSdkVersion="9" - android:targetSdkVersion="9" /> + android:targetSdkVersion="19" /> <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> diff --git a/main/project.properties b/main/project.properties index a761287..cef9857 100644 --- a/main/project.properties +++ b/main/project.properties @@ -13,3 +13,4 @@ proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project. # Project target. target=Google Inc.:Google APIs:19 android.library.reference.1=../mapswithme-api +android.library.reference.2=../../sdkdir/extras/android/support/v7/appcompat
\ No newline at end of file diff --git a/main/res/drawable/ic_menu_myposition.xml b/main/res/drawable/ic_menu_myposition.xml new file mode 100644 index 0000000..62d5546 --- /dev/null +++ b/main/res/drawable/ic_menu_myposition.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<selector xmlns:android="http://schemas.android.com/apk/res/android"> + <item android:drawable="@drawable/actionbar_mylocation_on" android:state_checked="true"/> + <item android:drawable="@drawable/actionbar_mylocation_off" android:state_checked="false" /> +</selector>
\ No newline at end of file diff --git a/main/res/layout-land/compass_activity.xml b/main/res/layout-land/compass_activity.xml index 00e12bf..580bf76 100644 --- a/main/res/layout-land/compass_activity.xml +++ b/main/res/layout-land/compass_activity.xml @@ -5,8 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <LinearLayout android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout-v11/actionbar_maps.xml b/main/res/layout-v11/actionbar_maps.xml new file mode 100644 index 0000000..3e72717 --- /dev/null +++ b/main/res/layout-v11/actionbar_maps.xml @@ -0,0 +1,7 @@ +<?xml version="1.0" encoding="utf-8"?> + + <!-- Empty layout, on 11+ we have a real action bar --> +<merge xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" android:layout_height="match_parent"> + +</merge>
\ No newline at end of file diff --git a/main/res/layout/actionbar.xml b/main/res/layout/actionbar.xml deleted file mode 100644 index 098120c..0000000 --- a/main/res/layout/actionbar.xml +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - -</LinearLayout>
\ No newline at end of file diff --git a/main/res/layout/actionbar_button_compass.xml b/main/res/layout/actionbar_button_compass.xml deleted file mode 100644 index 932444b..0000000 --- a/main/res/layout/actionbar_button_compass.xml +++ /dev/null @@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <View style="@style/action_bar_separator" /> - - <ImageView - android:id="@+id/defaultNavigation" - style="@style/action_bar_action" - android:longClickable="true" - android:onClick="goDefaultNavigation" - android:src="@drawable/actionbar_compass_dark" /> - -</merge>
\ No newline at end of file diff --git a/main/res/layout/actionbar_button_map.xml b/main/res/layout/actionbar_button_map.xml deleted file mode 100644 index 9b2138a..0000000 --- a/main/res/layout/actionbar_button_map.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <View style="@style/action_bar_separator" /> - - <ImageView - style="@style/action_bar_action" - android:onClick="goMap" - android:src="@drawable/actionbar_map" /> - -</merge>
\ No newline at end of file diff --git a/main/res/layout/actionbar_button_myposition.xml b/main/res/layout/actionbar_button_myposition.xml deleted file mode 100644 index 1e91419..0000000 --- a/main/res/layout/actionbar_button_myposition.xml +++ /dev/null @@ -1,12 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <View style="@style/action_bar_separator" /> - - <ImageSwitcher - android:id="@+id/my_position" - style="@style/action_bar_action" /> - -</merge>
\ No newline at end of file diff --git a/main/res/layout/actionbar_button_search.xml b/main/res/layout/actionbar_button_search.xml deleted file mode 100644 index 2aa1a50..0000000 --- a/main/res/layout/actionbar_button_search.xml +++ /dev/null @@ -1,13 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <View style="@style/action_bar_separator" /> - - <ImageView - style="@style/action_bar_action" - android:onClick="goSearch" - android:src="@drawable/actionbar_search" /> - -</merge>
\ No newline at end of file diff --git a/main/res/layout/actionbar_maps.xml b/main/res/layout/actionbar_maps.xml new file mode 100644 index 0000000..61e3acc --- /dev/null +++ b/main/res/layout/actionbar_maps.xml @@ -0,0 +1,41 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/action_bar"> + + <!-- Add the up chevron to the icon --> + <ImageView + android:layout_width="wrap_content" + android:layout_height="match_parent" + android:src="@drawable/abc_ic_ab_back_holo_dark"/> + <ImageView + style="@style/action_bar_action" + android:layout_marginLeft="-13dp" + android:onClick="goHome" /> + + <View style="@style/action_bar_separator" /> + + <TextView + android:id="@+id/actionbar_title" + style="@style/action_bar_title" /> + + <ProgressBar + android:id="@+id/actionbar_progress" + style="@style/action_bar_progress" + android:visibility="gone" /> + + <View style="@style/action_bar_separator" /> + + <FrameLayout style="@style/action_bar_action"> + + <CheckBox + android:id="@+id/my_position" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_gravity="right" + android:button="@drawable/ic_menu_myposition" + android:checked="false" /> + </FrameLayout> + + <!-- No overflow (...) button here since this menu is only shown on Gingerbread, which never + features an overflow menu --> +</LinearLayout>
\ No newline at end of file diff --git a/main/res/layout/actionbar_popup.xml b/main/res/layout/actionbar_popup.xml new file mode 100644 index 0000000..0cab165 --- /dev/null +++ b/main/res/layout/actionbar_popup.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + style="@style/action_bar"> + + <TextView + android:id="@+id/actionbar_title" + style="@style/action_bar_title" /> + + <ProgressBar + android:id="@+id/actionbar_progress" + style="@style/action_bar_progress" + android:visibility="gone" /> + + <View style="@style/action_bar_separator" /> + + + <ImageView + android:id="@+id/defaultNavigation" + style="@style/action_bar_action" + android:longClickable="true" + android:src="@drawable/actionbar_compass_dark" /> + + <View style="@style/action_bar_separator" /> + + <ImageView + android:id="@+id/overflowActionBar" + style="@style/action_bar_action" + android:longClickable="true" + android:src="@drawable/abc_ic_menu_moreoverflow_normal_holo_dark" /> + + +</LinearLayout>
\ No newline at end of file diff --git a/main/res/layout/actionbar_progress.xml b/main/res/layout/actionbar_progress.xml deleted file mode 100644 index 54b5875..0000000 --- a/main/res/layout/actionbar_progress.xml +++ /dev/null @@ -1,5 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<ProgressBar xmlns:android="http://schemas.android.com/apk/res/android" - android:id="@+id/actionbar_progress" - style="@style/action_bar_progress" - android:visibility="gone" /> diff --git a/main/res/layout/actionbar_title.xml b/main/res/layout/actionbar_title.xml deleted file mode 100644 index 4fa5348..0000000 --- a/main/res/layout/actionbar_title.xml +++ /dev/null @@ -1,16 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <ImageView - style="@style/action_bar_action" - android:onClick="goHome" /> - - <View style="@style/action_bar_separator" /> - - <TextView - android:id="@+id/actionbar_title" - style="@style/action_bar_title" /> - -</merge>
\ No newline at end of file diff --git a/main/res/layout/actionbar_title_no_home.xml b/main/res/layout/actionbar_title_no_home.xml deleted file mode 100644 index 6295bdc..0000000 --- a/main/res/layout/actionbar_title_no_home.xml +++ /dev/null @@ -1,10 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<merge xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="match_parent" - android:layout_height="match_parent" > - - <TextView - android:id="@+id/actionbar_title" - style="@style/action_bar_title" /> - -</merge>
\ No newline at end of file diff --git a/main/res/layout/addresslist_activity.xml b/main/res/layout/addresslist_activity.xml index c48c28f..e5c6491 100644 --- a/main/res/layout/addresslist_activity.xml +++ b/main/res/layout/addresslist_activity.xml @@ -4,7 +4,7 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <include layout="@layout/actionbar" /> + <include layout="@layout/actionbar_maps" /> <ListView android:id="@android:id/list" diff --git a/main/res/layout/authorization_activity.xml b/main/res/layout/authorization_activity.xml index 28c1987..766db6e 100644 --- a/main/res/layout/authorization_activity.xml +++ b/main/res/layout/authorization_activity.xml @@ -5,8 +5,6 @@ android:orientation="vertical" android:visibility="visible" > - <include layout="@layout/actionbar" /> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/cachedetail_activity.xml b/main/res/layout/cachedetail_activity.xml index 3afe5f6..aa88355 100644 --- a/main/res/layout/cachedetail_activity.xml +++ b/main/res/layout/cachedetail_activity.xml @@ -6,13 +6,6 @@ android:background="?background_color"
android:orientation="vertical" >
- <LinearLayout style="@style/action_bar" >
-
- <include layout="@layout/actionbar_title" />
-
- <include layout="@layout/actionbar_button_compass" />
- </LinearLayout>
-
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
diff --git a/main/res/layout/cachelist_spinneritem.xml b/main/res/layout/cachelist_spinneritem.xml new file mode 100644 index 0000000..c8a589f --- /dev/null +++ b/main/res/layout/cachelist_spinneritem.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> + +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" + android:orientation="vertical" android:layout_width="match_parent" + android:layout_height="?attr/dropdownListPreferredItemHeight" + android:minHeight="?attr/dropdownListPreferredItemHeight" + style="?attr/spinnerDropDownItemStyle" + android:layout_gravity="left|center_vertical" + > + + + <TextView + android:id="@android:id/text1" + android:textAppearance="?android:attr/textAppearanceMedium" + tools:text="This is the title" + android:singleLine="true" + android:ellipsize="marquee" + android:layout_width="match_parent" + android:layout_height="wrap_content" /> + + + <TextView + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:singleLine="true" + android:ellipsize="marquee" + android:textAppearance="?android:attr/textAppearanceSmall" + tools:text="This is the subtitle" + android:id="@android:id/text2" /> + +</LinearLayout>
\ No newline at end of file diff --git a/main/res/layout/cacheslist_activity.xml b/main/res/layout/cacheslist_activity.xml index c267f60..a12adad 100644 --- a/main/res/layout/cacheslist_activity.xml +++ b/main/res/layout/cacheslist_activity.xml @@ -4,15 +4,6 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - - <include layout="@layout/actionbar_progress" /> - - <include layout="@layout/actionbar_button_map" /> - </LinearLayout> - <include layout="@layout/filter_bar" /> <RelativeLayout diff --git a/main/res/layout/cacheslist_item.xml b/main/res/layout/cacheslist_item.xml index 744ca30..b43310e 100644 --- a/main/res/layout/cacheslist_item.xml +++ b/main/res/layout/cacheslist_item.xml @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:cc="http://schemas.android.com/apk/res/cgeo.geocaching" + xmlns:cgeo="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/one_cache" android:layout_width="fill_parent" @@ -111,7 +111,7 @@ android:minHeight="28px" android:minWidth="28px" android:visibility="gone" - cc:skin="?compass" + cgeo:skin="?compass" tools:ignore="PxUsage" /> <ImageView diff --git a/main/res/layout/compass_activity.xml b/main/res/layout/compass_activity.xml index f0ab5ef..a9c67cf 100644 --- a/main/res/layout/compass_activity.xml +++ b/main/res/layout/compass_activity.xml @@ -5,8 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <RelativeLayout android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/editwaypoint_activity.xml b/main/res/layout/editwaypoint_activity.xml index cd0b46c..a08a3c8 100644 --- a/main/res/layout/editwaypoint_activity.xml +++ b/main/res/layout/editwaypoint_activity.xml @@ -5,8 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/gpx.xml b/main/res/layout/gpx.xml index 948c265..368f3ae 100644 --- a/main/res/layout/gpx.xml +++ b/main/res/layout/gpx.xml @@ -4,8 +4,6 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <Button android:id="@+id/select_dir" style="@style/button_full" diff --git a/main/res/layout/images_activity.xml b/main/res/layout/images_activity.xml index ccd8499..861fa7e 100644 --- a/main/res/layout/images_activity.xml +++ b/main/res/layout/images_activity.xml @@ -5,8 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <include layout="@layout/cachedetail_images_page" /> </LinearLayout>
\ No newline at end of file diff --git a/main/res/layout/imageselect_activity.xml b/main/res/layout/imageselect_activity.xml index fd8eaea..aac7e47 100644 --- a/main/res/layout/imageselect_activity.xml +++ b/main/res/layout/imageselect_activity.xml @@ -5,13 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - - <include layout="@layout/actionbar_progress" /> - </LinearLayout> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/logcache_activity.xml b/main/res/layout/logcache_activity.xml index 4bbb441..cc34633 100644 --- a/main/res/layout/logcache_activity.xml +++ b/main/res/layout/logcache_activity.xml @@ -5,13 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - - <include layout="@layout/actionbar_progress" /> - </LinearLayout> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/logtrackable_activity.xml b/main/res/layout/logtrackable_activity.xml index 7791409..ef345a1 100644 --- a/main/res/layout/logtrackable_activity.xml +++ b/main/res/layout/logtrackable_activity.xml @@ -5,13 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - - <include layout="@layout/actionbar_progress" /> - </LinearLayout> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/main_activity.xml b/main/res/layout/main_activity.xml index 9e124a1..29a445f 100644 --- a/main/res/layout/main_activity.xml +++ b/main/res/layout/main_activity.xml @@ -5,17 +5,6 @@ android:layout_height="fill_parent" android:layout_gravity="center" > - <LinearLayout style="@style/action_bar" > - - <ImageView - style="@style/action_bar_icon_cgeo" - android:onClick="showAbout" /> - - <TextView style="@style/action_bar_title" /> - - <include layout="@layout/actionbar_button_search" /> - </LinearLayout> - <fragment android:id="@+id/status" android:name="cgeo.geocaching.StatusFragment" diff --git a/main/res/layout/map_google.xml b/main/res/layout/map_google.xml index 5e4d82d..471c2b8 100644 --- a/main/res/layout/map_google.xml +++ b/main/res/layout/map_google.xml @@ -4,14 +4,9 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - <include layout="@layout/actionbar_title" /> - <include layout="@layout/actionbar_progress" /> - - <include layout="@layout/actionbar_button_myposition" /> - </LinearLayout> + <include layout="@layout/actionbar_maps" /> <include layout="@layout/filter_bar" /> diff --git a/main/res/layout/map_mapsforge.xml b/main/res/layout/map_mapsforge.xml index f05ddb0..c44a3ee 100644 --- a/main/res/layout/map_mapsforge.xml +++ b/main/res/layout/map_mapsforge.xml @@ -4,14 +4,7 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - - <include layout="@layout/actionbar_progress" /> - - <include layout="@layout/actionbar_button_myposition" /> - </LinearLayout> + <include layout="@layout/actionbar_maps" /> <include layout="@layout/filter_bar" /> diff --git a/main/res/layout/map_mapsforge_old.xml b/main/res/layout/map_mapsforge_old.xml index ff2b9af..daa5f74 100644 --- a/main/res/layout/map_mapsforge_old.xml +++ b/main/res/layout/map_mapsforge_old.xml @@ -4,14 +4,7 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title" /> - - <include layout="@layout/actionbar_progress" /> - - <include layout="@layout/actionbar_button_myposition" /> - </LinearLayout> + <include layout="@layout/actionbar_maps" /> <include layout="@layout/filter_bar" /> diff --git a/main/res/layout/navigateanypoint_activity.xml b/main/res/layout/navigateanypoint_activity.xml index baa568c..22a29af 100644 --- a/main/res/layout/navigateanypoint_activity.xml +++ b/main/res/layout/navigateanypoint_activity.xml @@ -5,8 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <ListView android:id="@+id/historyList" android:layout_width="match_parent" diff --git a/main/res/layout/popup.xml b/main/res/layout/popup.xml index 584eb58..de94d18 100644 --- a/main/res/layout/popup.xml +++ b/main/res/layout/popup.xml @@ -1,21 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:tools="http://schemas.android.com/tools" android:layout_width="fill_parent" android:layout_height="fill_parent" android:background="?background_color_transparent" - android:orientation="vertical" > - - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title_no_home" /> - - <include layout="@layout/actionbar_button_compass" /> - </LinearLayout> + android:orientation="vertical" + tools:context=".CachePopup"> + <include layout="@layout/actionbar_popup" /> <ScrollView android:id="@+id/details_list_box" - android:layout_width="fill_parent" - android:layout_height="fill_parent" + android:layout_width="wrap_content" + android:layout_height="wrap_content" android:orientation="vertical" android:padding="4dip" > @@ -50,6 +46,7 @@ <TextView android:id="@+id/offline_text" + tools:text="@string/cache_offline_not_ready" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_alignParentLeft="true" diff --git a/main/res/layout/search_activity.xml b/main/res/layout/search_activity.xml index 28256f1..f7a1a70 100644 --- a/main/res/layout/search_activity.xml +++ b/main/res/layout/search_activity.xml @@ -6,8 +6,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/staticmaps_activity.xml b/main/res/layout/staticmaps_activity.xml index 2ffa70d..1d7c1f5 100644 --- a/main/res/layout/staticmaps_activity.xml +++ b/main/res/layout/staticmaps_activity.xml @@ -4,8 +4,6 @@ android:layout_height="fill_parent" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <ScrollView android:layout_width="fill_parent" android:layout_height="fill_parent" diff --git a/main/res/layout/usefulapps_activity.xml b/main/res/layout/usefulapps_activity.xml index 84bcf39..fa2112e 100644 --- a/main/res/layout/usefulapps_activity.xml +++ b/main/res/layout/usefulapps_activity.xml @@ -5,8 +5,6 @@ android:background="?background_color" android:orientation="vertical" > - <include layout="@layout/actionbar" /> - <ListView android:id="@+id/apps_list" android:layout_width="fill_parent" diff --git a/main/res/layout/viewpager_activity.xml b/main/res/layout/viewpager_activity.xml index 14120e0..aa88355 100644 --- a/main/res/layout/viewpager_activity.xml +++ b/main/res/layout/viewpager_activity.xml @@ -6,8 +6,6 @@ android:background="?background_color"
android:orientation="vertical" >
- <include layout="@layout/actionbar" />
-
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="fill_parent"
diff --git a/main/res/layout/waypoint_popup.xml b/main/res/layout/waypoint_popup.xml index c8b257c..287fc3a 100644 --- a/main/res/layout/waypoint_popup.xml +++ b/main/res/layout/waypoint_popup.xml @@ -5,12 +5,7 @@ android:background="?background_color_transparent" android:orientation="vertical" > - <LinearLayout style="@style/action_bar" > - - <include layout="@layout/actionbar_title_no_home" /> - - <include layout="@layout/actionbar_button_compass" /> - </LinearLayout> + <include layout="@layout/actionbar_popup" /> <ScrollView android:id="@+id/details_list_box" diff --git a/main/res/menu/abstract_logging_activity.xml b/main/res/menu/abstract_logging_activity.xml index b926dd1..a7841a5 100644 --- a/main/res/menu/abstract_logging_activity.xml +++ b/main/res/menu/abstract_logging_activity.xml @@ -1,21 +1,25 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_signature" android:icon="@drawable/ic_menu_edit" - android:title="@string/init_signature"> + android:title="@string/init_signature" + cgeo:showAsAction="ifRoom|withText"> </item> <item android:id="@+id/menu_templates" android:icon="@drawable/ic_menu_add" - android:title="@string/log_add"> + android:title="@string/log_add" + cgeo:showAsAction="ifRoom|withText"> <menu /> <!-- filled dynamically --> </item> <item android:id="@+id/menu_smilies" android:icon="@drawable/ic_menu_emoticons" - android:title="@string/log_smilies"> + android:title="@string/log_smilies" + cgeo:showAsAction="ifRoom|withText"> <menu /> <!-- filled dynamically --> </item> diff --git a/main/res/menu/cache_list_context.xml b/main/res/menu/cache_list_context.xml index 2767a2e..8d52654 100644 --- a/main/res/menu/cache_list_context.xml +++ b/main/res/menu/cache_list_context.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_default_navigation" @@ -9,40 +10,49 @@ <item android:id="@+id/menu_navigate" android:icon="@drawable/ic_menu_mapmode" - android:title="@string/cache_menu_navigate"> + android:title="@string/cache_menu_navigate" + cgeo:showAsAction="ifRoom|withText"> </item> <item android:id="@+id/menu_cache_details" - android:title="@string/cache_menu_details"> + android:title="@string/cache_menu_details" + cgeo:showAsAction="ifRoom|withText"> </item> <item android:id="@+id/menu_log_visit_offline" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_menu_visit_offline"> </item> <item android:id="@+id/menu_log_visit" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_menu_visit"> </item> <item android:id="@+id/menu_drop_cache" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_offline_drop"> </item> <item android:id="@+id/menu_move_to_list" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_menu_move_list"> </item> <item android:id="@+id/menu_export" + cgeo:showAsAction="ifRoom|withText" android:title="@string/export"> </item> <item android:id="@+id/menu_refresh" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_menu_refresh"> </item> <item android:id="@+id/menu_store_cache" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_offline_store"> </item> diff --git a/main/res/menu/cache_list_options.xml b/main/res/menu/cache_list_options.xml index 418d2de..d743c71 100644 --- a/main/res/menu/cache_list_options.xml +++ b/main/res/menu/cache_list_options.xml @@ -1,14 +1,23 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item + android:id="@+id/menu_show_on_map" + android:icon="@drawable/actionbar_map" + cgeo:showAsAction="ifRoom" + android:title="@string/caches_on_map"> + </item> + <item android:id="@+id/menu_filter" android:icon="@drawable/ic_menu_filter" + cgeo:showAsAction="ifRoom|withText" android:title="@string/caches_filter"> </item> <item android:id="@+id/menu_sort" android:icon="@drawable/ic_menu_sort_alphabetically" + cgeo:showAsAction="ifRoom|withText" android:title="@string/caches_sort"> </item> <item diff --git a/main/res/menu/cache_options.xml b/main/res/menu/cache_options.xml index d2951f4..2bd0c44 100644 --- a/main/res/menu/cache_options.xml +++ b/main/res/menu/cache_options.xml @@ -1,45 +1,55 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > - +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_default_navigation" android:icon="@drawable/ic_menu_compass" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_navigate"> <!-- will be replaced --> </item> <item android:id="@+id/menu_navigate" android:icon="@drawable/ic_menu_mapmode" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_navigate"> </item> <item + android:id="@+id/menu_share" + android:icon="@drawable/ic_menu_share" + cgeo:showAsAction="ifRoom" + cgeo:actionProviderClass="android.support.v7.widget.ShareActionProvider" + android:title="@string/cache_menu_share"> + </item> + <item android:id="@+id/menu_calendar" android:icon="@drawable/ic_menu_agenda" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_event"> </item> <item android:id="@+id/menu_log_visit_offline" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_visit_offline"> </item> <item android:id="@+id/menu_log_visit" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_visit"> </item> <item android:id="@+id/menu_caches_around" android:icon="@drawable/ic_menu_rotate" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_around"> </item> <item android:id="@+id/menu_show_in_browser" android:icon="@drawable/ic_menu_info_details" + cgeo:showAsAction="ifRoom" android:title="@string/cache_menu_browser"> </item> - <item - android:id="@+id/menu_share" - android:icon="@drawable/ic_menu_share" - android:title="@string/cache_menu_share"> - </item> + </menu>
\ No newline at end of file diff --git a/main/res/menu/compass_activity_options.xml b/main/res/menu/compass_activity_options.xml index 01c7d36..bfdbf48 100644 --- a/main/res/menu/compass_activity_options.xml +++ b/main/res/menu/compass_activity_options.xml @@ -1,36 +1,43 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_switch_compass_gps" android:icon="@drawable/ic_menu_compass" + cgeo:showAsAction="ifRoom|withText" android:title="@string/use_gps"> <!-- will be replaced in code --> </item> <item android:id="@+id/menu_map" android:icon="@drawable/ic_menu_mapmode" + cgeo:showAsAction="ifRoom|withText" android:title="@string/caches_on_map"> </item> <item android:id="@+id/menu_edit_destination" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom|withText" android:title="@string/destination_set"> </item> <item android:id="@+id/menu_select_destination" android:icon="@drawable/ic_menu_myplaces" + cgeo:showAsAction="ifRoom|withText" android:title="@string/destination_select"> <menu /> <!-- filled dynamically --> </item> <item android:id="@+id/menu_tts_start" android:icon="@drawable/ic_menu_start_conversation" + cgeo:showAsAction="ifRoom|withText" android:title="@string/tts_start"> </item> <item android:id="@+id/menu_tts_stop" android:icon="@drawable/ic_menu_start_conversation" android:title="@string/tts_stop" + cgeo:showAsAction="ifRoom|withText" android:visible="false"> </item> diff --git a/main/res/menu/details_context.xml b/main/res/menu/details_context.xml index 3125459..53f326a 100644 --- a/main/res/menu/details_context.xml +++ b/main/res/menu/details_context.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_copy" diff --git a/main/res/menu/images_list_context.xml b/main/res/menu/images_list_context.xml index 75d0ca0..0726267 100644 --- a/main/res/menu/images_list_context.xml +++ b/main/res/menu/images_list_context.xml @@ -1,12 +1,15 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/image_open_file" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_image_open_file"> </item> <item android:id="@+id/image_open_browser" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_image_open_browser"> </item> diff --git a/main/res/menu/logging_ui.xml b/main/res/menu/logging_ui.xml index a8622c5..5baacfc 100644 --- a/main/res/menu/logging_ui.xml +++ b/main/res/menu/logging_ui.xml @@ -1,14 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_log_visit_offline" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_menu_visit_offline"> </item> <item android:id="@+id/menu_log_visit" android:icon="@drawable/ic_menu_edit" + cgeo:showAsAction="ifRoom|withText" android:title="@string/cache_menu_visit"> </item> diff --git a/main/res/menu/main_activity_options.xml b/main/res/menu/main_activity_options.xml index fc949dc..bf9124f 100644 --- a/main/res/menu/main_activity_options.xml +++ b/main/res/menu/main_activity_options.xml @@ -1,34 +1,49 @@ <?xml version="1.0" encoding="utf-8"?>
-<menu xmlns:android="http://schemas.android.com/apk/res/android" >
+<menu xmlns:android="http://schemas.android.com/apk/res/android"
+ xmlns:cgeo="http://schemas.android.com/apk/res-auto">
+
+ <!-- TODO: use ic_action_search -->
+ <item
+ style="@style/action_bar_action"
+ android:id="@+id/menu_gosearch"
+ cgeo:showAsAction="always"
+ cgeo:actionViewClass="android.support.v7.widget.SearchView"
+ android:icon="@drawable/actionbar_search" />
<item
android:id="@+id/menu_settings"
android:icon="@drawable/ic_menu_preferences"
+ cgeo:showAsAction="ifRoom"
android:title="@string/menu_settings">
</item>
<item
android:id="@+id/menu_history"
android:icon="@drawable/ic_menu_recent_history"
+ cgeo:showAsAction="ifRoom"
android:title="@string/menu_history">
</item>
<item
android:id="@+id/menu_pocket_queries"
android:icon="@drawable/ic_menu_account_list"
+ cgeo:showAsAction="ifRoom"
android:title="@string/menu_pocket_queries">
</item>
<item
android:id="@+id/menu_helpers"
android:icon="@drawable/ic_menu_shopping"
+ cgeo:showAsAction="ifRoom|"
android:title="@string/menu_helpers">
</item>
<item
android:id="@+id/menu_scan"
android:icon="@drawable/ic_menu_barcode"
+ cgeo:showAsAction="ifRoom"
android:title="@string/menu_scan_geo">
</item>
<item
android:id="@+id/menu_about"
android:icon="@drawable/ic_menu_info_details"
+ cgeo:showAsAction="ifRoom"
android:title="@string/menu_about">
</item>
</menu>
\ No newline at end of file diff --git a/main/res/menu/map_activity.xml b/main/res/menu/map_activity.xml index d81a49b..3dfc5ae 100644 --- a/main/res/menu/map_activity.xml +++ b/main/res/menu/map_activity.xml @@ -1,9 +1,19 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> + + <item android:id="@+id/menu_toggle_mypos" + android:title="@string/menu_centerposition" + android:icon="@drawable/ic_menu_myposition" + cgeo:showAsAction="always" + android:showAsAction="always" + + /> <item android:id="@+id/menu_select_mapview" android:icon="@drawable/ic_menu_mapmode" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_view_map"> <menu> <group @@ -15,37 +25,44 @@ <item android:id="@+id/menu_map_live" android:icon="@drawable/ic_menu_refresh" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_live_disable"> </item> <item android:id="@+id/menu_store_caches" android:enabled="false" android:icon="@drawable/ic_menu_set_as" + cgeo:showAsAction="ifRoom|withText" android:title="@string/caches_store_offline"> </item> <item android:id="@+id/submenu_modes" android:icon="@drawable/ic_menu_mark" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_modes"> <menu> <item android:id="@+id/menu_trail_mode" android:icon="@drawable/ic_menu_trail" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_trail_hide"> </item> <item android:id="@+id/menu_circle_mode" android:icon="@drawable/ic_menu_circle" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_circles_hide"> </item> <item android:id="@+id/menu_mycaches_mode" android:icon="@android:drawable/ic_menu_myplaces" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_mycaches_hide"> </item> <item android:id="@+id/menu_theme_mode" android:icon="@drawable/ic_menu_preferences" + cgeo:showAsAction="ifRoom|withText" android:title="@string/map_theme_select"> </item> </menu> diff --git a/main/res/menu/navigate_any_point_activity_options.xml b/main/res/menu/navigate_any_point_activity_options.xml index 4f199e2..a17405b 100644 --- a/main/res/menu/navigate_any_point_activity_options.xml +++ b/main/res/menu/navigate_any_point_activity_options.xml @@ -1,25 +1,30 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_navigate" android:icon="@drawable/ic_menu_mapmode" - android:title="@string/cache_menu_navigate"> + android:title="@string/cache_menu_navigate" + cgeo:showAsAction="ifRoom"> </item> <item android:id="@+id/menu_default_navigation" android:icon="@drawable/ic_menu_compass" - android:title="@string/cache_menu_navigate"> <!-- will be replaced in code --> + android:title="@string/cache_menu_navigate" + cgeo:showAsAction="ifRoom"> <!-- will be replaced in code --> </item> <item android:id="@+id/menu_caches_around" android:icon="@drawable/ic_menu_rotate" - android:title="@string/cache_menu_around"> + android:title="@string/cache_menu_around" + cgeo:showAsAction="ifRoom"> </item> <item android:id="@+id/menu_clear_history" android:icon="@drawable/ic_menu_delete" - android:title="@string/search_clear_history"> + android:title="@string/search_clear_history" + cgeo:showAsAction="ifRoom"> </item> </menu>
\ No newline at end of file diff --git a/main/res/menu/search_activity_options.xml b/main/res/menu/search_activity_options.xml index fcd7401..c4ee62b 100644 --- a/main/res/menu/search_activity_options.xml +++ b/main/res/menu/search_activity_options.xml @@ -1,10 +1,13 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_search_own_caches" android:icon="@drawable/ic_menu_myplaces" - android:title="@string/search_own_caches"> + android:title="@string/search_own_caches" + cgeo:showAsAction="ifRoom|withText" + > </item> </menu>
\ No newline at end of file diff --git a/main/res/menu/static_maps_activity_options.xml b/main/res/menu/static_maps_activity_options.xml index 7850c92..8621153 100644 --- a/main/res/menu/static_maps_activity_options.xml +++ b/main/res/menu/static_maps_activity_options.xml @@ -1,9 +1,11 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_refresh" android:icon="@drawable/ic_menu_refresh" + cgeo:showAsAction="ifRoom" android:title="@string/cache_offline_refresh"> </item> diff --git a/main/res/menu/trackable_activity.xml b/main/res/menu/trackable_activity.xml index ddf45f6..60eaa9e 100644 --- a/main/res/menu/trackable_activity.xml +++ b/main/res/menu/trackable_activity.xml @@ -1,14 +1,17 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_log_touch" android:icon="@drawable/ic_menu_agenda" + cgeo:showAsAction="ifRoom|withText" android:title="@string/trackable_log_touch"> </item> <item android:id="@+id/menu_browser_trackable" android:icon="@drawable/ic_menu_info_details" + cgeo:showAsAction="ifRoom|withText" android:title="@string/trackable_browser_open"> </item> diff --git a/main/res/menu/waypoint_options.xml b/main/res/menu/waypoint_options.xml index f03cca6..5aaeac2 100644 --- a/main/res/menu/waypoint_options.xml +++ b/main/res/menu/waypoint_options.xml @@ -1,5 +1,6 @@ <?xml version="1.0" encoding="utf-8"?> -<menu xmlns:android="http://schemas.android.com/apk/res/android" > +<menu xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:cgeo="http://schemas.android.com/apk/res-auto"> <item android:id="@+id/menu_waypoint_reset_cache_coords" diff --git a/main/res/values/attrs.xml b/main/res/values/attrs.xml index ab1db9f..be33f09 100644 --- a/main/res/values/attrs.xml +++ b/main/res/values/attrs.xml @@ -42,7 +42,6 @@ <!-- attributes for custom made preferences --> - <attr name="title" format="string" /> <attr name="text" format="string" /> <attr name="url" format="string" /> <attr name="urlButton" format="string" /> diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index a9d92d0..0a8d3fd 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -247,6 +247,8 @@ <string name="loc_trying">Trying to Locate</string> <string name="loc_no_addr">Unknown address</string> <string name="loc_gps_disabled">GPS disabled</string> + <string name="menu_centerposition">Center on my position</string> + <!-- standard menu --> <string name="menu_about">About c:geo</string> @@ -1286,4 +1288,5 @@ <!-- shortcuts --> <string name="cgeo_shortcut">c:geo shortcut</string> <string name="create_shortcut">Create shortcut</string> + </resources> diff --git a/main/res/values/styles.xml b/main/res/values/styles.xml index c566122..ffcb6aa 100644 --- a/main/res/values/styles.xml +++ b/main/res/values/styles.xml @@ -70,7 +70,7 @@ <item name="android:padding">2dip</item> <item name="android:scaleType">center</item> <item name="android:focusable">true</item> - <item name="android:src">@drawable/actionbar_home</item> + <item name="android:src">@drawable/actionbar_cgeo</item> <item name="android:background">@drawable/actionbar_button</item> </style> @@ -102,6 +102,10 @@ <item name="android:text">c:geo</item> </style> + <style name="actionbar_myposition"> + <item name="android:button">@drawable/ic_menu_myposition</item> + </style> + <!-- button: full width --> <style name="button_full" parent="button"> <item name="android:layout_width">fill_parent</item> diff --git a/main/res/values/themes.xml b/main/res/values/themes.xml index ed64ef5..c5bdae1 100644 --- a/main/res/values/themes.xml +++ b/main/res/values/themes.xml @@ -1,15 +1,39 @@ <?xml version="1.0" encoding="utf-8"?> <resources> - <style name="cgeo_main" parent="android:style/Theme.Wallpaper.NoTitleBar"> + + <style name="cgeo_main" parent="@style/Theme.AppCompat"> + + <!-- copy the style elements of the Wallpaper theme since AppCombat has no Wallpaper theme --> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:colorBackgroundCacheHint">@null</item> + <item name="android:windowShowWallpaper">true</item> + <!-- system elements --> <item name="android:windowContentOverlay">@null</item> + + </style> + + <style name="cgeo" parent="@style/Theme.AppCompat"> + + + <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="cgeo" parent="android:style/Theme.NoTitleBar"> - <!-- system elements --> + <!-- Identical to cgeo aside from different parent style --> + <style name="cgeo_light" parent="@style/Theme.AppCompat.Light.DarkActionBar"> + + <item name="android:buttonStyle">@style/button</item> <item name="android:editTextStyle">@style/edittext</item> <item name="android:windowContentOverlay">@null</item> @@ -21,6 +45,8 @@ <item name="button_color_disabled">@color/button_disabled</item> </style> + + <style name="dark" parent="cgeo"> <!-- own values: colors --> @@ -50,7 +76,7 @@ <item name="compass">0</item> </style> - <style name="light" parent="cgeo"> + <style name="light" parent="cgeo_light"> <!-- own values: colors --> <item name="android:windowBackground">@color/just_white</item> @@ -80,16 +106,35 @@ <item name="compass">1</item> </style> - <style name="cgeo_popup" parent="android:style/Theme.Dialog"> + + <style name="Theme.AppCompat.Translucent.Light" parent="Theme.AppCompat.Light.DarkActionBar"> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:colorBackgroundCacheHint">@null</item> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowAnimationStyle">@android:style/Animation</item> + </style> + + <style name="Theme.AppCompat.Translucent" parent="Theme.AppCompat"> + <item name="android:windowBackground">@android:color/transparent</item> + <item name="android:colorBackgroundCacheHint">@null</item> + <item name="android:windowIsTranslucent">true</item> + <item name="android:windowAnimationStyle">@android:style/Animation</item> + </style> + + <style name="cgeo_popup" parent="Theme.AppCompat.Translucent.Light"> <!-- system elements --> <item name="android:buttonStyle">@style/button</item> <item name="android:editTextStyle">@style/edittext</item> <item name="android:windowNoTitle">true</item> - </style> + </style> <!-- TODO: Popup probably doesn't need all these fields set. Should delete unnecessary ones. --> - <style name="popup_dark" parent="cgeo_popup"> + <style name="popup_dark" parent="Theme.AppCompat.Translucent"> + <!-- system elements --> + <item name="android:buttonStyle">@style/button</item> + <item name="android:editTextStyle">@style/edittext</item> + <item name="android:windowNoTitle">true</item> <!-- own values: colors --> <item name="just_color">@color/just_black</item> @@ -153,7 +198,7 @@ <item name="compass">1</item> </style> - <style name="settings" parent="android:Theme"> + <style name="settings" parent="@style/Theme.AppCompat"> <item name="settings_cloud">@drawable/settings_cloud_white</item> <item name="settings_details">@drawable/settings_details_white</item> <item name="settings_eye">@drawable/settings_eye_white</item> @@ -165,7 +210,7 @@ <item name="settings_info_icon">@drawable/settings_info_icon_white</item> </style> - <style name="settings.light" parent="android:Theme.Light"> + <style name="settings.light" parent="@style/Theme.AppCompat.Light"> <item name="settings_cloud">@drawable/settings_cloud_black</item> <item name="settings_details">@drawable/settings_details_black</item> <item name="settings_eye">@drawable/settings_eye_black</item> diff --git a/main/src/cgeo/geocaching/AbstractDialogFragment.java b/main/src/cgeo/geocaching/AbstractDialogFragment.java new file mode 100644 index 0000000..09a3bfc --- /dev/null +++ b/main/src/cgeo/geocaching/AbstractDialogFragment.java @@ -0,0 +1,354 @@ +package cgeo.geocaching; + +import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; +import cgeo.geocaching.enumerations.CacheSize; +import cgeo.geocaching.enumerations.LoadFlags; +import cgeo.geocaching.gcvote.GCVote; +import cgeo.geocaching.gcvote.GCVoteRating; +import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.geopoint.Units; +import cgeo.geocaching.sensors.GeoDirHandler; +import cgeo.geocaching.sensors.IGeoData; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.ui.CacheDetailsCreator; +import cgeo.geocaching.ui.LoggingUI; +import cgeo.geocaching.utils.Log; + +import rx.Observable; +import rx.Subscription; +import rx.android.observables.AndroidObservable; +import rx.functions.Action1; +import rx.functions.Func0; +import rx.schedulers.Schedulers; +import rx.subscriptions.Subscriptions; + +import android.annotation.TargetApi; +import android.content.DialogInterface; +import android.content.res.Resources; +import android.os.Build; +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v7.widget.PopupMenu; +import android.view.ContextMenu; +import android.view.Menu; +import android.view.MenuInflater; +import android.view.MenuItem; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.TextView; + +public abstract class AbstractDialogFragment extends DialogFragment implements CacheMenuHandler.ActivityInterface, PopupMenu.OnMenuItemClickListener, MenuItem.OnMenuItemClickListener { + protected CgeoApplication app = null; + protected Resources res = null; + protected String geocode; + protected CacheDetailsCreator details; + + private Subscription resumeSubscription = Subscriptions.empty(); + private TextView cacheDistance = null; + + + protected static final String GEOCODE_ARG= "GEOCODE"; + protected static final String WAYPOINT_ARG= "WAYPOINT"; + + protected Geocache cache; + + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + res = getResources(); + app = (CgeoApplication) getActivity().getApplication(); + setHasOptionsMenu(true); + } + + protected void initCustomActionBar(View v) + { + final ImageView defaultNavigationImageView = (ImageView) v.findViewById(R.id.defaultNavigation); + defaultNavigationImageView.setOnLongClickListener(new View.OnLongClickListener() { + @Override + public boolean onLongClick(View v) { + startDefaultNavigation2(); + return true; + } + }); + defaultNavigationImageView.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + navigateTo(); + } + }); + + final View overflowActionBar = v.findViewById(R.id.overflowActionBar); + overflowActionBar.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + showPopup(v); + } + }); + /* Use a context menu instead popup where the popup menu is not working */ + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + registerForContextMenu(overflowActionBar); + } + + } + + final public void setTitle(final CharSequence title) { + final TextView titleview = (TextView) getView().findViewById(R.id.actionbar_title); + if (titleview != null) { + titleview.setText(title); + + } + } + + @Override + public void onStart() { + super.onStart(); + geocode = getArguments().getString(GEOCODE_ARG); + init(); + } + + + protected void showPopup(View view) + { + // For reason I totally not understand the PopupMenu from Appcompat is broken beyond + // repair. Chicken out here and show the old menu on Gingerbread. + // The "correct" way of implementing this is stil in + // showPopupCompat(view) + + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.HONEYCOMB) { + view.showContextMenu(); + } else { + showPopupHoneycomb(view); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private void showPopupHoneycomb(View view) { + android.widget.PopupMenu popupMenu = new android.widget.PopupMenu(getActivity(), view); + CacheMenuHandler.addMenuItems(new MenuInflater(getActivity()), popupMenu.getMenu(), cache); + popupMenu.setOnMenuItemClickListener( + new android.widget.PopupMenu.OnMenuItemClickListener() { + @Override + public boolean onMenuItemClick(MenuItem item) { + return AbstractDialogFragment.this.onMenuItemClick(item); + } + } + ); + popupMenu.show(); + } + + protected void showPopupCompat(View view) + { + PopupMenu popupMenu = new PopupMenu(getActivity(), view); + + // Directly instantiate SupportMenuInflater instead of getActivity().getMenuinflator + // getMenuinflator will throw a NPE since it tries to get the not displayed ActionBar + // menuinflator = getActivity().getMenuInflater(); + // MenuInflater menuinflator = new SupportMenuInflater(getActivity()); + CacheMenuHandler.addMenuItems(popupMenu.getMenuInflater(), popupMenu.getMenu(), cache); + popupMenu.setOnMenuItemClickListener(this); + popupMenu.show(); + } + + + protected void init() + { + cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); + + if (cache == null) { + ((AbstractActivity) getActivity()).showToast(res.getString(R.string.err_detail_cache_find)); + + getActivity().finish(); + return; + } + + geocode = cache.getGeocode(); + } + + @Override + public void onResume() { + super.onResume(); + this.resumeSubscription = geoUpdate.start(GeoDirHandler.UPDATE_GEODATA); + init(); + } + + + @Override + public void onPause() { + resumeSubscription.unsubscribe(); + super.onPause(); + } + + + private void aquireGCVote() { + if (!Settings.isRatingWanted()) { + return; + } + if (!cache.supportsGCVote()) { + return; + } + AndroidObservable.bindActivity(getActivity(), Observable.defer(new Func0<Observable<GCVoteRating>>() { + @Override + public Observable<GCVoteRating> call() { + final GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode); + return rating != null ? Observable.just(rating) : Observable.<GCVoteRating>empty(); + } + })).subscribe(new Action1<GCVoteRating>() { + @Override + public void call(final GCVoteRating rating) { + cache.setRating(rating.getRating()); + cache.setVotes(rating.getVotes()); + DataStore.saveChangedCache(cache); + details.addRating(cache); + } + }, Schedulers.io()); + } + + protected final void addCacheDetails() { + assert cache != null; + // cache type + final String cacheType = cache.getType().getL10n(); + final String cacheSize = cache.getSize() != CacheSize.UNKNOWN ? " (" + cache.getSize().getL10n() + ")" : ""; + details.add(R.string.cache_type, cacheType + cacheSize); + + details.add(R.string.cache_geocode, cache.getGeocode()); + details.addCacheState(cache); + + details.addDistance(cache, cacheDistance); + cacheDistance = details.getValueView(); + + details.addDifficulty(cache); + details.addTerrain(cache); + details.addEventDate(cache); + + // rating + if (cache.getRating() > 0) { + details.addRating(cache); + } else { + aquireGCVote(); + } + + // favorite count + details.add(R.string.cache_favorite, cache.getFavoritePoints() + "×"); + + // more details + final Button buttonMore = (Button) getView().findViewById(R.id.more_details); + + buttonMore.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(View arg0) { + CacheDetailActivity.startActivity(getActivity(), geocode); + getActivity().finish(); + } + }); + + /* Only working combination as it seems */ + registerForContextMenu(buttonMore); + } + + public final void showToast(String text) { + ActivityMixin.showToast(getActivity(), text); + } + + private final GeoDirHandler geoUpdate = new GeoDirHandler() { + + @Override + public void updateGeoData(final IGeoData geo) { + try { + if (geo.getCoords() != null && cache != null && cache.getCoords() != null) { + cacheDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords()))); + cacheDistance.bringToFront(); + } + onUpdateGeoData(geo); + } catch (final RuntimeException e) { + Log.w("Failed to UpdateLocation location."); + } + } + }; + + public void onUpdateGeoData(final IGeoData geo) { + } + + @Override + public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { + super.onCreateOptionsMenu(menu, inflater); + CacheMenuHandler.addMenuItems(inflater, menu, cache); + + } + + @Override + public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { + super.onCreateContextMenu(menu, v, menuInfo); + CacheMenuHandler.addMenuItems(new MenuInflater(getActivity()), menu, cache); + for (int i=0;i<menu.size();i++) { + MenuItem m = menu.getItem(i); + m.setOnMenuItemClickListener(this); + } + } + + @Override + public boolean onContextItemSelected(MenuItem item) { + return onOptionsItemSelected(item); + } + + + @Override + public boolean onMenuItemClick(MenuItem menuItem) { + return onOptionsItemSelected(menuItem); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (CacheMenuHandler.onMenuItemSelected(item, this, cache)) { + return true; + } + if (LoggingUI.onMenuItemSelected(item, getActivity(), cache)) { + return true; + } + + return super.onOptionsItemSelected(item); + } + + @Override + public void onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + + try { + CacheMenuHandler.onPrepareOptionsMenu(menu, cache); + LoggingUI.onPrepareOptionsMenu(menu, cache); + } catch (final RuntimeException e) { + // nothing + } + } + + + protected abstract Geopoint getCoordinates(); + + protected abstract void startDefaultNavigation2(); + + + @Override + public void cachesAround() { + final Geopoint coords = getCoordinates(); + if (coords == null) { + showToast(res.getString(R.string.err_location_unknown)); + return; + } + CacheListActivity.startActivityCoordinates((AbstractActivity) getActivity(), coords); + getActivity().finish(); + } + + @Override + public void onCancel(DialogInterface dialog) { + super.onCancel(dialog); + getActivity().finish(); + } + + @Override + public void onDestroyView() { + super.onDestroyView(); + } +} diff --git a/main/src/cgeo/geocaching/AbstractLoggingActivity.java b/main/src/cgeo/geocaching/AbstractLoggingActivity.java index c3ba7d2..3b0f78d 100644 --- a/main/src/cgeo/geocaching/AbstractLoggingActivity.java +++ b/main/src/cgeo/geocaching/AbstractLoggingActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.gc.GCConnector; @@ -19,7 +19,7 @@ import android.view.MenuItem; import android.view.SubMenu; import android.widget.EditText; -public abstract class AbstractLoggingActivity extends AbstractActivity { +public abstract class AbstractLoggingActivity extends AbstractActionBarActivity { @Override public boolean onCreateOptionsMenu(final Menu menu) { diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java deleted file mode 100644 index 88cad01..0000000 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ /dev/null @@ -1,260 +0,0 @@ -package cgeo.geocaching; - -import cgeo.geocaching.activity.AbstractActivity; -import cgeo.geocaching.activity.ActivityMixin; -import cgeo.geocaching.enumerations.CacheSize; -import cgeo.geocaching.enumerations.LoadFlags; -import cgeo.geocaching.gcvote.GCVote; -import cgeo.geocaching.gcvote.GCVoteRating; -import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.Units; -import cgeo.geocaching.sensors.GeoDirHandler; -import cgeo.geocaching.sensors.IGeoData; -import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.ui.CacheDetailsCreator; -import cgeo.geocaching.ui.LoggingUI; -import cgeo.geocaching.utils.Log; - -import org.apache.commons.lang3.StringUtils; - -import rx.Observable; -import rx.android.observables.AndroidObservable; -import rx.functions.Action1; -import rx.functions.Func0; -import rx.schedulers.Schedulers; - -import android.graphics.Rect; -import android.os.Bundle; -import android.view.Menu; -import android.view.MenuItem; -import android.view.MotionEvent; -import android.view.View; -import android.view.View.OnClickListener; -import android.view.View.OnLongClickListener; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.TextView; - -public abstract class AbstractPopupActivity extends AbstractActivity implements CacheMenuHandler.ActivityInterface { - - protected Geocache cache = null; - protected String geocode = null; - protected CacheDetailsCreator details; - - private TextView cacheDistance = null; - private final int layout; - - private final GeoDirHandler geoUpdate = new GeoDirHandler() { - - @Override - public void updateGeoData(final IGeoData geo) { - try { - if (geo.getCoords() != null && cache != null && cache.getCoords() != null) { - cacheDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(cache.getCoords()))); - cacheDistance.bringToFront(); - } - onUpdateGeoData(geo); - } catch (final RuntimeException e) { - Log.w("Failed to UpdateLocation location."); - } - } - }; - - /** - * Callback to run when new location information is available. - * This may be overridden by deriving classes. The default implementation does nothing. - * - * @param geo - * the new data - */ - public void onUpdateGeoData(final IGeoData geo) { - } - - protected AbstractPopupActivity(int layout) { - this.layout = layout; - } - - private void aquireGCVote() { - if (!Settings.isRatingWanted()) { - return; - } - if (!cache.supportsGCVote()) { - return; - } - AndroidObservable.bindActivity(this, Observable.defer(new Func0<Observable<GCVoteRating>>() { - @Override - public Observable<GCVoteRating> call() { - final GCVoteRating rating = GCVote.getRating(cache.getGuid(), geocode); - return rating != null ? Observable.just(rating) : Observable.<GCVoteRating>empty(); - } - })).subscribe(new Action1<GCVoteRating>() { - @Override - public void call(final GCVoteRating rating) { - cache.setRating(rating.getRating()); - cache.setVotes(rating.getVotes()); - DataStore.saveChangedCache(cache); - details.addRating(cache); - } - }, Schedulers.io()); - } - - protected void init() { - cache = DataStore.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB); - - if (cache == null) { - showToast(res.getString(R.string.err_detail_cache_find)); - - finish(); - return; - } - - geocode = cache.getGeocode(); - } - - @Override - public void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - // set theme - this.setTheme(ActivityMixin.getDialogTheme()); - // set layout - setContentView(layout); - - // get parameters - final Bundle extras = getIntent().getExtras(); - if (extras != null) { - geocode = extras.getString(Intents.EXTRA_GEOCODE); - } - - if (StringUtils.isBlank(geocode)) { - showToast(res.getString(R.string.err_detail_cache_find)); - - finish(); - return; - } - - final ImageView defaultNavigationImageView = (ImageView) findViewById(R.id.defaultNavigation); - defaultNavigationImageView.setOnLongClickListener(new OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - startDefaultNavigation2(); - return true; - } - }); - - } - - @Override - public boolean onCreateOptionsMenu(Menu menu) { - CacheMenuHandler.addMenuItems(this, menu, cache); - return true; - } - - @Override - public boolean onOptionsItemSelected(MenuItem item) { - if (CacheMenuHandler.onMenuItemSelected(item, this, cache)) { - return true; - } - if (LoggingUI.onMenuItemSelected(item, this, cache)) { - return true; - } - - return true; - } - - @Override - public boolean onPrepareOptionsMenu(Menu menu) { - super.onPrepareOptionsMenu(menu); - - try { - CacheMenuHandler.onPrepareOptionsMenu(menu, cache); - LoggingUI.onPrepareOptionsMenu(menu, cache); - } catch (final RuntimeException e) { - // nothing - } - - return true; - } - - protected abstract Geopoint getCoordinates(); - - @Override - public void onResume() { - super.onResume(geoUpdate.start(GeoDirHandler.UPDATE_GEODATA)); - init(); - } - - @Override - public boolean onTouchEvent(final MotionEvent event) { - if (event.getAction() == MotionEvent.ACTION_UP) { - final Rect r = new Rect(0, 0, 0, 0); - getWindow().getDecorView().getHitRect(r); - if (!r.contains((int) event.getX(), (int) event.getY())) { - finish(); - return true; - } - } - return super.onTouchEvent(event); - } - - protected abstract void startDefaultNavigation2(); - - protected final void addCacheDetails() { - assert cache != null; - // cache type - final String cacheType = cache.getType().getL10n(); - final String cacheSize = cache.getSize() != CacheSize.UNKNOWN ? " (" + cache.getSize().getL10n() + ")" : ""; - details.add(R.string.cache_type, cacheType + cacheSize); - - details.add(R.string.cache_geocode, cache.getGeocode()); - details.addCacheState(cache); - - details.addDistance(cache, cacheDistance); - cacheDistance = details.getValueView(); - - details.addDifficulty(cache); - details.addTerrain(cache); - details.addEventDate(cache); - - // rating - if (cache.getRating() > 0) { - details.addRating(cache); - } else { - aquireGCVote(); - } - - // favorite count - details.add(R.string.cache_favorite, cache.getFavoritePoints() + "×"); - - // more details - final Button buttonMore = (Button) findViewById(R.id.more_details); - buttonMore.setOnClickListener(new OnClickListener() { - - @Override - public void onClick(View arg0) { - CacheDetailActivity.startActivity(AbstractPopupActivity.this, geocode); - finish(); - } - }); - } - - @Override - public void cachesAround() { - final Geopoint coords = getCoordinates(); - if (coords == null) { - showToast(res.getString(R.string.err_location_unknown)); - return; - } - CacheListActivity.startActivityCoordinates(this, coords); - finish(); - } - - /** - * @param view - * unused here but needed since this method is referenced from XML layout - */ - public final void goDefaultNavigation(View view) { - navigateTo(); - finish(); - } - -} diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 7d231c9..2af9f95 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -101,6 +101,7 @@ import android.view.View.OnLongClickListener; import android.view.ViewGroup; import android.view.ViewGroup.LayoutParams; import android.view.ViewParent; +import android.view.Window; import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; @@ -272,15 +273,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc // nothing, we lost the window } - final ImageView defaultNavigationImageView = (ImageView) findViewById(R.id.defaultNavigation); - defaultNavigationImageView.setOnLongClickListener(new OnLongClickListener() { - @Override - public boolean onLongClick(View v) { - startDefaultNavigation2(); - return true; - } - }); - final int pageToOpen = savedInstanceState != null ? savedInstanceState.getInt(STATE_PAGE_INDEX, 0) : Settings.isOpenLastDetailsPage() ? Settings.getLastDetailsPage() : 1; @@ -510,7 +502,7 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } } - return true; + return super.onOptionsItemSelected(item); } private static final class CacheDetailsGeoDirHandler extends GeoDirHandler { @@ -609,11 +601,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc // action bar: title and icon if (StringUtils.isNotBlank(cache.getName())) { - setTitle(cache.getName() + " (" + cache.getGeocode() + ')'); + getSupportActionBar().setTitle(cache.getName() + " (" + cache.getGeocode() + ')'); } else { - setTitle(cache.getGeocode()); + getSupportActionBar().setTitle(cache.getGeocode()); } - ((TextView) findViewById(R.id.actionbar_title)).setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(cache.getType().markerId), null, null, null); + + getSupportActionBar().setIcon(getResources().getDrawable(cache.getType().markerId)); // reset imagesList so Images view page will be redrawn imagesList = null; @@ -632,13 +625,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } /** - * Tries to navigate to the {@link Geocache} of this activity. - */ - private void startDefaultNavigation2() { - NavigationAppFactory.startDefaultNavigationApplication(2, this, cache); - } - - /** * Wrapper for the referenced method in the xml-layout. */ public void goDefaultNavigation(@SuppressWarnings("unused") View view) { @@ -2112,9 +2098,9 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } static void updateOfflineBox(final View view, final Geocache cache, final Resources res, - final OnClickListener refreshCacheClickListener, - final OnClickListener dropCacheClickListener, - final OnClickListener storeCacheClickListener) { + final OnClickListener refreshCacheClickListener, + final OnClickListener dropCacheClickListener, + final OnClickListener storeCacheClickListener) { // offline use final TextView offlineText = (TextView) view.findViewById(R.id.offline_text); final Button offlineRefresh = (Button) view.findViewById(R.id.offline_refresh); diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java index c45d77d..fa51137 100644 --- a/main/src/cgeo/geocaching/CacheListActivity.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -18,6 +18,7 @@ import cgeo.geocaching.files.GPXImporter; import cgeo.geocaching.filter.FilterUserInterface; import cgeo.geocaching.filter.IFilter; import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.AbstractList; import cgeo.geocaching.list.PseudoList; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.loaders.AbstractSearchLoader; @@ -71,6 +72,7 @@ import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; import android.content.res.Configuration; +import android.content.res.Resources; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; @@ -79,13 +81,17 @@ import android.os.Message; import android.provider.OpenableColumns; import android.support.v4.app.LoaderManager; import android.support.v4.content.Loader; +import android.support.v7.app.ActionBar; import android.view.ContextMenu; import android.view.ContextMenu.ContextMenuInfo; import android.view.KeyEvent; +import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.ViewGroup; import android.widget.AdapterView.AdapterContextMenuInfo; +import android.widget.ArrayAdapter; import android.widget.ListView; import android.widget.TextView; @@ -254,20 +260,30 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA } } + private static String getCacheNumberString(Resources res, int count) + { + return res.getQuantityString(R.plurals.cache_counts, count, count); + } + protected void updateTitle() { - final ArrayList<Integer> numbers = new ArrayList<Integer>(); + + getSupportActionBar().setTitle(title); + + final ArrayList<String> numbers = new ArrayList<String>(); if (adapter.isFiltered()) { - numbers.add(adapter.getCount()); + numbers.add(getCacheNumberString(getResources(), adapter.getCount())); } if (search != null) { - numbers.add(search.getCount()); + numbers.add(getCacheNumberString(getResources(), search.getCount())); } if (numbers.isEmpty()) { - setTitle(title); + getSupportActionBar().setSubtitle(null); } else { - setTitle(title + " [" + StringUtils.join(numbers, '/') + ']'); + getSupportActionBar().setSubtitle(StringUtils.join(numbers, '/')); } + + refreshSpinnerAdapter(); } private final CancellableHandler loadDetailsHandler = new CancellableHandler() { @@ -378,7 +394,9 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + setTheme(); + setContentView(R.layout.cacheslist_activity); // get parameters @@ -398,22 +416,16 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA } } - // Add the list selection in code. This way we can leave the XML layout of the action bar the same as for other activities. - final View titleBar = findViewById(R.id.actionbar_title); - titleBar.setClickable(true); - titleBar.setOnClickListener(new View.OnClickListener() { - - @Override - public void onClick(View v) { - selectList(); - } - }); - setTitle(title); + initAdapter(); prepareFilterBar(); + if (type.canSwitch) { + initActionBarSpinner(); + } + currentLoader = (AbstractSearchLoader) getSupportLoaderManager().initLoader(type.getLoaderId(), extras, this); // init @@ -429,8 +441,102 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA if (isInvokedFromAttachment()) { importGpxAttachement(); } + + + + } + + static class CacheArrayAdapter extends ArrayAdapter<AbstractList> { + + static class ViewHolder { + TextView title; + TextView subtitle; + } + + private final Context mContext; + + public CacheArrayAdapter(Context context, int resource) { + super(context, resource); + mContext = context; + } + + + @Override + public View getView(int position, View convertView, ViewGroup parent) { + return getCustomView(position, convertView, parent); + } + + + @Override + public View getDropDownView(int position, View convertView, ViewGroup parent) { + return getCustomView(position, convertView, parent); + } + + public View getCustomView(final int position, final View convertView, final ViewGroup parent) { + + View resultView = convertView; + LayoutInflater inflater = + (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); + + + ViewHolder holder; + if (resultView == null) { + resultView = inflater.inflate(R.layout.cachelist_spinneritem, parent, false); + holder = new ViewHolder(); + holder.title = (TextView) resultView.findViewById(android.R.id.text1); + holder.subtitle = (TextView) resultView.findViewById(android.R.id.text2); + + resultView.setTag(holder); + } else { + holder = (ViewHolder) resultView.getTag(); + } + + AbstractList list = getItem(position); + holder.title.setText(list.getTitle()); + if (list.getCount() >= 0) { + holder.subtitle.setVisibility(View.VISIBLE); + holder.subtitle.setText(getCacheNumberString(mContext.getResources(),list.getCount())); + } else { + holder.subtitle.setVisibility(View.GONE); + } + + return resultView; + } } + CacheArrayAdapter mCacheListSpinnerAdapter; + + private void initActionBarSpinner() { + mCacheListSpinnerAdapter = new CacheArrayAdapter(this, R.layout.support_simple_spinner_dropdown_item); + getSupportActionBar().setNavigationMode(ActionBar.NAVIGATION_MODE_LIST); + getSupportActionBar().setDisplayShowTitleEnabled(false); + getSupportActionBar().setListNavigationCallbacks(mCacheListSpinnerAdapter, new ActionBar.OnNavigationListener() { + @Override + public boolean onNavigationItemSelected(int i, long l) { + int newListId = mCacheListSpinnerAdapter.getItem(i).id; + if (newListId != listId) { + switchListById(newListId); + } + return true; + } + }); + } + + private void refreshSpinnerAdapter() { + /* If the activity does not use the Spinner this will be null */ + if (mCacheListSpinnerAdapter==null) { + return; + } + mCacheListSpinnerAdapter.clear(); + + AbstractList list = AbstractList.getListById(listId); + + for (AbstractList l: StoredList.UserInterface.getMenuLists(false, PseudoList.NEW_LIST.id)) { + mCacheListSpinnerAdapter.add(l); + } + + getSupportActionBar().setSelectedNavigationItem(mCacheListSpinnerAdapter.getPosition(list)); + } @Override public void onConfigurationChanged(Configuration newConfig) { @@ -617,7 +723,13 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA @Override public boolean onOptionsItemSelected(MenuItem item) { + if (super.onOptionsItemSelected(item)) { + return true; + } switch (item.getItemId()) { + case R.id.menu_show_on_map: + goMap(); + return true; case R.id.menu_switch_select_mode: adapter.switchSelectMode(); invalidateOptionsMenuCompatible(); @@ -645,6 +757,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA return false; case R.id.menu_create_list: new StoredList.UserInterface(this).promptForListCreation(getListSwitchingRunnable(), newListName); + refreshSpinnerAdapter(); invalidateOptionsMenuCompatible(); return false; case R.id.menu_drop_list: @@ -1366,6 +1479,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA private void removeListInternal() { if (DataStore.removeList(listId)) { showToast(res.getString(R.string.list_dialog_remove_ok)); + refreshSpinnerAdapter(); switchListById(StoredList.STANDARD_LIST_ID); } else { showToast(res.getString(R.string.list_dialog_remove_err)); @@ -1394,11 +1508,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA }); } - /** - * @param view - * unused here but needed since this method is referenced from XML layout - */ - public void goMap(View view) { + public void goMap() { if (!cacheToShow()) { return; } @@ -1414,6 +1524,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA } private void refreshCurrentList() { + refreshSpinnerAdapter(); switchListById(listId); } @@ -1576,6 +1687,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA break; case HISTORY: title = res.getString(R.string.caches_history); + listId = PseudoList.HISTORY_LIST.id; loader = new HistoryGeocacheListLoader(app, coords); break; case NEAREST: diff --git a/main/src/cgeo/geocaching/CacheMenuHandler.java b/main/src/cgeo/geocaching/CacheMenuHandler.java index cfe9eeb..5b0fdba 100644 --- a/main/src/cgeo/geocaching/CacheMenuHandler.java +++ b/main/src/cgeo/geocaching/CacheMenuHandler.java @@ -5,7 +5,11 @@ import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.ui.AbstractUIFactory; import android.app.Activity; +import android.support.v4.app.Fragment; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.widget.ShareActionProvider; import android.view.Menu; +import android.view.MenuInflater; import android.view.MenuItem; /** @@ -19,7 +23,7 @@ public class CacheMenuHandler extends AbstractUIFactory { * Methods to be implemented by the activity to react to the cache menu selections. * */ - protected interface ActivityInterface { + interface ActivityInterface { public void navigateTo(); public void showNavigationMenu(); @@ -29,8 +33,14 @@ public class CacheMenuHandler extends AbstractUIFactory { } public static boolean onMenuItemSelected(MenuItem item, CacheMenuHandler.ActivityInterface activityInterface, Geocache cache) { - assert activityInterface instanceof Activity; - final Activity activity = (Activity) activityInterface; + assert activityInterface instanceof Activity || activityInterface instanceof Fragment; + final Activity activity; + if (activityInterface instanceof Activity) { + activity = (Activity) activityInterface; + } else { + activity = ((Fragment)activityInterface).getActivity(); + } + switch (item.getItemId()) { case R.id.menu_default_navigation: activityInterface.navigateTo(); @@ -68,10 +78,22 @@ public class CacheMenuHandler extends AbstractUIFactory { menu.findItem(R.id.menu_show_in_browser).setVisible(cache.canOpenInBrowser()); menu.findItem(R.id.menu_default_navigation).setTitle(NavigationAppFactory.getDefaultNavigationApplication().getName()); + + MenuItem shareItem = menu.findItem(R.id.menu_share); + ShareActionProvider shareActionProvider = (ShareActionProvider) + MenuItemCompat.getActionProvider(shareItem); + if(shareActionProvider != null) { + shareActionProvider.setShareIntent(cache.getIntent()); + } + } - public static void addMenuItems(Activity activity, Menu menu, Geocache cache) { - activity.getMenuInflater().inflate(R.menu.cache_options, menu); + public static void addMenuItems(MenuInflater inflater, Menu menu, Geocache cache) { + inflater.inflate(R.menu.cache_options, menu); onPrepareOptionsMenu(menu, cache); } + + public static void addMenuItems(Activity activity, Menu menu, Geocache cache) { + addMenuItems(activity.getMenuInflater(), menu, cache); + } } diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java index b72b67c..d886554 100644 --- a/main/src/cgeo/geocaching/CachePopup.java +++ b/main/src/cgeo/geocaching/CachePopup.java @@ -1,14 +1,7 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.Progress; -import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; -import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.list.StoredList; -import cgeo.geocaching.network.Network; -import cgeo.geocaching.settings.Settings; -import cgeo.geocaching.ui.CacheDetailsCreator; -import cgeo.geocaching.utils.CancellableHandler; -import cgeo.geocaching.utils.Log; +import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; import org.apache.commons.lang3.StringUtils; @@ -18,187 +11,60 @@ import rx.schedulers.Schedulers; import android.content.Context; import android.content.Intent; -import android.content.res.Configuration; -import android.os.Handler; -import android.os.Message; -import android.view.View; -import android.widget.LinearLayout; -import android.widget.TextView; - -public class CachePopup extends AbstractPopupActivity { - private final Progress progress = new Progress(); - - private class StoreCacheHandler extends CancellableHandler { - private final int progressMessage; - - public StoreCacheHandler(final int progressMessage) { - this.progressMessage = progressMessage; - } - - @Override - public void handleRegularMessage(Message msg) { - if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) { - updateStatusMsg((String) msg.obj); - } else { - init(); - } - } - - private void updateStatusMsg(final String msg) { - progress.setMessage(res.getString(progressMessage) - + "\n\n" - + msg); - } - } - - private class DropCacheHandler extends Handler { - @Override - public void handleMessage(Message msg) { - CachePopup.this.finish(); +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.view.Window; + +/** + * Created by arne on 23.04.2014. + */ +public class CachePopup extends AbstractActivity { + + protected String geocode = null; + + + void showDialog() { + // DialogFragment.show() will take care of adding the fragment + // in a transaction. We also want to remove any currently showing + // dialog, so make our own transaction and take care of that here. + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); + if (prev != null) { + ft.remove(prev); } - } + ft.addToBackStack(null); - public CachePopup() { - super(R.layout.popup); + // Create and show the dialog. + DialogFragment newFragment = CachePopupFragment.newInstance(geocode); + newFragment.show(ft, "dialog"); } @Override - public void showNavigationMenu() { - NavigationAppFactory.showNavigationMenu(this, cache, null, null); - } + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + supportRequestWindowFeature(Window.FEATURE_NO_TITLE); + this.setTheme(ActivityMixin.getDialogTheme()); - @Override - protected void init() { - super.init(); - try { - if (StringUtils.isNotBlank(cache.getName())) { - setTitle(cache.getName()); - } else { - setTitle(geocode); - } - - // actionbar icon - ((TextView) findViewById(R.id.actionbar_title)).setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(cache.getType().markerId), null, null, null); - - details = new CacheDetailsCreator(this, (LinearLayout) findViewById(R.id.details_list)); - addCacheDetails(); - - // offline use - CacheDetailActivity.updateOfflineBox(findViewById(android.R.id.content), cache, res, new RefreshCacheClickListener(), new DropCacheClickListener(), new StoreCacheClickListener()); - - } catch (Exception e) { - Log.e("CachePopup.init", e); + final Bundle extras = getIntent().getExtras(); + if (extras != null) { + geocode = extras.getString(Intents.EXTRA_GEOCODE); } - // cache is loaded. remove progress-popup if any there - progress.dismiss(); - } - - @Override - public void onConfigurationChanged(Configuration newConfig) { - super.onConfigurationChanged(newConfig); - - init(); - } - - private class StoreCacheClickListener implements View.OnClickListener { - @Override - public void onClick(View arg0) { - if (progress.isShowing()) { - showToast(res.getString(R.string.err_detail_still_working)); - return; - } + if (StringUtils.isBlank(geocode)) { + showToast(res.getString(R.string.err_detail_cache_find)); - if (Settings.getChooseList()) { - // let user select list to store cache in - new StoredList.UserInterface(CachePopup.this).promptForListSelection(R.string.list_title, - new Action1<Integer>() { - @Override - public void call(final Integer selectedListId) { - storeCache(selectedListId); - } - }, true, StoredList.TEMPORARY_LIST_ID); - } else { - storeCache(StoredList.TEMPORARY_LIST_ID); - } - } - - protected void storeCache(final int listId) { - final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message); - progress.show(CachePopup.this, res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage()); - Schedulers.io().createWorker().schedule(new Action0() { - @Override - public void call() { - cache.store(listId, storeCacheHandler); - invalidateOptionsMenuCompatible(); - } - }); - } - } - - private class RefreshCacheClickListener implements View.OnClickListener { - @Override - public void onClick(View arg0) { - if (progress.isShowing()) { - showToast(res.getString(R.string.err_detail_still_working)); - return; - } - - if (!Network.isNetworkConnected(getApplicationContext())) { - showToast(getString(R.string.err_server)); - return; - } - - final StoreCacheHandler refreshCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message); - progress.show(CachePopup.this, res.getString(R.string.cache_dialog_refresh_title), res.getString(R.string.cache_dialog_refresh_message), true, refreshCacheHandler.cancelMessage()); - cache.refresh(refreshCacheHandler, Schedulers.io()); - } - } - - private class DropCacheClickListener implements View.OnClickListener { - @Override - public void onClick(View arg0) { - if (progress.isShowing()) { - showToast(res.getString(R.string.err_detail_still_working)); - return; - } - - final DropCacheHandler dropCacheHandler = new DropCacheHandler(); - progress.show(CachePopup.this, res.getString(R.string.cache_dialog_offline_drop_title), res.getString(R.string.cache_dialog_offline_drop_message), true, null); - cache.drop(dropCacheHandler, Schedulers.io()); - } - } - - @Override - public void navigateTo() { - NavigationAppFactory.startDefaultNavigationApplication(1, this, cache); - } - - /** - * Tries to navigate to the {@link Geocache} of this activity. - */ - @Override - protected void startDefaultNavigation2() { - if (cache == null || cache.getCoords() == null) { - showToast(res.getString(R.string.cache_coordinates_no)); + finish(); return; } - NavigationAppFactory.startDefaultNavigationApplication(2, this, cache); - finish(); + showDialog(); } - public static void startActivity(final Context context, final String geocode) { + public static void startActivity(Context context, String geocode) { final Intent popupIntent = new Intent(context, CachePopup.class); popupIntent.putExtra(Intents.EXTRA_GEOCODE, geocode); context.startActivity(popupIntent); } - - @Override - protected Geopoint getCoordinates() { - if (cache == null) { - return null; - } - return cache.getCoords(); - } } diff --git a/main/src/cgeo/geocaching/CachePopupFragment.java b/main/src/cgeo/geocaching/CachePopupFragment.java new file mode 100644 index 0000000..010d701 --- /dev/null +++ b/main/src/cgeo/geocaching/CachePopupFragment.java @@ -0,0 +1,229 @@ +package cgeo.geocaching; + +import cgeo.geocaching.activity.Progress; +import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; +import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.list.StoredList; +import cgeo.geocaching.network.Network; +import cgeo.geocaching.settings.Settings; +import cgeo.geocaching.ui.CacheDetailsCreator; +import cgeo.geocaching.utils.CancellableHandler; +import cgeo.geocaching.utils.Log; + +import org.apache.commons.lang3.StringUtils; + +import rx.functions.Action0; +import rx.functions.Action1; +import rx.schedulers.Schedulers; + +import android.content.Context; +import android.content.Intent; +import android.content.res.Configuration; +import android.os.Bundle; +import android.os.Handler; +import android.os.Message; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class CachePopupFragment extends AbstractDialogFragment { + private final Progress progress = new Progress(); + + public static DialogFragment newInstance(String geocode) { + + Bundle args = new Bundle(); + args.putString(GEOCODE_ARG,geocode); + + DialogFragment f = new CachePopupFragment(); + f.setStyle(DialogFragment.STYLE_NO_TITLE,0); + f.setArguments(args); + + return f; + } + + private class StoreCacheHandler extends CancellableHandler { + private final int progressMessage; + + public StoreCacheHandler(final int progressMessage) { + this.progressMessage = progressMessage; + } + + @Override + public void handleRegularMessage(Message msg) { + if (UPDATE_LOAD_PROGRESS_DETAIL == msg.what && msg.obj instanceof String) { + updateStatusMsg((String) msg.obj); + } else { + init(); + } + } + + private void updateStatusMsg(final String msg) { + progress.setMessage(res.getString(progressMessage) + + "\n\n" + + msg); + } + } + + private class DropCacheHandler extends Handler { + @Override + public void handleMessage(Message msg) { + getActivity().finish(); + } + } + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.popup, container, false); + initCustomActionBar(v); + return v; + } + + @Override + protected void init() { + super.init(); + + try { + if (StringUtils.isNotBlank(cache.getName())) { + setTitle(cache.getName()); + } else { + setTitle(geocode); + } + + ((TextView) getView().findViewById(R.id.actionbar_title)).setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(cache.getType().markerId), null, null, null); + + details = new CacheDetailsCreator(getActivity(), (LinearLayout) getView().findViewById(R.id.details_list)); + + addCacheDetails(); + + // offline use + CacheDetailActivity.updateOfflineBox(getView(), cache, res, new RefreshCacheClickListener(), new DropCacheClickListener(), new StoreCacheClickListener()); + + } catch (Exception e) { + Log.e("CachePopupFragment.init", e); + } + + // cache is loaded. remove progress-popup if any there + progress.dismiss(); + } + + + + @Override + public void onConfigurationChanged(Configuration newConfig) { + super.onConfigurationChanged(newConfig); + + init(); + } + + private class StoreCacheClickListener implements View.OnClickListener { + @Override + public void onClick(View arg0) { + if (progress.isShowing()) { + showToast(res.getString(R.string.err_detail_still_working)); + return; + } + + if (Settings.getChooseList()) { + // let user select list to store cache in + new StoredList.UserInterface(getActivity()).promptForListSelection(R.string.list_title, + new Action1<Integer>() { + @Override + public void call(final Integer selectedListId) { + storeCache(selectedListId); + } + }, true, StoredList.TEMPORARY_LIST_ID); + } else { + storeCache(StoredList.TEMPORARY_LIST_ID); + } + } + + protected void storeCache(final int listId) { + final StoreCacheHandler storeCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message); + progress.show(getActivity(), res.getString(R.string.cache_dialog_offline_save_title), res.getString(R.string.cache_dialog_offline_save_message), true, storeCacheHandler.cancelMessage()); + Schedulers.io().createWorker().schedule(new Action0() { + @Override + public void call() { + cache.store(listId, storeCacheHandler); + getActivity().supportInvalidateOptionsMenu(); + } + }); + } + } + + private class RefreshCacheClickListener implements View.OnClickListener { + @Override + public void onClick(View arg0) { + if (progress.isShowing()) { + showToast(res.getString(R.string.err_detail_still_working)); + return; + } + + if (!Network.isNetworkConnected(getActivity())) { + showToast(getString(R.string.err_server)); + return; + } + + final StoreCacheHandler refreshCacheHandler = new StoreCacheHandler(R.string.cache_dialog_offline_save_message); + progress.show(getActivity(), res.getString(R.string.cache_dialog_refresh_title), res.getString(R.string.cache_dialog_refresh_message), true, refreshCacheHandler.cancelMessage()); + cache.refresh(refreshCacheHandler, Schedulers.io()); + } + } + + private class DropCacheClickListener implements View.OnClickListener { + @Override + public void onClick(View arg0) { + if (progress.isShowing()) { + showToast(res.getString(R.string.err_detail_still_working)); + return; + } + + final DropCacheHandler dropCacheHandler = new DropCacheHandler(); + progress.show(getActivity(), res.getString(R.string.cache_dialog_offline_drop_title), res.getString(R.string.cache_dialog_offline_drop_message), true, null); + cache.drop(dropCacheHandler, Schedulers.io()); + } + } + + + @Override + public void navigateTo() { + NavigationAppFactory.startDefaultNavigationApplication(1, getActivity(), cache); + } + + @Override + public void showNavigationMenu() { + // TODO + } + + + /** + * Tries to navigate to the {@link cgeo.geocaching.Geocache} of this activity. + */ + @Override + protected void startDefaultNavigation2() { + if (cache == null || cache.getCoords() == null) { + showToast(res.getString(R.string.cache_coordinates_no)); + return; + } + NavigationAppFactory.startDefaultNavigationApplication(2, getActivity(), cache); + getActivity().finish(); + } + + public static void startActivity(final Context context, final String geocode) { + final Intent popupIntent = new Intent(context, CachePopup.class); + popupIntent.putExtra(Intents.EXTRA_GEOCODE, geocode); + context.startActivity(popupIntent); + } + + @Override + protected Geopoint getCoordinates() { + if (cache == null) { + return null; + } + return cache.getCoords(); + } + + +} diff --git a/main/src/cgeo/geocaching/CompassActivity.java b/main/src/cgeo/geocaching/CompassActivity.java index 36dcf27..e5c38a3 100644 --- a/main/src/cgeo/geocaching/CompassActivity.java +++ b/main/src/cgeo/geocaching/CompassActivity.java @@ -3,7 +3,7 @@ package cgeo.geocaching; import butterknife.ButterKnife; import butterknife.InjectView; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.geopoint.Geopoint; import cgeo.geocaching.geopoint.Units; @@ -38,7 +38,7 @@ import java.util.ArrayList; import java.util.Collection; import java.util.List; -public class CompassActivity extends AbstractActivity { +public class CompassActivity extends AbstractActionBarActivity { private static final int COORDINATES_OFFSET = 10; diff --git a/main/src/cgeo/geocaching/CreateShortcutActivity.java b/main/src/cgeo/geocaching/CreateShortcutActivity.java index c18b6f4..ffcf81b 100644 --- a/main/src/cgeo/geocaching/CreateShortcutActivity.java +++ b/main/src/cgeo/geocaching/CreateShortcutActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.list.PseudoList; import cgeo.geocaching.list.StoredList; @@ -10,7 +10,7 @@ import android.content.Intent; import android.content.Intent.ShortcutIconResource; import android.os.Bundle; -public class CreateShortcutActivity extends AbstractActivity { +public class CreateShortcutActivity extends AbstractActionBarActivity { @Override public void onCreate(Bundle savedInstanceState) { diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java index 55de0a6..9bc46b3 100644 --- a/main/src/cgeo/geocaching/EditWaypointActivity.java +++ b/main/src/cgeo/geocaching/EditWaypointActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.enumerations.CacheType; @@ -48,7 +48,7 @@ import java.util.EnumSet; import java.util.List; @EActivity -public class EditWaypointActivity extends AbstractActivity { +public class EditWaypointActivity extends AbstractActionBarActivity { private static final ArrayList<WaypointType> POSSIBLE_WAYPOINT_TYPES = new ArrayList<WaypointType>(WaypointType.ALL_TYPES_EXCEPT_OWN_AND_ORIGINAL); @ViewById(R.id.buttonLatitude) protected Button buttonLat; diff --git a/main/src/cgeo/geocaching/Geocache.java b/main/src/cgeo/geocaching/Geocache.java index fdfdbb5..db36740 100644 --- a/main/src/cgeo/geocaching/Geocache.java +++ b/main/src/cgeo/geocaching/Geocache.java @@ -707,6 +707,12 @@ public class Geocache implements ICache, IWaypoint { return; } + final Intent intent = getIntent(); + + fromActivity.startActivity(Intent.createChooser(intent, res.getText(R.string.action_bar_share_title))); + } + + public Intent getIntent() { final StringBuilder subject = new StringBuilder("Geocache "); subject.append(geocode); if (StringUtils.isNotBlank(name)) { @@ -718,7 +724,7 @@ public class Geocache implements ICache, IWaypoint { intent.putExtra(Intent.EXTRA_SUBJECT, subject.toString()); intent.putExtra(Intent.EXTRA_TEXT, getUrl()); - fromActivity.startActivity(Intent.createChooser(intent, res.getText(R.string.action_bar_share_title))); + return intent; } public String getUrl() { diff --git a/main/src/cgeo/geocaching/ImageSelectActivity.java b/main/src/cgeo/geocaching/ImageSelectActivity.java index b5fb38e..a64b4cf 100644 --- a/main/src/cgeo/geocaching/ImageSelectActivity.java +++ b/main/src/cgeo/geocaching/ImageSelectActivity.java @@ -3,7 +3,7 @@ package cgeo.geocaching; import butterknife.ButterKnife; import butterknife.InjectView; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.files.LocalStorage; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.dialog.Dialogs; @@ -37,7 +37,7 @@ import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; -public class ImageSelectActivity extends AbstractActivity { +public class ImageSelectActivity extends AbstractActionBarActivity { @InjectView(R.id.caption) protected EditText captionView; @InjectView(R.id.description) protected EditText descriptionView; diff --git a/main/src/cgeo/geocaching/ImagesActivity.java b/main/src/cgeo/geocaching/ImagesActivity.java index 3da1ade..bc2616b 100644 --- a/main/src/cgeo/geocaching/ImagesActivity.java +++ b/main/src/cgeo/geocaching/ImagesActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.ImagesList; import cgeo.geocaching.ui.ImagesList.ImageType; @@ -19,7 +19,7 @@ import android.view.View; import java.util.ArrayList; import java.util.List; -public class ImagesActivity extends AbstractActivity { +public class ImagesActivity extends AbstractActionBarActivity { private boolean offline; private ArrayList<Image> imageNames; diff --git a/main/src/cgeo/geocaching/MainActivity.java b/main/src/cgeo/geocaching/MainActivity.java index 42dd58d..d8958b4 100644 --- a/main/src/cgeo/geocaching/MainActivity.java +++ b/main/src/cgeo/geocaching/MainActivity.java @@ -3,7 +3,7 @@ package cgeo.geocaching; import butterknife.ButterKnife; import butterknife.InjectView; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.capability.ILogin; import cgeo.geocaching.enumerations.CacheType; @@ -25,7 +25,9 @@ import cgeo.geocaching.utils.Version; import com.google.zxing.integration.android.IntentIntegrator; import com.google.zxing.integration.android.IntentResult; + import org.apache.commons.lang3.StringUtils; + import rx.Observable; import rx.Observable.OnSubscribe; import rx.Subscriber; @@ -37,6 +39,7 @@ import rx.subscriptions.Subscriptions; import android.app.AlertDialog; import android.app.AlertDialog.Builder; import android.app.SearchManager; +import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.res.Configuration; @@ -45,6 +48,8 @@ import android.location.Geocoder; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.support.v4.view.MenuItemCompat; +import android.support.v7.widget.SearchView; import android.view.LayoutInflater; import android.view.Menu; import android.view.MenuItem; @@ -61,7 +66,7 @@ import java.util.Comparator; import java.util.List; import java.util.Locale; -public class MainActivity extends AbstractActivity { +public class MainActivity extends AbstractActionBarActivity { @InjectView(R.id.nav_satellites) protected TextView navSatellites; @InjectView(R.id.filter_button_title)protected TextView filterTitle; @InjectView(R.id.map) protected ImageView findOnMap; @@ -189,6 +194,10 @@ public class MainActivity extends AbstractActivity { public void onCreate(final Bundle savedInstanceState) { // don't call the super implementation with the layout argument, as that would set the wrong theme super.onCreate(savedInstanceState); + + // Disable the up navigation for this activity + getSupportActionBar().setDisplayHomeAsUpEnabled(false); + setContentView(R.layout.main_activity); ButterKnife.inject(this); @@ -262,6 +271,11 @@ public class MainActivity extends AbstractActivity { @Override public boolean onCreateOptionsMenu(final Menu menu) { getMenuInflater().inflate(R.menu.main_activity_options, menu); + SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); + MenuItem searchItem = menu.findItem(R.id.menu_gosearch); + SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); + searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); + return true; } @@ -303,6 +317,9 @@ public class MainActivity extends AbstractActivity { } }); return true; + case R.id.menu_gosearch: + onSearchRequested(); + return true; default: return super.onOptionsItemSelected(item); } @@ -712,13 +729,4 @@ public class MainActivity extends AbstractActivity { public void showAbout(final View view) { startActivity(new Intent(this, AboutActivity.class)); } - - /** - * @param view - * unused here but needed since this method is referenced from XML layout - */ - public void goSearch(final View view) { - onSearchRequested(); - } - } diff --git a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java index 0a750e0..a4053dc 100644 --- a/main/src/cgeo/geocaching/NavigateAnyPointActivity.java +++ b/main/src/cgeo/geocaching/NavigateAnyPointActivity.java @@ -4,7 +4,7 @@ import butterknife.ButterKnife; import butterknife.InjectView; import butterknife.Optional; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.geopoint.DistanceParser; import cgeo.geocaching.geopoint.Geopoint; @@ -44,7 +44,7 @@ import android.widget.TextView; import java.util.List; -public class NavigateAnyPointActivity extends AbstractActivity { +public class NavigateAnyPointActivity extends AbstractActionBarActivity { @InjectView(R.id.historyList) protected ListView historyListView; @@ -363,7 +363,7 @@ public class NavigateAnyPointActivity extends AbstractActivity { NavigationAppFactory.showNavigationMenu(this, null, null, coords); return true; default: - return false; + return super.onOptionsItemSelected(item); } } diff --git a/main/src/cgeo/geocaching/SearchActivity.java b/main/src/cgeo/geocaching/SearchActivity.java index d3bb2d8..f1f09d4 100644 --- a/main/src/cgeo/geocaching/SearchActivity.java +++ b/main/src/cgeo/geocaching/SearchActivity.java @@ -3,7 +3,7 @@ package cgeo.geocaching; import butterknife.ButterKnife; import butterknife.InjectView; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.connector.ConnectorFactory; import cgeo.geocaching.connector.IConnector; import cgeo.geocaching.connector.capability.ISearchByGeocode; @@ -37,7 +37,7 @@ import android.widget.Button; import java.util.Locale; -public class SearchActivity extends AbstractActivity { +public class SearchActivity extends AbstractActionBarActivity { @InjectView(R.id.buttonLatitude) protected Button buttonLatitude; @InjectView(R.id.buttonLongitude) protected Button buttonLongitude; diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java index 16fce37..7474785 100644 --- a/main/src/cgeo/geocaching/StaticMapsActivity.java +++ b/main/src/cgeo/geocaching/StaticMapsActivity.java @@ -1,6 +1,6 @@ package cgeo.geocaching; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.utils.Log; @@ -25,7 +25,7 @@ import java.util.List; @EActivity @OptionsMenu(R.menu.static_maps_activity_options) -public class StaticMapsActivity extends AbstractActivity { +public class StaticMapsActivity extends AbstractActionBarActivity { private static final String EXTRAS_WAYPOINT = "waypoint"; private static final String EXTRAS_DOWNLOAD = "download"; @@ -169,10 +169,12 @@ public class StaticMapsActivity extends AbstractActivity { } public static void startActivity(final Context activity, final String geocode, final boolean download, final Waypoint waypoint) { + /* FIXME StaticMapsActivity_.IntentBuilder_ builder = StaticMapsActivity_.intent(activity).geocode(geocode).download(download); if (waypoint != null) { builder.waypointId(waypoint.getId()); } builder.start(); + */ } }
\ No newline at end of file diff --git a/main/src/cgeo/geocaching/TrackableActivity.java b/main/src/cgeo/geocaching/TrackableActivity.java index 81d23c9..7dfc3c1 100644 --- a/main/src/cgeo/geocaching/TrackableActivity.java +++ b/main/src/cgeo/geocaching/TrackableActivity.java @@ -36,6 +36,7 @@ import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; +import android.support.v7.app.ActionBar; import android.text.Html; import android.view.ContextMenu; import android.view.LayoutInflater; @@ -322,9 +323,9 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi } private static class TrackableIconHandler extends Handler { - final private TextView view; + final private ActionBar view; - public TrackableIconHandler(TextView viewIn) { + public TrackableIconHandler(ActionBar viewIn) { view = viewIn; } @@ -333,7 +334,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi final BitmapDrawable image = (BitmapDrawable) message.obj; if (image != null && view != null) { image.setBounds(0, 0, view.getHeight(), view.getHeight()); - view.setCompoundDrawables(image, null, null, null); + view.setIcon(image); } } } @@ -392,7 +393,7 @@ public class TrackableActivity extends AbstractViewPagerActivity<TrackableActivi // action bar icon if (StringUtils.isNotBlank(trackable.getIconUrl())) { - final TrackableIconHandler iconHandler = new TrackableIconHandler(((TextView) findViewById(R.id.actionbar_title))); + final TrackableIconHandler iconHandler = new TrackableIconHandler(getSupportActionBar()); final TrackableIconThread iconThread = new TrackableIconThread(trackable.getIconUrl(), iconHandler); iconThread.start(); } diff --git a/main/src/cgeo/geocaching/UsefulAppsActivity.java b/main/src/cgeo/geocaching/UsefulAppsActivity.java index 39c527d..1159453 100644 --- a/main/src/cgeo/geocaching/UsefulAppsActivity.java +++ b/main/src/cgeo/geocaching/UsefulAppsActivity.java @@ -3,7 +3,7 @@ package cgeo.geocaching; import butterknife.ButterKnife; import butterknife.InjectView; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.ui.AbstractViewHolder; import android.app.Activity; @@ -18,7 +18,7 @@ import android.widget.ImageView; import android.widget.ListView; import android.widget.TextView; -public class UsefulAppsActivity extends AbstractActivity { +public class UsefulAppsActivity extends AbstractActionBarActivity { @InjectView(R.id.apps_list) protected ListView list; diff --git a/main/src/cgeo/geocaching/WaypointPopup.java b/main/src/cgeo/geocaching/WaypointPopup.java index 916ad4c..f1ffc1d 100644 --- a/main/src/cgeo/geocaching/WaypointPopup.java +++ b/main/src/cgeo/geocaching/WaypointPopup.java @@ -1,115 +1,35 @@ package cgeo.geocaching; -import butterknife.ButterKnife; -import butterknife.InjectView; - -import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; -import cgeo.geocaching.geopoint.Geopoint; -import cgeo.geocaching.geopoint.Units; -import cgeo.geocaching.sensors.IGeoData; -import cgeo.geocaching.ui.CacheDetailsCreator; -import cgeo.geocaching.utils.Log; - -import org.apache.commons.lang3.StringUtils; - import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.TextView; +import android.support.v4.app.DialogFragment; +import android.support.v4.app.Fragment; +import android.support.v4.app.FragmentTransaction; +import android.view.Window; -public class WaypointPopup extends AbstractPopupActivity { - @InjectView(R.id.actionbar_title) protected TextView actionBarTitle; - @InjectView(R.id.waypoint_details_list) protected LinearLayout waypointDetailsLayout; - @InjectView(R.id.edit) protected Button buttonEdit; - @InjectView(R.id.details_list) protected LinearLayout cacheDetailsLayout; +import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.ActivityMixin; +public class WaypointPopup extends AbstractActivity { private int waypointId = 0; - private Waypoint waypoint = null; - private TextView waypointDistance = null; - - public WaypointPopup() { - super(R.layout.waypoint_popup); - } + private String geocode; @Override - public void onCreate(final Bundle savedInstanceState) { + public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ButterKnife.inject(this); - // get parameters - final Bundle extras = getIntent().getExtras(); - if (extras != null) { - waypointId = extras.getInt(Intents.EXTRA_WAYPOINT_ID); - } - } - - @Override - public void onUpdateGeoData(IGeoData geo) { - if (geo.getCoords() != null && waypoint != null && waypoint.getCoords() != null) { - waypointDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(waypoint.getCoords()))); - waypointDistance.bringToFront(); - } - } - - @Override - protected void init() { - super.init(); - waypoint = DataStore.loadWaypoint(waypointId); - try { - if (StringUtils.isNotBlank(waypoint.getName())) { - setTitle(waypoint.getName()); - } else { - setTitle(waypoint.getGeocode()); - } - - actionBarTitle.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(waypoint.getWaypointType().markerId), null, null, null); - - details = new CacheDetailsCreator(this, waypointDetailsLayout); + supportRequestWindowFeature(Window.FEATURE_NO_TITLE); - //Waypoint geocode - details.add(R.string.cache_geocode, waypoint.getPrefix() + waypoint.getGeocode().substring(2)); - details.addDistance(waypoint, waypointDistance); - waypointDistance = details.getValueView(); - details.add(R.string.waypoint_note, waypoint.getNote()); + this.setTheme(ActivityMixin.getDialogTheme()); - buttonEdit.setOnClickListener(new OnClickListener() { - @Override - public void onClick(View arg0) { - EditWaypointActivity.startActivityEditWaypoint(WaypointPopup.this, cache, waypoint.getId()); - finish(); - } - }); - - details = new CacheDetailsCreator(this, cacheDetailsLayout); - details.add(R.string.cache_name, cache.getName()); - - addCacheDetails(); - - } catch (Exception e) { - Log.e("WaypointPopup.init", e); + final Bundle extras = getIntent().getExtras(); + if (extras != null) { + waypointId = extras.getInt(Intents.EXTRA_WAYPOINT_ID); + geocode = extras.getString(Intents.EXTRA_GEOCODE); } - } - - @Override - public void navigateTo() { - NavigationAppFactory.startDefaultNavigationApplication(1, this, waypoint); - } + showDialog(); - /** - * Tries to navigate to the {@link Geocache} of this activity. - */ - @Override - protected void startDefaultNavigation2() { - if (waypoint == null || waypoint.getCoords() == null) { - showToast(res.getString(R.string.cache_coordinates_no)); - return; - } - NavigationAppFactory.startDefaultNavigationApplication(2, this, waypoint); - finish(); } public static void startActivity(final Context context, final int waypointId, final String geocode) { @@ -119,16 +39,22 @@ public class WaypointPopup extends AbstractPopupActivity { context.startActivity(popupIntent); } - @Override - public void showNavigationMenu() { - NavigationAppFactory.showNavigationMenu(this, null, waypoint, null); - } - @Override - protected Geopoint getCoordinates() { - if (waypoint == null) { - return null; + void showDialog() { + // DialogFragment.show() will take care of adding the fragment + // in a transaction. We also want to remove any currently showing + // dialog, so make our own transaction and take care of that here. + FragmentTransaction ft = getSupportFragmentManager().beginTransaction(); + Fragment prev = getSupportFragmentManager().findFragmentByTag("dialog"); + if (prev != null) { + ft.remove(prev); } - return waypoint.getCoords(); + ft.addToBackStack(null); + + // Create and show the dialog. + DialogFragment newFragment = WaypointPopupFragment.newInstance(geocode, waypointId); + newFragment.show(ft, "dialog"); } + + } diff --git a/main/src/cgeo/geocaching/WaypointPopupFragment.java b/main/src/cgeo/geocaching/WaypointPopupFragment.java new file mode 100644 index 0000000..14daada --- /dev/null +++ b/main/src/cgeo/geocaching/WaypointPopupFragment.java @@ -0,0 +1,147 @@ +package cgeo.geocaching; + +import butterknife.ButterKnife; +import butterknife.InjectView; + +import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; +import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.geopoint.Units; +import cgeo.geocaching.sensors.IGeoData; +import cgeo.geocaching.ui.CacheDetailsCreator; +import cgeo.geocaching.utils.Log; + +import org.apache.commons.lang3.StringUtils; + +import android.os.Bundle; +import android.support.v4.app.DialogFragment; +import android.view.LayoutInflater; +import android.view.View; +import android.view.View.OnClickListener; +import android.view.ViewGroup; +import android.widget.Button; +import android.widget.LinearLayout; +import android.widget.TextView; + +public class WaypointPopupFragment extends AbstractDialogFragment { + @InjectView(R.id.actionbar_title) protected TextView actionBarTitle; + @InjectView(R.id.waypoint_details_list) protected LinearLayout waypointDetailsLayout; + @InjectView(R.id.edit) protected Button buttonEdit; + @InjectView(R.id.details_list) protected LinearLayout cacheDetailsLayout; + + private int waypointId = 0; + private Waypoint waypoint = null; + private TextView waypointDistance = null; + + @Override + public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { + View v = inflater.inflate(R.layout.waypoint_popup, container, false); + initCustomActionBar(v); + ButterKnife.inject(this,v); + + return v; + } + + @Override + public void onCreate(final Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + waypointId = getArguments().getInt(WAYPOINT_ARG); + } + + @Override + public void onUpdateGeoData(IGeoData geo) { + if (geo.getCoords() != null && waypoint != null && waypoint.getCoords() != null) { + waypointDistance.setText(Units.getDistanceFromKilometers(geo.getCoords().distanceTo(waypoint.getCoords()))); + waypointDistance.bringToFront(); + } + } + + @Override + protected void init() { + super.init(); + + waypoint = DataStore.loadWaypoint(waypointId); + try { + if (StringUtils.isNotBlank(waypoint.getName())) { + setTitle(waypoint.getName()); + } else { + setTitle(waypoint.getGeocode()); + } + + + actionBarTitle.setCompoundDrawablesWithIntrinsicBounds(getResources().getDrawable(waypoint.getWaypointType().markerId), null, null, null); + + //getSupportActionBar().setIcon(getResources().getDrawable(waypoint.getWaypointType().markerId)); + + details = new CacheDetailsCreator(getActivity(), waypointDetailsLayout); + + //Waypoint geocode + details.add(R.string.cache_geocode, waypoint.getPrefix() + waypoint.getGeocode().substring(2)); + details.addDistance(waypoint, waypointDistance); + waypointDistance = details.getValueView(); + details.add(R.string.waypoint_note, waypoint.getNote()); + + buttonEdit.setOnClickListener(new OnClickListener() { + + @Override + public void onClick(View arg0) { + EditWaypointActivity.startActivityEditWaypoint(getActivity(), cache, waypoint.getId()); + getActivity().finish(); + } + }); + + details = new CacheDetailsCreator(getActivity(), cacheDetailsLayout); + details.add(R.string.cache_name, cache.getName()); + + addCacheDetails(); + + } catch (Exception e) { + Log.e("WaypointPopup.init", e); + } + } + + @Override + public void navigateTo() { + NavigationAppFactory.startDefaultNavigationApplication(1, getActivity(), waypoint); + } + + /** + * Tries to navigate to the {@link Geocache} of this activity. + */ + @Override + public void startDefaultNavigation2() { + if (waypoint == null || waypoint.getCoords() == null) { + showToast(res.getString(R.string.cache_coordinates_no)); + return; + } + NavigationAppFactory.startDefaultNavigationApplication(2, getActivity(), waypoint); + getActivity().finish(); + } + + + + @Override + public void showNavigationMenu() { + NavigationAppFactory.showNavigationMenu(getActivity(), null, waypoint, null); + } + + @Override + protected Geopoint getCoordinates() { + if (waypoint == null) { + return null; + } + return waypoint.getCoords(); + } + + public static DialogFragment newInstance(String geocode, int waypointId) { + + Bundle args = new Bundle(); + args.putInt(WAYPOINT_ARG, waypointId); + args.putString(GEOCODE_ARG, geocode); + + DialogFragment f = new WaypointPopupFragment(); + f.setArguments(args); + f.setStyle(DialogFragment.STYLE_NO_TITLE,0); + + return f; + } +} diff --git a/main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java b/main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java new file mode 100644 index 0000000..63100b8 --- /dev/null +++ b/main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java @@ -0,0 +1,34 @@ +package cgeo.geocaching.activity; + +import android.os.Bundle; + +/** + * Classes actually having an ActionBar (as opposed to the Dialog activities) + */ +public class AbstractActionBarActivity extends AbstractActivity { + @Override + protected void onCreate(Bundle savedInstanceState, int resourceLayoutID) { + super.onCreate(savedInstanceState, resourceLayoutID); + initUpAction(); + showProgress(false); + } + + @Override + public void onCreate(Bundle savedInstanceState) { + super.onCreate(savedInstanceState); + initUpAction(); + showProgress(false); + } + + @Override + protected void onCreate(Bundle savedInstanceState, int resourceLayoutID, boolean useDialogTheme) { + super.onCreate(savedInstanceState, resourceLayoutID, useDialogTheme); + initUpAction(); + showProgress(false); + } + + private void initUpAction() + { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } +} diff --git a/main/src/cgeo/geocaching/activity/AbstractActivity.java b/main/src/cgeo/geocaching/activity/AbstractActivity.java index 542dd05..42eb825 100644 --- a/main/src/cgeo/geocaching/activity/AbstractActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractActivity.java @@ -13,20 +13,22 @@ import cgeo.geocaching.utils.TranslationUtils; import org.apache.commons.lang3.StringUtils; +import rx.Subscription; +import rx.subscriptions.Subscriptions; + import android.content.Intent; import android.content.res.Resources; import android.os.Bundle; -import android.support.v4.app.FragmentActivity; +import android.support.v7.app.ActionBarActivity; import android.view.ContextMenu; import android.view.MenuItem; import android.view.View; +import android.view.Window; import android.widget.EditText; -import rx.Subscription; -import rx.subscriptions.Subscriptions; import java.util.Locale; -public abstract class AbstractActivity extends FragmentActivity implements IAbstractActivity { +public abstract class AbstractActivity extends ActionBarActivity implements IAbstractActivity { protected CgeoApplication app = null; protected Resources res = null; @@ -43,11 +45,7 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst @Override final public void goHome(final View view) { - ActivityMixin.goHome(this); - } - - final protected void setTitle(final String title) { - ActivityMixin.setTitle(this, title); + ActivityMixin.navigateToMain(this); } final protected void showProgress(final boolean show) { @@ -71,7 +69,19 @@ public abstract class AbstractActivity extends FragmentActivity implements IAbst @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + initializeCommonFields(); + + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId()== android.R.id.home) { + ActivityMixin.navigateToMain(this); + return true; + } + return super.onOptionsItemSelected(item); } public void onResume(final Subscription resumeSubscription) { diff --git a/main/src/cgeo/geocaching/activity/AbstractListActivity.java b/main/src/cgeo/geocaching/activity/AbstractListActivity.java index a5d5c14..eaa8a96 100644 --- a/main/src/cgeo/geocaching/activity/AbstractListActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractListActivity.java @@ -4,10 +4,11 @@ import cgeo.geocaching.CgeoApplication; import android.content.res.Resources; import android.os.Bundle; -import android.support.v4.app.FragmentListActivity; +import android.view.MenuItem; import android.view.View; +import android.view.Window; -public abstract class AbstractListActivity extends FragmentListActivity implements +public abstract class AbstractListActivity extends ActionBarListActivity implements IAbstractActivity { private boolean keepScreenOn = false; @@ -25,7 +26,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen @Override final public void goHome(View view) { - ActivityMixin.goHome(this); + ActivityMixin.navigateToMain(this); } final public void showProgress(final boolean show) { @@ -40,7 +41,7 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen public final void showToast(String text) { ActivityMixin.showToast(this, text); } - + @Override public final void showShortToast(String text) { ActivityMixin.showShortToast(this, text); @@ -49,7 +50,24 @@ public abstract class AbstractListActivity extends FragmentListActivity implemen @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + supportRequestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + initializeCommonFields(); + initUpAction(); + } + + protected void initUpAction() + { + getSupportActionBar().setDisplayHomeAsUpEnabled(true); + } + + @Override + public boolean onOptionsItemSelected(MenuItem item) { + if (item.getItemId()== android.R.id.home) { + ActivityMixin.navigateToMain(this); + return true; + } + return super.onOptionsItemSelected(item); } private void initializeCommonFields() { diff --git a/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java b/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java index 6e2900d..e98c935 100644 --- a/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java +++ b/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java @@ -30,7 +30,7 @@ import java.util.Map; * Enum listing all available pages of this activity. The pages available at a certain point of time are * defined by overriding {@link #getOrderedPages()}. */ -public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends AbstractActivity { +public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends AbstractActionBarActivity { /** * A {@link List} of all available pages. diff --git a/main/src/cgeo/geocaching/activity/ActionBarListActivity.java b/main/src/cgeo/geocaching/activity/ActionBarListActivity.java new file mode 100644 index 0000000..07c7ec3 --- /dev/null +++ b/main/src/cgeo/geocaching/activity/ActionBarListActivity.java @@ -0,0 +1,34 @@ +package cgeo.geocaching.activity; + +import android.support.v7.app.ActionBarActivity; +import android.widget.HeaderViewListAdapter; +import android.widget.ListAdapter; +import android.widget.ListView; + +/** + * Compatbility Class until cgeo switches from ListActivities to ListFragments + */ +public class ActionBarListActivity extends ActionBarActivity { + + private ListView mListView; + protected ListView getListView() { + if (mListView == null) { + mListView = (ListView) findViewById(android.R.id.list); + } + return mListView; + } + + protected void setListAdapter(ListAdapter adapter) { + getListView().setAdapter(adapter); + } + + protected ListAdapter getListAdapter() { + ListAdapter adapter = getListView().getAdapter(); + if (adapter instanceof HeaderViewListAdapter) { + return ((HeaderViewListAdapter)adapter).getWrappedAdapter(); + } + return adapter; + } +} + + diff --git a/main/src/cgeo/geocaching/activity/ActivityMixin.java b/main/src/cgeo/geocaching/activity/ActivityMixin.java index bfd45da..c43e1bd 100644 --- a/main/src/cgeo/geocaching/activity/ActivityMixin.java +++ b/main/src/cgeo/geocaching/activity/ActivityMixin.java @@ -9,47 +9,33 @@ import org.apache.commons.lang3.StringUtils; import android.app.Activity; import android.content.Intent; -import android.os.Build; +import android.support.v4.app.NavUtils; +import android.support.v7.app.ActionBarActivity; import android.view.Gravity; -import android.view.View; import android.view.WindowManager; import android.widget.EditText; -import android.widget.ProgressBar; -import android.widget.TextView; import android.widget.Toast; public final class ActivityMixin { - public final static void goHome(final Activity fromActivity) { - final Intent intent = new Intent(fromActivity, MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); - - fromActivity.startActivity(intent); - fromActivity.finish(); - } - public static void setTitle(final Activity activity, final CharSequence text) { if (StringUtils.isBlank(text)) { return; } - final TextView title = (TextView) activity.findViewById(R.id.actionbar_title); - if (title != null) { - title.setText(text); + if (((ActionBarActivity) activity).getSupportActionBar() != null) { + ((ActionBarActivity) activity).getSupportActionBar().setTitle(text); } } - public static void showProgress(final Activity activity, final boolean show) { + + public static void showProgress(final ActionBarActivity activity, final boolean show) { if (activity == null) { return; } - final ProgressBar progress = (ProgressBar) activity.findViewById(R.id.actionbar_progress); - if (show) { - progress.setVisibility(View.VISIBLE); - } else { - progress.setVisibility(View.GONE); - } + activity.setSupportProgressBarIndeterminateVisibility(show); + } public static void setTheme(final Activity activity) { @@ -62,10 +48,10 @@ public final class ActivityMixin { public static int getDialogTheme() { // Light theme dialogs don't work on Android Api < 11 - if (Settings.isLightSkin() && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { + // The compat theme should fix this + if (Settings.isLightSkin()) { return R.style.popup_light; } - return R.style.popup_dark; } @@ -127,4 +113,9 @@ public final class ActivityMixin { int newCursor = moveCursor ? start + completeText.length() : start; editText.setSelection(newCursor); } + + public static void navigateToMain(Activity activity) { + final Intent main = new Intent(activity, MainActivity.class); + NavUtils.navigateUpTo(activity, main); + } } diff --git a/main/src/cgeo/geocaching/list/AbstractList.java b/main/src/cgeo/geocaching/list/AbstractList.java index ec783eb..ec70deb 100644 --- a/main/src/cgeo/geocaching/list/AbstractList.java +++ b/main/src/cgeo/geocaching/list/AbstractList.java @@ -20,6 +20,10 @@ public abstract class AbstractList { public abstract boolean isConcrete(); + public abstract String getTitle(); + + public abstract int getCount(); + @Nullable public static AbstractList getListById(int listId) { return LISTS.get(listId); diff --git a/main/src/cgeo/geocaching/list/PseudoList.java b/main/src/cgeo/geocaching/list/PseudoList.java index f2cc7ed..71f9123 100644 --- a/main/src/cgeo/geocaching/list/PseudoList.java +++ b/main/src/cgeo/geocaching/list/PseudoList.java @@ -36,6 +36,16 @@ public class PseudoList extends AbstractList { } @Override + public String getTitle() { + return title; + } + + @Override + public int getCount() { + return -1; + } + + @Override public boolean isConcrete() { return false; } diff --git a/main/src/cgeo/geocaching/list/StoredList.java b/main/src/cgeo/geocaching/list/StoredList.java index 84e1163..e6cad56 100644 --- a/main/src/cgeo/geocaching/list/StoredList.java +++ b/main/src/cgeo/geocaching/list/StoredList.java @@ -78,25 +78,7 @@ public final class StoredList extends AbstractList { } public void promptForListSelection(final int titleId, @NonNull final Action1<Integer> runAfterwards, final boolean onlyConcreteLists, final int exceptListId, final String newListName) { - final List<AbstractList> lists = new ArrayList<AbstractList>(); - lists.addAll(getSortedLists()); - - if (exceptListId > StoredList.TEMPORARY_LIST_ID) { - StoredList exceptList = DataStore.getList(exceptListId); - if (exceptList != null) { - lists.remove(exceptList); - } - } - - if (!onlyConcreteLists) { - if (exceptListId != PseudoList.ALL_LIST.id) { - lists.add(PseudoList.ALL_LIST); - } - if (exceptListId != PseudoList.HISTORY_LIST.id) { - lists.add(PseudoList.HISTORY_LIST); - } - } - lists.add(PseudoList.NEW_LIST); + final List<AbstractList> lists = getMenuLists(onlyConcreteLists, exceptListId); final List<CharSequence> listsTitle = new ArrayList<CharSequence>(); for (AbstractList list : lists) { @@ -124,6 +106,31 @@ public final class StoredList extends AbstractList { builder.create().show(); } + public static List<AbstractList> getMenuLists(boolean onlyConcreteLists, int exceptListId) { + final List<AbstractList> lists = new ArrayList<AbstractList>(); + lists.addAll(getSortedLists()); + + if (exceptListId > StoredList.TEMPORARY_LIST_ID) { + StoredList exceptList = DataStore.getList(exceptListId); + if (exceptList != null) { + lists.remove(exceptList); + } + } + + if (!onlyConcreteLists) { + if (exceptListId != PseudoList.ALL_LIST.id) { + lists.add(PseudoList.ALL_LIST); + } + if (exceptListId != PseudoList.HISTORY_LIST.id) { + lists.add(PseudoList.HISTORY_LIST); + } + } + if (exceptListId != PseudoList.NEW_LIST.id) { + lists.add(PseudoList.NEW_LIST); + } + return lists; + } + @NonNull private static List<StoredList> getSortedLists() { final Collator collator = Collator.getInstance(); @@ -203,14 +210,18 @@ public final class StoredList extends AbstractList { } /** - * Get the list title. This method is not public by intention to make clients use the {@link UserInterface} class. - * - * @return + * Get the list title. */ - protected String getTitle() { + @Override + public String getTitle() { return title; } + @Override + public int getCount() { + return count; + } + /** * Return the given list, if it is a concrete list. Return the default list otherwise. */ diff --git a/main/src/cgeo/geocaching/maps/AbstractMap.java b/main/src/cgeo/geocaching/maps/AbstractMap.java index d341823..aff9c75 100644 --- a/main/src/cgeo/geocaching/maps/AbstractMap.java +++ b/main/src/cgeo/geocaching/maps/AbstractMap.java @@ -5,10 +5,12 @@ import cgeo.geocaching.maps.interfaces.MapActivityImpl; import android.app.Activity; import android.content.res.Resources; +import android.os.Build; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.view.Window; /** * Base class for the map activity. Delegates base class calls to the @@ -31,7 +33,11 @@ public abstract class AbstractMap { } public void onCreate(Bundle savedInstanceState) { + mapActivity.superOnCreate(savedInstanceState); + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) { + mapActivity.getActivity().requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS); + } } public void onResume() { diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java index b5d0b0e..004081f 100644 --- a/main/src/cgeo/geocaching/maps/CGeoMap.java +++ b/main/src/cgeo/geocaching/maps/CGeoMap.java @@ -50,6 +50,7 @@ import rx.schedulers.Schedulers; import rx.subscriptions.CompositeSubscription; import rx.subscriptions.Subscriptions; +import android.annotation.TargetApi; import android.app.Activity; import android.app.AlertDialog; import android.app.ProgressDialog; @@ -60,6 +61,7 @@ import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.graphics.drawable.LayerDrawable; import android.location.Location; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.os.Message; @@ -69,9 +71,11 @@ import android.view.MenuItem; import android.view.SubMenu; import android.view.View; import android.view.ViewGroup.LayoutParams; +import android.widget.CheckBox; import android.widget.ImageSwitcher; import android.widget.ImageView; import android.widget.ImageView.ScaleType; +import android.widget.ProgressBar; import android.widget.TextView; import android.widget.ViewSwitcher.ViewFactory; @@ -183,7 +187,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto private int detailProgress = 0; private long detailProgressTime = 0L; // views - private ImageSwitcher myLocSwitch = null; + private CheckBox myLocSwitch = null; /** Controls the map behaviour */ private MapMode mapMode = null; @@ -239,7 +243,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto title.append('[').append(lastSearchResult.getUrl()).append(']'); } - ActivityMixin.setTitle(activity, title.toString()); + setTitle(title.toString()); break; case INVALIDATE_MAP: mapView.repaintRequired(null); @@ -250,6 +254,24 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } } }; + + private void setTitle(String title) { + /* Compatibily for the old Action Bar, only used by the maps activity at the moment */ + final TextView titleview = (TextView) activity.findViewById(R.id.actionbar_title); + if (titleview != null) { + titleview.setText(title); + + } + if ((Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB)) { + setTitleHoneyComb(title); + } + } + + @TargetApi(Build.VERSION_CODES.HONEYCOMB) + private void setTitleHoneyComb(String title) { + activity.getActionBar().setTitle(title); + } + /** Updates the progress. */ final private Handler showProgressHandler = new Handler() { @@ -261,15 +283,32 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto if (what == HIDE_PROGRESS) { if (--counter == 0) { - ActivityMixin.showProgress(activity, false); + showProgress(false); } } else if (what == SHOW_PROGRESS) { - ActivityMixin.showProgress(activity, true); + showProgress(true); counter++; } } + + private void showProgress(boolean show) { + final ProgressBar progress = (ProgressBar) activity.findViewById(R.id.actionbar_progress); + if (progress != null) { + if (show) { + progress.setVisibility(View.VISIBLE); + } else { + progress.setVisibility(View.GONE); + + } + } + if (Build.VERSION.SDK_INT >= 11) { + activity.setProgressBarIndeterminateVisibility(show); + } + } }; + + final private class LoadDetailsHandler extends CancellableHandler { @Override @@ -360,6 +399,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } } + @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); @@ -417,10 +457,16 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto ActivityMixin.keepScreenOn(activity, true); + // set layout - ActivityMixin.setTheme(activity); + //ActivityMixin.setTheme(activity); + // TODO: set a proper theme + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) { + activity.setTheme(android.R.style.Theme_Holo); + activity.getActionBar().setDisplayHomeAsUpEnabled(true); + } activity.setContentView(mapProvider.getMapLayoutId()); - ActivityMixin.setTitle(activity, res.getString(R.string.map_map)); + setTitle(res.getString(R.string.map_map)); // initialize map mapView = (MapViewImpl) activity.findViewById(mapProvider.getMapViewId()); @@ -461,14 +507,11 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto centerMap(geocodeIntent, searchIntent, coordsIntent, mapStateIntent); } - // prepare my location button - myLocSwitch = (ImageSwitcher) activity.findViewById(R.id.my_position); - myLocSwitch.setFactory(this); - myLocSwitch.setInAnimation(activity, android.R.anim.fade_in); - myLocSwitch.setOutAnimation(activity, android.R.anim.fade_out); - myLocSwitch.setOnClickListener(new MyLocationListener()); - switchMyLocationButton(); + CheckBox locSwitch = (CheckBox) activity.findViewById(R.id.my_position); + if (locSwitch!=null) { + initMyLocationSwitchButton(locSwitch); + } prepareFilterBar(); if (!app.isLiveMapHintShownInThisSession() && !Settings.getHideLiveMapHint() && Settings.getLiveMapHintShowCount() <= 3) { @@ -476,6 +519,16 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto } } + private void initMyLocationSwitchButton(CheckBox locSwitch) { + myLocSwitch = locSwitch; + /* TODO: Switch back to ImageSwitcher for animations? + myLocSwitch.setFactory(this); + myLocSwitch.setInAnimation(activity, android.R.anim.fade_in); + myLocSwitch.setOutAnimation(activity, android.R.anim.fade_out); */ + myLocSwitch.setOnClickListener(new MyLocationListener()); + switchMyLocationButton(); + } + /** * Set the zoom of the map. The zoom is restricted to a certain minimum in case of live map. * @@ -531,6 +584,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto super.onPause(); } + @TargetApi(Build.VERSION_CODES.HONEYCOMB) @Override public boolean onCreateOptionsMenu(Menu menu) { // menu inflation happens in Google/Mapsforge specific classes @@ -540,6 +594,19 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto final SubMenu subMenuStrategy = menu.findItem(R.id.submenu_strategy).getSubMenu(); subMenuStrategy.setHeaderTitle(res.getString(R.string.map_strategy_title)); + + + if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB) { + /* if we have an Actionbar find the my position toggle */ + MenuItem item = menu.findItem(R.id.menu_toggle_mypos); + myLocSwitch = new CheckBox(activity); + myLocSwitch.setButtonDrawable(R.drawable.ic_menu_myposition); + item.setActionView(myLocSwitch); + initMyLocationSwitchButton(myLocSwitch); + } else { + // Already on the fake Actionbar + menu.removeItem(R.id.menu_toggle_mypos); + } return true; } @@ -616,6 +683,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto public boolean onOptionsItemSelected(MenuItem item) { final int id = item.getItemId(); switch (id) { + case android.R.id.home: + ActivityMixin.navigateToMain(activity); + return true; case R.id.menu_trail_mode: Settings.setMapTrail(!Settings.isMapTrail()); mapView.repaintRequired(overlayPositionAndScale); @@ -1460,11 +1530,9 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // switch My Location button image private void switchMyLocationButton() { + myLocSwitch.setChecked(followMyLocation); if (followMyLocation) { - myLocSwitch.setImageResource(R.drawable.actionbar_mylocation_on); myLocationInMiddle(app.currentGeo()); - } else { - myLocSwitch.setImageResource(R.drawable.actionbar_mylocation_off); } } @@ -1493,7 +1561,7 @@ public class CGeoMap extends AbstractMap implements OnMapDragListener, ViewFacto // close activity and open homescreen @Override public void goHome(View view) { - ActivityMixin.goHome(activity); + ActivityMixin.navigateToMain(activity); } @Override diff --git a/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java b/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java index a98241f..8a1bad6 100644 --- a/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java +++ b/main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java @@ -1,5 +1,6 @@ package cgeo.geocaching.maps.google; +import cgeo.geocaching.activity.ActivityMixin; import cgeo.geocaching.activity.FilteredActivity; import cgeo.geocaching.maps.AbstractMap; import cgeo.geocaching.maps.CGeoMap; @@ -97,6 +98,11 @@ public class GoogleMapActivity extends MapActivity implements MapActivityImpl, F } @Override + public void goHome(View view) { + ActivityMixin.navigateToMain(this); + } + + @Override public void superOnResume() { super.onResume(); } @@ -116,12 +122,6 @@ public class GoogleMapActivity extends MapActivity implements MapActivityImpl, F return super.onPrepareOptionsMenu(menu); } - // close activity and open homescreen - @Override - public void goHome(View view) { - mapBase.goHome(view); - } - @Override public void showFilterMenu(View view) { // do nothing, the filter bar only shows the global filter diff --git a/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java b/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java index e7deebd..08309f4 100644 --- a/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java +++ b/main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java @@ -34,5 +34,4 @@ public interface MapActivityImpl { boolean superOnOptionsItemSelected(MenuItem item); public abstract void goHome(View view); - } diff --git a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java index e74751b..527f024 100644 --- a/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java +++ b/main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java @@ -4,7 +4,7 @@ import butterknife.InjectView; import cgeo.geocaching.Intents; import cgeo.geocaching.R; -import cgeo.geocaching.activity.AbstractActivity; +import cgeo.geocaching.activity.AbstractActionBarActivity; import cgeo.geocaching.utils.BundleUtils; import cgeo.geocaching.utils.Log; import cgeo.geocaching.utils.MatcherWrapper; @@ -32,7 +32,7 @@ import android.widget.TextView; import java.io.IOException; import java.util.regex.Pattern; -public abstract class OAuthAuthorizationActivity extends AbstractActivity { +public abstract class OAuthAuthorizationActivity extends AbstractActionBarActivity { public static final int NOT_AUTHENTICATED = 0; public static final int AUTHENTICATED = 1; diff --git a/main/src/cgeo/geocaching/utils/TranslationUtils.java b/main/src/cgeo/geocaching/utils/TranslationUtils.java index 619db08..ea3c395 100644 --- a/main/src/cgeo/geocaching/utils/TranslationUtils.java +++ b/main/src/cgeo/geocaching/utils/TranslationUtils.java @@ -1,10 +1,10 @@ package cgeo.geocaching.utils; -import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.network.Network; import org.apache.commons.lang3.StringUtils; +import android.app.Activity; import android.content.Intent; import android.net.Uri; @@ -51,7 +51,7 @@ public final class TranslationUtils { * @param text * The text to be translated */ - public static void startActivityTranslate(final AbstractActivity context, final String toLang, final String text) { + public static void startActivityTranslate(final Activity context, final String toLang, final String text) { context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(buildTranslationURI(toLang, text)))); } } |