diff options
Diffstat (limited to 'main')
18 files changed, 282 insertions, 125 deletions
diff --git a/main/res/drawable/helper_barcode.png b/main/res/drawable/helper_barcode.png Binary files differnew file mode 100644 index 0000000..0b56af3 --- /dev/null +++ b/main/res/drawable/helper_barcode.png 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)))); + } +} |
