forked from upstream-mirrors/OpenTracks
@@ -29,8 +29,6 @@ import androidx.annotation.NonNull;
|
|||||||
import androidx.annotation.Nullable;
|
import androidx.annotation.Nullable;
|
||||||
import androidx.core.content.ContextCompat;
|
import androidx.core.content.ContextCompat;
|
||||||
import androidx.fragment.app.Fragment;
|
import androidx.fragment.app.Fragment;
|
||||||
import androidx.recyclerview.widget.GridLayoutManager;
|
|
||||||
import androidx.recyclerview.widget.RecyclerView;
|
|
||||||
|
|
||||||
import de.dennisguse.opentracks.R;
|
import de.dennisguse.opentracks.R;
|
||||||
import de.dennisguse.opentracks.TrackRecordedActivity;
|
import de.dennisguse.opentracks.TrackRecordedActivity;
|
||||||
@@ -114,10 +112,6 @@ public class StatisticsRecordedFragment extends Fragment {
|
|||||||
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
|
||||||
viewBinding = StatisticsRecordedBinding.inflate(inflater, container, false);
|
viewBinding = StatisticsRecordedBinding.inflate(inflater, container, false);
|
||||||
|
|
||||||
RecyclerView sensorsRecyclerView = viewBinding.statsSensorsRecyclerView;
|
|
||||||
sensorsRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
|
|
||||||
// sensorsRecyclerView.setAdapter(sensorsAdapter);
|
|
||||||
|
|
||||||
return viewBinding.getRoot();
|
return viewBinding.getRoot();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,6 +252,28 @@ public class StatisticsRecordedFragment extends Fragment {
|
|||||||
if (sensorStatistics == null) {
|
if (sensorStatistics == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//TODO
|
|
||||||
|
if (sensorStatistics.hasHeartRate()) {
|
||||||
|
String maxBPM = String.valueOf(Math.round(sensorStatistics.getMaxHeartRate().getBPM()));
|
||||||
|
String avgBPM = String.valueOf(Math.round(sensorStatistics.getAvgHeartRate().getBPM()));
|
||||||
|
|
||||||
|
viewBinding.statsHeartRateGroup.setVisibility(View.VISIBLE);
|
||||||
|
viewBinding.statsMaxHeartRateValue.setText(maxBPM);
|
||||||
|
viewBinding.statsAvgHeartRateValue.setText(avgBPM);
|
||||||
|
}
|
||||||
|
if (sensorStatistics.hasCadence()) {
|
||||||
|
String maxRPM = String.valueOf(Math.round(sensorStatistics.getMaxCadence().getRPM()));
|
||||||
|
String avgRPM = String.valueOf(Math.round(sensorStatistics.getAvgCadence().getRPM()));
|
||||||
|
|
||||||
|
viewBinding.statsCadenceGroup.setVisibility(View.VISIBLE);
|
||||||
|
viewBinding.statsMaxCadenceValue.setText(maxRPM);
|
||||||
|
viewBinding.statsAvgCadenceValue.setText(avgRPM);
|
||||||
|
}
|
||||||
|
if (sensorStatistics.hasPower()) {
|
||||||
|
String W = String.valueOf(Math.round(sensorStatistics.getAvgPower().getW()));
|
||||||
|
|
||||||
|
viewBinding.statsPowerGroup.setVisibility(View.VISIBLE);
|
||||||
|
viewBinding.statsPowerValue.setText(W);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@
|
|||||||
android:layout_width="0dp"
|
android:layout_width="0dp"
|
||||||
android:layout_height="0dp"
|
android:layout_height="0dp"
|
||||||
android:orientation="vertical"
|
android:orientation="vertical"
|
||||||
app:layout_constraintGuide_percent="0.5" />
|
app:layout_constraintGuide_begin="206dp" />
|
||||||
|
|
||||||
<androidx.constraintlayout.widget.Guideline
|
<androidx.constraintlayout.widget.Guideline
|
||||||
android:id="@+id/guideline3"
|
android:id="@+id/guideline3"
|
||||||
@@ -397,23 +397,249 @@
|
|||||||
app:barrierDirection="bottom"
|
app:barrierDirection="bottom"
|
||||||
app:constraint_referenced_ids="stats_altitude_gain_value,stats_altitude_loss_value" />
|
app:constraint_referenced_ids="stats_altitude_gain_value,stats_altitude_loss_value" />
|
||||||
|
|
||||||
<!-- Horizontal line -->
|
<!-- Heart Rate -->
|
||||||
<View
|
<View
|
||||||
android:id="@+id/stats_end_horizontal_line"
|
android:id="@+id/stats_heart_rate_horizontal_line"
|
||||||
style="@style/HorizontalLine"
|
style="@style/HorizontalLine"
|
||||||
android:layout_margin="8dp"
|
android:layout_margin="8dp"
|
||||||
app:layout_constraintStart_toEndOf="@id/guideline"
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
app:layout_constraintEnd_toStartOf="@id/guideline3"
|
app:layout_constraintEnd_toStartOf="@id/guideline3"
|
||||||
app:layout_constraintTop_toBottomOf="@id/stats_altitude_barrier" />
|
app:layout_constraintTop_toBottomOf="@id/stats_altitude_barrier" />
|
||||||
|
|
||||||
<!-- Sensors data -->
|
<androidx.constraintlayout.widget.Group
|
||||||
<androidx.recyclerview.widget.RecyclerView
|
android:id="@+id/stats_heart_rate_group"
|
||||||
android:id="@+id/stats_sensors_recycler_view"
|
android:layout_width="wrap_content"
|
||||||
android:layout_width="0dp"
|
|
||||||
android:layout_height="wrap_content"
|
android:layout_height="wrap_content"
|
||||||
app:layout_constraintEnd_toStartOf="@id/guideline3"
|
android:visibility="gone"
|
||||||
|
app:constraint_referenced_ids="stats_heart_rate_horizontal_line,stats_max_heart_rate_label,stats_max_heart_rate_value,stats_max_heart_rate_unit,stats_avg_heart_rate_label,stats_avg_heart_rate_value,stats_avg_heart_rate_unit" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_max_heart_rate_label"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryHeader"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_heart_rate_max"
|
||||||
|
app:layout_constrainedWidth="true"
|
||||||
app:layout_constraintStart_toEndOf="@id/guideline"
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
app:layout_constraintTop_toBottomOf="@id/stats_end_horizontal_line" />
|
app:layout_constraintEnd_toStartOf="@id/guideline2"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_heart_rate_horizontal_line" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_max_heart_rate_value"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryValue"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:value="@string/value_unknown"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/stats_max_heart_rate_unit"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_max_heart_rate_label"
|
||||||
|
tools:text="100" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_max_heart_rate_unit"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_heart_rate_unit"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/stats_max_heart_rate_value"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/stats_max_heart_rate_value"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_avg_heart_rate_label"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryHeader"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_heart_rate_avg"
|
||||||
|
app:layout_constrainedWidth="true"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline2"
|
||||||
|
app:layout_constraintEnd_toEndOf="@id/guideline3"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_heart_rate_horizontal_line" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_avg_heart_rate_value"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryValue"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:value="@string/value_unknown"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline2"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/stats_avg_heart_rate_unit"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_avg_heart_rate_label"
|
||||||
|
tools:text="100" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_avg_heart_rate_unit"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_heart_rate_unit"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/stats_avg_heart_rate_value"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/stats_avg_heart_rate_value"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline3" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Barrier
|
||||||
|
android:id="@+id/stats_heart_rate_barrier"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:barrierDirection="bottom"
|
||||||
|
app:constraint_referenced_ids="stats_max_heart_rate_value,stats_avg_heart_rate_value" />
|
||||||
|
|
||||||
|
<!-- Cadence -->
|
||||||
|
<View
|
||||||
|
android:id="@+id/stats_cadence_horizontal_line"
|
||||||
|
style="@style/HorizontalLine"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline3"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_heart_rate_barrier" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Group
|
||||||
|
android:id="@+id/stats_cadence_group"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:constraint_referenced_ids="stats_cadence_horizontal_line,stats_max_cadence_label,stats_max_cadence_value,stats_max_cadence_unit,stats_avg_cadence_label,stats_avg_cadence_value,stats_avg_cadence_unit" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_max_cadence_label"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryHeader"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_cadence_max"
|
||||||
|
app:layout_constrainedWidth="true"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline2"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_cadence_horizontal_line" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_max_cadence_value"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryValue"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:value="@string/value_unknown"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/stats_max_cadence_unit"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_max_cadence_label"
|
||||||
|
tools:text="100" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_max_cadence_unit"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_cadence_unit"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/stats_max_cadence_value"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/stats_max_cadence_value"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline2" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_avg_cadence_label"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryHeader"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_cadence_avg"
|
||||||
|
app:layout_constrainedWidth="true"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline2"
|
||||||
|
app:layout_constraintEnd_toEndOf="@id/guideline3"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_cadence_horizontal_line" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_avg_cadence_value"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryValue"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:value="@string/value_unknown"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline2"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/stats_avg_cadence_unit"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_avg_cadence_label"
|
||||||
|
tools:text="100" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_avg_cadence_unit"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_cadence_unit"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/stats_avg_cadence_value"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/stats_avg_cadence_value"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline3" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Barrier
|
||||||
|
android:id="@+id/stats_cadence_barrier"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:barrierDirection="bottom"
|
||||||
|
app:constraint_referenced_ids="stats_max_cadence_value,stats_avg_cadence_value" />
|
||||||
|
|
||||||
|
<!-- Power -->
|
||||||
|
<View
|
||||||
|
android:id="@+id/stats_power_horizontal_line"
|
||||||
|
style="@style/HorizontalLine"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline3"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_cadence_barrier" />
|
||||||
|
|
||||||
|
<!-- Sensors data -->
|
||||||
|
<androidx.constraintlayout.widget.Group
|
||||||
|
android:id="@+id/stats_power_group"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:visibility="gone"
|
||||||
|
app:constraint_referenced_ids="stats_power_horizontal_line,stats_power_label,stats_power_value,stats_power_unit" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_power_label"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryHeader"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_power_avg"
|
||||||
|
app:layout_constrainedWidth="true"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline2"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_power_horizontal_line" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_power_value"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryValue"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:value="@string/value_unknown"
|
||||||
|
app:layout_constraintHorizontal_chainStyle="packed"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/stats_power_unit"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_power_label"
|
||||||
|
tools:text="100" />
|
||||||
|
|
||||||
|
<TextView
|
||||||
|
android:id="@+id/stats_power_unit"
|
||||||
|
style="@style/TextAppearance.OpenTracks.PrimaryUnit"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
android:text="@string/sensor_state_power_unit"
|
||||||
|
app:layout_constraintBottom_toBottomOf="@id/stats_power_value"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/stats_power_value"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline2" />
|
||||||
|
|
||||||
|
<androidx.constraintlayout.widget.Barrier
|
||||||
|
android:id="@+id/stats_power_barrier"
|
||||||
|
android:layout_width="wrap_content"
|
||||||
|
android:layout_height="wrap_content"
|
||||||
|
app:barrierDirection="bottom"
|
||||||
|
app:constraint_referenced_ids="stats_power_value" />
|
||||||
|
|
||||||
|
<!-- Horizontal Line -->
|
||||||
|
<View
|
||||||
|
android:id="@+id/stats_end_horizontal_line"
|
||||||
|
style="@style/HorizontalLine"
|
||||||
|
android:layout_margin="8dp"
|
||||||
|
app:layout_constraintStart_toEndOf="@id/guideline"
|
||||||
|
app:layout_constraintEnd_toStartOf="@id/guideline3"
|
||||||
|
app:layout_constraintTop_toBottomOf="@id/stats_power_barrier" />
|
||||||
|
|
||||||
</androidx.constraintlayout.widget.ConstraintLayout>
|
</androidx.constraintlayout.widget.ConstraintLayout>
|
||||||
</ScrollView>
|
</ScrollView>
|
||||||
@@ -328,12 +328,15 @@ limitations under the License.
|
|||||||
<!-- Sensor State -->
|
<!-- Sensor State -->
|
||||||
<string name="sensor_state_cadence_avg">Avg Cadence</string>
|
<string name="sensor_state_cadence_avg">Avg Cadence</string>
|
||||||
<string name="sensor_state_cadence_max">Max Cadence</string>
|
<string name="sensor_state_cadence_max">Max Cadence</string>
|
||||||
|
<string name="sensor_state_cadence_unit">rpm</string>
|
||||||
<string name="sensor_state_heart_rate">Heart rate</string>
|
<string name="sensor_state_heart_rate">Heart rate</string>
|
||||||
<string name="sensor_state_heart_rate_avg">Avg Heart rate</string>
|
<string name="sensor_state_heart_rate_avg">Avg Heart rate</string>
|
||||||
<string name="sensor_state_heart_rate_max">Max Heart rate</string>
|
<string name="sensor_state_heart_rate_max">Max Heart rate</string>
|
||||||
|
<string name="sensor_state_heart_rate_unit">bpm</string>
|
||||||
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
|
||||||
<string name="sensor_state_power">Power</string>
|
<string name="sensor_state_power">Power</string>
|
||||||
<string name="sensor_state_power_avg">Avg Power</string>
|
<string name="sensor_state_power_avg">Avg Power</string>
|
||||||
|
<string name="sensor_state_power_unit">W</string>
|
||||||
<string name="sensor_could_not_scan">Could not scan for Bluetooth devices (error %1$i).</string>
|
<string name="sensor_could_not_scan">Could not scan for Bluetooth devices (error %1$i).</string>
|
||||||
<string name="bluetooth_disabled">Please enable Bluetooth.</string>
|
<string name="bluetooth_disabled">Please enable Bluetooth.</string>
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user