diff options
Diffstat (limited to 'main')
7 files changed, 132 insertions, 112 deletions
diff --git a/main/res/menu/cache_list_options.xml b/main/res/menu/cache_list_options.xml index 8c2b066..30fe28a 100644 --- a/main/res/menu/cache_list_options.xml +++ b/main/res/menu/cache_list_options.xml @@ -53,12 +53,12 @@ android:visible="false"> </item> <item - android:id="@+id/submenu_cache_list_app" + android:id="@+id/menu_cache_list_app_provider" + android:actionProviderClass="cgeo.geocaching.apps.cachelist.ListNavigationSelectionActionProvider" android:icon="@drawable/ic_menu_goto" android:title="@string/caches_on_map" + app:actionProviderClass="cgeo.geocaching.apps.cachelist.ListNavigationSelectionActionProvider" android:visible="false"> - <menu> - </menu> </item> <item android:id="@+id/menu_create_list" diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index 2be802f..05c593c 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -494,13 +494,12 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc @Override public boolean onCreateOptionsMenu(final Menu menu) { CacheMenuHandler.addMenuItems(this, menu, cache); - MenuItem menuItem = menu.findItem(R.id.menu_default_navigation); + final 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); + NavigationSelectionActionProvider.initialize(menu.findItem(R.id.menu_navigate), cache); return true; } diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java index 9090a4e..c6cac21 100644 --- a/main/src/cgeo/geocaching/CacheListActivity.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -9,7 +9,9 @@ import cgeo.geocaching.activity.FilteredActivity; import cgeo.geocaching.activity.Progress; import cgeo.geocaching.activity.ShowcaseViewBuilder; import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; -import cgeo.geocaching.apps.cachelist.CacheListAppFactory; +import cgeo.geocaching.apps.cachelist.CacheListApp; +import cgeo.geocaching.apps.cachelist.CacheListApps; +import cgeo.geocaching.apps.cachelist.ListNavigationSelectionActionProvider; import cgeo.geocaching.compatibility.Compatibility; import cgeo.geocaching.connector.gc.RecaptchaHandler; import cgeo.geocaching.enumerations.CacheListType; @@ -558,7 +560,6 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA public boolean onCreateOptionsMenu(final Menu menu) { getMenuInflater().inflate(R.menu.cache_list_options, menu); - CacheListAppFactory.addMenuItems(menu, this, res); sortProvider = (SortActionProvider) MenuItemCompat.getActionProvider(menu.findItem(R.id.menu_sort)); assert sortProvider != null; // We set it in the XML file sortProvider.setSelection(adapter.getCacheComparator()); @@ -579,6 +580,15 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA sortProvider.setSelection(selectedComparator); } }); + + ListNavigationSelectionActionProvider.initialize(menu.findItem(R.id.menu_cache_list_app_provider), new ListNavigationSelectionActionProvider.Callback() { + + @Override + public void onListNavigationSelected(final CacheListApp app) { + app.invoke(cacheList, CacheListActivity.this, getFilteredSearch()); + } + }); + return true; } @@ -639,6 +649,11 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA setMenuItemLabel(menu, R.id.menu_remove_from_history, R.string.cache_remove_from_history, R.string.cache_clear_history); menu.findItem(R.id.menu_import_android).setVisible(Compatibility.isStorageAccessFrameworkAvailable() && isOffline); + + final List<CacheListApp> listNavigationApps = CacheListApps.getActiveApps(); + menu.findItem(R.id.menu_cache_list_app_provider).setVisible(listNavigationApps.size() > 1); + menu.findItem(R.id.menu_cache_list_app).setVisible(listNavigationApps.size() == 1); + } catch (final RuntimeException e) { Log.e("CacheListActivity.onPrepareOptionsMenu", e); } @@ -679,9 +694,6 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA @Override public boolean onOptionsItemSelected(final MenuItem item) { - if (super.onOptionsItemSelected(item)) { - return true; - } switch (item.getItemId()) { case R.id.menu_show_on_map: goMap(); @@ -705,23 +717,23 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA case R.id.menu_import_android: importGpxFromAndroid(); invalidateOptionsMenuCompatible(); - return false; + return true; case R.id.menu_create_list: new StoredList.UserInterface(this).promptForListCreation(getListSwitchingRunnable(), listNameMemento.getTerm()); refreshSpinnerAdapter(); invalidateOptionsMenuCompatible(); - return false; + return true; case R.id.menu_drop_list: removeList(false); invalidateOptionsMenuCompatible(); - return false; + return true; case R.id.menu_rename_list: renameList(); - return false; + return true; case R.id.menu_invert_selection: adapter.invertSelection(); invalidateOptionsMenuCompatible(); - return false; + return true; case R.id.menu_filter: showFilterMenu(null); return true; @@ -737,7 +749,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA case R.id.menu_remove_from_history: removeFromHistoryCheck(); invalidateOptionsMenuCompatible(); - return false; + return true; case R.id.menu_move_to_list: moveCachesToOtherList(); invalidateOptionsMenuCompatible(); @@ -751,13 +763,12 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA invalidateOptionsMenuCompatible(); return true; case R.id.menu_cache_list_app: - if (!cacheToShow()) { - return false; + if (cacheToShow()) { + CacheListApps.getActiveApps().get(0).invoke(cacheList, this, getFilteredSearch()); } - return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, getFilteredSearch()); - default: - return CacheListAppFactory.onMenuItemSelected(item, cacheList, this, search); + return true; } + return super.onOptionsItemSelected(item); } private boolean cacheToShow() { diff --git a/main/src/cgeo/geocaching/apps/cachelist/CacheListApp.java b/main/src/cgeo/geocaching/apps/cachelist/CacheListApp.java index 40c4d92..8beb5e4 100644 --- a/main/src/cgeo/geocaching/apps/cachelist/CacheListApp.java +++ b/main/src/cgeo/geocaching/apps/cachelist/CacheListApp.java @@ -8,7 +8,7 @@ import android.app.Activity; import java.util.List; -interface CacheListApp extends App { +public interface CacheListApp extends App { boolean invoke(final List<Geocache> caches, final Activity activity, final SearchResult search); diff --git a/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java b/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java deleted file mode 100644 index b6706a0..0000000 --- a/main/src/cgeo/geocaching/apps/cachelist/CacheListAppFactory.java +++ /dev/null @@ -1,89 +0,0 @@ -package cgeo.geocaching.apps.cachelist; - -import cgeo.geocaching.Geocache; -import cgeo.geocaching.R; -import cgeo.geocaching.SearchResult; -import cgeo.geocaching.activity.ActivityMixin; -import cgeo.geocaching.apps.AbstractAppFactory; -import cgeo.geocaching.utils.Log; - -import android.app.Activity; -import android.content.res.Resources; -import android.view.Menu; -import android.view.MenuItem; -import android.view.SubMenu; - -import java.util.ArrayList; -import java.util.List; - -public final class CacheListAppFactory extends AbstractAppFactory { - - private CacheListAppFactory() { - // utility class - } - - private static class LazyHolder { - public static final CacheListApp[] apps = { - new InternalCacheListMap(), - new LocusShowCacheListApp(), - new LocusExportCacheListApp(), - new MapsWithMeCacheListApp() - }; - } - - /** - * @param menu - * @param activity - * @param res - */ - public static void addMenuItems(final Menu menu, final Activity activity, final Resources res) { - final List<CacheListApp> activeApps = getActiveApps(); - if (activeApps.isEmpty()) { - return; - } - if (activeApps.size() == 1) { - final MenuItem subItem = menu.findItem(R.id.menu_cache_list_app); - subItem.setVisible(true); - subItem.setTitle(activeApps.get(0).getName()); - } else { - final MenuItem subItem = menu.findItem(R.id.submenu_cache_list_app); - subItem.setVisible(true); - final SubMenu subMenu = subItem.getSubMenu(); - for (final CacheListApp app : activeApps) { - subMenu.add(0, app.getId(), 0, app.getName()); - } - } - } - - private static List<CacheListApp> getActiveApps() { - final List<CacheListApp> activeApps = new ArrayList<>(LazyHolder.apps.length); - for (final CacheListApp app : LazyHolder.apps) { - if (app.isInstalled()) { - activeApps.add(app); - } - } - return activeApps; - } - - public static boolean onMenuItemSelected(final MenuItem item, final List<Geocache> caches, final Activity activity, - final SearchResult search) { - CacheListApp app; - if (item.getItemId() == R.id.menu_cache_list_app) { - app = getActiveApps().get(0); - } - else { - app = (CacheListApp) getAppFromMenuItem(item, LazyHolder.apps); - } - if (app != null) { - try { - final boolean result = app.invoke(caches, activity, search); - ActivityMixin.invalidateOptionsMenu(activity); - return result; - } catch (final Exception e) { - Log.e("CacheListAppFactory.onMenuItemSelected", e); - } - } - return false; - } - -} diff --git a/main/src/cgeo/geocaching/apps/cachelist/CacheListApps.java b/main/src/cgeo/geocaching/apps/cachelist/CacheListApps.java new file mode 100644 index 0000000..e8e81a8 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cachelist/CacheListApps.java @@ -0,0 +1,29 @@ +package cgeo.geocaching.apps.cachelist; + +import java.util.ArrayList; +import java.util.List; + +public enum CacheListApps { + INTERNAL(new InternalCacheListMap()), + LOCUS_SHOW(new LocusShowCacheListApp()), + LOCUS_EXPORT(new LocusExportCacheListApp()), + MAPS_ME(new MapsWithMeCacheListApp()); + + private final CacheListApp app; + + private CacheListApps(final CacheListApp app) { + this.app = app; + } + + public static List<CacheListApp> getActiveApps() { + final List<CacheListApp> activeApps = new ArrayList<>(); + for (final CacheListApps appEnum : values()) { + if (appEnum.app.isInstalled()) { + activeApps.add(appEnum.app); + } + } + return activeApps; + } + +} + diff --git a/main/src/cgeo/geocaching/apps/cachelist/ListNavigationSelectionActionProvider.java b/main/src/cgeo/geocaching/apps/cachelist/ListNavigationSelectionActionProvider.java new file mode 100644 index 0000000..8fe3549 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cachelist/ListNavigationSelectionActionProvider.java @@ -0,0 +1,70 @@ +package cgeo.geocaching.apps.cachelist; + +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 ListNavigationSelectionActionProvider extends ActionProvider { + + public static interface Callback { + void onListNavigationSelected(final CacheListApp app); + } + + private Callback callback; + + public ListNavigationSelectionActionProvider(final Context context) { + super(context); + } + + @Override + public boolean hasSubMenu() { + return true; + } + + @Override + public View onCreateActionView() { + // must return null, otherwise the menu will not work + return null; + } + + public void setCallback(final Callback callback) { + this.callback = callback; + } + + @Override + public void onPrepareSubMenu(final SubMenu subMenu) { + subMenu.clear(); + if (callback == null) { + return; + } + final List<CacheListApp> activeApps = CacheListApps.getActiveApps(); + for (int i = 0; i < activeApps.size(); i++) { + final CacheListApp app = activeApps.get(i); + subMenu.add(Menu.NONE, i, Menu.NONE, app.getName()).setOnMenuItemClickListener(new OnMenuItemClickListener() { + + @Override + public boolean onMenuItemClick(final MenuItem item) { + final CacheListApp app = activeApps.get(item.getItemId()); + callback.onListNavigationSelected(app); + return true; + } + }); + } + } + + public static void initialize(final MenuItem menuItem, final Callback callback) { + final ActionProvider actionProvider = MenuItemCompat.getActionProvider(menuItem); + if (actionProvider instanceof ListNavigationSelectionActionProvider) { + final ListNavigationSelectionActionProvider navigateAction = (ListNavigationSelectionActionProvider) actionProvider; + navigateAction.setCallback(callback); + } + } + +} |
