diff options
| author | rsudev <rasch@munin-soft.de> | 2014-08-10 15:19:49 +0200 |
|---|---|---|
| committer | rsudev <rasch@munin-soft.de> | 2014-08-13 08:11:56 +0200 |
| commit | e1cae3e58947f0361498ddf1b01d2a4a7cb88c7e (patch) | |
| tree | 19e80ace2f6dc152b4d00036463765c4069dd53c | |
| parent | 60b4fb63eaf44509629d0230f65a9558a6c095d3 (diff) | |
| download | cgeo-e1cae3e58947f0361498ddf1b01d2a4a7cb88c7e.zip cgeo-e1cae3e58947f0361498ddf1b01d2a4a7cb88c7e.tar.gz cgeo-e1cae3e58947f0361498ddf1b01d2a4a7cb88c7e.tar.bz2 | |
Fixes #3843, Action Bar: Secondary navigation tool?
- added an action provider that handles the long click and redirects to secondary default navigation
| -rw-r--r-- | main/proguard-project.txt | 3 | ||||
| -rw-r--r-- | main/res/layout/navigation_action.xml | 15 | ||||
| -rw-r--r-- | main/res/menu/cache_options.xml | 3 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 23 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/activity/INavigationSource.java | 20 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/ui/NavigationActionProvider.java | 61 |
6 files changed, 121 insertions, 4 deletions
diff --git a/main/proguard-project.txt b/main/proguard-project.txt index 74b8aa2..9b0978c 100644 --- a/main/proguard-project.txt +++ b/main/proguard-project.txt @@ -61,3 +61,6 @@ # the sort action provider is 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 { *; } diff --git a/main/res/layout/navigation_action.xml b/main/res/layout/navigation_action.xml new file mode 100644 index 0000000..ea535d7 --- /dev/null +++ b/main/res/layout/navigation_action.xml @@ -0,0 +1,15 @@ +<?xml version="1.0" encoding="utf-8"?> +<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="match_parent" + android:layout_height="match_parent" + android:orientation="vertical" > + + <ImageButton + android:id="@+id/default_navigation_action" + android:layout_width="wrap_content" + android:layout_height="fill_parent" + android:scaleType="centerInside" + android:src="@drawable/ic_menu_compass" + android:background="@drawable/actionbar_button" /> + +</LinearLayout> diff --git a/main/res/menu/cache_options.xml b/main/res/menu/cache_options.xml index cb32215..2e0e2bd 100644 --- a/main/res/menu/cache_options.xml +++ b/main/res/menu/cache_options.xml @@ -6,7 +6,8 @@ android:id="@+id/menu_default_navigation" android:icon="@drawable/ic_menu_compass" android:title="@string/cache_menu_navigate" - app:showAsAction="ifRoom"> <!-- will be replaced --> + app:actionProviderClass="cgeo.geocaching.ui.NavigationActionProvider" + app:showAsAction="always"> <!-- will be replaced --> </item> <item android:id="@+id/menu_navigate" diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index dff8e09..61403b9 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -6,6 +6,7 @@ import butterknife.InjectView; import cgeo.calendar.CalendarAddon; import cgeo.geocaching.activity.AbstractActivity; 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.cachelist.MapsWithMeCacheListApp; @@ -35,6 +36,7 @@ import cgeo.geocaching.ui.EditNoteDialog.EditNoteDialogListener; import cgeo.geocaching.ui.ImagesList; import cgeo.geocaching.ui.IndexOutOfBoundsAvoidingTextView; import cgeo.geocaching.ui.LoggingUI; +import cgeo.geocaching.ui.NavigationActionProvider; import cgeo.geocaching.ui.OwnerActionsClickListener; import cgeo.geocaching.ui.WeakReferenceHandler; import cgeo.geocaching.ui.dialog.Dialogs; @@ -83,6 +85,7 @@ import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.v4.app.FragmentManager; +import android.support.v4.view.MenuItemCompat; import android.support.v7.view.ActionMode; import android.text.Editable; import android.text.Html; @@ -126,7 +129,7 @@ import java.util.regex.Pattern; * * e.g. details, description, logs, waypoints, inventory... */ -public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailActivity.Page> implements CacheMenuHandler.ActivityInterface { +public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailActivity.Page> implements CacheMenuHandler.ActivityInterface, INavigationSource { private static final int MESSAGE_FAILED = -1; private static final int MESSAGE_SUCCEEDED = 1; @@ -427,6 +430,11 @@ 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); + final NavigationActionProvider navAction = (NavigationActionProvider) MenuItemCompat.getActionProvider(menuItem); + if (navAction != null) { + navAction.setNavigationSource(this); + } return true; } @@ -610,13 +618,22 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } /** - * Tries to navigate to the {@link Geocache} of this activity. + * Tries to navigate to the {@link Geocache} of this activity using the default navigation tool. */ - private void startDefaultNavigation() { + @Override + public void startDefaultNavigation() { NavigationAppFactory.startDefaultNavigationApplication(1, this, cache); } /** + * Tries to navigate to the {@link Geocache} of this activity using the second default navigation tool. + */ + @Override + public void startDefaultNavigation2() { + NavigationAppFactory.startDefaultNavigationApplication(2, this, cache); + } + + /** * Wrapper for the referenced method in the xml-layout. */ public void goDefaultNavigation(@SuppressWarnings("unused") final View view) { diff --git a/main/src/cgeo/geocaching/activity/INavigationSource.java b/main/src/cgeo/geocaching/activity/INavigationSource.java new file mode 100644 index 0000000..eb18d87 --- /dev/null +++ b/main/src/cgeo/geocaching/activity/INavigationSource.java @@ -0,0 +1,20 @@ +package cgeo.geocaching.activity; + +/** + * Interface to implement by activities that want to utilize the NavigationActionProvider + * + * @author rsudev + * + */ +public interface INavigationSource { + + /** + * Calls the default navigation in the current context + */ + void startDefaultNavigation(); + + /** + * Calls the second default navigation in the current context + */ + void startDefaultNavigation2(); +} diff --git a/main/src/cgeo/geocaching/ui/NavigationActionProvider.java b/main/src/cgeo/geocaching/ui/NavigationActionProvider.java new file mode 100644 index 0000000..5840e27 --- /dev/null +++ b/main/src/cgeo/geocaching/ui/NavigationActionProvider.java @@ -0,0 +1,61 @@ +package cgeo.geocaching.ui; + +import cgeo.geocaching.R; +import cgeo.geocaching.activity.INavigationSource; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.support.v4.view.ActionProvider; +import android.view.LayoutInflater; +import android.view.View; + +public class NavigationActionProvider extends ActionProvider { + + private final Context context; + private INavigationSource navigationSource; + + public NavigationActionProvider(final Context context) { + super(context); + this.context = context; + } + + public void setNavigationSource(final INavigationSource navigationSource) { + this.navigationSource = navigationSource; + } + + @SuppressLint("InflateParams") + @Override + public View onCreateActionView() { + + View view = null; + + if (navigationSource != null) { + + final LayoutInflater layoutInflater = LayoutInflater.from(context); + view = layoutInflater.inflate(R.layout.navigation_action, null); + + final View navItem = view.findViewById(R.id.default_navigation_action); + + navItem.setOnClickListener(new View.OnClickListener() { + + @Override + public void onClick(final View v) { + navigationSource.startDefaultNavigation(); + } + }); + + navItem.setOnLongClickListener(new View.OnLongClickListener() { + + @Override + public boolean onLongClick(final View v) { + navigationSource.startDefaultNavigation2(); + return true; + } + }); + } + + return view; + + } + +} |
