Merge with 3af20c63ed16c56b6e5e3d854272ec1fb8074570

This commit is contained in:
Bartlomiej Niechwiej
2010-12-04 23:50:16 -08:00
5 changed files with 57 additions and 16 deletions
+3 -1
View File
@@ -109,10 +109,12 @@
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Features required --> <!-- Features required -->
<!--
<uses-feature android:name="android.hardware.location" android:required="true"/> <uses-feature android:name="android.hardware.location" android:required="true"/>
<uses-feature android:name="android.hardware.location.gps" android:required="true"/> <uses-feature android:name="android.hardware.location.gps" android:required="true"/>
<uses-feature android:name="android.hardware.touchscreen" android:required="true"/> <uses-feature android:name="android.hardware.touchscreen" android:required="true"/>
-->
<!-- Features optional --> <!-- Features optional -->
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/> <uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.location.network" android:required="false"/> <uses-feature android:name="android.hardware.location.network" android:required="false"/>
+2 -2
View File
@@ -26,8 +26,8 @@ limitations under the License.
android:enabled="true" android:enabled="true"
android:focusable="true" android:focusable="true"
android:focusableInTouchMode="true" android:focusableInTouchMode="true"
android:apiKey="0TXoRmxTinrZKQ9JSazj-9A34XX6_lXsRvTpXWA"/> android:apiKey="0y_T_wDlbgovCQMZX7ZClDeveHLLhczEyiUblvw"/>
<!-- corresponding certificate md5: 81:DF:A2:63:53:C7:6B:1E:6C:24:62:D4:91:1C:36:3A --> <!-- corresponding certificate md5: 88:3B:2F:19:EC:0A:9D:E9:33:89:30:BE:94:D1:79:91 -->
<LinearLayout android:id="@+id/messagepane" <LinearLayout android:id="@+id/messagepane"
android:orientation="horizontal" android:orientation="horizontal"
android:layout_width="fill_parent" android:layout_width="fill_parent"
@@ -15,8 +15,6 @@
*/ */
package com.google.android.apps.mytracks.content; package com.google.android.apps.mytracks.content;
import java.util.HashMap;
import com.google.android.apps.mytracks.MyTracksConstants; import com.google.android.apps.mytracks.MyTracksConstants;
import android.content.ContentProvider; import android.content.ContentProvider;
@@ -148,7 +146,7 @@ public class MyTracksProvider extends ContentProvider {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to " Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", adding sensor column."); + newVersion + ", adding sensor column.");
db.execSQL("ALTER TABLE " + TRACKPOINTS_TABLE db.execSQL("ALTER TABLE " + TRACKPOINTS_TABLE
+ "ADD " + TrackPointsColumns.SENSOR + " BLOB);"); + " ADD " + TrackPointsColumns.SENSOR + " BLOB");
} }
} }
} }
@@ -342,8 +342,14 @@ public class GpxImporter extends DefaultHandler {
// create new location and set attributes // create new location and set attributes
Location loc = new Location(LocationManager.GPS_PROVIDER); Location loc = new Location(LocationManager.GPS_PROVIDER);
loc.setLatitude(Double.parseDouble(latitude)); try {
loc.setLongitude(Double.parseDouble(longitude)); loc.setLatitude(Double.parseDouble(latitude));
loc.setLongitude(Double.parseDouble(longitude));
} catch (NumberFormatException e) {
String msg = createErrorMessage(
"Unable to parse lat/long: " + latitude + "/" + longitude);
throw new SAXException(msg, e);
}
return loc; return loc;
} }
@@ -472,9 +478,14 @@ public class GpxImporter extends DefaultHandler {
} }
} }
private void onAltitudeElementEnd() { private void onAltitudeElementEnd() throws SAXException {
if (location != null) { if (location != null) {
location.setAltitude(Double.parseDouble(content)); try {
location.setAltitude(Double.parseDouble(content));
} catch (NumberFormatException e) {
String msg = createErrorMessage("Unable to parse altitude: " + content);
throw new SAXException(msg, e);
}
} }
} }
@@ -19,9 +19,9 @@ import static com.google.android.testing.mocking.AndroidMock.eq;
import static com.google.android.testing.mocking.AndroidMock.expect; import static com.google.android.testing.mocking.AndroidMock.expect;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils.Factory;
import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.TracksColumns; import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils.Factory;
import com.google.android.apps.mytracks.testing.TestingProviderUtilsFactory; import com.google.android.apps.mytracks.testing.TestingProviderUtilsFactory;
import com.google.android.testing.mocking.AndroidMock; import com.google.android.testing.mocking.AndroidMock;
import com.google.android.testing.mocking.UsesMocks; import com.google.android.testing.mocking.UsesMocks;
@@ -77,7 +77,7 @@ public class GpxImporterTest extends AndroidTestCase {
DATE_FORMAT2.setTimeZone(utc); DATE_FORMAT2.setTimeZone(utc);
} }
// TODO use real files from different sources with more track points // TODO: use real files from different sources with more track points.
private static final String VALID_TEST_GPX = "<gpx><trk><name><![CDATA[" private static final String VALID_TEST_GPX = "<gpx><trk><name><![CDATA["
+ TRACK_NAME + "]]></name><desc><![CDATA[" + TRACK_DESC + TRACK_NAME + "]]></name><desc><![CDATA[" + TRACK_DESC
+ "]]></desc><trkseg>" + "<trkpt lat=\"" + TRACK_LAT_1 + "\" lon=\"" + "]]></desc><trkseg>" + "<trkpt lat=\"" + TRACK_LAT_1 + "\" lon=\""
@@ -93,6 +93,12 @@ public class GpxImporterTest extends AndroidTestCase {
.replaceAll(TRACK_LAT_1, "1000.0"); .replaceAll(TRACK_LAT_1, "1000.0");
private static final String INVALID_TIME_TEST_GPX = VALID_TEST_GPX private static final String INVALID_TIME_TEST_GPX = VALID_TEST_GPX
.replaceAll(TRACK_TIME_1, "invalid"); .replaceAll(TRACK_TIME_1, "invalid");
private static final String INVALID_ALTITUDE_TEST_GPX = VALID_TEST_GPX
.replaceAll(TRACK_ELE_1, "invalid");
private static final String INVALID_LATITUDE_TEST_GPX = VALID_TEST_GPX
.replaceAll(TRACK_LAT_1, "invalid");
private static final String INVALID_LONGITUDE_TEST_GPX = VALID_TEST_GPX
.replaceAll(TRACK_LON_1, "invalid");
private static final long TRACK_ID = 1; private static final long TRACK_ID = 1;
private static final long TRACK_POINT_ID_1 = 1; private static final long TRACK_POINT_ID_1 = 1;
@@ -122,7 +128,7 @@ public class GpxImporterTest extends AndroidTestCase {
} }
/** /**
* Test import success * Test import success.
*/ */
public void testImportSuccess() throws Exception { public void testImportSuccess() throws Exception {
Capture<Track> trackParam = new Capture<Track>(); Capture<Track> trackParam = new Capture<Track>();
@@ -171,7 +177,7 @@ public class GpxImporterTest extends AndroidTestCase {
} }
/** /**
* Test with invalid location - track should be deleted * Test with invalid location - track should be deleted.
*/ */
public void testImportLocationFailure() throws ParserConfigurationException, public void testImportLocationFailure() throws ParserConfigurationException,
SAXException, IOException { SAXException, IOException {
@@ -179,7 +185,7 @@ public class GpxImporterTest extends AndroidTestCase {
} }
/** /**
* Test with invalid time - track should be deleted * Test with invalid time - track should be deleted.
*/ */
public void testImportTimeFailure() throws ParserConfigurationException, public void testImportTimeFailure() throws ParserConfigurationException,
SAXException, IOException { SAXException, IOException {
@@ -187,13 +193,37 @@ public class GpxImporterTest extends AndroidTestCase {
} }
/** /**
* Test with invalid xml - track should be deleted * Test with invalid xml - track should be deleted.
*/ */
public void testImportXMLFailure() throws ParserConfigurationException, public void testImportXMLFailure() throws ParserConfigurationException,
SAXException, IOException { SAXException, IOException {
testInvalidXML(INVALID_XML_TEST_GPX); testInvalidXML(INVALID_XML_TEST_GPX);
} }
/**
* Test with invalid altitude - track should be deleted.
*/
public void testImportInvalidAltitude() throws ParserConfigurationException,
SAXException, IOException {
testInvalidXML(INVALID_ALTITUDE_TEST_GPX);
}
/**
* Test with invalid latitude - track should be deleted.
*/
public void testImportInvalidLatitude() throws ParserConfigurationException,
SAXException, IOException {
testInvalidXML(INVALID_LATITUDE_TEST_GPX);
}
/**
* Test with invalid longitude - track should be deleted.
*/
public void testImportInvalidLongitude() throws ParserConfigurationException,
SAXException, IOException {
testInvalidXML(INVALID_LONGITUDE_TEST_GPX);
}
private void testInvalidXML(String xml) throws ParserConfigurationException, private void testInvalidXML(String xml) throws ParserConfigurationException,
IOException { IOException {
expect(providerUtils.insertTrack((Track) AndroidMock.anyObject())) expect(providerUtils.insertTrack((Track) AndroidMock.anyObject()))