aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/AndroidManifest.xml2
-rw-r--r--main/project.properties2
-rw-r--r--main/src/cgeo/geocaching/CacheDetailActivity.java9
-rw-r--r--main/src/cgeo/geocaching/DirectionProvider.java18
-rw-r--r--main/src/cgeo/geocaching/EditWaypointActivity.java2
-rw-r--r--main/src/cgeo/geocaching/StaticMapsActivity.java4
-rw-r--r--main/src/cgeo/geocaching/StaticMapsProvider.java29
-rw-r--r--main/src/cgeo/geocaching/cgData.java73
-rw-r--r--main/src/cgeo/geocaching/cgeotrackable.java4
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel11Emulation.java (renamed from main/src/cgeo/geocaching/compatibility/AndroidLevel11Dummy.java)4
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel13.java31
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java33
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel13Interface.java11
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel8.java20
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel8Dummy.java16
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java30
-rw-r--r--main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java1
-rw-r--r--main/src/cgeo/geocaching/compatibility/Compatibility.java51
-rw-r--r--main/src/cgeo/geocaching/connector/gc/GCParser.java5
-rw-r--r--main/src/cgeo/geocaching/network/HtmlImage.java11
-rw-r--r--main/src/cgeo/geocaching/network/Network.java25
-rw-r--r--main/src/cgeo/geocaching/ui/EditorDialog.java2
-rw-r--r--main/src/cgeo/geocaching/utils/AngleUtils.java8
-rw-r--r--main/src/cgeo/geocaching/utils/ImageHelper.java11
-rw-r--r--main/src/cgeo/geocaching/utils/TranslationUtils.java5
25 files changed, 256 insertions, 151 deletions
diff --git a/main/AndroidManifest.xml b/main/AndroidManifest.xml
index 7d1c09e..0aa9ad0 100644
--- a/main/AndroidManifest.xml
+++ b/main/AndroidManifest.xml
@@ -4,7 +4,7 @@
android:versionCode="20120618"
package="cgeo.geocaching"
android:installLocation="auto">
- <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="8" />
+ <uses-sdk android:minSdkVersion="4" android:targetSdkVersion="17" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
diff --git a/main/project.properties b/main/project.properties
index 942b689..a475ee2 100644
--- a/main/project.properties
+++ b/main/project.properties
@@ -8,4 +8,4 @@
# project structure.
# Project target.
-target=Google Inc.:Google APIs:11
+target=Google Inc.:Google APIs:17
diff --git a/main/src/cgeo/geocaching/CacheDetailActivity.java b/main/src/cgeo/geocaching/CacheDetailActivity.java
index 6fef4c4..1445073 100644
--- a/main/src/cgeo/geocaching/CacheDetailActivity.java
+++ b/main/src/cgeo/geocaching/CacheDetailActivity.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.activity.AbstractActivity;
import cgeo.geocaching.activity.Progress;
import cgeo.geocaching.apps.cache.GeneralAppsFactory;
import cgeo.geocaching.apps.cache.navi.NavigationAppFactory;
+import cgeo.geocaching.compatibility.Compatibility;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.connector.IConnector;
import cgeo.geocaching.connector.gc.GCConnector;
@@ -15,6 +16,7 @@ import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.geopoint.GeopointFormatter;
import cgeo.geocaching.geopoint.Units;
import cgeo.geocaching.network.HtmlImage;
+import cgeo.geocaching.network.Network;
import cgeo.geocaching.network.Parameters;
import cgeo.geocaching.ui.CacheDetailsCreator;
import cgeo.geocaching.ui.DecryptTextClickListener;
@@ -79,7 +81,6 @@ import android.view.View.OnLongClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewParent;
-import android.view.WindowManager;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
@@ -92,7 +93,6 @@ import android.widget.ScrollView;
import android.widget.TextView;
import android.widget.TextView.BufferType;
-import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
@@ -933,7 +933,7 @@ public class CacheDetailActivity extends AbstractActivity {
cgeocaches.startActivityUserName(CacheDetailActivity.this, name.toString());
return;
case 2:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + URLEncoder.encode(name.toString()))));
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + Network.encode(name.toString()))));
return;
default:
break;
@@ -1124,8 +1124,7 @@ public class CacheDetailActivity extends AbstractActivity {
attributeBox.removeAllViews();
// maximum width for attribute icons is screen width - paddings of parents
- attributeBoxMaxWidth = ((WindowManager) getSystemService(Context.WINDOW_SERVICE))
- .getDefaultDisplay().getWidth();
+ attributeBoxMaxWidth = Compatibility.getDisplayWidth();
ViewParent child = attributeBox;
do {
if (child instanceof View) {
diff --git a/main/src/cgeo/geocaching/DirectionProvider.java b/main/src/cgeo/geocaching/DirectionProvider.java
index 14fd283..c1f83ac 100644
--- a/main/src/cgeo/geocaching/DirectionProvider.java
+++ b/main/src/cgeo/geocaching/DirectionProvider.java
@@ -14,7 +14,7 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve
private final SensorManager sensorManager;
- // Previous values signalled to observers to avoid resending the same value when the
+ // Previous values signaled to observers to avoid resending the same value when the
// device doesn't change orientation. The orientation is usually given with a 1 degree
// precision by Android, so it is not uncommon to obtain exactly the same value several
// times.
@@ -38,14 +38,14 @@ public class DirectionProvider extends MemorySubject<Float> implements SensorEve
@Override
public void onAccuracyChanged(final Sensor sensor, int accuracy) {
/*
- * There is a bug in Android, which appearently causes this method to be called every
- * time the sensor _value_ changed, even if the _accuracy_ did not change. So logging
- * this event leads to the log being flooded with multiple entries _per second_,
- * which I experienced when running cgeo in a building (with GPS and network being
- * unreliable).
- *
- * See for example https://code.google.com/p/android/issues/detail?id=14792
- */
+ * There is a bug in Android, which apparently causes this method to be called every
+ * time the sensor _value_ changed, even if the _accuracy_ did not change. So logging
+ * this event leads to the log being flooded with multiple entries _per second_,
+ * which I experienced when running cgeo in a building (with GPS and network being
+ * unreliable).
+ *
+ * See for example https://code.google.com/p/android/issues/detail?id=14792
+ */
//Log.i(Settings.tag, "Compass' accuracy is low (" + accuracy + ")");
}
diff --git a/main/src/cgeo/geocaching/EditWaypointActivity.java b/main/src/cgeo/geocaching/EditWaypointActivity.java
index ef2a2cc..07beea2 100644
--- a/main/src/cgeo/geocaching/EditWaypointActivity.java
+++ b/main/src/cgeo/geocaching/EditWaypointActivity.java
@@ -406,7 +406,7 @@ public class EditWaypointActivity extends AbstractActivity {
app.saveCache(cache, EnumSet.of(SaveFlag.SAVE_DB));
StaticMapsProvider.removeWpStaticMaps(id, geocode);
if (Settings.isStoreOfflineWpMaps()) {
- StaticMapsProvider.storeWaypointStaticMap(cache, EditWaypointActivity.this, waypoint, false);
+ StaticMapsProvider.storeWaypointStaticMap(cache, waypoint, false);
}
finish();
} else {
diff --git a/main/src/cgeo/geocaching/StaticMapsActivity.java b/main/src/cgeo/geocaching/StaticMapsActivity.java
index 05a18f2..e6173b2 100644
--- a/main/src/cgeo/geocaching/StaticMapsActivity.java
+++ b/main/src/cgeo/geocaching/StaticMapsActivity.java
@@ -186,13 +186,13 @@ public class StaticMapsActivity extends AbstractActivity {
final cgCache cache = app.loadCache(geocode, LoadFlags.LOAD_CACHE_OR_DB);
if (waypoint_id == null) {
showToast(res.getString(R.string.info_storing_static_maps));
- StaticMapsProvider.storeCacheStaticMap(cache, this, true);
+ StaticMapsProvider.storeCacheStaticMap(cache, true);
return cache.hasStaticMap();
}
final cgWaypoint waypoint = cache.getWaypointById(waypoint_id);
if (waypoint != null) {
showToast(res.getString(R.string.info_storing_static_maps));
- StaticMapsProvider.storeWaypointStaticMap(cache, this, waypoint, true);
+ StaticMapsProvider.storeWaypointStaticMap(cache, waypoint, true);
return StaticMapsProvider.hasStaticMapForWaypoint(geocode, waypoint_id);
}
showToast(res.getString(R.string.err_detail_not_load_map_static));
diff --git a/main/src/cgeo/geocaching/StaticMapsProvider.java b/main/src/cgeo/geocaching/StaticMapsProvider.java
index 8292cb4..15193db 100644
--- a/main/src/cgeo/geocaching/StaticMapsProvider.java
+++ b/main/src/cgeo/geocaching/StaticMapsProvider.java
@@ -1,5 +1,6 @@
package cgeo.geocaching;
+import cgeo.geocaching.compatibility.Compatibility;
import cgeo.geocaching.concurrent.BlockingThreadPool;
import cgeo.geocaching.files.LocalStorage;
import cgeo.geocaching.geopoint.GeopointFormatter.Format;
@@ -12,10 +13,10 @@ import ch.boye.httpclientandroidlib.HttpResponse;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
-import android.app.Activity;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Point;
import android.util.DisplayMetrics;
import android.view.Display;
import android.view.WindowManager;
@@ -80,11 +81,6 @@ public class StaticMapsProvider {
}
public static void downloadMaps(cgCache cache) {
- final Display display = ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
- downloadMaps(cache, display);
- }
-
- private static void downloadMaps(cgCache cache, Display display) {
if (cache == null) {
Log.e("downloadMaps - missing input parameter cache");
return;
@@ -92,7 +88,7 @@ public class StaticMapsProvider {
if ((!Settings.isStoreOfflineMaps() && !Settings.isStoreOfflineWpMaps()) || StringUtils.isBlank(cache.getGeocode())) {
return;
}
- int edge = guessMaxDisplaySide(display);
+ int edge = guessMaxDisplaySide();
if (Settings.isStoreOfflineMaps() && cache.getCoords() != null) {
storeCachePreviewMap(cache);
@@ -109,8 +105,8 @@ public class StaticMapsProvider {
}
}
- public static void storeWaypointStaticMap(cgCache cache, Activity activity, cgWaypoint waypoint, boolean waitForResult) {
- int edge = StaticMapsProvider.guessMaxDisplaySide(activity);
+ public static void storeWaypointStaticMap(cgCache cache, cgWaypoint waypoint, boolean waitForResult) {
+ int edge = StaticMapsProvider.guessMaxDisplaySide();
storeWaypointStaticMap(cache.getGeocode(), edge, waypoint, waitForResult);
}
@@ -132,8 +128,8 @@ public class StaticMapsProvider {
downloadMaps(geocode, wpMarkerUrl, WAYPOINT_PREFIX + waypoint.getId() + '_', wpLatlonMap, edge, null, waitForResult);
}
- public static void storeCacheStaticMap(cgCache cache, Activity activity, final boolean waitForResult) {
- int edge = guessMaxDisplaySide(activity);
+ public static void storeCacheStaticMap(cgCache cache, final boolean waitForResult) {
+ int edge = guessMaxDisplaySide();
storeCacheStaticMap(cache, edge, waitForResult);
}
@@ -167,19 +163,16 @@ public class StaticMapsProvider {
downloadMap(cache.getGeocode(), 15, ROADMAP, markerUrl, PREFIX_PREVIEW, "shadow:false|", latlonMap, width, height, null);
}
- private static int guessMaxDisplaySide(Display display) {
- final int maxWidth = display.getWidth() - 25;
- final int maxHeight = display.getHeight() - 25;
+ private static int guessMaxDisplaySide() {
+ Point displaySize = Compatibility.getDisplaySize();
+ final int maxWidth = displaySize.x - 25;
+ final int maxHeight = displaySize.y - 25;
if (maxWidth > maxHeight) {
return maxWidth;
}
return maxHeight;
}
- private static int guessMaxDisplaySide(Activity activity) {
- return guessMaxDisplaySide(((WindowManager) activity.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay());
- }
-
private static void downloadMaps(final String geocode, final String markerUrl, final String prefix, final String latlonMap, final int edge,
final Parameters waypoints, boolean waitForResult) {
if (waitForResult) {
diff --git a/main/src/cgeo/geocaching/cgData.java b/main/src/cgeo/geocaching/cgData.java
index 773f08a..4e79366 100644
--- a/main/src/cgeo/geocaching/cgData.java
+++ b/main/src/cgeo/geocaching/cgData.java
@@ -23,7 +23,6 @@ import android.content.ContextWrapper;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.DatabaseUtils;
-import android.database.DatabaseUtils.InsertHelper;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteDoneException;
@@ -151,9 +150,6 @@ public class cgData {
+ "updated long not null, " // date of save
+ "attribute text "
+ "); ";
- private final static int ATTRIBUTES_GEOCODE = 2;
- private final static int ATTRIBUTES_UPDATED = 3;
- private final static int ATTRIBUTES_ATTRIBUTE = 4;
private static final String dbCreateWaypoints = ""
+ "create table " + dbTableWaypoints + " ("
@@ -191,14 +187,6 @@ public class cgData {
+ "found integer not null default 0, "
+ "friend integer "
+ "); ";
- private final static int LOGS_GEOCODE = 2;
- private final static int LOGS_UPDATED = 3;
- private final static int LOGS_TYPE = 4;
- private final static int LOGS_AUTHOR = 5;
- private final static int LOGS_LOG = 6;
- private final static int LOGS_DATE = 7;
- private final static int LOGS_FOUND = 8;
- private final static int LOGS_FRIEND = 9;
private static final String dbCreateLogCount = ""
+ "create table " + dbTableLogCount + " ("
@@ -1062,7 +1050,7 @@ public class cgData {
database.setTransactionSuccessful();
result = true;
} catch (Exception e) {
- // nothing
+ Log.e("SaveCache", e);
} finally {
database.endTransaction();
}
@@ -1074,21 +1062,17 @@ public class cgData {
String geocode = cache.getGeocode();
database.delete(dbTableAttributes, "geocode = ?", new String[]{geocode});
- if (cache.getAttributes().isNotEmpty()) {
-
- InsertHelper helper = new InsertHelper(database, dbTableAttributes);
- long timeStamp = System.currentTimeMillis();
-
- for (String attribute : cache.getAttributes()) {
- helper.prepareForInsert();
-
- helper.bind(ATTRIBUTES_GEOCODE, geocode);
- helper.bind(ATTRIBUTES_UPDATED, timeStamp);
- helper.bind(ATTRIBUTES_ATTRIBUTE, attribute);
+ if (cache.getAttributes().isEmpty()) {
+ return;
+ }
+ SQLiteStatement statement = getStatementInsertAttribute();
+ long timeStamp = System.currentTimeMillis();
+ for (String attribute : cache.getAttributes()) {
+ statement.bindString(1, geocode);
+ statement.bindLong(2, timeStamp);
+ statement.bindString(3, attribute);
- helper.execute();
- }
- helper.close();
+ statement.executeInsert();
}
}
@@ -1273,34 +1257,29 @@ public class cgData {
return;
}
- InsertHelper helper = new InsertHelper(database, dbTableLogs);
+ SQLiteStatement statement = getStatementInsertLog();
long timeStamp = System.currentTimeMillis();
for (LogEntry log : logs) {
- helper.prepareForInsert();
-
- helper.bind(LOGS_GEOCODE, geocode);
- helper.bind(LOGS_UPDATED, timeStamp);
- helper.bind(LOGS_TYPE, log.type.id);
- helper.bind(LOGS_AUTHOR, log.author);
- helper.bind(LOGS_LOG, log.log);
- helper.bind(LOGS_DATE, log.date);
- helper.bind(LOGS_FOUND, log.found);
- helper.bind(LOGS_FRIEND, log.friend);
-
- long log_id = helper.execute();
-
+ statement.bindString(1, geocode);
+ statement.bindLong(2, timeStamp);
+ statement.bindLong(3, log.type.id);
+ statement.bindString(4, log.author);
+ statement.bindString(5, log.log);
+ statement.bindLong(6, log.date);
+ statement.bindLong(7, log.found);
+ statement.bindLong(8, log.friend ? 1 : 0);
+ long logId = statement.executeInsert();
if (log.hasLogImages()) {
ContentValues values = new ContentValues();
for (cgImage img : log.getLogImages()) {
values.clear();
- values.put("log_id", log_id);
+ values.put("log_id", logId);
values.put("title", img.getTitle());
values.put("url", img.getUrl());
database.insert(dbTableLogImages, null, values);
}
}
}
- helper.close();
}
private void saveLogCountsWithoutTransaction(final cgCache cache) {
@@ -2588,6 +2567,14 @@ public class cgData {
return getStatement("CountAllLists", "SELECT count(_id) FROM " + dbTableCaches + " WHERE reason >= " + StoredList.STANDARD_LIST_ID);
}
+ private SQLiteStatement getStatementInsertLog() {
+ return getStatement("InsertLog", "INSERT INTO " + dbTableLogs + " (geocode, updated, type, author, log, date, found, friend) VALUES (?, ?, ?, ?, ?, ?, ?, ?)");
+ }
+
+ private SQLiteStatement getStatementInsertAttribute() {
+ return getStatement("InsertAttribute", "INSERT INTO " + dbTableAttributes + " (geocode, updated, attribute) VALUES (?, ?, ?)");
+ }
+
public boolean hasLogOffline(final String geocode) {
if (StringUtils.isBlank(geocode)) {
return false;
diff --git a/main/src/cgeo/geocaching/cgeotrackable.java b/main/src/cgeo/geocaching/cgeotrackable.java
index 93b410a..b8d01bb 100644
--- a/main/src/cgeo/geocaching/cgeotrackable.java
+++ b/main/src/cgeo/geocaching/cgeotrackable.java
@@ -5,6 +5,7 @@ import cgeo.geocaching.connector.gc.GCParser;
import cgeo.geocaching.enumerations.LogType;
import cgeo.geocaching.geopoint.Units;
import cgeo.geocaching.network.HtmlImage;
+import cgeo.geocaching.network.Network;
import cgeo.geocaching.ui.CacheDetailsCreator;
import cgeo.geocaching.ui.Formatter;
import cgeo.geocaching.utils.BaseUtils;
@@ -32,7 +33,6 @@ import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;
-import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
@@ -367,7 +367,7 @@ public class cgeotrackable extends AbstractActivity {
cgeocaches.startActivityUserName(this, contextMenuUser);
return true;
case 3:
- startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + URLEncoder.encode(contextMenuUser))));
+ startActivity(new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.geocaching.com/profile/?u=" + Network.encode(contextMenuUser))));
return true;
default:
return false;
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel11Dummy.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel11Emulation.java
index 9c2bb8c..6a23ed5 100644
--- a/main/src/cgeo/geocaching/compatibility/AndroidLevel11Dummy.java
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel11Emulation.java
@@ -3,9 +3,9 @@ package cgeo.geocaching.compatibility;
import android.app.Activity;
/**
- * dummy class which has no functionality in the level 11 API
+ * implement level 11 API using older methods
*/
-public class AndroidLevel11Dummy implements AndroidLevel11Interface {
+public class AndroidLevel11Emulation implements AndroidLevel11Interface {
@Override
public void invalidateOptionsMenu(final Activity activity) {
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java
new file mode 100644
index 0000000..4eac205
--- /dev/null
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel13.java
@@ -0,0 +1,31 @@
+package cgeo.geocaching.compatibility;
+
+import cgeo.geocaching.cgeoapplication;
+
+import android.annotation.TargetApi;
+import android.content.Context;
+import android.graphics.Point;
+import android.view.WindowManager;
+
+@TargetApi(value = 13)
+public class AndroidLevel13 implements AndroidLevel13Interface {
+
+ @Override
+ public int getDisplayWidth() {
+ return getDisplaySize().x;
+ }
+
+ @Override
+ public Point getDisplaySize() {
+ Point dimensions = new Point();
+ ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE))
+ .getDefaultDisplay().getSize(dimensions);
+ return dimensions;
+ }
+
+ @Override
+ public int getDisplayHeight() {
+ return getDisplaySize().y;
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java
new file mode 100644
index 0000000..2257d83
--- /dev/null
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel13Emulation.java
@@ -0,0 +1,33 @@
+package cgeo.geocaching.compatibility;
+
+import cgeo.geocaching.cgeoapplication;
+
+import android.content.Context;
+import android.graphics.Point;
+import android.view.Display;
+import android.view.WindowManager;
+
+@SuppressWarnings("deprecation")
+public class AndroidLevel13Emulation implements AndroidLevel13Interface {
+
+ @Override
+ public int getDisplayWidth() {
+ return getDisplay().getWidth();
+ }
+
+ @Override
+ public int getDisplayHeight() {
+ return getDisplay().getHeight();
+ }
+
+ @Override
+ public Point getDisplaySize() {
+ final Display display = getDisplay();
+ return new Point(display.getWidth(), display.getHeight());
+ }
+
+ private static Display getDisplay() {
+ return ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE))
+ .getDefaultDisplay();
+ }
+}
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel13Interface.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel13Interface.java
new file mode 100644
index 0000000..f4e1975
--- /dev/null
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel13Interface.java
@@ -0,0 +1,11 @@
+package cgeo.geocaching.compatibility;
+
+import android.graphics.Point;
+
+public interface AndroidLevel13Interface {
+ int getDisplayWidth();
+
+ int getDisplayHeight();
+
+ Point getDisplaySize();
+}
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java
index ea5a795..a388adb 100644
--- a/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel8.java
@@ -6,6 +6,7 @@ import android.annotation.TargetApi;
import android.app.Activity;
import android.app.backup.BackupManager;
import android.view.Display;
+import android.view.Surface;
@TargetApi(8)
public class AndroidLevel8 implements AndroidLevel8Interface {
@@ -21,4 +22,23 @@ public class AndroidLevel8 implements AndroidLevel8Interface {
Log.i("Requesting settings backup with settings manager");
BackupManager.dataChanged(name);
}
+
+ @Override
+ public int getRotationOffset(final Activity activity) {
+ try {
+ final int rotation = getRotation(activity);
+ if (rotation == Surface.ROTATION_90) {
+ return 90;
+ } else if (rotation == Surface.ROTATION_180) {
+ return 180;
+ } else if (rotation == Surface.ROTATION_270) {
+ return 270;
+ }
+ } catch (final Exception e) {
+ // This should never happen: IllegalArgumentException, IllegalAccessException or InvocationTargetException
+ Log.e("Cannot call getRotation()", e);
+ }
+
+ return 0;
+ }
}
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Dummy.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Dummy.java
deleted file mode 100644
index d0ab911..0000000
--- a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Dummy.java
+++ /dev/null
@@ -1,16 +0,0 @@
-package cgeo.geocaching.compatibility;
-
-import android.app.Activity;
-
-public class AndroidLevel8Dummy implements AndroidLevel8Interface {
-
- @Override
- public int getRotation(final Activity activity) {
- return 0;
- }
-
- @Override
- public void dataChanged(final String name) {
- // do nothing
- }
-}
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java
new file mode 100644
index 0000000..197993d
--- /dev/null
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Emulation.java
@@ -0,0 +1,30 @@
+package cgeo.geocaching.compatibility;
+
+import android.annotation.TargetApi;
+import android.app.Activity;
+import android.content.res.Configuration;
+import android.view.Display;
+
+@TargetApi(value = 7)
+public class AndroidLevel8Emulation implements AndroidLevel8Interface {
+
+ @Override
+ public int getRotation(final Activity activity) {
+ return 0;
+ }
+
+ @Override
+ public void dataChanged(final String name) {
+ // do nothing
+ }
+
+ @Override
+ public int getRotationOffset(Activity activity) {
+ final Display display = activity.getWindowManager().getDefaultDisplay();
+ final int rotation = display.getOrientation();
+ if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
+ return 90;
+ }
+ return 0;
+ }
+}
diff --git a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java
index b1c4f81..761c23a 100644
--- a/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java
+++ b/main/src/cgeo/geocaching/compatibility/AndroidLevel8Interface.java
@@ -6,4 +6,5 @@ public interface AndroidLevel8Interface {
public int getRotation(final Activity activity);
public void dataChanged(final String name);
+ public int getRotationOffset(final Activity activity);
} \ No newline at end of file
diff --git a/main/src/cgeo/geocaching/compatibility/Compatibility.java b/main/src/cgeo/geocaching/compatibility/Compatibility.java
index 0821655..05a3331 100644
--- a/main/src/cgeo/geocaching/compatibility/Compatibility.java
+++ b/main/src/cgeo/geocaching/compatibility/Compatibility.java
@@ -8,11 +8,9 @@ import org.apache.commons.lang3.reflect.MethodUtils;
import android.app.Activity;
import android.content.Intent;
-import android.content.res.Configuration;
+import android.graphics.Point;
import android.os.Build;
import android.text.InputType;
-import android.view.Display;
-import android.view.Surface;
import android.widget.EditText;
public final class Compatibility {
@@ -23,19 +21,26 @@ public final class Compatibility {
private final static AndroidLevel8Interface level8;
private final static AndroidLevel11Interface level11;
+ private final static AndroidLevel13Interface level13;
static {
if (isLevel8) {
level8 = new AndroidLevel8();
}
else {
- level8 = new AndroidLevel8Dummy();
+ level8 = new AndroidLevel8Emulation();
}
if (sdkVersion >= 11) {
level11 = new AndroidLevel11();
}
else {
- level11 = new AndroidLevel11Dummy();
+ level11 = new AndroidLevel11Emulation();
+ }
+ if (sdkVersion >= 13) {
+ level13 = new AndroidLevel13();
+ }
+ else {
+ level13 = new AndroidLevel13Emulation();
}
}
@@ -47,29 +52,7 @@ public final class Compatibility {
* @return the adjusted direction, in the [0, 360[ range
*/
public static float getDirectionNow(final float directionNowPre, final Activity activity) {
- float offset = 0;
- if (isLevel8) {
- try {
- final int rotation = level8.getRotation(activity);
- if (rotation == Surface.ROTATION_90) {
- offset = 90;
- } else if (rotation == Surface.ROTATION_180) {
- offset = 180;
- } else if (rotation == Surface.ROTATION_270) {
- offset = 270;
- }
- } catch (final Exception e) {
- // This should never happen: IllegalArgumentException, IllegalAccessException or InvocationTargetException
- Log.e("Cannot call getRotation()", e);
- }
- } else {
- final Display display = activity.getWindowManager().getDefaultDisplay();
- final int rotation = display.getOrientation();
- if (rotation == Configuration.ORIENTATION_LANDSCAPE) {
- offset = 90;
- }
- }
- return AngleUtils.normalize(directionNowPre + offset);
+ return AngleUtils.normalize(directionNowPre + level8.getRotationOffset(activity));
}
public static void dataChanged(final String name) {
@@ -113,4 +96,16 @@ public final class Compatibility {
level11.invalidateOptionsMenu(activity);
}
+ public static int getDisplayWidth() {
+ return level13.getDisplayWidth();
+ }
+
+ public static int getDisplayHeight() {
+ return level13.getDisplayHeight();
+ }
+
+ public static Point getDisplaySize() {
+ return level13.getDisplaySize();
+ }
+
}
diff --git a/main/src/cgeo/geocaching/connector/gc/GCParser.java b/main/src/cgeo/geocaching/connector/gc/GCParser.java
index bc929e2..b713611 100644
--- a/main/src/cgeo/geocaching/connector/gc/GCParser.java
+++ b/main/src/cgeo/geocaching/connector/gc/GCParser.java
@@ -48,7 +48,6 @@ import android.text.Spanned;
import android.text.style.ForegroundColorSpan;
import android.text.style.StrikethroughSpan;
-import java.net.URLDecoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
@@ -172,7 +171,7 @@ public abstract class GCParser {
// cache direction - image
if (Settings.getLoadDirImg()) {
- cache.setDirectionImg(URLDecoder.decode(BaseUtils.getMatch(row, GCConstants.PATTERN_SEARCH_DIRECTION, true, 1, cache.getDirectionImg(), true)));
+ cache.setDirectionImg(Network.decode(BaseUtils.getMatch(row, GCConstants.PATTERN_SEARCH_DIRECTION, true, 1, cache.getDirectionImg(), true)));
}
// cache inventory
@@ -383,7 +382,7 @@ public abstract class GCParser {
cache.setName(cacheName);
// owner real name
- cache.setOwnerUserId(URLDecoder.decode(BaseUtils.getMatch(page, GCConstants.PATTERN_OWNER_USERID, true, cache.getOwnerUserId())));
+ cache.setOwnerUserId(Network.decode(BaseUtils.getMatch(page, GCConstants.PATTERN_OWNER_USERID, true, cache.getOwnerUserId())));
cache.setOwn(StringUtils.equalsIgnoreCase(cache.getOwnerUserId(), Settings.getUsername()));
diff --git a/main/src/cgeo/geocaching/network/HtmlImage.java b/main/src/cgeo/geocaching/network/HtmlImage.java
index d47afb9..e25eec5 100644
--- a/main/src/cgeo/geocaching/network/HtmlImage.java
+++ b/main/src/cgeo/geocaching/network/HtmlImage.java
@@ -3,6 +3,7 @@ package cgeo.geocaching.network;
import cgeo.geocaching.R;
import cgeo.geocaching.StoredList;
import cgeo.geocaching.cgeoapplication;
+import cgeo.geocaching.compatibility.Compatibility;
import cgeo.geocaching.connector.ConnectorFactory;
import cgeo.geocaching.files.LocalStorage;
import cgeo.geocaching.utils.ImageHelper;
@@ -12,15 +13,13 @@ import ch.boye.httpclientandroidlib.HttpResponse;
import org.apache.commons.lang3.StringUtils;
-import android.content.Context;
import android.content.res.Resources;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
+import android.graphics.Point;
import android.graphics.drawable.BitmapDrawable;
import android.net.Uri;
import android.text.Html;
-import android.view.Display;
-import android.view.WindowManager;
import java.io.File;
import java.io.FileInputStream;
@@ -66,9 +65,9 @@ public class HtmlImage implements Html.ImageGetter {
bfOptions = new BitmapFactory.Options();
bfOptions.inTempStorage = new byte[16 * 1024];
- final Display display = ((WindowManager) cgeoapplication.getInstance().getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
- this.maxWidth = display.getWidth() - 25;
- this.maxHeight = display.getHeight() - 25;
+ Point displaySize = Compatibility.getDisplaySize();
+ this.maxWidth = displaySize.x - 25;
+ this.maxHeight = displaySize.y - 25;
this.resources = cgeoapplication.getInstance().getResources();
}
diff --git a/main/src/cgeo/geocaching/network/Network.java b/main/src/cgeo/geocaching/network/Network.java
index bd4b6f6..f523429 100644
--- a/main/src/cgeo/geocaching/network/Network.java
+++ b/main/src/cgeo/geocaching/network/Network.java
@@ -35,6 +35,7 @@ import ch.boye.httpclientandroidlib.params.HttpParams;
import ch.boye.httpclientandroidlib.protocol.HttpContext;
import ch.boye.httpclientandroidlib.util.EntityUtils;
+import org.apache.commons.lang3.CharEncoding;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONException;
import org.json.JSONObject;
@@ -45,11 +46,13 @@ import android.webkit.WebView;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
+import java.net.URLDecoder;
import java.net.URLEncoder;
public abstract class Network {
private static final int NB_DOWNLOAD_RETRIES = 4;
+
/** User agent id */
private final static String PC_USER_AGENT = "Mozilla/5.0 (X11; Linux x86_64; rv:9.0.1) Gecko/20100101 Firefox/9.0.1";
/** Native user agent **/
@@ -399,7 +402,27 @@ public abstract class Network {
}
public static String rfc3986URLEncode(String text) {
- return StringUtils.replace(URLEncoder.encode(text).replace("+", "%20"), "%7E", "~");
+ return StringUtils.replace(Network.encode(text).replace("+", "%20"), "%7E", "~");
+ }
+
+ public static String decode(final String text) {
+ try {
+ return URLDecoder.decode(text, CharEncoding.UTF_8);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+ public static String encode(final String text) {
+ try {
+ return URLEncoder.encode(text, CharEncoding.UTF_8);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ return null;
}
}
diff --git a/main/src/cgeo/geocaching/ui/EditorDialog.java b/main/src/cgeo/geocaching/ui/EditorDialog.java
index 50b3e27..6dcf546 100644
--- a/main/src/cgeo/geocaching/ui/EditorDialog.java
+++ b/main/src/cgeo/geocaching/ui/EditorDialog.java
@@ -53,7 +53,7 @@ public class EditorDialog extends Dialog {
@Override
public void show() {
super.show();
- getWindow().setLayout(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
+ getWindow().setLayout(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);
}
}
diff --git a/main/src/cgeo/geocaching/utils/AngleUtils.java b/main/src/cgeo/geocaching/utils/AngleUtils.java
index e2b4a66..6e59a91 100644
--- a/main/src/cgeo/geocaching/utils/AngleUtils.java
+++ b/main/src/cgeo/geocaching/utils/AngleUtils.java
@@ -8,9 +8,11 @@ public class AngleUtils {
/**
* Return the angle to turn of to go from an angle to the other
- *
- * @param from the origin angle in degrees
- * @param to the target angle in degreees
+ *
+ * @param from
+ * the origin angle in degrees
+ * @param to
+ * the target angle in degrees
* @return a value in degrees, in the [-180, 180[ range
*/
public static float difference(final float from, final float to) {
diff --git a/main/src/cgeo/geocaching/utils/ImageHelper.java b/main/src/cgeo/geocaching/utils/ImageHelper.java
index 4c18b06..98cad64 100644
--- a/main/src/cgeo/geocaching/utils/ImageHelper.java
+++ b/main/src/cgeo/geocaching/utils/ImageHelper.java
@@ -1,13 +1,12 @@
package cgeo.geocaching.utils;
import cgeo.geocaching.cgeoapplication;
+import cgeo.geocaching.compatibility.Compatibility;
-import android.content.Context;
import android.graphics.Bitmap;
+import android.graphics.Point;
import android.graphics.Rect;
import android.graphics.drawable.BitmapDrawable;
-import android.view.Display;
-import android.view.WindowManager;
public class ImageHelper {
@@ -24,9 +23,9 @@ public class ImageHelper {
*/
public static BitmapDrawable scaleBitmapToFitDisplay(final Bitmap image) {
final cgeoapplication app = cgeoapplication.getInstance();
- final Display display = ((WindowManager) app.getSystemService(Context.WINDOW_SERVICE)).getDefaultDisplay();
- final int maxWidth = display.getWidth() - 25;
- final int maxHeight = display.getHeight() - 25;
+ Point displaySize = Compatibility.getDisplaySize();
+ final int maxWidth = displaySize.x - 25;
+ final int maxHeight = displaySize.y - 25;
Bitmap result = image;
int width = image.getWidth();
diff --git a/main/src/cgeo/geocaching/utils/TranslationUtils.java b/main/src/cgeo/geocaching/utils/TranslationUtils.java
index a29c5a7..4d318f0 100644
--- a/main/src/cgeo/geocaching/utils/TranslationUtils.java
+++ b/main/src/cgeo/geocaching/utils/TranslationUtils.java
@@ -1,12 +1,11 @@
package cgeo.geocaching.utils;
import cgeo.geocaching.activity.AbstractActivity;
+import cgeo.geocaching.network.Network;
import android.content.Intent;
import android.net.Uri;
-import java.net.URLEncoder;
-
/**
* Utilities used for translating
*/
@@ -30,7 +29,7 @@ public final class TranslationUtils {
* @return URI ready to be parsed
*/
private static String buildTranslationURI(final String toLang, final String text) {
- String content = URLEncoder.encode(text);
+ String content = Network.encode(text);
// the app works better without the "+", the website works better with "+", therefore assume using the app if installed
if (ProcessUtils.isInstalled(TRANSLATION_APP)) {
content = content.replace("+", "%20");