diff --git a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java index 53ae3b4e1..111551c97 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackListActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackListActivity.java @@ -17,6 +17,7 @@ package de.dennisguse.opentracks; import android.Manifest; +import android.app.ActivityOptions; import android.app.SearchManager; import android.content.Context; import android.content.Intent; @@ -29,6 +30,7 @@ import android.location.LocationManager; import android.os.Bundle; import android.provider.Settings; import android.util.Log; +import android.util.Pair; import android.view.KeyEvent; import android.view.Menu; import android.view.MenuItem; @@ -195,17 +197,20 @@ public class TrackListActivity extends AbstractListActivity implements ConfirmDe viewBinding.trackList.setEmptyView(viewBinding.trackListEmptyView); viewBinding.trackList.setOnItemClickListener((parent, view, position, trackId) -> { - Intent newIntent; if (trackId == recordingTrackId.getId()) { // Is recording -> open record activity. - newIntent = IntentUtils.newIntent(TrackListActivity.this, TrackRecordingActivity.class) + Intent newIntent = IntentUtils.newIntent(TrackListActivity.this, TrackRecordingActivity.class) .putExtra(TrackRecordedActivity.EXTRA_TRACK_ID, new Track.Id(trackId)); + startActivity(newIntent); } else { // Not recording -> open detail activity. - newIntent = IntentUtils.newIntent(TrackListActivity.this, TrackRecordedActivity.class) + Intent newIntent = IntentUtils.newIntent(TrackListActivity.this, TrackRecordedActivity.class) .putExtra(TrackRecordedActivity.EXTRA_TRACK_ID, new Track.Id(trackId)); + ActivityOptions activityOptions = ActivityOptions.makeSceneTransitionAnimation( + this, + new Pair<>(view.findViewById(R.id.list_item_icon), TrackRecordedActivity.VIEW_TRACK_ICON)); + startActivity(newIntent, activityOptions.toBundle()); } - startActivity(newIntent); }); resourceCursorAdapter = new ResourceCursorAdapter(this, R.layout.list_item, null, 0) { diff --git a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java index 7e547c0db..970649cc7 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackRecordedActivity.java @@ -24,6 +24,7 @@ import android.view.MenuItem; import android.view.View; import androidx.annotation.NonNull; +import androidx.core.view.ViewCompat; import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentActivity; import androidx.viewpager2.adapter.FragmentStateAdapter; @@ -55,6 +56,8 @@ public class TrackRecordedActivity extends AbstractListActivity implements Confi private static final String TAG = TrackRecordedActivity.class.getSimpleName(); + public static final String VIEW_TRACK_ICON = "track_icon"; + public static final String EXTRA_TRACK_ID = "track_id"; public static final String EXTRA_MARKER_ID = "marker_id"; @@ -84,6 +87,8 @@ public class TrackRecordedActivity extends AbstractListActivity implements Confi if (savedInstanceState != null) { viewBinding.trackDetailActivityViewPager.setCurrentItem(savedInstanceState.getInt(CURRENT_TAB_TAG_KEY)); } + + postponeEnterTransition(); } @Override @@ -275,4 +280,9 @@ public class TrackRecordedActivity extends AbstractListActivity implements Confi } } } + + public void startPostponedEnterTransitionWith(View viewIcon, View viewName) { + ViewCompat.setTransitionName(viewIcon, TrackRecordedActivity.VIEW_TRACK_ICON); + startPostponedEnterTransition(); + } } \ No newline at end of file diff --git a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java index 6329a5b15..9c82f74e1 100644 --- a/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java +++ b/src/main/java/de/dennisguse/opentracks/fragments/StatisticsRecordedFragment.java @@ -34,6 +34,7 @@ import java.util.ArrayList; import java.util.List; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.TrackRecordedActivity; import de.dennisguse.opentracks.adapters.SensorsAdapter; import de.dennisguse.opentracks.content.data.Track; import de.dennisguse.opentracks.content.provider.ContentProviderUtils; @@ -64,7 +65,6 @@ public class StatisticsRecordedFragment extends Fragment { return fragment; } - private TrackStatistics trackStatistics; private SensorStatistics sensorStatistics; private SensorsAdapter sensorsAdapter; @@ -152,26 +152,35 @@ public class StatisticsRecordedFragment extends Fragment { getActivity().runOnUiThread(() -> { if (isResumed()) { Track track = contentProviderUtils.getTrack(trackId); - trackStatistics = track != null ? track.getTrackStatistics() : null; + trackStatistics = track.getTrackStatistics(); sensorStatistics = contentProviderUtils.getSensorStats(trackId); - String newCategory = track != null ? track.getCategory() : ""; + String newCategory = track.getCategory(); if (!category.equals(newCategory)) { category = newCategory; sharedPreferenceChangeListener.onSharedPreferenceChanged(sharedPreferences, getString(R.string.stats_rate_key)); } + loadTrackDescription(track); updateUI(); updateSensorUI(); + + ((TrackRecordedActivity) getActivity()).startPostponedEnterTransitionWith(viewBinding.statsActivityTypeIcon, viewBinding.statsNameValue); } }); } } + private void loadTrackDescription(@NonNull Track track) { + viewBinding.statsNameValue.setText(track.getName()); + viewBinding.statsDescriptionValue.setText(track.getDescription()); + viewBinding.statsStartDatetimeValue.setText(StringUtils.formatDateTime(getContext(), trackStatistics.getStartTime())); + } + private void updateUI() { // Set total distance { - double totalDistance = trackStatistics == null ? Double.NaN : trackStatistics.getTotalDistance(); + double totalDistance = trackStatistics.getTotalDistance(); Pair parts = StringUtils.getDistanceParts(getContext(), totalDistance, preferenceMetricUnits); viewBinding.statsDistanceValue.setText(parts.first); @@ -185,14 +194,14 @@ public class StatisticsRecordedFragment extends Fragment { } // Set time and start datetime - if (trackStatistics != null) { + { viewBinding.statsMovingTimeValue.setText(StringUtils.formatElapsedTime(trackStatistics.getMovingTime())); viewBinding.statsTotalTimeValue.setText(StringUtils.formatElapsedTime(trackStatistics.getTotalTime())); } // Set average speed/pace { - double speed = trackStatistics != null ? trackStatistics.getAverageSpeed() : Double.NaN; + double speed = trackStatistics.getAverageSpeed(); viewBinding.statsAverageSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_average_speed : R.string.stats_average_pace); Pair parts = StringUtils.getSpeedParts(getContext(), speed, preferenceMetricUnits, preferenceReportSpeed); @@ -202,7 +211,7 @@ public class StatisticsRecordedFragment extends Fragment { // Set max speed/pace { - double speed = trackStatistics == null ? Double.NaN : trackStatistics.getMaxSpeed(); + double speed = trackStatistics.getMaxSpeed(); viewBinding.statsMaxSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_max_speed : R.string.stats_fastest_pace); @@ -213,7 +222,7 @@ public class StatisticsRecordedFragment extends Fragment { // Set moving speed/pace { - double speed = trackStatistics != null ? trackStatistics.getAverageMovingSpeed() : Double.NaN; + double speed = trackStatistics.getAverageMovingSpeed(); viewBinding.statsMovingSpeedLabel.setText(preferenceReportSpeed ? R.string.stats_average_moving_speed : R.string.stats_average_moving_pace); @@ -228,8 +237,8 @@ public class StatisticsRecordedFragment extends Fragment { boolean showElevation = PreferencesUtils.isShowStatsElevation(getContext()); viewBinding.statsElevationGroup.setVisibility(showElevation ? View.VISIBLE : View.GONE); - Float elevationGain_m = trackStatistics != null ? trackStatistics.getTotalElevationGain() : null; - Float elevationLoss_m = trackStatistics != null ? trackStatistics.getTotalElevationLoss() : null; + Float elevationGain_m = trackStatistics.getTotalElevationGain(); + Float elevationLoss_m = trackStatistics.getTotalElevationLoss(); Pair parts; diff --git a/src/main/res/layout/sensor_item.xml b/src/main/res/layout/sensor_item.xml index 4d89022bf..b2c80e31c 100644 --- a/src/main/res/layout/sensor_item.xml +++ b/src/main/res/layout/sensor_item.xml @@ -25,8 +25,9 @@ android:id="@+id/stats_sensor_value" style="@style/StatsLargeValue" android:value="@string/value_unknown" + app:layout_constraintHorizontal_chainStyle="packed" app:layout_constraintStart_toStartOf="parent" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toStartOf="@id/stats_sensor_unit" app:layout_constraintTop_toBottomOf="@id/stats_sensor_sensor_value" tools:text="90" /> @@ -34,8 +35,8 @@ android:id="@+id/stats_sensor_unit" style="@style/StatsUnit" tools:text="@string/sensor_unit_beats_per_minute" - app:layout_constraintStart_toStartOf="parent" + app:layout_constraintStart_toEndOf="@id/stats_sensor_value" app:layout_constraintEnd_toEndOf="parent" - app:layout_constraintTop_toBottomOf="@id/stats_sensor_value" /> + app:layout_constraintBottom_toBottomOf="@id/stats_sensor_value" /> \ No newline at end of file diff --git a/src/main/res/layout/statistics_recorded.xml b/src/main/res/layout/statistics_recorded.xml index 7514af11f..5ec56c1ab 100644 --- a/src/main/res/layout/statistics_recorded.xml +++ b/src/main/res/layout/statistics_recorded.xml @@ -30,91 +30,124 @@ android:orientation="vertical" app:layout_constraintGuide_end="8dp" /> + + + + + + + + + + + + + + + + app:layout_constraintStart_toEndOf="@id/guideline" + app:layout_constraintEnd_toStartOf="@id/guideline2" + app:layout_constraintTop_toBottomOf="@id/stats_information_horizontal_line" /> - - - - - - - - - - + app:layout_constraintStart_toEndOf="@id/guideline2" + app:layout_constraintEnd_toStartOf="@id/guideline3" + app:layout_constraintTop_toBottomOf="@id/stats_information_horizontal_line" /> + + + + + @@ -130,18 +163,74 @@ android:id="@+id/stats_speed_horizontal_line" style="@style/StatsHorizontalLine" android:layout_marginBottom="8dp" - app:layout_constraintStart_toEndOf="@+id/guideline" - app:layout_constraintEnd_toStartOf="@+id/guideline3" - app:layout_constraintTop_toBottomOf="@+id/stats_time_barrier" /> + app:layout_constraintStart_toEndOf="@id/guideline" + app:layout_constraintEnd_toStartOf="@id/guideline3" + app:layout_constraintTop_toBottomOf="@id/stats_time_barrier" /> + + + + + + + + + + + + + + - - - - - - - - - - - - - - @@ -224,16 +257,16 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" app:barrierDirection="bottom" - app:constraint_referenced_ids="stats_moving_speed_value,stats_max_speed_value" /> + app:constraint_referenced_ids="stats_max_speed_value,stats_moving_speed_value,stats_average_speed_value" /> + app:layout_constraintStart_toEndOf="@id/guideline" + app:layout_constraintEnd_toStartOf="@id/guideline3" + app:layout_constraintTop_toBottomOf="@id/stats_speed_barrier" /> @@ -309,9 +342,9 @@ android:id="@+id/stats_end_horizontal_line" style="@style/StatsHorizontalLine" android:layout_marginBottom="8dp" - app:layout_constraintStart_toEndOf="@+id/guideline" - app:layout_constraintEnd_toStartOf="@+id/guideline3" - app:layout_constraintTop_toBottomOf="@+id/stats_elevation_barrier" /> + app:layout_constraintStart_toEndOf="@id/guideline" + app:layout_constraintEnd_toStartOf="@id/guideline3" + app:layout_constraintTop_toBottomOf="@id/stats_elevation_barrier" /> http://maps.google.com/mapfiles/ms/micons/blue-pushpin.png - BPM - RPM - W + bpm + rpm + w - diff --git a/src/main/res/values/styles.xml b/src/main/res/values/styles.xml index 129a12707..ae6f89292 100644 --- a/src/main/res/values/styles.xml +++ b/src/main/res/values/styles.xml @@ -209,6 +209,38 @@ limitations under the License. true + + + + + + + +