diff --git a/MyTracks/res/layout/marker_detail_activity.xml b/MyTracks/res/layout/marker_detail_activity.xml
new file mode 100644
index 000000000..44682aa50
--- /dev/null
+++ b/MyTracks/res/layout/marker_detail_activity.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
\ No newline at end of file
diff --git a/MyTracks/res/layout/marker_detail.xml b/MyTracks/res/layout/marker_detail_fragment.xml
similarity index 87%
rename from MyTracks/res/layout/marker_detail.xml
rename to MyTracks/res/layout/marker_detail_fragment.xml
index 92e61422f..573233b74 100644
--- a/MyTracks/res/layout/marker_detail.xml
+++ b/MyTracks/res/layout/marker_detail_fragment.xml
@@ -21,32 +21,34 @@ limitations under the License.
android:layout_width="match_parent"
android:orientation="vertical"
android:padding="8dp" >
-
+
+
-
+
diff --git a/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java b/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java
index d1edb1967..ea9f009b9 100644
--- a/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java
+++ b/MyTracks/src/com/google/android/apps/mytracks/MarkerDetailActivity.java
@@ -17,27 +17,22 @@
package com.google.android.apps.mytracks;
import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
-import com.google.android.apps.mytracks.content.Track;
import com.google.android.apps.mytracks.content.Waypoint;
-import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
-import com.google.android.apps.mytracks.fragments.DeleteMarkerDialogFragment;
import com.google.android.apps.mytracks.fragments.DeleteMarkerDialogFragment.DeleteMarkerCaller;
+import com.google.android.apps.mytracks.fragments.MarkerDetailFragment;
import com.google.android.apps.mytracks.util.IntentUtils;
-import com.google.android.apps.mytracks.util.PhotoUtils;
-import com.google.android.apps.mytracks.util.StatsUtils;
import com.google.android.maps.mytracks.R;
import android.content.Intent;
-import android.graphics.Bitmap;
-import android.net.Uri;
+import android.database.Cursor;
import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentManager;
+import android.support.v4.app.FragmentStatePagerAdapter;
+import android.support.v4.view.ViewPager;
import android.util.Log;
-import android.view.Display;
-import android.view.Menu;
-import android.view.MenuItem;
-import android.view.View;
-import android.widget.ImageView;
-import android.widget.TextView;
+
+import java.util.ArrayList;
/**
* An activity to display marker detail info.
@@ -49,105 +44,59 @@ public class MarkerDetailActivity extends AbstractMyTracksActivity implements De
public static final String EXTRA_MARKER_ID = "marker_id";
private static final String TAG = MarkerDetailActivity.class.getSimpleName();
- private MyTracksProviderUtils myTracksProviderUtils;
- private long markerId;
private Waypoint waypoint;
-
- private TextView name;
- private View waypointSection;
- private View statisticsSection;
- private Bitmap bitmap;
+ private ArrayList markerIds;
@Override
protected void onCreate(Bundle bundle) {
super.onCreate(bundle);
- myTracksProviderUtils = MyTracksProviderUtils.Factory.get(this);
- markerId = getIntent().getLongExtra(EXTRA_MARKER_ID, -1L);
+ long markerId = getIntent().getLongExtra(EXTRA_MARKER_ID, -1L);
if (markerId == -1L) {
Log.d(TAG, "invalid marker id");
finish();
return;
}
- // Set waypoint, needed in onCreateOptionsMenu
+ MyTracksProviderUtils myTracksProviderUtils = MyTracksProviderUtils.Factory.get(this);
waypoint = myTracksProviderUtils.getWaypoint(markerId);
- if (waypoint == null) {
- Log.d(TAG, "waypoint is null");
- finish();
- return;
+
+ markerIds = new ArrayList();
+ int markerIndex = -1;
+ Cursor cursor = null;
+
+ try {
+ cursor = myTracksProviderUtils.getWaypointCursor(waypoint.getTrackId(), -1L, -1);
+ if (cursor != null && cursor.moveToFirst()) {
+ /*
+ * Yes, this will skip the first waypoint and that is intentional as the
+ * first waypoint holds the stats for the track.
+ */
+ while (cursor.moveToNext()) {
+ Waypoint current = myTracksProviderUtils.createWaypoint(cursor);
+
+ markerIds.add(current.getId());
+ if (current.getId() == markerId) {
+ markerIndex = markerIds.size() - 1;
+ }
+ }
+ }
+ } finally {
+ if (cursor != null) {
+ cursor.close();
+ }
}
- name = (TextView) findViewById(R.id.marker_detail_name);
- waypointSection = findViewById(R.id.marker_detail_waypoint_section);
- statisticsSection = findViewById(R.id.marker_detail_statistics_section);
+ ViewPager viewPager = (ViewPager) findViewById(R.id.maker_detail_activity_view_pager);
+ viewPager.setAdapter(new MarkerDetailPagerAdapter(getSupportFragmentManager()));
+ if (markerIndex != -1) {
+ viewPager.setCurrentItem(markerIndex);
+ }
}
@Override
protected int getLayoutResId() {
- return R.layout.marker_detail;
- }
-
- @Override
- protected void onResume() {
- super.onResume();
-
- // Update waypoint in case it changed from an edit
- waypoint = myTracksProviderUtils.getWaypoint(markerId);
- if (waypoint == null) {
- Log.d(TAG, "waypoint is null");
- finish();
- return;
- }
-
- name.setText(getString(R.string.generic_name_line, waypoint.getName()));
- if (waypoint.getType() == WaypointType.WAYPOINT) {
- waypointSection.setVisibility(View.VISIBLE);
- statisticsSection.setVisibility(View.GONE);
-
- TextView markerType = (TextView) findViewById(R.id.marker_detail_waypoint_marker_type);
- markerType.setText(
- getString(R.string.marker_detail_waypoint_marker_type, waypoint.getCategory()));
- TextView description = (TextView) findViewById(R.id.marker_detail_waypoint_description);
- description.setText(getString(R.string.generic_description_line, waypoint.getDescription()));
- ImageView imageView = (ImageView) findViewById(R.id.marker_detail_waypoint_photo);
- String photoUrl = waypoint.getPhotoUrl();
- if (photoUrl == null || photoUrl.equals("")) {
- imageView.setVisibility(View.GONE);
- } else {
- imageView.setVisibility(View.VISIBLE);
- Display defaultDisplay = getWindowManager().getDefaultDisplay();
- int displayWidth = defaultDisplay.getWidth();
- int displayHeight = defaultDisplay.getHeight();
- bitmap = PhotoUtils.setImageVew(
- imageView, Uri.parse(photoUrl), displayWidth, displayHeight, true);
- }
- } else {
- waypointSection.setVisibility(View.GONE);
- statisticsSection.setVisibility(View.VISIBLE);
- StatsUtils.setTripStatisticsValues(this, waypoint.getTripStatistics());
- StatsUtils.setLocationValues(this, waypoint.getLocation(), false);
- }
- }
-
- @Override
- protected void onPause() {
- super.onPause();
- if (bitmap != null) {
- bitmap.recycle();
- }
- }
-
- @Override
- public boolean onCreateOptionsMenu(Menu menu) {
- getMenuInflater().inflate(R.menu.marker_detail, menu);
-
- Track track = myTracksProviderUtils.getTrack(waypoint.getTrackId());
- boolean isSharedWithMe = track != null ? track.isSharedWithMe() : true;
-
- menu.findItem(R.id.marker_detail_edit).setVisible(!isSharedWithMe);
- menu.findItem(R.id.marker_detail_delete).setVisible(!isSharedWithMe);
- return true;
+ return R.layout.marker_detail_activity;
}
@Override
@@ -158,29 +107,6 @@ public class MarkerDetailActivity extends AbstractMyTracksActivity implements De
finish();
}
- @Override
- public boolean onOptionsItemSelected(MenuItem item) {
- Intent intent;
- switch (item.getItemId()) {
- case R.id.marker_detail_show_on_map:
- intent = IntentUtils.newIntent(this, TrackDetailActivity.class)
- .putExtra(TrackDetailActivity.EXTRA_MARKER_ID, markerId);
- startActivity(intent);
- return true;
- case R.id.marker_detail_edit:
- intent = IntentUtils.newIntent(this, MarkerEditActivity.class)
- .putExtra(MarkerEditActivity.EXTRA_MARKER_ID, markerId);
- startActivity(intent);
- return true;
- case R.id.marker_detail_delete:
- DeleteMarkerDialogFragment.newInstance(new long[] { markerId })
- .show(getSupportFragmentManager(), DeleteMarkerDialogFragment.DELETE_MARKER_DIALOG_TAG);
- return true;
- default:
- return super.onOptionsItemSelected(item);
- }
- }
-
@Override
public void onDeleteMarkerDone() {
runOnUiThread(new Runnable() {
@@ -190,4 +116,26 @@ public class MarkerDetailActivity extends AbstractMyTracksActivity implements De
}
});
}
-}
+
+ /**
+ * Marker detail pager adapter.
+ *
+ * @author Jimmy Shih
+ */
+ private class MarkerDetailPagerAdapter extends FragmentStatePagerAdapter {
+
+ public MarkerDetailPagerAdapter(FragmentManager fragmentManager) {
+ super(fragmentManager);
+ }
+
+ @Override
+ public Fragment getItem(int position) {
+ return MarkerDetailFragment.newInstance(markerIds.get(position));
+ }
+
+ @Override
+ public int getCount() {
+ return markerIds.size();
+ }
+ }
+}
\ No newline at end of file
diff --git a/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java b/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java
new file mode 100644
index 000000000..d7e85a81f
--- /dev/null
+++ b/MyTracks/src/com/google/android/apps/mytracks/fragments/MarkerDetailFragment.java
@@ -0,0 +1,209 @@
+/*
+ * Copyright 2013 Google Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not
+ * use this file except in compliance with the License. You may obtain a copy of
+ * the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+ * License for the specific language governing permissions and limitations under
+ * the License.
+ */
+
+package com.google.android.apps.mytracks.fragments;
+
+import com.google.android.apps.mytracks.MarkerEditActivity;
+import com.google.android.apps.mytracks.TrackDetailActivity;
+import com.google.android.apps.mytracks.content.MyTracksProviderUtils;
+import com.google.android.apps.mytracks.content.Track;
+import com.google.android.apps.mytracks.content.Waypoint;
+import com.google.android.apps.mytracks.content.Waypoint.WaypointType;
+import com.google.android.apps.mytracks.util.IntentUtils;
+import com.google.android.apps.mytracks.util.PhotoUtils;
+import com.google.android.apps.mytracks.util.StatsUtils;
+import com.google.android.maps.mytracks.R;
+
+import android.content.Intent;
+import android.graphics.Bitmap;
+import android.net.Uri;
+import android.os.Bundle;
+import android.support.v4.app.Fragment;
+import android.support.v4.app.FragmentActivity;
+import android.util.Log;
+import android.view.Display;
+import android.view.LayoutInflater;
+import android.view.Menu;
+import android.view.MenuInflater;
+import android.view.MenuItem;
+import android.view.View;
+import android.view.ViewGroup;
+import android.widget.ImageView;
+import android.widget.TextView;
+
+/**
+ * A fragment to show marker details.
+ *
+ * @author Jimmy Shih
+ */
+public class MarkerDetailFragment extends Fragment {
+
+ private static final String TAG = MarkerDetailFragment.class.getSimpleName();
+ private static final String KEY_MARKER_ID = "markerId";
+
+ public static MarkerDetailFragment newInstance(long markerId) {
+ MarkerDetailFragment fragment = new MarkerDetailFragment();
+
+ Bundle bundle = new Bundle();
+ bundle.putLong(KEY_MARKER_ID, markerId);
+ fragment.setArguments(bundle);
+
+ return fragment;
+ }
+
+ private MyTracksProviderUtils myTracksProviderUtils;
+ private Waypoint waypoint;
+ private Bitmap bitmap;
+
+ @Override
+ public void onCreate(Bundle savedInstanceState) {
+ super.onCreate(savedInstanceState);
+
+ long markerId = getArguments().getLong(KEY_MARKER_ID);
+ if (markerId == -1L) {
+ Log.d(TAG, "invalid marker id");
+ getFragmentManager().popBackStack();
+ return;
+ }
+ myTracksProviderUtils = MyTracksProviderUtils.Factory.get(getActivity());
+ }
+
+ @Override
+ public View onCreateView(
+ LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
+ setHasOptionsMenu(true);
+ return inflater.inflate(R.layout.marker_detail_fragment, container, false);
+ };
+
+ @Override
+ public void onResume() {
+ super.onResume();
+
+ // Need to update the waypoint in case returning after an edit
+ updateWaypoint(true);
+ update();
+ }
+
+ public void onPause() {
+ super.onPause();
+ if (bitmap != null) {
+ bitmap.recycle();
+ }
+ }
+
+ @Override
+ public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
+ inflater.inflate(R.menu.marker_detail, menu);
+
+ updateWaypoint(false);
+
+ Track track = myTracksProviderUtils.getTrack(waypoint.getTrackId());
+ boolean isSharedWithMe = track != null ? track.isSharedWithMe() : true;
+
+ menu.findItem(R.id.marker_detail_edit).setVisible(!isSharedWithMe);
+ menu.findItem(R.id.marker_detail_delete).setVisible(!isSharedWithMe);
+ }
+
+ @Override
+ public boolean onOptionsItemSelected(MenuItem item) {
+ long markerId = getArguments().getLong(KEY_MARKER_ID);
+ FragmentActivity fragmentActivity = getActivity();
+ Intent intent;
+
+ switch (item.getItemId()) {
+ case R.id.marker_detail_show_on_map:
+ intent = IntentUtils.newIntent(fragmentActivity, TrackDetailActivity.class)
+ .putExtra(TrackDetailActivity.EXTRA_MARKER_ID, markerId);
+ startActivity(intent);
+ return true;
+ case R.id.marker_detail_edit:
+ intent = IntentUtils.newIntent(fragmentActivity, MarkerEditActivity.class)
+ .putExtra(MarkerEditActivity.EXTRA_MARKER_ID, markerId);
+ startActivity(intent);
+ return true;
+ case R.id.marker_detail_delete:
+ DeleteMarkerDialogFragment.newInstance(new long[] { markerId })
+ .show(getChildFragmentManager(), DeleteMarkerDialogFragment.DELETE_MARKER_DIALOG_TAG);
+ return true;
+ default:
+ return super.onOptionsItemSelected(item);
+ }
+ }
+
+ /**
+ * Updates the waypoint.
+ *
+ * @param refresh true to always update
+ */
+ private void updateWaypoint(boolean refresh) {
+ if (refresh || waypoint == null) {
+ waypoint = myTracksProviderUtils.getWaypoint(getArguments().getLong(KEY_MARKER_ID));
+ if (waypoint == null) {
+ Log.d(TAG, "waypoint is null");
+ getFragmentManager().popBackStack();
+ }
+ }
+ }
+
+ /**
+ * Updates the UI.
+ */
+ private void update() {
+ View waypointSection = getView().findViewById(R.id.marker_detail_waypoint_section);
+ View statisticsSection = getView().findViewById(R.id.marker_detail_statistics_section);
+
+ if (waypoint.getType() == WaypointType.WAYPOINT) {
+ waypointSection.setVisibility(View.VISIBLE);
+ statisticsSection.setVisibility(View.GONE);
+
+ ImageView imageView = (ImageView) getView().findViewById(R.id.marker_detail_waypoint_photo);
+ String photoUrl = waypoint.getPhotoUrl();
+ if (photoUrl == null || photoUrl.equals("")) {
+ imageView.setVisibility(View.GONE);
+ } else {
+ imageView.setVisibility(View.VISIBLE);
+ Display defaultDisplay = getActivity().getWindowManager().getDefaultDisplay();
+ @SuppressWarnings("deprecation")
+ int displayWidth = defaultDisplay.getWidth();
+ @SuppressWarnings("deprecation")
+ int displayHeight = defaultDisplay.getHeight();
+ bitmap = PhotoUtils.setImageVew(
+ imageView, Uri.parse(photoUrl), displayWidth, displayHeight, true);
+ }
+
+ TextView name = (TextView) getView().findViewById(R.id.marker_detail_waypoint_name);
+ name.setText(getString(R.string.generic_name_line, waypoint.getName()));
+
+ TextView markerType = (TextView) getView()
+ .findViewById(R.id.marker_detail_waypoint_marker_type);
+ markerType.setText(
+ getString(R.string.marker_detail_waypoint_marker_type, waypoint.getCategory()));
+
+ TextView description = (TextView) getView()
+ .findViewById(R.id.marker_detail_waypoint_description);
+ description.setText(getString(R.string.generic_description_line, waypoint.getDescription()));
+ } else {
+ waypointSection.setVisibility(View.GONE);
+ statisticsSection.setVisibility(View.VISIBLE);
+
+ TextView name = (TextView) getView().findViewById(R.id.marker_detail_statistics_name);
+ name.setText(getString(R.string.generic_name_line, waypoint.getName()));
+
+ StatsUtils.setTripStatisticsValues(getActivity(), waypoint.getTripStatistics());
+ StatsUtils.setLocationValues(getActivity(), waypoint.getLocation(), false);
+ }
+ }
+}