diff --git a/.hgignore b/.hgignore
index 7220e4cb0..3bf9706a8 100644
--- a/.hgignore
+++ b/.hgignore
@@ -2,5 +2,6 @@ syntax:glob
*/bin
*/gen/**
+*/proguard/**
.metadata
MyTracksTest/annotations.log
diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml
index 5f52f7262..3598aec25 100755
--- a/MyTracks/AndroidManifest.xml
+++ b/MyTracks/AndroidManifest.xml
@@ -172,6 +172,7 @@ limitations under the License.
= 5) {
- try {
- Class> clazz = Class.forName(
- "com.google.android.apps.mytracks.util.EclairPlatformAdapter");
- apiPlatformAdapter = (ApiPlatformAdapter) clazz.newInstance();
- } catch (Exception e) {
- Log.i(MyTracksConstants.TAG, "ApiFeatures: Unable to instantiate Eclair"
- + " platform adapter", e);
- }
- }
- if (apiPlatformAdapter == null) {
+ if (getApiLevel() >= 9) {
+ apiPlatformAdapter = new GingerbreadPlatformAdapter();
+ } else if (getApiLevel() >= 5) {
+ apiPlatformAdapter = new EclairPlatformAdapter();
+ } else {
Log.i(MyTracksConstants.TAG,
"ApiFeatures: Using default platform adapter");
// Cupcake adapter is always supported, so it's safe to do static linkage.
apiPlatformAdapter = new CupcakePlatformAdapter();
}
}
-
+
public ApiPlatformAdapter getApiPlatformAdapter() {
return apiPlatformAdapter;
}
@@ -107,7 +101,11 @@ public class ApiFeatures {
return true;
}
-
+
+ public boolean hasStrictMode() {
+ return getApiLevel() >= 9;
+ }
+
// Visible for testing.
protected int getApiLevel() {
return ANDROID_API_LEVEL;
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/ApiPlatformAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/ApiPlatformAdapter.java
index 1e2a5210a..c68832735 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/ApiPlatformAdapter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/ApiPlatformAdapter.java
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.util;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
+import android.content.SharedPreferences;
import android.os.HandlerThread;
/**
@@ -57,4 +58,15 @@ public interface ApiPlatformAdapter {
* @return true whether the handler has been stopped or not.
*/
boolean stopHandlerThread(HandlerThread handlerThread);
+
+ /**
+ * Applies all changes done to the given preferences editor.
+ * Changes may or may not be applied immediately.
+ */
+ void applyPreferenceChanges(SharedPreferences.Editor editor);
+
+ /**
+ * Enables strict mode where supported, only if this is a development build.
+ */
+ void enableStrictMode();
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/CupcakePlatformAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/CupcakePlatformAdapter.java
index 272b47218..354f0a307 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/CupcakePlatformAdapter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/CupcakePlatformAdapter.java
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.util;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
+import android.content.SharedPreferences.Editor;
import android.os.HandlerThread;
/**
@@ -50,4 +51,14 @@ public class CupcakePlatformAdapter implements ApiPlatformAdapter {
// Do nothing, as Cupcake doesn't provide quit().
return false;
}
+
+ @Override
+ public void applyPreferenceChanges(Editor editor) {
+ editor.commit();
+ }
+
+ @Override
+ public void enableStrictMode() {
+ // Not supported
+ }
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/EclairPlatformAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/EclairPlatformAdapter.java
index 9c32946d3..91c1ea1d3 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/EclairPlatformAdapter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/EclairPlatformAdapter.java
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.util;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.Service;
+import android.content.SharedPreferences.Editor;
import android.os.HandlerThread;
/**
@@ -45,4 +46,14 @@ public class EclairPlatformAdapter implements ApiPlatformAdapter {
public boolean stopHandlerThread(HandlerThread handlerThread) {
return handlerThread.quit();
}
+
+ @Override
+ public void applyPreferenceChanges(Editor editor) {
+ editor.commit();
+ }
+
+ @Override
+ public void enableStrictMode() {
+ // Not supported
+ }
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/GingerbreadPlatformAdapter.java b/MyTracks/src/com/google/android/apps/mytracks/util/GingerbreadPlatformAdapter.java
new file mode 100644
index 000000000..caa73a170
--- /dev/null
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/GingerbreadPlatformAdapter.java
@@ -0,0 +1,36 @@
+package com.google.android.apps.mytracks.util;
+
+import com.google.android.apps.mytracks.MyTracksConstants;
+
+import android.content.SharedPreferences.Editor;
+import android.os.StrictMode;
+import android.util.Log;
+
+/**
+ * The Gingerbread (API level 9) specific implememntation of the
+ * {@link ApiPlatformAdapter}.
+ *
+ * @author Rodrigo Damazio
+ */
+public class GingerbreadPlatformAdapter extends EclairPlatformAdapter {
+ @Override
+ public void applyPreferenceChanges(Editor editor) {
+ // Apply asynchronously
+ editor.apply();
+ }
+
+ @Override
+ public void enableStrictMode() {
+ Log.d(MyTracksConstants.TAG, "Enabling strict mode");
+ StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
+ .detectDiskWrites()
+ .detectNetwork()
+ .penaltyLog()
+ .build());
+ StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
+ .detectAll()
+ .penaltyLog()
+ .penaltyDeath()
+ .build());
+ }
+}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/MyTracksUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/MyTracksUtils.java
index 71caa003c..52f5dee72 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/MyTracksUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/MyTracksUtils.java
@@ -21,7 +21,12 @@ import com.google.android.apps.mytracks.stats.TripStatistics;
import com.google.android.maps.GeoPoint;
+import android.content.Context;
+import android.content.pm.PackageManager;
+import android.content.pm.PackageManager.NameNotFoundException;
+import android.content.pm.Signature;
import android.location.Location;
+import android.os.StrictMode;
import android.util.Log;
import java.util.ArrayList;
@@ -34,6 +39,7 @@ import java.util.Stack;
* @author Leif Hendrik Wilden
*/
public class MyTracksUtils {
+ private static final int RELEASE_SIGNATURE_HASHCODE = -1855564782;
/**
* Computes the distance on the two sphere between the point c0 and the line
@@ -246,6 +252,25 @@ public class MyTracksUtils {
(int) (location.getLongitude() * 1E6));
}
+ /**
+ * Returns whether or not this is a release build.
+ */
+ public static boolean isRelease(Context context) {
+ try {
+ Signature [] sigs = context.getPackageManager().getPackageInfo(
+ context.getPackageName(), PackageManager.GET_SIGNATURES).signatures;
+ for (Signature sig : sigs) {
+ if (sig.hashCode() == RELEASE_SIGNATURE_HASHCODE) {
+ return true;
+ }
+ }
+ } catch (NameNotFoundException e) {
+ Log.e(MyTracksConstants.TAG, "Unable to get signatures", e);
+ }
+
+ return false;
+ }
+
/**
* This is a utility class w/ only static memebers.
*/
diff --git a/MyTracksLib/default.properties b/MyTracksLib/default.properties
index 948be06ed..1694c805b 100644
--- a/MyTracksLib/default.properties
+++ b/MyTracksLib/default.properties
@@ -8,5 +8,5 @@
# project structure.
# Project target.
-target=android-8
+target=android-9
android.library=true
diff --git a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java
index 5d134effb..4e90d7227 100644
--- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java
+++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java
@@ -861,18 +861,22 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
String select = TracksColumns._ID + "=" + id;
return findTrackBy(select);
}
-
+
@Override
public List