diff options
Diffstat (limited to 'main/src')
| -rw-r--r-- | main/src/cgeo/geocaching/AbstractPopupActivity.java | 51 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheDetailActivity.java | 147 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CacheMenuHandler.java | 122 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/CachePopup.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/WaypointPopup.java | 4 | ||||
| -rw-r--r-- | main/src/cgeo/geocaching/utils/ProcessUtils.java | 31 |
6 files changed, 191 insertions, 168 deletions
diff --git a/main/src/cgeo/geocaching/AbstractPopupActivity.java b/main/src/cgeo/geocaching/AbstractPopupActivity.java index 02f89a6..5b9b509 100644 --- a/main/src/cgeo/geocaching/AbstractPopupActivity.java +++ b/main/src/cgeo/geocaching/AbstractPopupActivity.java @@ -2,7 +2,6 @@ package cgeo.geocaching; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.ActivityMixin; -import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; import cgeo.geocaching.enumerations.CacheSize; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.gcvote.GCVote; @@ -17,9 +16,7 @@ import cgeo.geocaching.utils.Log; import org.apache.commons.lang3.StringUtils; -import android.content.Intent; import android.graphics.Rect; -import android.net.Uri; import android.os.Bundle; import android.view.Menu; import android.view.MenuItem; @@ -31,7 +28,7 @@ import android.widget.Button; import android.widget.ImageView; import android.widget.TextView; -public abstract class AbstractPopupActivity extends AbstractActivity { +public abstract class AbstractPopupActivity extends AbstractActivity implements CacheMenuHandler.ActivityInterface { protected Geocache cache = null; protected String geocode = null; @@ -110,11 +107,8 @@ public abstract class AbstractPopupActivity extends AbstractActivity { geocode = cache.getGeocode(); } - private void showInBrowser() { - startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(cache.getUrl()))); - } - - protected abstract void navigateTo(); + @Override + public abstract void navigateTo(); @Override public void onCreate(Bundle savedInstanceState) { @@ -150,31 +144,17 @@ public abstract class AbstractPopupActivity extends AbstractActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.abstract_popup_activity, menu); + CacheMenuHandler.addMenuItems(this, menu, cache); return true; } @Override public boolean onOptionsItemSelected(MenuItem item) { - final int menuItem = item.getItemId(); - - switch (menuItem) { - case R.id.menu_default_navigation: - navigateTo(); - return true; - case R.id.menu_navigate: - showNavigationMenu(); - return true; - case R.id.menu_caches_around: - cachesAround(); - return true; - case R.id.menu_show_in_browser: - showInBrowser(); - return true; - default: - if (LoggingUI.onMenuItemSelected(item, this, cache)) { - return true; - } + if (CacheMenuHandler.onMenuItemSelected(item, this, cache)) { + return true; + } + if (LoggingUI.onMenuItemSelected(item, this, cache)) { + return true; } return true; @@ -191,12 +171,7 @@ public abstract class AbstractPopupActivity extends AbstractActivity { super.onPrepareOptionsMenu(menu); try { - final boolean visible = getCoordinates() != null; - menu.findItem(R.id.menu_default_navigation).setVisible(visible); - menu.findItem(R.id.menu_navigate).setVisible(visible); - menu.findItem(R.id.menu_caches_around).setVisible(visible); - - menu.findItem(R.id.menu_default_navigation).setTitle(NavigationAppFactory.getDefaultNavigationApplication().getName()); + CacheMenuHandler.onPrepareOptionsMenu(menu, cache); LoggingUI.onPrepareOptionsMenu(menu, cache); } catch (final RuntimeException e) { // nothing @@ -227,7 +202,8 @@ public abstract class AbstractPopupActivity extends AbstractActivity { return super.onTouchEvent(event); } - protected abstract void showNavigationMenu(); + @Override + public abstract void showNavigationMenu(); protected abstract void startDefaultNavigation2(); @@ -270,7 +246,8 @@ public abstract class AbstractPopupActivity extends AbstractActivity { }); } - private void cachesAround() { + @Override + public void cachesAround() { final Geopoint coords = getCoordinates(); if (coords == null) { showToast(res.getString(R.string.err_location_unknown)); diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java index f9aae24..c58b45f 100644 --- a/main/src/cgeo/geocaching/CacheDetailActivity.java +++ b/main/src/cgeo/geocaching/CacheDetailActivity.java @@ -3,7 +3,6 @@ package cgeo.geocaching; import butterknife.InjectView; import butterknife.Views; -import cgeo.calendar.ICalendar; import cgeo.geocaching.activity.AbstractActivity; import cgeo.geocaching.activity.AbstractViewPagerActivity; import cgeo.geocaching.activity.Progress; @@ -16,12 +15,10 @@ import cgeo.geocaching.enumerations.CacheAttribute; import cgeo.geocaching.enumerations.LoadFlags; import cgeo.geocaching.enumerations.LoadFlags.SaveFlag; import cgeo.geocaching.enumerations.WaypointType; -import cgeo.geocaching.geopoint.GeopointFormatter; import cgeo.geocaching.geopoint.Units; import cgeo.geocaching.list.StoredList; import cgeo.geocaching.network.HtmlImage; import cgeo.geocaching.network.Network; -import cgeo.geocaching.network.Parameters; import cgeo.geocaching.settings.Settings; import cgeo.geocaching.ui.AbstractCachingPageViewCreator; import cgeo.geocaching.ui.AnchorAwareLinkMovementMethod; @@ -65,8 +62,6 @@ import android.app.ProgressDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; -import android.content.pm.PackageManager; -import android.content.pm.ResolveInfo; import android.content.res.Resources; import android.graphics.Bitmap; import android.graphics.Typeface; @@ -90,7 +85,6 @@ import android.util.TypedValue; import android.view.ContextMenu; import android.view.Menu; import android.view.MenuItem; -import android.view.SubMenu; import android.view.View; import android.view.View.OnClickListener; import android.view.View.OnLongClickListener; @@ -122,13 +116,7 @@ import java.util.regex.Pattern; * * e.g. details, description, logs, waypoints, inventory... */ -public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailActivity.Page> { - - private static final int MENU_SHARE = 12; - private static final int MENU_CALENDAR = 11; - private static final int MENU_CACHES_AROUND = 10; - private static final int MENU_BROWSER = 7; - private static final int MENU_DEFAULT_NAVIGATION = 13; +public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailActivity.Page> implements CacheMenuHandler.ActivityInterface { private static final int MESSAGE_FAILED = -1; private static final int MESSAGE_SUCCEEDED = 1; @@ -513,59 +501,29 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc @Override public boolean onCreateOptionsMenu(Menu menu) { - if (null != cache) { - menu.add(0, MENU_DEFAULT_NAVIGATION, 0, NavigationAppFactory.getDefaultNavigationApplication().getName()).setIcon(R.drawable.ic_menu_compass); // default navigation tool - - final SubMenu subMenu = menu.addSubMenu(0, 0, 0, res.getString(R.string.cache_menu_navigate)).setIcon(R.drawable.ic_menu_mapmode); - NavigationAppFactory.addMenuItems(subMenu, cache); - - menu.add(0, MENU_CALENDAR, 0, res.getString(R.string.cache_menu_event)).setIcon(R.drawable.ic_menu_agenda); // add event to calendar - LoggingUI.addMenuItems(this, menu, cache); - menu.add(0, MENU_CACHES_AROUND, 0, res.getString(R.string.cache_menu_around)).setIcon(R.drawable.ic_menu_rotate); // caches around - menu.add(0, MENU_BROWSER, 0, res.getString(R.string.cache_menu_browser)).setIcon(R.drawable.ic_menu_globe); // browser - menu.add(0, MENU_SHARE, 0, res.getString(R.string.cache_menu_share)).setIcon(R.drawable.ic_menu_share); // share cache - } + CacheMenuHandler.addMenuItems(this, menu, cache); return true; } @Override public boolean onPrepareOptionsMenu(Menu menu) { - if (cache != null) { - menu.findItem(MENU_DEFAULT_NAVIGATION).setVisible(null != cache.getCoords()); - menu.findItem(MENU_CALENDAR).setVisible(cache.canBeAddedToCalendar()); - menu.findItem(MENU_CACHES_AROUND).setVisible(null != cache.getCoords() && cache.supportsCachesAround()); - menu.findItem(MENU_BROWSER).setVisible(cache.canOpenInBrowser()); - LoggingUI.onPrepareOptionsMenu(menu, cache); - } + CacheMenuHandler.onPrepareOptionsMenu(menu, cache); + LoggingUI.onPrepareOptionsMenu(menu, cache); return super.onPrepareOptionsMenu(menu); } @Override public boolean onOptionsItemSelected(MenuItem item) { + if (CacheMenuHandler.onMenuItemSelected(item, this, cache)) { + return true; + } + final int menuItem = item.getItemId(); switch (menuItem) { case 0: // no menu selected, but a new sub menu shown return false; - case MENU_DEFAULT_NAVIGATION: - startDefaultNavigation(); - return true; - case MENU_BROWSER: - cache.openInBrowser(this); - return true; - case MENU_CACHES_AROUND: - CacheListActivity.startActivityCoordinates(this, cache.getCoords()); - return true; - case MENU_CALENDAR: - addToCalendarWithIntent(); - return true; - case MENU_SHARE: - if (cache != null) { - cache.shareCache(this, res); - return true; - } - return false; default: if (NavigationAppFactory.onMenuItemSelected(item, this, cache)) { return true; @@ -699,80 +657,6 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc } /** - * Indicates whether the specified action can be used as an intent. This - * method queries the package manager for installed packages that can - * respond to an intent with the specified action. If no suitable package is - * found, this method returns false. - * - * @param context - * The application's environment. - * @param action - * The Intent action to check for availability. - * @param uri - * The Intent URI to check for availability. - * - * @return True if an Intent with the specified action can be sent and - * responded to, false otherwise. - */ - private static boolean isIntentAvailable(Context context, String action, Uri uri) { - final PackageManager packageManager = context.getPackageManager(); - final Intent intent; - if (uri == null) { - intent = new Intent(action); - } else { - intent = new Intent(action, uri); - } - final List<ResolveInfo> list = packageManager.queryIntentActivities(intent, - PackageManager.MATCH_DEFAULT_ONLY); - return !list.isEmpty(); - } - - private void addToCalendarWithIntent() { - - final boolean calendarAddOnAvailable = isIntentAvailable(this, ICalendar.INTENT, Uri.parse(ICalendar.URI_SCHEME + "://" + ICalendar.URI_HOST)); - - if (calendarAddOnAvailable) { - final Parameters params = new Parameters( - ICalendar.PARAM_NAME, cache.getName(), - ICalendar.PARAM_NOTE, StringUtils.defaultString(cache.getPersonalNote()), - ICalendar.PARAM_HIDDEN_DATE, String.valueOf(cache.getHiddenDate().getTime()), - ICalendar.PARAM_URL, StringUtils.defaultString(cache.getUrl()), - ICalendar.PARAM_COORDS, cache.getCoords() == null ? "" : cache.getCoords().format(GeopointFormatter.Format.LAT_LON_DECMINUTE_RAW), - ICalendar.PARAM_LOCATION, StringUtils.defaultString(cache.getLocation()), - ICalendar.PARAM_SHORT_DESC, StringUtils.defaultString(cache.getShortDescription()), - ICalendar.PARAM_START_TIME_MINUTES, StringUtils.defaultString(cache.guessEventTimeMinutes()) - ); - - startActivity(new Intent(ICalendar.INTENT, - Uri.parse(ICalendar.URI_SCHEME + "://" + ICalendar.URI_HOST + "?" + params.toString()))); - } else { - // Inform user the calendar add-on is not installed and let them get it from Google Play - new AlertDialog.Builder(this) - .setTitle(res.getString(R.string.addon_missing_title)) - .setMessage(new StringBuilder(res.getString(R.string.helper_calendar_missing)) - .append(' ') - .append(res.getString(R.string.addon_download_prompt)) - .toString()) - .setPositiveButton(getString(android.R.string.yes), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - final Intent intent = new Intent(Intent.ACTION_VIEW); - intent.setData(Uri.parse(ICalendar.CALENDAR_ADDON_URI)); - startActivity(intent); - } - }) - .setNegativeButton(getString(android.R.string.no), new DialogInterface.OnClickListener() { - @Override - public void onClick(DialogInterface dialog, int id) { - dialog.cancel(); - } - }) - .create() - .show(); - } - } - - /** * Tries to navigate to the {@link Geocache} of this activity. */ private void startDefaultNavigation() { @@ -2480,4 +2364,19 @@ public class CacheDetailActivity extends AbstractViewPagerActivity<CacheDetailAc personalNoteView.setVisibility(View.GONE); } } + + @Override + public void navigateTo() { + startDefaultNavigation(); + } + + @Override + public void showNavigationMenu() { + NavigationAppFactory.showNavigationMenu(this, cache, null, null); + } + + @Override + public void cachesAround() { + CacheListActivity.startActivityCoordinates(this, cache.getCoords()); + } } diff --git a/main/src/cgeo/geocaching/CacheMenuHandler.java b/main/src/cgeo/geocaching/CacheMenuHandler.java new file mode 100644 index 0000000..42ea8e6 --- /dev/null +++ b/main/src/cgeo/geocaching/CacheMenuHandler.java @@ -0,0 +1,122 @@ +package cgeo.geocaching; + +import cgeo.calendar.ICalendar; +import cgeo.geocaching.apps.cache.navi.NavigationAppFactory; +import cgeo.geocaching.geopoint.GeopointFormatter; +import cgeo.geocaching.network.Parameters; +import cgeo.geocaching.ui.AbstractUIFactory; +import cgeo.geocaching.utils.ProcessUtils; + +import org.apache.commons.lang3.StringUtils; + +import android.app.Activity; +import android.app.AlertDialog; +import android.content.DialogInterface; +import android.content.Intent; +import android.net.Uri; +import android.view.Menu; +import android.view.MenuItem; + +/** + * Shared menu handling for all activities having menu items related to a cache. + * + */ +public class CacheMenuHandler extends AbstractUIFactory { + + /** + * Methods to be implemented by the activity to react to the cache menu selections. + * + */ + protected interface ActivityInterface { + public void navigateTo(); + + public void showNavigationMenu(); + + public void cachesAround(); + + } + + public static boolean onMenuItemSelected(MenuItem item, CacheMenuHandler.ActivityInterface activity, Geocache cache) { + switch (item.getItemId()) { + case R.id.menu_default_navigation: + activity.navigateTo(); + return true; + case R.id.menu_navigate: + activity.showNavigationMenu(); + return true; + case R.id.menu_caches_around: + activity.cachesAround(); + return true; + case R.id.menu_show_in_browser: + cache.openInBrowser((Activity) activity); + return true; + case R.id.menu_share: + cache.shareCache((Activity) activity, res); + return true; + case R.id.menu_calendar: + addToCalendarWithIntent((Activity) activity, cache); + } + return false; + } + + public static void onPrepareOptionsMenu(final Menu menu, final Geocache cache) { + final boolean hasCoords = cache.getCoords() != null; + menu.findItem(R.id.menu_default_navigation).setVisible(hasCoords); + menu.findItem(R.id.menu_navigate).setVisible(hasCoords); + menu.findItem(R.id.menu_caches_around).setVisible(hasCoords && cache.supportsCachesAround()); + menu.findItem(R.id.menu_calendar).setVisible(cache.canBeAddedToCalendar()); + menu.findItem(R.id.menu_show_in_browser).setVisible(cache.canOpenInBrowser()); + + menu.findItem(R.id.menu_default_navigation).setTitle(NavigationAppFactory.getDefaultNavigationApplication().getName()); + } + + public static void addMenuItems(Activity activity, Menu menu, Geocache cache) { + activity.getMenuInflater().inflate(R.menu.cache_options, menu); + onPrepareOptionsMenu(menu, cache); + } + + private static void addToCalendarWithIntent(final Activity activity, final Geocache cache) { + final boolean calendarAddOnAvailable = ProcessUtils.isIntentAvailable(ICalendar.INTENT, Uri.parse(ICalendar.URI_SCHEME + "://" + ICalendar.URI_HOST)); + + if (calendarAddOnAvailable) { + final Parameters params = new Parameters( + ICalendar.PARAM_NAME, cache.getName(), + ICalendar.PARAM_NOTE, StringUtils.defaultString(cache.getPersonalNote()), + ICalendar.PARAM_HIDDEN_DATE, String.valueOf(cache.getHiddenDate().getTime()), + ICalendar.PARAM_URL, StringUtils.defaultString(cache.getUrl()), + ICalendar.PARAM_COORDS, cache.getCoords() == null ? "" : cache.getCoords().format(GeopointFormatter.Format.LAT_LON_DECMINUTE_RAW), + ICalendar.PARAM_LOCATION, StringUtils.defaultString(cache.getLocation()), + ICalendar.PARAM_SHORT_DESC, StringUtils.defaultString(cache.getShortDescription()), + ICalendar.PARAM_START_TIME_MINUTES, StringUtils.defaultString(cache.guessEventTimeMinutes()) + ); + + activity.startActivity(new Intent(ICalendar.INTENT, + Uri.parse(ICalendar.URI_SCHEME + "://" + ICalendar.URI_HOST + "?" + params.toString()))); + } else { + // Inform user the calendar add-on is not installed and let them get it from Google Play + new AlertDialog.Builder(activity) + .setTitle(res.getString(R.string.addon_missing_title)) + .setMessage(new StringBuilder(res.getString(R.string.helper_calendar_missing)) + .append(' ') + .append(res.getString(R.string.addon_download_prompt)) + .toString()) + .setPositiveButton(activity.getString(android.R.string.yes), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + final Intent intent = new Intent(Intent.ACTION_VIEW); + intent.setData(Uri.parse(ICalendar.CALENDAR_ADDON_URI)); + activity.startActivity(intent); + } + }) + .setNegativeButton(activity.getString(android.R.string.no), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int id) { + dialog.cancel(); + } + }) + .create() + .show(); + } + } + +} diff --git a/main/src/cgeo/geocaching/CachePopup.java b/main/src/cgeo/geocaching/CachePopup.java index 683ebe7..020c604 100644 --- a/main/src/cgeo/geocaching/CachePopup.java +++ b/main/src/cgeo/geocaching/CachePopup.java @@ -71,7 +71,7 @@ public class CachePopup extends AbstractPopupActivity { } @Override - protected void showNavigationMenu() { + public void showNavigationMenu() { NavigationAppFactory.showNavigationMenu(this, cache, null, null); } @@ -216,7 +216,7 @@ public class CachePopup extends AbstractPopupActivity { } @Override - protected void navigateTo() { + public void navigateTo() { NavigationAppFactory.startDefaultNavigationApplication(1, this, cache); } diff --git a/main/src/cgeo/geocaching/WaypointPopup.java b/main/src/cgeo/geocaching/WaypointPopup.java index c33bbb5..acd3d9b 100644 --- a/main/src/cgeo/geocaching/WaypointPopup.java +++ b/main/src/cgeo/geocaching/WaypointPopup.java @@ -94,7 +94,7 @@ public class WaypointPopup extends AbstractPopupActivity { } @Override - protected void navigateTo() { + public void navigateTo() { NavigationAppFactory.startDefaultNavigationApplication(1, this, waypoint); } @@ -119,7 +119,7 @@ public class WaypointPopup extends AbstractPopupActivity { } @Override - protected void showNavigationMenu() { + public void showNavigationMenu() { NavigationAppFactory.showNavigationMenu(this, null, waypoint, null); } diff --git a/main/src/cgeo/geocaching/utils/ProcessUtils.java b/main/src/cgeo/geocaching/utils/ProcessUtils.java index 737fb35..d80674b 100644 --- a/main/src/cgeo/geocaching/utils/ProcessUtils.java +++ b/main/src/cgeo/geocaching/utils/ProcessUtils.java @@ -8,6 +8,7 @@ import android.content.Intent; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.ResolveInfo; +import android.net.Uri; import java.util.List; @@ -70,10 +71,34 @@ public final class ProcessUtils { } public static boolean isIntentAvailable(final String intent) { - final PackageManager packageManager = CgeoApplication.getInstance().getPackageManager(); - final List<ResolveInfo> list = packageManager.queryIntentActivities( - new Intent(intent), PackageManager.MATCH_DEFAULT_ONLY); + return isIntentAvailable(intent, null); + } + /** + * Indicates whether the specified action can be used as an intent. This + * method queries the package manager for installed packages that can + * respond to an intent with the specified action. If no suitable package is + * found, this method returns false. + * + * @param action + * The Intent action to check for availability. + * @param uri + * The Intent URI to check for availability. + * + * @return True if an Intent with the specified action can be sent and + * responded to, false otherwise. + */ + public static boolean isIntentAvailable(final String action, final Uri uri) { + final PackageManager packageManager = CgeoApplication.getInstance().getPackageManager(); + final Intent intent; + if (uri == null) { + intent = new Intent(action); + } else { + intent = new Intent(action, uri); + } + final List<ResolveInfo> list = packageManager.queryIntentActivities(intent, + PackageManager.MATCH_DEFAULT_ONLY); return CollectionUtils.isNotEmpty(list); } + } |
