Merge heads
|
Before Width: | Height: | Size: 51 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 59 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 41 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 47 KiB After Width: | Height: | Size: 1.8 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 43 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 48 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 2.3 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 2.4 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
@@ -19,120 +19,10 @@ limitations under the License.
|
|||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:orientation="vertical" >
|
android:orientation="vertical" >
|
||||||
<ScrollView style="@style/ScrollView.WithBottomButtons" >
|
<ScrollView style="@style/ScrollView.WithBottomButtons" >
|
||||||
<LinearLayout
|
<WebView
|
||||||
|
android:id="@+id/help_webview"
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent" />
|
||||||
android:orientation="vertical"
|
|
||||||
android:padding="8dp" >
|
|
||||||
<ImageView
|
|
||||||
android:contentDescription="@string/my_tracks_app_name"
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_width="wrap_content"
|
|
||||||
android:scaleType="fitStart"
|
|
||||||
android:src="@drawable/my_tracks_icon" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_my_tracks_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_my_tracks_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_location_precision_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_location_precision_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_gps_signal_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_gps_signal_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_data_connection_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_data_connection_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_elevation_precision_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_elevation_precision_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_battery_life_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_battery_life_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_share_friends_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_share_friends_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_send_track_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/help_send_track_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_maps_public_unlisted_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:id="@+id/help_maps_public_unlisted_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_share_visibility_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_share_visibility_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_split_track_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_split_track_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_saved_files_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_saved_files_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_external_storage_access_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_external_storage_access_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_marker_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_marker_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_split_marker_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_split_marker_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_delete_tracks_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_delete_tracks_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_edit_tracks_question"
|
|
||||||
style="@style/HelpQuestion" />
|
|
||||||
<TextView
|
|
||||||
android:text="@string/help_edit_tracks_answer"
|
|
||||||
style="@style/HelpAnswer" />
|
|
||||||
</LinearLayout>
|
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
<LinearLayout style="@style/BottomButtonBar" >
|
<LinearLayout style="@style/BottomButtonBar" >
|
||||||
<include layout="@layout/help_buttons" />
|
<include layout="@layout/help_buttons" />
|
||||||
|
|||||||
@@ -14,81 +14,73 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|||||||
See the License for the specific language governing permissions and
|
See the License for the specific language governing permissions and
|
||||||
limitations under the License.
|
limitations under the License.
|
||||||
-->
|
-->
|
||||||
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
<TableLayout xmlns:android="http://schemas.android.com/apk/res/android"
|
||||||
android:gravity="top"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:minHeight="?android:attr/listPreferredItemHeight"
|
android:minHeight="?android:attr/listPreferredItemHeight"
|
||||||
android:orientation="horizontal"
|
|
||||||
android:paddingBottom="12dp"
|
android:paddingBottom="12dp"
|
||||||
android:paddingLeft="12dp"
|
|
||||||
android:paddingRight="12dp"
|
android:paddingRight="12dp"
|
||||||
android:paddingTop="8dp" >
|
android:paddingTop="8dp"
|
||||||
<ImageView
|
android:shrinkColumns="1"
|
||||||
android:contentDescription="@string/icon_track"
|
android:stretchColumns="1" >
|
||||||
android:id="@+id/list_item_icon"
|
<TableRow
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="match_parent" >
|
||||||
android:paddingTop="4dp" />
|
<ImageView
|
||||||
<LinearLayout
|
android:contentDescription="@string/icon_track"
|
||||||
android:layout_height="wrap_content"
|
android:id="@+id/list_item_icon"
|
||||||
android:layout_marginLeft="8dp"
|
android:layout_gravity="center_vertical"
|
||||||
android:layout_width="match_parent"
|
android:layout_height="wrap_content"
|
||||||
android:orientation="vertical" >
|
android:layout_marginLeft="8dp"
|
||||||
<LinearLayout
|
android:layout_marginRight="8dp"
|
||||||
|
android:layout_width="wrap_content" />
|
||||||
|
<TableLayout
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
android:layout_width="match_parent"
|
android:layout_width="match_parent"
|
||||||
android:orientation="horizontal" >
|
android:shrinkColumns="0"
|
||||||
<LinearLayout
|
android:stretchColumns="0" >
|
||||||
android:layout_height="wrap_content"
|
<TableRow>
|
||||||
android:layout_weight="1"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:orientation="vertical" >
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/list_item_name"
|
android:id="@+id/list_item_name"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
android:layout_width="fill_parent"
|
android:layout_width="fill_parent"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
style="@style/TextLarge" />
|
style="@style/TextLarge" />
|
||||||
</LinearLayout>
|
<TextView
|
||||||
<TextView
|
android:id="@+id/list_item_date"
|
||||||
android:id="@+id/list_item_date"
|
style="@style/ListItemDate" />
|
||||||
android:layout_gravity="bottom"
|
</TableRow>
|
||||||
android:paddingLeft="8dp"
|
<TableRow>
|
||||||
android:singleLine="true"
|
|
||||||
android:textColor="@android:color/secondary_text_dark"
|
|
||||||
style="@style/TextSmall" />
|
|
||||||
</LinearLayout>
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_width="match_parent"
|
|
||||||
android:orientation="horizontal" >
|
|
||||||
<LinearLayout
|
|
||||||
android:layout_height="wrap_content"
|
|
||||||
android:layout_weight="1"
|
|
||||||
android:layout_width="0dp"
|
|
||||||
android:orientation="vertical" >
|
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/list_item_time_distance"
|
android:id="@+id/list_item_time_distance"
|
||||||
|
android:layout_gravity="bottom"
|
||||||
|
android:layout_width="fill_parent"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
android:textColor="@android:color/primary_text_dark"
|
android:textColor="@android:color/primary_text_dark"
|
||||||
style="@style/TextSmall" />
|
style="@style/TextSmall" />
|
||||||
</LinearLayout>
|
<TextView
|
||||||
<TextView
|
android:id="@+id/list_item_time"
|
||||||
android:id="@+id/list_item_time"
|
style="@style/ListItemDate" />
|
||||||
android:layout_gravity="bottom"
|
</TableRow>
|
||||||
android:paddingLeft="8dp"
|
</TableLayout>
|
||||||
android:singleLine="true"
|
</TableRow>
|
||||||
android:textColor="@android:color/secondary_text_dark"
|
<TableRow
|
||||||
style="@style/TextSmall" />
|
android:layout_height="wrap_content"
|
||||||
</LinearLayout>
|
android:layout_width="match_parent" >
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/list_item_recording"
|
android:id="@+id/list_item_recording"
|
||||||
|
android:layout_column="1"
|
||||||
android:singleLine="true"
|
android:singleLine="true"
|
||||||
style="@style/TextSmall" />
|
style="@style/TextSmall" />
|
||||||
|
</TableRow>
|
||||||
|
<TableRow
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:layout_width="match_parent" >
|
||||||
<TextView
|
<TextView
|
||||||
android:id="@+id/list_item_description"
|
android:id="@+id/list_item_description"
|
||||||
|
android:layout_column="1"
|
||||||
android:singleLine="false"
|
android:singleLine="false"
|
||||||
android:textColor="@android:color/secondary_text_dark"
|
android:textColor="@android:color/secondary_text_dark"
|
||||||
style="@style/TextSmall" />
|
style="@style/TextSmall" />
|
||||||
</LinearLayout>
|
</TableRow>
|
||||||
</LinearLayout>
|
</TableLayout>
|
||||||
@@ -69,11 +69,11 @@ Google은 이용자에 대한 위치정보의 이용∙제공사실을 위치정
|
|||||||
구글코리아 유한회사\n
|
구글코리아 유한회사\n
|
||||||
대표자: 염동훈\n
|
대표자: 염동훈\n
|
||||||
주소 : 서울 강남구 역삼동 737 강남파이낸스센터 22층\n
|
주소 : 서울 강남구 역삼동 737 강남파이낸스센터 22층\n
|
||||||
전화번호 : (02) 531-9000\n
|
전화번호 : (02) 531-9000\n</string>
|
||||||
</string>
|
|
||||||
<string name="maps_public_unlisted_url">support.google.com/maps/bin/answer.py?answer=144365</string>
|
<string name="maps_public_unlisted_url">support.google.com/maps/bin/answer.py?answer=144365</string>
|
||||||
<string name="marker_statistics_icon_url">http://maps.google.com/mapfiles/ms/micons/ylw-pushpin.png</string>
|
<string name="marker_statistics_icon_url">http://maps.google.com/mapfiles/ms/micons/ylw-pushpin.png</string>
|
||||||
<string name="marker_waypoint_icon_url">http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png</string>
|
<string name="marker_waypoint_icon_url">http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png</string>
|
||||||
|
<string name="my_tracks_help_url">http://support.google.com/gmm/bin/topic.py?topic=2391064</string>
|
||||||
<string name="my_tracks_privacy_url">www.google.com/policies/privacy/</string>
|
<string name="my_tracks_privacy_url">www.google.com/policies/privacy/</string>
|
||||||
<string name="my_tracks_recording_service_name">My Tracks Recording Service</string>
|
<string name="my_tracks_recording_service_name">My Tracks Recording Service</string>
|
||||||
<string name="my_tracks_support_url">groups.google.com/a/googleproductforums.com/forum/#!categories/maps/mytracks</string>
|
<string name="my_tracks_support_url">groups.google.com/a/googleproductforums.com/forum/#!categories/maps/mytracks</string>
|
||||||
|
|||||||
@@ -562,14 +562,14 @@ limitations under the License.
|
|||||||
Google Drive.">
|
Google Drive.">
|
||||||
Do you want to sync your tracks with Google Drive? This will allow you to view your tracks in
|
Do you want to sync your tracks with Google Drive? This will allow you to view your tracks in
|
||||||
Google Drive, share tracks via Google Drive, and view tracks shared with you. All tracks synced
|
Google Drive, share tracks via Google Drive, and view tracks shared with you. All tracks synced
|
||||||
to Google Drive will be private by default.
|
to Google Drive will be private by default.
|
||||||
</string>
|
</string>
|
||||||
<string name="enable_sync_title"
|
<string name="enable_sync_title"
|
||||||
translation_description="The dialog title asking the user if he wants to enable sync with Google
|
translation_description="The dialog title asking the user if he wants to enable sync with Google
|
||||||
Drive.">
|
Drive.">
|
||||||
Sync with Google Drive
|
Sync with Google Drive
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Eula -->
|
<!-- Eula -->
|
||||||
<string name="eula_accept"
|
<string name="eula_accept"
|
||||||
translation_description="In the 'Terms of Service' dialog, the button to accept.">
|
translation_description="In the 'Terms of Service' dialog, the button to accept.">
|
||||||
@@ -780,183 +780,6 @@ limitations under the License.
|
|||||||
Tracks' dialog.">
|
Tracks' dialog.">
|
||||||
About My Tracks
|
About My Tracks
|
||||||
</string>
|
</string>
|
||||||
<string name="help_battery_life_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on battery life.">
|
|
||||||
The GPS receiver draws a relatively high amount of power, so a fully charged battery typically
|
|
||||||
survives less than 5 hours. Battery life depends on many factors, including signal strength,
|
|
||||||
battery freshness, and tasks running in parallel. Switching off some or all of the device\'s
|
|
||||||
radios will lengthen battery life. Putting the device into Airplane mode will yield the best
|
|
||||||
results.
|
|
||||||
</string>
|
|
||||||
<string name="help_battery_life_question"
|
|
||||||
translation_description="In the 'Help' page, the question on battery life.">
|
|
||||||
How long does the battery last when recording tracks?
|
|
||||||
</string>
|
|
||||||
<string name="help_data_connection_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on data connection.">
|
|
||||||
Cell signal or data connection is not required to record GPS tracks. However, if there is no
|
|
||||||
data connection, you will not be able to see a map. Instead, you will see a grey screen or a
|
|
||||||
partial map. Tracks, represented as simple lines, can still be recorded even if there is no data
|
|
||||||
connection.
|
|
||||||
</string>
|
|
||||||
<string name="help_data_connection_question"
|
|
||||||
translation_description="In the 'Help' page, the question on data connection.">
|
|
||||||
Do I need cell signal and data connection to use My Tracks?
|
|
||||||
</string>
|
|
||||||
<string name="help_delete_tracks_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on delete tracks.">
|
|
||||||
From the track list, select “Delete all” when not recording. This permanently
|
|
||||||
deletes the recorded tracks from the device memory. If you have saved tracks or backups on the
|
|
||||||
external storage, you must delete them separately. You can access the external storage using
|
|
||||||
any file manager app from the Play Store or using a USB cable to connect your device to your
|
|
||||||
computer. Tracks uploaded to Google Maps, Google Fusion Tables, and Google Spreadsheets must
|
|
||||||
also be deleted separately.
|
|
||||||
</string>
|
|
||||||
<string name="help_delete_tracks_question"
|
|
||||||
translation_description="In the 'Help' page, the question on delete tracks.">
|
|
||||||
How do I delete all the tracks from the device?
|
|
||||||
</string>
|
|
||||||
<string name="help_edit_tracks_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on edit tracks.">
|
|
||||||
Currently, you can\'t with My Tracks. But you can upload your tracks to Google or save them to
|
|
||||||
the external storage to modify them there.
|
|
||||||
</string>
|
|
||||||
<string name="help_edit_tracks_question"
|
|
||||||
translation_description="In the 'Help' page, the question on edit tracks.">
|
|
||||||
How can I edit or correct tracks for accuracy?
|
|
||||||
</string>
|
|
||||||
<string name="help_elevation_precision_answer"
|
|
||||||
translation_description="In the 'Help' page, the help content answer on elevation precision.">
|
|
||||||
GPS receivers measure elevations much less precisely than latitude and longitude. Elevations
|
|
||||||
can sometimes be off by a few hundred feet, though relative changes are tracked more precisely.
|
|
||||||
To get a good elevation measurement, make sure that you have a strong GPS signal and wait a few
|
|
||||||
minutes for the elevation to settle to a stable value.
|
|
||||||
</string>
|
|
||||||
<string name="help_elevation_precision_question"
|
|
||||||
translation_description="In the 'Help' page, the question on elevation precision.">
|
|
||||||
How precise is the elevation measurement?
|
|
||||||
</string>
|
|
||||||
<string name="help_external_storage_access_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on external storage access.">
|
|
||||||
Tracks saved on the external storage are not encrypted. Any application on the device can access
|
|
||||||
them.
|
|
||||||
</string>
|
|
||||||
<string name="help_external_storage_access_question"
|
|
||||||
translation_description="In the 'Help' page, the question on external storage access.">
|
|
||||||
Who can access the tracks saved on the external storage?
|
|
||||||
</string>
|
|
||||||
<string name="help_gps_signal_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on the GPS signal message.">
|
|
||||||
For My Tracks to work, your device needs to be in line-of-sight contact with the GPS satellites.
|
|
||||||
If the line-of-sight is obstructed by trees, buildings or canyon walls, you may not get an
|
|
||||||
accurate signal. If you see the message, wait a minute or two. If your device still does not
|
|
||||||
find a signal, move to an area clear of obstructions and try again.
|
|
||||||
</string>
|
|
||||||
<string name="help_gps_signal_question"
|
|
||||||
translation_description="In the 'Help' page, the question on the GPS signal message.">
|
|
||||||
Why does the application sometimes display “Waiting for GPS signal.”?
|
|
||||||
</string>
|
|
||||||
<string name="help_location_precision_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on location precision.">
|
|
||||||
Under optimal conditions, the location error can be +/- 20 feet (6 meters). However, precision
|
|
||||||
depends on the quality of the GPS signal. The blue circle around the orange location arrow
|
|
||||||
indicates estimated precision. (You may need to zoom in or zoom out to see the circle.) You can
|
|
||||||
change the GPS precision at Settings -> Recording -> GPS accuracy.
|
|
||||||
</string>
|
|
||||||
<string name="help_location_precision_question"
|
|
||||||
translation_description="In the 'Help' page, the question on location precision.">
|
|
||||||
How precise are the recorded tracks?
|
|
||||||
</string>
|
|
||||||
<string name="help_maps_public_unlisted_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on public versus unlisted maps.
|
|
||||||
|
|
||||||
%1$s url. E.g., 'support.google.com/maps/bin/answer.py?answer=144365'.">
|
|
||||||
See %1$s.
|
|
||||||
</string>
|
|
||||||
<string name="help_maps_public_unlisted_question"
|
|
||||||
translation_description="In the 'Help' page, the question on public versus unlisted maps.">
|
|
||||||
What is the difference between public and unlisted when sending a track to Google Maps?
|
|
||||||
</string>
|
|
||||||
<string name="help_marker_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on markers.">
|
|
||||||
Markers are used to annotate a location.
|
|
||||||
</string>
|
|
||||||
<string name="help_marker_question"
|
|
||||||
translation_description="In the 'Help' page, the question on markers.">
|
|
||||||
What are markers?
|
|
||||||
</string>
|
|
||||||
<string name="help_my_tracks_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on what is My Tracks.">
|
|
||||||
My Tracks allows you to record GPS tracks and visualize your walking, running, biking or any
|
|
||||||
other activity while watching live performance statistics. My Tracks makes it easy to archive
|
|
||||||
your training history with Google Maps, Google Fusion Tables, and Google Spreadsheets, and share
|
|
||||||
your activities with friends and the world.
|
|
||||||
</string>
|
|
||||||
<string name="help_my_tracks_question"
|
|
||||||
translation_description="In the 'Help' page, the question on what is My Tracks.">
|
|
||||||
What is My Tracks?
|
|
||||||
</string>
|
|
||||||
<string name="help_saved_files_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on saved files.">
|
|
||||||
You can use Google Earth or similar applications to visualize and edit GPS tracks.
|
|
||||||
</string>
|
|
||||||
<string name="help_saved_files_question"
|
|
||||||
translation_description="In the 'Help' page, the question on saved files.">
|
|
||||||
What can I do with tracks after saving them to the external storage or sharing such files with
|
|
||||||
friends?
|
|
||||||
</string>
|
|
||||||
<string name="help_send_track_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on sending a track.
|
|
||||||
|
|
||||||
%1$s url. E.g., 'maps.google.com'.
|
|
||||||
%2$s url. E.g., 'google.com/fusiontables'.
|
|
||||||
%3$s url. E.g., 'drive.google.com'.">
|
|
||||||
You can send a track to Google Maps, Google Fusion Tables, and Google Spreadsheets. Tracks sent
|
|
||||||
to Google Maps are at %1$s, “My Places”. Tracks sent to Google Fusion Tables are at
|
|
||||||
%2$s. Tracks sent to Google Spreadsheets are at %3$s.
|
|
||||||
</string>
|
|
||||||
<string name="help_send_track_question"
|
|
||||||
translation_description="In the 'Help' page, the question on sending a track.">
|
|
||||||
Where can I send a track?
|
|
||||||
</string>
|
|
||||||
<string name="help_share_friends_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on sharing with friends.">
|
|
||||||
You can share a track as a link to Google Maps. Your track will first get uploaded to Google
|
|
||||||
Maps.
|
|
||||||
</string>
|
|
||||||
<string name="help_share_friends_question"
|
|
||||||
translation_description="In the 'Help' page, the question on sharing with friends.">
|
|
||||||
How do I share a track with friends?
|
|
||||||
</string>
|
|
||||||
<string name="help_share_visibility_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on share visibility.">
|
|
||||||
By default, tracks sent to Google Maps are unlisted, tracks sent to Google Fusion Tables are
|
|
||||||
private, and tracks sent to Google Spreadsheets are private. For Google Maps, you can change the
|
|
||||||
default between public and unlisted via Settings -> Google. After uploading tracks, you can
|
|
||||||
change their visibility in Google Maps, Google Fusion Tables, and Google Spreadsheets.
|
|
||||||
</string>
|
|
||||||
<string name="help_share_visibility_question"
|
|
||||||
translation_description="In the 'Help' page, the question on share visibility.">
|
|
||||||
Who can see the tracks I send to Google Maps, Google Fusion Tables, and Google Spreadsheets?
|
|
||||||
</string>
|
|
||||||
<string name="help_split_marker_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on split markers.">
|
|
||||||
Split markers are used to segment a track to calculate statistics for each segment. Split
|
|
||||||
markers are inserted by setting the split frequency from the menu.
|
|
||||||
</string>
|
|
||||||
<string name="help_split_marker_question"
|
|
||||||
translation_description="In the 'Help' page, the question on split markers.">
|
|
||||||
What are split markers?
|
|
||||||
</string>
|
|
||||||
<string name="help_split_track_answer"
|
|
||||||
translation_description="In the 'Help' page, the answer on splitting long tracks.">
|
|
||||||
Tracks on Google Maps and Google Fusion Tables are limited to certain sizes.
|
|
||||||
</string>
|
|
||||||
<string name="help_split_track_question"
|
|
||||||
translation_description="In the 'Help' page, the question on splitting long tracks.">
|
|
||||||
Why do very long tracks split into multiple segments upon sending them to Google Maps and
|
|
||||||
Google Fusion Tables?
|
|
||||||
</string>
|
|
||||||
|
|
||||||
<!-- Icon -->
|
<!-- Icon -->
|
||||||
<string name="icon_application"
|
<string name="icon_application"
|
||||||
@@ -1388,7 +1211,7 @@ limitations under the License.
|
|||||||
installation when the app wants to write data to My Tracks.">
|
installation when the app wants to write data to My Tracks.">
|
||||||
write data to Google My Tracks and start/stop Google My Tracks recording
|
write data to Google My Tracks and start/stop Google My Tracks recording
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Save -->
|
<!-- Save -->
|
||||||
<string name="save_error"
|
<string name="save_error"
|
||||||
translation_description="When saving to the external storage, the error message indicating that
|
translation_description="When saving to the external storage, the error message indicating that
|
||||||
@@ -2237,11 +2060,11 @@ limitations under the License.
|
|||||||
<string name="share_track_add_emails_title"
|
<string name="share_track_add_emails_title"
|
||||||
translation_description="The dialog title for adding emails to share a track with.">
|
translation_description="The dialog title for adding emails to share a track with.">
|
||||||
Add emails
|
Add emails
|
||||||
</string>
|
</string>
|
||||||
<string name="share_track_add_emails_hint"
|
<string name="share_track_add_emails_hint"
|
||||||
translation_description="The hint in the auto complete text box for entering email addresses.">
|
translation_description="The hint in the auto complete text box for entering email addresses.">
|
||||||
Enter email addresses
|
Enter email addresses
|
||||||
</string>
|
</string>
|
||||||
<string name="share_track_drive_confirm_message"
|
<string name="share_track_drive_confirm_message"
|
||||||
translation_description="The confirmation message when sharing a track via Google Drive with
|
translation_description="The confirmation message when sharing a track via Google Drive with
|
||||||
friends.">
|
friends.">
|
||||||
@@ -2466,7 +2289,7 @@ limitations under the License.
|
|||||||
Drive.">
|
Drive.">
|
||||||
Shared with me
|
Shared with me
|
||||||
</string>
|
</string>
|
||||||
|
|
||||||
<!-- Track Widget -->
|
<!-- Track Widget -->
|
||||||
<string name="track_widget_config_title"
|
<string name="track_widget_config_title"
|
||||||
translation_description="Title of the page to configure the My Tracks widget items.">
|
translation_description="Title of the page to configure the My Tracks widget items.">
|
||||||
|
|||||||
@@ -106,6 +106,14 @@ limitations under the License.
|
|||||||
<item name="android:layout_gravity">center</item>
|
<item name="android:layout_gravity">center</item>
|
||||||
<item name="android:padding">8dp</item>
|
<item name="android:padding">8dp</item>
|
||||||
</style>
|
</style>
|
||||||
|
<!-- list item date -->
|
||||||
|
<style name="ListItemDate" parent="@style/TextSmall">
|
||||||
|
<item name="android:gravity">right</item>
|
||||||
|
<item name="android:layout_gravity">bottom</item>
|
||||||
|
<item name="android:paddingLeft">8dp</item>
|
||||||
|
<item name="android:singleLine">true</item>
|
||||||
|
<item name="android:textColor">@android:color/secondary_text_dark</item>
|
||||||
|
</style>
|
||||||
<!-- scroll view -->
|
<!-- scroll view -->
|
||||||
<style name="ScrollView">
|
<style name="ScrollView">
|
||||||
<item name="android:layout_height">match_parent</item>
|
<item name="android:layout_height">match_parent</item>
|
||||||
|
|||||||
@@ -20,13 +20,13 @@ import com.google.android.apps.mytracks.fragments.AboutDialogFragment;
|
|||||||
import com.google.android.apps.mytracks.fragments.AboutDialogFragment.AboutCaller;
|
import com.google.android.apps.mytracks.fragments.AboutDialogFragment.AboutCaller;
|
||||||
import com.google.android.apps.mytracks.fragments.EulaDialogFragment;
|
import com.google.android.apps.mytracks.fragments.EulaDialogFragment;
|
||||||
import com.google.android.apps.mytracks.fragments.EulaDialogFragment.EulaCaller;
|
import com.google.android.apps.mytracks.fragments.EulaDialogFragment.EulaCaller;
|
||||||
import com.google.android.apps.mytracks.util.StringUtils;
|
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.os.Bundle;
|
import android.os.Bundle;
|
||||||
import android.view.View;
|
import android.view.View;
|
||||||
import android.view.View.OnClickListener;
|
import android.view.View.OnClickListener;
|
||||||
import android.widget.TextView;
|
import android.webkit.WebView;
|
||||||
|
import android.webkit.WebViewClient;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* An activity that displays the help page.
|
* An activity that displays the help page.
|
||||||
@@ -39,14 +39,10 @@ public class HelpActivity extends AbstractMyTracksActivity implements AboutCalle
|
|||||||
protected void onCreate(Bundle savedInstanceState) {
|
protected void onCreate(Bundle savedInstanceState) {
|
||||||
super.onCreate(savedInstanceState);
|
super.onCreate(savedInstanceState);
|
||||||
|
|
||||||
TextView mapsPublicUnlisted = (TextView) findViewById(R.id.help_maps_public_unlisted_answer);
|
WebView webView = (WebView) findViewById(R.id.help_webview);
|
||||||
mapsPublicUnlisted.setText(StringUtils.getHtml(
|
webView.loadUrl(getString(R.string.my_tracks_help_url));
|
||||||
this, R.string.help_maps_public_unlisted_answer, R.string.maps_public_unlisted_url));
|
webView.getSettings().setJavaScriptEnabled(true);
|
||||||
|
webView.setWebViewClient(new WebViewClient());
|
||||||
TextView sendTrack = (TextView) findViewById(R.id.help_send_track_answer);
|
|
||||||
sendTrack.setText(StringUtils.getHtml(
|
|
||||||
this, R.string.help_send_track_answer, R.string.send_google_maps_url,
|
|
||||||
R.string.send_google_fusion_tables_url, R.string.send_google_spreadsheets_url));
|
|
||||||
|
|
||||||
findViewById(R.id.help_ok).setOnClickListener(new OnClickListener() {
|
findViewById(R.id.help_ok).setOnClickListener(new OnClickListener() {
|
||||||
public void onClick(View v) {
|
public void onClick(View v) {
|
||||||
@@ -74,6 +70,6 @@ public class HelpActivity extends AbstractMyTracksActivity implements AboutCalle
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onEulaDone() {
|
public void onEulaDone() {
|
||||||
// Do nothing
|
// Do nothing
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package com.google.android.apps.mytracks.fragments;
|
package com.google.android.apps.mytracks.fragments;
|
||||||
|
|
||||||
|
import com.google.android.apps.mytracks.util.PreferencesUtils;
|
||||||
import com.google.android.maps.mytracks.R;
|
import com.google.android.maps.mytracks.R;
|
||||||
|
|
||||||
import android.app.Activity;
|
import android.app.Activity;
|
||||||
@@ -64,20 +65,31 @@ public class EnableSyncDialogFragment extends DialogFragment {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
public void onCreate(Bundle savedInstanceState) {
|
||||||
|
super.onCreate(savedInstanceState);
|
||||||
fragmentActivity = getActivity();
|
fragmentActivity = getActivity();
|
||||||
return new AlertDialog.Builder(fragmentActivity).setNegativeButton(
|
if (PreferencesUtils.getBoolean(
|
||||||
R.string.generic_cancel, new OnClickListener() {
|
fragmentActivity, R.string.drive_sync_key, PreferencesUtils.DRIVE_SYNC_DEFAULT)) {
|
||||||
|
dismiss();
|
||||||
|
caller.onEnableSyncDone(false);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||||
|
return new AlertDialog.Builder(fragmentActivity).setMessage(R.string.enable_sync_message)
|
||||||
|
.setNegativeButton(R.string.generic_cancel, new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
caller.onEnableSyncDone(false);
|
caller.onEnableSyncDone(false);
|
||||||
}
|
}
|
||||||
}).setPositiveButton(R.string.generic_ok, new OnClickListener() {
|
}).setPositiveButton(R.string.generic_ok, new OnClickListener() {
|
||||||
@Override
|
@Override
|
||||||
public void onClick(DialogInterface dialog, int which) {
|
public void onClick(DialogInterface dialog, int which) {
|
||||||
caller.onEnableSyncDone(true);
|
caller.onEnableSyncDone(true);
|
||||||
}
|
}
|
||||||
}).setTitle(R.string.enable_sync_title).setMessage(R.string.enable_sync_message).create();
|
}).setTitle(R.string.enable_sync_title).create();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -51,8 +51,10 @@ import java.io.IOException;
|
|||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.Locale;
|
import java.util.Locale;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
import javax.xml.parsers.ParserConfigurationException;
|
import javax.xml.parsers.ParserConfigurationException;
|
||||||
|
|
||||||
@@ -158,6 +160,12 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter {
|
|||||||
.list().setQ(String.format(Locale.US, SyncUtils.MY_TRACKS_FOLDER_FILES_QUERY, folderId));
|
.list().setQ(String.format(Locale.US, SyncUtils.MY_TRACKS_FOLDER_FILES_QUERY, folderId));
|
||||||
Map<String, File> myTracksFolderMap = getFiles(myTracksFolderRequest, true);
|
Map<String, File> myTracksFolderMap = getFiles(myTracksFolderRequest, true);
|
||||||
|
|
||||||
|
// Handle tracks that are already uploaded to Google Drive
|
||||||
|
Set<String> syncedDriveIds = updateSyncedTracks(folderId);
|
||||||
|
for (String driveId : syncedDriveIds) {
|
||||||
|
myTracksFolderMap.remove(driveId);
|
||||||
|
}
|
||||||
|
|
||||||
// Get all the KML files in the "Shared with me:/" folder
|
// Get all the KML files in the "Shared with me:/" folder
|
||||||
Files.List sharedWithMeRequest = drive.files()
|
Files.List sharedWithMeRequest = drive.files()
|
||||||
.list().setQ(SyncUtils.SHARED_WITH_ME_FILES_QUERY);
|
.list().setQ(SyncUtils.SHARED_WITH_ME_FILES_QUERY);
|
||||||
@@ -176,7 +184,9 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter {
|
|||||||
if (cursor != null && cursor.moveToFirst()) {
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
do {
|
do {
|
||||||
Track track = myTracksProviderUtils.createTrack(cursor);
|
Track track = myTracksProviderUtils.createTrack(cursor);
|
||||||
myTracksProviderUtils.deleteTrack(track.getId());
|
if (!syncedDriveIds.contains(track.getDriveId())) {
|
||||||
|
myTracksProviderUtils.deleteTrack(track.getId());
|
||||||
|
}
|
||||||
} while (cursor.moveToNext());
|
} while (cursor.moveToNext());
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
@@ -188,6 +198,47 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates synced tracks.
|
||||||
|
*
|
||||||
|
* @param folderId the folder id
|
||||||
|
* @return drive ids of the synced tracks
|
||||||
|
*/
|
||||||
|
private Set<String> updateSyncedTracks(String folderId) throws IOException {
|
||||||
|
Set<String> result = new HashSet<String>();
|
||||||
|
Cursor cursor = null;
|
||||||
|
try {
|
||||||
|
cursor = myTracksProviderUtils.getTrackCursor(SyncUtils.DRIVE_ID_TRACKS_QUERY, null, null);
|
||||||
|
if (cursor != null && cursor.moveToFirst()) {
|
||||||
|
do {
|
||||||
|
Track track = myTracksProviderUtils.createTrack(cursor);
|
||||||
|
String driveId = track.getDriveId();
|
||||||
|
if (driveId != null && !driveId.equals("")) {
|
||||||
|
if (!track.isSharedWithMe()) {
|
||||||
|
File driveFile = drive.files().get(driveId).execute();
|
||||||
|
if (SyncUtils.isValid(driveFile, folderId)) {
|
||||||
|
merge(track, driveFile);
|
||||||
|
result.add(driveId);
|
||||||
|
} else {
|
||||||
|
/*
|
||||||
|
* Track has a drive id, but the drive id is no longer valid.
|
||||||
|
* E.g., the file is moved to another folder. Clear the drive
|
||||||
|
* id.
|
||||||
|
*/
|
||||||
|
SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, null);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} while (cursor.moveToNext());
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
if (cursor != null) {
|
||||||
|
cursor.close();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Performs incremental sync.
|
* Performs incremental sync.
|
||||||
*
|
*
|
||||||
@@ -241,9 +292,7 @@ public class SyncAdapter extends AbstractThreadedSyncAdapter {
|
|||||||
* E.g., the file is moved to another folder. Clear the drive
|
* E.g., the file is moved to another folder. Clear the drive
|
||||||
* id.
|
* id.
|
||||||
*/
|
*/
|
||||||
track.setDriveId("");
|
SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, null);
|
||||||
track.setModifiedTime(-1L);
|
|
||||||
myTracksProviderUtils.updateTrack(track);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ public class ListItemUtils {
|
|||||||
if (buffer.length() != 0) {
|
if (buffer.length() != 0) {
|
||||||
buffer.append(" ");
|
buffer.append(" ");
|
||||||
}
|
}
|
||||||
buffer.append("(" + totalDistance + ")");
|
buffer.append(" / " + totalDistance);
|
||||||
}
|
}
|
||||||
return buffer.toString();
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
@@ -138,10 +138,14 @@ public class ListItemUtils {
|
|||||||
if (category == null || category.length() == 0) {
|
if (category == null || category.length() == 0) {
|
||||||
return description;
|
return description;
|
||||||
}
|
}
|
||||||
if (description == null || description.length() == 0) {
|
|
||||||
return category;
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
|
||||||
|
buffer.append("[" + category + "]");
|
||||||
|
if (description != null && description.length() != 0) {
|
||||||
|
buffer.append(" " + description);
|
||||||
}
|
}
|
||||||
return "[" + category + "] " + description;
|
return buffer.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||