Merge heads

This commit is contained in:
youtaol
2013-06-08 13:12:39 +08:00
parent 7a09e89041
commit d1055ef5ee
48 changed files with 374 additions and 411 deletions
+2 -2
View File
@@ -16,8 +16,8 @@ limitations under the License.
--> -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android" <manifest xmlns:android="http://schemas.android.com/apk/res/android"
android:installLocation="auto" android:installLocation="auto"
android:versionCode="66" android:versionCode="67"
android:versionName="2.0.4" android:versionName="2.0.5"
package="com.google.android.maps.mytracks" > package="com.google.android.maps.mytracks" >
<!-- Permission to initialize services --> <!-- Permission to initialize services -->
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" /> <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
Binary file not shown.

Before

Width:  |  Height:  |  Size: 140 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

After

Width:  |  Height:  |  Size: 312 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

After

Width:  |  Height:  |  Size: 253 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 144 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

After

Width:  |  Height:  |  Size: 361 B

@@ -1,20 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
Copyright 2013 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.
-->
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/list_selector_background_mytracks" android:state_activated="true"/>
<item android:drawable="@android:color/transparent"/>
</selector>
+2 -2
View File
@@ -65,10 +65,10 @@ limitations under the License.
android:id="@+id/export_external_storage_options" android:id="@+id/export_external_storage_options"
style="@style/ExportRadioGroup" > style="@style/ExportRadioGroup" >
<RadioButton <RadioButton
android:id="@+id/export_external_storage_gpx" android:id="@+id/export_external_storage_kml"
style="@style/TextMedium" /> style="@style/TextMedium" />
<RadioButton <RadioButton
android:id="@+id/export_external_storage_kml" android:id="@+id/export_external_storage_gpx"
style="@style/TextMedium" /> style="@style/TextMedium" />
<RadioButton <RadioButton
android:id="@+id/export_external_storage_csv" android:id="@+id/export_external_storage_csv"
@@ -20,15 +20,31 @@ limitations under the License.
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_width="match_parent" android:layout_width="match_parent"
android:orientation="vertical" android:orientation="vertical"
android:padding="8dp" > android:paddingBottom="16dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:paddingTop="8dp" >
<CheckBox
android:id="@+id/share_track_public"
android:layout_gravity="center_vertical"
android:text="@string/share_track_public"
style="@style/TextMedium" />
<CheckBox
android:id="@+id/share_track_invite"
android:layout_gravity="center_vertical"
android:layout_marginTop="16dp"
android:text="@string/share_track_invite"
style="@style/TextMedium" />
<MultiAutoCompleteTextView <MultiAutoCompleteTextView
android:hint="@string/share_track_add_emails_hint"
android:completionThreshold="1" android:completionThreshold="1"
android:id="@+id/add_emails" android:hint="@string/share_track_emails_hint"
android:id="@+id/share_track_emails"
android:imeOptions="actionDone" android:imeOptions="actionDone"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginLeft="8dp"
android:layout_width="match_parent" android:layout_width="match_parent"
android:singleLine="false" > android:singleLine="false"
android:visibility="gone" >
</MultiAutoCompleteTextView> </MultiAutoCompleteTextView>
</LinearLayout> </LinearLayout>
</ScrollView> </ScrollView>
+13 -13
View File
@@ -27,32 +27,32 @@ limitations under the License.
android:showAsAction="ifRoom" android:showAsAction="ifRoom"
android:title="@string/menu_start_gps"/> android:title="@string/menu_start_gps"/>
<item <item
android:icon="@drawable/menu_import" android:icon="@drawable/menu_sync_now"
android:id="@+id/track_list_import_all" android:id="@+id/track_list_sync_now"
android:title="@string/menu_import_all"> android:title="@string/menu_sync_now"/>
</item> <item
android:icon="@drawable/menu_aggregated_statistics"
android:id="@+id/track_list_aggregated_statistics"
android:title="@string/menu_aggregated_statistics"/>
<item <item
android:icon="@drawable/menu_export" android:icon="@drawable/menu_export"
android:id="@+id/track_list_export_all" android:id="@+id/track_list_export_all"
android:title="@string/menu_export_all"> android:title="@string/menu_export_all">
</item> </item>
<item
android:icon="@drawable/menu_import"
android:id="@+id/track_list_import_all"
android:title="@string/menu_import_all">
</item>
<item <item
android:icon="@drawable/menu_delete" android:icon="@drawable/menu_delete"
android:id="@+id/track_list_delete_all" android:id="@+id/track_list_delete_all"
android:title="@string/menu_delete_all"/> android:title="@string/menu_delete_all"/>
<item
android:icon="@drawable/menu_aggregated_statistics"
android:id="@+id/track_list_aggregated_statistics"
android:title="@string/menu_aggregated_statistics"/>
<item
android:icon="@drawable/menu_sync_now"
android:id="@+id/track_list_sync_now"
android:title="@string/menu_sync_now"/>
<item <item
android:icon="@drawable/menu_settings" android:icon="@drawable/menu_settings"
android:id="@+id/track_list_settings" android:id="@+id/track_list_settings"
android:title="@string/menu_settings"/> android:title="@string/menu_settings"/>
<item <item
android:icon="@drawable/menu_feedback" android:icon="@drawable/menu_feedback"
android:id="@+id/track_list_feedback" android:id="@+id/track_list_feedback"
android:title="@string/menu_feedback"/> android:title="@string/menu_feedback"/>
Binary file not shown.
+1 -1
View File
@@ -34,7 +34,7 @@ limitations under the License.
<item name="android:measureWithLargestChild">true</item> <item name="android:measureWithLargestChild">true</item>
</style> </style>
<style name="ListItem"> <style name="ListItem">
<item name="android:background">@drawable/activated_background_mytracks</item> <item name="android:background">?android:attr/activatedBackgroundIndicator</item>
</style> </style>
<style name="ThemeSelector" parent="android:Theme.Holo"> <style name="ThemeSelector" parent="android:Theme.Holo">
<item name="android:actionBarStyle">@style/ActionBarStyle.MyTracks</item> <item name="android:actionBarStyle">@style/ActionBarStyle.MyTracks</item>
@@ -93,8 +93,8 @@ limitations under the License.
<item>-1</item> <item>-1</item>
</string-array> </string-array>
<string-array name="file_types"> <string-array name="file_types">
<item>GPX</item>
<item>KML</item> <item>KML</item>
<item>GPX</item>
<item>CSV</item> <item>CSV</item>
<item>TCX</item> <item>TCX</item>
</string-array> </string-array>
+2
View File
@@ -37,6 +37,8 @@ limitations under the License.
<string name="min_required_accuracy_key">minRequiredAccuracy</string> <string name="min_required_accuracy_key">minRequiredAccuracy</string>
<string name="report_speed_key">reportSpeed</string> <string name="report_speed_key">reportSpeed</string>
<string name="sensor_type_key">sensorType</string> <string name="sensor_type_key">sensorType</string>
<string name="share_track_invite_key">shareTrackInvite</string>
<string name="share_track_public_key">shareTrackPublic</string>
<string name="split_frequency_key">splitFrequency</string> <string name="split_frequency_key">splitFrequency</string>
<string name="stats_show_coordinate_key">statsShowCoordinate</string> <string name="stats_show_coordinate_key">statsShowCoordinate</string>
<string name="stats_show_grade_elevation_key">statsShowGradeElevation</string> <string name="stats_show_grade_elevation_key">statsShowGradeElevation</string>
+80 -61
View File
@@ -613,17 +613,50 @@ limitations under the License.
</string> </string>
<!-- Export --> <!-- Export -->
<string name="export_all_option"
translation_description="When exporting all tracks to the external storage, the option to export
as a certain file format.
%1$s: file format. 'KML', 'GPX', 'CSV', or 'TCX'.">
Export all as %1$s
</string>
<string name="export_all_title"
translation_description="The dialog title to export all tracks to the external storage.">
Export to external storage
</string>
<string name="export_external_storage" <string name="export_external_storage"
translation_description="When exporting a track, the option to export to external storage."> translation_description="When exporting a track, the option to export to the external storage.">
External storage External storage
</string> </string>
<string name="export_external_storage_option" <string name="export_external_storage_error"
translation_description="When exporting a track to external storage, the option to export as a translation_description="When exporting tracks to the external storage, the error message
certain file format. indicating that only some of the tracks are exported.
%1$s: file format. 'GPX', 'KML', 'CSV', or 'TCX'."> %1$d the number of tracks successfully exported. E.g., '1'.
%1$s the number of tracks to export. E.g., '2 tracks'.
%2$s the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
Exported %1$d of %2$s to %3$s.
</string>
<string name="export_external_storage_option"
translation_description="When exporting a track to the external storage, the option to export as
a certain file format.
%1$s: file format. 'KML', 'GPX', 'CSV', or 'TCX'.">
as %1$s file as %1$s file
</string> </string>
<string name="export_external_storage_progress_message"
translation_description="When exporting tracks to the external storage, the progress message.
%1$s: the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
Exporting to %1$s&#8230;
</string>
<string name="export_external_storage_success"
translation_description="When exporting tracks to the external storage, the success message.
%1$s the number of tracks. E.g., '2 tracks'.
%2$s the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
Exported %1$s to %2$s.
</string>
<string name="export_google_drive" <string name="export_google_drive"
translation_description="When exporting a track, the option to export to Google Drive."> translation_description="When exporting a track, the option to export to Google Drive.">
Google Drive Google Drive
@@ -638,7 +671,7 @@ limitations under the License.
as new private table as new private table
</string> </string>
<string name="export_google_fusion_tables_public" <string name="export_google_fusion_tables_public"
translation_description="When exporting a trck to Google Fusion Tables, the option to export as translation_description="When exporting a track to Google Fusion Tables, the option to export as
a new public table as opposed to a new private table."> a new public table as opposed to a new private table.">
as new public table as new public table
</string> </string>
@@ -652,7 +685,7 @@ limitations under the License.
as new public map as new public map
</string> </string>
<string name="export_google_maps_unlisted" <string name="export_google_maps_unlisted"
translation_description="When sending a track to Google Maps, the option to export as a new translation_description="When exporting a track to Google Maps, the option to export as a new
unlisted map as opposed to a new public map."> unlisted map as opposed to a new public map.">
as new unlisted map as new unlisted map
</string> </string>
@@ -660,7 +693,7 @@ limitations under the License.
translation_description="When exporting a track, the option to export to Google Spreadsheets."> translation_description="When exporting a track, the option to export to Google Spreadsheets.">
Google Spreadsheets Google Spreadsheets
</string> </string>
<string name="export_dialog_title" <string name="export_title"
translation_description="The dialog title when exporting a track."> translation_description="The dialog title when exporting a track.">
Export to&#8230; Export to&#8230;
</string> </string>
@@ -885,27 +918,27 @@ limitations under the License.
%1$d the number of files successfully imported. E.g., '2'. %1$d the number of files successfully imported. E.g., '2'.
%2$s the number of files in the directory. E.g., '2 files'. %2$s the number of files in the directory. E.g., '2 files'.
%3$s the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'."> %3$s the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
Imported %1$d of %2$s from %3$s. Imported %1$d of %2$s from %3$s.
</string> </string>
<string name="import_no_directory" <string name="import_no_directory"
translation_description="When importing from the external storage, the error message when the translation_description="When importing from the external storage, the error message when the
directory doesn't exist. directory doesn't exist.
%1$s: the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'."> %1$s: the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
%1$s does not exist. %1$s does not exist.
</string> </string>
<string name="import_progress_message" <string name="import_progress_message"
translation_description="When importing from the external storage, the progress message. translation_description="When importing from the external storage, the progress message.
%1$s: the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'."> %1$s: the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
Importing from %1$s&#8230; Importing from %1$s&#8230;
</string> </string>
<string name="import_selection_option" <string name="import_selection_option"
translation_description="When importing from external storage, the option to import all the translation_description="When importing from external storage, the option to import all the
files of a certain file format. files of a certain file format.
%1$s: file format. 'GPX', 'KML', 'CSV', or 'TCX'."> %1$s: file format. 'KML', 'GPX', 'CSV', or 'TCX'.">
Import all %1$s Import all %1$s
</string> </string>
<string name="import_selection_title" <string name="import_selection_title"
@@ -916,7 +949,7 @@ limitations under the License.
translation_description="When importing from the external storage, the success message. translation_description="When importing from the external storage, the success message.
%1$s the number of files. E.g., '2 files'. %1$s the number of files. E.g., '2 files'.
%2$s the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'."> %2$s the directory. E.g., '/storage/sdcard0/MyTracks/kml/'.">
Imported %1$s from %2$s. Imported %1$s from %2$s.
</string> </string>
@@ -926,7 +959,7 @@ limitations under the License.
Deselect all Deselect all
</string> </string>
<string name="list_item_selected" <string name="list_item_selected"
translation_description="Title indictating the number of items selected in a list. translation_description="Title indicating the number of items selected in a list.
%1$d: an integer value. E.g., '2'."> %1$d: an integer value. E.g., '2'.">
%1$d selected %1$d selected
</string> </string>
@@ -1247,41 +1280,6 @@ limitations under the License.
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 -->
<string name="save_all_selection_option"
translation_description="When saving to external storage, the option to save all the tracks as a
certain file format.
%1$s: file format. 'GPX', 'KML', 'CSV', or 'TCX'.">
Save all as %1$s
</string>
<string name="save_error"
translation_description="When saving to the external storage, the error message indicating that
only some of the tracks are saved.
%1$d the number of tracks successfully saved. E.g., '1'.
%1$s the number of tracks to save. E.g., '2 tracks'.
%2$s the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'.">
Saved %1$d of %2$s to %3$s.
</string>
<string name="save_progress_message"
translation_description="When saving to the external storage, the progress message.
%1$s: the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'.">
Saving to %1$s&#8230;
</string>
<string name="save_selection_title"
translation_description="The dialog title to save to external storage.">
Save to external storage
</string>
<string name="save_success"
translation_description="When saving to the external storage, the success message.
%1$s the number of tracks. E.g., '2 tracks'.
%2$s the directory. E.g., '/storage/sdcard0/MyTracks/gpx/'.">
Saved %1$s to %2$s.
</string>
<!-- Search --> <!-- Search -->
<string name="search_global_description" <string name="search_global_description"
translation_description="Description of what is searched in My Tracks, to be displayed in the translation_description="Description of what is searched in My Tracks, to be displayed in the
@@ -2000,26 +1998,38 @@ limitations under the License.
</string> </string>
<!-- Share Track --> <!-- Share Track -->
<string name="share_track_add_emails_title" <string name="share_track_confirm_message"
translation_description="The dialog title for entering email addresses for sharing a track
with.">
Share track with
</string>
<string name="share_track_add_emails_hint"
translation_description="The hint in the auto complete text box for entering email addresses.">
Enter email addresses
</string>
<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.">
This will upload your track to Google Drive so you can share the file with friends. The file This will upload your track to Google Drive so you can share the file with friends.
will be private and only those you have shared with will have access. </string>
<string name="share_track_emails_hint"
translation_description="The hint for the auto complete text box for entering email addresses.">
Email addresses
</string>
<string name="share_track_invite"
translation_description="The checkbox to invite people to view a track.">
Invite people to view
</string>
<string name="share_track_no_emails"
translation_description="When sharing a track, error message indicating that no email addresses
is entered.">
No email addresses entered.
</string>
<string name="share_track_no_selection"
translation_description="When sharing a track, error message indicating that no option is
selected.">
No option selected.
</string> </string>
<string name="share_track_picker_title" <string name="share_track_picker_title"
translation_description="When sharing a track with friends, the title on the picker to ask the translation_description="When sharing a track with friends, the title on the picker to ask the
user to select an application."> user to select an application.">
Select an application Select an application
</string> </string>
<string name="share_track_public"
translation_description="The checkbox to make a track public and share its url.">
Make public &amp; share URL
</string>
<string name="share_track_share_file" <string name="share_track_share_file"
translation_description="After saving a track to the external storage, the button on the result translation_description="After saving a track to the external storage, the button on the result
dialog to share the saved track file with friends."> dialog to share the saved track file with friends.">
@@ -2046,10 +2056,19 @@ limitations under the License.
%2$s: track description."> %2$s: track description.">
I think you might be interested in this track:\n\n%1$s\n\n%2$s I think you might be interested in this track:\n\n%1$s\n\n%2$s
</string> </string>
<string name="share_track_share_url_title"
translation_description="The dialog title asking the user to select an application for sharing
an URL.">
Share URL using:
</string>
<string name="share_track_subject" <string name="share_track_subject"
translation_description="When sharing a track with friends, the subject line."> translation_description="When sharing a track with friends, the subject line.">
I would like to share a track with you I would like to share a track with you
</string> </string>
<string name="share_track_title"
translation_description="The dialog title to share a track.">
Share track
</string>
<!-- Stats --> <!-- Stats -->
<string name="stats_average_moving_pace" <string name="stats_average_moving_pace"
+2 -1
View File
@@ -75,7 +75,8 @@ limitations under the License.
<!-- export radio group --> <!-- export radio group -->
<style name="ExportRadioGroup"> <style name="ExportRadioGroup">
<item name="android:layout_height">wrap_content</item> <item name="android:layout_height">wrap_content</item>
<item name="android:layout_marginLeft">16dp</item> <item name="android:layout_marginBottom">8dp</item>
<item name="android:layout_marginLeft">20dp</item>
<item name="android:layout_width">match_parent</item> <item name="android:layout_width">match_parent</item>
</style> </style>
<!-- help answer --> <!-- help answer -->
@@ -16,16 +16,15 @@
package com.google.android.apps.mytracks; package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.fragments.AddEmailsDialogFragment;
import com.google.android.apps.mytracks.fragments.AddEmailsDialogFragment.AddEmailsCaller;
import com.google.android.apps.mytracks.fragments.CheckPermissionFragment; import com.google.android.apps.mytracks.fragments.CheckPermissionFragment;
import com.google.android.apps.mytracks.fragments.CheckPermissionFragment.CheckPermissionCaller; import com.google.android.apps.mytracks.fragments.CheckPermissionFragment.CheckPermissionCaller;
import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment; import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment;
import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment.ChooseAccountCaller; import com.google.android.apps.mytracks.fragments.ChooseAccountDialogFragment.ChooseAccountCaller;
import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment; import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment;
import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller; import com.google.android.apps.mytracks.fragments.ConfirmDialogFragment.ConfirmCaller;
import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment; import com.google.android.apps.mytracks.fragments.InstallEarthDialogFragment;
import com.google.android.apps.mytracks.fragments.ShareTrackDialogFragment;
import com.google.android.apps.mytracks.fragments.ShareTrackDialogFragment.ShareTrackCaller;
import com.google.android.apps.mytracks.io.drive.SendDriveActivity; import com.google.android.apps.mytracks.io.drive.SendDriveActivity;
import com.google.android.apps.mytracks.io.file.SaveActivity; import com.google.android.apps.mytracks.io.file.SaveActivity;
import com.google.android.apps.mytracks.io.file.TrackFileFormat; import com.google.android.apps.mytracks.io.file.TrackFileFormat;
@@ -66,7 +65,7 @@ import java.io.IOException;
* @author Jimmy Shih * @author Jimmy Shih
*/ */
public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActivity implements public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActivity implements
ChooseAccountCaller, CheckPermissionCaller, AddEmailsCaller, ConfirmCaller { ChooseAccountCaller, CheckPermissionCaller, ShareTrackCaller, ConfirmCaller {
private static final String TAG = AbstractMyTracksActivity.class.getSimpleName(); private static final String TAG = AbstractMyTracksActivity.class.getSimpleName();
private static final String SEND_REQUEST_KEY = "send_request_key"; private static final String SEND_REQUEST_KEY = "send_request_key";
@@ -182,13 +181,12 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
} }
@Override @Override
public void onAddEmailsDone(String emails) { public void onShareTrackDone(String emails, boolean makePublic) {
if (emails != null && !emails.equals("")) { sendRequest.setDriveShareEmails(emails);
sendRequest.setDriveShareEmails(emails); sendRequest.setDriveSharePublic(makePublic);
Intent intent = IntentUtils.newIntent(this, SendDriveActivity.class) Intent intent = IntentUtils.newIntent(this, SendDriveActivity.class)
.putExtra(SendRequest.SEND_REQUEST_KEY, sendRequest); .putExtra(SendRequest.SEND_REQUEST_KEY, sendRequest);
startActivity(intent); startActivity(intent);
}
} }
private void onDrivePermissionSuccess() { private void onDrivePermissionSuccess() {
@@ -260,15 +258,11 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
* <p> * <p>
* isSendDrive and isDriveEnableSync -> enable sync * isSendDrive and isDriveEnableSync -> enable sync
* <p> * <p>
* isSendDrive and isDriveShare -> show {@link AddEmailsDialogFragment} * isSendDrive and isDriveShare -> show {@link ShareTrackDialogFragment}
* <p> * <p>
* isSendDrive -> start {@link SendDriveActivity} * isSendDrive -> start {@link SendDriveActivity}
* <p> * <p>
* isSendMaps and isMapShare -> show {@link ChooseActivityDialogFragment} * isSendMaps -> start {@link SendMapsActivity}
* <p>
* isSendMaps and isMapsExistingMap -> start {@link ChooseMapActivity}
* <p>
* isSendMaps and !isMapsExistingMap -> {@link SendMapsActivity}
* <p> * <p>
* isSendFusionTables -> start {@link SendFusionTablesActivity} * isSendFusionTables -> start {@link SendFusionTablesActivity}
* <p> * <p>
@@ -292,8 +286,8 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
SyncUtils.enableSync(sendRequest.getAccount()); SyncUtils.enableSync(sendRequest.getAccount());
return; return;
} else if (sendRequest.isDriveShare()) { } else if (sendRequest.isDriveShare()) {
AddEmailsDialogFragment.newInstance(sendRequest.getTrackId()) ShareTrackDialogFragment.newInstance(sendRequest.getTrackId())
.show(getSupportFragmentManager(), AddEmailsDialogFragment.ADD_EMAILS_DIALOG_TAG); .show(getSupportFragmentManager(), ShareTrackDialogFragment.SHARE_TRACK_DIALOG_TAG);
return; return;
} else { } else {
next = SendDriveActivity.class; next = SendDriveActivity.class;
@@ -344,7 +338,7 @@ public abstract class AbstractSendToGoogleActivity extends AbstractMyTracksActiv
protected void confirmShare(long trackId) { protected void confirmShare(long trackId) {
ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key, ConfirmDialogFragment.newInstance(R.string.confirm_share_drive_key,
PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT, PreferencesUtils.CONFIRM_SHARE_DRIVE_DEFAULT,
getString(R.string.share_track_drive_confirm_message), new long[] { trackId }) getString(R.string.share_track_confirm_message), new long[] { trackId })
.show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG); .show(getSupportFragmentManager(), ConfirmDialogFragment.CONFIRM_DIALOG_TAG);
} }
@@ -527,7 +527,7 @@ public class TrackListActivity extends AbstractSendToGoogleActivity
return true; return true;
case R.id.track_list_export_all: case R.id.track_list_export_all:
FileTypeDialogFragment.newInstance(R.id.track_list_export_all, FileTypeDialogFragment.newInstance(R.id.track_list_export_all,
R.string.save_selection_title, R.string.save_all_selection_option, 4) R.string.export_all_title, R.string.export_all_option, 4)
.show(getSupportFragmentManager(), FileTypeDialogFragment.FILE_TYPE_DIALOG_TAG); .show(getSupportFragmentManager(), FileTypeDialogFragment.FILE_TYPE_DIALOG_TAG);
return true; return true;
case R.id.track_list_delete_all: case R.id.track_list_delete_all:
@@ -124,7 +124,7 @@ public class ChooseActivityDialogFragment extends DialogFragment {
caller.onChooseActivityDone( caller.onChooseActivityDone(
activityInfo.applicationInfo.packageName, activityInfo.name); activityInfo.applicationInfo.packageName, activityInfo.name);
} }
}).setTitle(R.string.share_track_picker_title).create(); }).setTitle(R.string.share_track_share_url_title).create();
} }
@Override @Override
@@ -120,10 +120,10 @@ public class ExportDialogFragment extends DialogFragment {
exportGoogleFusionTablesPublic ? R.id.export_google_fusion_tables_public exportGoogleFusionTablesPublic ? R.id.export_google_fusion_tables_public
: R.id.export_google_fusion_tables_private); : R.id.export_google_fusion_tables_private);
setExternalStorageOption(
(RadioButton) view.findViewById(R.id.export_external_storage_gpx), TrackFileFormat.GPX);
setExternalStorageOption( setExternalStorageOption(
(RadioButton) view.findViewById(R.id.export_external_storage_kml), TrackFileFormat.KML); (RadioButton) view.findViewById(R.id.export_external_storage_kml), TrackFileFormat.KML);
setExternalStorageOption(
(RadioButton) view.findViewById(R.id.export_external_storage_gpx), TrackFileFormat.GPX);
setExternalStorageOption( setExternalStorageOption(
(RadioButton) view.findViewById(R.id.export_external_storage_csv), TrackFileFormat.CSV); (RadioButton) view.findViewById(R.id.export_external_storage_csv), TrackFileFormat.CSV);
setExternalStorageOption( setExternalStorageOption(
@@ -159,7 +159,7 @@ public class ExportDialogFragment extends DialogFragment {
} }
caller.onExportDone(type, format); caller.onExportDone(type, format);
} }
}).setTitle(R.string.export_dialog_title).setView(view).create(); }).setTitle(R.string.export_title).setView(view).create();
} }
/** /**
@@ -179,10 +179,10 @@ public class ExportDialogFragment extends DialogFragment {
*/ */
private int getExternalStorageFormatId(TrackFileFormat trackFileFormat) { private int getExternalStorageFormatId(TrackFileFormat trackFileFormat) {
switch (trackFileFormat) { switch (trackFileFormat) {
case GPX:
return R.id.export_external_storage_gpx;
case KML: case KML:
return R.id.export_external_storage_kml; return R.id.export_external_storage_kml;
case GPX:
return R.id.export_external_storage_gpx;
case CSV: case CSV:
return R.id.export_external_storage_csv; return R.id.export_external_storage_csv;
default: default:
@@ -197,10 +197,10 @@ public class ExportDialogFragment extends DialogFragment {
*/ */
private TrackFileFormat getTrackFileFormat(int externalStorageFormatId) { private TrackFileFormat getTrackFileFormat(int externalStorageFormatId) {
switch (externalStorageFormatId) { switch (externalStorageFormatId) {
case R.id.export_external_storage_gpx:
return TrackFileFormat.GPX;
case R.id.export_external_storage_kml: case R.id.export_external_storage_kml:
return TrackFileFormat.KML; return TrackFileFormat.KML;
case R.id.export_external_storage_gpx:
return TrackFileFormat.GPX;
case R.id.export_external_storage_csv: case R.id.export_external_storage_csv:
return TrackFileFormat.CSV; return TrackFileFormat.CSV;
default: default:
@@ -62,7 +62,9 @@ import android.view.MenuItem;
import android.view.View; import android.view.View;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.view.ViewTreeObserver.OnGlobalLayoutListener; import android.view.ViewTreeObserver.OnGlobalLayoutListener;
import android.widget.FrameLayout;
import android.widget.ImageButton; import android.widget.ImageButton;
import android.widget.RelativeLayout; import android.widget.RelativeLayout;
import android.widget.TextView; import android.widget.TextView;
@@ -146,6 +148,15 @@ public class MyTracksMapFragment extends SupportMapFragment implements TrackData
RelativeLayout mapContainer = (RelativeLayout) layout.findViewById(R.id.map_container); RelativeLayout mapContainer = (RelativeLayout) layout.findViewById(R.id.map_container);
mapContainer.addView(mapView, 0); mapContainer.addView(mapView, 0);
/*
* For Froyo (2.2) and Gingerbread (2.3), need a transparent FrameLayout on
* top for view pager to work correctly.
*/
FrameLayout frameLayout = new FrameLayout(getActivity());
frameLayout.setBackgroundColor(getResources().getColor(android.R.color.transparent));
mapContainer.addView(frameLayout,
new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
myLocationImageButton = (ImageButton) layout.findViewById(R.id.map_my_location); myLocationImageButton = (ImageButton) layout.findViewById(R.id.map_my_location);
myLocationImageButton.setOnClickListener(new View.OnClickListener() { myLocationImageButton.setOnClickListener(new View.OnClickListener() {
@Override @Override
@@ -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;
@@ -30,64 +31,73 @@ import android.support.v4.app.DialogFragment;
import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentActivity;
import android.support.v4.widget.SimpleCursorAdapter; import android.support.v4.widget.SimpleCursorAdapter;
import android.view.View; import android.view.View;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.FilterQueryProvider; import android.widget.FilterQueryProvider;
import android.widget.MultiAutoCompleteTextView; import android.widget.MultiAutoCompleteTextView;
import android.widget.Toast;
/** /**
* A DialogFragment to add emails. * A DialogFragment to share a track.
* *
* @author Jimmy Shih * @author Jimmy Shih
*/ */
public class AddEmailsDialogFragment extends DialogFragment { public class ShareTrackDialogFragment extends DialogFragment {
/** /**
* Interface for caller of this dialog fragment. * Interface for caller of this dialog fragment.
* *
* @author Jimmy Shih * @author Jimmy Shih
*/ */
public interface AddEmailsCaller { public interface ShareTrackCaller {
/** /**
* Called when add emails is done. * Called when share track is done.
* *
* @param emails the added emails * @param emails the added emails
* @param makePublic true to make the track public
*/ */
public void onAddEmailsDone(String emails); public void onShareTrackDone(String emails, boolean makePublic);
} }
public static final String ADD_EMAILS_DIALOG_TAG = "addEmailsDialog"; public static final String SHARE_TRACK_DIALOG_TAG = "shareTrackDialog";
private static final String KEY_TRACK_ID = "trackId"; private static final String KEY_TRACK_ID = "trackId";
public static AddEmailsDialogFragment newInstance(long trackId) { public static ShareTrackDialogFragment newInstance(long trackId) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putLong(KEY_TRACK_ID, trackId); bundle.putLong(KEY_TRACK_ID, trackId);
AddEmailsDialogFragment addPeopleDialogFragment = new AddEmailsDialogFragment(); ShareTrackDialogFragment shareleTrackDialogFragment = new ShareTrackDialogFragment();
addPeopleDialogFragment.setArguments(bundle); shareleTrackDialogFragment.setArguments(bundle);
return addPeopleDialogFragment; return shareleTrackDialogFragment;
} }
private AddEmailsCaller caller; private ShareTrackCaller caller;
private FragmentActivity fragmentActivity; private FragmentActivity fragmentActivity;
private MultiAutoCompleteTextView multiAutoCompleteTextView; private MultiAutoCompleteTextView multiAutoCompleteTextView;
private CheckBox publicCheckBox;
private CheckBox inviteCheckBox;
@Override @Override
public void onAttach(Activity activity) { public void onAttach(Activity activity) {
super.onAttach(activity); super.onAttach(activity);
try { try {
caller = (AddEmailsCaller) activity; caller = (ShareTrackCaller) activity;
} catch (ClassCastException e) { } catch (ClassCastException e) {
throw new ClassCastException( throw new ClassCastException(
activity.toString() + " must implement " + AddEmailsCaller.class.getSimpleName()); activity.toString() + " must implement " + ShareTrackCaller.class.getSimpleName());
} }
} }
@Override @Override
public Dialog onCreateDialog(Bundle savedInstanceState) { public Dialog onCreateDialog(Bundle savedInstanceState) {
fragmentActivity = getActivity(); fragmentActivity = getActivity();
View view = fragmentActivity.getLayoutInflater().inflate(R.layout.add_emails, null); View view = fragmentActivity.getLayoutInflater().inflate(R.layout.share_track, null);
multiAutoCompleteTextView = (MultiAutoCompleteTextView) view.findViewById(R.id.add_emails);
multiAutoCompleteTextView = (MultiAutoCompleteTextView) view.findViewById(
R.id.share_track_emails);
multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer()); multiAutoCompleteTextView.setTokenizer(new MultiAutoCompleteTextView.CommaTokenizer());
SimpleCursorAdapter adapter = new SimpleCursorAdapter(fragmentActivity, SimpleCursorAdapter adapter = new SimpleCursorAdapter(fragmentActivity,
@@ -109,15 +119,45 @@ public class AddEmailsDialogFragment extends DialogFragment {
}); });
multiAutoCompleteTextView.setAdapter(adapter); multiAutoCompleteTextView.setAdapter(adapter);
publicCheckBox = (CheckBox) view.findViewById(R.id.share_track_public);
publicCheckBox.setChecked(PreferencesUtils.getBoolean(
fragmentActivity, R.string.share_track_public_key,
PreferencesUtils.SHARE_TRACK_PUBLIC_DEFAULT));
inviteCheckBox = (CheckBox) view.findViewById(R.id.share_track_invite);
inviteCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
multiAutoCompleteTextView.setVisibility(isChecked ? View.VISIBLE : View.GONE);
}
});
inviteCheckBox.setChecked(PreferencesUtils.getBoolean(
fragmentActivity, R.string.share_track_invite_key,
PreferencesUtils.SHARE_TRACK_INVITE_DEFAULT));
return new AlertDialog.Builder(fragmentActivity).setNegativeButton( return new AlertDialog.Builder(fragmentActivity).setNegativeButton(
R.string.generic_cancel, null) R.string.generic_cancel, null)
.setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() { .setPositiveButton(R.string.generic_ok, new DialogInterface.OnClickListener() {
@Override @Override
public void onClick(DialogInterface dialog, int which) { public void onClick(DialogInterface dialog, int which) {
String acl = multiAutoCompleteTextView.getText().toString(); if (!publicCheckBox.isChecked() && !inviteCheckBox.isChecked()) {
caller.onAddEmailsDone(acl); Toast.makeText(fragmentActivity, R.string.share_track_no_selection, Toast.LENGTH_LONG)
.show();
return;
}
String acl = multiAutoCompleteTextView.getText().toString().trim();
if (!publicCheckBox.isChecked() && acl.equals("")) {
Toast.makeText(fragmentActivity, R.string.share_track_no_emails, Toast.LENGTH_LONG)
.show();
return;
}
PreferencesUtils.setBoolean(
fragmentActivity, R.string.share_track_public_key, publicCheckBox.isChecked());
PreferencesUtils.setBoolean(
fragmentActivity, R.string.share_track_invite_key, inviteCheckBox.isChecked());
caller.onShareTrackDone(acl, publicCheckBox.isChecked());
} }
}).setTitle(R.string.share_track_add_emails_title).setView(view).create(); }).setTitle(R.string.share_track_title).setView(view).create();
} }
/** /**
@@ -37,8 +37,8 @@ public class SendDriveActivity extends AbstractSendActivity {
@Override @Override
protected AbstractSendAsyncTask createAsyncTask() { protected AbstractSendAsyncTask createAsyncTask() {
return new SendDriveAsyncTask( return new SendDriveAsyncTask(this, sendRequest.getTrackId(), sendRequest.getAccount(),
this, sendRequest.getTrackId(), sendRequest.getAccount(), sendRequest.getDriveShareEmails()); sendRequest.getDriveShareEmails(), sendRequest.isDriveSharePublic());
} }
@Override @Override
@@ -28,6 +28,7 @@ import com.google.api.client.googleapis.extensions.android.gms.auth.UserRecovera
import com.google.api.services.drive.Drive; import com.google.api.services.drive.Drive;
import com.google.api.services.drive.model.File; import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.Permission; import com.google.api.services.drive.model.Permission;
import com.google.api.services.drive.model.PermissionList;
import android.accounts.Account; import android.accounts.Account;
import android.content.Context; import android.content.Context;
@@ -44,10 +45,12 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
private final long trackId; private final long trackId;
private final Account account; private final Account account;
private final String[] acl; private final String[] acl;
private final boolean isPublic;
private final Context context; private final Context context;
private final MyTracksProviderUtils myTracksProviderUtils; private final MyTracksProviderUtils myTracksProviderUtils;
public SendDriveAsyncTask(SendDriveActivity activity, long trackId, Account account, String acl) { public SendDriveAsyncTask(
SendDriveActivity activity, long trackId, Account account, String acl, boolean isPublic) {
super(activity); super(activity);
this.trackId = trackId; this.trackId = trackId;
this.account = account; this.account = account;
@@ -56,7 +59,8 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
} else { } else {
this.acl = null; this.acl = null;
} }
this.isPublic = isPublic;
context = activity.getApplicationContext(); context = activity.getApplicationContext();
myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context); myTracksProviderUtils = MyTracksProviderUtils.Factory.get(context);
} }
@@ -64,9 +68,6 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
@Override @Override
protected void closeConnection() {} protected void closeConnection() {}
@Override
protected void saveResult() {}
@Override @Override
protected boolean performTask() { protected boolean performTask() {
try { try {
@@ -91,18 +92,18 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
File driveFile = drive.files().get(driveId).execute(); File driveFile = drive.files().get(driveId).execute();
if (SyncUtils.isValid(driveFile, folderId) && SyncUtils.updateDriveFile( if (SyncUtils.isValid(driveFile, folderId) && SyncUtils.updateDriveFile(
drive, driveFile, context, myTracksProviderUtils, track, false)) { drive, driveFile, context, myTracksProviderUtils, track, false)) {
addPermission(drive, driveId); addPermission(drive, driveFile);
return true; return true;
} }
SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, null); SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, null);
} }
String id = SyncUtils.insertDriveFile( File file = SyncUtils.insertDriveFile(
drive, folderId, context, myTracksProviderUtils, track, false); drive, folderId, context, myTracksProviderUtils, track, false);
if (id == null) { if (file == null) {
return false; return false;
} }
addPermission(drive, id); addPermission(drive, file);
return true; return true;
} catch (UserRecoverableAuthException e) { } catch (UserRecoverableAuthException e) {
SendToGoogleUtils.sendNotification( SendToGoogleUtils.sendNotification(
@@ -126,18 +127,40 @@ public class SendDriveAsyncTask extends AbstractSendAsyncTask {
* Adds permission. * Adds permission.
* *
* @param drive the drive * @param drive the drive
* @param driveId the drive id * @param file the drive file
*/ */
private void addPermission(Drive drive, String driveId) throws IOException { private void addPermission(Drive drive, File file) throws IOException {
if (isPublic) {
boolean hasPublic = false;
PermissionList permissionList = drive.permissions().list(file.getId()).execute();
for (Permission permission : permissionList.getItems()) {
String role = permission.getRole();
if (role.equals("reader") || role.equals("writer")) {
if (permission.getType().equals("anyone")) {
hasPublic = true;
break;
}
}
}
if (!hasPublic) {
Permission permission = new Permission();
permission.setRole("reader");
permission.setType("anyone");
permission.setValue("");
drive.permissions().insert(file.getId(), permission).execute();
}
shareUrl = file.getAlternateLink();
}
if (acl != null) { if (acl != null) {
for (String email : acl) { for (String email : acl) {
email = email.trim(); email = email.trim();
if (!email.equals("")) { if (!email.equals("")) {
Permission permission = new Permission(); Permission permission = new Permission();
permission.setValue(email);
permission.setType("user");
permission.setRole("reader"); permission.setRole("reader");
drive.permissions().insert(driveId, permission).execute(); permission.setType("user");
permission.setValue(email);
drive.permissions().insert(file.getId(), permission).execute();
} }
} }
} }
@@ -111,8 +111,9 @@ public class SaveActivity extends Activity {
protected Dialog onCreateDialog(int id) { protected Dialog onCreateDialog(int id) {
switch (id) { switch (id) {
case DIALOG_PROGRESS_ID: case DIALOG_PROGRESS_ID:
progressDialog = DialogUtils.createHorizontalProgressDialog( progressDialog = DialogUtils.createHorizontalProgressDialog(this,
this, R.string.save_progress_message, new DialogInterface.OnCancelListener() { R.string.export_external_storage_progress_message,
new DialogInterface.OnCancelListener() {
@Override @Override
public void onCancel(DialogInterface dialog) { public void onCancel(DialogInterface dialog) {
saveAsyncTask.cancel(true); saveAsyncTask.cancel(true);
@@ -128,10 +129,11 @@ public class SaveActivity extends Activity {
.getQuantityString(R.plurals.tracks, totalCount, totalCount); .getQuantityString(R.plurals.tracks, totalCount, totalCount);
if (successCount == totalCount && totalCount > 0) { if (successCount == totalCount && totalCount > 0) {
success = true; success = true;
message = getString(R.string.save_success, totalTracks, directoryName); message = getString(R.string.export_external_storage_success, totalTracks, directoryName);
} else { } else {
success = false; success = false;
message = getString(R.string.save_error, successCount, totalTracks, directoryName); message = getString(
R.string.export_external_storage_error, successCount, totalTracks, directoryName);
} }
AlertDialog.Builder builder = new AlertDialog.Builder(this).setCancelable(true).setIcon( AlertDialog.Builder builder = new AlertDialog.Builder(this).setCancelable(true).setIcon(
success ? android.R.drawable.ic_dialog_info : android.R.drawable.ic_dialog_alert) success ? android.R.drawable.ic_dialog_info : android.R.drawable.ic_dialog_alert)
@@ -10,18 +10,18 @@ import java.util.Locale;
* Definition of all possible track formats. * Definition of all possible track formats.
*/ */
public enum TrackFileFormat implements Parcelable { public enum TrackFileFormat implements Parcelable {
GPX {
@Override
TrackFormatWriter newFormatWriter(Context context) {
return new GpxTrackWriter(context);
}
},
KML { KML {
@Override @Override
TrackFormatWriter newFormatWriter(Context context) { TrackFormatWriter newFormatWriter(Context context) {
return new KmlTrackWriter(context); return new KmlTrackWriter(context);
} }
}, },
GPX {
@Override
TrackFormatWriter newFormatWriter(Context context) {
return new GpxTrackWriter(context);
}
},
CSV { CSV {
@Override @Override
public TrackFormatWriter newFormatWriter(Context context) { public TrackFormatWriter newFormatWriter(Context context) {
@@ -88,9 +88,6 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
@Override @Override
protected void closeConnection() {} protected void closeConnection() {}
@Override
protected void saveResult() {}
@Override @Override
protected boolean performTask() { protected boolean performTask() {
try { try {
@@ -121,7 +118,7 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
publishProgress(PROGRESS_SET_STYLE); publishProgress(PROGRESS_SET_STYLE);
setStyle(fusiontables, tableId); setStyle(fusiontables, tableId);
setTemplate(fusiontables, tableId); setTemplate(fusiontables, tableId);
if (!setPermission(tableId)) { if (!setPermission(track, tableId)) {
Log.d(TAG, "Cannot set permission for table " + tableId); Log.d(TAG, "Cannot set permission for table " + tableId);
return false; return false;
} }
@@ -138,9 +135,6 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
return false; return false;
} }
track.setTableId(tableId);
myTracksProviderUtils.updateTrack(track);
publishProgress(PROGRESS_COMPLETE); publishProgress(PROGRESS_COMPLETE);
return true; return true;
@@ -200,7 +194,7 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
fusiontables.template().insert(tableId, template).execute(); fusiontables.template().insert(tableId, template).execute();
} }
private boolean setPermission(String tableId) throws IOException, GoogleAuthException { private boolean setPermission(Track track, String tableId) throws IOException, GoogleAuthException {
boolean defaultTablePublic = PreferencesUtils.getBoolean(context, boolean defaultTablePublic = PreferencesUtils.getBoolean(context,
R.string.export_google_fusion_tables_public_key, R.string.export_google_fusion_tables_public_key,
PreferencesUtils.EXPORT_GOOGLE_FUSION_TABLES_PUBLIC_DEFAULT); PreferencesUtils.EXPORT_GOOGLE_FUSION_TABLES_PUBLIC_DEFAULT);
@@ -214,9 +208,12 @@ public class SendFusionTablesAsyncTask extends AbstractSendAsyncTask {
} }
Drive drive = SyncUtils.getDriveService(driveCredential); Drive drive = SyncUtils.getDriveService(driveCredential);
Permission permission = new Permission(); Permission permission = new Permission();
permission.setType("anyone");
permission.setRole("reader"); permission.setRole("reader");
permission.setType("anyone");
permission.setValue("");
drive.permissions().insert(tableId, permission).execute(); drive.permissions().insert(tableId, permission).execute();
shareUrl = SendFusionTablesUtils.getMapUrl(track, tableId);
return true; return true;
} }
@@ -42,13 +42,11 @@ public class SendFusionTablesUtils {
* Gets the url to visualize a fusion table on a map. * Gets the url to visualize a fusion table on a map.
* *
* @param track the track * @param track the track
* @param tableId the table id
* @return the url. * @return the url.
*/ */
public static String getMapUrl(Track track) { public static String getMapUrl(Track track, String tableId) {
if (track == null if (track == null || track.getTripStatistics() == null) {
|| track.getTripStatistics() == null
|| track.getTableId() == null
|| track.getTableId().length() == 0) {
Log.e(TAG, "Invalid track"); Log.e(TAG, "Invalid track");
return null; return null;
} }
@@ -57,7 +55,7 @@ public class SendFusionTablesUtils {
int z; int z;
if (track.getNumberOfPoints() < 2) { if (track.getNumberOfPoints() < 2) {
// Use Google's latitude and longitude // Use Google's latitude and longitude
latE6 = 37.423 * 1.E6; latE6 = 37.423 * 1.E6;
lonE6 = -122.084 * 1.E6; lonE6 = -122.084 * 1.E6;
z = 2; z = 2;
} else { } else {
@@ -69,8 +67,7 @@ public class SendFusionTablesUtils {
// We explicitly format with Locale.US because we need the latitude and // We explicitly format with Locale.US because we need the latitude and
// longitude to be formatted in a locale-independent manner. Specifically, // longitude to be formatted in a locale-independent manner. Specifically,
// we need the decimal separator to be a period rather than a comma. // we need the decimal separator to be a period rather than a comma.
return String.format( return String.format(Locale.US, MAP_URL, tableId, latE6 / 1.E6, lonE6 / 1.E6, z);
Locale.US, MAP_URL, track.getTableId(), latE6 / 1.E6, lonE6 / 1.E6, z);
} }
/** /**
@@ -123,17 +123,6 @@ public class SendMapsAsyncTask extends AbstractSendAsyncTask {
} }
} }
@Override
protected void saveResult() {
Track track = myTracksProviderUtils.getTrack(trackId);
if (track == null) {
Log.d(TAG, "No track for " + trackId);
return;
}
track.setMapId(mapId);
myTracksProviderUtils.updateTrack(track);
}
@Override @Override
protected boolean performTask() { protected boolean performTask() {
// Reset the per upload states // Reset the per upload states
@@ -222,6 +211,7 @@ public class SendMapsAsyncTask extends AbstractSendAsyncTask {
+ context.getString(R.string.send_google_by_my_tracks, "", ""); + context.getString(R.string.send_google_by_my_tracks, "", "");
mapId = SendMapsUtils.createNewMap( mapId = SendMapsUtils.createNewMap(
track.getName(), description, defaultMapPublic, mapsClient, authToken); track.getName(), description, defaultMapPublic, mapsClient, authToken);
shareUrl = MapsClient.buildMapUrl(mapId);
} catch (ParseException e) { } catch (ParseException e) {
Log.d(TAG, "Unable to create a new map", e); Log.d(TAG, "Unable to create a new map", e);
return false; return false;
@@ -15,7 +15,6 @@
*/ */
package com.google.android.apps.mytracks.io.maps; package com.google.android.apps.mytracks.io.maps;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.Waypoint; import com.google.android.apps.mytracks.content.Waypoint;
import com.google.android.apps.mytracks.io.gdata.maps.MapsClient; import com.google.android.apps.mytracks.io.gdata.maps.MapsClient;
import com.google.android.apps.mytracks.io.gdata.maps.MapsFeature; import com.google.android.apps.mytracks.io.gdata.maps.MapsFeature;
@@ -46,22 +45,6 @@ public class SendMapsUtils {
private SendMapsUtils() {} private SendMapsUtils() {}
/**
* Gets the Google Maps url for a track.
*
* @param track the track
* @return the url if available.
*/
public static String getMapUrl(Track track) {
if (track == null
|| track.getMapId() == null
|| track.getMapId().length() == 0) {
Log.e(TAG, "Invalid track");
return null;
}
return MapsClient.buildMapUrl(track.getMapId());
}
/** /**
* Creates a new Google Map. * Creates a new Google Map.
* *
@@ -90,7 +90,8 @@ public abstract class AbstractSendActivity extends Activity {
* *
* @param success true if the AsyncTask is successful * @param success true if the AsyncTask is successful
*/ */
public void onAsyncTaskCompleted(boolean success) { public void onAsyncTaskCompleted(boolean success, String shareUrl) {
sendRequest.setShareUrl(shareUrl);
startNextActivity(success, false); startNextActivity(success, false);
} }
@@ -20,7 +20,7 @@ import android.os.AsyncTask;
/** /**
* The abstract class for AsyncTasks sending a track to Google. * The abstract class for AsyncTasks sending a track to Google.
* *
* @author Jimmy Shih * @author Jimmy Shih
*/ */
public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boolean> { public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boolean> {
@@ -35,6 +35,11 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
*/ */
private boolean success; private boolean success;
/**
* The share url from the AsyncTask.
*/
protected String shareUrl;
/** /**
* True if the AsyncTask has completed. * True if the AsyncTask has completed.
*/ */
@@ -47,25 +52,26 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
/** /**
* Creates an AsyncTask. * Creates an AsyncTask.
* *
* @param activity the activity currently associated with this AsyncTask * @param activity the activity currently associated with this AsyncTask
*/ */
public AbstractSendAsyncTask(AbstractSendActivity activity) { public AbstractSendAsyncTask(AbstractSendActivity activity) {
this.activity = activity; this.activity = activity;
success = false; success = false;
shareUrl = null;
completed = false; completed = false;
canRetry = true; canRetry = true;
} }
/** /**
* Sets the current activity associated with this AyncTask. * Sets the current activity associated with this AyncTask.
* *
* @param activity the current activity, can be null * @param activity the current activity, can be null
*/ */
public void setActivity(AbstractSendActivity activity) { public void setActivity(AbstractSendActivity activity) {
this.activity = activity; this.activity = activity;
if (completed && activity != null) { if (completed && activity != null) {
activity.onAsyncTaskCompleted(success); activity.onAsyncTaskCompleted(success, shareUrl);
} }
} }
@@ -94,18 +100,15 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
protected void onPostExecute(Boolean result) { protected void onPostExecute(Boolean result) {
success = result; success = result;
completed = true; completed = true;
if (success) {
saveResult();
}
if (activity != null) { if (activity != null) {
activity.onAsyncTaskCompleted(success); activity.onAsyncTaskCompleted(success, shareUrl);
} }
} }
/** /**
* Retries the task. First, invalidates the auth token. If can retry, invokes * Retries the task. First, invalidates the auth token. If can retry, invokes
* {@link #performTask()}. Returns false if cannot retry. * {@link #performTask()}. Returns false if cannot retry.
* *
* @return the result of the retry. * @return the result of the retry.
*/ */
protected boolean retryTask() { protected boolean retryTask() {
@@ -126,14 +129,9 @@ public abstract class AbstractSendAsyncTask extends AsyncTask<Void, Integer, Boo
*/ */
protected abstract void closeConnection(); protected abstract void closeConnection();
/**
* Saves any AsyncTask result.
*/
protected abstract void saveResult();
/** /**
* Performs the AsyncTask. * Performs the AsyncTask.
* *
* @return true if success * @return true if success
*/ */
protected abstract boolean performTask(); protected abstract boolean performTask();
@@ -36,9 +36,10 @@ public class SendRequest implements Parcelable {
private boolean sendFusionTables = false; private boolean sendFusionTables = false;
private boolean sendSpreadsheets = false; private boolean sendSpreadsheets = false;
private boolean driveEnableSync = false; private boolean driveEnableSync = false; // to enable Drive sync
private boolean driveShare = false; private boolean driveShare = false; // to enable Drive share
private String driveShareEmails = null; private String driveShareEmails = null; // share with emails
private boolean driveSharePublic = false; // share as public
private Account account = null; private Account account = null;
@@ -46,6 +47,7 @@ public class SendRequest implements Parcelable {
private boolean mapsSuccess = false; private boolean mapsSuccess = false;
private boolean spreadsheetsSuccess = false; private boolean spreadsheetsSuccess = false;
private boolean fusionTablesSuccess = false; private boolean fusionTablesSuccess = false;
private String shareUrl = null;
/** /**
* Creates a new send request. * Creates a new send request.
@@ -116,6 +118,14 @@ public class SendRequest implements Parcelable {
this.driveShareEmails = driveShareEmails; this.driveShareEmails = driveShareEmails;
} }
public boolean isDriveSharePublic() {
return driveSharePublic;
}
public void setDriveSharePublic(boolean driveSharePublic) {
this.driveSharePublic = driveSharePublic;
}
public Account getAccount() { public Account getAccount() {
return account; return account;
} }
@@ -156,6 +166,14 @@ public class SendRequest implements Parcelable {
this.spreadsheetsSuccess = spreadsheetsSuccess; this.spreadsheetsSuccess = spreadsheetsSuccess;
} }
public String getShareUrl() {
return shareUrl;
}
public void setShareUrl(String shareUrl) {
this.shareUrl = shareUrl;
}
private SendRequest(Parcel in) { private SendRequest(Parcel in) {
trackId = in.readLong(); trackId = in.readLong();
sendDrive = in.readByte() == 1; sendDrive = in.readByte() == 1;
@@ -165,11 +183,13 @@ public class SendRequest implements Parcelable {
driveEnableSync = in.readByte() == 1; driveEnableSync = in.readByte() == 1;
driveShare = in.readByte() == 1; driveShare = in.readByte() == 1;
driveShareEmails = in.readString(); driveShareEmails = in.readString();
driveSharePublic = in.readByte() == 1;
account = in.readParcelable(null); account = in.readParcelable(null);
driveSuccess = in.readByte() == 1; driveSuccess = in.readByte() == 1;
mapsSuccess = in.readByte() == 1; mapsSuccess = in.readByte() == 1;
fusionTablesSuccess = in.readByte() == 1; fusionTablesSuccess = in.readByte() == 1;
spreadsheetsSuccess = in.readByte() == 1; spreadsheetsSuccess = in.readByte() == 1;
shareUrl = in.readString();
} }
@Override @Override
@@ -184,14 +204,16 @@ public class SendRequest implements Parcelable {
out.writeByte((byte) (sendMaps ? 1 : 0)); out.writeByte((byte) (sendMaps ? 1 : 0));
out.writeByte((byte) (sendFusionTables ? 1 : 0)); out.writeByte((byte) (sendFusionTables ? 1 : 0));
out.writeByte((byte) (sendSpreadsheets ? 1 : 0)); out.writeByte((byte) (sendSpreadsheets ? 1 : 0));
out.writeByte((byte) (driveEnableSync ? 1 : 0)); out.writeByte((byte) (driveEnableSync ? 1 : 0));
out.writeByte((byte) (driveShare ? 1 : 0)); out.writeByte((byte) (driveShare ? 1 : 0));
out.writeString(driveShareEmails); out.writeString(driveShareEmails);
out.writeByte((byte) (driveSharePublic ? 1 : 0));
out.writeParcelable(account, 0); out.writeParcelable(account, 0);
out.writeByte((byte) (driveSuccess ? 1 : 0)); out.writeByte((byte) (driveSuccess ? 1 : 0));
out.writeByte((byte) (mapsSuccess ? 1 : 0)); out.writeByte((byte) (mapsSuccess ? 1 : 0));
out.writeByte((byte) (fusionTablesSuccess ? 1 : 0)); out.writeByte((byte) (fusionTablesSuccess ? 1 : 0));
out.writeByte((byte) (spreadsheetsSuccess ? 1 : 0)); out.writeByte((byte) (spreadsheetsSuccess ? 1 : 0));
out.writeString(shareUrl);
} }
public static final Parcelable.Creator<SendRequest> public static final Parcelable.Creator<SendRequest>
@@ -20,10 +20,7 @@ import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment; import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment;
import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment.ChooseActivityCaller; import com.google.android.apps.mytracks.fragments.ChooseActivityDialogFragment.ChooseActivityCaller;
import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesUtils;
import com.google.android.apps.mytracks.io.maps.SendMapsUtils;
import com.google.android.apps.mytracks.util.IntentUtils; import com.google.android.apps.mytracks.util.IntentUtils;
import com.google.android.apps.mytracks.util.PreferencesUtils;
import com.google.android.maps.mytracks.R; import com.google.android.maps.mytracks.R;
import com.google.common.annotations.VisibleForTesting; import com.google.common.annotations.VisibleForTesting;
@@ -60,7 +57,7 @@ public class UploadResultActivity extends FragmentActivity implements ChooseActi
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
sendRequest = getIntent().getParcelableExtra(SendRequest.SEND_REQUEST_KEY); sendRequest = getIntent().getParcelableExtra(SendRequest.SEND_REQUEST_KEY);
shareUrl = null; shareUrl = sendRequest.getShareUrl();
Track track = MyTracksProviderUtils.Factory.get(this).getTrack(sendRequest.getTrackId()); Track track = MyTracksProviderUtils.Factory.get(this).getTrack(sendRequest.getTrackId());
if (track == null) { if (track == null) {
@@ -69,17 +66,10 @@ public class UploadResultActivity extends FragmentActivity implements ChooseActi
return; return;
} }
if (sendRequest.isSendMaps() && sendRequest.isMapsSuccess()) { if (sendRequest.isDriveSuccess() && shareUrl != null) {
shareUrl = SendMapsUtils.getMapUrl(track); new ChooseActivityDialogFragment().show(
} getSupportFragmentManager(), ChooseActivityDialogFragment.CHOOSE_ACTIVITY_DIALOG_TAG);
if (shareUrl == null && sendRequest.isSendFusionTables() return;
&& sendRequest.isFusionTablesSuccess()) {
boolean defaultTablePublic = PreferencesUtils.getBoolean(this,
R.string.export_google_fusion_tables_public_key,
PreferencesUtils.EXPORT_GOOGLE_FUSION_TABLES_PUBLIC_DEFAULT);
if (defaultTablePublic) {
shareUrl = SendFusionTablesUtils.getMapUrl(track);
}
} }
showDialog(DIALOG_RESULT_ID); showDialog(DIALOG_RESULT_ID);
} }
@@ -171,7 +161,7 @@ public class UploadResultActivity extends FragmentActivity implements ChooseActi
.setView(view); .setView(view);
// Add a Share URL button if shareUrl exists // Add a Share URL button if shareUrl exists
if (shareUrl != null) { if (!hasError && shareUrl != null) {
builder.setNegativeButton( builder.setNegativeButton(
R.string.share_track_share_url, new DialogInterface.OnClickListener() { R.string.share_track_share_url, new DialogInterface.OnClickListener() {
@Override @Override
@@ -18,8 +18,6 @@ package com.google.android.apps.mytracks.io.spreadsheets;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.io.fusiontables.SendFusionTablesUtils;
import com.google.android.apps.mytracks.io.maps.SendMapsUtils;
import com.google.android.apps.mytracks.io.sendtogoogle.AbstractSendAsyncTask; import com.google.android.apps.mytracks.io.sendtogoogle.AbstractSendAsyncTask;
import com.google.android.apps.mytracks.io.sendtogoogle.SendToGoogleUtils; import com.google.android.apps.mytracks.io.sendtogoogle.SendToGoogleUtils;
import com.google.android.apps.mytracks.io.sync.SyncUtils; import com.google.android.apps.mytracks.io.sync.SyncUtils;
@@ -97,9 +95,6 @@ public class SendSpreadsheetsAsyncTask extends AbstractSendAsyncTask {
@Override @Override
protected void closeConnection() {} protected void closeConnection() {}
@Override
protected void saveResult() {}
@Override @Override
protected boolean performTask() { protected boolean performTask() {
try { try {
@@ -281,19 +276,7 @@ public class SendSpreadsheetsAsyncTask extends AbstractSendAsyncTask {
row.getCustomElements().setValueLocal( row.getCustomElements().setValueLocal(
"maxelevation", SendSpreadsheetsUtils.getElevation(tripStatistics.getMaxElevation(), metricUnits)); "maxelevation", SendSpreadsheetsUtils.getElevation(tripStatistics.getMaxElevation(), metricUnits));
row.getCustomElements().setValueLocal("elevationunit", elevationUnit); row.getCustomElements().setValueLocal("elevationunit", elevationUnit);
String map = SendMapsUtils.getMapUrl(track);
if (map == null) {
map = context.getString(R.string.value_unknown);
}
row.getCustomElements().setValueLocal("map", map);
String fusionTable = SendFusionTablesUtils.getMapUrl(track);
if (fusionTable == null) {
fusionTable = context.getString(R.string.value_unknown);
}
row.getCustomElements().setValueLocal("fusiontable", fusionTable);
ListEntry result = spreadsheetService.insert(worksheetUrl, row); ListEntry result = spreadsheetService.insert(worksheetUrl, row);
return result != null; return result != null;
} }
@@ -262,9 +262,9 @@ public class SyncUtils {
* @param myTracksProviderUtils the myTracksProviderUtils * @param myTracksProviderUtils the myTracksProviderUtils
* @param track the track * @param track the track
* @param canRetry true if can retry * @param canRetry true if can retry
* @return the added drive file id or null. * @return the added drive file or null.
*/ */
public static String insertDriveFile(Drive drive, String folderId, Context context, public static File insertDriveFile(Drive drive, String folderId, Context context,
MyTracksProviderUtils myTracksProviderUtils, Track track, boolean canRetry) MyTracksProviderUtils myTracksProviderUtils, Track track, boolean canRetry)
throws IOException { throws IOException {
java.io.File file = getFile(context, myTracksProviderUtils, track); java.io.File file = getFile(context, myTracksProviderUtils, track);
@@ -281,7 +281,7 @@ public class SyncUtils {
return null; return null;
} }
SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, uploadedFile); SyncUtils.updateTrackWithDriveFileInfo(myTracksProviderUtils, track, uploadedFile);
return uploadedFile.getId(); return uploadedFile;
} finally { } finally {
file.delete(); file.delete();
} }
@@ -77,8 +77,8 @@ public class RemoveTempFilesService extends Service {
// Can't do anything // Can't do anything
return null; return null;
} }
cleanTempDirectory(TrackFileFormat.GPX.getExtension());
cleanTempDirectory(TrackFileFormat.KML.getExtension()); cleanTempDirectory(TrackFileFormat.KML.getExtension());
cleanTempDirectory(TrackFileFormat.GPX.getExtension());
cleanTempDirectory(TrackFileFormat.CSV.getExtension()); cleanTempDirectory(TrackFileFormat.CSV.getExtension());
cleanTempDirectory(TrackFileFormat.TCX.getExtension()); cleanTempDirectory(TrackFileFormat.TCX.getExtension());
return null; return null;
@@ -48,6 +48,7 @@ public class PreferencesUtils {
public static final int AUTO_RESUME_TRACK_TIMEOUT_NEVER = 0; public static final int AUTO_RESUME_TRACK_TIMEOUT_NEVER = 0;
public static final String BLUETOOTH_SENSOR_DEFAULT = ""; public static final String BLUETOOTH_SENSOR_DEFAULT = "";
public static final boolean CHART_BY_DISTANCE_DEFAULT = true; public static final boolean CHART_BY_DISTANCE_DEFAULT = true;
public static final boolean CHART_SHOW_CADENCE_DEFAULT = true; public static final boolean CHART_SHOW_CADENCE_DEFAULT = true;
public static final boolean CHART_SHOW_ELEVATION_DEFAULT = true; public static final boolean CHART_SHOW_ELEVATION_DEFAULT = true;
@@ -59,6 +60,7 @@ public class PreferencesUtils {
public static final boolean CONFIRM_SHARE_DRIVE_DEFAULT = true; public static final boolean CONFIRM_SHARE_DRIVE_DEFAULT = true;
public static final String DEFAULT_ACTIVITY_DEFAULT = ""; public static final String DEFAULT_ACTIVITY_DEFAULT = "";
public static final String DRIVE_DELETED_LIST_DEFAULT = ""; public static final String DRIVE_DELETED_LIST_DEFAULT = "";
public static final long DRIVE_LARGEST_CHANGE_ID_DEFAULT = -1L; public static final long DRIVE_LARGEST_CHANGE_ID_DEFAULT = -1L;
public static final boolean DRIVE_SYNC_DEFAULT = false; public static final boolean DRIVE_SYNC_DEFAULT = false;
@@ -72,9 +74,7 @@ public class PreferencesUtils {
public static final int FREQUENCY_OFF = 0; public static final int FREQUENCY_OFF = 0;
public static final String GOOGLE_ACCOUNT_DEFAULT = ""; public static final String GOOGLE_ACCOUNT_DEFAULT = "";
public static final int MAP_TYPE_DEFAUlT = 1; public static final int MAP_TYPE_DEFAUlT = 1;
public static final int MAX_RECORDING_DISTANCE_DEFAULT = 200; public static final int MAX_RECORDING_DISTANCE_DEFAULT = 200;
public static final boolean METRIC_UNITS_DEFAULT = true; public static final boolean METRIC_UNITS_DEFAULT = true;
public static final int MIN_RECORDING_DISTANCE_DEFAULT = 5; public static final int MIN_RECORDING_DISTANCE_DEFAULT = 5;
@@ -93,16 +93,27 @@ public class PreferencesUtils {
public static final boolean RECORDING_TRACK_PAUSED_DEFAULT = true; public static final boolean RECORDING_TRACK_PAUSED_DEFAULT = true;
public static final boolean REPORT_SPEED_DEFAULT = true; public static final boolean REPORT_SPEED_DEFAULT = true;
public static final long SELECTED_TRACK_ID_DEFAULT = -1L; public static final long SELECTED_TRACK_ID_DEFAULT = -1L;
public static final String SENSOR_TYPE_DEFAULT = "NONE"; public static final String SENSOR_TYPE_DEFAULT = "NONE";
// Share track
public static final boolean SHARE_TRACK_INVITE_DEFAULT = false;
public static final boolean SHARE_TRACK_PUBLIC_DEFAULT = false;
public static final int SPLIT_FREQUENCY_DEFAULT = 0; public static final int SPLIT_FREQUENCY_DEFAULT = 0;
// Stats
public static final boolean STATS_SHOW_COORDINATE_DEFAULT = false; public static final boolean STATS_SHOW_COORDINATE_DEFAULT = false;
public static final boolean STATS_SHOW_GRADE_ELEVATION_DEFAULT = false; public static final boolean STATS_SHOW_GRADE_ELEVATION_DEFAULT = false;
// Track color
public static final String TRACK_COLOR_MODE_DEFAULT = "SINGLE"; public static final String TRACK_COLOR_MODE_DEFAULT = "SINGLE";
public static final int TRACK_COLOR_MODE_MEDIUM_DEFAULT = 15; public static final int TRACK_COLOR_MODE_MEDIUM_DEFAULT = 15;
public static final int TRACK_COLOR_MODE_PERCENTAGE_DEFAULT = 25; public static final int TRACK_COLOR_MODE_PERCENTAGE_DEFAULT = 25;
public static final int TRACK_COLOR_MODE_SLOW_DEFAULT = 9; public static final int TRACK_COLOR_MODE_SLOW_DEFAULT = 9;
public static final String TRACK_NAME_DEFAULT = "LOCATION"; public static final String TRACK_NAME_DEFAULT = "LOCATION";
// Track widget
public static final int TRACK_WIDGET_ITEM1_DEFAULT = 3; // moving time public static final int TRACK_WIDGET_ITEM1_DEFAULT = 3; // moving time
public static final int TRACK_WIDGET_ITEM2_DEFAULT = 0; // distance public static final int TRACK_WIDGET_ITEM2_DEFAULT = 0; // distance
public static final int TRACK_WIDGET_ITEM3_DEFAULT = 1; // total time public static final int TRACK_WIDGET_ITEM3_DEFAULT = 1; // total time
@@ -82,8 +82,6 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
int elevationGainIndex = cursor.getColumnIndexOrThrow(TracksColumns.ELEVATIONGAIN); int elevationGainIndex = cursor.getColumnIndexOrThrow(TracksColumns.ELEVATIONGAIN);
int minGradeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MINGRADE); int minGradeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MINGRADE);
int maxGradeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXGRADE); int maxGradeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAXGRADE);
int mapIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.MAPID);
int tableIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.TABLEID);
int iconIndex = cursor.getColumnIndexOrThrow(TracksColumns.ICON); int iconIndex = cursor.getColumnIndexOrThrow(TracksColumns.ICON);
int driveIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.DRIVEID); int driveIdIndex = cursor.getColumnIndexOrThrow(TracksColumns.DRIVEID);
int modifiedTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MODIFIEDTIME); int modifiedTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.MODIFIEDTIME);
@@ -154,12 +152,6 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
if (!cursor.isNull(maxGradeIndex)) { if (!cursor.isNull(maxGradeIndex)) {
tripStatistics.setMaxGrade(cursor.getFloat(maxGradeIndex)); tripStatistics.setMaxGrade(cursor.getFloat(maxGradeIndex));
} }
if (!cursor.isNull(mapIdIndex)) {
track.setMapId(cursor.getString(mapIdIndex));
}
if (!cursor.isNull(tableIdIndex)) {
track.setTableId(cursor.getString(tableIdIndex));
}
if (!cursor.isNull(iconIndex)) { if (!cursor.isNull(iconIndex)) {
track.setIcon(cursor.getString(iconIndex)); track.setIcon(cursor.getString(iconIndex));
} }
@@ -319,8 +311,6 @@ public class MyTracksProviderUtilsImpl implements MyTracksProviderUtils {
values.put(TracksColumns.ELEVATIONGAIN, tripStatistics.getTotalElevationGain()); values.put(TracksColumns.ELEVATIONGAIN, tripStatistics.getTotalElevationGain());
values.put(TracksColumns.MINGRADE, tripStatistics.getMinGrade()); values.put(TracksColumns.MINGRADE, tripStatistics.getMinGrade());
values.put(TracksColumns.MAXGRADE, tripStatistics.getMaxGrade()); values.put(TracksColumns.MAXGRADE, tripStatistics.getMaxGrade());
values.put(TracksColumns.MAPID, track.getMapId());
values.put(TracksColumns.TABLEID, track.getTableId());
values.put(TracksColumns.ICON, track.getIcon()); values.put(TracksColumns.ICON, track.getIcon());
values.put(TracksColumns.DRIVEID, track.getDriveId()); values.put(TracksColumns.DRIVEID, track.getDriveId());
values.put(TracksColumns.MODIFIEDTIME, track.getModifiedTime()); values.put(TracksColumns.MODIFIEDTIME, track.getModifiedTime());
@@ -44,8 +44,6 @@ public class Track implements Parcelable {
* not loaded) * not loaded)
*/ */
private int numberOfPoints = 0; private int numberOfPoints = 0;
private String mapId = "";
private String tableId = "";
private String icon = ""; private String icon = "";
private String driveId = ""; private String driveId = "";
private long modifiedTime = -1L; private long modifiedTime = -1L;
@@ -67,8 +65,6 @@ public class Track implements Parcelable {
startId = in.readLong(); startId = in.readLong();
stopId = in.readLong(); stopId = in.readLong();
numberOfPoints = in.readInt(); numberOfPoints = in.readInt();
mapId = in.readString();
tableId = in.readString();
icon = in.readString(); icon = in.readString();
driveId = in.readString(); driveId = in.readString();
modifiedTime = in.readLong(); modifiedTime = in.readLong();
@@ -98,8 +94,6 @@ public class Track implements Parcelable {
dest.writeLong(startId); dest.writeLong(startId);
dest.writeLong(stopId); dest.writeLong(stopId);
dest.writeInt(numberOfPoints); dest.writeInt(numberOfPoints);
dest.writeString(mapId);
dest.writeString(tableId);
dest.writeString(icon); dest.writeString(icon);
dest.writeString(driveId); dest.writeString(driveId);
dest.writeLong(modifiedTime); dest.writeLong(modifiedTime);
@@ -180,22 +174,6 @@ public class Track implements Parcelable {
this.numberOfPoints = numberOfPoints; this.numberOfPoints = numberOfPoints;
} }
public String getMapId() {
return mapId;
}
public void setMapId(String mapId) {
this.mapId = mapId;
}
public String getTableId() {
return tableId;
}
public void setTableId(String tableId) {
this.tableId = tableId;
}
public String getIcon() { public String getIcon() {
return icon; return icon;
} }
@@ -32,36 +32,23 @@ import junit.framework.TestCase;
public class SendFusionTablesUtilsTest extends TestCase { public class SendFusionTablesUtilsTest extends TestCase {
/** /**
* Tests {@link SendFusionTablesUtils#getMapUrl(Track)} with null track. * Tests {@link SendFusionTablesUtils#getMapUrl(Track, String)} with null track.
*/ */
public void testGetMapUrl_null_track() { public void testGetMapUrl_null_track() {
assertEquals(null, SendFusionTablesUtils.getMapUrl(null)); assertEquals(null, SendFusionTablesUtils.getMapUrl(null, "123"));
} }
/** /**
* Tests {@link SendFusionTablesUtils#getMapUrl(Track)} with null table id. * Tests {@link SendFusionTablesUtils#getMapUrl(Track, String)} with null stats.
*/
public void testGetMapUrl_null_table_id() {
Track track = new Track();
TripStatistics stats = new TripStatistics();
stats.setBounds((int) 100.E6, (int) 10.E6, (int) 50.E6, (int) 5.E6);
track.setTripStatistics(stats);
track.setTableId(null);
assertEquals(null, SendFusionTablesUtils.getMapUrl(track));
}
/**
* Tests {@link SendFusionTablesUtils#getMapUrl(Track)} with null stats.
*/ */
public void testGetMapUrl_null_stats() { public void testGetMapUrl_null_stats() {
Track track = new Track(); Track track = new Track();
track.setTripStatistics(null); track.setTripStatistics(null);
track.setTableId("123"); assertEquals(null, SendFusionTablesUtils.getMapUrl(track, "123"));
assertEquals(null, SendFusionTablesUtils.getMapUrl(track));
} }
/** /**
* Tests {@link SendFusionTablesUtils#getMapUrl(Track)} with a valid track. * Tests {@link SendFusionTablesUtils#getMapUrl(Track, String)} with a valid track.
*/ */
public void testGetMapUrl_valid_track() { public void testGetMapUrl_valid_track() {
Track track = new Track(); Track track = new Track();
@@ -69,11 +56,10 @@ public class SendFusionTablesUtilsTest extends TestCase {
TripStatistics stats = new TripStatistics(); TripStatistics stats = new TripStatistics();
stats.setBounds((int) 100.E6, (int) 10.E6, (int) 50.E6, (int) 5.E6); stats.setBounds((int) 100.E6, (int) 10.E6, (int) 50.E6, (int) 5.E6);
track.setTripStatistics(stats); track.setTripStatistics(stats);
track.setTableId("123");
assertEquals( assertEquals(
"https://www.google.com/fusiontables/embedviz?" "https://www.google.com/fusiontables/embedviz?"
+ "viz=MAP&q=select+col0,+col1,+col2,+col3+from+123+&h=false&lat=7.500000&lng=75.000000" + "viz=MAP&q=select+col0,+col1,+col2,+col3+from+123+&h=false&lat=7.500000&lng=75.000000"
+ "&z=15&t=1&l=col2", SendFusionTablesUtils.getMapUrl(track)); + "&z=15&t=1&l=col2", SendFusionTablesUtils.getMapUrl(track, "123"));
} }
/** /**
@@ -89,23 +89,6 @@ public class SendMapsAsyncTaskTest extends AndroidTestCase {
AndroidMock.expect(sendMapsActivityMock.getApplicationContext()).andReturn(getContext()); AndroidMock.expect(sendMapsActivityMock.getApplicationContext()).andReturn(getContext());
} }
/**
* Tests the method {@link SendMapsAsyncTask#saveResult()}and makes sure the
* track is updated.
*/
public void testSaveResult() {
Track track = TrackStubUtils.createTrack(1);
track.setMapId(null);
AndroidMock.expect(myTracksProviderUtilsMock.getTrack(TRACK_ID)).andReturn(track);
myTracksProviderUtilsMock.updateTrack(track);
AndroidMock.replay(sendMapsActivityMock, myTracksProviderUtilsMock);
SendMapsAsyncTask sendMapsAsyncTask = new SendMapsAsyncTask(sendMapsActivityMock,
sendRequest.getTrackId(), sendRequest.getAccount(), myTracksProviderUtilsMock);
sendMapsAsyncTask.saveResult();
AndroidMock.verify(sendMapsActivityMock, myTracksProviderUtilsMock);
}
/** /**
* Tests {@link SendMapsAsyncTask#fetchSendMapId(Track)} when chooseMapId is * Tests {@link SendMapsAsyncTask#fetchSendMapId(Track)} when chooseMapId is
* null and makes sure it returns false. * null and makes sure it returns false.
@@ -15,7 +15,6 @@
*/ */
package com.google.android.apps.mytracks.io.maps; package com.google.android.apps.mytracks.io.maps;
import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.io.gdata.maps.MapsFeature; import com.google.android.apps.mytracks.io.gdata.maps.MapsFeature;
import android.location.Location; import android.location.Location;
@@ -31,31 +30,6 @@ import junit.framework.TestCase;
*/ */
public class SendMapsUtilsTest extends TestCase { public class SendMapsUtilsTest extends TestCase {
/**
* Tests {@link SendMapsUtils#getMapUrl(Track)} with null track.
*/
public void testGetMapUrl_null_track() {
assertEquals(null, SendMapsUtils.getMapUrl(null));
}
/**
* Tests {@link SendMapsUtils#getMapUrl(Track)} with null map id.
*/
public void testGetMapUrl_null_map_id() {
Track track = new Track();
track.setMapId(null);
assertEquals(null, SendMapsUtils.getMapUrl(track));
}
/**
* Tests {@link SendMapsUtils#getMapUrl(Track)} with a valid track.
*/
public void testGetMapUrl_valid_track() {
Track track = new Track();
track.setMapId("123");
assertEquals("https://maps.google.com/maps/ms?msa=0&msid=123", SendMapsUtils.getMapUrl(track));
}
/** /**
* Test {@link SendMapsUtils#buildMapsMarkerFeature(String, String, String, * Test {@link SendMapsUtils#buildMapsMarkerFeature(String, String, String,
* Location)} with a title. * Location)} with a title.
@@ -32,6 +32,7 @@ public class SendRequestTest extends AndroidTestCase {
private final static String ACCOUNTNAME = "testAccount1"; private final static String ACCOUNTNAME = "testAccount1";
private final static String ACCOUNTYPE = "testType1"; private final static String ACCOUNTYPE = "testType1";
private final static String DRIVE_SHARE_EMAILS = "foo@foo.com"; private final static String DRIVE_SHARE_EMAILS = "foo@foo.com";
private final static String SHARE_URL = "url@url.com";
@Override @Override
protected void setUp() throws Exception { protected void setUp() throws Exception {
@@ -128,12 +129,14 @@ public class SendRequestTest extends AndroidTestCase {
parcel.writeByte((byte) 1); parcel.writeByte((byte) 1);
parcel.writeByte((byte) 1); parcel.writeByte((byte) 1);
parcel.writeString(DRIVE_SHARE_EMAILS); parcel.writeString(DRIVE_SHARE_EMAILS);
parcel.writeByte((byte) 1);
Account account = new Account(ACCOUNTNAME, ACCOUNTYPE); Account account = new Account(ACCOUNTNAME, ACCOUNTYPE);
parcel.writeParcelable(account, 0); parcel.writeParcelable(account, 0);
parcel.writeByte((byte) 1); parcel.writeByte((byte) 1);
parcel.writeByte((byte) 1); parcel.writeByte((byte) 1);
parcel.writeByte((byte) 1); parcel.writeByte((byte) 1);
parcel.writeByte((byte) 1); parcel.writeByte((byte) 1);
parcel.writeString(SHARE_URL);
parcel.setDataPosition(0); parcel.setDataPosition(0);
sendRequest = SendRequest.CREATOR.createFromParcel(parcel); sendRequest = SendRequest.CREATOR.createFromParcel(parcel);
assertEquals(2, sendRequest.getTrackId()); assertEquals(2, sendRequest.getTrackId());
@@ -144,11 +147,13 @@ public class SendRequestTest extends AndroidTestCase {
assertTrue(sendRequest.isDriveEnableSync()); assertTrue(sendRequest.isDriveEnableSync());
assertTrue(sendRequest.isDriveShare()); assertTrue(sendRequest.isDriveShare());
assertEquals(DRIVE_SHARE_EMAILS, sendRequest.getDriveShareEmails()); assertEquals(DRIVE_SHARE_EMAILS, sendRequest.getDriveShareEmails());
assertTrue(sendRequest.isDriveSharePublic());
assertEquals(account, sendRequest.getAccount()); assertEquals(account, sendRequest.getAccount());
assertTrue(sendRequest.isDriveSuccess()); assertTrue(sendRequest.isDriveSuccess());
assertTrue(sendRequest.isMapsSuccess()); assertTrue(sendRequest.isMapsSuccess());
assertTrue(sendRequest.isFusionTablesSuccess()); assertTrue(sendRequest.isFusionTablesSuccess());
assertTrue(sendRequest.isSpreadsheetsSuccess()); assertTrue(sendRequest.isSpreadsheetsSuccess());
assertEquals(SHARE_URL, sendRequest.getShareUrl());
} }
/** /**
@@ -165,12 +170,14 @@ public class SendRequestTest extends AndroidTestCase {
parcel.writeByte((byte) 0); parcel.writeByte((byte) 0);
parcel.writeByte((byte) 0); parcel.writeByte((byte) 0);
parcel.writeString(null); parcel.writeString(null);
parcel.writeByte((byte) 0);
Account account = new Account(ACCOUNTNAME, ACCOUNTYPE); Account account = new Account(ACCOUNTNAME, ACCOUNTYPE);
parcel.writeParcelable(account, 0); parcel.writeParcelable(account, 0);
parcel.writeByte((byte) 0); parcel.writeByte((byte) 0);
parcel.writeByte((byte) 0); parcel.writeByte((byte) 0);
parcel.writeByte((byte) 0); parcel.writeByte((byte) 0);
parcel.writeByte((byte) 0); parcel.writeByte((byte) 0);
parcel.writeString(null);
parcel.setDataPosition(0); parcel.setDataPosition(0);
sendRequest = SendRequest.CREATOR.createFromParcel(parcel); sendRequest = SendRequest.CREATOR.createFromParcel(parcel);
assertEquals(4, sendRequest.getTrackId()); assertEquals(4, sendRequest.getTrackId());
@@ -181,11 +188,13 @@ public class SendRequestTest extends AndroidTestCase {
assertFalse(sendRequest.isDriveEnableSync()); assertFalse(sendRequest.isDriveEnableSync());
assertFalse(sendRequest.isDriveShare()); assertFalse(sendRequest.isDriveShare());
assertNull(sendRequest.getDriveShareEmails()); assertNull(sendRequest.getDriveShareEmails());
assertFalse(sendRequest.isDriveSharePublic());
assertEquals(account, sendRequest.getAccount()); assertEquals(account, sendRequest.getAccount());
assertFalse(sendRequest.isDriveSuccess()); assertFalse(sendRequest.isDriveSuccess());
assertFalse(sendRequest.isMapsSuccess()); assertFalse(sendRequest.isMapsSuccess());
assertFalse(sendRequest.isFusionTablesSuccess()); assertFalse(sendRequest.isFusionTablesSuccess());
assertFalse(sendRequest.isSpreadsheetsSuccess()); assertFalse(sendRequest.isSpreadsheetsSuccess());
assertNull(sendRequest.getShareUrl());
} }
/** /**
@@ -202,14 +211,16 @@ public class SendRequestTest extends AndroidTestCase {
boolean sendMaps = parcel.readByte() == 1; boolean sendMaps = parcel.readByte() == 1;
boolean sendFusionTables = parcel.readByte() == 1; boolean sendFusionTables = parcel.readByte() == 1;
boolean sendSpreadsheets = parcel.readByte() == 1; boolean sendSpreadsheets = parcel.readByte() == 1;
boolean driveEnableSync = parcel.readByte() == 1; boolean driveEnableSync = parcel.readByte() == 1;
boolean driveShare = parcel.readByte() == 1; boolean driveShare = parcel.readByte() == 1;
String dirveShareEmails = parcel.readString(); String dirveShareEmails = parcel.readString();
boolean driveSharePublic = parcel.readByte() == 1;
Parcelable account = parcel.readParcelable(null); Parcelable account = parcel.readParcelable(null);
boolean driveSuccess = parcel.readByte() == 1; boolean driveSuccess = parcel.readByte() == 1;
boolean mapsSuccess = parcel.readByte() == 1; boolean mapsSuccess = parcel.readByte() == 1;
boolean fusionTablesSuccess = parcel.readByte() == 1; boolean fusionTablesSuccess = parcel.readByte() == 1;
boolean spreadsheetsSuccess = parcel.readByte() == 1; boolean spreadsheetsSuccess = parcel.readByte() == 1;
String shareUrl = parcel.readString();
assertEquals(1, trackId); assertEquals(1, trackId);
assertFalse(sendDrive); assertFalse(sendDrive);
assertFalse(sendMaps); assertFalse(sendMaps);
@@ -218,11 +229,13 @@ public class SendRequestTest extends AndroidTestCase {
assertFalse(driveEnableSync); assertFalse(driveEnableSync);
assertFalse(driveShare); assertFalse(driveShare);
assertNull(dirveShareEmails); assertNull(dirveShareEmails);
assertFalse(driveSharePublic);
assertNull(account); assertNull(account);
assertFalse(driveSuccess); assertFalse(driveSuccess);
assertFalse(mapsSuccess); assertFalse(mapsSuccess);
assertFalse(fusionTablesSuccess); assertFalse(fusionTablesSuccess);
assertFalse(spreadsheetsSuccess); assertFalse(spreadsheetsSuccess);
assertNull(shareUrl);
} }
/** /**
@@ -237,12 +250,14 @@ public class SendRequestTest extends AndroidTestCase {
sendRequest.setDriveEnableSync(true); sendRequest.setDriveEnableSync(true);
sendRequest.setDriveShare(true); sendRequest.setDriveShare(true);
sendRequest.setDriveShareEmails(DRIVE_SHARE_EMAILS); sendRequest.setDriveShareEmails(DRIVE_SHARE_EMAILS);
sendRequest.setDriveSharePublic(true);
Account accountNew = new Account(ACCOUNTNAME + "2", ACCOUNTYPE + "2"); Account accountNew = new Account(ACCOUNTNAME + "2", ACCOUNTYPE + "2");
sendRequest.setAccount(accountNew); sendRequest.setAccount(accountNew);
sendRequest.setMapsSuccess(true); sendRequest.setMapsSuccess(true);
sendRequest.setDriveSuccess(true); sendRequest.setDriveSuccess(true);
sendRequest.setFusionTablesSuccess(true); sendRequest.setFusionTablesSuccess(true);
sendRequest.setSpreadsheetsSuccess(true); sendRequest.setSpreadsheetsSuccess(true);
sendRequest.setShareUrl(SHARE_URL);
Parcel parcel = Parcel.obtain(); Parcel parcel = Parcel.obtain();
parcel.setDataPosition(0); parcel.setDataPosition(0);
sendRequest.writeToParcel(parcel, 1); sendRequest.writeToParcel(parcel, 1);
@@ -255,11 +270,13 @@ public class SendRequestTest extends AndroidTestCase {
boolean driveEnableSync = parcel.readByte() == 1; boolean driveEnableSync = parcel.readByte() == 1;
boolean driveShare = parcel.readByte() == 1; boolean driveShare = parcel.readByte() == 1;
String driveShareEmails = parcel.readString(); String driveShareEmails = parcel.readString();
boolean driveSharePublic = parcel.readByte() == 1;
Parcelable account = parcel.readParcelable(null); Parcelable account = parcel.readParcelable(null);
boolean driveSuccess = parcel.readByte() == 1; boolean driveSuccess = parcel.readByte() == 1;
boolean mapsSuccess = parcel.readByte() == 1; boolean mapsSuccess = parcel.readByte() == 1;
boolean fusionTablesSuccess = parcel.readByte() == 1; boolean fusionTablesSuccess = parcel.readByte() == 1;
boolean spreadsheetsSuccess = parcel.readByte() == 1; boolean spreadsheetsSuccess = parcel.readByte() == 1;
String shareUrl = parcel.readString();
assertEquals(4, trackId); assertEquals(4, trackId);
assertTrue(sendDrive); assertTrue(sendDrive);
assertTrue(sendMaps); assertTrue(sendMaps);
@@ -268,10 +285,12 @@ public class SendRequestTest extends AndroidTestCase {
assertTrue(driveEnableSync); assertTrue(driveEnableSync);
assertTrue(driveShare); assertTrue(driveShare);
assertEquals(DRIVE_SHARE_EMAILS, driveShareEmails); assertEquals(DRIVE_SHARE_EMAILS, driveShareEmails);
assertTrue(driveSharePublic);
assertEquals(accountNew, account); assertEquals(accountNew, account);
assertTrue(driveSuccess); assertTrue(driveSuccess);
assertTrue(mapsSuccess); assertTrue(mapsSuccess);
assertTrue(fusionTablesSuccess); assertTrue(fusionTablesSuccess);
assertTrue(spreadsheetsSuccess); assertTrue(spreadsheetsSuccess);
assertEquals(SHARE_URL, shareUrl);
} }
} }
@@ -73,13 +73,14 @@ public class DeleteTest extends ActivityInstrumentationTestCase2<TrackListActivi
// Export when there is no track. // Export when there is no track.
EndToEndTestUtils.findMenuItem(activityMyTracks.getString(R.string.menu_export_all), true); EndToEndTestUtils.findMenuItem(activityMyTracks.getString(R.string.menu_export_all), true);
EndToEndTestUtils.SOLO.clickOnText(String.format( EndToEndTestUtils.SOLO.clickOnText(String.format(
activityMyTracks.getString(R.string.save_all_selection_option), activityMyTracks.getString(R.string.export_external_storage_option),
EndToEndTestUtils.GPX.toUpperCase())); EndToEndTestUtils.GPX.toUpperCase()));
EndToEndTestUtils.getButtonOnScreen( EndToEndTestUtils.getButtonOnScreen(
EndToEndTestUtils.activityMytracks.getString(R.string.generic_ok), true, true); EndToEndTestUtils.activityMytracks.getString(R.string.generic_ok), true, true);
String totalTracks = activityMyTracks.getResources().getQuantityString(R.plurals.tracks, 0, 0); String totalTracks = activityMyTracks.getResources().getQuantityString(R.plurals.tracks, 0, 0);
String directoryName = FileUtils.buildExternalDirectoryPath(EndToEndTestUtils.GPX); String directoryName = FileUtils.buildExternalDirectoryPath(EndToEndTestUtils.GPX);
String message = activityMyTracks.getString(R.string.save_error, 0, totalTracks, directoryName); String message = activityMyTracks.getString(
R.string.export_external_storage_error, 0, totalTracks, directoryName);
assertTrue(EndToEndTestUtils.SOLO.waitForText( assertTrue(EndToEndTestUtils.SOLO.waitForText(
activityMyTracks.getString(R.string.external_storage_not_available), 1, activityMyTracks.getString(R.string.external_storage_not_available), 1,
EndToEndTestUtils.SHORT_WAIT_TIME) EndToEndTestUtils.SHORT_WAIT_TIME)
@@ -22,9 +22,6 @@ import com.google.android.maps.mytracks.R;
import android.app.Instrumentation; import android.app.Instrumentation;
import android.test.ActivityInstrumentationTestCase2; import android.test.ActivityInstrumentationTestCase2;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.View;
import java.util.ArrayList;
/** /**
* Tests some menu items of MyTracks. * Tests some menu items of MyTracks.
@@ -35,7 +32,6 @@ public class MenuItemsTest extends ActivityInstrumentationTestCase2<TrackListAct
private Instrumentation instrumentation; private Instrumentation instrumentation;
private TrackListActivity activityMyTracks; private TrackListActivity activityMyTracks;
private final static String SHARE_ITEM_PARENT_VIEW_NAME = "RecycleListView";
public MenuItemsTest() { public MenuItemsTest() {
super(TrackListActivity.class); super(TrackListActivity.class);
@@ -110,30 +106,6 @@ public class MenuItemsTest extends ActivityInstrumentationTestCase2<TrackListAct
return activityMyTracks.findViewById(R.id.track_controler_container).isShown(); return activityMyTracks.findViewById(R.id.track_controler_container).isShown();
} }
/**
* Gets the view to click the share item by item index.
*
* @param index of a share item
* @return null when no such item
*/
private View findShareItem(int index) {
EndToEndTestUtils.findMenuItem(activityMyTracks.getString(R.string.menu_share), true);
EndToEndTestUtils.SOLO.clickOnText(activityMyTracks.getString(R.string.generic_yes));
ArrayList<View> views = EndToEndTestUtils.SOLO.getViews();
int i = 0;
for (View view : views) {
String name = view.getParent().getClass().getName();
// Each share item is a child of a "RecycleListView"
if (name.indexOf(SHARE_ITEM_PARENT_VIEW_NAME) > 0) {
if (index == i) {
return view;
}
i++;
}
}
return null;
}
/** /**
* Checks the voice frequency and split frequency menus during recording. When * Checks the voice frequency and split frequency menus during recording. When
* recording, they should be in both the menu and the recording settings. When * recording, they should be in both the menu and the recording settings. When
@@ -133,7 +133,7 @@ public class SendToGoogleTest extends ActivityInstrumentationTestCase2<TrackList
*/ */
private boolean sendToGoogle() { private boolean sendToGoogle() {
EndToEndTestUtils.findMenuItem(activityMyTracks.getString(R.string.menu_export), true); EndToEndTestUtils.findMenuItem(activityMyTracks.getString(R.string.menu_export), true);
EndToEndTestUtils.SOLO.waitForText(activityMyTracks.getString(R.string.export_dialog_title)); EndToEndTestUtils.SOLO.waitForText(activityMyTracks.getString(R.string.export_title));
instrumentation.waitForIdleSync(); instrumentation.waitForIdleSync();
ArrayList<CheckBox> checkBoxs = EndToEndTestUtils.SOLO.getCurrentCheckBoxes(); ArrayList<CheckBox> checkBoxs = EndToEndTestUtils.SOLO.getCurrentCheckBoxes();
for (int i = 0; i < checkBoxs.size(); i++) { for (int i = 0; i < checkBoxs.size(); i++) {