Merge heads

This commit is contained in:
youtaol
2012-06-11 10:34:48 +08:00
parent 4bf87acb80
commit 56475a943f
55 changed files with 232 additions and 196 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ limitations under the License.
-->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto"
android:versionCode="42"
android:versionCode="43"
android:versionName="2.0"
package="com.google.android.maps.mytracks" >
Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 61 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 54 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 65 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 61 KiB

After

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 64 KiB

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 52 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 41 KiB

After

Width:  |  Height:  |  Size: 39 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 53 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 KiB

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 53 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 51 KiB

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 50 KiB

After

Width:  |  Height:  |  Size: 52 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 39 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 59 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 62 KiB

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 63 KiB

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 58 KiB

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

@@ -190,11 +190,13 @@ limitations under the License.
<item>@string/settings_map_track_color_mode_dynamic_value</item>
</string-array>
<string-array name="track_name_options">
<item>@string/settings_recording_track_name_location_option</item>
<item>@string/settings_recording_track_name_date_local_option</item>
<item>@string/settings_recording_track_name_date_iso_8601_option</item>
<item>@string/settings_recording_track_name_number_option</item>
</string-array>
<string-array name="track_name_values">
<item>@string/settings_recording_track_name_location_value</item>
<item>@string/settings_recording_track_name_date_local_value</item>
<item>@string/settings_recording_track_name_date_iso_8601_value</item>
<item>@string/settings_recording_track_name_number_value</item>
+1
View File
@@ -35,6 +35,7 @@ limitations under the License.
<string name="settings_map_track_color_mode_single_value">SINGLE</string>
<string name="settings_recording_track_name_date_iso_8601_value">DATE_ISO_8601</string>
<string name="settings_recording_track_name_date_local_value">DATE_LOCAL</string>
<string name="settings_recording_track_name_location_value">LOCATION</string>
<string name="settings_recording_track_name_number_value">NUMBER</string>
<string name="track_action_end">com.google.android.apps.mytracks.END_CURRENT_TRACK</string>
<string name="track_action_save">android.intent.action.SAVE</string>
+12 -49
View File
@@ -363,52 +363,7 @@ limitations under the License.
completion suggestion for wind surfing.">
wind surfing
</string>
<!-- Android Market -->
<string name="android_market_description_text"
translation_description="For the Android Market (not used in the app), the description text.
Character limit: 4000.">
Use My Tracks while you walk, run, bike, or do anything else outdoors. It uses the GPS sensor
in your phone to record your path and gather useful statistics such as time, speed, distance,
and elevation. You can review all of this data live or save it for use later. While recording,
you can insert markers, have split markers inserted automatically, and hear periodic voice
announcements of your progress.\n
\n
My Tracks can record data from external sensors:\n
- Zephyr HxM Bluetooth heart rate monitor\n
- Polar WearLink Bluetooth heart rate monitor\n
- ANT+ heart rate monitors (*)\n
- Ant+ speed distance monitors (*)\n
\n
* Requires an ANT+ compatible phone\n
\n
My Tracks can share your track data:\n
- Via Google+, Facebook, or Twitter\n
- Using Google Maps, Google Fusion Tables, or Google Docs\n
- As a GPX, KML, CSV, or TCX file\n
\n
Other features:\n
- Record in metric (km, m) or imperial (mi, ft) units\n
- Display your movement in terms of speed or pace\n
\n
My Tracks is an open source project. If you like to contribute, please visit:\n
\n
http://mytracks.googlecode.com\n
</string>
<string name="android_market_promo_text"
translation_description="For the Android Market (not used in the app), the promotion text.
Character limit: 80.">
Record and share your GPS tracks with My Tracks.
</string>
<string name="android_market_recent_changes_text"
translation_description="For the Android Market (not used in the app), the recent changes text.
Character limit: 500.">
Please see the English version for more information.
</string>
<!-- Description -->
<string name="description_activity_type"
translation_description="Activity type description.
@@ -1670,6 +1625,13 @@ limitations under the License.
Character limit: ~21 (1 line)">
Date (local)
</string>
<string name="settings_recording_track_name_location_option"
translation_description="In the 'Recording' settings, the option in the 'Track name' dropdown
list to use the track location as the track name.
Character limit: ~21 (1 line)">
Location
</string>
<string name="settings_recording_track_name_number_option"
translation_description="In the 'Recording' settings, the option in the 'Track name' dropdown
list to use a number as the track name.
@@ -1735,14 +1697,15 @@ limitations under the License.
an ANT+ heart rate monitor. Note that ANT+ is a radio standard.
Character limit: ~26 (1 line)">
Reset heart rate monitor
Reset heart rate
</string>
<string name="settings_sensor_ant_reset_speed_distance_monitor"
translation_description="In the 'Sensor' settings, under the 'ANT+ options', the option to reset
an ANT+ speed distance monitor. Note that ANT+ is a radio standard.
an ANT+ stride based speed distance monitor, also known as foot pod. Note that ANT+ is a radio
standard.
Character limit: ~26 (1 line)">
Reset speed distance monitor
Reset foot pod
</string>
<string name="settings_sensor_bluetooth_options"
translation_description="In the 'Sensor' settings, the section header to configure the Bluetooth
+1 -1
View File
@@ -17,7 +17,7 @@ limitations under the License.
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"
android:title="@string/settings_recording" >
<ListPreference
android:defaultValue="@string/settings_recording_track_name_date_local_value"
android:defaultValue="@string/settings_recording_track_name_location_value"
android:entries="@array/track_name_options"
android:entryValues="@array/track_name_values"
android:key="@string/track_name_key"
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.util.TrackNameUtils;
import com.google.android.maps.mytracks.R;
import android.os.Bundle;
@@ -95,6 +96,11 @@ public class TrackEditActivity extends AbstractMyTracksActivity {
Button cancel = (Button) findViewById(R.id.track_edit_cancel);
if (getIntent().getBooleanExtra(EXTRA_NEW_TRACK, false)) {
String trackName = TrackNameUtils.getTrackName(
this, -1L, -1L, myTracksProviderUtils.getLastLocation());
if (trackName != null) {
name.setText(trackName);
}
setTitle(R.string.track_edit_new_track_title);
cancel.setVisibility(View.GONE);
} else {
@@ -1,73 +0,0 @@
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.android.apps.mytracks.services;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.maps.mytracks.R;
import com.google.common.annotations.VisibleForTesting;
import android.content.Context;
import java.text.SimpleDateFormat;
/**
* Creates a default track name based on the track name setting.
*
* @author Matthew Simmons
*/
public class DefaultTrackNameFactory {
@VisibleForTesting
static final String ISO_8601_FORMAT = "yyyy-MM-dd HH:mm";
private final Context context;
public DefaultTrackNameFactory(Context context) {
this.context = context;
}
/**
* Gets the default track name.
*
* @param trackId the track id
* @param startTime the track start time
*/
public String getDefaultTrackName(long trackId, long startTime) {
String trackNameSetting = getTrackNameSetting();
if (trackNameSetting.equals(
context.getString(R.string.settings_recording_track_name_date_local_value))) {
return StringUtils.formatDateTime(context, startTime);
} else if (trackNameSetting.equals(
context.getString(R.string.settings_recording_track_name_date_iso_8601_value))) {
SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_8601_FORMAT);
return dateFormat.format(startTime);
} else {
// trackNameSetting equals
// R.string.settings_recording_track_name_number_value
return context.getString(R.string.track_name_format, trackId);
}
}
/**
* Gets the track name setting.
*/
@VisibleForTesting
String getTrackNameSetting() {
return PreferencesUtils.getString(context, R.string.track_name_key,
context.getString(R.string.settings_recording_track_name_date_local_value));
}
}
@@ -42,6 +42,7 @@ import com.google.android.apps.mytracks.stats.TripStatisticsBuilder;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.LocationUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.apps.mytracks.util.TrackNameUtils;
import com.google.android.maps.mytracks.R;
import com.google.common.annotations.VisibleForTesting;
@@ -584,8 +585,7 @@ public class TrackRecordingService extends Service {
Uri trackUri = providerUtils.insertTrack(track);
recordingTrackId = Long.parseLong(trackUri.getLastPathSegment());
track.setId(recordingTrackId);
track.setName(new DefaultTrackNameFactory(this).getDefaultTrackName(
recordingTrackId, startTime));
track.setName(TrackNameUtils.getTrackName(this, recordingTrackId, startTime, null));
track.setCategory(PreferencesUtils.getString(
this, R.string.default_activity_key, PreferencesUtils.DEFAULT_ACTIVITY_DEFAULT));
isRecording = true;
@@ -0,0 +1,126 @@
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.android.apps.mytracks.util;
import com.google.android.maps.mytracks.R;
import com.google.common.annotations.VisibleForTesting;
import android.content.Context;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.List;
/**
* Utilities for track name.
*
* @author Matthew Simmons
*/
public class TrackNameUtils {
@VisibleForTesting
static final String ISO_8601_FORMAT = "yyyy-MM-dd HH:mm";
private TrackNameUtils() {
}
/**
* Gets the track name.
*
* @param context the context
* @param trackId the track id
* @param startTime the track start time
* @param location the track location
*/
public static String getTrackName(
Context context, long trackId, long startTime, Location location) {
String trackName = PreferencesUtils.getString(context, R.string.track_name_key,
context.getString(R.string.settings_recording_track_name_location_value));
if (trackName.equals(
context.getString(R.string.settings_recording_track_name_date_local_value))) {
if (startTime == -1L) {
return null;
}
return StringUtils.formatDateTime(context, startTime);
} else if (trackName.equals(
context.getString(R.string.settings_recording_track_name_date_iso_8601_value))) {
if (startTime == -1L) {
return null;
}
SimpleDateFormat dateFormat = new SimpleDateFormat(ISO_8601_FORMAT);
return dateFormat.format(startTime);
} else if (trackName.equals(
context.getString(R.string.settings_recording_track_name_number_value))) {
if (trackId == -1L) {
return null;
}
return context.getString(R.string.track_name_format, trackId);
} else {
// trackName equals settings_recording_track_name_location_value or any
// value
if (location != null) {
return getReverseGeoCoding(context, location);
} else {
// assume startTime != -1L when location == null
return StringUtils.formatDateTime(context, startTime);
}
}
}
/**
* Gets the reverse geo coding string for a location.
*
* @param context the context
* @param location the location
*/
private static String getReverseGeoCoding(Context context, Location location) {
if (location == null || !Geocoder.isPresent()) {
return null;
}
Geocoder geocoder = new Geocoder(context);
try {
List<Address> addresses = geocoder.getFromLocation(
location.getLatitude(), location.getLongitude(), 1);
if (addresses.size() > 0) {
Address address = addresses.get(0);
int lines = address.getMaxAddressLineIndex();
if (lines > 0) {
return address.getAddressLine(0);
}
String featureName = address.getFeatureName();
if (featureName != null) {
return featureName;
}
String thoroughfare = address.getThoroughfare();
if (thoroughfare != null) {
return thoroughfare;
}
String locality = address.getLocality();
if (locality != null) {
return locality;
}
}
} catch (IOException e) {
// Can safely ignore
}
return null;
}
}
Binary file not shown.

Before

Width:  |  Height:  |  Size: 72 KiB

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 67 KiB

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 78 KiB

After

Width:  |  Height:  |  Size: 42 KiB

@@ -76,6 +76,13 @@ public interface MyTracksProviderUtils {
*/
boolean updateWaypoint(Waypoint waypoint);
/**
* Finds the first recorded location from the location provider.
*
* @return the first location, or null if no locations available
*/
Location getFirstLocation();
/**
* Finds the last recorded location from the location provider.
*
@@ -653,6 +653,11 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
return null;
}
@Override
public Location getFirstLocation() {
return findLocationBy("_id=(select min(_id) from trackpoints)");
}
@Override
public Location getLastLocation() {
return findLocationBy("_id=(select max(_id) from trackpoints)");
@@ -1,70 +0,0 @@
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.android.apps.mytracks.services;
import com.google.android.apps.mytracks.util.StringUtils;
import com.google.android.maps.mytracks.R;
import android.test.AndroidTestCase;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Tests {@link DefaultTrackNameFactory}
*
* @author Matthew Simmons
*/
public class DefaultTrackNameFactoryTest extends AndroidTestCase {
private static final long TRACK_ID = 1L;
private static final long START_TIME = 1288213406000L;
public void testDefaultTrackName_date_local() {
DefaultTrackNameFactory defaultTrackNameFactory = new DefaultTrackNameFactory(getContext()) {
@Override
String getTrackNameSetting() {
return getContext().getString(R.string.settings_recording_track_name_date_local_value);
}
};
assertEquals(StringUtils.formatDateTime(getContext(), START_TIME),
defaultTrackNameFactory.getDefaultTrackName(TRACK_ID, START_TIME));
}
public void testDefaultTrackName_date_iso_8601() {
DefaultTrackNameFactory defaultTrackNameFactory = new DefaultTrackNameFactory(getContext()) {
@Override
String getTrackNameSetting() {
return getContext().getString(R.string.settings_recording_track_name_date_iso_8601_value);
}
};
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(
DefaultTrackNameFactory.ISO_8601_FORMAT);
assertEquals(simpleDateFormat.format(new Date(START_TIME)),
defaultTrackNameFactory.getDefaultTrackName(TRACK_ID, START_TIME));
}
public void testDefaultTrackName_number() {
DefaultTrackNameFactory defaultTrackNameFactory = new DefaultTrackNameFactory(getContext()) {
@Override
String getTrackNameSetting() {
return getContext().getString(R.string.settings_recording_track_name_number_value);
}
};
assertEquals(
"Track " + TRACK_ID, defaultTrackNameFactory.getDefaultTrackName(TRACK_ID, START_TIME));
}
}
@@ -0,0 +1,69 @@
/*
* Copyright 2010 Google Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License"); you may not
* use this file except in compliance with the License. You may obtain a copy of
* the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
* License for the specific language governing permissions and limitations under
* the License.
*/
package com.google.android.apps.mytracks.util;
import com.google.android.maps.mytracks.R;
import android.test.AndroidTestCase;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Tests {@link TrackNameUtils}.
*
* @author Matthew Simmons
*/
public class TrackNameUtilsTest extends AndroidTestCase {
private static final long TRACK_ID = 1L;
private static final long START_TIME = 1288213406000L;
/**
* Tests when the track_name_key is
* settings_recording_track_name_date_local_value.
*/
public void testTrackName_date_local() {
PreferencesUtils.setString(getContext(), R.string.track_name_key,
getContext().getString(R.string.settings_recording_track_name_date_local_value));
assertEquals(StringUtils.formatDateTime(getContext(), START_TIME),
TrackNameUtils.getTrackName(getContext(), TRACK_ID, START_TIME, null));
}
/**
* Tests when the track_name_key is
* settings_recording_track_name_date_iso_8601_value.
*/
public void testTrackName_date_iso_8601() {
PreferencesUtils.setString(getContext(), R.string.track_name_key,
getContext().getString(R.string.settings_recording_track_name_date_iso_8601_value));
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(TrackNameUtils.ISO_8601_FORMAT);
assertEquals(simpleDateFormat.format(new Date(START_TIME)),
TrackNameUtils.getTrackName(getContext(), TRACK_ID, START_TIME, null));
}
/**
* Tests when the track_name_key is
* settings_recording_track_name_number_value.
*/
public void testTrackName_number() {
PreferencesUtils.setString(getContext(), R.string.track_name_key,
getContext().getString(R.string.settings_recording_track_name_number_value));
assertEquals(
"Track " + TRACK_ID, TrackNameUtils.getTrackName(getContext(), TRACK_ID, START_TIME, null));
}
}