From bcc0bdd1a837c80d6291c0970d9e181da2359779 Mon Sep 17 00:00:00 2001 From: Collie Date: Wed, 15 Oct 2014 14:39:47 -0400 Subject: Implemented support for external Android Wear apps Android Wear apps can listen for the 'cgeo.geocaching.wear.NAVIGATE_TO' intent to get cache info from c:geo, passed as Intent extras. Altered ProcessUtils#isIntentAvailable(final String action, final Uri uri) to scan for Services (instead of just activities) which can handle a given action; my Wear app (as I imagine others will) mainly runs as a Service and requires no activity to be launched. --- main/res/values/ids.xml | 3 +- main/res/values/preference_keys.xml | 1 + main/res/values/strings.xml | 1 + main/src/cgeo/geocaching/Intents.java | 2 + .../geocaching/apps/cache/navi/AndroidWearApp.java | 52 ++++++++++++++++++++++ .../apps/cache/navi/NavigationAppFactory.java | 1 + main/src/cgeo/geocaching/utils/ProcessUtils.java | 4 +- 7 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 main/src/cgeo/geocaching/apps/cache/navi/AndroidWearApp.java diff --git a/main/res/values/ids.xml b/main/res/values/ids.xml index e8cb74b..99a2311 100644 --- a/main/res/values/ids.xml +++ b/main/res/values/ids.xml @@ -24,6 +24,7 @@ + - \ No newline at end of file + diff --git a/main/res/values/preference_keys.xml b/main/res/values/preference_keys.xml index 4bb908d..d800717 100644 --- a/main/res/values/preference_keys.xml +++ b/main/res/values/preference_keys.xml @@ -142,6 +142,7 @@ navigationMapsDirections navigationWhereYouGo navigationPebble + navigationAndroidWear navigationMapsWithMe ocpl_tokensecret ocpl_tokenpublic diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml index 0c72bb6..6c0e3a5 100644 --- a/main/res/values/strings.xml +++ b/main/res/values/strings.xml @@ -709,6 +709,7 @@ OruxMaps Navigon Pebble + Android Wear Status Saved Log Found diff --git a/main/src/cgeo/geocaching/Intents.java b/main/src/cgeo/geocaching/Intents.java index 2cbc1b0..5b57aba 100644 --- a/main/src/cgeo/geocaching/Intents.java +++ b/main/src/cgeo/geocaching/Intents.java @@ -18,6 +18,8 @@ public class Intents { public static final String EXTRA_ADDRESS = PREFIX + "address"; public static final String EXTRA_COORDS = PREFIX + "coords"; + public static final String EXTRA_LATITUDE = PREFIX + "latitude"; + public static final String EXTRA_LONGITUDE = PREFIX + "longitude"; public static final String EXTRA_COUNT = PREFIX + "count"; public static final String EXTRA_GEOCODE = PREFIX + "geocode"; public static final String EXTRA_GUID = PREFIX + "guid"; diff --git a/main/src/cgeo/geocaching/apps/cache/navi/AndroidWearApp.java b/main/src/cgeo/geocaching/apps/cache/navi/AndroidWearApp.java new file mode 100644 index 0000000..f083a26 --- /dev/null +++ b/main/src/cgeo/geocaching/apps/cache/navi/AndroidWearApp.java @@ -0,0 +1,52 @@ +package cgeo.geocaching.apps.cache.navi; + +import cgeo.geocaching.Geocache; +import cgeo.geocaching.Intents; +import cgeo.geocaching.R; +import cgeo.geocaching.Waypoint; +import cgeo.geocaching.geopoint.Geopoint; +import cgeo.geocaching.utils.ProcessUtils; + +import android.app.Activity; +import android.content.Intent; + +/** + * For use with any Android Wear geocaching apps which can handle the intent action below. + */ +public class AndroidWearApp extends AbstractPointNavigationApp { + public static final String INTENT_ACTION = "cgeo.geocaching.wear.NAVIGATE_TO"; + + public AndroidWearApp() { + super(getString(R.string.cache_menu_android_wear), R.id.cache_app_android_wear, INTENT_ACTION, null); + } + + @Override + public boolean isInstalled() { + return ProcessUtils.isIntentAvailable(INTENT_ACTION); + } + + @Override + public void navigate(final Activity activity, final Geopoint coords) { + navigate(activity, null, null, coords); + } + + @Override + public void navigate(final Activity activity, final Geocache cache) { + navigate(activity, cache.getName(), cache.getGeocode(), cache.getCoords()); + } + + @Override + public void navigate(final Activity activity, final Waypoint waypoint) { + navigate(activity, waypoint.getName(), waypoint.getGeocode(), waypoint.getCoords()); + } + + private static void navigate(final Activity activity, final String destName, + final String destCode, final Geopoint coords) { + final Intent launchIntent = new Intent(INTENT_ACTION); + launchIntent.putExtra(Intents.EXTRA_NAME, destName) + .putExtra(Intents.EXTRA_GEOCODE, destCode) + .putExtra(Intents.EXTRA_LATITUDE, coords.getLatitude()) + .putExtra(Intents.EXTRA_LONGITUDE, coords.getLongitude()); + activity.startService(launchIntent); + } +} diff --git a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java index 4d98e42..efc988b 100644 --- a/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java +++ b/main/src/cgeo/geocaching/apps/cache/navi/NavigationAppFactory.java @@ -73,6 +73,7 @@ public final class NavigationAppFactory extends AbstractAppFactory { WHERE_YOU_GO(new WhereYouGoApp(), 16, R.string.pref_navigation_menu_where_you_go), PEBBLE(new PebbleApp(), 17, R.string.pref_navigation_menu_pebble), + ANDROID_WEAR(new AndroidWearApp(), 18, R.string.pref_navigation_menu_android_wear), MAPSWITHME(new MapsWithMeApp(), 22, R.string.pref_navigation_menu_mapswithme); NavigationAppsEnum(final App app, final int id, final int preferenceKey) { diff --git a/main/src/cgeo/geocaching/utils/ProcessUtils.java b/main/src/cgeo/geocaching/utils/ProcessUtils.java index 4a9ebdb..ce05483 100644 --- a/main/src/cgeo/geocaching/utils/ProcessUtils.java +++ b/main/src/cgeo/geocaching/utils/ProcessUtils.java @@ -98,7 +98,9 @@ public final class ProcessUtils { } final List list = packageManager.queryIntentActivities(intent, PackageManager.MATCH_DEFAULT_ONLY); - return CollectionUtils.isNotEmpty(list); + final List servicesList = packageManager.queryIntentServices(intent, + PackageManager.MATCH_DEFAULT_ONLY); + return CollectionUtils.isNotEmpty(list) || CollectionUtils.isNotEmpty(servicesList); } } -- cgit v1.1