String cleanups and responded to most comments.

This commit is contained in:
leifhendrik
2011-01-11 12:29:22 -08:00
parent a68cdaf2ba
commit 08339a1f65
22 changed files with 244 additions and 448 deletions
+2 -8
View File
@@ -56,11 +56,6 @@ limitations under the License.
android:label="MyTracks" android:label="MyTracks"
android:exported="false" /> android:exported="false" />
<activity android:name="com.google.android.apps.mymaps.MyMapsList"
android:label="@string/map_list_title"
android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|fontScale"
android:exported="false" />
<activity android:name="com.google.android.apps.mytracks.MyTracksList" <activity android:name="com.google.android.apps.mytracks.MyTracksList"
android:label="Recorded Tracks" /> android:label="Recorded Tracks" />
@@ -157,12 +152,11 @@ limitations under the License.
<uses-permission android:name="com.google.android.apps.mytracks.WRITE_TRACK_DATA" /> <uses-permission android:name="com.google.android.apps.mytracks.WRITE_TRACK_DATA" />
<uses-permission android:name="com.google.android.apps.mytracks.TRACK_NOTIFICATIONS" /> <uses-permission android:name="com.google.android.apps.mytracks.TRACK_NOTIFICATIONS" />
<!-- Features required <!-- Features required -->
<uses-feature android:name="android.hardware.location" android:required="true"/> <uses-feature android:name="android.hardware.location" android:required="true"/>
<uses-feature android:name="android.hardware.location.gps" android:required="true"/> <uses-feature android:name="android.hardware.location.gps" android:required="true"/>
<uses-feature android:name="android.hardware.touchscreen" android:required="true"/> <uses-feature android:name="android.hardware.touchscreen" android:required="true"/>
-->
<!-- Features optional --> <!-- Features optional -->
<uses-feature android:name="android.hardware.bluetooth" android:required="false"/> <uses-feature android:name="android.hardware.bluetooth" android:required="false"/>
<uses-feature android:name="android.hardware.location.network" android:required="false"/> <uses-feature android:name="android.hardware.location.network" android:required="false"/>
-103
View File
@@ -1,103 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
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.
-->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apl/res/com.google.android.maps"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent">
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_bar"
android:layout_weight="0"
android:padding="3dip">
<TextView android:id="@+id/message"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textSize="16dip"
android:textColor="#fff"
android:text="@string/select_map_message"
android:layout_weight="0"/>
</LinearLayout>
<ListView android:id="@+id/maplist"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<TextView android:id="@+id/mapslist_empty"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:gravity="center"
android:padding="3dip"
android:textSize="16dip"
android:textColor="#c00"
android:textStyle="bold"
android:text="@string/mapslist_no_maps_available"
android:visibility="gone"/>
<TextView android:id="@+id/failed"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:gravity="center"
android:padding="3dip"
android:textSize="16dip"
android:textColor="#c00"
android:textStyle="bold"
android:text="@string/maps_list_failed"
android:visibility="gone"/>
<LinearLayout
android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@drawable/list_bar"
android:layout_weight="0"
android:padding="3dip">
<LinearLayout android:id="@+id/loading"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="3dip"
android:layout_gravity="center">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
<ProgressBar
android:layout_height="20dip"
android:layout_width="20dip"
android:layout_gravity="center"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:paddingLeft="3dip"
android:textSize="16dip"
android:textColor="#fff"
android:textStyle="bold"
android:text="@string/maps_list_loading"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"/>
</LinearLayout>
</LinearLayout>
+4 -21
View File
@@ -104,6 +104,9 @@ limitations under the License.
<string name="success">Fet</string> <string name="success">Fet</string>
<string name="waypoint">Punt de referència</string> <string name="waypoint">Punt de referència</string>
<string name="cancel">Cancel·la</string> <string name="cancel">Cancel·la</string>
<string name="close">Tanca</string>
<string name="edit">Edita</string>
<string name="save">Desa</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Inici)</string> <string name="start">(Inici)</string>
@@ -241,27 +244,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">Satèl·lits GPS</string> <string name="mytracks_sky">Satèl·lits GPS</string>
<!-- My Maps -->
<string name="select_map_message">Seleccioneu un mapa del vostre compte:</string>
<string name="create_new_map">Crea un mapa nou...</string>
<string name="map_list_title">Envia a Google My Maps</string>
<string name="maps_list_loading">S\'estan carregant els mapes...</string>
<string name="maps_list_failed">No s\'han pogut carregar els vostres mapes en aquest moment</string>
<string name="open_map">Selecciona aquest mapa</string>
<string name="edit_map_details">Edita els detalls del mapa</string>
<string name="share_map">Comparteix el mapa amb amics</string>
<string name="share_track">Comparteix la ruta amb amics</string>
<string name="delete_map">Elimina el mapa del vostre compte</string>
<string name="map_title">Títol del mapa:</string>
<string name="map_description">Descripció del mapa:</string>
<string name="map_searchable_edit">Fes que aquest mapa i els seus continguts apareguen als resultats de cerca</string>
<string name="map_not_searchable_edit">No permetis que aquest mapa ni els seus continguts es mostrin als resultats de cerca, tot i que sí es podrà visualitzar per altres amb l\'adreça URL directa</string>
<string name="map_searchable">Aquest mapa i els seus continguts es mostraran als resultats de cerca</string>
<string name="map_not_searchable">Ni els mapes ni els seus continguts es mostraran als resultats de cerca, però podran visualitzar-se per altres a través d\'un enllaç directe.</string>
<string name="close">Tanca</string>
<string name="edit">Edita</string>
<string name="save">Desa</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">M\'agradaria compartir un mapa amb tu</string> <string name="share_map_subject">M\'agradaria compartir un mapa amb tu</string>
<string name="share_map_body_format">Crec que estaràs interessat en aquest mapa: <string name="share_map_body_format">Crec que estaràs interessat en aquest mapa:
@@ -271,6 +253,7 @@ limitations under the License.
<string name="send_track_body_format">Crec que estaràs interessat en aquesta ruta. <string name="send_track_body_format">Crec que estaràs interessat en aquesta ruta.
Per verue aquesta ruta fes servir Google Earth o altre programari de mapes.</string> Per verue aquesta ruta fes servir Google Earth o altre programari de mapes.</string>
<string name="share_track">Comparteix la ruta amb amics</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">Públic</string> <string name="public_map">Públic</string>
+7
View File
@@ -97,6 +97,8 @@ limitations under the License.
<string name="success">Erfolgreich</string> <string name="success">Erfolgreich</string>
<string name="waypoint">Wegpunkt</string> <string name="waypoint">Wegpunkt</string>
<string name="cancel">Abbrechen</string> <string name="cancel">Abbrechen</string>
<string name="edit">Bearbeiten</string>
<string name="save">Sichern</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Anfang)</string> <string name="start">(Anfang)</string>
@@ -202,6 +204,11 @@ limitations under the License.
%s.</string> %s.</string>
<string name="share_track">Track mit Freunden teilen</string> <string name="share_track">Track mit Freunden teilen</string>
<!-- Visibility -->
<string name="public_map">Öffentlich</string>
<string name="unlisted_map">Nicht in Suchergebnissen enthalten.</string>
<string name="mapslist_no_maps_available">Du hast noch keine Karten.</string>
<!-- Statistics View --> <!-- Statistics View -->
<!-- Average Moving --> <!-- Average Moving -->
<string name="average_moving_speed_label">Durchschnitt in Bew.</string> <string name="average_moving_speed_label">Durchschnitt in Bew.</string>
+4
View File
@@ -207,6 +207,10 @@ limitations under the License.
Para ver este recorrido usa Google Earth o algún otro software de mapeo.</string> Para ver este recorrido usa Google Earth o algún otro software de mapeo.</string>
<string name="share_track">Compartir recorrido con amigos</string> <string name="share_track">Compartir recorrido con amigos</string>
<!-- Visibility -->
<string name="public_map">Público</string>
<string name="unlisted_map">No listado</string>
<string name="mapslist_no_maps_available">Aún no tienes ningún mapa.</string>
<!-- Statistics View --> <!-- Statistics View -->
<!-- Average Moving --> <!-- Average Moving -->
+5 -21
View File
@@ -100,6 +100,9 @@ limitations under the License.
<string name="error">Erreur</string> <string name="error">Erreur</string>
<string name="waypoint">Point de passage</string> <string name="waypoint">Point de passage</string>
<string name="cancel">Annuler</string> <string name="cancel">Annuler</string>
<string name="close">Fermer</string>
<string name="edit">Modifier</string>
<string name="save">Enregistrer</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Début)</string> <string name="start">(Début)</string>
@@ -194,28 +197,8 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">Satellites GPS</string> <string name="mytracks_sky">Satellites GPS</string>
<!-- MyMaps -->
<string name="select_map_message">Choisissez une carte de votre compte :</string>
<string name="create_new_map">Création d\'une nouvelle carte en cours...</string>
<string name="map_list_title">Envoyer à Google Mes cartes</string>
<string name="maps_list_loading">Chargements de vos cartes...</string>
<string name="maps_list_failed">Vos cartes n\'ont pu être chargées</string>
<string name="open_map">Sélectionnez la carte</string>
<string name="edit_map_details">Consulter les détails de la carte</string>
<string name="share_map">Partager.</string>
<string name="share_track">Partager des parcours.</string>
<string name="delete_map">Supprimer la carte de votre compte.</string>
<string name="map_title">Titre de la carte :</string>
<string name="map_description">Description de la carte :</string>
<string name="map_searchable_edit">Rendre cette carte et son contenu visibles dans les résultats de recherche.</string>
<string name="map_not_searchable_edit">Ne pas inclure cette carte et sont contenu dans les résultats de recherche. Ils seront cependant consultables par d\'autres utilisateurs en utilisant l\'adresse URL exacte</string>
<string name="map_searchable">Cette carte et son contenu seront visibles dans les résultats de recherche</string>
<string name="map_not_searchable">Ni cette carte, ni son contenu seront visible dans les résultats de recherche, mais ils seront consultables en utilisant l\'adresse URL exacte</string>
<string name="close">Fermer</string>
<string name="edit">Modifier</string>
<string name="save">Enregistrer</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map">Partager.</string>
<string name="share_map_subject">Je voudrais partager ma carte avec vous</string> <string name="share_map_subject">Je voudrais partager ma carte avec vous</string>
<string name="share_map_body_format">Je pense que cette carte vous intéressera : <string name="share_map_body_format">Je pense que cette carte vous intéressera :
@@ -224,6 +207,7 @@ limitations under the License.
<string name="send_track_body_format">Je pense que ce parcours vous intéressera. <string name="send_track_body_format">Je pense que ce parcours vous intéressera.
Pour voir ce parcours, utilisez Google Earth ou tout autre logiciel de cartographie.</string> Pour voir ce parcours, utilisez Google Earth ou tout autre logiciel de cartographie.</string>
<string name="share_track">Partager des parcours.</string>
<!-- Visibility --> <!-- Visibility -->
<string name="unlisted_map">Carte non listée</string> <string name="unlisted_map">Carte non listée</string>
+4 -21
View File
@@ -104,6 +104,9 @@ limitations under the License.
<string name="success">Successo</string> <string name="success">Successo</string>
<string name="waypoint">Punto di passaggio</string> <string name="waypoint">Punto di passaggio</string>
<string name="cancel">Annulla</string> <string name="cancel">Annulla</string>
<string name="close">Chiudi</string>
<string name="edit">Modifica</string>
<string name="save">Salva</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Inizio)</string> <string name="start">(Inizio)</string>
@@ -200,27 +203,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">Satelliti GPS</string> <string name="mytracks_sky">Satelliti GPS</string>
<!-- My Maps -->
<string name="select_map_message">Scegli una mappa dal tuo account:</string>
<string name="create_new_map">Crea una nuova mappa...</string>
<string name="map_list_title">Invia a «Le mie mappe» di Google</string>
<string name="maps_list_loading">Caricamento mappe in corso...</string>
<string name="maps_list_failed">Le tue mappe non possono momentaneamente essere caricate!</string>
<string name="open_map">Scegli questa mappa</string>
<string name="edit_map_details">Modifica dettagli della mappa</string>
<string name="share_map">Condividi la mappa con amici</string>
<string name="share_track">Condividi il percorso con amici</string>
<string name="delete_map">Elimina la mappa dal tuo account</string>
<string name="map_title">Titolo della mappa:</string>
<string name="map_description">Descrizione della mappa:</string>
<string name="map_searchable_edit">Rendi questa mappa e il suo contenuto visibili fra i risultati di ricerche</string>
<string name="map_not_searchable_edit">Rendi questa mappa e il suo contenuto invisibili fra i risultati di ricerche. Resteranno comunque visibili ad altri utilizzando l\'indirizzo URL esatto</string>
<string name="map_searchable">Questa mappa e il suo contenuto saranno visibili fra i risultati di ricerche</string>
<string name="map_not_searchable">Né questa mappa né il suo contenuto saranno visibili in risultati di ricerche, ma saranno comunque visibili ad altri tramite un link diretto.</string>
<string name="close">Chiudi</string>
<string name="edit">Modifica</string>
<string name="save">Salva</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">Vorrei condividere una mappa con te</string> <string name="share_map_subject">Vorrei condividere una mappa con te</string>
<string name="share_map_body_format">Credo che questa mappa potrebbe interessarti: <string name="share_map_body_format">Credo che questa mappa potrebbe interessarti:
@@ -230,6 +212,7 @@ limitations under the License.
<string name="send_track_body_format">Credo che questo percorso potrebbe interessarti. <string name="send_track_body_format">Credo che questo percorso potrebbe interessarti.
Per vedere questo percorso, usa Google Earth o un altro software di cartografia.</string> Per vedere questo percorso, usa Google Earth o un altro software di cartografia.</string>
<string name="share_track">Condividi il percorso con amici</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">Pubblica</string> <string name="public_map">Pubblica</string>
+4 -23
View File
@@ -102,6 +102,9 @@ limitations under the License.
<string name="success">成功</string> <string name="success">成功</string>
<string name="waypoint">ウェイポイント</string> <string name="waypoint">ウェイポイント</string>
<string name="cancel">キャンセル</string> <string name="cancel">キャンセル</string>
<string name="close">閉じる</string>
<string name="edit">編集</string>
<string name="save">保存</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(開始)</string> <string name="start">(開始)</string>
@@ -201,29 +204,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">GPS衛星</string> <string name="mytracks_sky">GPS衛星</string>
<!-- My Maps -->
<string name="select_map_message">ご使用のアカウントからのマップ選択:</string>
<string name="create_new_map">新規マップ...</string>
<string name="map_list_title">Googleマイマップへの送信</string>
<string name="maps_list_loading">マップの読み込み中...</string>
<string name="maps_list_failed">マップを読み込めませんでした!</string>
<string name="open_map">このマップを選択</string>
<string name="edit_map_details">マップ詳細の編集</string>
<string name="share_map">マップの共有</string>
<string name="share_track">トラックの共有</string>
<string name="delete_map">アカウントからマップの削除</string>
<string name="map_title">マップタイトル:</string>
<string name="map_description">マップ説明:</string>
<string name="map_searchable_edit">このマップとコンテンツを検索結果に表示させる</string>
<string name="map_not_searchable_edit">このマップとコンテンツはどちらも検索結果に表示させない(直接URLで他の方が見ることは可能)</string>
<string name="map_searchable">このマップとコンテンツは検索結果に表示されます</string>
<string name="map_not_searchable">このマップとコンテンツはどちらも検索結果に表示されませんが,直接リンクで他の方が見ることができます.</string>
<string name="close">閉じる</string>
<string name="edit">編集</string>
<string name="save">保存</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">マップを共有したいと思います</string> <string name="share_map_subject">マップを共有したいと思います</string>
<string name="share_map_body_format">このマップに興味を持って頂けると思います: <string name="share_map_body_format">このマップに興味を持って頂けると思います:
@@ -233,6 +213,7 @@ limitations under the License.
<string name="send_track_body_format">このトラックに興味を持って頂けると思います. <string name="send_track_body_format">このトラックに興味を持って頂けると思います.
このトラックを閲覧するには,Google Earthまたは他のマッピングソフトウェアが必要です.</string> このトラックを閲覧するには,Google Earthまたは他のマッピングソフトウェアが必要です.</string>
<string name="share_track">トラックの共有</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">公開</string> <string name="public_map">公開</string>
+4 -21
View File
@@ -103,6 +103,9 @@ limitations under the License.
<string name="success">Powodzenie</string> <string name="success">Powodzenie</string>
<string name="waypoint">Punkt orientacyjny</string> <string name="waypoint">Punkt orientacyjny</string>
<string name="cancel">Anuluj</string> <string name="cancel">Anuluj</string>
<string name="close">Zamknij</string>
<string name="edit">Edytuj</string>
<string name="save">Zapisz</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Początek)</string> <string name="start">(Początek)</string>
@@ -233,27 +236,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">Satelity GPS</string> <string name="mytracks_sky">Satelity GPS</string>
<!-- My Maps -->
<string name="select_map_message">Wybierz mapę z twojego konta:</string>
<string name="create_new_map">Utwórz nową mapę...</string>
<string name="map_list_title">Wyślij do Moich Map Google</string>
<string name="maps_list_loading">Wczytywanie map...</string>
<string name="maps_list_failed">Nie można wczytać twoich map!</string>
<string name="open_map">Wybierz tę mapę</string>
<string name="edit_map_details">Edytuj szczegóły mapy</string>
<string name="share_map">Podziel się mapą z przyjaciółmi</string>
<string name="share_track">Podziel się trasą z przyjaciółmi</string>
<string name="delete_map">Usuń mapę z twojego konta</string>
<string name="map_title">Tytuł mapy:</string>
<string name="map_description">Opis mapy:</string>
<string name="map_searchable_edit">Pokazuj tę pamę i jej zawartość w wynikach wyszukiwania</string>
<string name="map_not_searchable_edit">Nie pokazuj tej mapy i jej zawartości w wynikach wyszukiwania. Dostęp do mapy będzie ciągle możliwy poprzez odnośnik</string>
<string name="map_searchable">Ta mapa i jej zawartość będzie dostępna w wynikach wyszukiwania</string>
<string name="map_not_searchable">Mapa i jej zawartość nie będzie dostępna w wynikach wyszukiwania, ale będzie dostępna przez bezpośredni odnośnik</string>
<string name="close">Zamknij</string>
<string name="edit">Edytuj</string>
<string name="save">Zapisz</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">Chciałbym się z Tobą podzielić mapą</string> <string name="share_map_subject">Chciałbym się z Tobą podzielić mapą</string>
<string name="share_map_body_format">Myślę, że może Cię zainteresować ta mapa: <string name="share_map_body_format">Myślę, że może Cię zainteresować ta mapa:
@@ -263,6 +245,7 @@ limitations under the License.
<string name="send_track_body_format">Myślę, że może Cię zainteresować ta trasa. <string name="send_track_body_format">Myślę, że może Cię zainteresować ta trasa.
Trasę możesz obejrzeć w Google Earth lub innym programie do obsługi map.</string> Trasę możesz obejrzeć w Google Earth lub innym programie do obsługi map.</string>
<string name="share_track">Podziel się trasą z przyjaciółmi</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">Publiczna</string> <string name="public_map">Publiczna</string>
+4 -21
View File
@@ -101,6 +101,9 @@ limitations under the License.
<string name="success">Successo</string> <string name="success">Successo</string>
<string name="waypoint">Ponto de passagem</string> <string name="waypoint">Ponto de passagem</string>
<string name="cancel">Cancelar</string> <string name="cancel">Cancelar</string>
<string name="close">Fechar</string>
<string name="edit">Editar</string>
<string name="save">Salvar</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Início)</string> <string name="start">(Início)</string>
@@ -184,27 +187,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">Satélites de GPS</string> <string name="mytracks_sky">Satélites de GPS</string>
<!-- My Maps -->
<string name="select_map_message">Escolha um mapa da sua conta:</string>
<string name="create_new_map">Criar novo mapa...</string>
<string name="map_list_title">Enviar para o Google Meus Mapas</string>
<string name="maps_list_loading">Carregando mapas...</string>
<string name="maps_list_failed">Seus mapas não puderam ser carregados neste momento!</string>
<string name="open_map">Selecionar este Mapa</string>
<string name="edit_map_details">Editar detalhes do mapa</string>
<string name="share_map">Compartilhar mapa com amigos</string>
<string name="share_track">Compartilhar caminho com amigos</string>
<string name="delete_map">Apagar mapa da sua conta</string>
<string name="map_title">Título do Mapa:</string>
<string name="map_description">Descrição do Mapa:</string>
<string name="map_searchable_edit">Fazer com que o conteúdo deste mapa apareça em resultados de buscas</string>
<string name="map_not_searchable_edit">Não permitir que este mapa ou seu conteúdo apareçam em resultados de buscas, porém ele ainda pode ser visto por sua URL direta</string>
<string name="map_searchable">Este mapa e seu conteúdo vão aparecer em resultados de buscas</string>
<string name="map_not_searchable">Nem este mapa nem seu conteúdo vão aparecer em resultados de buscas, porém outras pessoas ainda podem vê-los se obtiverem sua URL direta</string>
<string name="close">Fechar</string>
<string name="edit">Editar</string>
<string name="save">Salvar</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">Eu gostaria de compartilhar um mapa com você</string> <string name="share_map_subject">Eu gostaria de compartilhar um mapa com você</string>
<string name="share_map_body_format">Eu acredito que você pode se interessar por este mapa: <string name="share_map_body_format">Eu acredito que você pode se interessar por este mapa:
@@ -214,6 +196,7 @@ limitations under the License.
<string name="send_track_body_format">Eu acredito que você pode se interesasr por este caminho. <string name="send_track_body_format">Eu acredito que você pode se interesasr por este caminho.
Para visualizar este caminho, use o Google Earth ou outro software de mapas.</string> Para visualizar este caminho, use o Google Earth ou outro software de mapas.</string>
<string name="share_track">Compartilhar caminho com amigos</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">Público</string> <string name="public_map">Público</string>
+4 -21
View File
@@ -103,6 +103,9 @@ limitations under the License.
<string name="success">Lyckades</string> <string name="success">Lyckades</string>
<string name="waypoint">Positionsmärke</string> <string name="waypoint">Positionsmärke</string>
<string name="cancel">Avbryt</string> <string name="cancel">Avbryt</string>
<string name="close">Stäng</string>
<string name="edit">Ändra</string>
<string name="save">Spara</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Start)</string> <string name="start">(Start)</string>
@@ -202,27 +205,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">GPS-satelliter</string> <string name="mytracks_sky">GPS-satelliter</string>
<!-- My Maps -->
<string name="select_map_message">Välj en karta från ditt konto:</string>
<string name="create_new_map">Skapa en ny karta...</string>
<string name="map_list_title">Skicka till Google Mina Kartor</string>
<string name="maps_list_loading">Laddar kartor...</string>
<string name="maps_list_failed">Dina kartor kunde inte laddas just nu!</string>
<string name="open_map">Välj den här kartan</string>
<string name="edit_map_details">Ändra kartdetaljer</string>
<string name="share_map">Dela kartan med vänner</string>
<string name="share_track">Dela spår med vänner</string>
<string name="delete_map">Ta bort kartan från ditt konto</string>
<string name="map_title">Karttitel:</string>
<string name="map_description">Kartbeskrivning:</string>
<string name="map_searchable_edit">Gör så att kartan och dess innehåll visas i sökresultat</string>
<string name="map_not_searchable_edit">Låt inte kartan och dess innehåll visas i sökresultat, men de kan ändå ses av andra genom en direktlänk</string>
<string name="map_searchable">Kartan och dess innehåll kommer att visas i sökresultat</string>
<string name="map_not_searchable">Varken kartan eller dess innehåll visas i sökresultat, men de kan ändå ses av andra genom en direktlänk</string>
<string name="close">Stäng</string>
<string name="edit">Ändra</string>
<string name="save">Spara</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">Jag vill dela en karta med dig</string> <string name="share_map_subject">Jag vill dela en karta med dig</string>
<string name="share_map_body_format">Jag tror att du skulle vara intresserad av den här kartan: <string name="share_map_body_format">Jag tror att du skulle vara intresserad av den här kartan:
@@ -232,6 +214,7 @@ limitations under the License.
<string name="send_track_body_format">Jag tror att du skulle vara intresserad av det här spåret. <string name="send_track_body_format">Jag tror att du skulle vara intresserad av det här spåret.
För att se det här spåret använd Google Earth eller något annat kartprogram.</string> För att se det här spåret använd Google Earth eller något annat kartprogram.</string>
<string name="share_track">Dela spår med vänner</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">Publik</string> <string name="public_map">Publik</string>
+4 -21
View File
@@ -106,6 +106,9 @@ limitations under the License.
<string name="success">成功</string> <string name="success">成功</string>
<string name="waypoint">路点</string> <string name="waypoint">路点</string>
<string name="cancel">取消</string> <string name="cancel">取消</string>
<string name="close">关闭</string>
<string name="edit">编辑</string>
<string name="save">保存</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(开始)</string> <string name="start">(开始)</string>
@@ -239,27 +242,6 @@ limitations under the License.
<!-- MyTracksSky --> <!-- MyTracksSky -->
<string name="mytracks_sky">GPS 卫星</string> <string name="mytracks_sky">GPS 卫星</string>
<!-- My Maps -->
<string name="select_map_message">从你的帐户里选择地图:</string>
<string name="create_new_map">创建新地图...</string>
<string name="map_list_title">发送到 Google My Maps</string>
<string name="maps_list_loading">载入地图中...</string>
<string name="maps_list_failed">现在无法载入你的地图!</string>
<string name="open_map">选择此地图</string>
<string name="edit_map_details">编辑地图详细信息</string>
<string name="share_map">与朋友分享地图</string>
<string name="share_track">与朋友分享轨迹</string>
<string name="delete_map">删除你帐号下的此地图</string>
<string name="map_title">地图标题:</string>
<string name="map_description">地图描述:</string>
<string name="map_searchable_edit">允许此地图及其内容出现在搜索结果中</string>
<string name="map_not_searchable_edit">不允许地图及其内容出现在搜索结果中, 但它的内容依然可以通过网址直接访问</string>
<string name="map_searchable">此地图及其内容会出现在搜索结果中</string>
<string name="map_not_searchable">此地图及其内容不会出现在搜索结果中, 但它的内容依然可以通过网址直接访问</string>
<string name="close">关闭</string>
<string name="edit">编辑</string>
<string name="save">保存</string>
<!-- Sharing --> <!-- Sharing -->
<string name="share_map_subject">我想与你分享一张地图</string> <string name="share_map_subject">我想与你分享一张地图</string>
<string name="share_map_body_format">我想你可能会对这个地图感兴趣: <string name="share_map_body_format">我想你可能会对这个地图感兴趣:
@@ -269,6 +251,7 @@ limitations under the License.
<string name="send_track_body_format">我想你可能会对这条轨迹感兴趣. <string name="send_track_body_format">我想你可能会对这条轨迹感兴趣.
请用 Google Earth 或其它地图软件查看此轨迹.</string> 请用 Google Earth 或其它地图软件查看此轨迹.</string>
<string name="share_track">与朋友分享轨迹</string>
<!-- Visibility --> <!-- Visibility -->
<string name="public_map">公开</string> <string name="public_map">公开</string>
+3
View File
@@ -106,6 +106,9 @@ limitations under the License.
<string name="success">Success</string> <string name="success">Success</string>
<string name="waypoint">Waypoint</string> <string name="waypoint">Waypoint</string>
<string name="cancel">Cancel</string> <string name="cancel">Cancel</string>
<string name="close">Close</string>
<string name="edit">Edit</string>
<string name="save">Save</string>
<!-- Placemark labels for start and end of track --> <!-- Placemark labels for start and end of track -->
<string name="start">(Start)</string> <string name="start">(Start)</string>
@@ -85,12 +85,12 @@ public class DialogManager {
builder.setTitle("Title"); builder.setTitle("Title");
builder.setMessage("Message"); builder.setMessage("Message");
builder.setPositiveButton(activity.getString(R.string.ok), null); builder.setPositiveButton(activity.getString(R.string.ok), null);
builder.setNeutralButton(activity.getString(R.string.share_map), builder.setNeutralButton(activity.getString(R.string.share_track),
new DialogInterface.OnClickListener() { new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
activity.shareLinkToFusionTable(activity.sendToTrackId); activity.shareLinkToFusionTable(activity.sendToTrackId);
dialog.dismiss(); dialog.dismiss();
} }
}); });
sendToGoogleResultDialog = builder.create(); sendToGoogleResultDialog = builder.create();
return sendToGoogleResultDialog; return sendToGoogleResultDialog;
@@ -52,9 +52,6 @@ import android.content.Intent;
import android.content.ServiceConnection; import android.content.ServiceConnection;
import android.content.SharedPreferences; import android.content.SharedPreferences;
import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.content.SharedPreferences.OnSharedPreferenceChangeListener;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources; import android.content.res.Resources;
import android.location.Location; import android.location.Location;
import android.location.LocationManager; import android.location.LocationManager;
@@ -213,23 +210,6 @@ public class MyTracks extends TabActivity implements OnTouchListener,
return instance; return instance;
} }
/**
* Get the My Tracks version from the manifest.
*
* @return the version, or an empty string in case of failure.
*/
public static String getMyTracksVersion(Context context) {
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(
"com.google.android.maps.mytracks",
PackageManager.GET_META_DATA);
return pi.versionName;
} catch (NameNotFoundException e) {
Log.w(MyTracksConstants.TAG, "Failed to get version info.", e);
return "";
}
}
/** /**
* Checks whether we have a track recording session in progress. * Checks whether we have a track recording session in progress.
* In some cases, when the service has crashed or has been restarted * In some cases, when the service has crashed or has been restarted
@@ -661,7 +641,7 @@ public class MyTracks extends TabActivity implements OnTouchListener,
if (selectedTrack.getTableId().length() > 0) { if (selectedTrack.getTableId().length() > 0) {
shareLinkToFusionTable(selectedTrackId); shareLinkToFusionTable(selectedTrackId);
} else { } else {
shareRequested = true; shareRequested = true;
dialogManager.showDialogSafely(DIALOG_SEND_TO_GOOGLE); dialogManager.showDialogSafely(DIALOG_SEND_TO_GOOGLE);
} }
} }
@@ -1112,8 +1092,7 @@ public class MyTracks extends TabActivity implements OnTouchListener,
dialogManager.showDialogSafely(DIALOG_PROGRESS); dialogManager.showDialogSafely(DIALOG_PROGRESS);
if (sendToGoogleDialog.getSendToFusionTables()) { if (sendToGoogleDialog.getSendToFusionTables()) {
setProgressValue(0); setProgressValue(0);
setProgressMessage( setProgressMessage(R.string.progress_message_authenticating_fusiontables);
R.string.progress_message_authenticating_fusiontables);
authenticate(new Intent(), MyTracksConstants.SEND_TO_GOOGLE, authenticate(new Intent(), MyTracksConstants.SEND_TO_GOOGLE,
SendToFusionTables.SERVICE_ID); SendToFusionTables.SERVICE_ID);
} else { } else {
@@ -1235,10 +1214,10 @@ public class MyTracks extends TabActivity implements OnTouchListener,
* Notifies that uploading to fusion tables is finished. * Notifies that uploading to fusion tables is finished.
*/ */
private void handleFusionTablesFinish(long trackId) { private void handleFusionTablesFinish(long trackId) {
if (shareRequested && sendToFusionTablesSuccess) { if (shareRequested && sendToFusionTablesSuccess) {
// Just share // Just share
Toast.makeText(this, getFusionTablesResultMessage(), Toast.LENGTH_LONG).show(); Toast.makeText(this, getFusionTablesResultMessage(), Toast.LENGTH_LONG).show();
shareLinkToFusionTable(trackId); shareLinkToFusionTable(trackId);
} else { } else {
dialogManager.showDialogSafely(DialogManager.DIALOG_SEND_TO_GOOGLE_RESULT); dialogManager.showDialogSafely(DialogManager.DIALOG_SEND_TO_GOOGLE_RESULT);
} }
@@ -15,6 +15,7 @@
*/ */
package com.google.android.apps.mytracks; package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.util.MyTracksUtils;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import android.app.Activity; import android.app.Activity;
@@ -74,6 +75,6 @@ public class WelcomeActivity extends Activity {
AlertDialog dialog = builder.create(); AlertDialog dialog = builder.create();
dialog.show(); dialog.show();
((TextView) dialog.findViewById(R.id.about_version_register)). ((TextView) dialog.findViewById(R.id.about_version_register)).
setText(MyTracks.getMyTracksVersion(this)); setText(MyTracksUtils.getMyTracksVersion(this));
} }
} }
@@ -144,15 +144,13 @@ public class MyTracksProvider extends ContentProvider {
db.execSQL("DROP TABLE IF EXISTS " + WAYPOINTS_TABLE); db.execSQL("DROP TABLE IF EXISTS " + WAYPOINTS_TABLE);
onCreate(db); onCreate(db);
} else { } else {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", adding sensor column.");
if (oldVersion == 17) { if (oldVersion == 17) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", adding sensor column.");
db.execSQL("ALTER TABLE " + TRACKPOINTS_TABLE db.execSQL("ALTER TABLE " + TRACKPOINTS_TABLE
+ " ADD " + TrackPointsColumns.SENSOR + " BLOB"); + " ADD " + TrackPointsColumns.SENSOR + " BLOB");
}; };
if (oldVersion >= 17) { if (oldVersion >= 17) {
Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
+ newVersion + ", adding tableid column.");
db.execSQL("ALTER TABLE " + TRACKS_TABLE db.execSQL("ALTER TABLE " + TRACKS_TABLE
+ " ADD " + TracksColumns.TABLEID + " STRING"); + " ADD " + TracksColumns.TABLEID + " STRING");
} }
@@ -329,8 +329,8 @@ public class SendToDocs {
break; break;
} }
} }
} catch (ParseException e) { } catch (ParseException e) {
throw new GDataWrapper.ParseException(); throw new GDataWrapper.ParseException(e);
} catch (HttpException e) { } catch (HttpException e) {
throw new GDataWrapper.HttpException(e.getStatusCode(), e.getMessage()); throw new GDataWrapper.HttpException(e.getStatusCode(), e.getMessage());
} }
@@ -346,27 +346,27 @@ public class SendToDocs {
throws GDataWrapper.AuthenticationException, IOException, GDataWrapper.ParseException { throws GDataWrapper.AuthenticationException, IOException, GDataWrapper.ParseException {
String uri = String.format(DOCS_WORKSHEETS_URL_FORMAT, spreadSheetId); String uri = String.format(DOCS_WORKSHEETS_URL_FORMAT, spreadSheetId);
GDataParser sheetParser; GDataParser sheetParser;
try { try {
sheetParser = ((SpreadsheetsClient) client).getParserForWorksheetsFeed(uri, sheetParser = ((SpreadsheetsClient) client).getParserForWorksheetsFeed(uri,
wiseAuth.getAuthToken()); wiseAuth.getAuthToken());
sheetParser.init(); sheetParser.init();
if (!sheetParser.hasMoreData()) { if (!sheetParser.hasMoreData()) {
Log.i(MyTracksConstants.TAG, "Found no worksheets"); Log.i(MyTracksConstants.TAG, "Found no worksheets");
return; // failure return; // failure
} }
// just grab the first. // just grab the first.
WorksheetEntry worksheetEntry = WorksheetEntry worksheetEntry =
(WorksheetEntry) sheetParser.readNextEntry(new WorksheetEntry()); (WorksheetEntry) sheetParser.readNextEntry(new WorksheetEntry());
int lastSlash = worksheetEntry.getId().lastIndexOf('/'); int lastSlash = worksheetEntry.getId().lastIndexOf('/');
workSheetId = worksheetEntry.getId().substring(lastSlash + 1); workSheetId = worksheetEntry.getId().substring(lastSlash + 1);
} catch (AuthenticationException e) { } catch (AuthenticationException e) {
throw new GDataWrapper.AuthenticationException(); throw new GDataWrapper.AuthenticationException(e);
} catch (ParseException e) { } catch (ParseException e) {
throw new GDataWrapper.ParseException(); throw new GDataWrapper.ParseException(e);
} }
} }
}); });
} }
@@ -15,7 +15,6 @@
*/ */
package com.google.android.apps.mytracks.io; package com.google.android.apps.mytracks.io;
import com.google.android.apps.mytracks.MyTracks;
import com.google.android.apps.mytracks.MyTracksConstants; import com.google.android.apps.mytracks.MyTracksConstants;
import com.google.android.apps.mytracks.MyTracksSettings; import com.google.android.apps.mytracks.MyTracksSettings;
import com.google.android.apps.mytracks.ProgressIndicator; import com.google.android.apps.mytracks.ProgressIndicator;
@@ -60,18 +59,21 @@ import java.util.Vector;
*/ */
public class SendToFusionTables implements Runnable { public class SendToFusionTables implements Runnable {
/**
* Listener invoked when sending to fusion tables completes.
*/
public interface OnSendCompletedListener { public interface OnSendCompletedListener {
void onSendCompleted(String tableId, boolean success, int statusMessage); void onSendCompleted(String tableId, boolean success, int statusMessage);
} }
/** The GData service id for Fusion Tables. */ /** The GData service id for Fusion Tables. */
public static final String SERVICE_ID = "fusiontables"; public static final String SERVICE_ID = "fusiontables";
/** The path for viewing a map visualization of a table. */ /** The path for viewing a map visualization of a table. */
private static final String FUSIONTABLES_MAP = private static final String FUSIONTABLES_MAP =
"http://www.google.com/fusiontables/embedviz?" + "http://www.google.com/fusiontables/embedviz?" +
"viz=MAP&q=select+col0,+col1,+col2,+col3+from+%s+&h=false&" + "viz=MAP&q=select+col0,+col1,+col2,+col3+from+%s+&h=false&" +
"lat=%f&lng=%f&z=%d&t=1&l=col2"; "lat=%f&lng=%f&z=%d&t=1&l=col2";
/** Standard base feed url for Fusion Tables. */ /** Standard base feed url for Fusion Tables. */
private static final String FUSIONTABLES_BASE_FEED_URL = private static final String FUSIONTABLES_BASE_FEED_URL =
@@ -79,6 +81,8 @@ public class SendToFusionTables implements Runnable {
private static final int MAX_POINTS_PER_UPLOAD = 2048; private static final int MAX_POINTS_PER_UPLOAD = 2048;
private static final String GDATA_VERSION = "2";
private final Activity context; private final Activity context;
private final AuthManager auth; private final AuthManager auth;
private final long trackId; private final long trackId;
@@ -97,6 +101,10 @@ public class SendToFusionTables implements Runnable {
private HttpTransport transport; private HttpTransport transport;
private String tableId; private String tableId;
private static String MARKER_TYPE_START = "large_green";
private static String MARKER_TYPE_END = "large_red";
private static String MARKER_TYPE_WAYPOINT = "large_yellow";
public SendToFusionTables(Activity context, AuthManager auth, public SendToFusionTables(Activity context, AuthManager auth,
long trackId, ProgressIndicator progressIndicator, long trackId, ProgressIndicator progressIndicator,
OnSendCompletedListener onCompletion) { OnSendCompletedListener onCompletion) {
@@ -109,8 +117,8 @@ public class SendToFusionTables implements Runnable {
this.providerUtils = MyTracksProviderUtils.Factory.get(context); this.providerUtils = MyTracksProviderUtils.Factory.get(context);
transport = GoogleTransport.create(); transport = GoogleTransport.create();
GoogleHeaders headers = (GoogleHeaders) transport.defaultHeaders; GoogleHeaders headers = (GoogleHeaders) transport.defaultHeaders;
headers.setApplicationName("Google-MyTracks-" + MyTracks.getMyTracksVersion(context)); headers.setApplicationName("Google-MyTracks-" + MyTracksUtils.getMyTracksVersion(context));
headers.gdataVersion = "2"; headers.gdataVersion = GDATA_VERSION;
} }
@Override @Override
@@ -121,11 +129,11 @@ public class SendToFusionTables implements Runnable {
public static String getMapVisualizationUrl(Track track) { public static String getMapVisualizationUrl(Track track) {
// TODO(leifhendrik): Determine correct bounding box and zoom level that will show the entire track. // TODO(leifhendrik): Determine correct bounding box and zoom level that will show the entire track.
TripStatistics stats = track.getStatistics(); TripStatistics stats = track.getStatistics();
double latE6 = stats.getBottom() + (stats.getTop() - stats.getBottom()) / 2; double latE6 = stats.getBottom() + (stats.getTop() - stats.getBottom()) / 2;
double lonE6 = stats.getLeft() + (stats.getRight() - stats.getLeft()) / 2; double lonE6 = stats.getLeft() + (stats.getRight() - stats.getLeft()) / 2;
int z = 15; int z = 15;
return String.format(FUSIONTABLES_MAP, track.getTableId(), latE6 / 1.E6, lonE6 / 1.E6, z); return String.format(FUSIONTABLES_MAP, track.getTableId(), latE6 / 1.E6, lonE6 / 1.E6, z);
} }
private void doUpload() { private void doUpload() {
@@ -191,17 +199,17 @@ public class SendToFusionTables implements Runnable {
* @return the values formatted as: ('value1','value2',...,'value_n'). * @return the values formatted as: ('value1','value2',...,'value_n').
*/ */
private static String values(String... values) { private static String values(String... values) {
StringBuilder builder = new StringBuilder("("); StringBuilder builder = new StringBuilder("(");
for (int i = 0; i < values.length; i++) { for (int i = 0; i < values.length; i++) {
builder.append('\''); if (i > 0) {
builder.append(values[i].replaceAll("'", "xxx")); builder.append(',');
}
builder.append('\''); builder.append('\'');
if (i < values.length - 1) { builder.append(values[i].replaceAll("'", "''"));
builder.append(','); builder.append('\'');
} }
} builder.append(')');
builder.append(')'); return builder.toString();
return builder.toString();
} }
/** /**
@@ -213,7 +221,7 @@ public class SendToFusionTables implements Runnable {
* @return true in case of success. * @return true in case of success.
*/ */
private boolean createNewPoint(String name, String description, Location location, private boolean createNewPoint(String name, String description, Location location,
String marker) { String marker) {
Log.d(MyTracksConstants.TAG, "Creating a new row with a point."); Log.d(MyTracksConstants.TAG, "Creating a new row with a point.");
String query = "INSERT INTO " + tableId + " (name,description,geometry,marker) VALUES " String query = "INSERT INTO " + tableId + " (name,description,geometry,marker) VALUES "
+ values(name, description, getKmlPoint(location), marker); + values(name, description, getKmlPoint(location), marker);
@@ -229,8 +237,8 @@ public class SendToFusionTables implements Runnable {
private boolean createNewLineString(Track track) { private boolean createNewLineString(Track track) {
Log.d(MyTracksConstants.TAG, "Creating a new row with a point."); Log.d(MyTracksConstants.TAG, "Creating a new row with a point.");
String query = "INSERT INTO " + tableId String query = "INSERT INTO " + tableId
+ " (name,description,geometry) VALUES " + " (name,description,geometry) VALUES "
+ values(track.getName(), track.getDescription(), getKmlLineString(track)); + values(track.getName(), track.getDescription(), getKmlLineString(track));
return runUpdate(query); return runUpdate(query);
} }
@@ -248,25 +256,25 @@ public class SendToFusionTables implements Runnable {
Log.w(MyTracksConstants.TAG, "Unable to get any points to upload"); Log.w(MyTracksConstants.TAG, "Unable to get any points to upload");
return false; return false;
} }
totalLocationsRead = 0; totalLocationsRead = 0;
totalLocationsPrepared = 0; totalLocationsPrepared = 0;
totalLocationsUploaded = 0; totalLocationsUploaded = 0;
totalLocations = locationsCursor.getCount(); totalLocations = locationsCursor.getCount();
totalSegmentsUploaded = 0; totalSegmentsUploaded = 0;
// Limit the number of elevation readings. Ideally we would want around 250. // Limit the number of elevation readings. Ideally we would want around 250.
int elevationSamplingFrequency = int elevationSamplingFrequency =
Math.max(1, (int) (totalLocations / 250.0)); Math.max(1, (int) (totalLocations / 250.0));
Log.d(MyTracksConstants.TAG, Log.d(MyTracksConstants.TAG,
"Using elevation sampling factor: " + elevationSamplingFrequency "Using elevation sampling factor: " + elevationSamplingFrequency
+ " on " + totalLocations); + " on " + totalLocations);
double totalDistance = 0; double totalDistance = 0;
Vector<Double> distances = new Vector<Double>(); Vector<Double> distances = new Vector<Double>();
Vector<Double> elevations = new Vector<Double>(); Vector<Double> elevations = new Vector<Double>();
DoubleBuffer elevationBuffer = new DoubleBuffer(MyTracksConstants.ELEVATION_SMOOTHING_FACTOR); DoubleBuffer elevationBuffer = new DoubleBuffer(MyTracksConstants.ELEVATION_SMOOTHING_FACTOR);
List<Location> locations = new ArrayList<Location>(MAX_POINTS_PER_UPLOAD); List<Location> locations = new ArrayList<Location>(MAX_POINTS_PER_UPLOAD);
progressIndicator.setProgressMessage(R.string.progress_message_reading_track); progressIndicator.setProgressMessage(R.string.progress_message_reading_track);
Location lastLocation = null; Location lastLocation = null;
@@ -274,16 +282,16 @@ public class SendToFusionTables implements Runnable {
if (totalLocationsRead % 100 == 0) { if (totalLocationsRead % 100 == 0) {
updateProgress(); updateProgress();
} }
Location loc = providerUtils.createLocation(locationsCursor); Location loc = providerUtils.createLocation(locationsCursor);
locations.add(loc); locations.add(loc);
if (totalLocationsRead == 0) { if (totalLocationsRead == 0) {
// Put a marker at the first point of the first valid segment: // Put a marker at the first point of the first valid segment:
String name = track.getName() + " " + context.getString(R.string.start); String name = track.getName() + " " + context.getString(R.string.start);
createNewPoint(name, "", loc, "large_green"); createNewPoint(name, "", loc, MARKER_TYPE_START);
} }
// Add to the elevation profile. // Add to the elevation profile.
if (loc != null && MyTracksUtils.isValidLocation(loc)) { if (loc != null && MyTracksUtils.isValidLocation(loc)) {
// All points go into the smoothing buffer... // All points go into the smoothing buffer...
@@ -293,43 +301,41 @@ public class SendToFusionTables implements Runnable {
double dist = lastLocation.distanceTo(loc); double dist = lastLocation.distanceTo(loc);
totalDistance += dist; totalDistance += dist;
} }
// ...but only a few points are really used to keep the url short. // ...but only a few points are really used to keep the url short.
if (totalLocationsRead % elevationSamplingFrequency == 0) { if (totalLocationsRead % elevationSamplingFrequency == 0) {
distances.add(totalDistance); distances.add(totalDistance);
elevations.add(elevationBuffer.getAverage()); elevations.add(elevationBuffer.getAverage());
} }
} }
// If the location was not valid, it's a segment split, so make sure the // If the location was not valid, it's a segment split, so make sure the
// distance between the previous segment and the new one is not accounted // distance between the previous segment and the new one is not accounted
// for in the next iteration. // for in the next iteration.
lastLocation = loc; lastLocation = loc;
// Every now and then, upload the accumulated points // Every now and then, upload the accumulated points
if (totalLocationsRead % MAX_POINTS_PER_UPLOAD if (totalLocationsRead % MAX_POINTS_PER_UPLOAD == MAX_POINTS_PER_UPLOAD - 1) {
== MAX_POINTS_PER_UPLOAD - 1) {
if (!prepareAndUploadPoints(track, locations)) { if (!prepareAndUploadPoints(track, locations)) {
return false; return false;
} }
} }
totalLocationsRead++; totalLocationsRead++;
} while (locationsCursor.moveToNext()); } while (locationsCursor.moveToNext());
// Do a final upload with what's left // Do a final upload with what's left
if (!prepareAndUploadPoints(track, locations)) { if (!prepareAndUploadPoints(track, locations)) {
return false; return false;
} }
// Put an end marker at the last point of the last valid segment: // Put an end marker at the last point of the last valid segment:
if (lastLocation != null) { if (lastLocation != null) {
track.setDescription("<p>" + originalDescription + "</p><p>" track.setDescription("<p>" + originalDescription + "</p><p>"
+ stringUtils.generateTrackDescription( + stringUtils.generateTrackDescription(track, distances, elevations)
track, distances, elevations)
+ "</p>"); + "</p>");
String name = track.getName() + " " + context.getString(R.string.end); String name = track.getName() + " " + context.getString(R.string.end);
return createNewPoint(name, track.getDescription(), lastLocation, "large_red"); return createNewPoint(name, track.getDescription(), lastLocation, MARKER_TYPE_END);
} }
return true; return true;
@@ -337,7 +343,7 @@ public class SendToFusionTables implements Runnable {
locationsCursor.close(); locationsCursor.close();
} }
} }
/** /**
* Appends the given location to the string in the format: * Appends the given location to the string in the format:
* longitude,latitude[,altitude] * longitude,latitude[,altitude]
@@ -346,14 +352,14 @@ public class SendToFusionTables implements Runnable {
* @param builder the string builder to use * @param builder the string builder to use
*/ */
private void appendCoordinate(Location location, StringBuilder builder) { private void appendCoordinate(Location location, StringBuilder builder) {
builder builder
.append(location.getLongitude()) .append(location.getLongitude())
.append(",") .append(",")
.append(location.getLatitude()); .append(location.getLatitude());
if (location.hasAltitude()) { if (location.hasAltitude()) {
builder.append(","); builder.append(",");
builder.append(location.getAltitude()); builder.append(location.getAltitude());
} }
} }
/** /**
@@ -376,29 +382,29 @@ public class SendToFusionTables implements Runnable {
* @return the kml. * @return the kml.
*/ */
private String getKmlLineString(Track track) { private String getKmlLineString(Track track) {
StringBuilder builder = new StringBuilder("<LineString><coordinates>"); StringBuilder builder = new StringBuilder("<LineString><coordinates>");
for (Location location : track.getLocations()) { for (Location location : track.getLocations()) {
appendCoordinate(location, builder); appendCoordinate(location, builder);
builder.append(' '); builder.append(' ');
} }
builder.append("</coordinates></LineString>"); builder.append("</coordinates></LineString>");
return builder.toString(); return builder.toString();
} }
private boolean prepareAndUploadPoints(Track track, List<Location> locations) { private boolean prepareAndUploadPoints(Track track, List<Location> locations) {
progressIndicator.setProgressMessage(R.string.progress_message_preparing_track); progressIndicator.setProgressMessage(R.string.progress_message_preparing_track);
updateProgress(); updateProgress();
int numLocations = locations.size(); int numLocations = locations.size();
if (numLocations < 2) { if (numLocations < 2) {
Log.d(MyTracksConstants.TAG, "Not preparing/uploading too few points"); Log.d(MyTracksConstants.TAG, "Not preparing/uploading too few points");
totalLocationsUploaded += numLocations; totalLocationsUploaded += numLocations;
return true; return true;
} }
// Prepare/pre-process the points // Prepare/pre-process the points
ArrayList<Track> splitTracks = prepareLocations(track, locations); ArrayList<Track> splitTracks = prepareLocations(track, locations);
// Start uploading them // Start uploading them
progressIndicator.setProgressMessage(R.string.progress_message_sending_fusiontables); progressIndicator.setProgressMessage(R.string.progress_message_sending_fusiontables);
for (Track splitTrack : splitTracks) { for (Track splitTrack : splitTracks) {
@@ -411,7 +417,7 @@ public class SendToFusionTables implements Runnable {
Log.d(MyTracksConstants.TAG, Log.d(MyTracksConstants.TAG,
"SendToFusionTables: Prepared feature for upload w/ " "SendToFusionTables: Prepared feature for upload w/ "
+ splitTrack.getLocations().size() + " points."); + splitTrack.getLocations().size() + " points.");
// Transmit tracks via GData feed: // Transmit tracks via GData feed:
// ------------------------------- // -------------------------------
Log.d(MyTracksConstants.TAG, Log.d(MyTracksConstants.TAG,
@@ -421,7 +427,7 @@ public class SendToFusionTables implements Runnable {
return false; return false;
} }
} }
locations.clear(); locations.clear();
totalLocationsUploaded += numLocations; totalLocationsUploaded += numLocations;
updateProgress(); updateProgress();
@@ -439,7 +445,7 @@ public class SendToFusionTables implements Runnable {
private ArrayList<Track> prepareLocations( private ArrayList<Track> prepareLocations(
Track track, Iterable<Location> locations) { Track track, Iterable<Location> locations) {
ArrayList<Track> splitTracks = new ArrayList<Track>(); ArrayList<Track> splitTracks = new ArrayList<Track>();
// Create segments from each full track: // Create segments from each full track:
Track segment = new Track(); Track segment = new Track();
TripStatistics segmentStats = segment.getStatistics(); TripStatistics segmentStats = segment.getStatistics();
@@ -458,11 +464,11 @@ public class SendToFusionTables implements Runnable {
if (loc.getLatitude() > 90) { if (loc.getLatitude() > 90) {
startNewTrackSegment = true; startNewTrackSegment = true;
} }
if (startNewTrackSegment) { if (startNewTrackSegment) {
// Close up the last segment. // Close up the last segment.
prepareTrackSegment(segment, splitTracks); prepareTrackSegment(segment, splitTracks);
Log.d(MyTracksConstants.TAG, Log.d(MyTracksConstants.TAG,
"MyTracksSendToFusionTables: Starting new track segment..."); "MyTracksSendToFusionTables: Starting new track segment...");
startNewTrackSegment = false; startNewTrackSegment = false;
@@ -472,7 +478,7 @@ public class SendToFusionTables implements Runnable {
segment.setDescription(/* track.getDescription() */ ""); segment.setDescription(/* track.getDescription() */ "");
segment.setCategory(track.getCategory()); segment.setCategory(track.getCategory());
} }
if (loc.getLatitude() <= 90) { if (loc.getLatitude() <= 90) {
segment.addLocation(loc); segment.addLocation(loc);
if (segmentStats.getStartTime() < 0) { if (segmentStats.getStartTime() < 0) {
@@ -481,9 +487,9 @@ public class SendToFusionTables implements Runnable {
} }
totalLocationsPrepared++; totalLocationsPrepared++;
} }
prepareTrackSegment(segment, splitTracks); prepareTrackSegment(segment, splitTracks);
return splitTracks; return splitTracks;
} }
@@ -506,13 +512,13 @@ public class SendToFusionTables implements Runnable {
&& segment.getLocations().size() > 0) { && segment.getLocations().size() > 0) {
segmentStats.setStopTime(segment.getLocations().size() - 1); segmentStats.setStopTime(segment.getLocations().size() - 1);
} }
/* /*
* Decimate to 2 meter precision. Fusion tables doesn't like too many * Decimate to 2 meter precision. Fusion tables doesn't like too many
* points: * points:
*/ */
MyTracksUtils.decimate(segment, 2.0); MyTracksUtils.decimate(segment, 2.0);
/* If the track still has > 2500 points, split it in pieces: */ /* If the track still has > 2500 points, split it in pieces: */
final int maxPoints = 2500; final int maxPoints = 2500;
if (segment.getLocations().size() > maxPoints) { if (segment.getLocations().size() > maxPoints) {
@@ -557,7 +563,7 @@ public class SendToFusionTables implements Runnable {
Waypoint wpt = providerUtils.createWaypoint(c); Waypoint wpt = providerUtils.createWaypoint(c);
Log.d(MyTracksConstants.TAG, "SendToFusionTables: Creating waypoint."); Log.d(MyTracksConstants.TAG, "SendToFusionTables: Creating waypoint.");
success = createNewPoint(wpt.getName(), wpt.getDescription(), wpt.getLocation(), success = createNewPoint(wpt.getName(), wpt.getDescription(), wpt.getLocation(),
"large_yellow"); MARKER_TYPE_WAYPOINT);
if (!success) { if (!success) {
break; break;
} }
@@ -611,20 +617,20 @@ public class SendToFusionTables implements Runnable {
HttpResponse response = request.execute(); HttpResponse response = request.execute();
boolean success = response.isSuccessStatusCode; boolean success = response.isSuccessStatusCode;
if (success) { if (success) {
byte[] result = new byte[1024]; byte[] result = new byte[1024];
response.getContent().read(result); response.getContent().read(result);
String s = Strings.fromBytesUtf8(result); String s = Strings.fromBytesUtf8(result);
String[] lines = s.split(Strings.LINE_SEPARATOR); String[] lines = s.split(Strings.LINE_SEPARATOR);
if (lines[0].equals("tableid")) { if (lines[0].equals("tableid")) {
tableId = lines[1]; tableId = lines[1];
Log.d(MyTracksConstants.TAG, "tableId = " + tableId); Log.d(MyTracksConstants.TAG, "tableId = " + tableId);
} else { } else {
Log.w(MyTracksConstants.TAG, "Unrecognized response: " + lines[0]); Log.w(MyTracksConstants.TAG, "Unrecognized response: " + lines[0]);
} }
} else { } else {
Log.d(MyTracksConstants.TAG, "Query failed: " + response.statusMessage + " (" + Log.d(MyTracksConstants.TAG, "Query failed: " + response.statusMessage + " (" +
response.statusCode + ")"); response.statusCode + ")");
throw new GDataWrapper.HttpException(response.statusCode, response.statusMessage); throw new GDataWrapper.HttpException(response.statusCode, response.statusMessage);
} }
} }
}); });
@@ -37,13 +37,15 @@ public class BackupColumns {
TracksColumns.MOVINGTIME, TracksColumns.AVGSPEED, TracksColumns.AVGMOVINGSPEED, TracksColumns.MOVINGTIME, TracksColumns.AVGSPEED, TracksColumns.AVGMOVINGSPEED,
TracksColumns.MAXSPEED, TracksColumns.MINELEVATION, TracksColumns.MAXELEVATION, TracksColumns.MAXSPEED, TracksColumns.MINELEVATION, TracksColumns.MAXELEVATION,
TracksColumns.ELEVATIONGAIN, TracksColumns.MINGRADE, TracksColumns.MAXGRADE, TracksColumns.ELEVATIONGAIN, TracksColumns.MINGRADE, TracksColumns.MAXGRADE,
TracksColumns.MINLAT, TracksColumns.MAXLAT, TracksColumns.MINLON, TracksColumns.MAXLON }; TracksColumns.MINLAT, TracksColumns.MAXLAT, TracksColumns.MINLON, TracksColumns.MAXLON,
TracksColumns.MAPID, TracksColumns.TABLEID};
public static final byte[] TRACKS_BACKUP_COLUMN_TYPES = { public static final byte[] TRACKS_BACKUP_COLUMN_TYPES = {
LONG_TYPE_ID, STRING_TYPE_ID, STRING_TYPE_ID, STRING_TYPE_ID, LONG_TYPE_ID, STRING_TYPE_ID, STRING_TYPE_ID, STRING_TYPE_ID,
LONG_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, INT_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, INT_TYPE_ID,
FLOAT_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, LONG_TYPE_ID, LONG_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID,
FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID, FLOAT_TYPE_ID,
FLOAT_TYPE_ID, INT_TYPE_ID, INT_TYPE_ID, INT_TYPE_ID, INT_TYPE_ID }; FLOAT_TYPE_ID, INT_TYPE_ID, INT_TYPE_ID, INT_TYPE_ID, INT_TYPE_ID, STRING_TYPE_ID,
STRING_TYPE_ID};
public static final String[] WAYPOINTS_BACKUP_COLUMNS = { public static final String[] WAYPOINTS_BACKUP_COLUMNS = {
WaypointsColumns._ID, WaypointsColumns.TRACKID, WaypointsColumns.NAME, WaypointsColumns._ID, WaypointsColumns.TRACKID, WaypointsColumns.NAME,
@@ -39,33 +39,54 @@ import java.util.concurrent.TimeoutException;
*/ */
public class GDataWrapper<C> { public class GDataWrapper<C> {
public static class AuthenticationException extends Exception { public static class AuthenticationException extends Exception {
private static final long serialVersionUID = 1L; private Exception exception;
private static final long serialVersionUID = 1L;
public AuthenticationException(Exception caught) {
this.exception = caught;
}
public Exception getException() {
return exception;
}
}; };
public static class ParseException extends Exception { public static class ParseException extends Exception {
private static final long serialVersionUID = 1L; private Exception exception;
private static final long serialVersionUID = 1L;
public ParseException(Exception caught) {
this.exception = caught;
}
public Exception getException() {
return exception;
}
}; };
public static class ConflictDetectedException extends Exception { public static class ConflictDetectedException extends Exception {
private static final long serialVersionUID = 1L; private Exception exception;
private static final long serialVersionUID = 1L;
public ConflictDetectedException(Exception caught) {
this.exception = caught;
}
public Exception getException() {
return exception;
}
}; };
public static class HttpException extends Exception { public static class HttpException extends Exception {
private static final long serialVersionUID = 1L; private static final long serialVersionUID = 1L;
private int statusCode; private int statusCode;
private String statusMessage; private String statusMessage;
public HttpException(int statusCode, String statusMessage) { public HttpException(int statusCode, String statusMessage) {
super(); super();
this.statusCode = statusCode; this.statusCode = statusCode;
this.statusMessage = statusMessage; this.statusMessage = statusMessage;
} }
public int getStatusCode() { public int getStatusCode() {
return statusCode; return statusCode;
} }
public String getStatusMessage() { public String getStatusMessage() {
return statusMessage; return statusMessage;
} }
}; };
/** /**
@@ -21,6 +21,10 @@ import com.google.android.apps.mytracks.stats.TripStatistics;
import com.google.android.maps.GeoPoint; import com.google.android.maps.GeoPoint;
import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.location.Location; import android.location.Location;
import android.util.Log; import android.util.Log;
@@ -246,6 +250,23 @@ public class MyTracksUtils {
(int) (location.getLongitude() * 1E6)); (int) (location.getLongitude() * 1E6));
} }
/**
* Get the My Tracks version from the manifest.
*
* @return the version, or an empty string in case of failure.
*/
public static String getMyTracksVersion(Context context) {
try {
PackageInfo pi = context.getPackageManager().getPackageInfo(
"com.google.android.maps.mytracks",
PackageManager.GET_META_DATA);
return pi.versionName;
} catch (NameNotFoundException e) {
Log.w(MyTracksConstants.TAG, "Failed to get version info.", e);
return "";
}
}
/** /**
* This is a utility class w/ only static memebers. * This is a utility class w/ only static memebers.
*/ */