diff options
| author | Bananeweizen <bananeweizen@gmx.de> | 2014-08-17 07:17:05 +0200 |
|---|---|---|
| committer | Bananeweizen <bananeweizen@gmx.de> | 2014-08-17 07:17:05 +0200 |
| commit | e3be57dd69935b33b63b172bbf206bf402aa8b3f (patch) | |
| tree | bdf9e271e1186266e8a16baed979cadcb2812af8 /main/src | |
| parent | 8c468294662cb57a1d7b8ec8b9a9195e277bc339 (diff) | |
| download | cgeo-e3be57dd69935b33b63b172bbf206bf402aa8b3f.zip cgeo-e3be57dd69935b33b63b172bbf206bf402aa8b3f.tar.gz cgeo-e3be57dd69935b33b63b172bbf206bf402aa8b3f.tar.bz2 | |
convert navigation popup menu to action menu
Diffstat (limited to 'main/src')
3 files changed, 96 insertions, 3 deletions
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); + } + } + +} |
