aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/cgBase.java16
-rw-r--r--main/src/cgeo/geocaching/cgTrackable.java20
-rw-r--r--main/src/cgeo/geocaching/cgeotrackable.java144
-rw-r--r--main/src/cgeo/geocaching/files/GPXParser.java8
4 files changed, 91 insertions, 97 deletions
diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java
index 56b74a9..77eeff4 100644
--- a/main/src/cgeo/geocaching/cgBase.java
+++ b/main/src/cgeo/geocaching/cgBase.java
@@ -2071,16 +2071,17 @@ public class cgBase {
}
public static cgTrackable searchTrackable(final String geocode, final String guid, final String id) {
- cgTrackable trackable = new cgTrackable();
-
if (StringUtils.isBlank(geocode) && StringUtils.isBlank(guid) && StringUtils.isBlank(id)) {
Log.w(Settings.tag, "cgeoBase.searchTrackable: No geocode nor guid nor id given");
return null;
}
+ cgTrackable trackable = new cgTrackable();
+
final Parameters params = new Parameters();
if (StringUtils.isNotBlank(geocode)) {
params.put("tracker", geocode);
+ trackable.setGeocode(geocode);
} else if (StringUtils.isNotBlank(guid)) {
params.put("guid", guid);
} else if (StringUtils.isNotBlank(id)) {
@@ -2097,7 +2098,7 @@ public class cgBase {
trackable = parseTrackable(page, cgeoapplication.getInstance());
if (trackable == null) {
Log.e(Settings.tag, "cgeoBase.searchTrackable: No trackable parsed");
- return trackable;
+ return null;
}
return trackable;
@@ -2429,8 +2430,13 @@ public class cgBase {
if (name.length() > 82) {
name = name.substring(0, 79) + "...";
}
- String status = "I touched " + name + " (" + trackable.getUrl() + ")!";
- status = Twitter.appendHashTag(status, "cgeo");
+ StringBuilder builder = new StringBuilder("I touched ");
+ builder.append(name);
+ if (trackable.getUrl() != null) {
+ builder.append(" (").append(trackable.getUrl()).append(')');
+ }
+ builder.append('!');
+ String status = Twitter.appendHashTag(builder.toString(), "cgeo");
status = Twitter.appendHashTag(status, "geocaching");
Twitter.postTweet(app, status, null);
}
diff --git a/main/src/cgeo/geocaching/cgTrackable.java b/main/src/cgeo/geocaching/cgTrackable.java
index bcf3c83..862f614 100644
--- a/main/src/cgeo/geocaching/cgTrackable.java
+++ b/main/src/cgeo/geocaching/cgTrackable.java
@@ -1,5 +1,7 @@
package cgeo.geocaching;
+import org.apache.commons.lang3.StringUtils;
+
import android.text.Html;
import java.util.ArrayList;
@@ -33,6 +35,17 @@ public class cgTrackable implements ILogable {
private List<cgLog> logs = new ArrayList<cgLog>();
public String getUrl() {
+ if (StringUtils.startsWithIgnoreCase(geocode, "GK")) {
+ String hex = geocode.substring(3);
+ try {
+ int id = Integer.parseInt(hex, 16);
+ return "http://geokrety.org/konkret.php?id=" + id;
+ } catch (NumberFormatException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ return null;
+ }
+ }
return "http://coord.info/" + geocode.toUpperCase();
}
@@ -188,4 +201,11 @@ public class cgTrackable implements ILogable {
return "???";
}
+
+ public boolean isLoggable() {
+ if (StringUtils.startsWithIgnoreCase(geocode, "GK")) {
+ return false;
+ }
+ return true;
+ }
}
diff --git a/main/src/cgeo/geocaching/cgeotrackable.java b/main/src/cgeo/geocaching/cgeotrackable.java
index a7a93e4..5141819 100644
--- a/main/src/cgeo/geocaching/cgeotrackable.java
+++ b/main/src/cgeo/geocaching/cgeotrackable.java
@@ -30,6 +30,8 @@ import java.net.URLEncoder;
import java.util.Arrays;
public class cgeotrackable extends AbstractActivity {
+ private static final int MENU_LOG_TOUCH = 1;
+ private static final int MENU_BROWSER_TRACKABLE = 2;
public cgTrackable trackable = null;
public String geocode = null;
public String name = null;
@@ -38,14 +40,11 @@ public class cgeotrackable extends AbstractActivity {
private String contextMenuUser = null;
private LayoutInflater inflater = null;
private ProgressDialog waitDialog = null;
+ protected LinearLayout detailsList;
private Handler loadTrackableHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
- RelativeLayout itemLayout;
- TextView itemName;
- TextView itemValue;
-
if (trackable != null && StringUtils.isNotBlank(trackable.getError())) {
showToast(res.getString(R.string.err_tb_details_download) + " " + trackable.getError() + ".");
@@ -79,7 +78,7 @@ public class cgeotrackable extends AbstractActivity {
}
((ScrollView) findViewById(R.id.details_list_box)).setVisibility(View.VISIBLE);
- LinearLayout detailsList = (LinearLayout) findViewById(R.id.details_list);
+ detailsList = (LinearLayout) findViewById(R.id.details_list);
// actiobar icon
if (StringUtils.isNotBlank(trackable.getIconUrl())) {
@@ -89,66 +88,32 @@ public class cgeotrackable extends AbstractActivity {
}
// trackable name
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_name));
- if (StringUtils.isNotBlank(trackable.getName())) {
- itemValue.setText(Html.fromHtml(trackable.getName()).toString());
- } else {
- itemValue.setText(res.getString(R.string.trackable_unknown));
- }
- detailsList.addView(itemLayout);
+ addDetail(R.string.trackable_name, StringUtils.isNotBlank(trackable.getName()) ? Html.fromHtml(trackable.getName()).toString() : res.getString(R.string.trackable_unknown));
// trackable type
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
String tbType = null;
if (StringUtils.isNotBlank(trackable.getType())) {
tbType = Html.fromHtml(trackable.getType()).toString();
} else {
tbType = res.getString(R.string.trackable_unknown);
}
- itemName.setText(res.getString(R.string.trackable_type));
- itemValue.setText(tbType);
- detailsList.addView(itemLayout);
+ addDetail(R.string.trackable_type, tbType);
// trackable geocode
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_code));
- itemValue.setText(trackable.getGeocode().toUpperCase());
- detailsList.addView(itemLayout);
+ addDetail(R.string.trackable_code, trackable.getGeocode().toUpperCase());
// trackable owner
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_owner));
+ TextView owner = addDetail(R.string.trackable_owner, res.getString(R.string.trackable_unknown));
if (StringUtils.isNotBlank(trackable.getOwner())) {
- itemValue.setText(Html.fromHtml(trackable.getOwner()), TextView.BufferType.SPANNABLE);
- itemLayout.setOnClickListener(new userActions());
- } else {
- itemValue.setText(res.getString(R.string.trackable_unknown));
+ owner.setText(Html.fromHtml(trackable.getOwner()), TextView.BufferType.SPANNABLE);
+ owner.setOnClickListener(new userActions());
}
- detailsList.addView(itemLayout);
// trackable spotted
if (StringUtils.isNotBlank(trackable.getSpottedName()) ||
trackable.getSpottedType() == cgTrackable.SPOTTED_UNKNOWN ||
trackable.getSpottedType() == cgTrackable.SPOTTED_OWNER
) {
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_spotted));
String text = null;
if (trackable.getSpottedType() == cgTrackable.SPOTTED_CACHE) {
@@ -163,10 +128,10 @@ public class cgeotrackable extends AbstractActivity {
text = "N/A";
}
- itemValue.setText(text);
- itemLayout.setClickable(true);
+ TextView spotted = addDetail(R.string.trackable_spotted, text);
+ spotted.setClickable(true);
if (cgTrackable.SPOTTED_CACHE == trackable.getSpottedType()) {
- itemLayout.setOnClickListener(new View.OnClickListener() {
+ spotted.setOnClickListener(new View.OnClickListener() {
public void onClick(View arg0) {
Intent cacheIntent = new Intent(cgeotrackable.this, CacheDetailActivity.class);
cacheIntent.putExtra("guid", trackable.getSpottedGuid());
@@ -175,44 +140,24 @@ public class cgeotrackable extends AbstractActivity {
}
});
} else if (cgTrackable.SPOTTED_USER == trackable.getSpottedType()) {
- itemLayout.setOnClickListener(new userActions());
- //activity.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?guid=" + trackable.spottedGuid)));
+ spotted.setOnClickListener(new userActions());
}
-
- detailsList.addView(itemLayout);
}
// trackable origin
if (StringUtils.isNotBlank(trackable.getOrigin())) {
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_origin));
- itemValue.setText(Html.fromHtml(trackable.getOrigin()), TextView.BufferType.SPANNABLE);
- detailsList.addView(itemLayout);
+ TextView origin = addDetail(R.string.trackable_origin, "");
+ origin.setText(Html.fromHtml(trackable.getOrigin()), TextView.BufferType.SPANNABLE);
}
// trackable released
if (trackable.getReleased() != null) {
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_released));
- itemValue.setText(cgBase.formatDate(trackable.getReleased().getTime()));
- detailsList.addView(itemLayout);
+ addDetail(R.string.trackable_released, cgBase.formatDate(trackable.getReleased().getTime()));
}
// trackable distance
if (trackable.getDistance() != null) {
- itemLayout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
- itemName = (TextView) itemLayout.findViewById(R.id.name);
- itemValue = (TextView) itemLayout.findViewById(R.id.value);
-
- itemName.setText(res.getString(R.string.trackable_distance));
- itemValue.setText(cgBase.getHumanDistance(trackable.getDistance()));
- detailsList.addView(itemLayout);
+ addDetail(R.string.trackable_distance, cgBase.getHumanDistance(trackable.getDistance()));
}
// trackable goal
@@ -362,17 +307,17 @@ public class cgeotrackable extends AbstractActivity {
return;
}
+ String message;
if (StringUtils.isNotBlank(name)) {
- waitDialog = ProgressDialog.show(this, Html.fromHtml(name).toString(), res.getString(R.string.trackable_details_loading), true);
+ message = Html.fromHtml(name).toString();
} else if (StringUtils.isNotBlank(geocode)) {
- waitDialog = ProgressDialog.show(this, geocode.toUpperCase(), res.getString(R.string.trackable_details_loading), true);
+ message = geocode.toUpperCase();
} else {
- waitDialog = ProgressDialog.show(this, res.getString(R.string.trackable), res.getString(R.string.trackable_details_loading), true);
+ message = res.getString(R.string.trackable);
}
- waitDialog.setCancelable(true);
+ waitDialog = ProgressDialog.show(this, message, res.getString(R.string.trackable_details_loading), true, true);
- loadTrackable thread;
- thread = new loadTrackable(loadTrackableHandler, geocode, guid, id);
+ loadTrackable thread = new loadTrackable(loadTrackableHandler, geocode, guid, id);
thread.start();
}
@@ -427,26 +372,31 @@ public class cgeotrackable extends AbstractActivity {
@Override
public boolean onCreateOptionsMenu(Menu menu) {
- menu.add(0, 1, 0, res.getString(R.string.trackable_log_touch)).setIcon(android.R.drawable.ic_menu_agenda); // log touch
-
- menu.add(0, 2, 0, res.getString(R.string.trackable_browser_open)).setIcon(android.R.drawable.ic_menu_info_details); // browser
+ menu.add(0, MENU_LOG_TOUCH, 0, res.getString(R.string.trackable_log_touch)).setIcon(android.R.drawable.ic_menu_agenda); // log touch
+ menu.add(0, MENU_BROWSER_TRACKABLE, 0, res.getString(R.string.trackable_browser_open)).setIcon(android.R.drawable.ic_menu_info_details); // browser
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
- case 1:
+ case MENU_LOG_TOUCH:
logTouch();
return true;
- case 2:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/track/details.aspx?tracker=" + trackable.getGeocode())));
+ case MENU_BROWSER_TRACKABLE:
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(trackable.getUrl())));
return true;
}
-
return false;
}
+ @Override
+ public boolean onPrepareOptionsMenu(Menu menu) {
+ menu.findItem(MENU_LOG_TOUCH).setEnabled(trackable.isLoggable());
+ menu.findItem(MENU_BROWSER_TRACKABLE).setEnabled(StringUtils.isNotBlank(trackable.getUrl()));
+ return super.onPrepareOptionsMenu(menu);
+ }
+
private class loadTrackable extends Thread {
private Handler handler = null;
@@ -471,8 +421,14 @@ public class cgeotrackable extends AbstractActivity {
@Override
public void run() {
- trackable = cgBase.searchTrackable(geocode, guid, id);
- handler.sendMessage(new Message());
+ // FIXME: Differentiation of trackable sources must be more globally, outside of activity
+ if (StringUtils.startsWithIgnoreCase(geocode, "GK")) {
+ trackable = cgeoapplication.getInstance().getTrackableByGeocode(geocode);
+ }
+ else {
+ trackable = cgBase.searchTrackable(geocode, guid, id);
+ }
+ handler.sendMessage(Message.obtain());
}
}
@@ -549,6 +505,18 @@ public class cgeotrackable extends AbstractActivity {
startActivity(logTouchIntent);
}
+ private TextView addDetail(int labelResourceId, String value) {
+ RelativeLayout layout = (RelativeLayout) inflater.inflate(R.layout.cache_item, null);
+ TextView labelView = (TextView) layout.findViewById(R.id.name);
+ TextView valueView = (TextView) layout.findViewById(R.id.value);
+
+ labelView.setText(res.getString(labelResourceId));
+ valueView.setText(value);
+ detailsList.addView(layout);
+
+ return valueView;
+ }
+
private class tbIconThread extends Thread {
String url = null;
Handler handler = null;
diff --git a/main/src/cgeo/geocaching/files/GPXParser.java b/main/src/cgeo/geocaching/files/GPXParser.java
index bfdb1a9..94140e6 100644
--- a/main/src/cgeo/geocaching/files/GPXParser.java
+++ b/main/src/cgeo/geocaching/files/GPXParser.java
@@ -613,8 +613,11 @@ public abstract class GPXParser extends FileParser {
// waypoint.cache.travelbugs
final Element gcTBs = gcCache.getChild(nsGC, "travelbugs");
+ // waypoint.cache.travelbug
+ final Element gcTB = gcTBs.getChild(nsGC, "travelbug");
+
// waypoint.cache.travelbugs.travelbug
- gcTBs.getChild(nsGC, "travelbug").setStartElementListener(new StartElementListener() {
+ gcTB.setStartElementListener(new StartElementListener() {
@Override
public void start(Attributes attrs) {
@@ -630,9 +633,6 @@ public abstract class GPXParser extends FileParser {
}
});
- // waypoint.cache.travelbug
- final Element gcTB = gcTBs.getChild(nsGC, "travelbug");
-
gcTB.setEndElementListener(new EndElementListener() {
@Override