aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArne Schwabe <arne@rfc2549.org>2014-04-20 21:38:19 +0200
committerArne Schwabe <arne@rfc2549.org>2014-05-17 13:08:14 +0200
commitbe26c1845210a1c8824677ed6e2d093073ea5c84 (patch)
tree81d02773f4fd9edc5d05b44c770be89994a9c207
parent496878826d638367c129b02e66f992202e0d36c9 (diff)
downloadcgeo-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
-rw-r--r--main/AndroidManifest.xml2
-rw-r--r--main/project.properties1
-rw-r--r--main/res/drawable/ic_menu_myposition.xml5
-rw-r--r--main/res/layout-land/compass_activity.xml2
-rw-r--r--main/res/layout-v11/actionbar_maps.xml7
-rw-r--r--main/res/layout/actionbar.xml7
-rw-r--r--main/res/layout/actionbar_button_compass.xml15
-rw-r--r--main/res/layout/actionbar_button_map.xml13
-rw-r--r--main/res/layout/actionbar_button_myposition.xml12
-rw-r--r--main/res/layout/actionbar_button_search.xml13
-rw-r--r--main/res/layout/actionbar_maps.xml41
-rw-r--r--main/res/layout/actionbar_popup.xml32
-rw-r--r--main/res/layout/actionbar_progress.xml5
-rw-r--r--main/res/layout/actionbar_title.xml16
-rw-r--r--main/res/layout/actionbar_title_no_home.xml10
-rw-r--r--main/res/layout/addresslist_activity.xml2
-rw-r--r--main/res/layout/authorization_activity.xml2
-rw-r--r--main/res/layout/cachedetail_activity.xml7
-rw-r--r--main/res/layout/cachelist_spinneritem.xml32
-rw-r--r--main/res/layout/cacheslist_activity.xml9
-rw-r--r--main/res/layout/cacheslist_item.xml4
-rw-r--r--main/res/layout/compass_activity.xml2
-rw-r--r--main/res/layout/editwaypoint_activity.xml2
-rw-r--r--main/res/layout/gpx.xml2
-rw-r--r--main/res/layout/images_activity.xml2
-rw-r--r--main/res/layout/imageselect_activity.xml7
-rw-r--r--main/res/layout/logcache_activity.xml7
-rw-r--r--main/res/layout/logtrackable_activity.xml7
-rw-r--r--main/res/layout/main_activity.xml11
-rw-r--r--main/res/layout/map_google.xml7
-rw-r--r--main/res/layout/map_mapsforge.xml9
-rw-r--r--main/res/layout/map_mapsforge_old.xml9
-rw-r--r--main/res/layout/navigateanypoint_activity.xml2
-rw-r--r--main/res/layout/popup.xml17
-rw-r--r--main/res/layout/search_activity.xml2
-rw-r--r--main/res/layout/staticmaps_activity.xml2
-rw-r--r--main/res/layout/usefulapps_activity.xml2
-rw-r--r--main/res/layout/viewpager_activity.xml2
-rw-r--r--main/res/layout/waypoint_popup.xml7
-rw-r--r--main/res/menu/abstract_logging_activity.xml12
-rw-r--r--main/res/menu/cache_list_context.xml16
-rw-r--r--main/res/menu/cache_list_options.xml11
-rw-r--r--main/res/menu/cache_options.xml24
-rw-r--r--main/res/menu/compass_activity_options.xml9
-rw-r--r--main/res/menu/details_context.xml3
-rw-r--r--main/res/menu/images_list_context.xml5
-rw-r--r--main/res/menu/logging_ui.xml5
-rw-r--r--main/res/menu/main_activity_options.xml17
-rw-r--r--main/res/menu/map_activity.xml19
-rw-r--r--main/res/menu/navigate_any_point_activity_options.xml15
-rw-r--r--main/res/menu/search_activity_options.xml7
-rw-r--r--main/res/menu/static_maps_activity_options.xml4
-rw-r--r--main/res/menu/trackable_activity.xml5
-rw-r--r--main/res/menu/waypoint_options.xml3
-rw-r--r--main/res/values/attrs.xml1
-rw-r--r--main/res/values/strings.xml3
-rw-r--r--main/res/values/styles.xml6
-rw-r--r--main/res/values/themes.xml63
-rw-r--r--main/src/cgeo/geocaching/AbstractDialogFragment.java354
-rw-r--r--main/src/cgeo/geocaching/AbstractLoggingActivity.java4
-rw-r--r--main/src/cgeo/geocaching/AbstractPopupActivity.java260
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java32
-rw-r--r--main/src/cgeo/geocaching/CacheListActivity.java154
-rw-r--r--main/src/cgeo/geocaching/CacheMenuHandler.java32
-rw-r--r--main/src/cgeo/geocaching/CachePopup.java214
-rw-r--r--main/src/cgeo/geocaching/CachePopupFragment.java229
-rw-r--r--main/src/cgeo/geocaching/CompassActivity.java4
-rw-r--r--main/src/cgeo/geocaching/CreateShortcutActivity.java4
-rw-r--r--main/src/cgeo/geocaching/EditWaypointActivity.java4
-rw-r--r--main/src/cgeo/geocaching/Geocache.java8
-rw-r--r--main/src/cgeo/geocaching/ImageSelectActivity.java4
-rw-r--r--main/src/cgeo/geocaching/ImagesActivity.java4
-rw-r--r--main/src/cgeo/geocaching/MainActivity.java30
-rw-r--r--main/src/cgeo/geocaching/NavigateAnyPointActivity.java6
-rw-r--r--main/src/cgeo/geocaching/SearchActivity.java4
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java6
-rw-r--r--main/src/cgeo/geocaching/TrackableActivity.java9
-rw-r--r--main/src/cgeo/geocaching/UsefulAppsActivity.java4
-rw-r--r--main/src/cgeo/geocaching/WaypointPopup.java136
-rw-r--r--main/src/cgeo/geocaching/WaypointPopupFragment.java147
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActionBarActivity.java34
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractActivity.java28
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractListActivity.java26
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java2
-rw-r--r--main/src/cgeo/geocaching/activity/ActionBarListActivity.java34
-rw-r--r--main/src/cgeo/geocaching/activity/ActivityMixin.java39
-rw-r--r--main/src/cgeo/geocaching/list/AbstractList.java4
-rw-r--r--main/src/cgeo/geocaching/list/PseudoList.java10
-rw-r--r--main/src/cgeo/geocaching/list/StoredList.java57
-rw-r--r--main/src/cgeo/geocaching/maps/AbstractMap.java6
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java102
-rw-r--r--main/src/cgeo/geocaching/maps/google/GoogleMapActivity.java12
-rw-r--r--main/src/cgeo/geocaching/maps/interfaces/MapActivityImpl.java1
-rw-r--r--main/src/cgeo/geocaching/network/OAuthAuthorizationActivity.java4
-rw-r--r--main/src/cgeo/geocaching/utils/TranslationUtils.java4
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))));
}
}