diff --git a/MyTracks/res/layout/list_item.xml b/MyTracks/res/layout/list_item.xml
index b30288fd3..44037c377 100644
--- a/MyTracks/res/layout/list_item.xml
+++ b/MyTracks/res/layout/list_item.xml
@@ -68,12 +68,12 @@ limitations under the License.
+ android:scaleType="fitCenter" />
+ android:scaleType="fitCenter" />
diff --git a/MyTracks/res/layout/share_track.xml b/MyTracks/res/layout/share_track.xml
index 010c380df..b8c492324 100644
--- a/MyTracks/res/layout/share_track.xml
+++ b/MyTracks/res/layout/share_track.xml
@@ -43,9 +43,5 @@ limitations under the License.
android:singleLine="false"
android:visibility="gone" >
-
\ No newline at end of file
diff --git a/MyTracks/res/values/arrays_do_not_translate.xml b/MyTracks/res/values/arrays_do_not_translate.xml
index ecce9d6bc..25b3e77bb 100644
--- a/MyTracks/res/values/arrays_do_not_translate.xml
+++ b/MyTracks/res/values/arrays_do_not_translate.xml
@@ -92,6 +92,14 @@ limitations under the License.
- 15
- -1
+
+ - @string/settings_chart_by_distance
+ - @string/settings_chart_by_time
+
+
+ - @string/chart_x_axis_distance
+ - @string/chart_x_axis_time
+
- 0
- 1
@@ -176,6 +184,18 @@ limitations under the License.
- @string/sensor_type_value_zephyr
- @string/sensor_type_value_none
+
+ - @string/description_speed_imperial
+ - @string/description_pace_imperial
+
+
+ - @string/description_speed_metric
+ - @string/description_pace_metric
+
+
+ - @string/stats_rate_speed
+ - @string/stats_rate_pace
+
- @string/settings_stats_units_metric
- @string/settings_stats_units_imperial
diff --git a/MyTracks/res/values/do_not_translate.xml b/MyTracks/res/values/do_not_translate.xml
index 669867cde..fbbb1f14e 100644
--- a/MyTracks/res/values/do_not_translate.xml
+++ b/MyTracks/res/values/do_not_translate.xml
@@ -16,6 +16,8 @@ limitations under the License.
-->
+ DISTANCE
+ TIME
위치정보서비스 및 위치기반서비스 이용약관\n
\n
다음은 구글코리아 유한회사(이하 “Google”)가 Google의 제품에 대하여 제공하고 있는 위치기반서비스에 적용되는 이용조건입니다. 아래 이용조건은 이동통신사업자의 가입신청서에 포함된 위치정보 수집동의 및 모바일 단말기 이용조건과 함께 적용됩니다.\n
@@ -93,6 +95,8 @@ Google은 이용자에 대한 위치정보의 이용∙제공사실을 위치정
DATE_LOCAL
LOCATION
NUMBER
+ PACE
+ SPEED
IMPERIAL
METRIC
com.google.android.apps.mytracks.END_CURRENT_TRACK
diff --git a/MyTracks/res/values/keys.xml b/MyTracks/res/values/keys.xml
index bd8cc4e44..3eb4f8284 100644
--- a/MyTracks/res/values/keys.xml
+++ b/MyTracks/res/values/keys.xml
@@ -18,12 +18,12 @@ limitations under the License.
allowAccess
autoResumeTrackTimeout
- chartByDistance
chartShowCadence
chartShowElevation
chartShowHeartRate
chartShowPower
chartShowSpeed
+ chartXAxis
defaultActivity
exportExternalStorageFormat
exportGoogleFusionTablesPublic
@@ -34,14 +34,14 @@ limitations under the License.
minRecordingInterval
recordingDistanceInterval
recordingGpsAccuracy
- reportSpeed
sensorType
shareTrackInvite
shareTrackPublic
splitFrequency
+ statsRate
statsShowCoordinate
statsShowGradeElevation
- statsdUnits
+ statsUnits
trackColorModeMedium
trackColorModePercentage
trackColorModeSlow
diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml
index 610f44282..50e3f4993 100644
--- a/MyTracks/res/values/strings.xml
+++ b/MyTracks/res/values/strings.xml
@@ -774,10 +774,10 @@ limitations under the License.
translation_description="The text on a button to say cancel.">
Cancel
-
- Are you sure?
-
+
+ Delete selected?
+
Description
@@ -1001,6 +1001,10 @@ limitations under the License.
translation_description="When deleting one marker, the confirmation message.">
The marker will be permanently deleted from the device.
+
+ Delete marker?
+
All markers for this track will be permanently deleted from the device.
@@ -1484,29 +1488,39 @@ limitations under the License.
Backup & reset
-
-
+
- Backup now
+ Backup
+
+
+ This will write a full copy of all your tracks and settings to ‘%1$s’ on the
+ external storage.
+
+
+ Backup now?
Unable to backup.
+ translation_description="In the 'Backup and reset' settings, after pressing the 'Backup' option,
+ the progress message telling the user that it is writing all tracks and settings to the
+ external storage.">
Writing all tracks and settings…
-
- Write a full copy of all your tracks and settings to the external storage
-
Finished backup.
@@ -1518,22 +1532,26 @@ limitations under the License.
external storage.
Character limit: ~26 (1 line)">
- Restore now
+ Restore
+ translation_description="In the 'Backup and reset' settings, after pressing the 'Restore'
+ option, the confirmation message.">
Restoring a backup from external storage will delete all your tracks and settings, and update
them with the backup copy. Google Drive sync will be turned off. No tracks will be deleted on
Google Drive and on external storage.
+
+ Restore now?
+
Unable to restore from backup.
Reading all tracks and settings…
Select a backup to restore
-
- Restore all tracks and settings from the external storage
-
Finished restoring from backup.
@@ -1595,6 +1608,11 @@ limitations under the License.
This will remove any association between your tracks and %1$s Google Drive. Google Drive sync
will be turned off. No tracks will be deleted on %1$s Google Drive.
+
+ Switch account?
+
+ Reset now?
+
All settings have been reverted to the default values.
-
- Revert all your settings to the default values
-
+
+ Allow access?
+
Email addresses
-
- This will upload your track to Google Drive.
-
Invite people to view
@@ -2213,11 +2232,19 @@ limitations under the License.
All tracks and markers will be permanently deleted from the device. Google Drive sync will be
turned off. No tracks will be deleted on Google Drive and on external storage.
+
+ Delete all?
+
The track and its markers will be permanently deleted from the device. If Google Drive sync is
enabled, this will also delete the track on Google Drive.
+
+ Delete track?
+
The selected tracks and their markers will be permanently deleted from the device. If Google
@@ -2254,7 +2281,12 @@ limitations under the License.
- Play in Google Earth will save your track to external storage.
+ This will save your track to external storage.
+
+
+ Play in Google Earth?
diff --git a/MyTracks/res/xml/backup_reset_settings.xml b/MyTracks/res/xml/backup_reset_settings.xml
index f4341c29b..fb61ac08b 100644
--- a/MyTracks/res/xml/backup_reset_settings.xml
+++ b/MyTracks/res/xml/backup_reset_settings.xml
@@ -19,7 +19,7 @@ limitations under the License.
+ android:title="@string/settings_backup" />
-
-
1 ? R.string.generic_delete_selected_confirm_title
+ : R.string.track_delete_one_confirm_title;
messageId = trackIds.length > 1 ? R.string.track_delete_multiple_confirm_message
: R.string.track_delete_one_confirm_message;
}
return DialogUtils.createConfirmationDialog(
- getActivity(), messageId, new DialogInterface.OnClickListener() {
+ getActivity(), titleId, getString(messageId), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
caller.onConfirmDeleteDone(trackIds);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java
index 1309ac141..9bb174270 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java
@@ -16,11 +16,11 @@
package com.google.android.apps.mytracks.fragments;
+import com.google.android.apps.mytracks.util.DialogUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.app.Activity;
-import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.os.Bundle;
@@ -92,8 +92,8 @@ public class ConfirmPlayDialogFragment extends DialogFragment {
textView.setText(R.string.track_detail_play_confirm_message);
checkBox = (CheckBox) view.findViewById(R.id.confirm_dialog_check_box);
- return new AlertDialog.Builder(fragmentActivity).setNegativeButton(R.string.generic_no, null)
- .setPositiveButton(R.string.generic_yes, new DialogInterface.OnClickListener() {
+ return DialogUtils.createConfirmationDialog(fragmentActivity,
+ R.string.track_detail_play_confirm_title, view, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
long[] trackIds = getArguments().getLongArray(KEY_TRACK_IDS);
@@ -101,6 +101,6 @@ public class ConfirmPlayDialogFragment extends DialogFragment {
fragmentActivity, R.string.confirm_play_earth_key, !checkBox.isChecked());
caller.onConfirmPlayDone(trackIds);
}
- }).setTitle(R.string.generic_confirm_title).setView(view).create();
+ });
}
}
\ No newline at end of file
diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteMarkerDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteMarkerDialogFragment.java
index 8808d0c70..59c86ce03 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteMarkerDialogFragment.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/DeleteMarkerDialogFragment.java
@@ -77,10 +77,12 @@ public class DeleteMarkerDialogFragment extends DialogFragment {
public Dialog onCreateDialog(Bundle savedInstanceState) {
final FragmentActivity fragmentActivity = getActivity();
final long[] markerIds = getArguments().getLongArray(KEY_MARKER_IDS);
+ int titleId = markerIds.length > 1 ? R.string.generic_delete_selected_confirm_title
+ : R.string.marker_delete_one_confirm_title;
int messageId = markerIds.length > 1 ? R.string.marker_delete_multiple_confirm_message
: R.string.marker_delete_one_confirm_message;
return DialogUtils.createConfirmationDialog(
- fragmentActivity, messageId, new DialogInterface.OnClickListener() {
+ fragmentActivity, titleId, getString(messageId), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
new Thread(new Runnable() {
diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java
index d7e85a81f..3f1de531a 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java
@@ -181,7 +181,7 @@ public class MarkerDetailFragment extends Fragment {
@SuppressWarnings("deprecation")
int displayHeight = defaultDisplay.getHeight();
bitmap = PhotoUtils.setImageVew(
- imageView, Uri.parse(photoUrl), displayWidth, displayHeight, true);
+ imageView, Uri.parse(photoUrl), displayWidth, displayHeight);
}
TextView name = (TextView) getView().findViewById(R.id.marker_detail_waypoint_name);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java
index a7640edbe..0fc315a96 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/KmlTrackWriter.java
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.io.file;
import com.google.android.apps.mytracks.content.DescriptionGenerator;
import com.google.android.apps.mytracks.content.DescriptionGeneratorImpl;
import com.google.android.apps.mytracks.content.MyTracksLocation;
+import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Sensor;
import com.google.android.apps.mytracks.content.Sensor.SensorData;
import com.google.android.apps.mytracks.content.Sensor.SensorDataSet;
@@ -30,7 +31,9 @@ import com.google.android.maps.mytracks.R;
import com.google.common.annotations.VisibleForTesting;
import android.content.Context;
+import android.database.Cursor;
import android.location.Location;
+import android.net.Uri;
import java.io.OutputStream;
import java.io.PrintWriter;
@@ -65,7 +68,8 @@ public class KmlTrackWriter implements TrackFormatWriter {
TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png";
private final Context context;
- private final DescriptionGenerator descriptionGenerator;
+ private final DescriptionGenerator descriptionGenerator;
+ private final MyTracksProviderUtils myTracksProviderUtils;
private PrintWriter printWriter;
private ArrayList powerList = new ArrayList();
private ArrayList cadenceList = new ArrayList();
@@ -82,6 +86,7 @@ public class KmlTrackWriter implements TrackFormatWriter {
KmlTrackWriter(Context context, DescriptionGenerator descriptionGenerator) {
this.context = context;
this.descriptionGenerator = descriptionGenerator;
+ this.myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context);
}
@Override
@@ -158,8 +163,15 @@ public class KmlTrackWriter implements TrackFormatWriter {
if (printWriter != null) {
String styleName = waypoint.getType() == WaypointType.STATISTICS ? STATISTICS_STYLE
: WAYPOINT_STYLE;
- writePlacemark(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(),
- styleName, waypoint.getLocation());
+ String photoUrl = waypoint.getPhotoUrl();
+ if (photoUrl != null && !photoUrl.equals("")) {
+ float heading = getHeading(waypoint.getTrackId(), waypoint.getLocation());
+ writePhotoOverlay(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(),
+ styleName, waypoint.getLocation(), photoUrl, heading);
+ } else {
+ writePlacemark(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(),
+ styleName, waypoint.getLocation());
+ }
}
}
@@ -307,6 +319,76 @@ public class KmlTrackWriter implements TrackFormatWriter {
}
}
+ /**
+ * Writes a photo overlay.
+ *
+ * @param name the name
+ * @param category the category
+ * @param description the description
+ * @param styleName the style name
+ * @param location the location
+ * @param photoUrl the photo url
+ * @param heading the heading
+ */
+ private void writePhotoOverlay(String name, String category, String description, String styleName,
+ Location location, String photoUrl, float heading) {
+ if (location != null) {
+ printWriter.println("");
+ printWriter.println("" + StringUtils.formatCData(name) + "");
+ printWriter.println(""
+ + StringUtils.formatCData(StringUtils.getCategoryDescription(category, description))
+ + "");
+ printWriter.print("");
+ printWriter.print("" + location.getLongitude() + "");
+ printWriter.print("" + location.getLatitude() + "");
+ printWriter.print("20");
+ printWriter.print("" + heading + "");
+ printWriter.print("90");
+ printWriter.println("");
+ printWriter.println("#" + styleName + "");
+ printWriter.println("" + Uri.decode(photoUrl) + "");
+ printWriter.print("");
+ printWriter.print("10");
+ printWriter.print("-60");
+ printWriter.print("60");
+ printWriter.print("-45");
+ printWriter.print("45");
+ printWriter.println("");
+ printWriter.println("");
+ printWriter.println("" + getCoordinates(location, ",") + "");
+ printWriter.println("");
+ printWriter.println("");
+ }
+ }
+
+ /**
+ * Gets the heading to a location.
+ *
+ * @param trackId the track id containing the location
+ * @param location the location
+ */
+ private float getHeading(long trackId, Location location) {
+ long trackPointId = myTracksProviderUtils.getTrackPointId(trackId, location);
+ if (trackPointId == -1L) {
+ return location.getBearing();
+ }
+ Cursor cursor = null;
+ Location viewLocation;
+ try {
+ cursor = myTracksProviderUtils.getTrackPointCursor(trackId, trackPointId, 10, true);
+ if (cursor == null || cursor.getCount() == 0) {
+ return location.getBearing();
+ }
+ cursor.moveToPosition(cursor.getCount() - 1);
+ viewLocation = myTracksProviderUtils.createTrackPoint(cursor);
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ return viewLocation.bearingTo(location);
+ }
+
private String getCoordinates(Location location, String separator) {
StringBuffer buffer = new StringBuffer();
buffer.append(location.getLongitude() + separator + location.getLatitude());
diff --git a/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java b/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java
index 646beee42..29c1c8bb2 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/services/tasks/AnnouncementPeriodicTask.java
@@ -228,8 +228,7 @@ public class AnnouncementPeriodicTask implements PeriodicTask {
@VisibleForTesting
protected String getAnnouncement(TripStatistics tripStatistics) {
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
- boolean reportSpeed = PreferencesUtils.getBoolean(
- context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
+ boolean reportSpeed = PreferencesUtils.isReportSpeed(context);
double distance = tripStatistics.getTotalDistance() * UnitConversions.M_TO_KM;
double speed = tripStatistics.getAverageMovingSpeed() * UnitConversions.MS_TO_KMH;
diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java
index e95a204ec..664e82afc 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/settings/BackupResetSettingsActivity.java
@@ -21,6 +21,7 @@ import com.google.android.apps.mytracks.io.backup.BackupActivity;
import com.google.android.apps.mytracks.io.backup.RestoreChooserActivity;
import com.google.android.apps.mytracks.io.sync.SyncUtils;
import com.google.android.apps.mytracks.util.DialogUtils;
+import com.google.android.apps.mytracks.util.FileUtils;
import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
@@ -45,8 +46,9 @@ import android.widget.Toast;
public class BackupResetSettingsActivity extends AbstractSettingsActivity {
private static final String TAG = BackupResetSettingsActivity.class.getSimpleName();
- private static final int DIALOG_CONFIRM_RESTORE_ID = 0;
- private static final int DIALOG_CONFIRM_RESET_ID = 1;
+ private static final int DIALOG_CONFIRM_BACKUP_ID = 0;
+ private static final int DIALOG_CONFIRM_RESTORE_ID = 1;
+ private static final int DIALOG_CONFIRM_RESET_ID = 2;
private SharedPreferences sharedPreferences;
private Preference backupPreference;
@@ -88,10 +90,8 @@ public class BackupResetSettingsActivity extends AbstractSettingsActivity {
backupPreference = findPreference(getString(R.string.settings_backup_key));
backupPreference.setOnPreferenceClickListener(new OnPreferenceClickListener() {
@Override
- public boolean onPreferenceClick(Preference preference) {
- Intent intent = IntentUtils.newIntent(
- BackupResetSettingsActivity.this, BackupActivity.class);
- startActivity(intent);
+ public boolean onPreferenceClick(Preference preference) {
+ showDialog(DIALOG_CONFIRM_BACKUP_ID);
return true;
}
});
@@ -116,11 +116,26 @@ public class BackupResetSettingsActivity extends AbstractSettingsActivity {
@Override
protected Dialog onCreateDialog(int id) {
+ String message;
Dialog dialog;
switch (id) {
+ case DIALOG_CONFIRM_BACKUP_ID:
+ message = getString(R.string.settings_backup_confirm_message,
+ FileUtils.getDirectoryDisplayName(FileUtils.BACKUPS_DIR));
+ dialog = DialogUtils.createConfirmationDialog(this, R.string.settings_backup_confirm_title,
+ message, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface d, int which) {
+ Intent intent = IntentUtils.newIntent(
+ BackupResetSettingsActivity.this, BackupActivity.class);
+ startActivity(intent);
+ }
+ });
+ break;
case DIALOG_CONFIRM_RESTORE_ID:
+ message = getString(R.string.settings_backup_restore_confirm_message);
dialog = DialogUtils.createConfirmationDialog(this,
- R.string.settings_backup_restore_confirm_message,
+ R.string.settings_backup_restore_confirm_title, message,
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int which) {
@@ -131,8 +146,9 @@ public class BackupResetSettingsActivity extends AbstractSettingsActivity {
});
break;
case DIALOG_CONFIRM_RESET_ID:
- dialog = DialogUtils.createConfirmationDialog(
- this, R.string.settings_reset_confirm_message, new DialogInterface.OnClickListener() {
+ message = getString(R.string.settings_reset_confirm_message);
+ dialog = DialogUtils.createConfirmationDialog(this, R.string.settings_reset_confirm_title,
+ message, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int button) {
onResetPreferencesConfirmed();
@@ -164,17 +180,13 @@ public class BackupResetSettingsActivity extends AbstractSettingsActivity {
*/
private void updateUi() {
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
+ String summary = isRecording ? getString(R.string.settings_not_while_recording) : "";
backupPreference.setEnabled(!isRecording);
- backupPreference.setSummary(
- isRecording ? R.string.settings_not_while_recording : R.string.settings_backup_now_summary);
-
+ backupPreference.setSummary(summary);
restoreNowPreference.setEnabled(!isRecording);
- restoreNowPreference.setSummary(isRecording ? R.string.settings_not_while_recording
- : R.string.settings_backup_restore_summary);
-
+ restoreNowPreference.setSummary(summary);
resetPreference.setEnabled(!isRecording);
- resetPreference.setSummary(
- isRecording ? R.string.settings_not_while_recording : R.string.settings_reset_summary);
+ resetPreference.setSummary(summary);
}
/**
diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/ChartSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/ChartSettingsActivity.java
index faab87cec..35d7c17dc 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/settings/ChartSettingsActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/settings/ChartSettingsActivity.java
@@ -21,6 +21,7 @@ import com.google.android.maps.mytracks.R;
import android.os.Bundle;
import android.preference.CheckBoxPreference;
+import android.preference.ListPreference;
/**
* An activity for accessing chart settings.
@@ -34,6 +35,7 @@ public class ChartSettingsActivity extends AbstractSettingsActivity {
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
addPreferencesFromResource(R.xml.chart_settings);
+ configXAxisListPreference();
}
@Override
@@ -46,9 +48,21 @@ public class ChartSettingsActivity extends AbstractSettingsActivity {
private void updateUi() {
CheckBoxPreference speedCheckBoxPreference = (CheckBoxPreference) findPreference(
getString(R.string.chart_show_speed_key));
- boolean reportSpeed = PreferencesUtils.getBoolean(
- this, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
- speedCheckBoxPreference.setTitle(reportSpeed ? R.string.stats_speed
- : R.string.stats_pace);
+ speedCheckBoxPreference.setTitle(
+ PreferencesUtils.isReportSpeed(this) ? R.string.stats_speed : R.string.stats_pace);
+ }
+
+ /**
+ * Configures the x axis list preference.
+ */
+ private void configXAxisListPreference() {
+ @SuppressWarnings("deprecation")
+ ListPreference listPreference = (ListPreference) findPreference(
+ getString(R.string.chart_x_axis_key));
+ String value = PreferencesUtils.getString(
+ this, R.string.chart_x_axis_key, PreferencesUtils.CHART_X_AXIS_DEFAULT);
+ String[] values = getResources().getStringArray(R.array.chart_x_axis_values);
+ String[] options = getResources().getStringArray(R.array.chart_x_axis_options);
+ configureListPreference(listPreference, options, options, values, value, null);
}
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/GoogleSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/GoogleSettingsActivity.java
index bb687d3d3..c3ba51cf8 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/settings/GoogleSettingsActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/settings/GoogleSettingsActivity.java
@@ -140,12 +140,13 @@ public class GoogleSettingsActivity extends AbstractSettingsActivity {
Dialog dialog;
switch (id) {
case DIALOG_CONFIRM_SWITCH_ACCOUNT:
- dialog = DialogUtils.createConfirmationDialog(
- this, R.string.settings_google_account_confirm_message, null);
+ dialog = DialogUtils.createConfirmationDialog(this,
+ R.string.settings_google_account_confirm_title,
+ getString(R.string.settings_google_account_confirm_message), null);
break;
case DIALOG_CONFIRM_DRIVE_SYNC_ON:
dialog = DialogUtils.createConfirmationDialog(this, R.string.sync_drive_title,
- R.string.sync_drive_confirm_message, null, new DialogInterface.OnClickListener() {
+ getString(R.string.sync_drive_confirm_message), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface d, int button) {
final String googleAccount = PreferencesUtils.getString(GoogleSettingsActivity.this,
@@ -179,7 +180,7 @@ public class GoogleSettingsActivity extends AbstractSettingsActivity {
});
thread.start();
}
- }, null);
+ });
break;
default:
dialog = null;
diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java
index f74331c97..044c672cb 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java
@@ -64,7 +64,8 @@ public class SharingSettingsActivity extends AbstractSettingsActivity {
return null;
}
return DialogUtils.createConfirmationDialog(this,
- R.string.settings_sharing_allow_access_confirm_message,
+ R.string.settings_sharing_allow_access_confirm_title,
+ getString(R.string.settings_sharing_allow_access_confirm_message),
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int button) {
diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java
index cdbd022e9..beb33bcd3 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/settings/StatsSettingsActivity.java
@@ -20,7 +20,6 @@ import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.os.Bundle;
-import android.preference.CheckBoxPreference;
import android.preference.ListPreference;
import android.preference.Preference;
import android.preference.Preference.OnPreferenceChangeListener;
@@ -32,21 +31,30 @@ import android.preference.Preference.OnPreferenceChangeListener;
*/
public class StatsSettingsActivity extends AbstractSettingsActivity {
- private String statsUnits;
-
@SuppressWarnings("deprecation")
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
addPreferencesFromResource(R.xml.stats_settings);
- ListPreference preference = (ListPreference) findPreference(
+ /*
+ * Note configureUnitsListPreference will trigger
+ * configureRateListPreference
+ */
+ configUnitsListPreference();
+ }
+
+ /**
+ * Configures the preferred units list preference.
+ */
+ private void configUnitsListPreference() {
+ @SuppressWarnings("deprecation")
+ ListPreference listPreference = (ListPreference) findPreference(
getString(R.string.stats_units_key));
OnPreferenceChangeListener listener = new OnPreferenceChangeListener() {
@Override
public boolean onPreferenceChange(Preference pref, Object newValue) {
- statsUnits = (String) newValue;
- updateUi();
+ configRateListPreference(PreferencesUtils.STATS_UNITS_DEFAULT.equals((String) newValue));
return true;
}
};
@@ -54,27 +62,23 @@ public class StatsSettingsActivity extends AbstractSettingsActivity {
this, R.string.stats_units_key, PreferencesUtils.STATS_UNITS_DEFAULT);
String[] values = getResources().getStringArray(R.array.stats_units_values);
String[] options = getResources().getStringArray(R.array.stats_units_options);
- configureListPreference(preference, options, options, values, value, listener);
+ configureListPreference(listPreference, options, options, values, value, listener);
}
- @Override
- protected void onResume() {
- super.onResume();
- statsUnits = PreferencesUtils.getString(
- this, R.string.stats_units_key, PreferencesUtils.STATS_UNITS_DEFAULT);
- updateUi();
- }
-
- @SuppressWarnings("deprecation")
- private void updateUi() {
- CheckBoxPreference reportSpeedCheckBoxPreference = (CheckBoxPreference) findPreference(
- getString(R.string.report_speed_key));
- boolean metricUnits = PreferencesUtils.STATS_UNITS_DEFAULT.equals(statsUnits);
- reportSpeedCheckBoxPreference.setSummaryOn(
- metricUnits ? getString(R.string.description_speed_metric)
- : getString(R.string.description_speed_imperial));
- reportSpeedCheckBoxPreference.setSummaryOff(
- metricUnits ? getString(R.string.description_pace_metric)
- : getString(R.string.description_pace_imperial));
+ /**
+ * Configures the preferred rate list preference.
+ *
+ * @param metricUnits true if metric units
+ */
+ private void configRateListPreference(boolean metricUnits) {
+ @SuppressWarnings("deprecation")
+ ListPreference listPreference = (ListPreference) findPreference(
+ getString(R.string.stats_rate_key));
+ String value = PreferencesUtils.getString(
+ this, R.string.stats_rate_key, PreferencesUtils.STATS_RATE_DEFAULT);
+ String[] values = getResources().getStringArray(R.array.stats_rate_values);
+ String[] options = getResources().getStringArray(
+ metricUnits ? R.array.stats_rate_metric_options : R.array.stats_rate_imperial_options);
+ configureListPreference(listPreference, options, options, values, value, null);
}
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/DialogUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/DialogUtils.java
index f6ee3792f..b6b1d579d 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/DialogUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/DialogUtils.java
@@ -38,40 +38,26 @@ public class DialogUtils {
* Creates a confirmation dialog.
*
* @param context the context
- * @param messageId the message id
+ * @param titleId the title
+ * @param message the message
* @param okListener the listener when OK is clicked
*/
public static Dialog createConfirmationDialog(
- Context context, int messageId, DialogInterface.OnClickListener okListener) {
- return createConfirmationDialog(
- context, R.string.generic_confirm_title, messageId, null, okListener, null);
+ Context context, int titleId, String message, DialogInterface.OnClickListener okListener) {
+ return createConfirmationDialog(context, titleId, message, null, okListener);
}
/**
* Creates a confirmation dialog.
*
* @param context the context
- * @param titleId the titleId
- * @param messageId the messageId
+ * @param titleId the title
* @param view the view
* @param okListener the listener when OK is clicked
- * @param cancelListener the listener when cancel is clicked
*/
- public static Dialog createConfirmationDialog(Context context, int titleId, int messageId,
- View view, DialogInterface.OnClickListener okListener,
- DialogInterface.OnClickListener cancelListener) {
- AlertDialog.Builder builder = new AlertDialog.Builder(context).setCancelable(true)
- .setIcon(android.R.drawable.ic_dialog_alert)
- .setNegativeButton(R.string.generic_no, cancelListener)
- .setPositiveButton(R.string.generic_yes, okListener).setTitle(titleId);
- if (messageId != -1) {
- builder.setMessage(messageId);
- }
- if (view != null) {
- builder.setView(view);
- }
-
- return builder.create();
+ public static Dialog createConfirmationDialog(
+ Context context, int titleId, View view, DialogInterface.OnClickListener okListener) {
+ return createConfirmationDialog(context, titleId, null, view, okListener);
}
/**
@@ -99,6 +85,21 @@ public class DialogUtils {
return createProgressDialog(false, context, messageId, onCancelListener, formatArgs);
}
+ private static Dialog createConfirmationDialog(Context context, int titleId, String message,
+ View view, DialogInterface.OnClickListener okListener) {
+ AlertDialog.Builder builder = new AlertDialog.Builder(context).setCancelable(true)
+ .setIcon(android.R.drawable.ic_dialog_alert).setNegativeButton(R.string.generic_no, null)
+ .setPositiveButton(R.string.generic_yes, okListener).setTitle(titleId);
+ if (message != null) {
+ builder.setMessage(message);
+ }
+ if (view != null) {
+ builder.setView(view);
+ }
+
+ return builder.create();
+ }
+
/**
* Creates a progress dialog.
*
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/ListItemUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/ListItemUtils.java
index 75463ff7a..c4efb3ec1 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/ListItemUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/ListItemUtils.java
@@ -94,9 +94,10 @@ public class ListItemUtils {
} else {
photo.setVisibility(View.VISIBLE);
Display defaultDisplay = activity.getWindowManager().getDefaultDisplay();
- // Set the initial width to 35% of the display width
- int width = (int) (defaultDisplay.getWidth() * .35);
- PhotoUtils.setImageVew(photo, Uri.parse(photoUrl), width, 0, false);
+ // Set the initial width to 33% of the display width.
+ int width = (int) (defaultDisplay.getWidth() * .33);
+ int height = 0;
+ PhotoUtils.setImageVew(photo, Uri.parse(photoUrl), width, height);
}
// Set date/time
@@ -109,7 +110,8 @@ public class ListItemUtils {
// Set category/description
TextView descriptionTextView = (TextView) view.findViewById(R.id.list_item_description);
- setTextView(descriptionTextView, getDescription(isRecording, category, description));
+ setTextView(descriptionTextView,
+ isRecording ? null : StringUtils.getCategoryDescription(category, description));
}
/**
@@ -146,30 +148,6 @@ public class ListItemUtils {
return buffer.toString();
}
- /**
- * Gets the description text.
- *
- * @param isRecording true if recording
- * @param category the category
- * @param description the description
- */
- private static String getDescription(boolean isRecording, String category, String description) {
- if (isRecording) {
- return null;
- }
- if (category == null || category.length() == 0) {
- return description;
- }
-
- StringBuffer buffer = new StringBuffer();
-
- buffer.append("[" + category + "]");
- if (description != null && description.length() != 0) {
- buffer.append(" " + description);
- }
- return buffer.toString();
- }
-
/**
* Gets the start time text.
*
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/PhotoUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/PhotoUtils.java
index b333fb932..f29f96fec 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/PhotoUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/PhotoUtils.java
@@ -44,12 +44,10 @@ public class PhotoUtils {
* @param uri the image uri
* @param displayWidth the display width
* @param displayHeight the display height
- * @param fitWithIn true to fit within the display area. False to crop and fill
- * the display area.
*/
public static Bitmap setImageVew(
- ImageView imageView, Uri uri, int displayWidth, int displayHeight, boolean fitWithIn) {
-
+ ImageView imageView, Uri uri, int displayWidth, int displayHeight) {
+
// Get the image dimensions
BitmapFactory.Options options = new BitmapFactory.Options();
@@ -61,7 +59,6 @@ public class PhotoUtils {
int targetHeight = displayHeight;
if (targetHeight == 0) {
targetHeight = (int) (targetWidth * ((float) options.outHeight / (float) options.outWidth));
- imageView.getLayoutParams().height = targetHeight;
}
// Set imageWidth and imageHeight based on image rotation
@@ -79,8 +76,7 @@ public class PhotoUtils {
// Get a scaled down version of the image
options.inJustDecodeBounds = false;
- options.inSampleSize = getInSampleSize(
- imageWidth, imageHeight, targetWidth, targetHeight, fitWithIn);
+ options.inSampleSize = getInSampleSize(imageWidth, imageHeight, targetWidth, targetHeight);
options.inPurgeable = true;
Bitmap scaledBitmap = BitmapFactory.decodeFile(uri.getPath(), options);
@@ -133,11 +129,9 @@ public class PhotoUtils {
* @param imageHeight the image height
* @param targetWidth the target width
* @param targetHeight the target height
- * @param fitWithin true to fit within the target area. False to crop and fill
- * all target area.
*/
private static int getInSampleSize(
- int imageWidth, int imageHeight, int targetWidth, int targetHeight, boolean fitWithin) {
+ int imageWidth, int imageHeight, int targetWidth, int targetHeight) {
float widthRatio = 1;
if (imageWidth > targetWidth) {
widthRatio = (float) imageWidth / (float) targetWidth;
@@ -150,11 +144,9 @@ public class PhotoUtils {
/*
* To fit within the target area, return the larger sample ratio so the
- * image will not be larger than the target dimensions. To crop and fill the
- * target area, return the smaller sample ratio so the image will be greater
- * than the target dimensions. Use Math.floor to not under sample.
+ * image will not be larger than the target dimensions. Use Math.floor to
+ * not under sample.
*/
- return (int) Math.floor(
- fitWithin ? Math.max(widthRatio, heightRatio) : Math.min(widthRatio, heightRatio));
+ return (int) Math.floor(Math.max(widthRatio, heightRatio));
}
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java
index 4a3f5500b..7359abadc 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java
@@ -50,12 +50,12 @@ public class PreferencesUtils {
public static final String BLUETOOTH_SENSOR_DEFAULT = "";
- public static final boolean CHART_BY_DISTANCE_DEFAULT = true;
public static final boolean CHART_SHOW_CADENCE_DEFAULT = true;
public static final boolean CHART_SHOW_ELEVATION_DEFAULT = true;
public static final boolean CHART_SHOW_HEART_RATE_DEFAULT = true;
public static final boolean CHART_SHOW_POWER_DEFAULT = true;
public static final boolean CHART_SHOW_SPEED_DEFAULT = true;
+ public static final String CHART_X_AXIS_DEFAULT = "DISTANCE";
public static final boolean CONFIRM_PLAY_EARTH_DEFAULT = true;
@@ -91,7 +91,6 @@ public class PreferencesUtils {
public static final long RECORDING_TRACK_ID_DEFAULT = -1L;
public static final boolean RECORDING_TRACK_PAUSED_DEFAULT = true;
- public static final boolean REPORT_SPEED_DEFAULT = true;
public static final long SELECTED_TRACK_ID_DEFAULT = -1L;
public static final String SENSOR_TYPE_DEFAULT = "NONE";
@@ -102,6 +101,7 @@ public class PreferencesUtils {
public static final int SPLIT_FREQUENCY_DEFAULT = 0;
// Stats
+ public static final String STATS_RATE_DEFAULT = "SPEED";
public static final boolean STATS_SHOW_COORDINATE_DEFAULT = false;
public static final boolean STATS_SHOW_GRADE_ELEVATION_DEFAULT = false;
public static final String STATS_UNITS_DEFAULT = "METRIC";
@@ -257,4 +257,25 @@ public class PreferencesUtils {
return PreferencesUtils.STATS_UNITS_DEFAULT.equals(
getString(context, R.string.stats_units_key, PreferencesUtils.STATS_UNITS_DEFAULT));
}
+
+ /**
+ * Returns true if the preferred rate is speed, false if the preferred rate is
+ * pace.
+ *
+ * @param context the context
+ */
+ public static boolean isReportSpeed(Context context) {
+ return PreferencesUtils.STATS_RATE_DEFAULT.equals(
+ getString(context, R.string.stats_rate_key, PreferencesUtils.STATS_RATE_DEFAULT));
+ }
+
+ /**
+ * Returns true if chart x axis is by distance, false if by time.
+ *
+ * @param context the context
+ */
+ public static boolean isChartByDistance(Context context) {
+ return PreferencesUtils.CHART_X_AXIS_DEFAULT.equals(
+ getString(context, R.string.chart_x_axis_key, PreferencesUtils.CHART_X_AXIS_DEFAULT));
+ }
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java
index acd2123a5..6b376e481 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/StatsUtils.java
@@ -51,8 +51,7 @@ public class StatsUtils {
*/
public static void setLocationValues(Activity activity, Location location, boolean isRecording) {
boolean metricUnits = PreferencesUtils.isMetricUnits(activity);
- boolean reportSpeed = PreferencesUtils.getBoolean(
- activity, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
+ boolean reportSpeed = PreferencesUtils.isReportSpeed(activity);
// Set speed/pace
double speed = isRecording && location != null && location.hasSpeed() ? location.getSpeed()
@@ -112,8 +111,7 @@ public class StatsUtils {
*/
public static void setTripStatisticsValues(Activity activity, TripStatistics tripStatistics) {
boolean metricUnits = PreferencesUtils.isMetricUnits(activity);
- boolean reportSpeed = PreferencesUtils.getBoolean(
- activity, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
+ boolean reportSpeed = PreferencesUtils.isReportSpeed(activity);
// Set total distance
double totalDistance = tripStatistics == null ? Double.NaN : tripStatistics.getTotalDistance();
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java
index 9771fbbf0..9df516edc 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/StringUtils.java
@@ -228,6 +228,26 @@ public class StringUtils {
return result;
}
+ /**
+ * Gets a string for category and description.
+ *
+ * @param category the category
+ * @param description the description
+ */
+ public static String getCategoryDescription(String category, String description) {
+ if (category == null || category.length() == 0) {
+ return description;
+ }
+
+ StringBuffer buffer = new StringBuffer();
+
+ buffer.append("[" + category + "]");
+ if (description != null && description.length() != 0) {
+ buffer.append(" " + description);
+ }
+ return buffer.toString();
+ }
+
/**
* Formats the given text as a XML CDATA element. This includes adding the
* starting and ending CDATA tags. Please notice that this may result in
diff --git a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetConfigActivity.java b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetConfigActivity.java
index fad31d7eb..71601962e 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetConfigActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetConfigActivity.java
@@ -60,8 +60,7 @@ public class TrackWidgetConfigActivity extends Activity {
item3 = (Spinner) findViewById(R.id.track_widget_config_item3);
item4 = (Spinner) findViewById(R.id.track_widget_config_item4);
- boolean reportSpeed = PreferencesUtils.getBoolean(
- this, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
+ boolean reportSpeed = PreferencesUtils.isReportSpeed(this);
List list = new ArrayList();
addItem(list, R.string.stats_distance);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java
index 9bd8ce793..03903795f 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/widgets/TrackWidgetProvider.java
@@ -196,8 +196,7 @@ public class TrackWidgetProvider extends AppWidgetProvider {
boolean isPaused = PreferencesUtils.getBoolean(context, R.string.recording_track_paused_key,
PreferencesUtils.RECORDING_TRACK_PAUSED_DEFAULT);
boolean metricUnits = PreferencesUtils.isMetricUnits(context);
- boolean reportSpeed = PreferencesUtils.getBoolean(
- context, R.string.report_speed_key, PreferencesUtils.REPORT_SPEED_DEFAULT);
+ boolean reportSpeed = PreferencesUtils.isReportSpeed(context);
int item1 = PreferencesUtils.getInt(
context, R.string.track_widget_item1, PreferencesUtils.TRACK_WIDGET_ITEM1_DEFAULT);
int item2 = PreferencesUtils.getInt(
diff --git a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java
index 794e4b036..405126eea 100644
--- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java
+++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtils.java
@@ -237,6 +237,15 @@ public interface MyTracksProviderUtils {
*/
public long getLastTrackPointId(long trackId);
+ /**
+ * Gets the track point id of a location.
+ *
+ * @param trackId the track id
+ * @param location the location
+ * @return track point id if the location is in the track. -1L otherwise.
+ */
+ public long getTrackPointId(long trackId, Location location);
+
/**
* Gets the first valid location for a track. Returns null if it doesn't
* exist.
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 c1df5df5c..ccd437aab 100644
--- a/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java
+++ b/MyTracksLib/src/com/google/android/apps/mytracks/content/MyTracksProviderUtilsImpl.java
@@ -794,6 +794,31 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
}
return -1L;
}
+
+ @Override
+ public long getTrackPointId(long trackId, Location location) {
+ if (trackId < 0) {
+ return -1L;
+ }
+ Cursor cursor = null;
+ try {
+ String selection = TrackPointsColumns._ID + "=(select max(" + TrackPointsColumns._ID
+ + ") from " + TrackPointsColumns.TABLE_NAME + " WHERE " + TrackPointsColumns.TRACKID
+ + "=? AND " + TrackPointsColumns.TIME + "=?)";
+ String[] selectionArgs = new String[] {
+ Long.toString(trackId), Long.toString(location.getTime()) };
+ cursor = getTrackPointCursor(new String[] { TrackPointsColumns._ID }, selection,
+ selectionArgs, TrackPointsColumns._ID);
+ if (cursor != null && cursor.moveToFirst()) {
+ return cursor.getLong(cursor.getColumnIndexOrThrow(TrackPointsColumns._ID));
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
+ }
+ return -1L;
+ }
@Override
public Location getFirstValidTrackPoint(long trackId) {
diff --git a/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java b/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java
index c60cf868e..86e9cee75 100644
--- a/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java
+++ b/MyTracksTest/src/com/google/android/apps/mytracks/content/TrackDataHubTest.java
@@ -526,7 +526,8 @@ public class TrackDataHubTest extends AndroidTestCase {
public void testPreferencesChange() throws Exception {
// Register two listeners
- PreferencesUtils.setBoolean(context, R.string.report_speed_key, true);
+ PreferencesUtils.setString(
+ context, R.string.stats_rate_key, PreferencesUtils.STATS_RATE_DEFAULT);
PreferencesUtils.setString(
context, R.string.stats_units_key, PreferencesUtils.STATS_UNITS_DEFAULT);
PreferencesUtils.setInt(context, R.string.recording_gps_accuracy_key,
@@ -563,10 +564,11 @@ public class TrackDataHubTest extends AndroidTestCase {
expect(trackDataListener2.onReportSpeedChanged(false)).andReturn(false);
replay();
- PreferencesUtils.setBoolean(context, R.string.report_speed_key, false);
+ PreferencesUtils.setString(
+ context, R.string.stats_rate_key, context.getString(R.string.stats_rate_pace));
OnSharedPreferenceChangeListener listener = preferenceChangeListenerCapture.getValue();
listener.onSharedPreferenceChanged(
- sharedPreferences, PreferencesUtils.getKey(context, R.string.report_speed_key));
+ sharedPreferences, PreferencesUtils.getKey(context, R.string.stats_rate_key));
verifyAndReset();
// Change metric units to false
@@ -785,14 +787,16 @@ public class TrackDataHubTest extends AndroidTestCase {
* the key is R.string.metric_units_key.
*/
public void testNotifyPreferenceChanged_reportSpeedNoNotify() {
- boolean value = false;
- PreferencesUtils.setBoolean(context, R.string.report_speed_key, value);
+ String value = context.getString(R.string.stats_rate_pace);
+ PreferencesUtils.setString(context, R.string.stats_rate_key, value);
trackDataHub.notifyPreferenceChanged(PreferencesUtils
- .getKey(context, R.string.report_speed_key));
- assertEquals(value, trackDataHub.isReportSpeed());
- PreferencesUtils.setBoolean(context, R.string.report_speed_key, !value);
+ .getKey(context, R.string.stats_rate_key));
+ assertEquals(false, trackDataHub.isReportSpeed());
+
+ value = context.getString(R.string.stats_rate_speed);
+ PreferencesUtils.setString(context, R.string.stats_rate_key, value);
trackDataHub.notifyPreferenceChanged(PreferencesUtils
- .getKey(context, R.string.report_speed_key));
- assertEquals(!value, trackDataHub.isReportSpeed());
+ .getKey(context, R.string.stats_rate_key));
+ assertEquals(true, trackDataHub.isReportSpeed());
}
}
diff --git a/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/EndToEndTestUtils.java b/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/EndToEndTestUtils.java
index 032eacb34..479abfc19 100644
--- a/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/EndToEndTestUtils.java
+++ b/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/EndToEndTestUtils.java
@@ -843,7 +843,7 @@ public class EndToEndTestUtils {
findMenuItem(activityMyTracks.getString(R.string.menu_settings), true);
SOLO.clickOnText(activityMyTracks.getString(R.string.settings_backup_reset));
Assert.assertTrue(SOLO.waitForText(activityMyTracks.getString(R.string.settings_reset)));
- SOLO.clickOnText(activityMyTracks.getString(R.string.settings_reset_summary));
+ SOLO.clickOnText(activityMyTracks.getString(R.string.settings_reset));
getButtonOnScreen(activityMytracks.getString(R.string.generic_yes), true, true);
Assert.assertTrue(SOLO.waitForText(activityMyTracks.getString(R.string.settings_reset_done)));
instrumentation.waitForIdleSync();
diff --git a/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java b/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java
index 2d31e4de6..599b9f6b3 100644
--- a/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java
+++ b/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java
@@ -99,7 +99,7 @@ public class SettingTest extends ActivityInstrumentationTestCase2