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 getAllTracks() { Cursor cursor = getTracksCursor(null); - if (cursor == null || !cursor.moveToFirst()) { - return new ArrayList(); - } + ArrayList tracks = new ArrayList(); + if (cursor != null) { + tracks.ensureCapacity(cursor.getCount()); - List tracks = new ArrayList(cursor.getCount()); - do { - tracks.add(createTrack(cursor)); - } while(cursor.moveToNext()); + if (cursor.moveToFirst()) { + do { + tracks.add(createTrack(cursor)); + } while(cursor.moveToNext()); + } + + cursor.close(); + } return tracks; } diff --git a/MyTracksTest/default.properties b/MyTracksTest/default.properties index c4fb0851b..85cbfc4dd 100644 --- a/MyTracksTest/default.properties +++ b/MyTracksTest/default.properties @@ -10,4 +10,4 @@ # Indicates whether an apk should be generated for each density. split.density=false # Project target. -target=Google Inc.:Google APIs:8 +target=Google Inc.:Google APIs:9 diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelperTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelperTest.java index 0cdd7c626..e2c8b3b48 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelperTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/io/backup/PreferenceBackupHelperTest.java @@ -38,7 +38,7 @@ public class PreferenceBackupHelperTest extends TestCase { */ private class MockPreferenceEditor implements SharedPreferences.Editor { private Map newPreferences = new HashMap(preferenceValues); - + @Override public Editor clear() { newPreferences.clear(); @@ -51,6 +51,11 @@ public class PreferenceBackupHelperTest extends TestCase { return true; } + @Override + public void apply() { + commit(); + } + @Override public Editor putBoolean(String key, boolean value) { return put(key, value); diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java index 9f3e0e186..db0236aa2 100644 --- a/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java +++ b/MyTracksTest/src/com/google/android/apps/mytracks/services/TrackRecordingServiceTest.java @@ -502,7 +502,7 @@ public class TrackRecordingServiceTest public void testDeleteAllTracks_trackInProgress() throws Exception { createDummyTrack(123, -1, true); assertEquals(1, providerUtils.getAllTracks().size()); - + ITrackRecordingService service = bindAndGetService(createStartIntent()); assertTrue(service.isRecording()); diff --git a/SignalStrengthSampler/AndroidManifest.xml b/SignalStrengthSampler/AndroidManifest.xml index 03d216a34..9ede9ed88 100644 --- a/SignalStrengthSampler/AndroidManifest.xml +++ b/SignalStrengthSampler/AndroidManifest.xml @@ -54,7 +54,8 @@ limitations under the License. - diff --git a/SignalStrengthSampler/default.properties b/SignalStrengthSampler/default.properties index 45aae789b..903536e41 100644 --- a/SignalStrengthSampler/default.properties +++ b/SignalStrengthSampler/default.properties @@ -8,5 +8,6 @@ # project structure. # Project target. -target=Google Inc.:Google APIs:8 +target=Google Inc.:Google APIs:9 +proguard.config=proguard.cfg android.library.reference.1=../MyTracksLib/ diff --git a/SignalStrengthSamplerTest/default.properties b/SignalStrengthSamplerTest/default.properties index 420db56e3..77f7ad75b 100644 --- a/SignalStrengthSamplerTest/default.properties +++ b/SignalStrengthSamplerTest/default.properties @@ -8,4 +8,4 @@ # project structure. # Project target. -target=Google Inc.:Google APIs:8 +target=Google Inc.:Google APIs:9