mirror of
https://codeberg.org/OpenTracksApp/OpenTracks.git
synced 2026-10-17 08:13:05 +02:00
+1
-1
@@ -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);
|
||||||
|
|||||||
+1
-1
@@ -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)
|
||||||
|
|||||||
+20
-31
@@ -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);
|
||||||
}
|
}
|
||||||
+32
-35
@@ -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>
|
||||||
|
|||||||
@@ -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"
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user