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); + } + } +}