Reimplement sensor statistics in UI

Closes: #1426
This commit is contained in:
Leon Marz
2023-07-29 12:55:18 +02:00
committed by Dennis Guse
parent 7ca9423fbf
commit db1a37f015
3 changed files with 261 additions and 16 deletions
@@ -29,8 +29,6 @@ import androidx.annotation.NonNull;
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;
@@ -114,10 +112,6 @@ public class StatisticsRecordedFragment extends Fragment {
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();
}
@@ -258,6 +252,28 @@ public class StatisticsRecordedFragment extends Fragment {
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);
}
}
}
+235 -9
View File
@@ -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"
@@ -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"
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_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>
</ScrollView>
+3
View File
@@ -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>