Refactor: use marker instead of waypoint.

Fixes #389.
This commit is contained in:
Dennis Guse
2020-09-23 17:16:34 +02:00
parent 8643b50bd1
commit e939778beb
29 changed files with 349 additions and 472 deletions
@@ -76,7 +76,7 @@ public class ExportImportTest {
marker.setName("the marker " + i); marker.setName("the marker " + i);
marker.setDescription("the marker description " + i); marker.setDescription("the marker description " + i);
marker.setCategory("the marker category" + i); marker.setCategory("the marker category" + i);
marker.setIcon("the waypoing icon" + i); marker.setIcon("the marker icon" + i);
marker.setPhotoUrl("the photo url" + i); marker.setPhotoUrl("the photo url" + i);
marker.setTrackId(trackId); marker.setTrackId(trackId);
contentProviderUtils.insertMarker(marker); contentProviderUtils.insertMarker(marker);
@@ -318,7 +318,7 @@ public class TrackRecordingServiceTest {
// then // then
assertNotEquals(-1L, waypointId); assertNotEquals(-1L, waypointId);
Marker wpt = contentProviderUtils.getMarker(waypointId); Marker wpt = contentProviderUtils.getMarker(waypointId);
assertEquals(context.getString(R.string.marker_waypoint_icon_url), wpt.getIcon()); assertEquals(context.getString(R.string.marker_icon_url), wpt.getIcon());
assertEquals(context.getString(R.string.marker_name_format, 1), wpt.getName()); assertEquals(context.getString(R.string.marker_name_format, 1), wpt.getName());
assertEquals(trackId, wpt.getTrackId()); assertEquals(trackId, wpt.getTrackId());
assertEquals(0.0, wpt.getLength(), 0.01); assertEquals(0.0, wpt.getLength(), 0.01);
@@ -48,33 +48,33 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
private static final String TAG = MarkerDetailActivity.class.getSimpleName(); private static final String TAG = MarkerDetailActivity.class.getSimpleName();
private List<Marker.Id> waypointIds; private List<Marker.Id> markerIds;
@Override @Override
protected void onCreate(Bundle bundle) { protected void onCreate(Bundle bundle) {
super.onCreate(bundle); super.onCreate(bundle);
Marker.Id waypointId = getIntent().getParcelableExtra(EXTRA_MARKER_ID); Marker.Id markerId = getIntent().getParcelableExtra(EXTRA_MARKER_ID);
if (waypointId == null) { if (markerId == null) {
Log.d(TAG, "invalid marker id"); Log.d(TAG, "invalid marker id");
finish(); finish();
return; return;
} }
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this); ContentProviderUtils contentProviderUtils = new ContentProviderUtils(this);
Marker waypoint = contentProviderUtils.getMarker(waypointId); Marker marker = contentProviderUtils.getMarker(markerId);
waypointIds = new ArrayList<>(); markerIds = new ArrayList<>();
int markerIndex = -1; int markerIndex = -1;
//TODO Load only waypointIds, not the whole waypoint //TODO Load only markerIds, not the whole marker
try (Cursor cursor = contentProviderUtils.getMarkerCursor(waypoint.getTrackId(), null, -1)) { try (Cursor cursor = contentProviderUtils.getMarkerCursor(marker.getTrackId(), null, -1)) {
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
for (int i = 0; i < cursor.getCount(); i++) { for (int i = 0; i < cursor.getCount(); i++) {
Marker currentMarker = contentProviderUtils.createMarker(cursor); Marker currentMarker = contentProviderUtils.createMarker(cursor);
waypointIds.add(currentMarker.getId()); markerIds.add(currentMarker.getId());
if (waypointId.equals(currentMarker.getId())) { if (markerId.equals(currentMarker.getId())) {
markerIndex = waypointIds.size() - 1; markerIndex = markerIds.size() - 1;
} }
cursor.moveToNext(); cursor.moveToNext();
@@ -127,7 +127,7 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
@Override @Override
@NonNull @NonNull
public Fragment getItem(int position) { public Fragment getItem(int position) {
return MarkerDetailFragment.newInstance(waypointIds.get(position)); return MarkerDetailFragment.newInstance(markerIds.get(position));
} }
@Nullable @Nullable
@@ -138,7 +138,7 @@ public class MarkerDetailActivity extends AbstractActivity implements DeleteMark
@Override @Override
public int getCount() { public int getCount() {
return waypointIds.size(); return markerIds.size();
} }
} }
} }
@@ -68,7 +68,7 @@ public class MarkerEditActivity extends AbstractActivity {
private static final String TAG = MarkerEditActivity.class.getSimpleName(); private static final String TAG = MarkerEditActivity.class.getSimpleName();
private Track.Id trackId; private Track.Id trackId;
private TrackRecordingServiceConnection trackRecordingServiceConnection = new TrackRecordingServiceConnection(); private TrackRecordingServiceConnection trackRecordingServiceConnection = new TrackRecordingServiceConnection();
private Marker waypoint; private Marker marker;
private MenuItem insertPhotoMenuItem; private MenuItem insertPhotoMenuItem;
private MenuItem insertGalleryImgMenuItem; private MenuItem insertGalleryImgMenuItem;
@@ -77,35 +77,35 @@ public class MarkerEditActivity extends AbstractActivity {
private boolean hasCamera; private boolean hasCamera;
// UI elements // UI elements
private TextInputEditText waypointName; private TextInputEditText markerName;
private AutoCompleteTextView waypointMarkerType; private AutoCompleteTextView markerType;
private TextInputEditText waypointDescription; private TextInputEditText markerDescription;
private ImageView waypointPhoto; private ImageView markerPhoto;
private ImageView waypointDeletePhotoBtn; private ImageView markerDeletePhotoBtn;
@Override @Override
protected void onCreate(Bundle savedInstanceState) { protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
trackId = getIntent().getParcelableExtra(EXTRA_TRACK_ID); trackId = getIntent().getParcelableExtra(EXTRA_TRACK_ID);
Marker.Id waypointId = getIntent().getParcelableExtra(EXTRA_MARKER_ID); Marker.Id markerId = getIntent().getParcelableExtra(EXTRA_MARKER_ID);
hasCamera = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY); hasCamera = getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY);
// Setup UI elements // Setup UI elements
waypointName = findViewById(R.id.marker_edit_waypoint_name); markerName = findViewById(R.id.marker_edit_name);
waypointMarkerType = findViewById(R.id.marker_edit_waypoint_marker_type); markerType = findViewById(R.id.marker_edit_marker_type);
ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.waypoint_types, android.R.layout.simple_dropdown_item_1line); ArrayAdapter<CharSequence> adapter = ArrayAdapter.createFromResource(this, R.array.marker_types, android.R.layout.simple_dropdown_item_1line);
waypointMarkerType.setAdapter(adapter); markerType.setAdapter(adapter);
waypointDescription = findViewById(R.id.marker_edit_waypoint_description); markerDescription = findViewById(R.id.marker_edit_description);
waypointPhoto = findViewById(R.id.marker_edit_waypoint_photo); markerPhoto = findViewById(R.id.marker_edit_photo);
waypointDeletePhotoBtn = findViewById(R.id.marker_edit_waypoint_photo_delete); markerDeletePhotoBtn = findViewById(R.id.marker_edit_photo_delete);
waypointDeletePhotoBtn.setOnClickListener(v -> { markerDeletePhotoBtn.setOnClickListener(v -> {
if (waypoint != null && waypoint.hasPhoto()) { if (marker != null && marker.hasPhoto()) {
waypoint.setPhotoUrl(null); marker.setPhotoUrl(null);
} }
waypointPhoto.setImageBitmap(null); markerPhoto.setImageBitmap(null);
photoUri = null; photoUri = null;
hideAndShowOptions(); hideAndShowOptions();
}); });
@@ -113,7 +113,7 @@ public class MarkerEditActivity extends AbstractActivity {
Button cancel = findViewById(R.id.marker_edit_cancel); Button cancel = findViewById(R.id.marker_edit_cancel);
cancel.setOnClickListener(v -> finish()); cancel.setOnClickListener(v -> finish());
final boolean isNewMarker = waypointId == null; final boolean isNewMarker = markerId == null;
setTitle(isNewMarker ? R.string.menu_insert_marker : R.string.menu_edit); setTitle(isNewMarker ? R.string.menu_insert_marker : R.string.menu_edit);
Button done = findViewById(R.id.marker_edit_done); Button done = findViewById(R.id.marker_edit_done);
@@ -128,37 +128,37 @@ public class MarkerEditActivity extends AbstractActivity {
}); });
if (isNewMarker) { if (isNewMarker) {
int nextWaypointNumber = trackId == null ? -1 : new ContentProviderUtils(this).getNextMarkerNumber(trackId); int nextMarkerNumber = trackId == null ? -1 : new ContentProviderUtils(this).getNextMarkerNumber(trackId);
if (nextWaypointNumber == -1) { if (nextMarkerNumber == -1) {
nextWaypointNumber = 0; nextMarkerNumber = 0;
} }
waypointName.setText(getString(R.string.marker_name_format, nextWaypointNumber)); markerName.setText(getString(R.string.marker_name_format, nextMarkerNumber));
waypointName.selectAll(); markerName.selectAll();
waypointMarkerType.setText(""); markerType.setText("");
waypointDescription.setText(""); markerDescription.setText("");
} else { } else {
waypoint = new ContentProviderUtils(this).getMarker(waypointId); marker = new ContentProviderUtils(this).getMarker(markerId);
if (waypoint == null) { if (marker == null) {
Log.d(TAG, "waypoint is null"); Log.d(TAG, "marker is null");
finish(); finish();
return; return;
} }
waypointName.setText(waypoint.getName()); markerName.setText(marker.getName());
waypointMarkerType.setText(waypoint.getCategory()); markerType.setText(marker.getCategory());
waypointDescription.setText(waypoint.getDescription()); markerDescription.setText(marker.getDescription());
if (waypoint.hasPhoto()) { if (marker.hasPhoto()) {
photoUri = waypoint.getPhotoURI(); photoUri = marker.getPhotoURI();
} }
} }
if (savedInstanceState != null) { if (savedInstanceState != null) {
photoUri = savedInstanceState.getParcelable(BUNDLE_PHOTO_URI); photoUri = savedInstanceState.getParcelable(BUNDLE_PHOTO_URI);
if (waypoint != null) { if (marker != null) {
waypoint.setPhotoUrl(photoUri != null ? photoUri.toString() : null); marker.setPhotoUrl(photoUri != null ? photoUri.toString() : null);
} }
} }
if (photoUri != null) { if (photoUri != null) {
setWaypointImageView(photoUri); setMarkerImageView(photoUri);
} }
hideAndShowOptions(); hideAndShowOptions();
@@ -203,10 +203,10 @@ public class MarkerEditActivity extends AbstractActivity {
public boolean onOptionsItemSelected(@NonNull MenuItem item) { public boolean onOptionsItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.marker_edit_insert_photo: case R.id.marker_edit_insert_photo:
createWaypointWithPicture(); createMarkerWithPicture();
return true; return true;
case R.id.marker_edit_insert_gallery_img: case R.id.marker_edit_insert_gallery_img:
createWaypointWithGalleryImage(); createMarkerWithGalleryImage();
return true; return true;
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
@@ -220,7 +220,7 @@ public class MarkerEditActivity extends AbstractActivity {
Toast.makeText(this, R.string.marker_add_photo_canceled, Toast.LENGTH_LONG).show(); Toast.makeText(this, R.string.marker_add_photo_canceled, Toast.LENGTH_LONG).show();
return; return;
} else if (resultCode == RESULT_OK) { } else if (resultCode == RESULT_OK) {
setWaypointImageView(photoUri); setMarkerImageView(photoUri);
} }
} else if (requestCode == GALLERY_IMG_REQUEST_CODE) { } else if (requestCode == GALLERY_IMG_REQUEST_CODE) {
if (resultCode == RESULT_CANCELED) { if (resultCode == RESULT_CANCELED) {
@@ -234,7 +234,7 @@ public class MarkerEditActivity extends AbstractActivity {
FileUtils.copy(srcFd, dstFile); FileUtils.copy(srcFd, dstFile);
photoUri = FileUtils.getUriForFile(this, dstFile); photoUri = FileUtils.getUriForFile(this, dstFile);
setWaypointImageView(photoUri); setMarkerImageView(photoUri);
} catch(Exception e) { } catch(Exception e) {
Log.e(TAG, e.getMessage()); Log.e(TAG, e.getMessage());
Toast.makeText(this, R.string.marker_add_canceled, Toast.LENGTH_LONG).show(); Toast.makeText(this, R.string.marker_add_canceled, Toast.LENGTH_LONG).show();
@@ -251,31 +251,26 @@ public class MarkerEditActivity extends AbstractActivity {
* If a photo is set then one's options are shown, otherwise another ones are shown. * If a photo is set then one's options are shown, otherwise another ones are shown.
*/ */
private void hideAndShowOptions() { private void hideAndShowOptions() {
boolean isPhotoSet = (waypoint != null && waypoint.hasPhoto()) || photoUri != null; boolean isPhotoSet = (marker != null && marker.hasPhoto()) || photoUri != null;
if (insertPhotoMenuItem != null && insertGalleryImgMenuItem != null) { if (insertPhotoMenuItem != null && insertGalleryImgMenuItem != null) {
insertPhotoMenuItem.setVisible(!isPhotoSet); insertPhotoMenuItem.setVisible(!isPhotoSet);
insertGalleryImgMenuItem.setVisible(!isPhotoSet); insertGalleryImgMenuItem.setVisible(!isPhotoSet);
} }
waypointDeletePhotoBtn.setVisibility(isPhotoSet ? View.VISIBLE : View.GONE); markerDeletePhotoBtn.setVisibility(isPhotoSet ? View.VISIBLE : View.GONE);
} }
/** /**
* Returns the trackId. If trackId == -1 then get it from waypoint object. * Returns the trackId; either from track or marker.
*/ */
private Track.Id getTrackId() { private Track.Id getTrackId() {
return trackId == null ? waypoint.getTrackId() : trackId; return trackId == null ? marker.getTrackId() : trackId;
} }
/** private void setMarkerImageView(@NonNull Uri uri) {
* Sets the ImageView waypointPhoto with the uri photo.
*
* @param uri the uri photo.
*/
private void setWaypointImageView(@NonNull Uri uri) {
try (ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r")) { try (ParcelFileDescriptor pfd = getContentResolver().openFileDescriptor(uri, "r")) {
FileDescriptor fd = pfd.getFileDescriptor(); FileDescriptor fd = pfd.getFileDescriptor();
Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd); Bitmap bitmap = BitmapFactory.decodeFileDescriptor(fd);
waypointPhoto.setImageBitmap(bitmap); markerPhoto.setImageBitmap(bitmap);
hideAndShowOptions(); hideAndShowOptions();
} catch (IOException e) { } catch (IOException e) {
Log.e(TAG, e.getMessage()); Log.e(TAG, e.getMessage());
@@ -283,31 +278,31 @@ public class MarkerEditActivity extends AbstractActivity {
} }
} }
private void createWaypointWithPicture() { private void createMarkerWithPicture() {
Pair<Intent, Uri> intentAndPhotoUri = IntentUtils.createTakePictureIntent(this, getTrackId()); Pair<Intent, Uri> intentAndPhotoUri = IntentUtils.createTakePictureIntent(this, getTrackId());
photoUri = intentAndPhotoUri.second; photoUri = intentAndPhotoUri.second;
startActivityForResult(intentAndPhotoUri.first, CAMERA_REQUEST_CODE); startActivityForResult(intentAndPhotoUri.first, CAMERA_REQUEST_CODE);
} }
private void createWaypointWithGalleryImage() { private void createMarkerWithGalleryImage() {
Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI); Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
startActivityForResult(intent, GALLERY_IMG_REQUEST_CODE); startActivityForResult(intent, GALLERY_IMG_REQUEST_CODE);
} }
private void addMarker() { private void addMarker() {
trackRecordingServiceConnection.addMarker(this, trackRecordingServiceConnection.addMarker(this,
waypointName.getText().toString(), markerName.getText().toString(),
waypointMarkerType.getText().toString(), markerType.getText().toString(),
waypointDescription.getText().toString(), markerDescription.getText().toString(),
photoUri != null ? photoUri.toString() : null); photoUri != null ? photoUri.toString() : null);
} }
private void saveMarker() { private void saveMarker() {
waypoint.setName(waypointName.getText().toString()); marker.setName(markerName.getText().toString());
waypoint.setCategory(waypointMarkerType.getText().toString()); marker.setCategory(markerType.getText().toString());
waypoint.setDescription(waypointDescription.getText().toString()); marker.setDescription(markerDescription.getText().toString());
waypoint.setPhotoUrl(photoUri != null ? photoUri.toString() : null); marker.setPhotoUrl(photoUri != null ? photoUri.toString() : null);
new ContentProviderUtils(this).updateMarker(this, waypoint); new ContentProviderUtils(this).updateMarker(this, marker);
} }
} }
@@ -229,35 +229,35 @@ public class MarkerListActivity extends AbstractActivity implements DeleteMarker
/** /**
* Handles a context item selection. * Handles a context item selection.
* *
* @param itemId the menu item id * @param itemId the menu item id
* @param longWaypointIds the marker ids * @param longMarkerds the marker ids
* @return true if handled. * @return true if handled.
*/ */
private boolean handleContextItem(int itemId, long... longWaypointIds) { private boolean handleContextItem(int itemId, long... longMarkerds) {
Marker.Id[] waypointIds = new Marker.Id[longWaypointIds.length]; Marker.Id[] markerIds = new Marker.Id[longMarkerds.length];
for (int i = 0; i < longWaypointIds.length; i++) { for (int i = 0; i < longMarkerds.length; i++) {
waypointIds[i] = new Marker.Id(longWaypointIds[i]); markerIds[i] = new Marker.Id(longMarkerds[i]);
} }
Intent intent; Intent intent;
switch (itemId) { switch (itemId) {
case R.id.list_context_menu_show_on_map: case R.id.list_context_menu_show_on_map:
if (waypointIds.length == 1) { if (markerIds.length == 1) {
IntentUtils.showCoordinateOnMap(this, contentProviderUtils.getMarker(waypointIds[0])); IntentUtils.showCoordinateOnMap(this, contentProviderUtils.getMarker(markerIds[0]));
} }
return true; return true;
case R.id.list_context_menu_edit: case R.id.list_context_menu_edit:
if (waypointIds.length == 1) { if (markerIds.length == 1) {
intent = IntentUtils.newIntent(this, MarkerEditActivity.class) intent = IntentUtils.newIntent(this, MarkerEditActivity.class)
.putExtra(MarkerEditActivity.EXTRA_MARKER_ID, waypointIds[0]); .putExtra(MarkerEditActivity.EXTRA_MARKER_ID, markerIds[0]);
startActivity(intent); startActivity(intent);
} }
return true; return true;
case R.id.list_context_menu_delete: case R.id.list_context_menu_delete:
if (waypointIds.length > 1 && waypointIds.length == listView.getCount()) { if (markerIds.length > 1 && markerIds.length == listView.getCount()) {
waypointIds = null; markerIds = null;
} }
DeleteMarkerDialogFragment.showDialog(getSupportFragmentManager(), waypointIds); DeleteMarkerDialogFragment.showDialog(getSupportFragmentManager(), markerIds);
return true; return true;
case R.id.list_context_menu_select_all: case R.id.list_context_menu_select_all:
for (int i = 0; i < listView.getCount(); i++) { for (int i = 0; i < listView.getCount(); i++) {
@@ -271,7 +271,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
} }
Map<String, Object> item = arrayAdapter.getItem(positions[0]); Map<String, Object> item = arrayAdapter.getItem(positions[0]);
Track.Id trackId = (Track.Id) item.get(TRACK_ID_FIELD); Track.Id trackId = (Track.Id) item.get(TRACK_ID_FIELD);
Marker.Id waypointId = (Marker.Id) item.get(MARKER_ID_FIELD); Marker.Id markerId = (Marker.Id) item.get(MARKER_ID_FIELD);
Intent intent; Intent intent;
switch (itemId) { switch (itemId) {
case R.id.list_context_menu_show_on_map: case R.id.list_context_menu_show_on_map:
@@ -283,9 +283,9 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
startActivity(intent); startActivity(intent);
return true; return true;
case R.id.list_context_menu_edit: case R.id.list_context_menu_edit:
if (waypointId != null) { if (markerId != null) {
intent = IntentUtils.newIntent(this, MarkerEditActivity.class) intent = IntentUtils.newIntent(this, MarkerEditActivity.class)
.putExtra(MarkerEditActivity.EXTRA_MARKER_ID, waypointId); .putExtra(MarkerEditActivity.EXTRA_MARKER_ID, markerId);
} else { } else {
intent = IntentUtils.newIntent(this, TrackEditActivity.class) intent = IntentUtils.newIntent(this, TrackEditActivity.class)
.putExtra(TrackEditActivity.EXTRA_TRACK_ID, trackId); .putExtra(TrackEditActivity.EXTRA_TRACK_ID, trackId);
@@ -296,8 +296,8 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
finish(); finish();
return true; return true;
case R.id.list_context_menu_delete: case R.id.list_context_menu_delete:
if (waypointId != null) { if (markerId != null) {
DeleteMarkerDialogFragment.showDialog(getSupportFragmentManager(), waypointId); DeleteMarkerDialogFragment.showDialog(getSupportFragmentManager(), markerId);
} else { } else {
deleteTracks(trackId); deleteTracks(trackId);
} }
@@ -349,7 +349,7 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
* @return a list of result maps * @return a list of result maps
*/ */
private List<Map<String, Object>> prepareResultsforDisplay(Collection<ScoredResult> scoredResults) { private List<Map<String, Object>> prepareResultsforDisplay(Collection<ScoredResult> scoredResults) {
//TODO Replace use of map<string, object>, but rather provide Track or Waypoint directly. //TODO Replace use of map<string, object>, but rather provide Track or Marker directly.
ArrayList<Map<String, Object>> output = new ArrayList<>(scoredResults.size()); ArrayList<Map<String, Object>> output = new ArrayList<>(scoredResults.size());
for (ScoredResult result : scoredResults) { for (ScoredResult result : scoredResults) {
if (result.track != null) { if (result.track != null) {
@@ -361,18 +361,12 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
return output; return output;
} }
/** private Map<String, Object> prepareMarkerForDisplay(Marker marker) {
* Prepares a marker for display by filling in a result map.
*
* @param waypoint the marker
* @return the result map
*/
private Map<String, Object> prepareMarkerForDisplay(Marker waypoint) {
Map<String, Object> resultMap = new HashMap<>(); Map<String, Object> resultMap = new HashMap<>();
//TODO: It may be more appropriate to obtain the track name as a join in the retrieval phase of the searchable. //TODO: It may be more appropriate to obtain the track name as a join in the retrieval phase of the searchable.
String trackName = null; String trackName = null;
Track.Id trackId = waypoint.getTrackId(); Track.Id trackId = marker.getTrackId();
if (!trackId.isValid()) { if (!trackId.isValid()) {
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
if (track != null) { if (track != null) {
@@ -384,20 +378,20 @@ public class SearchListActivity extends AbstractListActivity implements DeleteMa
resultMap.put(IS_PAUSED_FIELD, true); resultMap.put(IS_PAUSED_FIELD, true);
resultMap.put(ICON_ID_FIELD, MarkerUtils.ICON_ID); resultMap.put(ICON_ID_FIELD, MarkerUtils.ICON_ID);
resultMap.put(ICON_CONTENT_DESCRIPTION_ID_FIELD, R.string.image_marker); resultMap.put(ICON_CONTENT_DESCRIPTION_ID_FIELD, R.string.image_marker);
resultMap.put(NAME_FIELD, waypoint.getName()); resultMap.put(NAME_FIELD, marker.getName());
// Display the marker's track name in the total time field // Display the marker's track name in the total time field
resultMap.put(TOTAL_TIME_FIELD, trackName == null ? null : getString(R.string.search_list_marker_track_location, trackName)); resultMap.put(TOTAL_TIME_FIELD, trackName == null ? null : getString(R.string.search_list_marker_track_location, trackName));
resultMap.put(TOTAL_DISTANCE_FIELD, null); resultMap.put(TOTAL_DISTANCE_FIELD, null);
resultMap.put(MARKER_COUNT_FIELD, 0); resultMap.put(MARKER_COUNT_FIELD, 0);
resultMap.put(START_TIME_FIELD, waypoint.getLocation().getTime()); resultMap.put(START_TIME_FIELD, marker.getLocation().getTime());
resultMap.put(CATEGORY_FIELD, waypoint.getCategory()); resultMap.put(CATEGORY_FIELD, marker.getCategory());
resultMap.put(DESCRIPTION_FIELD, waypoint.getDescription()); resultMap.put(DESCRIPTION_FIELD, marker.getDescription());
resultMap.put(PHOTO_URL_FIELD, waypoint.getPhotoUrl()); resultMap.put(PHOTO_URL_FIELD, marker.getPhotoUrl());
resultMap.put(TRACK_ID_FIELD, waypoint.getTrackId()); resultMap.put(TRACK_ID_FIELD, marker.getTrackId());
resultMap.put(MARKER_ID_FIELD, waypoint.getId()); resultMap.put(MARKER_ID_FIELD, marker.getId());
resultMap.put(MARKER_LATITUDE_FIELD, waypoint.getLocation().getLatitude()); resultMap.put(MARKER_LATITUDE_FIELD, marker.getLocation().getLatitude());
resultMap.put(MARKER_LONGITUDE_FIELD, waypoint.getLocation().getLongitude()); resultMap.put(MARKER_LONGITUDE_FIELD, marker.getLocation().getLongitude());
return resultMap; return resultMap;
} }
@@ -206,15 +206,15 @@ public class TrackRecordedActivity extends AbstractListActivity implements Choos
private void handleIntent(Intent intent) { private void handleIntent(Intent intent) {
Track.Id trackId = intent.getParcelableExtra(EXTRA_TRACK_ID); Track.Id trackId = intent.getParcelableExtra(EXTRA_TRACK_ID);
Marker.Id waypointId = intent.getParcelableExtra(EXTRA_MARKER_ID); Marker.Id markerId = intent.getParcelableExtra(EXTRA_MARKER_ID);
if (waypointId != null) { if (markerId != null) {
// Use the trackId from the marker // Use the trackId from the marker
Marker waypoint = contentProviderUtils.getMarker(waypointId); Marker marker = contentProviderUtils.getMarker(markerId);
if (waypoint == null) { if (marker == null) {
finish(); finish();
return; return;
} }
trackId = waypoint.getTrackId(); trackId = marker.getTrackId();
} }
if (trackId == null) { if (trackId == null) {
@@ -75,7 +75,7 @@ public class ChartView extends View {
private static final int Y_AXIS_OFFSET = 16; private static final int Y_AXIS_OFFSET = 16;
//TODO Determine from actual size of the used drawable //TODO Determine from actual size of the used drawable
private static final float WAYPOINT_X_ANCHOR = 13f / 48f; private static final float MARKER_X_ANCHOR = 13f / 48f;
static { static {
X_FRACTION_FORMAT.setMaximumFractionDigits(1); X_FRACTION_FORMAT.setMaximumFractionDigits(1);
@@ -87,7 +87,7 @@ public class ChartView extends View {
private final ChartValueSeries paceSeries; private final ChartValueSeries paceSeries;
private final List<ChartPoint> chartPoints = new ArrayList<>(); private final List<ChartPoint> chartPoints = new ArrayList<>();
private final List<Marker> waypoints = new ArrayList<>(); private final List<Marker> markers = new ArrayList<>();
private final ExtremityMonitor xExtremityMonitor = new ExtremityMonitor(); private final ExtremityMonitor xExtremityMonitor = new ExtremityMonitor();
private final int backgroundColor; private final int backgroundColor;
private final Paint axisPaint; private final Paint axisPaint;
@@ -95,7 +95,7 @@ public class ChartView extends View {
private final Paint gridPaint; private final Paint gridPaint;
private final Paint markerPaint; private final Paint markerPaint;
private final Drawable pointer; private final Drawable pointer;
private final Drawable waypointMarker; private final Drawable markerPin;
private final int markerWidth; private final int markerWidth;
private final int markerHeight; private final int markerHeight;
private final Scroller scroller; private final Scroller scroller;
@@ -151,19 +151,19 @@ public class ChartView extends View {
// Check if the y event is within markerHeight of the marker center // Check if the y event is within markerHeight of the marker center
if (Math.abs(event.getY() - topBorder - spacer - markerHeight / 2f) < markerHeight) { if (Math.abs(event.getY() - topBorder - spacer - markerHeight / 2f) < markerHeight) {
int minDistance = Integer.MAX_VALUE; int minDistance = Integer.MAX_VALUE;
Marker nearestWaypoint = null; Marker nearestMarker = null;
synchronized (waypoints) { synchronized (markers) {
for (Marker waypoint : waypoints) { for (Marker marker : markers) {
int distance = Math.abs(getX(getWaypointXValue(waypoint)) - (int) event.getX() - getScrollX()); int distance = Math.abs(getX(getMarkerXValue(marker)) - (int) event.getX() - getScrollX());
if (distance < minDistance) { if (distance < minDistance) {
minDistance = distance; minDistance = distance;
nearestWaypoint = waypoint; nearestMarker = marker;
} }
} }
} }
if (nearestWaypoint != null && minDistance < markerWidth) { if (nearestMarker != null && minDistance < markerWidth) {
Intent intent = IntentUtils.newIntent(getContext(), MarkerDetailActivity.class) Intent intent = IntentUtils.newIntent(getContext(), MarkerDetailActivity.class)
.putExtra(MarkerDetailActivity.EXTRA_MARKER_ID, nearestWaypoint.getId()); .putExtra(MarkerDetailActivity.EXTRA_MARKER_ID, nearestMarker.getId());
getContext().startActivity(intent); getContext().startActivity(intent);
return true; return true;
} }
@@ -333,10 +333,10 @@ public class ChartView extends View {
pointer = context.getResources().getDrawable(R.drawable.ic_logo_color_24dp); pointer = context.getResources().getDrawable(R.drawable.ic_logo_color_24dp);
pointer.setBounds(0, 0, pointer.getIntrinsicWidth(), pointer.getIntrinsicHeight()); pointer.setBounds(0, 0, pointer.getIntrinsicWidth(), pointer.getIntrinsicHeight());
waypointMarker = MarkerUtils.getDefaultPhoto(context); markerPin = MarkerUtils.getDefaultPhoto(context);
markerWidth = waypointMarker.getIntrinsicWidth(); markerWidth = markerPin.getIntrinsicWidth();
markerHeight = waypointMarker.getIntrinsicHeight(); markerHeight = markerPin.getIntrinsicHeight();
waypointMarker.setBounds(0, 0, markerWidth, markerHeight); markerPin.setBounds(0, 0, markerWidth, markerHeight);
scroller = new Scroller(context); scroller = new Scroller(context);
setFocusable(true); setFocusable(true);
@@ -435,15 +435,15 @@ public class ChartView extends View {
scrollTo(0, 0); scrollTo(0, 0);
} }
public void addWaypoint(Marker waypoint) { public void addMarker(Marker marker) {
synchronized (waypoints) { synchronized (markers) {
waypoints.add(waypoint); markers.add(marker);
} }
} }
public void clearWaypoints() { public void clearMarker() {
synchronized (waypoints) { synchronized (markers) {
waypoints.clear(); markers.clear();
} }
} }
@@ -547,7 +547,7 @@ public class ChartView extends View {
clipToGraphArea(canvas); clipToGraphArea(canvas);
drawDataSeries(canvas); drawDataSeries(canvas);
drawWaypoints(canvas); drawMarker(canvas);
drawGrid(canvas); drawGrid(canvas);
canvas.restore(); canvas.restore();
@@ -588,24 +588,19 @@ public class ChartView extends View {
} }
} }
/** private void drawMarker(Canvas canvas) {
* Draws the waypoints. synchronized (markers) {
* for (Marker marker : markers) {
* @param canvas the canvas double xValue = getMarkerXValue(marker);
*/
private void drawWaypoints(Canvas canvas) {
synchronized (waypoints) {
for (Marker waypoint : waypoints) {
double xValue = getWaypointXValue(waypoint);
if (xValue > maxX) { if (xValue > maxX) {
continue; continue;
} }
canvas.save(); canvas.save();
float x = getX(getWaypointXValue(waypoint)); float x = getX(getMarkerXValue(marker));
canvas.drawLine(x, topBorder + spacer + markerHeight / 2, x, topBorder + effectiveHeight, markerPaint); canvas.drawLine(x, topBorder + spacer + markerHeight / 2, x, topBorder + effectiveHeight, markerPaint);
canvas.translate(x - (markerWidth * WAYPOINT_X_ANCHOR), topBorder + spacer); canvas.translate(x - (markerWidth * MARKER_X_ANCHOR), topBorder + spacer);
waypointMarker.draw(canvas); markerPin.draw(canvas);
canvas.restore(); canvas.restore();
} }
} }
@@ -976,17 +971,12 @@ public class ChartView extends View {
return topBorder + yAxisOffset + (int) ((1 - percentage) * rangeHeight); return topBorder + yAxisOffset + (int) ((1 - percentage) * rangeHeight);
} }
/** private double getMarkerXValue(Marker marker) {
* Gets a waypoint's x value.
*
* @param waypoint the waypoint
*/
private double getWaypointXValue(Marker waypoint) {
if (chartByDistance) { if (chartByDistance) {
double lenghtInKm = waypoint.getLength() * UnitConversions.M_TO_KM; double length_km = marker.getLength() * UnitConversions.M_TO_KM;
return metricUnits ? lenghtInKm : lenghtInKm * UnitConversions.KM_TO_MI; return metricUnits ? length_km : length_km * UnitConversions.KM_TO_MI;
} else { } else {
return waypoint.getDuration(); return marker.getDuration();
} }
} }
@@ -69,7 +69,7 @@ public final class Marker {
} }
/** /**
* May be null if the waypoint was not loaded from the database. * May be null if the it was not loaded from the database.
*/ */
public @Nullable public @Nullable
Id getId() { Id getId() {
@@ -170,7 +170,7 @@ public final class Marker {
return id; return id;
} }
@Deprecated //TODO Use a Waypoint.Id of null instead @Deprecated //TODO Use a Id of null instead
public boolean isValid() { public boolean isValid() {
return id != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT; return id != PreferencesUtils.RECORDING_TRACK_ID_DEFAULT;
} }
@@ -22,7 +22,7 @@ import android.provider.BaseColumns;
import de.dennisguse.opentracks.content.provider.ContentProviderUtils; import de.dennisguse.opentracks.content.provider.ContentProviderUtils;
/** /**
* Constants for waypoints table. * Constants for markers table.
* *
* @author Leif Hendrik Wilden * @author Leif Hendrik Wilden
*/ */
@@ -36,10 +36,10 @@ public interface MarkerColumns extends BaseColumns {
String DEFAULT_SORT_ORDER = _ID; String DEFAULT_SORT_ORDER = _ID;
// Columns // Columns
String NAME = "name"; // waypoint name String NAME = "name"; // marker name
String DESCRIPTION = "description"; // waypoint description String DESCRIPTION = "description"; // marker description
String CATEGORY = "category"; // waypoint category String CATEGORY = "category"; // marker category
String ICON = "icon"; // waypoint icon String ICON = "icon"; // marker icon
String TRACKID = "trackid"; // track id String TRACKID = "trackid"; // track id
String LENGTH = "length"; // length of the track (without smoothing) String LENGTH = "length"; // length of the track (without smoothing)
@@ -38,7 +38,7 @@ import de.dennisguse.opentracks.content.data.TrackPointsColumns;
import de.dennisguse.opentracks.content.data.TracksColumns; import de.dennisguse.opentracks.content.data.TracksColumns;
/** /**
* A {@link ContentProvider} that handles access to track points, tracks, and waypoints tables. * A {@link ContentProvider} that handles access to track points, tracks, and markers tables.
* *
* @author Leif Hendrik Wilden * @author Leif Hendrik Wilden
*/ */
@@ -61,9 +61,9 @@ public class CustomContentProvider extends ContentProvider {
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.CONTENT_URI.getPath(), UrlType.TRACKS.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.CONTENT_URI.getPath(), UrlType.TRACKS.ordinal());
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.CONTENT_URI.getPath() + "/*", UrlType.TRACKS_BY_ID.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, TracksColumns.CONTENT_URI.getPath() + "/*", UrlType.TRACKS_BY_ID.ordinal());
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath(), UrlType.WAYPOINTS.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath(), UrlType.MARKERS.ordinal());
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath() + "/#", UrlType.WAYPOINTS_BY_ID.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI.getPath() + "/#", UrlType.MARKERS_BY_ID.ordinal());
uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI_BY_TRACKID.getPath() + "/*", UrlType.WAYPOINTS_BY_TRACKID.ordinal()); uriMatcher.addURI(ContentProviderUtils.AUTHORITY_PACKAGE, MarkerColumns.CONTENT_URI_BY_TRACKID.getPath() + "/*", UrlType.MARKERS_BY_TRACKID.ordinal());
} }
@Override @Override
@@ -100,7 +100,7 @@ public class CustomContentProvider extends ContentProvider {
table = TracksColumns.TABLE_NAME; table = TracksColumns.TABLE_NAME;
shouldVacuum = true; shouldVacuum = true;
break; break;
case WAYPOINTS: case MARKERS:
table = MarkerColumns.TABLE_NAME; table = MarkerColumns.TABLE_NAME;
break; break;
default: default:
@@ -138,10 +138,10 @@ public class CustomContentProvider extends ContentProvider {
return TracksColumns.CONTENT_TYPE; return TracksColumns.CONTENT_TYPE;
case TRACKS_BY_ID: case TRACKS_BY_ID:
return TracksColumns.CONTENT_ITEMTYPE; return TracksColumns.CONTENT_ITEMTYPE;
case WAYPOINTS: case MARKERS:
return MarkerColumns.CONTENT_TYPE; return MarkerColumns.CONTENT_TYPE;
case WAYPOINTS_BY_ID: case MARKERS_BY_ID:
case WAYPOINTS_BY_TRACKID: case MARKERS_BY_TRACKID:
return MarkerColumns.CONTENT_ITEMTYPE; return MarkerColumns.CONTENT_ITEMTYPE;
default: default:
throw new IllegalArgumentException("Unknown URL " + url); throw new IllegalArgumentException("Unknown URL " + url);
@@ -213,15 +213,15 @@ public class CustomContentProvider extends ContentProvider {
queryBuilder.setTables(TracksColumns.TABLE_NAME); queryBuilder.setTables(TracksColumns.TABLE_NAME);
queryBuilder.appendWhere(TracksColumns._ID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); queryBuilder.appendWhere(TracksColumns._ID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")");
break; break;
case WAYPOINTS: case MARKERS:
queryBuilder.setTables(MarkerColumns.TABLE_NAME); queryBuilder.setTables(MarkerColumns.TABLE_NAME);
sortOrder = sort != null ? sort : MarkerColumns.DEFAULT_SORT_ORDER; sortOrder = sort != null ? sort : MarkerColumns.DEFAULT_SORT_ORDER;
break; break;
case WAYPOINTS_BY_ID: case MARKERS_BY_ID:
queryBuilder.setTables(MarkerColumns.TABLE_NAME); queryBuilder.setTables(MarkerColumns.TABLE_NAME);
queryBuilder.appendWhere(MarkerColumns._ID + "=" + ContentUris.parseId(url)); queryBuilder.appendWhere(MarkerColumns._ID + "=" + ContentUris.parseId(url));
break; break;
case WAYPOINTS_BY_TRACKID: case MARKERS_BY_TRACKID:
queryBuilder.setTables(MarkerColumns.TABLE_NAME); queryBuilder.setTables(MarkerColumns.TABLE_NAME);
queryBuilder.appendWhere(MarkerColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")"); queryBuilder.appendWhere(MarkerColumns.TRACKID + " IN (" + TextUtils.join(SQL_LIST_DELIMITER, ContentProviderUtils.parseTrackIdsFromUri(url)) + ")");
break; break;
@@ -261,11 +261,11 @@ public class CustomContentProvider extends ContentProvider {
whereClause += " AND (" + where + ")"; whereClause += " AND (" + where + ")";
} }
break; break;
case WAYPOINTS: case MARKERS:
table = MarkerColumns.TABLE_NAME; table = MarkerColumns.TABLE_NAME;
whereClause = where; whereClause = where;
break; break;
case WAYPOINTS_BY_ID: case MARKERS_BY_ID:
table = MarkerColumns.TABLE_NAME; table = MarkerColumns.TABLE_NAME;
whereClause = MarkerColumns._ID + "=" + ContentUris.parseId(url); whereClause = MarkerColumns._ID + "=" + ContentUris.parseId(url);
if (!TextUtils.isEmpty(where)) { if (!TextUtils.isEmpty(where)) {
@@ -316,8 +316,8 @@ public class CustomContentProvider extends ContentProvider {
return insertTrackPoint(url, contentValues); return insertTrackPoint(url, contentValues);
case TRACKS: case TRACKS:
return insertTrack(url, contentValues); return insertTrack(url, contentValues);
case WAYPOINTS: case MARKERS:
return insertWaypoint(url, contentValues); return insertMarker(url, contentValues);
default: default:
throw new IllegalArgumentException("Unknown url " + url); throw new IllegalArgumentException("Unknown url " + url);
} }
@@ -361,25 +361,14 @@ public class CustomContentProvider extends ContentProvider {
throw new SQLException("Failed to insert a track " + url); throw new SQLException("Failed to insert a track " + url);
} }
/** private Uri insertMarker(Uri url, ContentValues contentValues) {
* Inserts a waypoint.
*
* @param url the content url
* @param contentValues the content values
*/
private Uri insertWaypoint(Uri url, ContentValues contentValues) {
long rowId = db.insert(MarkerColumns.TABLE_NAME, MarkerColumns._ID, contentValues); long rowId = db.insert(MarkerColumns.TABLE_NAME, MarkerColumns._ID, contentValues);
if (rowId >= 0) { if (rowId >= 0) {
return ContentUris.appendId(MarkerColumns.CONTENT_URI.buildUpon(), rowId).build(); return ContentUris.appendId(MarkerColumns.CONTENT_URI.buildUpon(), rowId).build();
} }
throw new SQLException("Failed to insert a waypoint " + url); throw new SQLException("Failed to insert a marker " + url);
} }
/**
* Types of url.
*
* @author Jimmy Shih
*/
@VisibleForTesting @VisibleForTesting
enum UrlType { enum UrlType {
TRACKPOINTS, TRACKPOINTS,
@@ -387,8 +376,8 @@ public class CustomContentProvider extends ContentProvider {
TRACKPOINTS_BY_TRACKID, TRACKPOINTS_BY_TRACKID,
TRACKS, TRACKS,
TRACKS_BY_ID, TRACKS_BY_ID,
WAYPOINTS, MARKERS,
WAYPOINTS_BY_ID, MARKERS_BY_ID,
WAYPOINTS_BY_TRACKID MARKERS_BY_TRACKID
} }
} }
@@ -244,14 +244,14 @@ public class ChartFragment extends Fragment implements TrackDataListener {
@Override @Override
public void clearMarkers() { public void clearMarkers() {
if (isResumed()) { if (isResumed()) {
chartView.clearWaypoints(); chartView.clearMarker();
} }
} }
@Override @Override
public void onNewMarker(Marker marker) { public void onNewMarker(Marker marker) {
if (isResumed() && marker != null && LocationUtils.isValidLocation(marker.getLocation())) { if (isResumed() && marker != null && LocationUtils.isValidLocation(marker.getLocation())) {
chartView.addWaypoint(marker); chartView.addMarker(marker);
} }
} }
@@ -42,9 +42,9 @@ public class DeleteMarkerDialogFragment extends DialogFragment {
private DeleteMarkerCaller caller; private DeleteMarkerCaller caller;
public static void showDialog(FragmentManager fragmentManager, Marker.Id... waypointIds) { public static void showDialog(FragmentManager fragmentManager, Marker.Id... markerIds) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelableArray(KEY_MARKER_IDS, waypointIds); bundle.putParcelableArray(KEY_MARKER_IDS, markerIds);
DeleteMarkerDialogFragment deleteMarkerDialogFragment = new DeleteMarkerDialogFragment(); DeleteMarkerDialogFragment deleteMarkerDialogFragment = new DeleteMarkerDialogFragment();
deleteMarkerDialogFragment.setArguments(bundle); deleteMarkerDialogFragment.setArguments(bundle);
@@ -66,8 +66,8 @@ public class MarkerDetailFragment extends Fragment {
private Handler handler; private Handler handler;
private ImageView photoView; private ImageView photoView;
private ImageView textGradient; private ImageView textGradient;
private LinearLayout waypointInfo; private LinearLayout markerInfo;
private Marker waypoint; private Marker marker;
private final Runnable hideText = new Runnable() { private final Runnable hideText = new Runnable() {
@Override @Override
public void run() { public void run() {
@@ -85,17 +85,17 @@ public class MarkerDetailFragment extends Fragment {
@Override @Override
public void onAnimationEnd(Animation anim) { public void onAnimationEnd(Animation anim) {
textGradient.setVisibility(View.GONE); textGradient.setVisibility(View.GONE);
waypointInfo.setVisibility(View.GONE); markerInfo.setVisibility(View.GONE);
} }
}); });
textGradient.startAnimation(animation); textGradient.startAnimation(animation);
waypointInfo.startAnimation(animation); markerInfo.startAnimation(animation);
} }
}; };
public static MarkerDetailFragment newInstance(Marker.Id waypointId) { public static MarkerDetailFragment newInstance(Marker.Id markerId) {
Bundle bundle = new Bundle(); Bundle bundle = new Bundle();
bundle.putParcelable(KEY_MARKER_ID, waypointId); bundle.putParcelable(KEY_MARKER_ID, markerId);
MarkerDetailFragment fragment = new MarkerDetailFragment(); MarkerDetailFragment fragment = new MarkerDetailFragment();
fragment.setArguments(bundle); fragment.setArguments(bundle);
@@ -106,8 +106,8 @@ public class MarkerDetailFragment extends Fragment {
public void onCreate(Bundle savedInstanceState) { public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState); super.onCreate(savedInstanceState);
Marker.Id waypointId = getArguments().getParcelable(KEY_MARKER_ID); Marker.Id markerId = getArguments().getParcelable(KEY_MARKER_ID);
if (waypointId == null) { if (markerId == null) {
Log.d(TAG, "invalid marker id"); Log.d(TAG, "invalid marker id");
getParentFragmentManager().popBackStack(); getParentFragmentManager().popBackStack();
return; return;
@@ -121,15 +121,15 @@ public class MarkerDetailFragment extends Fragment {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.marker_detail_fragment, container, false); View view = inflater.inflate(R.layout.marker_detail_fragment, container, false);
photoView = view.findViewById(R.id.marker_detail_waypoint_photo); photoView = view.findViewById(R.id.marker_detail_marker_photo);
textGradient = view.findViewById(R.id.marker_detail_waypoint_text_gradient); textGradient = view.findViewById(R.id.marker_detail_marker_text_gradient);
waypointInfo = view.findViewById(R.id.marker_detail_waypoint_info); markerInfo = view.findViewById(R.id.marker_detail_marker_info);
photoView.setOnClickListener(v -> { photoView.setOnClickListener(v -> {
handler.removeCallbacks(hideText); handler.removeCallbacks(hideText);
int visibility = waypointInfo.getVisibility() == View.GONE ? View.VISIBLE : View.GONE; int visibility = markerInfo.getVisibility() == View.GONE ? View.VISIBLE : View.GONE;
textGradient.setVisibility(visibility); textGradient.setVisibility(visibility);
waypointInfo.setVisibility(visibility); markerInfo.setVisibility(visibility);
if (visibility == View.VISIBLE) { if (visibility == View.VISIBLE) {
handler.postDelayed(hideText, HIDE_TEXT_DELAY); handler.postDelayed(hideText, HIDE_TEXT_DELAY);
} }
@@ -141,8 +141,8 @@ public class MarkerDetailFragment extends Fragment {
public void onResume() { public void onResume() {
super.onResume(); super.onResume();
// Need to update the waypoint in case returning after an edit // Need to update the marker in case returning after an edit
updateWaypoint(true); updateMarker(true);
updateUi(); updateUi();
updateMenuItems(); updateMenuItems();
} }
@@ -171,64 +171,59 @@ public class MarkerDetailFragment extends Fragment {
public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) { public void onCreateOptionsMenu(@NonNull Menu menu, MenuInflater inflater) {
inflater.inflate(R.menu.marker_detail, menu); inflater.inflate(R.menu.marker_detail, menu);
shareMarkerImageMenuItem = menu.findItem(R.id.marker_detail_share); shareMarkerImageMenuItem = menu.findItem(R.id.marker_detail_share);
updateWaypoint(false); updateMarker(false);
updateMenuItems(); updateMenuItems();
} }
private void updateMenuItems() { private void updateMenuItems() {
if (shareMarkerImageMenuItem != null) if (shareMarkerImageMenuItem != null)
shareMarkerImageMenuItem.setVisible(waypoint.hasPhoto()); shareMarkerImageMenuItem.setVisible(marker.hasPhoto());
} }
@Override @Override
public boolean onOptionsItemSelected(MenuItem item) { public boolean onOptionsItemSelected(MenuItem item) {
Marker.Id waypointId = getArguments().getParcelable(KEY_MARKER_ID); //TODO Should only happen in onCreate? Marker.Id markerId = getArguments().getParcelable(KEY_MARKER_ID); //TODO Should only happen in onCreate?
FragmentActivity fragmentActivity = getActivity(); FragmentActivity fragmentActivity = getActivity();
Intent intent; Intent intent;
switch (item.getItemId()) { switch (item.getItemId()) {
case R.id.marker_detail_show_on_map: case R.id.marker_detail_show_on_map:
IntentUtils.showCoordinateOnMap(getContext(), waypoint); IntentUtils.showCoordinateOnMap(getContext(), marker);
return true; return true;
case R.id.marker_detail_edit: case R.id.marker_detail_edit:
intent = IntentUtils.newIntent(fragmentActivity, MarkerEditActivity.class) intent = IntentUtils.newIntent(fragmentActivity, MarkerEditActivity.class)
.putExtra(MarkerEditActivity.EXTRA_MARKER_ID, waypointId); .putExtra(MarkerEditActivity.EXTRA_MARKER_ID, markerId);
startActivity(intent); startActivity(intent);
return true; return true;
case R.id.marker_detail_share: case R.id.marker_detail_share:
if (waypoint.hasPhoto()) { if (marker.hasPhoto()) {
intent = IntentUtils.newShareImageIntent(getContext(), waypoint.getPhotoURI()); intent = IntentUtils.newShareImageIntent(getContext(), marker.getPhotoURI());
intent = Intent.createChooser(intent, null); intent = Intent.createChooser(intent, null);
startActivity(intent); startActivity(intent);
} }
return true; return true;
case R.id.marker_detail_delete: case R.id.marker_detail_delete:
DeleteMarkerDialogFragment.showDialog(getChildFragmentManager(), waypointId); DeleteMarkerDialogFragment.showDialog(getChildFragmentManager(), markerId);
return true; return true;
default: default:
return super.onOptionsItemSelected(item); return super.onOptionsItemSelected(item);
} }
} }
/** private void updateMarker(boolean refresh) {
* Updates the waypoint. if (refresh || marker == null) {
* marker = contentProviderUtils.getMarker(getArguments().getParcelable(KEY_MARKER_ID)); //TODO Should only happen in onCreate?
* @param refresh true to always update if (marker == null) {
*/ Log.d(TAG, "marker is null");
private void updateWaypoint(boolean refresh) {
if (refresh || waypoint == null) {
waypoint = contentProviderUtils.getMarker(getArguments().getParcelable(KEY_MARKER_ID)); //TODO Should only happen in onCreate?
if (waypoint == null) {
Log.d(TAG, "waypoint is null");
getParentFragmentManager().popBackStack(); getParentFragmentManager().popBackStack();
} }
} }
} }
private void updateUi() { private void updateUi() {
boolean hasPhoto = waypoint.hasPhoto(); boolean hasPhoto = marker.hasPhoto();
if (hasPhoto) { if (hasPhoto) {
handler.removeCallbacks(hideText); handler.removeCallbacks(hideText);
photoView.setImageURI(waypoint.getPhotoURI()); photoView.setImageURI(marker.getPhotoURI());
handler.postDelayed(hideText, HIDE_TEXT_DELAY); handler.postDelayed(hideText, HIDE_TEXT_DELAY);
} else { } else {
photoView.setImageResource(MarkerUtils.ICON_ID); photoView.setImageResource(MarkerUtils.ICON_ID);
@@ -236,23 +231,23 @@ public class MarkerDetailFragment extends Fragment {
setName(hasPhoto); setName(hasPhoto);
TextView category = getView().findViewById(R.id.marker_detail_waypoint_category); TextView category = getView().findViewById(R.id.marker_detail_marker_category);
ListItemUtils.setTextView(getActivity(), category, StringUtils.getCategory(waypoint.getCategory()), hasPhoto); ListItemUtils.setTextView(getActivity(), category, StringUtils.getCategory(marker.getCategory()), hasPhoto);
TextView description = getView().findViewById(R.id.marker_detail_waypoint_description); TextView description = getView().findViewById(R.id.marker_detail_marker_description);
ListItemUtils.setTextView(getActivity(), description, waypoint.getDescription(), hasPhoto); ListItemUtils.setTextView(getActivity(), description, marker.getDescription(), hasPhoto);
setLocation(hasPhoto); setLocation(hasPhoto);
} }
private void setName(boolean addShadow) { private void setName(boolean addShadow) {
TextView textView = getView().findViewById(R.id.marker_detail_waypoint_name); TextView textView = getView().findViewById(R.id.marker_detail_marker_name);
ListItemUtils.setTextView(getActivity(), textView, waypoint.getName(), addShadow); ListItemUtils.setTextView(getActivity(), textView, marker.getName(), addShadow);
} }
private void setLocation(boolean addShadow) { private void setLocation(boolean addShadow) {
TextView textView = getView().findViewById(R.id.marker_detail_waypoint_location); TextView textView = getView().findViewById(R.id.marker_detail_marker_location);
Location location = waypoint.getLocation(); Location location = marker.getLocation();
String value; String value;
if (location == null) { if (location == null) {
value = null; value = null;
@@ -64,8 +64,8 @@ public class FileTrackExporter implements TrackExporter {
try { try {
trackWriter.prepare(outputStream); trackWriter.prepare(outputStream);
trackWriter.writeHeader(tracks); trackWriter.writeHeader(tracks);
for (Track track1 : tracks) { for (Track track : tracks) {
writeWaypoints(track1); writeMarkers(track);
} }
boolean hasMultipleTracks = tracks.length > 1; boolean hasMultipleTracks = tracks.length > 1;
if (hasMultipleTracks) { if (hasMultipleTracks) {
@@ -89,34 +89,31 @@ public class FileTrackExporter implements TrackExporter {
} }
} }
/** private void writeMarkers(Track track) throws InterruptedException {
* Writes the waypoints.
*/
private void writeWaypoints(Track track) throws InterruptedException {
/* /*
* TODO: Stream through the waypoints in chunks. * TODO: Stream through the markers in chunks.
* I am leaving the number of waypoints very high which should not be a problem, because we don't try to load them into objects all at the same time. * I am leaving the number of markers very high which should not be a problem, because we don't try to load them into objects all at the same time.
*/ */
boolean hasWaypoints = false; boolean hasMarkers = false;
try (Cursor cursor = contentProviderUtils.getMarkerCursor(track.getId(), null, ContentProviderUtils.MAX_LOADED_MARKERS)) { try (Cursor cursor = contentProviderUtils.getMarkerCursor(track.getId(), null, ContentProviderUtils.MAX_LOADED_MARKERS)) {
if (cursor != null && cursor.moveToFirst()) { if (cursor != null && cursor.moveToFirst()) {
for (int i = 0; i < cursor.getCount(); i++) { for (int i = 0; i < cursor.getCount(); i++) {
if (Thread.interrupted()) { if (Thread.interrupted()) {
throw new InterruptedException(); throw new InterruptedException();
} }
if (!hasWaypoints) { if (!hasMarkers) {
trackWriter.writeBeginWaypoints(track); trackWriter.writeBeginMarkers(track);
hasWaypoints = true; hasMarkers = true;
} }
Marker waypoint = contentProviderUtils.createMarker(cursor); Marker marker = contentProviderUtils.createMarker(cursor);
trackWriter.writeWaypoint(waypoint); trackWriter.writeMarker(marker);
cursor.moveToNext(); cursor.moveToNext();
} }
} }
} }
if (hasWaypoints) { if (hasMarkers) {
trackWriter.writeEndWaypoints(); trackWriter.writeEndMarkers();
} }
} }
@@ -33,7 +33,7 @@ import de.dennisguse.opentracks.util.StringUtils;
* *
* @author Sandor Dornbush * @author Sandor Dornbush
*/ */
//TODO Export waypoints //TODO Export markers
public class GpxTrackWriter implements TrackWriter { public class GpxTrackWriter implements TrackWriter {
private static final NumberFormat ELEVATION_FORMAT = NumberFormat.getInstance(Locale.US); private static final NumberFormat ELEVATION_FORMAT = NumberFormat.getInstance(Locale.US);
@@ -120,27 +120,27 @@ public class GpxTrackWriter implements TrackWriter {
} }
@Override @Override
public void writeBeginWaypoints(Track track) { public void writeBeginMarkers(Track track) {
// Do nothing // Do nothing
} }
@Override @Override
public void writeEndWaypoints() { public void writeEndMarkers() {
// Do nothing // Do nothing
} }
@Override @Override
public void writeWaypoint(Marker waypoint) { public void writeMarker(Marker marker) {
if (printWriter != null) { if (printWriter != null) {
Location location = waypoint.getLocation(); Location location = marker.getLocation();
printWriter.println("<wpt " + formatLocation(location) + ">"); printWriter.println("<wpt " + formatLocation(location) + ">");
if (location.hasAltitude()) { if (location.hasAltitude()) {
printWriter.println("<ele>" + ELEVATION_FORMAT.format(location.getAltitude()) + "</ele>"); printWriter.println("<ele>" + ELEVATION_FORMAT.format(location.getAltitude()) + "</ele>");
} }
printWriter.println("<time>" + StringUtils.formatDateTimeIso8601(location.getTime()) + "</time>"); printWriter.println("<time>" + StringUtils.formatDateTimeIso8601(location.getTime()) + "</time>");
printWriter.println("<name>" + StringUtils.formatCData(waypoint.getName()) + "</name>"); printWriter.println("<name>" + StringUtils.formatCData(marker.getName()) + "</name>");
printWriter.println("<desc>" + StringUtils.formatCData(waypoint.getDescription()) + "</desc>"); printWriter.println("<desc>" + StringUtils.formatCData(marker.getDescription()) + "</desc>");
printWriter.println("<type>" + StringUtils.formatCData(waypoint.getCategory()) + "</type>"); printWriter.println("<type>" + StringUtils.formatCData(marker.getCategory()) + "</type>");
printWriter.println("</wpt>"); printWriter.println("</wpt>");
} }
} }
@@ -40,7 +40,7 @@ import de.dennisguse.opentracks.util.StringUtils;
*/ */
public class KmlTrackWriter implements TrackWriter { public class KmlTrackWriter implements TrackWriter {
public static final String WAYPOINT_STYLE = "waypoint"; public static final String MARKER_STYLE = "waypoint";
private static final String START_STYLE = "start"; private static final String START_STYLE = "start";
private static final String END_STYLE = "end"; private static final String END_STYLE = "end";
private static final String TRACK_STYLE = "track"; private static final String TRACK_STYLE = "track";
@@ -52,7 +52,7 @@ public class KmlTrackWriter implements TrackWriter {
public static final String EXTENDED_DATA_TYPE_POWER = "power"; public static final String EXTENDED_DATA_TYPE_POWER = "power";
public static final String EXTENDED_DATA_TYPE_ELEVATION_GAIN = "elevation_gain"; public static final String EXTENDED_DATA_TYPE_ELEVATION_GAIN = "elevation_gain";
private static final String WAYPOINT_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png"; private static final String MARKER_ICON = "http://maps.google.com/mapfiles/kml/pushpin/blue-pushpin.png";
private static final String START_ICON = "http://maps.google.com/mapfiles/kml/paddle/grn-circle.png"; private static final String START_ICON = "http://maps.google.com/mapfiles/kml/paddle/grn-circle.png";
private static final String END_ICON = "http://maps.google.com/mapfiles/kml/paddle/red-circle.png"; private static final String END_ICON = "http://maps.google.com/mapfiles/kml/paddle/red-circle.png";
private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png"; private static final String TRACK_ICON = "http://earth.google.com/images/kml-icons/track-directional/track-0.png";
@@ -75,7 +75,7 @@ public class KmlTrackWriter implements TrackWriter {
/** /**
* @param context the context * @param context the context
* @param exportTrackDetail should detailed information about the track be exported (e.g., title, description, waypoints, timing)? * @param exportTrackDetail should detailed information about the track be exported (e.g., title, description, markers, timing)?
* @param exportSensorData should {@link TrackPoint}'s sensor data be exported? * @param exportSensorData should {@link TrackPoint}'s sensor data be exported?
* @param exportPhotos should pictures be exported (if true: exports to KMZ)? * @param exportPhotos should pictures be exported (if true: exports to KMZ)?
*/ */
@@ -124,7 +124,7 @@ public class KmlTrackWriter implements TrackWriter {
writeTrackStyle(); writeTrackStyle();
writePlacemarkerStyle(START_STYLE, START_ICON, 32, 1); writePlacemarkerStyle(START_STYLE, START_ICON, 32, 1);
writePlacemarkerStyle(END_STYLE, END_ICON, 32, 1); writePlacemarkerStyle(END_STYLE, END_ICON, 32, 1);
writePlacemarkerStyle(WAYPOINT_STYLE, WAYPOINT_ICON, 20, 2); writePlacemarkerStyle(MARKER_STYLE, MARKER_ICON, 20, 2);
printWriter.println("<Schema id=\"" + SCHEMA_ID + "\">"); printWriter.println("<Schema id=\"" + SCHEMA_ID + "\">");
writeSimpleArrayStyle(EXTENDED_DATA_TYPE_SPEED, context.getString(R.string.description_speed_ms)); writeSimpleArrayStyle(EXTENDED_DATA_TYPE_SPEED, context.getString(R.string.description_speed_ms));
@@ -147,7 +147,7 @@ public class KmlTrackWriter implements TrackWriter {
} }
@Override @Override
public void writeBeginWaypoints(Track track) { public void writeBeginMarkers(Track track) {
if (printWriter != null) { if (printWriter != null) {
printWriter.println("<Folder>"); printWriter.println("<Folder>");
if (exportTrackDetail) { if (exportTrackDetail) {
@@ -158,21 +158,21 @@ public class KmlTrackWriter implements TrackWriter {
} }
@Override @Override
public void writeEndWaypoints() { public void writeEndMarkers() {
if (printWriter != null) { if (printWriter != null) {
printWriter.println("</Folder>"); printWriter.println("</Folder>");
} }
} }
@Override @Override
public void writeWaypoint(Marker waypoint) { public void writeMarker(Marker marker) {
if (printWriter != null && exportTrackDetail) { if (printWriter != null && exportTrackDetail) {
boolean existsPhoto = FileUtils.getPhotoFileIfExists(context, waypoint.getTrackId(), waypoint.getPhotoURI()) != null; boolean existsPhoto = FileUtils.getPhotoFileIfExists(context, marker.getTrackId(), marker.getPhotoURI()) != null;
if (waypoint.hasPhoto() && exportPhotos && existsPhoto) { if (marker.hasPhoto() && exportPhotos && existsPhoto) {
float heading = getHeading(waypoint.getTrackId(), waypoint.getLocation()); float heading = getHeading(marker.getTrackId(), marker.getLocation());
writePhotoOverlay(waypoint, heading); writePhotoOverlay(marker, heading);
} else { } else {
writePlacemark(waypoint.getName(), waypoint.getCategory(), waypoint.getDescription(), WAYPOINT_STYLE, waypoint.getLocation()); writePlacemark(marker.getName(), marker.getCategory(), marker.getDescription(), MARKER_STYLE, marker.getLocation());
} }
} }
} }
@@ -337,30 +337,24 @@ public class KmlTrackWriter implements TrackWriter {
} }
} }
/** private void writePhotoOverlay(Marker marker, float heading) {
* Writes a photo overlay from waypoint.
*
* @param waypoint Waypoint object.
* @param heading the heading.
*/
private void writePhotoOverlay(Marker waypoint, float heading) {
if (exportTrackDetail) { if (exportTrackDetail) {
printWriter.println("<PhotoOverlay>"); printWriter.println("<PhotoOverlay>");
printWriter.println("<name>" + StringUtils.formatCData(waypoint.getName()) + "</name>"); printWriter.println("<name>" + StringUtils.formatCData(marker.getName()) + "</name>");
printWriter.println("<description>" + StringUtils.formatCData(waypoint.getDescription()) + "</description>"); printWriter.println("<description>" + StringUtils.formatCData(marker.getDescription()) + "</description>");
printWriter.print("<Camera>"); printWriter.print("<Camera>");
printWriter.print("<longitude>" + waypoint.getLocation().getLongitude() + "</longitude>"); printWriter.print("<longitude>" + marker.getLocation().getLongitude() + "</longitude>");
printWriter.print("<latitude>" + waypoint.getLocation().getLatitude() + "</latitude>"); printWriter.print("<latitude>" + marker.getLocation().getLatitude() + "</latitude>");
printWriter.print("<altitude>20</altitude>"); printWriter.print("<altitude>20</altitude>");
printWriter.print("<heading>" + heading + "</heading>"); printWriter.print("<heading>" + heading + "</heading>");
printWriter.print("<tilt>90</tilt>"); printWriter.print("<tilt>90</tilt>");
printWriter.println("</Camera>"); printWriter.println("</Camera>");
printWriter.println("<TimeStamp><when>" + getTime(waypoint.getLocation()) + "</when></TimeStamp>"); printWriter.println("<TimeStamp><when>" + getTime(marker.getLocation()) + "</when></TimeStamp>");
printWriter.println("<styleUrl>#" + KmlTrackWriter.WAYPOINT_STYLE + "</styleUrl>"); printWriter.println("<styleUrl>#" + KmlTrackWriter.MARKER_STYLE + "</styleUrl>");
writeCategory(waypoint.getCategory()); writeCategory(marker.getCategory());
if (exportPhotos) { if (exportPhotos) {
printWriter.println("<Icon><href>" + KmzTrackExporter.buildKmzImageFilePath(waypoint) + "</href></Icon>"); printWriter.println("<Icon><href>" + KmzTrackExporter.buildKmzImageFilePath(marker) + "</href></Icon>");
} }
printWriter.print("<ViewVolume>"); printWriter.print("<ViewVolume>");
@@ -371,7 +365,7 @@ public class KmlTrackWriter implements TrackWriter {
printWriter.print("<topFov>45</topFov>"); printWriter.print("<topFov>45</topFov>");
printWriter.println("</ViewVolume>"); printWriter.println("</ViewVolume>");
printWriter.println("<Point>"); printWriter.println("<Point>");
printWriter.println("<coordinates>" + getCoordinates(waypoint.getLocation(), ",") + "</coordinates>"); printWriter.println("<coordinates>" + getCoordinates(marker.getLocation(), ",") + "</coordinates>");
printWriter.println("</Point>"); printWriter.println("</Point>");
printWriter.println("</PhotoOverlay>"); printWriter.println("</PhotoOverlay>");
} }
@@ -105,12 +105,12 @@ public class KmzTrackExporter implements TrackExporter {
if (Thread.interrupted()) { if (Thread.interrupted()) {
throw new InterruptedException(); throw new InterruptedException();
} }
Marker waypoint = contentProviderUtils.createMarker(cursor); Marker marker = contentProviderUtils.createMarker(cursor);
if (waypoint.hasPhoto()) { if (marker.hasPhoto()) {
Uri uriPhoto = waypoint.getPhotoURI(); Uri uriPhoto = marker.getPhotoURI();
boolean existsPhoto = FileUtils.getPhotoFileIfExists(context, track.getId(), uriPhoto) != null; boolean existsPhoto = FileUtils.getPhotoFileIfExists(context, track.getId(), uriPhoto) != null;
if (existsPhoto) { if (existsPhoto) {
addImage(context, zipOutputStream, uriPhoto, waypoint); addImage(context, zipOutputStream, uriPhoto, marker);
} }
} }
@@ -121,9 +121,9 @@ public class KmzTrackExporter implements TrackExporter {
} }
} }
private void addImage(Context context, ZipOutputStream zipOutputStream, Uri uri, Marker waypoint) throws IOException { private void addImage(Context context, ZipOutputStream zipOutputStream, Uri uri, Marker marker) throws IOException {
try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) { try (InputStream inputStream = context.getContentResolver().openInputStream(uri)) {
ZipEntry zipEntry = new ZipEntry(buildKmzImageFilePath(waypoint)); ZipEntry zipEntry = new ZipEntry(buildKmzImageFilePath(marker));
zipOutputStream.putNextEntry(zipEntry); zipOutputStream.putNextEntry(zipEntry);
if (inputStream == null) throw new FileNotFoundException(); if (inputStream == null) throw new FileNotFoundException();
@@ -146,13 +146,11 @@ public class KmzTrackExporter implements TrackExporter {
} }
/** /**
* Builds and returns the path for the image that will be saved inside KMZ_IMAGES_DIR for the waypoint. * Builds and returns the path for the image that will be saved inside KMZ_IMAGES_DIR for the marker.
*
* @param waypoint Waypoint object.
*/ */
public static String buildKmzImageFilePath(Marker waypoint) { public static String buildKmzImageFilePath(Marker marker) {
String ext = FileUtils.getExtension(waypoint.getPhotoUrl()); String ext = FileUtils.getExtension(marker.getPhotoUrl());
ext = ext == null ? "" : "." + ext; ext = ext == null ? "" : "." + ext;
return KMZ_IMAGES_DIR + File.separatorChar + FileUtils.sanitizeFileName(waypoint.getId().getId() + ext); return KMZ_IMAGES_DIR + File.separatorChar + FileUtils.sanitizeFileName(marker.getId().getId() + ext);
} }
} }
@@ -28,10 +28,10 @@ import de.dennisguse.opentracks.content.data.TrackPoint;
* {@link #prepare(OutputStream)} * {@link #prepare(OutputStream)}
* {@link #writeHeader(Track[])} * {@link #writeHeader(Track[])}
* For each track: * For each track:
* {@link #writeBeginWaypoints(Track)} * {@link #writeBeginMarkers(Track)}
* For each waypoint: * For each marker:
* {@link #writeWaypoint(Marker)} * {@link #writeMarker(Marker)}
* {@link #writeEndWaypoints()} * {@link #writeEndMarkers()}
* {@link #writeMultiTrackBegin()} * {@link #writeMultiTrackBegin()}
* For each track: * For each track:
* {@link #writeBeginTrack(Track, TrackPoint)} * {@link #writeBeginTrack(Track, TrackPoint)}
@@ -50,11 +50,6 @@ import de.dennisguse.opentracks.content.data.TrackPoint;
*/ */
public interface TrackWriter { public interface TrackWriter {
/**
* Prepares the output stream.
*
* @param outputStream the output stream
*/
void prepare(OutputStream outputStream); void prepare(OutputStream outputStream);
/** /**
@@ -62,77 +57,27 @@ public interface TrackWriter {
*/ */
void close(); void close();
/**
* Writes the header
*
* @param tracks the tracks
*/
void writeHeader(Track[] tracks); void writeHeader(Track[] tracks);
/**
* Writes the footer.
*/
void writeFooter(); void writeFooter();
/** void writeBeginMarkers(Track track);
* Writes the beginning of the waypoints.
*
* @param track the track
*/
void writeBeginWaypoints(Track track);
/** void writeEndMarkers();
* Writes the end of the waypoints.
*/
void writeEndWaypoints();
/** void writeMarker(Marker marker);
* Writes a waypoint.
*
* @param waypoint the waypoint
*/
void writeWaypoint(Marker waypoint);
/**
* Writes the beginning of the tracks.
*/
void writeMultiTrackBegin(); void writeMultiTrackBegin();
/**
* Writes the end of the tracks,
*/
void writeMultiTrackEnd(); void writeMultiTrackEnd();
/**
* Writes the beginning of a track.
*
* @param track the track
* @param startTrackPoint the start location
*/
void writeBeginTrack(Track track, TrackPoint startTrackPoint); void writeBeginTrack(Track track, TrackPoint startTrackPoint);
/**
* Writes the end of a track.
*
* @param track the track
* @param endTrackPoint the end location
*/
void writeEndTrack(Track track, TrackPoint endTrackPoint); void writeEndTrack(Track track, TrackPoint endTrackPoint);
/**
* Writes open segment.
*/
void writeOpenSegment(); void writeOpenSegment();
/**
* Writes close segment.
*/
void writeCloseSegment(); void writeCloseSegment();
/**
* Writes a trackPoint.
*
* @param trackPoint the trackPoint
*/
void writeTrackPoint(TrackPoint trackPoint); void writeTrackPoint(TrackPoint trackPoint);
} }
@@ -70,7 +70,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
private Track.Id importTrackId; private Track.Id importTrackId;
private final List<Track.Id> trackIds = new ArrayList<>(); private final List<Track.Id> trackIds = new ArrayList<>();
private final List<Marker> waypoints = new ArrayList<>(); private final List<Marker> markers = new ArrayList<>();
// The current element content // The current element content
//TODO Should be made private and getter be used by child classes. //TODO Should be made private and getter be used by child classes.
@@ -88,7 +88,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
protected String heartrate; protected String heartrate;
protected String cadence; protected String cadence;
protected String power; protected String power;
protected String waypointType; protected String markerType;
protected String photoUrl; protected String photoUrl;
protected String uuid; protected String uuid;
@@ -148,7 +148,7 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
* On file end. * On file end.
*/ */
protected void onFileEnd() { protected void onFileEnd() {
// Add waypoints to the last imported track // Add markers to the last imported track
int size = trackIds.size(); int size = trackIds.size();
if (size == 0) { if (size == 0) {
return; return;
@@ -159,8 +159,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
return; return;
} }
int waypointPosition = -1; int markerPosition = -1;
Marker waypoint = null; Marker marker = null;
TrackPoint trackPoint = null; TrackPoint trackPoint = null;
TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics().getStartTime_ms()); TrackStatisticsUpdater trackStatisticsUpdater = new TrackStatisticsUpdater(track.getTrackStatistics().getStartTime_ms());
// TODO Should not be necessary anymore? // TODO Should not be necessary anymore?
@@ -169,18 +169,18 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false)) { try (TrackPointIterator trackPointIterator = contentProviderUtils.getTrackPointLocationIterator(track.getId(), -1L, false)) {
while (true) { while (true) {
if (waypoint == null) { if (marker == null) {
waypointPosition++; markerPosition++;
waypoint = waypointPosition < waypoints.size() ? waypoints.get(waypointPosition) : null; marker = markerPosition < markers.size() ? markers.get(markerPosition) : null;
if (waypoint == null) { if (marker == null) {
// No more waypoints // No more markers
return; return;
} }
} }
if (trackPoint == null) { if (trackPoint == null) {
if (!trackPointIterator.hasNext()) { if (!trackPointIterator.hasNext()) {
// No more track points. Ignore the rest of the waypoints. // No more track points. Ignore the rest of the markers.
return; return;
} }
trackPoint = trackPointIterator.next(); trackPoint = trackPointIterator.next();
@@ -188,13 +188,13 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
markerTrackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval); markerTrackStatisticsUpdater.addTrackPoint(trackPoint, recordingDistanceInterval);
} }
if (waypoint.getLocation().getTime() > trackPoint.getTime()) { if (marker.getLocation().getTime() > trackPoint.getTime()) {
trackPoint = null; trackPoint = null;
} else if (waypoint.getLocation().getTime() < trackPoint.getTime()) { } else if (marker.getLocation().getTime() < trackPoint.getTime()) {
Log.w(TAG, "Ignoring waypoint: current trackPoint was after waypoint."); Log.w(TAG, "Ignoring marker: current trackPoint was after marker.");
waypoint = null; marker = null;
} else { } else {
// The waypoint trackPoint time matches the track point time // The marker trackPoint time matches the track point time
if (!LocationUtils.isValidLocation(trackPoint.getLocation())) { if (!LocationUtils.isValidLocation(trackPoint.getLocation())) {
// Invalid trackPoint, load the next trackPoint // Invalid trackPoint, load the next trackPoint
trackPoint = null; trackPoint = null;
@@ -202,19 +202,19 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
} }
// Valid trackPoint // Valid trackPoint
if (trackPoint.getLatitude() == waypoint.getLocation().getLatitude() && trackPoint.getLongitude() == waypoint.getLocation().getLongitude()) { if (trackPoint.getLatitude() == marker.getLocation().getLatitude() && trackPoint.getLongitude() == marker.getLocation().getLongitude()) {
String waypointDescription = waypoint.getDescription(); String markerDescription = marker.getDescription();
String icon = context.getString(R.string.marker_waypoint_icon_url); String icon = context.getString(R.string.marker_icon_url);
double length = trackStatisticsUpdater.getTrackStatistics().getTotalDistance(); double length = trackStatisticsUpdater.getTrackStatistics().getTotalDistance();
long duration = trackStatisticsUpdater.getTrackStatistics().getTotalTime(); long duration = trackStatisticsUpdater.getTrackStatistics().getTotalTime();
// Insert waypoint // Insert marker
Marker newWaypoint = new Marker(waypoint.getName(), waypointDescription, waypoint.getCategory(), icon, track.getId(), length, duration, trackPoint.getLocation(), waypoint.getPhotoUrl()); Marker newMarker = new Marker(marker.getName(), markerDescription, marker.getCategory(), icon, track.getId(), length, duration, trackPoint.getLocation(), marker.getPhotoUrl());
contentProviderUtils.insertMarker(newWaypoint); contentProviderUtils.insertMarker(newMarker);
} }
// Load the next waypoint // Load the next marker
waypoint = null; marker = null;
} }
} }
} }
@@ -300,11 +300,8 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
trackData.lastLocationInCurrentSegment = null; trackData.lastLocationInCurrentSegment = null;
} }
/** protected void addMarker() throws SAXException {
* Adds a waypoint. // Markers must have a time, else cannot match to the track points
*/
protected void addWaypoint() throws SAXException {
// Waypoint must have a time, else cannot match to the track points
if (time == null) { if (time == null) {
return; return;
} }
@@ -314,22 +311,22 @@ abstract class AbstractFileTrackImporter extends DefaultHandler implements Track
if (!LocationUtils.isValidLocation(trackPoint.getLocation())) { if (!LocationUtils.isValidLocation(trackPoint.getLocation())) {
throw new SAXException(createErrorMessage("Invalid location detected: " + trackPoint)); throw new SAXException(createErrorMessage("Invalid location detected: " + trackPoint));
} }
Marker waypoint = new Marker(trackPoint.getLocation()); Marker marker = new Marker(trackPoint.getLocation());
if (name != null) { if (name != null) {
waypoint.setName(name); marker.setName(name);
} }
if (description != null) { if (description != null) {
waypoint.setDescription(description); marker.setDescription(description);
} }
if (category != null) { if (category != null) {
waypoint.setCategory(category); marker.setCategory(category);
} }
if (photoUrl != null) { if (photoUrl != null) {
waypoint.setPhotoUrl(photoUrl); marker.setPhotoUrl(photoUrl);
} }
waypoints.add(waypoint); markers.add(marker);
} }
/** /**
@@ -44,7 +44,7 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
private static final String TAG_TRACK_POINT = "trkpt"; private static final String TAG_TRACK_POINT = "trkpt";
private static final String TAG_TRACK_SEGMENT = "trkseg"; private static final String TAG_TRACK_SEGMENT = "trkseg";
private static final String TAG_TYPE = "type"; private static final String TAG_TYPE = "type";
private static final String TAG_WAYPOINT = "wpt"; private static final String TAG_MARKER = "wpt";
private static final String TAG_ID = "opentracks:trackid"; private static final String TAG_ID = "opentracks:trackid";
private static final String ATTRIBUTE_LAT = "lat"; private static final String ATTRIBUTE_LAT = "lat";
@@ -71,8 +71,8 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
@Override @Override
public void startElement(String uri, String localName, String tag, Attributes attributes) throws SAXException { public void startElement(String uri, String localName, String tag, Attributes attributes) throws SAXException {
switch (tag) { switch (tag) {
case TAG_WAYPOINT: case TAG_MARKER:
onWaypointStart(attributes); onMarkerStart(attributes);
break; break;
case TAG_TRACK: case TAG_TRACK:
onTrackStart(); onTrackStart();
@@ -92,8 +92,8 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
case TAG_GPX: case TAG_GPX:
onFileEnd(); onFileEnd();
break; break;
case TAG_WAYPOINT: case TAG_MARKER:
onWaypointEnd(); onMarkerEnd();
break; break;
case TAG_TRACK: case TAG_TRACK:
onTrackEnd(); onTrackEnd();
@@ -128,7 +128,7 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
break; break;
case TAG_COMMENT: case TAG_COMMENT:
if (content != null) { if (content != null) {
waypointType = content.trim(); markerType = content.trim();
} }
break; break;
case TAG_EXTENSION_SPEED: case TAG_EXTENSION_SPEED:
@@ -187,12 +187,7 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
insertTrackPoint(trackPoint); insertTrackPoint(trackPoint);
} }
/** private void onMarkerStart(Attributes attributes) {
* On waypoint start.
*
* @param attributes the attributes
*/
private void onWaypointStart(Attributes attributes) {
name = null; name = null;
description = null; description = null;
category = null; category = null;
@@ -201,13 +196,10 @@ public class GpxFileTrackImporter extends AbstractFileTrackImporter {
longitude = attributes.getValue(ATTRIBUTE_LON); longitude = attributes.getValue(ATTRIBUTE_LON);
altitude = null; altitude = null;
time = null; time = null;
waypointType = null; markerType = null;
} }
/** private void onMarkerEnd() throws SAXException {
* On waypoint end. addMarker();
*/
private void onWaypointEnd() throws SAXException {
addWaypoint();
} }
} }
@@ -39,7 +39,7 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
private static final String TAG = KmlFileTrackImporter.class.getSimpleName(); private static final String TAG = KmlFileTrackImporter.class.getSimpleName();
private static final String WAYPOINT_STYLE = "#" + KmlTrackWriter.WAYPOINT_STYLE; private static final String MARKER_STYLE = "#" + KmlTrackWriter.MARKER_STYLE;
private static final String TAG_COORDINATES = "coordinates"; private static final String TAG_COORDINATES = "coordinates";
private static final String TAG_DESCRIPTION = "description"; private static final String TAG_DESCRIPTION = "description";
@@ -84,8 +84,8 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
switch (tag) { switch (tag) {
case TAG_PLACEMARK: case TAG_PLACEMARK:
case TAG_PHOTO_OVERLAY: case TAG_PHOTO_OVERLAY:
// Note that a track is contained in a Placemark, calling onWaypointStart will clear various track variables like name, category, and description. // Note that a track is contained in a Placemark, calling onMarkerStart will clear various track variables like name, category, and description.
onWaypointStart(); onMarkerStart();
break; break;
case TAG_GX_MULTI_TRACK: case TAG_GX_MULTI_TRACK:
trackStarted = true; trackStarted = true;
@@ -111,11 +111,11 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
break; break;
case TAG_PLACEMARK: case TAG_PLACEMARK:
case TAG_PHOTO_OVERLAY: case TAG_PHOTO_OVERLAY:
// Note that a track is contained in a Placemark, calling onWaypointend is save since waypointType is not set for a track. // Note that a track is contained in a Placemark, calling onMarkerEnd is save since markerType is not set for a track.
onWaypointEnd(); onMarkerEnd();
break; break;
case TAG_COORDINATES: case TAG_COORDINATES:
onWaypointLocationEnd(); onMarkerLocationEnd();
break; break;
case TAG_GX_MULTI_TRACK: case TAG_GX_MULTI_TRACK:
onTrackEnd(); onTrackEnd();
@@ -161,7 +161,7 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
break; break;
case TAG_STYLE_URL: case TAG_STYLE_URL:
if (content != null) { if (content != null) {
waypointType = content.trim(); markerType = content.trim();
} }
break; break;
case TAG_HREF: case TAG_HREF:
@@ -175,10 +175,7 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
content = null; content = null;
} }
/** private void onMarkerStart() {
* On waypoint start.
*/
private void onWaypointStart() {
// Reset all Placemark variables // Reset all Placemark variables
name = null; name = null;
icon = null; icon = null;
@@ -189,27 +186,21 @@ public class KmlFileTrackImporter extends AbstractFileTrackImporter {
longitude = null; longitude = null;
altitude = null; altitude = null;
time = null; time = null;
waypointType = null; markerType = null;
} }
/** private void onMarkerEnd() throws SAXException {
* On waypoint end. if (!MARKER_STYLE.equals(markerType)) {
*/
private void onWaypointEnd() throws SAXException {
if (!WAYPOINT_STYLE.equals(waypointType)) {
return; return;
} }
// If there is photoUrl it has to be changed because that url in kml file is a relative path to the internal kmz file. // If there is photoUrl it has to be changed because that url in kml file is a relative path to the internal kmz file.
photoUrl = getInternalPhotoUrl(photoUrl); photoUrl = getInternalPhotoUrl(photoUrl);
addWaypoint(); addMarker();
} }
/** private void onMarkerLocationEnd() {
* On waypoint location end.
*/
private void onWaypointLocationEnd() {
if (content != null) { if (content != null) {
String[] parts = content.trim().split(","); String[] parts = content.trim().split(",");
if (parts.length != 2 && parts.length != 3) { if (parts.length != 2 && parts.length != 3) {
@@ -191,20 +191,20 @@ public class KmzTrackImporter implements TrackImporter {
} }
/** /**
* Deletes all images that remained in external storage that doesn't have waypoint (marker) associated. * Deletes all images that remained in external storage that doesn't have a marker associated.
* *
* @param context the Context object. * @param context the Context object.
* @param trackId the id of the Track. * @param trackId the id of the Track.
*/ */
private void deleteOrphanImages(Context context, Track.Id trackId) { private void deleteOrphanImages(Context context, Track.Id trackId) {
if (!trackId.isValid()) { if (!trackId.isValid()) {
// 1.- Gets all photo names in the waypoints of the track identified by id. // 1.- Gets all photo names in the markers of the track identified by id.
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context); ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
List<Marker> waypoints = contentProviderUtils.getMarkers(trackId); List<Marker> markers = contentProviderUtils.getMarkers(trackId);
List<String> photosName = new ArrayList<>(); List<String> photosName = new ArrayList<>();
for (Marker w : waypoints) { for (Marker marker : markers) {
if (w.hasPhoto()) { if (marker.hasPhoto()) {
String photoUrl = Uri.decode(w.getPhotoUrl()); String photoUrl = Uri.decode(marker.getPhotoUrl());
photosName.add(photoUrl.substring(photoUrl.lastIndexOf(File.separatorChar) + 1)); photosName.add(photoUrl.substring(photoUrl.lastIndexOf(File.separatorChar) + 1));
} }
} }
@@ -254,7 +254,7 @@ public class TrackRecordingService extends Service implements HandlerServer.Hand
category = category != null ? category : ""; category = category != null ? category : "";
description = description != null ? description : ""; description = description != null ? description : "";
String icon = getString(R.string.marker_waypoint_icon_url); String icon = getString(R.string.marker_icon_url);
photoUrl = photoUrl != null ? photoUrl : ""; photoUrl = photoUrl != null ? photoUrl : "";
TrackStatistics stats = trackStatisticsUpdater.getTrackStatistics(); TrackStatistics stats = trackStatisticsUpdater.getTrackStatistics();
@@ -34,7 +34,7 @@ public class IntentDashboardUtils {
private static final int TRACK_URI_INDEX = 0; private static final int TRACK_URI_INDEX = 0;
private static final int TRACKPOINTS_URI_INDEX = 1; private static final int TRACKPOINTS_URI_INDEX = 1;
private static final int WAYPOINTS_URI_INDEX = 2; private static final int MARKERS_URI_INDEX = 2;
private IntentDashboardUtils() { private IntentDashboardUtils() {
} }
@@ -55,7 +55,7 @@ public class IntentDashboardUtils {
ArrayList<Uri> uris = new ArrayList<>(); ArrayList<Uri> uris = new ArrayList<>();
uris.add(TRACK_URI_INDEX, Uri.withAppendedPath(TracksColumns.CONTENT_URI, trackIdList)); uris.add(TRACK_URI_INDEX, Uri.withAppendedPath(TracksColumns.CONTENT_URI, trackIdList));
uris.add(TRACKPOINTS_URI_INDEX, Uri.withAppendedPath(TrackPointsColumns.CONTENT_URI_BY_TRACKID, trackIdList)); uris.add(TRACKPOINTS_URI_INDEX, Uri.withAppendedPath(TrackPointsColumns.CONTENT_URI_BY_TRACKID, trackIdList));
uris.add(WAYPOINTS_URI_INDEX, Uri.withAppendedPath(MarkerColumns.CONTENT_URI_BY_TRACKID, trackIdList)); uris.add(MARKERS_URI_INDEX, Uri.withAppendedPath(MarkerColumns.CONTENT_URI_BY_TRACKID, trackIdList));
Intent intent = new Intent(ACTION_DASHBOARD); Intent intent = new Intent(ACTION_DASHBOARD);
intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris); intent.putParcelableArrayListExtra(ACTION_DASHBOARD_PAYLOAD, uris);
@@ -70,7 +70,7 @@ public class IntentDashboardUtils {
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION); intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
ClipData clipData = ClipData.newRawUri(null, uris.get(TRACK_URI_INDEX)); ClipData clipData = ClipData.newRawUri(null, uris.get(TRACK_URI_INDEX));
clipData.addItem(new ClipData.Item(uris.get(TRACKPOINTS_URI_INDEX))); clipData.addItem(new ClipData.Item(uris.get(TRACKPOINTS_URI_INDEX)));
clipData.addItem(new ClipData.Item(uris.get(WAYPOINTS_URI_INDEX))); clipData.addItem(new ClipData.Item(uris.get(MARKERS_URI_INDEX)));
intent.setClipData(clipData); intent.setClipData(clipData);
context.startActivity(intent); context.startActivity(intent);
@@ -105,7 +105,7 @@ public class IntentUtils {
} }
/** /**
* Creates an intent to share a waypoint image with an app. * Creates an intent to share an image with an app.
* *
* @param context the context. * @param context the context.
* @param uri uri with the image to share. * @param uri uri with the image to share.
@@ -128,8 +128,8 @@ public class IntentUtils {
.putExtra(Intent.EXTRA_TEXT, context.getString(R.string.share_image_body)); .putExtra(Intent.EXTRA_TEXT, context.getString(R.string.share_image_body));
} }
public static void showCoordinateOnMap(Context context, Marker waypoint) { public static void showCoordinateOnMap(Context context, Marker marker) {
showCoordinateOnMap(context, waypoint.getLocation().getLatitude(), waypoint.getLocation().getLongitude(), waypoint.getName()); showCoordinateOnMap(context, marker.getLocation().getLatitude(), marker.getLocation().getLongitude(), marker.getName());
} }
/** /**
@@ -18,7 +18,7 @@ limitations under the License.
android:layout_height="match_parent"> android:layout_height="match_parent">
<ImageView <ImageView
android:id="@+id/marker_detail_waypoint_photo" android:id="@+id/marker_detail_marker_photo"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:contentDescription="@string/image_photo_marker" android:contentDescription="@string/image_photo_marker"
@@ -29,7 +29,7 @@ limitations under the License.
android:layout_height="wrap_content"> android:layout_height="wrap_content">
<!-- A gradient on top of the text --> <!-- A gradient on top of the text -->
<ImageView <ImageView
android:id="@+id/marker_detail_waypoint_text_gradient" android:id="@+id/marker_detail_marker_text_gradient"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:alpha=".6" android:alpha=".6"
@@ -37,7 +37,7 @@ limitations under the License.
android:src="@drawable/text_gradient" /> android:src="@drawable/text_gradient" />
<LinearLayout <LinearLayout
android:id="@+id/marker_detail_waypoint_info" android:id="@+id/marker_detail_marker_info"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_marginBottom="80dp" android:layout_marginBottom="80dp"
@@ -45,20 +45,20 @@ limitations under the License.
android:padding="8dp"> android:padding="8dp">
<TextView <TextView
android:id="@+id/marker_detail_waypoint_name" android:id="@+id/marker_detail_marker_name"
style="@style/TextMedium" style="@style/TextMedium"
android:paddingTop="8dp" /> android:paddingTop="8dp" />
<TextView <TextView
android:id="@+id/marker_detail_waypoint_category" android:id="@+id/marker_detail_marker_category"
style="@style/TextSmall" /> style="@style/TextSmall" />
<TextView <TextView
android:id="@+id/marker_detail_waypoint_description" android:id="@+id/marker_detail_marker_description"
style="@style/TextSmall" /> style="@style/TextSmall" />
<TextView <TextView
android:id="@+id/marker_detail_waypoint_location" android:id="@+id/marker_detail_marker_location"
style="@style/TextSmall" /> style="@style/TextSmall" />
</LinearLayout> </LinearLayout>
</FrameLayout> </FrameLayout>
+5 -5
View File
@@ -37,7 +37,7 @@ limitations under the License.
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:drawableStart="@drawable/ic_marker_orange_pushpin_with_shadow" android:drawableStart="@drawable/ic_marker_orange_pushpin_with_shadow"
android:id="@+id/marker_edit_waypoint_name" android:id="@+id/marker_edit_name"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
@@ -49,7 +49,7 @@ limitations under the License.
android:importantForAutofill="no"> android:importantForAutofill="no">
<AutoCompleteTextView <AutoCompleteTextView
android:id="@+id/marker_edit_waypoint_marker_type" android:id="@+id/marker_edit_marker_type"
style="@style/EditCategory" style="@style/EditCategory"
android:layout_width="match_parent" android:layout_width="match_parent"
android:hint="@string/marker_edit_marker_type" android:hint="@string/marker_edit_marker_type"
@@ -64,7 +64,7 @@ limitations under the License.
android:importantForAutofill="no"> android:importantForAutofill="no">
<com.google.android.material.textfield.TextInputEditText <com.google.android.material.textfield.TextInputEditText
android:id="@+id/marker_edit_waypoint_description" android:id="@+id/marker_edit_description"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="wrap_content" /> android:layout_height="wrap_content" />
</com.google.android.material.textfield.TextInputLayout> </com.google.android.material.textfield.TextInputLayout>
@@ -75,7 +75,7 @@ limitations under the License.
android:layout_marginTop="16dp"> android:layout_marginTop="16dp">
<ImageView <ImageView
android:id="@+id/marker_edit_waypoint_photo" android:id="@+id/marker_edit_photo"
android:layout_width="wrap_content" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_height="wrap_content"
android:layout_alignParentStart="true" android:layout_alignParentStart="true"
@@ -87,7 +87,7 @@ limitations under the License.
android:scaleType="fitStart" /> android:scaleType="fitStart" />
<ImageView <ImageView
android:id="@+id/marker_edit_waypoint_photo_delete" android:id="@+id/marker_edit_photo_delete"
android:layout_width="32dp" android:layout_width="32dp"
android:layout_height="32dp" android:layout_height="32dp"
android:layout_alignParentTop="true" android:layout_alignParentTop="true"
+2 -2
View File
@@ -22,14 +22,14 @@ limitations under the License.
<a href="https://github.com/material-components/material-components-android">Material Components for Android</a> (Apache License, Version 2.0) <a href="https://github.com/material-components/material-components-android">Material Components for Android</a> (Apache License, Version 2.0)
</string> </string>
<string name="marker_waypoint_icon_url" translatable="false">http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png</string> <string name="marker_icon_url" translatable="false">http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png</string>
<string name="sensor_unit_beats_per_minute" translatable="false">BPM</string> <string name="sensor_unit_beats_per_minute" translatable="false">BPM</string>
<string name="sensor_unit_rounds_per_minute" translatable="false">RPM</string> <string name="sensor_unit_rounds_per_minute" translatable="false">RPM</string>
<string name="value_unknown" translatable="false">-</string> <string name="value_unknown" translatable="false">-</string>
<string-array name="waypoint_types"> <string-array name="marker_types">
<item>@string/waypoint_type_atm</item> <item>@string/waypoint_type_atm</item>
<item>@string/waypoint_type_bank</item> <item>@string/waypoint_type_bank</item>
<item>@string/waypoint_type_bar</item> <item>@string/waypoint_type_bar</item>