diff options
Diffstat (limited to 'main')
| -rw-r--r-- | main/proguard-project.txt | 5 | ||||
| -rw-r--r-- | main/res/menu/cache_options.xml | 3 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 5 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheMenuHandler.java | 9 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/apps/cache/navi/NavigationSelectionActionProvider.java | 85 |
5 files changed, 100 insertions, 7 deletions
diff --git a/main/proguard-project.txt b/main/proguard-project.txt index 9b0978c..2a27d99 100644 --- a/main/proguard-project.txt +++ b/main/proguard-project.txt @@ -59,8 +59,7 @@ # Null analysis annotations of Eclipse JDT are just used by the Eclipse compiler, so ignore them here -dontwarn org.eclipse.jdt.annotation.** -# the sort action provider is only referenced from XML +# action providers are only referenced from XML -keep public class cgeo.geocaching.sorting.SortActionProvider { *; } - -# the navigation action provider is only referenced from XML -keep public class cgeo.geocaching.ui.NavigationActionProvider { *; } +-keep public class cgeo.geocaching.apps.cache.navi.NavigationSelectionActionProvider { *; }
\ No newline at end of file diff --git a/main/res/menu/cache_options.xml b/main/res/menu/cache_options.xml index 2e0e2bd..f6ca4aa 100644 --- a/main/res/menu/cache_options.xml +++ b/main/res/menu/cache_options.xml @@ -7,12 +7,13 @@ android:icon="@drawable/ic_menu_compass" android:title="@string/cache_menu_navigate" app:actionProviderClass="cgeo.geocaching.ui.NavigationActionProvider" - app:showAsAction="always"> <!-- will be replaced --> + app:showAsAction="always"> </item> <item android:id="@+id/menu_navigate" android:icon="@drawable/ic_menu_mapmode" android:title="@string/cache_menu_navigate" + app:actionProviderClass="cgeo.geocaching.apps.cache.navi.NavigationSelectionActionProvider" app:showAsAction="ifRoom"> </item> <item diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 61403b9..3a7fa0f 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -9,6 +9,7 @@ import cgeo.geocaching.activity.AbstractViewPagerActivity; import cgeo.geocaching.activity.INavigationSource; import cgeo.geocaching.activity.Progress; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; +import cgeo.geocaching.apps.cache.navi.NavigationSelectionActionProvider; import cgeo.geocaching.apps.cachelist.MapsWithMeCacheListApp; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.connector.ConnectorFactory; @@ -430,11 +431,13 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc @Override public boolean onCreateOptionsMenu(final Menu menu) { CacheMenuHandler.addMenuItems(this, menu, cache); - final MenuItem menuItem = menu.findItem(R.id.menu_default_navigation); + MenuItem menuItem = menu.findItem(R.id.menu_default_navigation); final NavigationActionProvider navAction = (NavigationActionProvider) MenuItemCompat.getActionProvider(menuItem); if (navAction != null) { navAction.setNavigationSource(this); } + menuItem = menu.findItem(R.id.menu_navigate); + NavigationSelectionActionProvider.initialize(menuItem, cache); return true; } diff --git a/main/src/cgeo/geocaching/CacheMenuHandler.java b/main/src/cgeo/geocaching/CacheMenuHandler.java index 9c8af50..0dc6444 100644 --- a/main/src/cgeo/geocaching/CacheMenuHandler.java +++ b/main/src/cgeo/geocaching/CacheMenuHandler.java @@ -2,6 +2,7 @@ package cgeo.geocaching; import cgeo.calendar.CalendarAddon; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; +import cgeo.geocaching.apps.cache.navi.NavigationSelectionActionProvider; import cgeo.geocaching.ui.AbstractUIFactory; import android.app.Activity; @@ -46,8 +47,12 @@ public class CacheMenuHandler extends AbstractUIFactory { activityInterface.navigateTo(); return true; case R.id.menu_navigate: - activityInterface.showNavigationMenu(); - return true; + final NavigationSelectionActionProvider navigationProvider = (NavigationSelectionActionProvider) MenuItemCompat.getActionProvider(item); + if (navigationProvider == null) { + activityInterface.showNavigationMenu(); + return true; + } + return false; case R.id.menu_caches_around: activityInterface.cachesAround(); return true; diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationSelectionActionProvider.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationSelectionActionProvider.java new file mode 100644 index 0000000..9abc581 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationSelectionActionProvider.java @@ -0,0 +1,85 @@ +package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.Geocache; +import cgeo.geocaching.apps.App; +import cgeo.geocaching.apps.cache.navi.NavigationAppFactory.NavigationAppsEnum; + +import android.app.Activity; +import android.content.Context; +import android.support.v4.view.ActionProvider; +import android.support.v4.view.MenuItemCompat; +import android.view.Menu; +import android.view.MenuItem; +import android.view.MenuItem.OnMenuItemClickListener; +import android.view.SubMenu; +import android.view.View; + +import java.util.List; + +public class NavigationSelectionActionProvider extends ActionProvider { + + private Geocache geocache; + private final Activity activity; + + public NavigationSelectionActionProvider(final Context context) { + super(context); + activity = (Activity) context; + } + + @Override + public boolean hasSubMenu() { + return true; + } + + @Override + public View onCreateActionView() { + // must return null, otherwise the menu will not work + return null; + } + + public void setTarget(final Geocache cache) { + geocache = cache; + } + + @Override + public void onPrepareSubMenu(final SubMenu subMenu) { + subMenu.clear(); + if (geocache == null) { + return; + } + for (final NavigationAppsEnum app : NavigationAppFactory.getInstalledNavigationApps()) { + if (app.app.isEnabled(geocache)) { + subMenu.add(Menu.NONE, app.id, Menu.NONE, app.app.getName()).setOnMenuItemClickListener(new OnMenuItemClickListener() { + + @Override + public boolean onMenuItemClick(final MenuItem item) { + final CacheNavigationApp app = (CacheNavigationApp) getNavigationAppForId(item.getItemId()); + app.navigate(activity, geocache); + return true; + } + }); + } + } + } + + private static App getNavigationAppForId(final int navigationAppId) { + final List<NavigationAppsEnum> installedNavigationApps = NavigationAppFactory.getInstalledNavigationApps(); + + for (final NavigationAppsEnum navigationApp : installedNavigationApps) { + if (navigationApp.id == navigationAppId) { + return navigationApp.app; + } + } + // default navigation tool wasn't set already or couldn't be found (not installed any more for example) + return NavigationAppsEnum.COMPASS.app; + } + + public static void initialize(final MenuItem menuItem, final Geocache cache) { + final ActionProvider actionProvider = MenuItemCompat.getActionProvider(menuItem); + if (actionProvider instanceof NavigationSelectionActionProvider) { + final NavigationSelectionActionProvider navigateAction = (NavigationSelectionActionProvider) actionProvider; + navigateAction.setTarget(cache); + } + } + +} |
