aboutsummaryrefslogtreecommitdiffstats
path: root/main
diff options
context:
space:
mode:
Diffstat (limited to 'main')
-rw-r--r--main/res/drawable/helper_barcode.pngbin0 -> 13114 bytes
-rw-r--r--main/res/layout/init.xml23
-rw-r--r--main/res/values-de/strings.xml15
-rw-r--r--main/res/values/strings.xml30
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java133
-rw-r--r--main/src/cgeo/geocaching/StoredList.java2
-rw-r--r--main/src/cgeo/geocaching/UsefulAppsActivity.java1
-rw-r--r--main/src/cgeo/geocaching/cgBase.java7
-rw-r--r--main/src/cgeo/geocaching/cgCache.java2
-rw-r--r--main/src/cgeo/geocaching/cgeoinit.java8
-rw-r--r--main/src/cgeo/geocaching/connector/AbstractConnector.java6
-rw-r--r--main/src/cgeo/geocaching/connector/GCConnector.java5
-rw-r--r--main/src/cgeo/geocaching/connector/IConnector.java9
-rw-r--r--main/src/cgeo/geocaching/geopoint/GeopointFormatter.java1
-rw-r--r--main/src/cgeo/geocaching/geopoint/Viewport.java4
-rw-r--r--main/src/cgeo/geocaching/maps/CGeoMap.java89
-rw-r--r--main/src/cgeo/geocaching/utils/ClipboardUtils.java26
-rw-r--r--main/src/cgeo/geocaching/utils/TranslationUtils.java46
18 files changed, 282 insertions, 125 deletions
diff --git a/main/res/drawable/helper_barcode.png b/main/res/drawable/helper_barcode.png
new file mode 100644
index 0000000..0b56af3
--- /dev/null
+++ b/main/res/drawable/helper_barcode.png
Binary files differ
diff --git a/main/res/layout/init.xml b/main/res/layout/init.xml
index 5cb6605..121c012 100644
--- a/main/res/layout/init.xml
+++ b/main/res/layout/init.xml
@@ -50,23 +50,12 @@
android:id="@+id/password"
android:hint="@string/init_password"
android:password="true" />
- <LinearLayout
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:layout_margin="3dip"
- android:orientation="horizontal"
- android:padding="3dip" >
- <Button style="@style/button"
- android:id="@+id/log_me_in"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/init_login" />
- <Button style="@style/button"
- android:id="@+id/log_me_out"
- android:layout_width="0dip"
- android:layout_weight="1"
- android:text="@string/init_logout" />
- </LinearLayout>
+ <Button style="@style/button"
+ android:id="@+id/log_me_in"
+ android:lines="2"
+ android:singleLine="false"
+ android:scrollHorizontally="false"
+ android:text="@string/init_login" />
<!-- ** -->
<RelativeLayout style="@style/separator_horizontal_layout" >
<View style="@style/separator_horizontal" />
diff --git a/main/res/values-de/strings.xml b/main/res/values-de/strings.xml
index 15e880d..982b9f2 100644
--- a/main/res/values-de/strings.xml
+++ b/main/res/values-de/strings.xml
@@ -350,7 +350,6 @@
<string name="init_password">Passwort</string>
<string name="init_passvote">Passwort</string>
<string name="init_login">Anmeldedaten überprüfen und speichern</string>
- <string name="init_logout">Abmelden</string>
<string name="init_login_popup">Login</string>
<string name="init_login_popup_working">Bei Geocaching.com anmelden…</string>
<string name="init_login_popup_ok">Login erfolgreich.</string>
@@ -725,16 +724,18 @@
<!-- helpers -->
<string name="helper_manual_title">Anleitung</string>
<string name="helper_manual_description">Umfangreiche Anleitung für c:geo mit Beschreibung aller Möglichkeiten dieser App (auch versteckte).</string>
- <string name="helper_calendar_title">c:geo Kalendar Add-on</string>
- <string name="helper_calendar_missing">c:geo Kalendar Add-on nicht installiert</string>
- <string name="helper_calendar_description">Ermöglicht die Übernahme von Event Caches in den Kalendar.</string>
+ <string name="helper_calendar_title">c:geo Kalender Add-on</string>
+ <string name="helper_calendar_missing">c:geo Kalender Add-on nicht installiert</string>
+ <string name="helper_calendar_description">Ermöglicht die Übernahme von Event-Caches in den Kalender.</string>
<string name="helper_locus_title">Locus</string>
<string name="helper_locus_description">Sehr gute App für Online- und Offline-Karten (nur Rasterkarten) mit vielen weiteren Funktionen wie z.B. Trackaufzeichnung, POIs und vieles mehr.</string>
- <string name="helper_gpsstatus_title">GPS Status</string>
- <string name="helper_gpsstatus_description">Das Radar dieser App kann in c:geo verwendet und zusätzlich viele GPS-bezogene Information abgerufen werden.</string>
+ <string name="helper_gpsstatus_title">GPS-Status</string>
+ <string name="helper_gpsstatus_description">Das Radar dieser App kann in c:geo verwendet und zusätzlich viele GPS-bezogene Informationen abgerufen werden.</string>
<string name="helper_bluetoothgps_title">Bluetooth GPS</string>
<string name="helper_bluetoothgps_description">Ermöglicht ein externes GPS zu verwenden, um die Standortgenauigkeit zu erhöhen und die Batterie zu schonen.</string>
-
+ <string name="helper_barcode_title">Barcode-Scanner</string>
+ <string name="helper_barcode_description">Es gibt GreaseMonkey-Scripte und Webseiten, die Geocodes als Strichcode darstellen können. Bei Verwendung dieser Skripte kann c:geo über diese App den Geocode eines Caches direkt vom Bildschirm des Computers ablesen.</string>
+
<!-- attributes (permissions -> allowed, not allowed) -->
<string name="attribute_dogs_yes">Hunde erlaubt</string>
<string name="attribute_dogs_no">Hunde nicht erlaubt</string>
diff --git a/main/res/values/strings.xml b/main/res/values/strings.xml
index 7f0a8f4..175e657 100644
--- a/main/res/values/strings.xml
+++ b/main/res/values/strings.xml
@@ -114,7 +114,20 @@
<string name="log_new_log">Log</string>
<string name="log_new_log_text">Log Text</string>
<string name="log_announcement">Announcement</string>
-
+
+ <!-- copy -->
+ <string name="options_context_menu_title">Options</string>
+ <string name="copy_coords">Copy Coordinates</string>
+ <string name="copy_desc">Copy Description</string>
+ <string name="copy_personalnote">Copy Personal Note</string>
+ <string name="copy_hint">Copy Hint</string>
+ <string name="copy_log">Copy Log</string>
+
+ <!-- translation -->
+ <string name="translate_to_sys_lang">Translate to %s</string>
+ <string name="translate_to_english">Translate to English</string>
+ <string name="translate_length_warning">Translate may fail with large amounts of text.</string>
+
<!-- errors, warnings, info toasts -->
<string name="err_none">OK</string>
<string name="err_start">Communication not started</string>
@@ -349,7 +362,6 @@
<string name="init_password">Password</string>
<string name="init_passvote">Password</string>
<string name="init_login">Check and save Login</string>
- <string name="init_logout">Logout</string>
<string name="init_login_popup">Login</string>
<string name="init_login_popup_working">Logging into Geocaching.com…</string>
<string name="init_login_popup_ok">Login ok.</string>
@@ -754,7 +766,9 @@
<string name="helper_gpsstatus_description">You can use radar from this application with c:geo. It also offers a lot of other GPS-related information.</string>
<string name="helper_bluetoothgps_title">Bluetooth GPS</string>
<string name="helper_bluetoothgps_description">Allows you to use external GPS device to get better reception, more precise location and can spare battery of your phone.</string>
-
+ <string name="helper_barcode_title">Barcode Scanner</string>
+ <string name="helper_barcode_description">There are Greasemonkey scripts and websites which allow to display a geocode as barcode. With this app c:geo can read that geocode directly from the screen of your computer.</string>
+
<!-- attributes (permissions -> allowed, not allowed) -->
<string name="attribute_dogs_yes">Dogs allowed</string>
<string name="attribute_dogs_no">Dogs not allowed</string>
@@ -931,6 +945,7 @@
· blafoo (code)\n
· Bonemaro (tester)\n
· BudBundi (localization DE, tester)\n
+ · campbeb (code)\n
· Charles (localization FR)\n
· Denny (localization DA)\n
· Eisbehr (code, open source project leader)\n
@@ -975,13 +990,14 @@
<!-- changelog -->
<string name="changelog">\n
<b>next release</b>\n
- · New: Calendar add-on. c:geo doesn\'t require calendar permission anymore
- · Fix: Deletion of outdated caches did not work
- · Fix: Changed internal caching causing a better overall performance
- · New: Login status at start screen
+ · New: Calendar add-on. c:geo doesn\'t require calendar permission anymore\n
+ · Fix: Deletion of outdated caches did not work\n
+ · Fix: Changed internal caching causing a better overall performance\n
+ · New: Login status at start screen\n
· New: Changed markers in the map with additional informations for stored caches:\n
Personal Note available, Modified coordinates, non-reliable coordinates (orange circle)\n
· Fix: Caches with modified coordinates are displayed at the modified coords and not at the original coords\n
+ · New: Copy and translate available with long press\n
· \n
\n\n
<b>04.01.2012</b>\n
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 9a7b60c..928b593 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -17,7 +17,9 @@ import cgeo.geocaching.network.HtmlImage;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.utils.BaseUtils;
import cgeo.geocaching.utils.CancellableHandler;
+import cgeo.geocaching.utils.ClipboardUtils;
import cgeo.geocaching.utils.CryptUtils;
+import cgeo.geocaching.utils.TranslationUtils;
import cgeo.geocaching.utils.UnknownTagsHandler;
import com.viewpagerindicator.TitlePageIndicator;
@@ -28,7 +30,9 @@ import org.apache.commons.lang3.StringEscapeUtils;
import org.apache.commons.lang3.StringUtils;
import android.R.color;
+import android.app.AlertDialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.res.Configuration;
import android.graphics.Bitmap;
@@ -84,6 +88,7 @@ import java.util.EnumSet;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
+import java.util.Locale;
import java.util.Map;
import java.util.Map.Entry;
@@ -112,7 +117,7 @@ public class CacheDetailActivity extends AbstractActivity {
private final Progress progress = new Progress();
private SearchResult search;
private final LocationUpdater locationUpdater = new LocationUpdater();
- private String contextMenuUser = null;
+ private CharSequence clickedItemText = null;
private int contextMenuWPIndex = -1;
/**
@@ -347,22 +352,35 @@ public class CacheDetailActivity extends AbstractActivity {
final int viewId = view.getId();
contextMenuWPIndex = -1;
switch (viewId) {
- case R.id.author:
- case R.id.value:
- if (viewId == R.id.author) { // Author of a log entry
- contextMenuUser = ((TextView) view).getText().toString();
- } else if (viewId == R.id.value) { // The owner of the cache
- if (StringUtils.isNotBlank(cache.getOwnerReal())) {
- contextMenuUser = cache.getOwnerReal();
- } else {
- contextMenuUser = cache.getOwner();
- }
+ case R.id.value: // coordinates
+ clickedItemText = ((TextView) view).getText();
+ buildOptionsContextmenu(menu, viewId, res.getString(R.string.copy_coords), true);
+ break;
+ case R.id.shortdesc:
+ clickedItemText = ((TextView) view).getText();
+ buildOptionsContextmenu(menu, viewId, res.getString(R.string.copy_desc), false);
+ break;
+ case R.id.longdesc:
+ // combine short and long description
+ String shortDesc = cache.getShortDescription();
+ if (shortDesc.compareTo("") == 0) {
+ clickedItemText = ((TextView) view).getText();
+ } else {
+ clickedItemText = shortDesc + "\n\n" + ((TextView) view).getText();
}
-
- menu.setHeaderTitle(res.getString(R.string.user_menu_title) + " " + contextMenuUser);
- menu.add(viewId, 1, 0, res.getString(R.string.user_menu_view_hidden));
- menu.add(viewId, 2, 0, res.getString(R.string.user_menu_view_found));
- menu.add(viewId, 3, 0, res.getString(R.string.user_menu_open_browser));
+ buildOptionsContextmenu(menu, viewId, res.getString(R.string.copy_desc), false);
+ break;
+ case R.id.personalnote:
+ clickedItemText = ((TextView) view).getText();
+ buildOptionsContextmenu(menu, viewId, res.getString(R.string.copy_personalnote), true);
+ break;
+ case R.id.hint:
+ clickedItemText = ((TextView) view).getText();
+ buildOptionsContextmenu(menu, viewId, res.getString(R.string.copy_hint), false);
+ break;
+ case R.id.log:
+ clickedItemText = ((TextView) view).getText();
+ buildOptionsContextmenu(menu, viewId, res.getString(R.string.copy_log), false);
break;
case -1:
if (null != cache.getWaypoints()) {
@@ -398,27 +416,46 @@ public class CacheDetailActivity extends AbstractActivity {
}
}
+ private void buildOptionsContextmenu(ContextMenu menu, int viewId, String copyPrompt, boolean copyOnly) {
+ menu.setHeaderTitle(res.getString(R.string.options_context_menu_title));
+ menu.add(viewId, 1, 0, copyPrompt);
+ if (!copyOnly) {
+ if (clickedItemText.length() > TranslationUtils.translationTextLengthToWarn) {
+ showToast(res.getString(R.string.translate_length_warning));
+ }
+ menu.add(viewId, 2, 0, res.getString(R.string.translate_to_sys_lang, Locale.getDefault().getDisplayLanguage()));
+ if (Settings.isUseEnglish() && Locale.getDefault() != Locale.ENGLISH) {
+ menu.add(viewId, 3, 0, res.getString(R.string.translate_to_english));
+ }
+
+ }
+ }
+
@Override
public boolean onContextItemSelected(MenuItem item) {
final int groupId = item.getGroupId();
final int index = item.getItemId();
switch (groupId) {
- case R.id.author:
case R.id.value:
- final int itemId = item.getItemId();
- switch (itemId) {
- case 1:
- cgeocaches.startActivityOwner(this, contextMenuUser);
+ case R.id.shortdesc:
+ case R.id.longdesc:
+ case R.id.personalnote:
+ case R.id.hint:
+ case R.id.log:
+ switch (index) {
+ case 1: // copy
+ ClipboardUtils.copyToClipboard(clickedItemText);
return true;
- case 2:
- cgeocaches.startActivityUserName(this, contextMenuUser);
+ case 2: // translate to system language
+ TranslationUtils.startActivityTranslate(this, Locale.getDefault().getLanguage(), clickedItemText.toString());
return true;
- case 3:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + URLEncoder.encode(contextMenuUser))));
+ case 3: // translate to English
+ TranslationUtils.startActivityTranslate(this, Locale.ENGLISH.getLanguage(), clickedItemText.toString());
return true;
default:
break;
}
+
break;
case CONTEXT_MENU_WAYPOINT_EDIT:
if (cache.hasWaypoints() && index < cache.getWaypoints().size()) {
@@ -818,7 +855,7 @@ public class CacheDetailActivity extends AbstractActivity {
}
/**
- * Opens a context menu to do actions on an username
+ * Opens a dialog to do actions on an username
*/
private class UserActionsClickListener implements View.OnClickListener {
@@ -830,12 +867,34 @@ public class CacheDetailActivity extends AbstractActivity {
return;
}
- try {
- registerForContextMenu(view);
- openContextMenu(view);
- } catch (Exception e) {
- // nothing
- }
+ clickedItemText = ((TextView) view).getText().toString();
+
+ final CharSequence[] items = {res.getString(R.string.user_menu_view_hidden),
+ res.getString(R.string.user_menu_view_found),
+ res.getString(R.string.user_menu_open_browser)
+ };
+
+ AlertDialog.Builder builder = new AlertDialog.Builder(CacheDetailActivity.this);
+ builder.setTitle(res.getString(R.string.user_menu_title) + " " + clickedItemText);
+ builder.setItems(items, new DialogInterface.OnClickListener() {
+ public void onClick(DialogInterface dialog, int item) {
+ switch (item) {
+ case 0:
+ cgeocaches.startActivityOwner(CacheDetailActivity.this, clickedItemText.toString());
+ return;
+ case 1:
+ cgeocaches.startActivityUserName(CacheDetailActivity.this, clickedItemText.toString());
+ return;
+ case 2:
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + URLEncoder.encode(clickedItemText.toString()))));
+ return;
+ default:
+ break;
+ }
+ }
+ });
+ AlertDialog alert = builder.create();
+ alert.show();
}
}
@@ -1357,8 +1416,8 @@ public class CacheDetailActivity extends AbstractActivity {
// cache coordinates
if (cache.getCoords() != null) {
- addCacheDetail(R.string.cache_coordinates, cache.getCoords().toString())
- .setOnClickListener(new View.OnClickListener() {
+ TextView valueView = addCacheDetail(R.string.cache_coordinates, cache.getCoords().toString());
+ valueView.setOnClickListener(new View.OnClickListener() {
private int position = 0;
private GeopointFormatter.Format[] availableFormats = new GeopointFormatter.Format[] {
GeopointFormatter.Format.LAT_LON_DECMINUTE,
@@ -1375,6 +1434,7 @@ public class CacheDetailActivity extends AbstractActivity {
valueView.setText(cache.getCoords().format(availableFormats[position]));
}
});
+ registerForContextMenu(valueView);
}
// cache attributes
@@ -1842,6 +1902,7 @@ public class CacheDetailActivity extends AbstractActivity {
// cache short description
if (StringUtils.isNotBlank(cache.getShortDescription())) {
new LoadDescriptionTask().execute(cache.getShortDescription(), view.findViewById(R.id.shortdesc), null);
+ registerForContextMenu(view.findViewById(R.id.shortdesc));
}
// long description
@@ -1867,6 +1928,7 @@ public class CacheDetailActivity extends AbstractActivity {
personalNoteText.setVisibility(View.VISIBLE);
personalNoteText.setText(cache.getPersonalNote(), TextView.BufferType.SPANNABLE);
personalNoteText.setMovementMethod(LinkMovementMethod.getInstance());
+ registerForContextMenu(personalNoteText);
}
else {
((LinearLayout) view.findViewById(R.id.personalnote_box)).setVisibility(View.GONE);
@@ -1892,6 +1954,7 @@ public class CacheDetailActivity extends AbstractActivity {
hintView.setText(CryptUtils.rot13(hintView.getText().toString()));
}
});
+ registerForContextMenu(hintView);
} else {
TextView hintView = ((TextView) view.findViewById(R.id.hint));
hintView.setVisibility(View.GONE);
@@ -1931,6 +1994,7 @@ public class CacheDetailActivity extends AbstractActivity {
view.findViewById(R.id.loading).setVisibility(View.VISIBLE);
new LoadDescriptionTask().execute(cache.getDescription(), view.findViewById(R.id.longdesc), view.findViewById(R.id.loading));
+ registerForContextMenu(view.findViewById(R.id.longdesc));
}
/**
@@ -2205,6 +2269,7 @@ public class CacheDetailActivity extends AbstractActivity {
TextView logView = (TextView) logLayout.findViewById(R.id.log);
logView.setMovementMethod(LinkMovementMethod.getInstance());
logView.setOnClickListener(new DecryptLogClickListener());
+ registerForContextMenu(logView);
loglist.add(rowView);
}
diff --git a/main/src/cgeo/geocaching/StoredList.java b/main/src/cgeo/geocaching/StoredList.java
index b88a6bb..3b5a47a 100644
--- a/main/src/cgeo/geocaching/StoredList.java
+++ b/main/src/cgeo/geocaching/StoredList.java
@@ -7,7 +7,7 @@ public class StoredList {
public final int id;
public final String title;
- public final int count;
+ private final int count; // this value is only valid as long as the list is not changed by other database operations
public StoredList(int id, String title, int count) {
this.id = id;
diff --git a/main/src/cgeo/geocaching/UsefulAppsActivity.java b/main/src/cgeo/geocaching/UsefulAppsActivity.java
index d4418ab..cb07934 100644
--- a/main/src/cgeo/geocaching/UsefulAppsActivity.java
+++ b/main/src/cgeo/geocaching/UsefulAppsActivity.java
@@ -42,6 +42,7 @@ public class UsefulAppsActivity extends AbstractActivity {
addApp(R.string.helper_locus_title, R.string.helper_locus_description, R.drawable.helper_locus, "menion.android.locus");
addApp(R.string.helper_gpsstatus_title, R.string.helper_gpsstatus_description, R.drawable.helper_gpsstatus, "com.eclipsim.gpsstatus2");
addApp(R.string.helper_bluetoothgps_title, R.string.helper_bluetoothgps_description, R.drawable.helper_bluetoothgps, "googoo.android.btgps");
+ addApp(R.string.helper_barcode_title, R.string.helper_barcode_description, R.drawable.helper_barcode, "com.google.zxing.client.android");
}
@Override
diff --git a/main/src/cgeo/geocaching/cgBase.java b/main/src/cgeo/geocaching/cgBase.java
index 7c3f80f..9e6a1ec 100644
--- a/main/src/cgeo/geocaching/cgBase.java
+++ b/main/src/cgeo/geocaching/cgBase.java
@@ -343,7 +343,6 @@ public class cgBase {
clearCookies();
Settings.setCookieStore(null);
- setActualStatus("-");
return StatusCode.NO_ERROR;
}
@@ -1925,7 +1924,7 @@ public class cgBase {
final SearchResult searchResult = parseMapJSON(Uri.parse(uri).buildUpon().encodedQuery(params).build().toString(), page);
if (searchResult == null || CollectionUtils.isEmpty(searchResult.getGeocodes())) {
- Log.e(Settings.tag, "cgeoBase.searchByViewport: No cache parsed");
+ Log.e(Settings.tag, "cgeoBase.searchByViewport: No cache parsed for viewport " + viewport);
return null;
}
@@ -3124,12 +3123,12 @@ public class cgBase {
* found, this method returns false.
*
* From: http://android-developers.blogspot.com/2009/01/can-i-use-this-intent.html
- *
+ *
* @param context
* The application's environment.
* @param action
* The Intent action to check for availability.
- *
+ *
* @return True if an Intent with the specified action can be sent and
* responded to, false otherwise.
*/
diff --git a/main/src/cgeo/geocaching/cgCache.java b/main/src/cgeo/geocaching/cgCache.java
index eafc908..8bf8871 100644
--- a/main/src/cgeo/geocaching/cgCache.java
+++ b/main/src/cgeo/geocaching/cgCache.java
@@ -811,7 +811,7 @@ public class cgCache implements ICache {
* @return true if the coords are from the cache details page and the user has been logged in
*/
public boolean isReliableLatLon() {
- return reliableLatLon;
+ return getConnector().isReliableLatLon(reliableLatLon);
}
public void setReliableLatLon(boolean reliableLatLon) {
diff --git a/main/src/cgeo/geocaching/cgeoinit.java b/main/src/cgeo/geocaching/cgeoinit.java
index cd8a5a8..5a601ac 100644
--- a/main/src/cgeo/geocaching/cgeoinit.java
+++ b/main/src/cgeo/geocaching/cgeoinit.java
@@ -229,14 +229,6 @@ public class cgeoinit extends AbstractActivity {
Button logMeIn = (Button) findViewById(R.id.log_me_in);
logMeIn.setOnClickListener(new logIn());
- Button logMeOut = (Button) findViewById(R.id.log_me_out);
- logMeOut.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View view) {
- cgBase.logout();
- }
- });
-
TextView legalNote = (TextView) findViewById(R.id.legal_note);
legalNote.setClickable(true);
legalNote.setOnClickListener(new View.OnClickListener() {
diff --git a/main/src/cgeo/geocaching/connector/AbstractConnector.java b/main/src/cgeo/geocaching/connector/AbstractConnector.java
index 6db305c..3c0076a 100644
--- a/main/src/cgeo/geocaching/connector/AbstractConnector.java
+++ b/main/src/cgeo/geocaching/connector/AbstractConnector.java
@@ -66,4 +66,10 @@ public abstract class AbstractConnector implements IConnector {
// don't accept any file by default
return false;
}
+
+ @Override
+ public boolean isReliableLatLon(boolean cacheHasReliableLatLon) {
+ // let every cache have reliable coordinates by default
+ return true;
+ }
}
diff --git a/main/src/cgeo/geocaching/connector/GCConnector.java b/main/src/cgeo/geocaching/connector/GCConnector.java
index 5d685df..2d6e67b 100644
--- a/main/src/cgeo/geocaching/connector/GCConnector.java
+++ b/main/src/cgeo/geocaching/connector/GCConnector.java
@@ -136,4 +136,9 @@ public class GCConnector extends AbstractConnector {
public boolean isZippedGPXFile(final String fileName) {
return gpxZipFilePattern.matcher(fileName).matches();
}
+
+ @Override
+ public boolean isReliableLatLon(boolean cacheHasReliableLatLon) {
+ return cacheHasReliableLatLon;
+ }
}
diff --git a/main/src/cgeo/geocaching/connector/IConnector.java b/main/src/cgeo/geocaching/connector/IConnector.java
index 028f79b..21cdb75 100644
--- a/main/src/cgeo/geocaching/connector/IConnector.java
+++ b/main/src/cgeo/geocaching/connector/IConnector.java
@@ -92,4 +92,13 @@ public interface IConnector {
* @return
*/
public boolean isZippedGPXFile(final String fileName);
+
+ /**
+ * return true if coordinates of a cache are reliable. only implemented by GC connector
+ *
+ * @param cacheHasReliableLatLon
+ * flag of the cache
+ * @return
+ */
+ public boolean isReliableLatLon(boolean cacheHasReliableLatLon);
}
diff --git a/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java b/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java
index 1aad335..c4cfb8c 100644
--- a/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java
+++ b/main/src/cgeo/geocaching/geopoint/GeopointFormatter.java
@@ -54,7 +54,6 @@ public class GeopointFormatter
* one of the predefined formats
* @return the formatted coordinates
*/
- @SuppressWarnings("boxing")
public static String format(final Format format, final Geopoint gp)
{
final double latSigned = gp.getLatitude();
diff --git a/main/src/cgeo/geocaching/geopoint/Viewport.java b/main/src/cgeo/geocaching/geopoint/Viewport.java
index ef80ae3..71508c3 100644
--- a/main/src/cgeo/geocaching/geopoint/Viewport.java
+++ b/main/src/cgeo/geocaching/geopoint/Viewport.java
@@ -32,4 +32,8 @@ public class Viewport {
public double getLongitudeMax() {
return topRight.getLongitude();
}
+
+ public String toString() {
+ return "(" + bottomLeft.toString() + "," + topRight.toString() + ")";
+ }
}
diff --git a/main/src/cgeo/geocaching/maps/CGeoMap.java b/main/src/cgeo/geocaching/maps/CGeoMap.java
index 8132bfd..d54eed7 100644
--- a/main/src/cgeo/geocaching/maps/CGeoMap.java
+++ b/main/src/cgeo/geocaching/maps/CGeoMap.java
@@ -859,8 +859,8 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
*/
private class LoadTimer extends Thread {
private LoadThread loadThread = null;
- private DownloadThread downloadThread = null;
- private DisplayThread displayThread = null;
+ private DownloadThread downloadThread = new DownloadThread(0L, 0L, 0L, 0L);
+ private DisplayThread displayThread = new DisplayThread(0L, 0L, 0L, 0L);
public LoadTimer() {
super("Load Timer");
@@ -987,11 +987,17 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
}
public void startNewDisplayThread(long centerLat, long centerLon, long spanLat, long spanLon) {
- if (displayThread != null && displayThread.isWorking()) {
+ if (displayThread.isWorking()) {
+ // create new thread
displayThread.stopIt();
+ displayThread = null;
+ displayThread = new DisplayThread(centerLat, centerLon, spanLat, spanLon);
+ displayThread.start();
+ } else {
+ // reuse thread
+ displayThread.setCenterSpan(centerLat, centerLon, spanLat, spanLon);
+ displayThread.run();
}
- displayThread = new DisplayThread(centerLat, centerLon, spanLat, spanLon);
- displayThread.start();
}
public boolean isLoading() {
@@ -1008,11 +1014,17 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
}
public void startNewDownloadThread(final long centerLat, final long centerLon, final long spanLat, final long spanLon) {
- if (downloadThread != null && downloadThread.isWorking()) {
+ if (downloadThread.isWorking()) {
+ // create new thread
downloadThread.stopIt();
+ downloadThread = null;
+ downloadThread = new DownloadThread(centerLat, centerLon, spanLat, spanLon);
+ downloadThread.start();
+ } else {
+ // reuse thread
+ downloadThread.setCenterSpan(centerLat, centerLon, spanLat, spanLon);
+ downloadThread.run();
}
- downloadThread = new DownloadThread(centerLat, centerLon, spanLat, spanLon);
- downloadThread.start();
}
public void stopDisplayThread() {
@@ -1230,18 +1242,10 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
}
@Override
- public void run() { //first time we enter we have crappy long/lat....
+ public void run() {
try {
- stop = false;
working = true;
- if (stop) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
- }
-
double lat1 = (centerLat / 1e6) - ((spanLat / 1e6) / 2) - ((spanLat / 1e6) / 4);
double lat2 = (centerLat / 1e6) + ((spanLat / 1e6) / 2) + ((spanLat / 1e6) / 4);
double lon1 = (centerLon / 1e6) - ((spanLon / 1e6) / 2) - ((spanLon / 1e6) / 4);
@@ -1259,15 +1263,16 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
int count = 0;
do {
+ if (stop) {
+ throw new ThreadDeath();
+ }
+
if (token == null) {
token = cgBase.getMapUserToken(noMapTokenHandler);
}
if (stop) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
+ throw new ThreadDeath();
}
final Viewport viewport = new Viewport(new Geopoint(latMin, lonMin), new Geopoint(latMax, lonMax));
@@ -1286,10 +1291,7 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
} while (count < 2);
if (stop) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
+ throw new ThreadDeath();
}
if (search != null) {
@@ -1297,17 +1299,18 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
}
if (stop) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
+ throw new ThreadDeath();
}
//render
if (loadTimer != null) {
loadTimer.startNewDisplayThread(centerLat, centerLon, spanLat, spanLon);
}
+ } catch (ThreadDeath e) {
+ Log.d(Settings.tag, "DownloadThread stopped");
+ displayHandler.sendEmptyMessage(UPDATE_TITLE);
} finally {
+ stop = false;
working = false;
}
}
@@ -1326,14 +1329,10 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
@Override
public void run() {
try {
- stop = false;
working = true;
if (mapView == null || caches == null) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
+ throw new ThreadDeath();
}
// display caches
@@ -1343,10 +1342,7 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
if (!cachesProtected.isEmpty()) {
for (cgCache cacheOne : cachesProtected) {
if (stop) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
+ throw new ThreadDeath();
}
if (cacheOne.getCoords() == null) {
@@ -1375,10 +1371,7 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
cachesCnt = cachesProtected.size();
if (stop) {
- displayHandler.sendEmptyMessage(UPDATE_TITLE);
- working = false;
-
- return;
+ throw new ThreadDeath();
}
} else {
@@ -1389,7 +1382,11 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
cachesProtected.clear();
displayHandler.sendEmptyMessage(UPDATE_TITLE);
+ } catch (ThreadDeath e) {
+ Log.d(Settings.tag, "DisplayThread stopped");
+ displayHandler.sendEmptyMessage(UPDATE_TITLE);
} finally {
+ stop = false;
working = false;
}
}
@@ -1413,7 +1410,6 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
final Viewport viewport = new Viewport(center, spanLat / 1e6 * 1.5, spanLon / 1e6 * 1.5);
try {
- stop = false;
working = true;
usersThreadRun = System.currentTimeMillis();
@@ -1454,7 +1450,6 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
@Override
public void run() {
try {
- stop = false;
working = true;
if (mapView == null || CollectionUtils.isEmpty(users)) {
@@ -1531,7 +1526,7 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
private abstract static class DoThread extends Thread {
- protected boolean working = true;
+ protected boolean working = false;
protected boolean stop = false;
protected long centerLat = 0L;
protected long centerLon = 0L;
@@ -1539,6 +1534,10 @@ public class CGeoMap extends AbstractMap implements OnDragListener, ViewFactory
protected long spanLon = 0L;
public DoThread(long centerLatIn, long centerLonIn, long spanLatIn, long spanLonIn) {
+ setCenterSpan(centerLatIn, centerLonIn, spanLatIn, spanLonIn);
+ }
+
+ public void setCenterSpan(long centerLatIn, long centerLonIn, long spanLatIn, long spanLonIn) {
centerLat = centerLatIn;
centerLon = centerLonIn;
spanLat = spanLatIn;
diff --git a/main/src/cgeo/geocaching/utils/ClipboardUtils.java b/main/src/cgeo/geocaching/utils/ClipboardUtils.java
new file mode 100644
index 0000000..865d8d6
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/ClipboardUtils.java
@@ -0,0 +1,26 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.cgeoapplication;
+
+import android.content.Context;
+import android.text.ClipboardManager;
+
+/**
+ * Clipboard Utilities. Functions to copy data to the Android clipboard.
+ * This class uses the deprecated function ClipboardManager.setText(CharSequence).
+ * API 11 introduced setPrimaryClip(ClipData)
+ */
+public final class ClipboardUtils {
+
+ /**
+ * Places the text passed in onto the clipboard as text
+ *
+ * @param text
+ * The text to place in the clipboard.
+ */
+ public static void copyToClipboard(final CharSequence text) {
+ final ClipboardManager clipboard = (ClipboardManager) cgeoapplication.getInstance().getSystemService(Context.CLIPBOARD_SERVICE);
+ clipboard.setText(text);
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/utils/TranslationUtils.java b/main/src/cgeo/geocaching/utils/TranslationUtils.java
new file mode 100644
index 0000000..e086ab6
--- /dev/null
+++ b/main/src/cgeo/geocaching/utils/TranslationUtils.java
@@ -0,0 +1,46 @@
+package cgeo.geocaching.utils;
+
+import cgeo.geocaching.activity.AbstractActivity;
+
+import android.content.Intent;
+import android.net.Uri;
+
+import java.net.URLEncoder;
+
+/**
+ * Utilities used for translating
+ */
+public final class TranslationUtils {
+
+ private static final String translationWebsite = "http://translate.google.com/";
+ private static final String translationForceClassicMode = "?vi=c";
+ private static final String translationAutoSelect = "#auto";
+ private static final String translationFieldSeparator = "|";
+
+ public static final int translationTextLengthToWarn = 500;
+
+ /**
+ * Build a URI for Google Translate
+ *
+ * @param toLang
+ * The two-letter lowercase ISO language codes as defined by ISO 639-1
+ * @param text
+ * The text to be translated
+ * @return URI ready to be parsed
+ */
+ public static String buildTranslationURI(final String toLang, final String text) {
+ return translationWebsite + translationForceClassicMode + translationAutoSelect + translationFieldSeparator + toLang + translationFieldSeparator + URLEncoder.encode(text).replace("+", "%20");
+ }
+
+ /**
+ * Send Intent for Google Translate. Can be caught by Google Translate App or browser
+ *
+ * @param toLang
+ * The two-letter lowercase ISO language codes as defined by ISO 639-1
+ * @param text
+ * The text to be translated
+ */
+ public static void startActivityTranslate(final AbstractActivity context, final String toLang, final String text) {
+ context.startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse(buildTranslationURI(toLang, text))));
+ }
+}