diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/cgeo/geocaching/cgeo.java | 77 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeoadvsearch.java | 4 | ||||
| -rw-r--r-- | src/cgeo/geocaching/cgeodetail.java | 6 |
3 files changed, 72 insertions, 15 deletions
diff --git a/src/cgeo/geocaching/cgeo.java b/src/cgeo/geocaching/cgeo.java index 3a509db..fcc1248 100644 --- a/src/cgeo/geocaching/cgeo.java +++ b/src/cgeo/geocaching/cgeo.java @@ -12,6 +12,7 @@ import android.content.Intent; import android.content.SharedPreferences; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.content.pm.ResolveInfo; import android.content.res.Configuration; import android.location.Address; import android.location.Geocoder; @@ -31,6 +32,15 @@ import cgeo.geocaching.activity.ActivityMixin; public class cgeo extends AbstractActivity { + private static final String SCAN_INTENT = "com.google.zxing.client.android.SCAN"; + private static final int MENU_ABOUT = 0; + private static final int MENU_HELPERS = 1; + private static final int MENU_SETTINGS = 2; + private static final int MENU_HISTORY = 3; + private static final int MENU_SCAN = 4; + + private static final int SCAN_REQUEST_CODE = 1; + private Context context = null; private Integer version = null; private cgGeo geo = null; @@ -217,40 +227,83 @@ public class cgeo extends AbstractActivity { @Override public boolean onCreateOptionsMenu(Menu menu) { - menu.add(0, 0, 0, res.getString(R.string.menu_about)).setIcon(android.R.drawable.ic_menu_help); - menu.add(0, 1, 0, res.getString(R.string.menu_helpers)).setIcon(android.R.drawable.ic_menu_add); - menu.add(0, 2, 0, res.getString(R.string.menu_settings)).setIcon(android.R.drawable.ic_menu_preferences); - menu.add(0, 3, 0, res.getString(R.string.menu_history)).setIcon(android.R.drawable.ic_menu_recent_history); + menu.add(0, MENU_SETTINGS, 0, res.getString(R.string.menu_settings)).setIcon(android.R.drawable.ic_menu_preferences); + menu.add(0, MENU_HISTORY, 0, res.getString(R.string.menu_history)).setIcon(android.R.drawable.ic_menu_recent_history); + menu.add(0, MENU_HELPERS, 0, res.getString(R.string.menu_helpers)).setIcon(android.R.drawable.ic_menu_add); + menu.add(0, MENU_SCAN, 0, res.getString(R.string.menu_scan)).setIcon(android.R.drawable.ic_menu_camera); + menu.add(0, MENU_ABOUT, 0, res.getString(R.string.menu_about)).setIcon(android.R.drawable.ic_menu_help); + return true; + } + @Override + public boolean onPrepareOptionsMenu(Menu menu) { + super.onPrepareOptionsMenu(menu); + MenuItem item = menu.findItem(MENU_SCAN); + if (item != null) { + item.setEnabled(isIntentAvailable(this, SCAN_INTENT)); + } return true; } + private static boolean isIntentAvailable(Context context, String intent) { + final PackageManager packageManager = context.getPackageManager(); + final List<ResolveInfo> list = packageManager.queryIntentActivities( + new Intent(intent), PackageManager.MATCH_DEFAULT_ONLY); + + return (list.size() > 0); + } + @Override public boolean onOptionsItemSelected(MenuItem item) { final int id = item.getItemId(); - if (id == 0) { + switch (id) { + case MENU_ABOUT: showAbout(null); - return true; - } else if (id == 1) { + case MENU_HELPERS: context.startActivity(new Intent(context, cgeohelpers.class)); - return true; - } else if (id == 2) { + case MENU_SETTINGS: context.startActivity(new Intent(context, cgeoinit.class)); - return true; - } else if (id == 3) { + case MENU_HISTORY: final Intent cachesIntent = new Intent(context, cgeocaches.class); cachesIntent.putExtra("type", "history"); context.startActivity(cachesIntent); - return true; + case MENU_SCAN: + Intent intent = new Intent(SCAN_INTENT); + intent.putExtra("SCAN_MODE", "QR_CODE_MODE"); + startActivityForResult(intent, SCAN_REQUEST_CODE); + return true; + default: + break; } return false; } + public void onActivityResult(int requestCode, int resultCode, Intent intent) { + if (requestCode == SCAN_REQUEST_CODE) { + if (resultCode == RESULT_OK) { + String scan = intent.getStringExtra("SCAN_RESULT"); + if (scan == null || scan.length() == 0) { + return; + } + String host = "http://coord.info/"; + if (scan.toLowerCase().startsWith(host)) { + String geocode = scan.substring(host.length()).trim(); + cgeodetail.startActivity(this, geocode); + } + else { + showToast(res.getString(R.string.unknown_scan)); + } + } else if (resultCode == RESULT_CANCELED) { + // do nothing + } + } + } + @Override public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) { super.onCreateContextMenu(menu, v, menuInfo); diff --git a/src/cgeo/geocaching/cgeoadvsearch.java b/src/cgeo/geocaching/cgeoadvsearch.java index d2b3fc7..f6f2159 100644 --- a/src/cgeo/geocaching/cgeoadvsearch.java +++ b/src/cgeo/geocaching/cgeoadvsearch.java @@ -438,9 +438,7 @@ public class cgeoadvsearch extends AbstractActivity { return; } - final Intent cachesIntent = new Intent(this, cgeodetail.class); - cachesIntent.putExtra("geocode", geocodeText.toUpperCase()); - startActivity(cachesIntent); + cgeodetail.startActivity(this, geocodeText); } private class findTrackableAction implements TextView.OnEditorActionListener { diff --git a/src/cgeo/geocaching/cgeodetail.java b/src/cgeo/geocaching/cgeodetail.java index e8e77ee..dbd4614 100644 --- a/src/cgeo/geocaching/cgeodetail.java +++ b/src/cgeo/geocaching/cgeodetail.java @@ -2081,4 +2081,10 @@ public class cgeodetail extends AbstractActivity { return descriptions; } + + public static void startActivity(final Context context, final String geocode) { + final Intent detailIntent = new Intent(context, cgeodetail.class); + detailIntent.putExtra("geocode", geocode.toUpperCase()); + context.startActivity(detailIntent); + } } |
