diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml
index 617d351e4..344fde5f3 100755
--- a/MyTracks/AndroidManifest.xml
+++ b/MyTracks/AndroidManifest.xml
@@ -261,6 +261,5 @@ limitations under the License.
android:authorities="com.google.android.maps.mytracks.search"
android:exported="false"
android:name="com.google.android.apps.mytracks.content.SearchEngineProvider" />
-
\ No newline at end of file
diff --git a/MyTracks/project.properties b/MyTracks/project.properties
index 044ccf9a5..a30df1980 100644
--- a/MyTracks/project.properties
+++ b/MyTracks/project.properties
@@ -11,6 +11,6 @@
split.density=false
proguard.config=proguard.cfg
# Project target.
-target=Google Inc.:Google APIs:16
+target=android-16
android.library.reference.1=../MyTracksLib
android.library.reference.2=../google_play_services_lib
diff --git a/MyTracks/res/drawable-hdpi/warning.png b/MyTracks/res/drawable-hdpi/warning.png
index a20b85e0a..28aa9be2c 100755
Binary files a/MyTracks/res/drawable-hdpi/warning.png and b/MyTracks/res/drawable-hdpi/warning.png differ
diff --git a/MyTracks/res/drawable-ldpi/warning.png b/MyTracks/res/drawable-ldpi/warning.png
index b40291acd..28acb48b3 100755
Binary files a/MyTracks/res/drawable-ldpi/warning.png and b/MyTracks/res/drawable-ldpi/warning.png differ
diff --git a/MyTracks/res/drawable-mdpi/warning.png b/MyTracks/res/drawable-mdpi/warning.png
index 30e3c9a18..c5659d1ff 100755
Binary files a/MyTracks/res/drawable-mdpi/warning.png and b/MyTracks/res/drawable-mdpi/warning.png differ
diff --git a/MyTracks/res/layout/confirm_sharing.xml b/MyTracks/res/layout/confirm_dialog.xml
similarity index 92%
rename from MyTracks/res/layout/confirm_sharing.xml
rename to MyTracks/res/layout/confirm_dialog.xml
index 5c738ca54..bc81c4a97 100644
--- a/MyTracks/res/layout/confirm_sharing.xml
+++ b/MyTracks/res/layout/confirm_dialog.xml
@@ -25,11 +25,11 @@ limitations under the License.
android:paddingRight="10dp"
android:paddingTop="2dp" >
@@ -34,7 +35,7 @@ limitations under the License.
android:contentDescription="@string/icon_my_location"
android:id="@+id/map_my_location"
android:layout_alignParentRight="true"
- android:layout_below="@id/map_message"
+ android:layout_alignParentTop="true"
android:layout_height="wrap_content"
android:layout_marginRight="8dp"
android:layout_marginTop="8dp"
diff --git a/MyTracks/res/values/keys.xml b/MyTracks/res/values/keys.xml
index dcfab95d4..cea7427db 100644
--- a/MyTracks/res/values/keys.xml
+++ b/MyTracks/res/values/keys.xml
@@ -43,6 +43,7 @@ limitations under the License.
sendToFusionTables
sendToMaps
sensorType
+ showConfirmPlayDialog
showConfrimSharingDialog
splitFrequency
statsShowCoordinate
diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml
index b67bb6dab..c2c9fb3f2 100644
--- a/MyTracks/res/values/strings.xml
+++ b/MyTracks/res/values/strings.xml
@@ -758,12 +758,12 @@ limitations under the License.
- Waiting for a better GPS signal. Make sure the sky is visible.
+ Waiting for a better GPS signal.
- Waiting for GPS signal. Make sure the sky is visible.
+ waiting for GPS signal.">
+ Waiting for GPS signal.
@@ -846,7 +846,7 @@ limitations under the License.
- Why does the application sometimes display “Waiting for a better GPS signal.”?
+ Why does the application sometimes display “Waiting for GPS signal.”?
@@ -2267,6 +2267,10 @@ limitations under the License.
translation_description="In the track detail page, the title of the tab showing the map.">
Map
+
+ Play in Google Earth will save your track to external storage.
+
Stats
diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java
index e2bc188ef..0cb2d9468 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/TrackDetailActivity.java
@@ -24,6 +24,7 @@ import com.google.android.apps.mytracks.content.WaypointCreationRequest;
import com.google.android.apps.mytracks.fragments.ChartFragment;
import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment;
import com.google.android.apps.mytracks.fragments.ChooseUploadServiceDialogFragment;
+import com.google.android.apps.mytracks.fragments.ConfirmPlayDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller;
import com.google.android.apps.mytracks.fragments.FrequencyDialogFragment;
@@ -321,12 +322,8 @@ public class TrackDetailActivity extends AbstractMyTracksActivity implements Del
return true;
case R.id.track_detail_play:
if (isEarthInstalled()) {
- AnalyticsUtils.sendPageViews(this, "/action/play");
- intent = IntentUtils.newIntent(this, SaveActivity.class)
- .putExtra(SaveActivity.EXTRA_TRACK_ID, trackId)
- .putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) TrackFileFormat.KML)
- .putExtra(SaveActivity.EXTRA_PLAY_TRACK, true);
- startActivity(intent);
+ ConfirmPlayDialogFragment.newInstance(trackId)
+ .show(getSupportFragmentManager(), ConfirmPlayDialogFragment.CONFIRM_PLAY_DIALOG_TAG);
} else {
new InstallEarthDialogFragment().show(
getSupportFragmentManager(), InstallEarthDialogFragment.INSTALL_EARTH_DIALOG_TAG);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
index 7bb470c4a..03737be99 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/TrackListActivity.java
@@ -22,7 +22,6 @@ import com.google.android.apps.mytracks.content.TrackDataListener;
import com.google.android.apps.mytracks.content.TrackDataType;
import com.google.android.apps.mytracks.content.TracksColumns;
import com.google.android.apps.mytracks.content.Waypoint;
-import com.google.android.apps.mytracks.fragments.CheckUnitsDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteAllTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteOneTrackDialogFragment.DeleteOneTrackCaller;
@@ -48,6 +47,7 @@ import com.google.android.maps.mytracks.R;
import android.app.Dialog;
import android.content.Context;
+import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
@@ -87,6 +87,7 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
private static final String TAG = TrackListActivity.class.getSimpleName();
private static final String START_GPS_KEY = "start_gps_key";
+ private static final int GOOGLE_PLAY_SERVICES_REQUEST_CODE = 0;
private static final String[] PROJECTION = new String[] { TracksColumns._ID, TracksColumns.NAME,
TracksColumns.DESCRIPTION, TracksColumns.CATEGORY, TracksColumns.STARTTIME,
TracksColumns.TOTALDISTANCE, TracksColumns.TOTALTIME, TracksColumns.ICON };
@@ -163,7 +164,8 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
runOnUiThread(new Runnable() {
@Override
public void run() {
- boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
+ boolean isRecording = recordingTrackId
+ != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
updateMenuItems(isRecording);
resourceCursorAdapter.notifyDataSetChanged();
trackController.update(isRecording, recordingTrackPaused);
@@ -428,28 +430,21 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
// Update track data hub
handleStartGps();
-
+
// Update UI
boolean isRecording = recordingTrackId != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
updateMenuItems(isRecording);
resourceCursorAdapter.notifyDataSetChanged();
trackController.update(isRecording, recordingTrackPaused);
-
- // Check Google Play Services
- int code = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
- if (code != ConnectionResult.SUCCESS) {
- Dialog dialog = GooglePlayServicesUtil.getErrorDialog(code, this, 0);
- dialog.show();
- }
}
-
+
@Override
protected void onPause() {
super.onPause();
// Update track data hub
trackDataHub.unregisterTrackDataListener(trackDataListener);
-
+
// Update UI
trackController.stop();
}
@@ -474,6 +469,15 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
outState.putBoolean(START_GPS_KEY, startGps);
}
+ @Override
+ protected void onActivityResult(int requestCode, int resultCode, Intent data) {
+ if (requestCode == GOOGLE_PLAY_SERVICES_REQUEST_CODE) {
+ checkGooglePlayServices();
+ } else {
+ super.onActivityResult(requestCode, resultCode, data);
+ }
+ }
+
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.track_list, menu);
@@ -595,19 +599,31 @@ public class TrackListActivity extends FragmentActivity implements DeleteOneTrac
new WelcomeDialogFragment().show(
getSupportFragmentManager(), WelcomeDialogFragment.WELCOME_DIALOG_TAG);
}
- } else if (EulaUtils.getShowCheckUnits(this)) {
- Fragment fragment = getSupportFragmentManager()
- .findFragmentByTag(CheckUnitsDialogFragment.CHECK_UNITS_DIALOG_TAG);
- if (fragment == null) {
- new CheckUnitsDialogFragment().show(
- getSupportFragmentManager(), CheckUnitsDialogFragment.CHECK_UNITS_DIALOG_TAG);
- }
} else {
/*
* Before the welcome sequence, the empty view is not visible so that it
* doesn't show through.
*/
findViewById(R.id.track_list_empty_view).setVisibility(View.VISIBLE);
+
+ checkGooglePlayServices();
+ }
+ }
+
+ private void checkGooglePlayServices() {
+ int code = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);
+ if (code != ConnectionResult.SUCCESS) {
+ Dialog dialog = GooglePlayServicesUtil.getErrorDialog(
+ code, this, GOOGLE_PLAY_SERVICES_REQUEST_CODE, new DialogInterface.OnCancelListener() {
+
+ @Override
+ public void onCancel(DialogInterface dialogInterface) {
+ finish();
+ }
+ });
+ if (dialog != null) {
+ dialog.show();
+ }
}
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/CheckUnitsDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/CheckUnitsDialogFragment.java
deleted file mode 100644
index 3d9b9addd..000000000
--- a/MyTracks/src/com/google/android/apps/mytracks/fragments/CheckUnitsDialogFragment.java
+++ /dev/null
@@ -1,81 +0,0 @@
-/*
- * Copyright 2012 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.fragments;
-
-import com.google.android.apps.mytracks.TrackListActivity;
-import com.google.android.apps.mytracks.util.EulaUtils;
-import com.google.android.apps.mytracks.util.PreferencesUtils;
-import com.google.android.maps.mytracks.R;
-
-import android.app.AlertDialog;
-import android.app.Dialog;
-import android.content.DialogInterface;
-import android.os.Bundle;
-import android.support.v4.app.DialogFragment;
-import android.support.v4.app.FragmentActivity;
-
-import java.util.Locale;
-
-/**
- * A DialogFragment to check preferred units.
- *
- * @author Jimmy Shih
- */
-public class CheckUnitsDialogFragment extends DialogFragment {
-
- public static final String CHECK_UNITS_DIALOG_TAG = "checkUnitsDialog";
-
- private FragmentActivity activity;
-
- @Override
- public void onCancel(DialogInterface arg0) {
- onDone();
- }
-
- @Override
- public Dialog onCreateDialog(Bundle savedInstanceState) {
- activity = getActivity();
-
- Locale defaultLocale = Locale.getDefault();
- boolean defaultMetric = !defaultLocale.equals(Locale.US) && !defaultLocale.equals(Locale.UK);
- PreferencesUtils.setBoolean(activity, R.string.metric_units_key, defaultMetric);
- final String metric = getString(R.string.settings_stats_units_metric);
- final String imperial = getString(R.string.settings_stats_units_imperial);
- final CharSequence[] items = defaultMetric ? new CharSequence[] { metric, imperial }
- : new CharSequence[] { imperial, metric };
- return new AlertDialog.Builder(activity).setPositiveButton(
- R.string.generic_ok, new DialogInterface.OnClickListener() {
- @Override
- public void onClick(DialogInterface dialog, int which) {
- int position = ((AlertDialog) dialog).getListView().getCheckedItemPosition();
- PreferencesUtils.setBoolean(
- activity, R.string.metric_units_key, items[position].equals(metric));
- onDone();
- }
- }).setSingleChoiceItems(items, 0, null).setTitle(R.string.settings_stats_units_title)
- .create();
- }
-
- /**
- * Tasks to perform when done.
- */
- private void onDone() {
- EulaUtils.setShowCheckUnits(activity);
- TrackListActivity trackListActivity = (TrackListActivity) activity;
- trackListActivity.showStartupDialogs();
- }
-}
\ No newline at end of file
diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java
new file mode 100644
index 000000000..bbdefd619
--- /dev/null
+++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/ConfirmPlayDialogFragment.java
@@ -0,0 +1,102 @@
+/*
+ * Copyright 2012 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.fragments;
+
+import com.google.android.apps.mytracks.io.file.SaveActivity;
+import com.google.android.apps.mytracks.io.file.TrackWriterFactory.TrackFileFormat;
+import com.google.android.apps.mytracks.util.AnalyticsUtils;
+import com.google.android.apps.mytracks.util.IntentUtils;
+import com.google.android.apps.mytracks.util.PreferencesUtils;
+import com.google.android.maps.mytracks.R;
+
+import android.app.AlertDialog;
+import android.app.Dialog;
+import android.content.DialogInterface;
+import android.content.Intent;
+import android.os.Bundle;
+import android.os.Parcelable;
+import android.support.v4.app.DialogFragment;
+import android.support.v4.app.FragmentActivity;
+import android.view.View;
+import android.widget.CheckBox;
+import android.widget.TextView;
+
+/**
+ * A DialogFragment to confirm play in Google Earth.
+ *
+ * @author Jimmy Shih
+ */
+public class ConfirmPlayDialogFragment extends DialogFragment {
+
+ public static final String CONFIRM_PLAY_DIALOG_TAG = "confirmPlayDialog";
+ private static final String KEY_TRACK_ID = "trackId";
+
+ private FragmentActivity activity;
+ private CheckBox checkBox;
+
+ public static ConfirmPlayDialogFragment newInstance(long trackId) {
+ Bundle bundle = new Bundle();
+ bundle.putLong(KEY_TRACK_ID, trackId);
+
+ ConfirmPlayDialogFragment confirmPlayDialogFragment = new ConfirmPlayDialogFragment();
+ confirmPlayDialogFragment.setArguments(bundle);
+ return confirmPlayDialogFragment;
+ }
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+ activity = getActivity();
+ if (!PreferencesUtils.getBoolean(getActivity(), R.string.show_confirm_play_earth_dialog_key,
+ PreferencesUtils.SHOW_CONFIRM_PLAY_DIALOG_DEFAULT)) {
+ dismiss();
+ playTrack();
+ }
+ }
+
+ private void playTrack() {
+ long trackId = getArguments().getLong(KEY_TRACK_ID);
+ AnalyticsUtils.sendPageViews(activity, "/action/play");
+ Intent intent = IntentUtils.newIntent(activity, SaveActivity.class)
+ .putExtra(SaveActivity.EXTRA_TRACK_ID, trackId)
+ .putExtra(SaveActivity.EXTRA_TRACK_FILE_FORMAT, (Parcelable) TrackFileFormat.KML)
+ .putExtra(SaveActivity.EXTRA_PLAY_TRACK, true);
+ startActivity(intent);
+ }
+
+ @Override
+ public Dialog onCreateDialog(Bundle savedInstanceState) {
+ View view = activity.getLayoutInflater().inflate(R.layout.confirm_dialog, null);
+ TextView textView = (TextView) view.findViewById(R.id.confirm_dialog_message);
+ textView.setText(R.string.track_detail_play_confirm_message);
+ checkBox = (CheckBox) view.findViewById(R.id.confirm_dialog_check_box);
+
+ return new AlertDialog.Builder(activity)
+ .setNegativeButton(android.R.string.cancel, null)
+ .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ PreferencesUtils.setBoolean(
+ activity, R.string.show_confirm_play_earth_dialog_key, !checkBox.isChecked());
+ playTrack();
+ }
+ })
+ .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/EulaDialogFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java
index 1e06fba4c..75f758421 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/EulaDialogFragment.java
@@ -18,6 +18,7 @@ package com.google.android.apps.mytracks.fragments;
import com.google.android.apps.mytracks.TrackListActivity;
import com.google.android.apps.mytracks.util.EulaUtils;
+import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R;
import android.app.AlertDialog;
@@ -27,6 +28,8 @@ import android.os.Bundle;
import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity;
+import java.util.Locale;
+
/**
* A DialogFragment to show EULA.
*
@@ -84,6 +87,8 @@ public class EulaDialogFragment extends DialogFragment {
@Override
public void onClick(DialogInterface dialog, int which) {
EulaUtils.setAcceptEula(activity);
+ PreferencesUtils.setBoolean(
+ activity, R.string.metric_units_key, !Locale.US.equals(Locale.getDefault()));
TrackListActivity trackListActivity = (TrackListActivity) activity;
trackListActivity.showStartupDialogs();
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/SaveActivity.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/SaveActivity.java
index f36cf5f7c..413792b48 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/io/file/SaveActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/SaveActivity.java
@@ -120,14 +120,14 @@ public class SaveActivity extends Activity {
@Override
public void onCancel(DialogInterface dialog) {
dialog.dismiss();
- onPostResultDialog();
+ finish();
}
})
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int arg1) {
dialog.dismiss();
- onPostResultDialog();
+ finish();
}
})
.setTitle(success ? R.string.generic_success_title : R.string.generic_error_title);
@@ -163,7 +163,17 @@ public class SaveActivity extends Activity {
this.messageId = aMessageId;
this.savedPath = aSavedPath;
removeDialog(DIALOG_PROGRESS_ID);
- showDialog(DIALOG_RESULT_ID);
+ if (success && playTrack && savedPath != null) {
+ Intent intent = new Intent()
+ .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
+ .putExtra(GOOGLE_EARTH_TOUR_FEATURE_ID, KmlTrackWriter.TOUR_FEATURE_ID)
+ .setClassName(GOOGLE_EARTH_PACKAGE, GOOGLE_EARTH_CLASS)
+ .setDataAndType(Uri.fromFile(new File(savedPath)), GOOGLE_EARTH_KML_MIME_TYPE);
+ startActivity(intent);
+ finish();
+ } else {
+ showDialog(DIALOG_RESULT_ID);
+ }
}
/**
@@ -186,19 +196,4 @@ public class SaveActivity extends Activity {
progressDialog.setProgress(Math.min(number, max));
}
}
-
- /**
- * To be invoked after showing the result dialog.
- */
- private void onPostResultDialog() {
- if (success && playTrack && savedPath != null) {
- Intent intent = new Intent()
- .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_NEW_TASK)
- .putExtra(GOOGLE_EARTH_TOUR_FEATURE_ID, KmlTrackWriter.TOUR_FEATURE_ID)
- .setClassName(GOOGLE_EARTH_PACKAGE, GOOGLE_EARTH_CLASS)
- .setDataAndType(Uri.fromFile(new File(savedPath)), GOOGLE_EARTH_KML_MIME_TYPE);
- startActivity(intent);
- }
- finish();
- }
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsFeature.java b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsFeature.java
index d8f8c7fa5..93439a3b0 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsFeature.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsFeature.java
@@ -1,7 +1,7 @@
// Copyright 2009 Google Inc. All Rights Reserved.
package com.google.android.apps.mytracks.io.gdata.maps;
-import com.google.android.maps.GeoPoint;
+import android.location.Location;
import java.util.Random;
import java.util.Vector;
@@ -32,18 +32,9 @@ public class MapsFeature {
/** The local feature id for this feature, if needed. */
private String androidId;
- /**
- * The latitudes of the points of this feature in order, specified in
- * millionths of a degree north.
- */
- private final Vector latitudeE6 = new Vector();
-
- /**
- * The longitudes of the points of this feature in order, specified in
- * millionths of a degree east.
- */
- private final Vector longitudeE6 = new Vector();
-
+ // Points of this feature in order.
+ private final Vector points = new Vector();
+
/** The metadata of this feature in a format efficient for transmission. */
private MapsFeatureMetadata featureInfo = new MapsFeatureMetadata();
@@ -60,11 +51,10 @@ public class MapsFeature {
/**
* Adds a new point to the end of this feature.
*
- * @param point The new point to add
+ * @param location the new point to add
*/
- public void addPoint(GeoPoint point) {
- latitudeE6.add(point.getLatitudeE6());
- longitudeE6.add(point.getLongitudeE6());
+ public void addPoint(Location location) {
+ points.add(location);
}
/**
@@ -107,26 +97,22 @@ public class MapsFeature {
}
/**
- * Retrieves the point at the given index for this feature.
+ * Gets the point at a given index.
*
- * @param index The index of the point desired
- * @return A {@link GeoPoint} representing the point or null if that point
- * doesn't exist
+ * @param index the index
*/
- public GeoPoint getPoint(int index) {
- if (latitudeE6.size() <= index) {
+ public Location getPoint(int index) {
+ if (index >= points.size()) {
return null;
}
- return new GeoPoint(latitudeE6.get(index), longitudeE6.get(index));
+ return points.get(index);
}
-
+
/**
- * Counts the number of points in this feature and return that count.
- *
- * @return The number of points in this feature
+ * Gets the number of points.
*/
public int getPointCount() {
- return latitudeE6.size();
+ return points.size();
}
/**
diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsGDataConverter.java b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsGDataConverter.java
index fdbfa87c2..a515969d1 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsGDataConverter.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/io/gdata/maps/MapsGDataConverter.java
@@ -127,9 +127,9 @@ public class MapsGDataConverter {
if (i > 0) {
pointBuilder.append('\n');
}
- pointBuilder.append(feature.getPoint(i).getLongitudeE6() / 1e6);
+ pointBuilder.append(feature.getPoint(i).getLongitude());
pointBuilder.append(',');
- pointBuilder.append(feature.getPoint(i).getLatitudeE6() / 1e6);
+ pointBuilder.append(feature.getPoint(i).getLatitude());
pointBuilder.append(",0.000000");
}
String pointString = pointBuilder.toString();
@@ -157,9 +157,9 @@ public class MapsGDataConverter {
xmlSerializer.endTag(null, "tessellate");
xmlSerializer.startTag(null, "coordinates");
xmlSerializer.text(pointString + "\n"
- + Double.toString(feature.getPoint(0).getLongitudeE6() / 1e6)
+ + Double.toString(feature.getPoint(0).getLongitude())
+ ","
- + Double.toString(feature.getPoint(0).getLatitudeE6() / 1e6)
+ + Double.toString(feature.getPoint(0).getLatitude())
+ ",0.000000");
xmlSerializer.endTag(null, "coordinates");
xmlSerializer.endTag(null, "LinearRing");
diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/maps/SendMapsUtils.java b/MyTracks/src/com/google/android/apps/mytracks/io/maps/SendMapsUtils.java
index 9a9ee09c7..f930039ae 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/io/maps/SendMapsUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/io/maps/SendMapsUtils.java
@@ -21,7 +21,6 @@ import com.google.android.apps.mytracks.io.gdata.maps.MapsClient;
import com.google.android.apps.mytracks.io.gdata.maps.MapsFeature;
import com.google.android.apps.mytracks.io.gdata.maps.MapsGDataConverter;
import com.google.android.apps.mytracks.io.gdata.maps.MapsMapMetadata;
-import com.google.android.maps.GeoPoint;
import com.google.common.annotations.VisibleForTesting;
import com.google.wireless.gdata.client.HttpException;
import com.google.wireless.gdata.data.Entry;
@@ -108,7 +107,7 @@ public class SendMapsUtils {
MapsGDataConverter mapsGDataConverter) throws ParseException, HttpException, IOException {
String featuresFeed = MapsClient.getFeaturesFeed(mapId);
MapsFeature mapsFeature = buildMapsMarkerFeature(
- title, description, iconUrl, getGeoPoint(location));
+ title, description, iconUrl, location);
Entry entry = mapsGDataConverter.getEntryForFeature(mapsFeature);
try {
mapsClient.createEntry(featuresFeed, authToken, entry);
@@ -135,7 +134,7 @@ public class SendMapsUtils {
throws ParseException, HttpException, IOException {
String featuresFeed = MapsClient.getFeaturesFeed(mapId);
MapsFeature feature = buildMapsMarkerFeature(waypoint.getName(), waypoint.getDescription(),
- waypoint.getIcon(), getGeoPoint(waypoint.getLocation()));
+ waypoint.getIcon(), waypoint.getLocation());
Entry entry = mapsGDataConverter.getEntryForFeature(feature);
try {
mapsClient.createEntry(featuresFeed, authToken, entry);
@@ -179,11 +178,11 @@ public class SendMapsUtils {
* @param title feature title
* @param description the feature description
* @param iconUrl the feature icon URL
- * @param geoPoint the marker
+ * @param location the marker
*/
@VisibleForTesting
static MapsFeature buildMapsMarkerFeature(
- String title, String description, String iconUrl, GeoPoint geoPoint) {
+ String title, String description, String iconUrl, Location location) {
MapsFeature mapsFeature = new MapsFeature();
mapsFeature.setType(MapsFeature.MARKER);
mapsFeature.generateAndroidId();
@@ -191,7 +190,7 @@ public class SendMapsUtils {
mapsFeature.setTitle(TextUtils.isEmpty(title) ? EMPTY_TITLE : title);
mapsFeature.setDescription(description.replaceAll("\n", "
"));
mapsFeature.setIconUrl(iconUrl);
- mapsFeature.addPoint(geoPoint);
+ mapsFeature.addPoint(location);
return mapsFeature;
}
@@ -210,19 +209,8 @@ public class SendMapsUtils {
mapsFeature.setTitle(TextUtils.isEmpty(title) ? EMPTY_TITLE : title);
mapsFeature.setColor(LINE_COLOR);
for (Location location : locations) {
- mapsFeature.addPoint(getGeoPoint(location));
+ mapsFeature.addPoint(location);
}
return mapsFeature;
}
-
- /**
- * Gets a {@link GeoPoint} from a {@link Location}.
- *
- * @param location the location
- */
- @VisibleForTesting
- static GeoPoint getGeoPoint(Location location) {
- return new GeoPoint(
- (int) (location.getLatitude() * 1E6), (int) (location.getLongitude() * 1E6));
- }
}
diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/ConfirmSharingActivity.java b/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/ConfirmSharingActivity.java
index fee36ce7a..73227b0c9 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/ConfirmSharingActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/io/sendtogoogle/ConfirmSharingActivity.java
@@ -60,13 +60,13 @@ public class ConfirmSharingActivity extends Activity {
if (id != DIALOG_ID) {
return null;
}
- View view = getLayoutInflater().inflate(R.layout.confirm_sharing, null);
+ View view = getLayoutInflater().inflate(R.layout.confirm_dialog, null);
- TextView textView = (TextView) view.findViewById(R.id.confirm_sharing_text_view);
+ TextView textView = (TextView) view.findViewById(R.id.confirm_dialog_message);
textView.setText(StringUtils.getHtml(
this, R.string.share_track_confirm_message, R.string.maps_public_unlisted_url));
- checkBox = (CheckBox) view.findViewById(R.id.confirm_sharing_check_box);
+ checkBox = (CheckBox) view.findViewById(R.id.confirm_dialog_check_box);
DialogInterface.OnClickListener okListener = new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int button) {
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/EulaUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/EulaUtils.java
index 29269a459..733f17ba2 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/EulaUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/EulaUtils.java
@@ -31,7 +31,6 @@ public class EulaUtils {
// Accepting Google mobile terms of service
private static final String ACCEPT_EULA_PREFERENCE_KEY = "eula.google_mobile_tos_accepted";
private static final String SHOW_WELCOME_PREFERENCE_KEY = "showWelcome";
- private static final String SHOW_CHECK_UNITS_PREFERENCE_KEY = "showCheckUnits";
private EulaUtils() {}
@@ -50,15 +49,7 @@ public class EulaUtils {
public static void setShowWelcome(Context context) {
setValue(context, SHOW_WELCOME_PREFERENCE_KEY, false);
}
-
- public static boolean getShowCheckUnits(Context context) {
- return getValue(context, SHOW_CHECK_UNITS_PREFERENCE_KEY, true);
- }
-
- public static void setShowCheckUnits(Context context) {
- setValue(context, SHOW_CHECK_UNITS_PREFERENCE_KEY, false);
- }
-
+
private static boolean getValue(Context context, String key, boolean defaultValue) {
SharedPreferences sharedPreferences = context.getSharedPreferences(
EULA_PREFERENCE_FILE, Context.MODE_PRIVATE);
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/GeoRect.java b/MyTracks/src/com/google/android/apps/mytracks/util/GeoRect.java
deleted file mode 100644
index 6605f1453..000000000
--- a/MyTracks/src/com/google/android/apps/mytracks/util/GeoRect.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Copyright 2009 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.GeoPoint;
-
-/**
- * A rectangle in geographical space.
- */
-public class GeoRect {
- public int top;
- public int left;
- public int bottom;
- public int right;
-
- public GeoRect() {
- top = 0;
- left = 0;
- bottom = 0;
- right = 0;
- }
-
- public GeoRect(GeoPoint center, int latSpan, int longSpan) {
- top = center.getLatitudeE6() - latSpan / 2;
- left = center.getLongitudeE6() - longSpan / 2;
- bottom = center.getLatitudeE6() + latSpan / 2;
- right = center.getLongitudeE6() + longSpan / 2;
- }
-
- public GeoPoint getCenter() {
- return new GeoPoint(top / 2 + bottom / 2, left / 2 + right / 2);
- }
-
- public int getLatSpan() {
- return bottom - top;
- }
-
- public int getLongSpan() {
- return right - left;
- }
-
- public boolean contains(GeoPoint geoPoint) {
- if (geoPoint.getLatitudeE6() >= top
- && geoPoint.getLatitudeE6() <= bottom
- && geoPoint.getLongitudeE6() >= left
- && geoPoint.getLongitudeE6() <= right) {
- return true;
- }
- return false;
- }
-}
\ No newline at end of file
diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java
index 8107ca8c7..b9f2b116f 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/util/LocationUtils.java
@@ -17,33 +17,32 @@ package com.google.android.apps.mytracks.util;
import com.google.android.apps.mytracks.Constants;
import com.google.android.apps.mytracks.content.Track;
-import com.google.android.apps.mytracks.stats.TripStatistics;
-import com.google.android.maps.GeoPoint;
import android.location.Location;
import android.util.Log;
import java.util.ArrayList;
-import java.util.List;
import java.util.Stack;
/**
* Utility class for decimating tracks at a given level of precision.
- *
+ *
* @author Leif Hendrik Wilden
*/
public class LocationUtils {
+
+ private LocationUtils() {}
+
/**
* Computes the distance on the two sphere between the point c0 and the line
* segment c1 to c2.
- *
+ *
* @param c0 the first coordinate
* @param c1 the beginning of the line segment
* @param c2 the end of the lone segment
* @return the distance in m (assuming spherical earth)
*/
- public static double distance(
- final Location c0, final Location c1, final Location c2) {
+ private static double distance(final Location c0, final Location c1, final Location c2) {
if (c1.equals(c2)) {
return c2.distanceTo(c0);
}
@@ -57,9 +56,8 @@ public class LocationUtils {
double s2s1lat = s2lat - s1lat;
double s2s1lng = s2lng - s1lng;
- final double u =
- ((s0lat - s1lat) * s2s1lat + (s0lng - s1lng) * s2s1lng)
- / (s2s1lat * s2s1lat + s2s1lng * s2s1lng);
+ final double u = ((s0lat - s1lat) * s2s1lat + (s0lng - s1lng) * s2s1lng)
+ / (s2s1lat * s2s1lat + s2s1lng * s2s1lng);
if (u <= 0) {
return c0.distanceTo(c1);
}
@@ -78,13 +76,13 @@ public class LocationUtils {
/**
* Decimates the given locations for a given zoom level. This uses a
* Douglas-Peucker decimation algorithm.
- *
+ *
* @param tolerance in meters
* @param locations input
* @param decimated output
*/
- public static void decimate(double tolerance, ArrayList locations,
- ArrayList decimated) {
+ private static void decimate(
+ double tolerance, ArrayList locations, ArrayList decimated) {
final int n = locations.size();
if (n < 1) {
return;
@@ -100,16 +98,14 @@ public class LocationUtils {
int[] current;
if (n > 2) {
- int[] stackVal = new int[] {0, (n - 1)};
+ int[] stackVal = new int[] { 0, (n - 1) };
stack.push(stackVal);
while (stack.size() > 0) {
current = stack.pop();
maxDist = 0;
for (idx = current[0] + 1; idx < current[1]; ++idx) {
dist = LocationUtils.distance(
- locations.get(idx),
- locations.get(current[0]),
- locations.get(current[1]));
+ locations.get(idx), locations.get(current[0]), locations.get(current[1]));
if (dist > maxDist) {
maxDist = dist;
maxIdx = idx;
@@ -117,9 +113,9 @@ public class LocationUtils {
}
if (maxDist > tolerance) {
dists[maxIdx] = maxDist;
- int[] stackValCurMax = {current[0], maxIdx};
+ int[] stackValCurMax = { current[0], maxIdx };
stack.push(stackValCurMax);
- int[] stackValMaxCur = {maxIdx, current[1]};
+ int[] stackValMaxCur = { maxIdx, current[1] };
stack.push(stackValMaxCur);
}
}
@@ -135,13 +131,12 @@ public class LocationUtils {
}
idx++;
}
- Log.d(Constants.TAG, "Decimating " + n + " points to " + i
- + " w/ tolerance = " + tolerance);
+ Log.d(Constants.TAG, "Decimating " + n + " points to " + i + " w/ tolerance = " + tolerance);
}
/**
* Decimates the given track for the given precision.
- *
+ *
* @param track a track
* @param precision desired precision in meters
*/
@@ -151,73 +146,12 @@ public class LocationUtils {
track.setLocations(decimated);
}
- /**
- * Limits number of points by dropping any points beyond the given number of
- * points. Note: That'll actually discard points.
- *
- * @param track a track
- * @param numberOfPoints maximum number of points
- */
- public static void cut(Track track, int numberOfPoints) {
- ArrayList locations = track.getLocations();
- while (locations.size() > numberOfPoints) {
- locations.remove(locations.size() - 1);
- }
- }
-
- /**
- * Splits a track in multiple tracks where each piece has less or equal than
- * maxPoints.
- *
- * @param track the track to split
- * @param maxPoints maximum number of points for each piece
- * @return a list of one or more track pieces
- */
- public static ArrayList