From f1ce31cfebaf75b721e26efba3af88b44bf4fd2a Mon Sep 17 00:00:00 2001 From: Jimmy Shih Date: Tue, 22 Oct 2013 17:32:38 -0700 Subject: [PATCH] Add a Photo Size option in Advanced settings --- MyTracks/AndroidManifest.xml | 2 +- .../res/values/arrays_do_not_translate.xml | 14 ++-- MyTracks/res/values/keys.xml | 7 +- MyTracks/res/values/strings.xml | 64 +++++++++++++------ ...ing_settings.xml => advanced_settings.xml} | 8 ++- MyTracks/res/xml/settings.xml | 8 +-- .../io/file/exporter/KmzTrackExporter.java | 56 +++++++++++++--- .../io/file/exporter/SaveAsyncTask.java | 3 +- .../apps/mytracks/io/sync/SyncUtils.java | 2 +- ...ity.java => AdvancedSettingsActivity.java} | 34 +++++++++- .../mytracks/settings/SettingsActivity.java | 2 +- .../apps/mytracks/util/PreferencesUtils.java | 1 + .../endtoendtest/common/SettingTest.java | 4 +- 13 files changed, 155 insertions(+), 50 deletions(-) rename MyTracks/res/xml/{sharing_settings.xml => advanced_settings.xml} (75%) rename MyTracks/src/com/google/android/apps/mytracks/settings/{SharingSettingsActivity.java => AdvancedSettingsActivity.java} (58%) diff --git a/MyTracks/AndroidManifest.xml b/MyTracks/AndroidManifest.xml index b46450418..a71fb2728 100755 --- a/MyTracks/AndroidManifest.xml +++ b/MyTracks/AndroidManifest.xml @@ -219,6 +219,7 @@ limitations under the License. + @@ -226,7 +227,6 @@ limitations under the License. - - @string/activity_type_airplane @@ -142,6 +141,12 @@ limitations under the License. 900 1800 + + 500 + 1024 + 2048 + -1 + 1 2 @@ -172,7 +177,7 @@ limitations under the License. @string/sensor_type_value_polar @string/sensor_type_value_zephyr @string/sensor_type_value_ant - @string/sensor_type_value_none + @string/sensor_type_value_none @string/settings_sensor_type_polar @@ -195,7 +200,7 @@ limitations under the License. @string/stats_rate_speed @string/stats_rate_pace - + @string/settings_stats_units_metric @string/settings_stats_units_imperial @@ -203,7 +208,7 @@ limitations under the License. @string/stats_units_metric @string/stats_units_imperial - + @string/settings_map_track_color_mode_single @string/settings_map_track_color_mode_fixed @@ -284,5 +289,4 @@ limitations under the License. @string/waypoint_type_water_fountain @string/waypoint_type_waypoint - \ No newline at end of file diff --git a/MyTracks/res/values/keys.xml b/MyTracks/res/values/keys.xml index 4259acde6..7b2707a67 100644 --- a/MyTracks/res/values/keys.xml +++ b/MyTracks/res/values/keys.xml @@ -27,18 +27,19 @@ limitations under the License. defaultActivity exportExternalStorageFormat exportGoogleFusionTablesPublic - exportGoogleMapsPublic + exportGoogleMapsPublic exportType mapType maxRecordingDistance minRecordingInterval + photoSize recordingDistanceInterval recordingGpsAccuracy sensorType shareTrackInvite shareTrackPublic splitFrequency - statsRate + statsRate statsShowCoordinate statsShowGradeElevation statsShowCalorie @@ -70,6 +71,7 @@ limitations under the License. recordingTrackId recordingTrackPaused + settingsAdvanced settingsBackup settingsBackupReset settingsChart @@ -90,6 +92,5 @@ limitations under the License. settingsSensorBluetooth settingsSensorBluetoothPairing settingsSensorRoot - settingsSharing settingsStats \ No newline at end of file diff --git a/MyTracks/res/values/strings.xml b/MyTracks/res/values/strings.xml index bc383f7e3..4d87d1fb9 100644 --- a/MyTracks/res/values/strings.xml +++ b/MyTracks/res/values/strings.xml @@ -777,7 +777,7 @@ limitations under the License. Delete selected? - + Description @@ -1002,7 +1002,7 @@ limitations under the License. - Delete marker? + Delete marker? @@ -1475,6 +1475,29 @@ limitations under the License. Show + + + Advanced + + + Original size + + + Scale photo to %1$s for export. + + + Photo size + + This will write a full copy of all your tracks and settings to ‘%1$s’ on the external storage. @@ -1955,13 +1978,6 @@ limitations under the License. - - Sharing - Calories Setup Activity Type @@ -2238,11 +2254,11 @@ limitations under the License. %1$s Markers - + @@ -2492,12 +2508,11 @@ limitations under the License. %1$d an integer value. E.g., '2'."> %1$d ft (recommended) - - %1$d km + %1$d kB %1$d kg + + %1$d km + %1$d km/h + + %1$d MB + + android:title="@string/settings_advanced" > + + android:title="@string/settings_sharing_allow_access" /> \ No newline at end of file diff --git a/MyTracks/res/xml/settings.xml b/MyTracks/res/xml/settings.xml index b0a0028f0..d820c79e9 100644 --- a/MyTracks/res/xml/settings.xml +++ b/MyTracks/res/xml/settings.xml @@ -36,10 +36,6 @@ limitations under the License. android:key="@string/settings_recording_key" android:persistent="false" android:title="@string/settings_recording" /> - + \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/KmzTrackExporter.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/KmzTrackExporter.java index a54deac44..8c0ebae85 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/KmzTrackExporter.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/KmzTrackExporter.java @@ -19,7 +19,10 @@ package com.google.android.apps.mytracks.io.file.exporter; import com.google.android.apps.mytracks.content.MyTracksProviderUtils; import com.google.android.apps.mytracks.content.Track; import com.google.android.apps.mytracks.content.Waypoint; +import com.google.android.apps.mytracks.util.PreferencesUtils; +import com.google.android.maps.mytracks.R; +import android.content.Context; import android.database.Cursor; import android.graphics.Bitmap; import android.graphics.BitmapFactory; @@ -27,6 +30,7 @@ import android.net.Uri; import android.util.Log; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.OutputStream; import java.util.zip.ZipEntry; @@ -38,17 +42,18 @@ import java.util.zip.ZipOutputStream; * @author Jimmy Shih */ public class KmzTrackExporter implements TrackExporter { - + public static final String KMZ_EXTENSION = "kmz"; public static final String KMZ_IMAGES_DIR = "images"; public static final String KMZ_KML_FILE = "doc.kml"; private static final String TAG = KmzTrackExporter.class.getSimpleName(); - private static final int MEGA_BYTE = 1000000; + private static final int BUFFER_SIZE = 4096; private final MyTracksProviderUtils myTracksProviderUtils; private final FileTrackExporter fileTrackExporter; private final Track[] tracks; + private final long photoSize; /** * Constructor. @@ -56,12 +61,15 @@ public class KmzTrackExporter implements TrackExporter { * @param myTracksProviderUtils the my tracks provider utils * @param fileTrackExporter the file track exporter * @param tracks the tracks to export + * @param context the context */ public KmzTrackExporter(MyTracksProviderUtils myTracksProviderUtils, - FileTrackExporter fileTrackExporter, Track[] tracks) { + FileTrackExporter fileTrackExporter, Track[] tracks, Context context) { this.myTracksProviderUtils = myTracksProviderUtils; this.fileTrackExporter = fileTrackExporter; this.tracks = tracks; + this.photoSize = PreferencesUtils.getInt( + context, R.string.photo_size_key, PreferencesUtils.PHOTO_SIZE_DEFAULT); } @Override @@ -78,7 +86,7 @@ public class KmzTrackExporter implements TrackExporter { zipOutputStream.closeEntry(); if (!success) { Log.e(TAG, "Unable to write kml in kmz"); - return false; + return false; } // Add photos @@ -95,7 +103,7 @@ public class KmzTrackExporter implements TrackExporter { try { zipOutputStream.close(); } catch (IOException e) { - Log.e(TAG, "Unable to close zip input stream", e);; + Log.e(TAG, "Unable to close zip input stream", e); } } } @@ -142,8 +150,24 @@ public class KmzTrackExporter implements TrackExporter { KMZ_IMAGES_DIR + File.separatorChar + uri.getLastPathSegment()); zipOutputStream.putNextEntry(zipEntry); - long size = file.length(); - int sampleSize = size > MEGA_BYTE ? (int) Math.ceil(size / MEGA_BYTE) : 1; + int sampleSize; + if (photoSize == -1) { + sampleSize = 1; + } else { + long size = file.length(); + // Convert from kilobytes to bytes. + long limit = photoSize * 1024; + sampleSize = size > limit ? (int) Math.ceil(size / limit) : 1; + } + if (sampleSize == 1) { + readFromFile(zipOutputStream, uri); + } else { + readFromScaledBitmap(zipOutputStream, uri, sampleSize); + } + zipOutputStream.closeEntry(); + } + + private void readFromScaledBitmap(ZipOutputStream zipOutputStream, Uri uri, int sampleSize) { BitmapFactory.Options options = new BitmapFactory.Options(); options.inJustDecodeBounds = false; options.inSampleSize = sampleSize; @@ -154,7 +178,21 @@ public class KmzTrackExporter implements TrackExporter { } bitmap.compress(Bitmap.CompressFormat.JPEG, 100, zipOutputStream); bitmap.recycle(); - - zipOutputStream.closeEntry(); + } + + private void readFromFile(ZipOutputStream zipOutputStream, Uri uri) throws IOException { + FileInputStream fileInputStream = null; + try { + fileInputStream = new FileInputStream(new File(uri.getPath())); + byte[] buffer = new byte[BUFFER_SIZE]; + int byteCount = 0; + while ((byteCount = fileInputStream.read(buffer)) != -1) { + zipOutputStream.write(buffer, 0, byteCount); + } + } finally { + if (fileInputStream != null) { + fileInputStream.close(); + } + } } } \ No newline at end of file diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/SaveAsyncTask.java b/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/SaveAsyncTask.java index 378a740df..c8263774f 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/SaveAsyncTask.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/file/exporter/SaveAsyncTask.java @@ -202,7 +202,8 @@ public class SaveAsyncTask extends AsyncTask { } }); - trackExporter = useKmz ? new KmzTrackExporter(myTracksProviderUtils, fileTrackExporter, tracks) + trackExporter = useKmz ? new KmzTrackExporter( + myTracksProviderUtils, fileTrackExporter, tracks, context) : fileTrackExporter; String fileName = FileUtils.buildUniqueFileName(directory, track.getName(), extension); diff --git a/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java b/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java index b28dd7a33..dd9c26a7e 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/io/sync/SyncUtils.java @@ -469,7 +469,7 @@ public class SyncUtils { FileTrackExporter fileTrackExporter = new FileTrackExporter( myTracksProviderUtils, tracks, TrackFileFormat.KML.newTrackWriter(context, false), null); TrackExporter trackExporter = useKmz ? new KmzTrackExporter( - myTracksProviderUtils, fileTrackExporter, tracks) + myTracksProviderUtils, fileTrackExporter, tracks, context) : fileTrackExporter; FileOutputStream fileOutputStream = null; diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java similarity index 58% rename from MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java rename to MyTracks/src/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java index 044c672cb..170345b23 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/SharingSettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/AdvancedSettingsActivity.java @@ -17,21 +17,23 @@ package com.google.android.apps.mytracks.settings; import com.google.android.apps.mytracks.util.DialogUtils; +import com.google.android.apps.mytracks.util.PreferencesUtils; import com.google.android.maps.mytracks.R; import android.app.Dialog; import android.content.DialogInterface; import android.os.Bundle; import android.preference.CheckBoxPreference; +import android.preference.ListPreference; import android.preference.Preference; import android.preference.Preference.OnPreferenceChangeListener; /** - * An activity for accessing the sharing settings. + * An activity for advanced settings. * * @author Jimmy Shih */ -public class SharingSettingsActivity extends AbstractSettingsActivity { +public class AdvancedSettingsActivity extends AbstractSettingsActivity { private static final int DIALOG_CONFIRM_ALLOW_ACCESS_ID = 0; @@ -41,7 +43,7 @@ public class SharingSettingsActivity extends AbstractSettingsActivity { @Override protected void onCreate(Bundle bundle) { super.onCreate(bundle); - addPreferencesFromResource(R.xml.sharing_settings); + addPreferencesFromResource(R.xml.advanced_settings); allowAccessCheckBoxPreference = (CheckBoxPreference) findPreference( getString(R.string.allow_access_key)); @@ -56,6 +58,15 @@ public class SharingSettingsActivity extends AbstractSettingsActivity { } } }); + + ListPreference preference = (ListPreference) findPreference(getString(R.string.photo_size_key)); + int value = PreferencesUtils.getInt( + this, R.string.photo_size_key, PreferencesUtils.PHOTO_SIZE_DEFAULT); + String[] values = getResources().getStringArray(R.array.photo_size_values); + String[] options = new String[values.length]; + String[] summary = new String[values.length]; + setPhotoSizeSummaryAndOptions(summary, options, values); + configureListPreference(preference, summary, options, values, String.valueOf(value), null); } @Override @@ -73,4 +84,21 @@ public class SharingSettingsActivity extends AbstractSettingsActivity { } }); } + + private void setPhotoSizeSummaryAndOptions(String[] summary, String[] options, String[] values) { + for (int i = 0; i < values.length; i++) { + int value = Integer.parseInt(values[i]); + if (value == -1) { + options[i] = getString(R.string.settings_advanced_photo_size_original); + summary[i] = getString(R.string.settings_advanced_photo_size_original); + } else if (value < 1024) { + options[i] = getString(R.string.value_integer_kilobyte, value); + summary[i] = getString(R.string.settings_advanced_photo_size_summary, options[i]); + } else { + int megabyte = value / 1024; + options[i] = getString(R.string.value_integer_megabyte, megabyte); + summary[i] = getString(R.string.settings_advanced_photo_size_summary, options[i]); + } + } + } } diff --git a/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java b/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java index 9482b31e8..c3df05ace 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java +++ b/MyTracks/src/com/google/android/apps/mytracks/settings/SettingsActivity.java @@ -43,9 +43,9 @@ public class SettingsActivity extends AbstractSettingsActivity { configPreference(R.string.settings_chart_key, ChartSettingsActivity.class); configPreference(R.string.settings_stats_key, StatsSettingsActivity.class); configPreference(R.string.settings_recording_key, RecordingSettingsActivity.class); - configPreference(R.string.settings_sharing_key, SharingSettingsActivity.class); configPreference(R.string.settings_sensor_key, SensorSettingsActivity.class); configPreference(R.string.settings_backup_reset_key, BackupResetSettingsActivity.class); + configPreference(R.string.settings_advanced_key, AdvancedSettingsActivity.class); } /** diff --git a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java index 6f1d6cff4..10b47cb16 100644 --- a/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java +++ b/MyTracks/src/com/google/android/apps/mytracks/util/PreferencesUtils.java @@ -82,6 +82,7 @@ public class PreferencesUtils { public static final int MIN_RECORDING_INTERVAL_ADAPT_BATTERY_LIFE = -2; public static final int MIN_RECORDING_INTERVAL_DEFAULT = 0; + public static final int PHOTO_SIZE_DEFAULT = 1024; // 1024 kB public static final int RECORDING_DISTANCE_INTERVAL_DEFAULT = 10; // Values for recording_gps_accuracy diff --git a/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java b/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java index 599b9f6b3..ba710344c 100644 --- a/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java +++ b/MyTracksTest_E2E/src/com/google/android/apps/mytracks/endtoendtest/common/SettingTest.java @@ -80,7 +80,7 @@ public class SettingTest extends ActivityInstrumentationTestCase2