Skip to content

Commit

Permalink
Reimplement sensor statistics in UI
Browse files Browse the repository at this point in the history
Closes: #1426
  • Loading branch information
lmarz authored and dennisguse committed Jul 29, 2023
1 parent 7ca9423 commit db1a37f
Show file tree
Hide file tree
Showing 3 changed files with 260 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,8 +29,6 @@
import androidx.annotation.Nullable;
import androidx.core.content.ContextCompat;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.GridLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.TrackRecordedActivity;
Expand Down Expand Up @@ -114,10 +112,6 @@ public void onCreate(@Nullable Bundle savedInstanceState) {
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
viewBinding = StatisticsRecordedBinding.inflate(inflater, container, false);

RecyclerView sensorsRecyclerView = viewBinding.statsSensorsRecyclerView;
sensorsRecyclerView.setLayoutManager(new GridLayoutManager(getContext(), 2));
// sensorsRecyclerView.setAdapter(sensorsAdapter);

return viewBinding.getRoot();
}

Expand Down Expand Up @@ -258,6 +252,28 @@ private void updateSensorUI() {
if (sensorStatistics == null) {
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);
}
}
}
242 changes: 234 additions & 8 deletions src/main/res/layout/statistics_recorded.xml
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
android:layout_width="0dp"
android:layout_height="0dp"
android:orientation="vertical"
app:layout_constraintGuide_percent="0.5" />
app:layout_constraintGuide_begin="206dp" />

<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline3"
Expand Down Expand Up @@ -397,23 +397,249 @@
app:barrierDirection="bottom"
app:constraint_referenced_ids="stats_altitude_gain_value,stats_altitude_loss_value" />

<!-- Horizontal line -->
<!-- Heart Rate -->
<View
android:id="@+id/stats_end_horizontal_line"
android:id="@+id/stats_heart_rate_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_altitude_barrier" />

<!-- Sensors data -->
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/stats_sensors_recycler_view"
android:layout_width="0dp"
<androidx.constraintlayout.widget.Group
android:id="@+id/stats_heart_rate_group"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
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_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_constraintTop_toBottomOf="@id/stats_end_horizontal_line" />
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>
</ScrollView>
3 changes: 3 additions & 0 deletions src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -328,12 +328,15 @@ limitations under the License.
<!-- Sensor State -->
<string name="sensor_state_cadence_avg">Avg 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_avg">Avg 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_power">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="bluetooth_disabled">Please enable Bluetooth.</string>

Expand Down

0 comments on commit db1a37f

Please sign in to comment.