Cleanup: split ActivityType and ActivityIcon.

Part of #1608.
This commit is contained in:
Dennis Guse
2023-06-26 23:56:41 +02:00
parent 425ea0f216
commit 477819d730
18 changed files with 224 additions and 124 deletions
@@ -96,7 +96,7 @@ public class ExportImportTest {
private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context); private final ContentProviderUtils contentProviderUtils = new ContentProviderUtils(context);
private static final ActivityType TRACK_ACTIVITY_TYPE = ActivityType.MOUNTAIN_BIKE; private static final ActivityType TRACK_ACTIVITY_TYPE = ActivityType.MOUNTAIN_BIKING;
private static final String TRACK_ACTIVITY_TYPE_LOCALIZED = "the activity type"; private static final String TRACK_ACTIVITY_TYPE_LOCALIZED = "the activity type";
private static final String TRACK_DESCRIPTION = "the description"; private static final String TRACK_DESCRIPTION = "the description";
@@ -83,7 +83,7 @@ public class GPXTrackImporterTest {
assertEquals("the category", importedTrack.getActivityTypeLocalized()); assertEquals("the category", importedTrack.getActivityTypeLocalized());
assertEquals("the description", importedTrack.getDescription()); assertEquals("the description", importedTrack.getDescription());
assertEquals("2021-01-07 22:51", importedTrack.getName()); assertEquals("2021-01-07 22:51", importedTrack.getName());
assertEquals("UNKNOWN", importedTrack.getActivityType()); assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
//TODO Check trackstatistics //TODO Check trackstatistics
@@ -137,7 +137,7 @@ public class GPXTrackImporterTest {
assertEquals("", importedTrack.getActivityTypeLocalized()); assertEquals("", importedTrack.getActivityTypeLocalized());
assertEquals("", importedTrack.getDescription()); assertEquals("", importedTrack.getDescription());
assertEquals("20210907_213924.gpx", importedTrack.getName()); assertEquals("20210907_213924.gpx", importedTrack.getName());
assertEquals("", importedTrack.getActivityType()); assertEquals(ActivityType.UNKNOWN, importedTrack.getActivityType());
// 3. trackstatistics // 3. trackstatistics
TrackStatistics trackStatistics = importedTrack.getTrackStatistics(); TrackStatistics trackStatistics = importedTrack.getTrackStatistics();
@@ -243,8 +243,8 @@ public class AggregatedStatisticsTest {
// Check order // Check order
{ {
assertEquals(biking, aggregatedStatistics.getItem(0).getActivityType()); assertEquals(biking, aggregatedStatistics.getItem(0).getActivityTypeLocalized());
assertEquals(driving, aggregatedStatistics.getItem(3).getActivityType()); assertEquals(driving, aggregatedStatistics.getItem(3).getActivityTypeLocalized());
} }
} }
} }
@@ -97,7 +97,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
} }
setActivityTypeIcon(activityType); setActivityTypeIcon(activityType);
viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.fields.trackEditActivityType.getText().toString())); viewBinding.fields.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.fields.trackEditActivityType.getText().toString()));
viewBinding.fields.trackEditDescription.setText(track.getDescription()); viewBinding.fields.trackEditDescription.setText(track.getDescription());
@@ -146,6 +146,6 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
@Override @Override
public void onChooseActivityTypeDone(ActivityType activityType) { public void onChooseActivityTypeDone(ActivityType activityType) {
setActivityTypeIcon(activityType); setActivityTypeIcon(activityType);
viewBinding.fields.trackEditActivityType.setText(getString(activityType.getFirstLocalizedStringId())); viewBinding.fields.trackEditActivityType.setText(getString(activityType.getLocalizedStringId()));
} }
} }
@@ -319,7 +319,7 @@ public class TrackRecordingActivity extends AbstractActivity implements ChooseAc
@Override @Override
public void onChooseActivityTypeDone(ActivityType activityType) { public void onChooseActivityTypeDone(ActivityType activityType) {
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
String activityTypeLocalized = getString(activityType.getFirstLocalizedStringId()); String activityTypeLocalized = getString(activityType.getLocalizedStringId());
TrackUtils.updateTrack(this, track, null, activityTypeLocalized, null, contentProviderUtils); TrackUtils.updateTrack(this, track, null, activityTypeLocalized, null, contentProviderUtils);
} }
@@ -65,7 +65,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
}); });
setActivityTypeIcon(track.getActivityType()); setActivityTypeIcon(track.getActivityType());
viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), viewBinding.trackEditActivityType.getText().toString())); viewBinding.trackEditActivityTypeIcon.setOnClickListener(v -> ChooseActivityTypeDialogFragment.showDialog(getSupportFragmentManager(), this, viewBinding.trackEditActivityType.getText().toString()));
viewBinding.trackEditDescription.setText(track.getDescription()); viewBinding.trackEditDescription.setText(track.getDescription());
@@ -74,7 +74,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
{ {
Pair<String, String> parts = SpeedFormatter.Builder() Pair<String, String> parts = SpeedFormatter.Builder()
.setUnit(PreferencesUtils.getUnitSystem()) .setUnit(PreferencesUtils.getUnitSystem())
.setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track.getActivityTypeLocalized())) .setReportSpeedOrPace(PreferencesUtils.isReportSpeed(track))
.build(this) .build(this)
.getSpeedParts(track.getTrackStatistics().getAverageMovingSpeed()); .getSpeedParts(track.getTrackStatistics().getAverageMovingSpeed());
viewBinding.speed.setText(parts.first); viewBinding.speed.setText(parts.first);
@@ -132,7 +132,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
@Override @Override
public void onChooseActivityTypeDone(ActivityType activityType) { public void onChooseActivityTypeDone(ActivityType activityType) {
setActivityTypeIcon(activityType); setActivityTypeIcon(activityType);
viewBinding.trackEditActivityType.setText(getString(activityType.getFirstLocalizedStringId())); viewBinding.trackEditActivityType.setText(getString(activityType.getLocalizedStringId()));
} }
private void resumeTrackAndFinish() { private void resumeTrackAndFinish() {
@@ -65,7 +65,7 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
// Stats gathered from the received data // Stats gathered from the received data
private final List<ChartPoint> pendingPoints = new ArrayList<>(); private final List<ChartPoint> pendingPoints = new ArrayList<>();
private String category = ""; private String activityTypeLocalized = "";
// Modes of operation // Modes of operation
private boolean chartByDistance; private boolean chartByDistance;
@@ -87,7 +87,7 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
} }
} }
if (PreferencesUtils.isKey(R.string.stats_rate_key, key)) { if (PreferencesUtils.isKey(R.string.stats_rate_key, key)) {
boolean reportSpeed = PreferencesUtils.isReportSpeed(category); boolean reportSpeed = PreferencesUtils.isReportSpeed(activityTypeLocalized);
if (reportSpeed != viewBinding.chartView.getReportSpeed()) { if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
viewBinding.chartView.setReportSpeed(reportSpeed); viewBinding.chartView.setReportSpeed(reportSpeed);
viewBinding.chartView.applyReportSpeed(); viewBinding.chartView.applyReportSpeed();
@@ -160,12 +160,12 @@ public class ChartFragment extends Fragment implements TrackDataHub.Listener {
public void onTrackUpdated(Track track) { public void onTrackUpdated(Track track) {
if (isResumed()) { if (isResumed()) {
if (track == null) { if (track == null) {
category = ""; activityTypeLocalized = "";
return; return;
} }
category = track.getActivityTypeLocalized(); activityTypeLocalized = track.getActivityTypeLocalized();
boolean reportSpeed = PreferencesUtils.isReportSpeed(category); boolean reportSpeed = PreferencesUtils.isReportSpeed(activityTypeLocalized);
if (reportSpeed != viewBinding.chartView.getReportSpeed()) { if (reportSpeed != viewBinding.chartView.getReportSpeed()) {
viewBinding.chartView.setReportSpeed(reportSpeed); viewBinding.chartView.setReportSpeed(reportSpeed);
viewBinding.chartView.applyReportSpeed(); viewBinding.chartView.applyReportSpeed();
@@ -0,0 +1,35 @@
package de.dennisguse.opentracks.data.models;
import de.dennisguse.opentracks.R;
public enum ActivityIcon {
AIRPLANE("AIRPLANE", R.drawable.ic_activity_flight_24dp),
BIKE("BIKE", R.drawable.ic_activity_bike_24dp),
MOUNTAIN_BIKE("MOUNTAIN_BIKE", R.drawable.ic_activity_mtb_24dp),
MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp),
KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp),
BOAT("BOAT", R.drawable.ic_activity_boat_24dp),
SAILING("SAILING", R.drawable.ic_activity_sailing_24dp),
DRIVE("DRIVE", R.drawable.ic_activity_drive_24dp),
RUN("RUN", R.drawable.ic_activity_run_24dp),
SKI("SKI", R.drawable.ic_activity_skiing_24dp),
SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp),
UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp),
WALK("WALK", R.drawable.ic_activity_walk_24dp),
ESCOOTER("ESCOOTER", R.drawable.ic_activity_escooter_24dp),
INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp),
SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp),
CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp),
SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp),
SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp),
WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp);
@Deprecated //TODO should be removed.
final String iconId;
final int iconDrawableId;
ActivityIcon(String iconId, int iconDrawableId) {
this.iconId = iconId;
this.iconDrawableId = iconDrawableId;
}
}
@@ -5,7 +5,6 @@ import android.content.res.Resources;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors; import java.util.stream.Collectors;
@@ -13,77 +12,126 @@ import java.util.stream.Collectors;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
public enum ActivityType { public enum ActivityType {
AIRPLANE("AIRPLANE", R.drawable.ic_activity_flight_24dp, true, R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane),
BIKE("BIKE", R.drawable.ic_activity_bike_24dp, true, R.string.activity_type_biking, R.string.activity_type_cycling, R.string.activity_type_dirt_bike, R.string.activity_type_road_biking, R.string.activity_type_track_cycling),
MOUNTAIN_BIKE("MOUNTAIN_BIKE", R.drawable.ic_activity_mtb_24dp, true, R.string.activity_type_mountain_biking),
MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp, true, R.string.activity_type_motor_bike),
KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp, true, R.string.activity_type_kayaking),
BOAT("BOAT", R.drawable.ic_activity_boat_24dp, true, R.string.activity_type_boat, R.string.activity_type_ferry, R.string.activity_type_motor_boating, R.string.activity_type_rc_boat),
SAILING("SAILING", R.drawable.ic_activity_sailing_24dp, true, R.string.activity_type_sailing),
DRIVE("DRIVE", R.drawable.ic_activity_drive_24dp, true, R.string.activity_type_atv, R.string.activity_type_driving, R.string.activity_type_driving_bus, R.string.activity_type_driving_car),
RUN("RUN", R.drawable.ic_activity_run_24dp, false, R.string.activity_type_running, R.string.activity_type_street_running, R.string.activity_type_track_running, R.string.activity_type_trail_running),
SKI("SKI", R.drawable.ic_activity_skiing_24dp, true, R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing),
SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp, true, R.string.activity_type_snow_boarding),
UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp, true, R.string.activity_type_unknown),
WALK("WALK", R.drawable.ic_activity_walk_24dp, false, R.string.activity_type_hiking, R.string.activity_type_off_trail_hiking, R.string.activity_type_speed_walking, R.string.activity_type_trail_hiking, R.string.activity_type_walking),
ESCOOTER("ESCOOTER", R.drawable.ic_activity_escooter_24dp, true, R.string.activity_type_escooter),
INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp, true, R.string.activity_type_inline_skating),
SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp, true, R.string.activity_type_skate_boarding),
CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp, false, R.string.activity_type_climbing),
SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp, false, R.string.activity_type_swimming),
SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp, false, R.string.activity_type_swimming_open),
WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, false, R.string.activity_type_workout);
final String iconId; AIRPLANE("airplane", R.string.activity_type_airplane, ActivityIcon.AIRPLANE, true),
final int iconDrawableId; ATV("ATV", R.string.activity_type_atv, ActivityIcon.DRIVE, true),
BIKING("biking", R.string.activity_type_biking, ActivityIcon.BIKE, true),
BLIMP("blimp", R.string.activity_type_blimp, ActivityIcon.UNKNOWN, true),
BOAT("boat", R.string.activity_type_boat, ActivityIcon.BOAT, true),
CLIMBING("climbing", R.string.activity_type_climbing, ActivityIcon.CLIMBING, false),
COMMERCIAL_AIRPLANE("commercial airplane", R.string.activity_type_commercial_airplane, ActivityIcon.AIRPLANE, true),
CROSS_COUNTRY_SKIING("cross-country skiing", R.string.activity_type_cross_country_skiing, ActivityIcon.SKI, true),
CYCLING("cycling", R.string.activity_type_cycling, ActivityIcon.BIKE, true),
DIRT_BIKE("dirt bike", R.string.activity_type_dirt_bike, ActivityIcon.MOTOR_BIKE, true),
DONKEY_BACK_RIDING("donkey back riding", R.string.activity_type_donkey_back_riding, ActivityIcon.UNKNOWN, true),
DRIVING("driving", R.string.activity_type_driving, ActivityIcon.DRIVE, true),
DRIVING_BUS("driving bus", R.string.activity_type_driving_bus, ActivityIcon.DRIVE, true),
DRIVING_CAR("driving car", R.string.activity_type_driving_car, ActivityIcon.DRIVE, true),
ESCOOTER("escooter", R.string.activity_type_escooter, ActivityIcon.ESCOOTER, true),
FERRY("ferry", R.string.activity_type_ferry, ActivityIcon.BOAT, true),
FRISBEE("frisbee", R.string.activity_type_frisbee, ActivityIcon.UNKNOWN, true),
GLIDING("gliding", R.string.activity_type_gliding, ActivityIcon.UNKNOWN, true),
HANG_GLIDING("hang gliding", R.string.activity_type_hang_gliding, ActivityIcon.UNKNOWN, true),
HELICOPTER("helicopter", R.string.activity_type_helicopter, ActivityIcon.UNKNOWN, true),
HIKING("hiking", R.string.activity_type_hiking, ActivityIcon.WALK, false),
HORSE_BACK_RIDING("horse back riding", R.string.activity_type_horse_back_riding, ActivityIcon.UNKNOWN, true),
HOT_AIR_BALLOON("hot air balloon", R.string.activity_type_hot_air_balloon, ActivityIcon.UNKNOWN, true),
ICE_SAILING("ice sailing", R.string.activity_type_ice_sailing, ActivityIcon.UNKNOWN, true),
INLINE_SKATING("inline skating", R.string.activity_type_inline_skating, ActivityIcon.INLINE_SKATING, true),
KAYAKING("kayaking", R.string.activity_type_kayaking, ActivityIcon.KAYAK, true),
KITE_SURFING("kite surfing", R.string.activity_type_kite_surfing, ActivityIcon.UNKNOWN, true),
LAND_SAILING("land sailing", R.string.activity_type_land_sailing, ActivityIcon.UNKNOWN, true),
MIXED_TYPE("mixed type", R.string.activity_type_mixed_type, ActivityIcon.UNKNOWN, true),
MOTOR_BIKE("motor bike", R.string.activity_type_motor_bike, ActivityIcon.MOTOR_BIKE, true),
MOTOR_BOATING("motor boating", R.string.activity_type_motor_boating, ActivityIcon.BOAT, true),
MOUNTAIN_BIKING("mountain biking", R.string.activity_type_mountain_biking, ActivityIcon.MOUNTAIN_BIKE, true),
OFF_TRAIL_HIKING("off trail hiking", R.string.activity_type_hiking, ActivityIcon.WALK, false),
OTHER("other", R.string.activity_type_other, ActivityIcon.UNKNOWN, true),
PADDLING("paddling", R.string.activity_type_paddling, ActivityIcon.UNKNOWN, true),
PARA_GLIDING("para gliding", R.string.activity_type_para_gliding, ActivityIcon.UNKNOWN, true),
RC_AIRPLANE("RC airplane", R.string.activity_type_rc_airplane, ActivityIcon.AIRPLANE, true),
RC_BOAT("RC boat", R.string.activity_type_rc_boat, ActivityIcon.BOAT, true),
RC_HELICOPTER("RC helicopter", R.string.activity_type_rc_helicopter, ActivityIcon.UNKNOWN, true),
RIDING("riding", R.string.activity_type_horse_back_riding, ActivityIcon.UNKNOWN, true),
ROAD_BIKING("road biking", R.string.activity_type_road_biking, ActivityIcon.BIKE, true),
ROLLER_SKIING("roller skiing", R.string.activity_type_roller_skiing, ActivityIcon.UNKNOWN, true),
ROWING("rowing", R.string.activity_type_rowing, ActivityIcon.UNKNOWN, true),
RUNNING("running", R.string.activity_type_running, ActivityIcon.RUN, false),
SAILING("sailing", R.string.activity_type_sailing, ActivityIcon.SAILING, true),
SEAPLANE("seaplane", R.string.activity_type_seaplane, ActivityIcon.AIRPLANE, true),
SKATE_BOARDING("skate boarding", R.string.activity_type_skate_boarding, ActivityIcon.SKATE_BOARDING, true),
SKATING("skating", R.string.activity_type_skating, ActivityIcon.UNKNOWN, true),
SKIING("skiing", R.string.activity_type_skiing, ActivityIcon.SKI, true),
SKY_JUMPING("sky jumping", R.string.activity_type_sky_jumping, ActivityIcon.UNKNOWN, true),
SLED("sled", R.string.activity_type_sled, ActivityIcon.UNKNOWN, true),
SNOW_BOARDING("snow boarding", R.string.activity_type_snow_boarding, ActivityIcon.SNOW_BOARDING, true),
SNOW_SHOEING("snow shoeing", R.string.activity_type_snow_shoeing, ActivityIcon.UNKNOWN, true),
SPEED_WALKING("speed walking", R.string.activity_type_speed_walking, ActivityIcon.WALK, false),
STREET_RUNNING("street running", R.string.activity_type_street_running, ActivityIcon.RUN, false),
SURFING("surfing", R.string.activity_type_surfing, ActivityIcon.UNKNOWN, true),
TRACK_CYCLING("track cycling", R.string.activity_type_track_cycling, ActivityIcon.BIKE, true),
TRACK_RUNNING("track running", R.string.activity_type_trail_running, ActivityIcon.RUN, false),
TRAIL_HIKING("trail hiking", R.string.activity_type_trail_hiking, ActivityIcon.WALK, false),
TRAIL_RUNNING("trail running", R.string.activity_type_trail_running, ActivityIcon.RUN, false),
TRAIN("train", R.string.activity_type_train, ActivityIcon.UNKNOWN, true),
ULTIMATE_FRISBEE("ultimate frisbee", R.string.activity_type_ultimate_frisbee, ActivityIcon.UNKNOWN, true),
WAKEBOARDING("wakeboarding", R.string.activity_type_wakeboarding, ActivityIcon.UNKNOWN, true),
WALKING("walking", R.string.activity_type_walking, ActivityIcon.WALK, false),
WATER_SKIING("water skiing", R.string.activity_type_water_skiing, ActivityIcon.UNKNOWN, true),
WIND_SURFING("wind surfing", R.string.activity_type_wind_surfing, ActivityIcon.UNKNOWN, true),
SWIMMING("swimming", R.string.activity_type_swimming, ActivityIcon.SWIMMING, false),
SWIMMING_OPEN("swimming in open water", R.string.activity_type_swimming_open, ActivityIcon.SWIMMING_OPEN, false),
WORKOUT("workout", R.string.activity_type_workout, ActivityIcon.WORKOUT, false),
UNKNOWN("unknown", R.string.activity_type_unknown, ActivityIcon.UNKNOWN, true);
final String id;
final ActivityIcon icon;
final boolean showSpeedPreferred; final boolean showSpeedPreferred;
final int[] localizedStringIds; final int localizedStringId;
//isSpeed? ActivityType(String id, int localizedStringId, ActivityIcon icon, boolean showSpeedPreferred) {
this.id = id;
ActivityType(String iconId, int iconDrawableId, boolean showSpeedPreferred, int... localizedStringIds) { this.localizedStringId = localizedStringId;
this.iconId = iconId; this.icon = icon;
this.iconDrawableId = iconDrawableId;
this.showSpeedPreferred = showSpeedPreferred; this.showSpeedPreferred = showSpeedPreferred;
this.localizedStringIds = localizedStringIds;
} }
public String getId() {
return id;
}
@Deprecated
public String getIconId() { public String getIconId() {
return iconId; return icon.iconId;
} }
public int getIconDrawableId() { public int getIconDrawableId() {
return iconDrawableId; return icon.iconDrawableId;
}
public int getLocalizedStringId() {
return localizedStringId;
} }
public boolean isShowSpeedPreferred() { public boolean isShowSpeedPreferred() {
return showSpeedPreferred; return showSpeedPreferred;
} }
public int[] getLocalizedStringIds() {
return localizedStringIds;
}
public int getFirstLocalizedStringId() {
return localizedStringIds[0];
}
public static List<String> getLocalizedStrings(Context context) { public static List<String> getLocalizedStrings(Context context) {
List<String> result = new ArrayList<>(); return Arrays.stream(values())
for (ActivityType activityType : values()) { .map(ActivityType::getLocalizedStringId)
List<String> strings = Arrays.stream(activityType.localizedStringIds) .map(context::getString)
.mapToObj(context::getString) .collect(Collectors.toList());
.collect(Collectors.toList());
result.addAll(strings);
}
return result;
} }
@NonNull @NonNull
public static ActivityType findBy(String iconId) { public static ActivityType findBy(String iconId) {
if (ActivityIcon.UNKNOWN.iconId.equals(iconId)) {
return ActivityType.UNKNOWN;
}
return Arrays.stream(ActivityType.values()).filter( return Arrays.stream(ActivityType.values()).filter(
it -> it.getIconId().equals(iconId) it -> it.icon.iconId.equals(iconId)
).findFirst() ).findFirst()
.orElse(ActivityType.UNKNOWN); .orElse(ActivityType.UNKNOWN);
} }
@@ -94,10 +142,8 @@ public enum ActivityType {
public static ActivityType findByLocalizedString(Resources resources, String localizedActivityType) { public static ActivityType findByLocalizedString(Resources resources, String localizedActivityType) {
return Arrays.stream(ActivityType.values()) return Arrays.stream(ActivityType.values())
.filter( .filter(it -> resources.getString(it.getLocalizedStringId()).equals(localizedActivityType))
it -> Arrays.stream(it.getLocalizedStringIds()) .findFirst()
.anyMatch(id -> resources.getString(id).equals(localizedActivityType))
).findFirst()
.orElse(ActivityType.UNKNOWN); .orElse(ActivityType.UNKNOWN);
} }
} }
@@ -13,43 +13,65 @@ import androidx.fragment.app.DialogFragment;
import androidx.fragment.app.FragmentManager; import androidx.fragment.app.FragmentManager;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.R;
import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.ActivityType;
import de.dennisguse.opentracks.databinding.ChooseActivityTypeBinding; import de.dennisguse.opentracks.databinding.ChooseActivityTypeBinding;
/**
* A DialogFragment to choose an activity type.
*/
public class ChooseActivityTypeDialogFragment extends DialogFragment implements AdapterView.OnItemClickListener { public class ChooseActivityTypeDialogFragment extends DialogFragment implements AdapterView.OnItemClickListener {
private static final String CHOOSE_ACTIVITY_TYPE_DIALOG_TAG = "chooseActivityType"; private static final String CHOOSE_ACTIVITY_TYPE_DIALOG_TAG = "chooseActivityType";
public static void showDialog(FragmentManager fragmentManager, String preselectedCategory) { @Deprecated
new ChooseActivityTypeDialogFragment(preselectedCategory).show(fragmentManager, ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG); public static void showDialog(FragmentManager fragmentManager, Context context, String activityTypeLocalized) {
ActivityType activityType = ActivityType.findByLocalizedString(context, activityTypeLocalized);
showDialog(fragmentManager, activityType);
} }
private static int getPosition(Context context, String category) { public static void showDialog(FragmentManager fragmentManager, ActivityType activityType) {
if (category == null) { new ChooseActivityTypeDialogFragment(activityType).show(fragmentManager, ChooseActivityTypeDialogFragment.CHOOSE_ACTIVITY_TYPE_DIALOG_TAG);
}
private static final List<ActivityType> activityTypes = List.of(
ActivityType.UNKNOWN,
ActivityType.AIRPLANE,
ActivityType.BIKING,
ActivityType.MOUNTAIN_BIKING,
ActivityType.MOTOR_BIKE,
ActivityType.KAYAKING,
ActivityType.BOAT,
ActivityType.SAILING,
ActivityType.DRIVING,
ActivityType.RUNNING,
ActivityType.SNOW_BOARDING,
ActivityType.SKIING,
ActivityType.WALKING,
ActivityType.ESCOOTER,
ActivityType.INLINE_SKATING,
ActivityType.SKATE_BOARDING,
ActivityType.CLIMBING,
ActivityType.SWIMMING,
ActivityType.SWIMMING_OPEN,
ActivityType.WORKOUT
);
private static int getPosition(Context context, ActivityType activityType) {
if (activityType == null) {
return -1; return -1;
} }
String iconValue = ActivityType.findByLocalizedString(context, category)
.getIconId();
return getAllActivityTypeIds().indexOf(iconValue); return activityTypes.indexOf(activityType);
} }
private ChooseActivityTypeBinding viewBinding; private ChooseActivityTypeBinding viewBinding;
private final String preselectedCategory; private final ActivityType preselectedActivityType;
private ChooseActivityTypeCaller chooseActivityTypeCaller; private ChooseActivityTypeCaller chooseActivityTypeCaller;
private ChooseActivityTypeDialogFragment(String preselectedCategory) { private ChooseActivityTypeDialogFragment(ActivityType activityType) {
this.preselectedCategory = preselectedCategory; this.preselectedActivityType = activityType;
} }
@NonNull @NonNull
@@ -65,13 +87,12 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false); viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false);
List<Integer> iconDrawableIds = new ArrayList<>(); List<Integer> iconDrawableIds = new ArrayList<>();
for (String iconValue : getAllActivityTypeIds()) { for (ActivityType activityType : activityTypes) {
iconDrawableIds.add(ActivityType.findBy(iconValue) iconDrawableIds.add(activityType.getIconDrawableId());
.getIconDrawableId());
} }
final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(iconDrawableIds); final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(iconDrawableIds);
int position = getPosition(getContext(), preselectedCategory); int position = getPosition(getContext(), preselectedActivityType);
if (position != -1) { if (position != -1) {
imageAdapter.setSelected(position); imageAdapter.setSelected(position);
} }
@@ -98,17 +119,10 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
@Override @Override
public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) { public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
chooseActivityTypeCaller.onChooseActivityTypeDone(ActivityType.findBy(getAllActivityTypeIds().get(position))); chooseActivityTypeCaller.onChooseActivityTypeDone(activityTypes.get(position));
dismiss(); dismiss();
} }
// TODO Return List<ActivityType>
public static List<String> getAllActivityTypeIds() {
return Arrays.stream(ActivityType.values())
.map(ActivityType::getIconId)
.collect(Collectors.toList());
}
/** /**
* Interface for chooseActivityTypeCaller of this dialog fragment. * Interface for chooseActivityTypeCaller of this dialog fragment.
*/ */
@@ -90,7 +90,7 @@ public class StatisticsRecordedFragment extends Fragment {
if (PreferencesUtils.isKey(R.string.stats_rate_key, key) && track != null) { if (PreferencesUtils.isKey(R.string.stats_rate_key, key) && track != null) {
updateUInecessary = true; updateUInecessary = true;
preferenceReportSpeed = PreferencesUtils.isReportSpeed(track.getActivityTypeLocalized()); preferenceReportSpeed = PreferencesUtils.isReportSpeed(track);
} }
if (key != null && updateUInecessary && isResumed()) { if (key != null && updateUInecessary && isResumed()) {
@@ -72,9 +72,9 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang
onNewTrackPoint(segmentStartTrackPoint); onNewTrackPoint(segmentStartTrackPoint);
String category = PreferencesUtils.getDefaultActivityTypeLocalized(); String activityTypeLocalized = PreferencesUtils.getDefaultActivityTypeLocalized();
track.setActivityTypeLocalized(category); track.setActivityTypeLocalized(activityTypeLocalized);
track.setActivityType(ActivityType.findByLocalizedString(context, category)); track.setActivityType(ActivityType.findByLocalizedString(context, activityTypeLocalized));
track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics()); track.setTrackStatistics(trackStatisticsUpdater.getTrackStatistics());
//TODO Pass TrackPoint //TODO Pass TrackPoint
track.setName(TrackNameUtils.getTrackName(context, trackId, track.getStartTime())); track.setName(TrackNameUtils.getTrackName(context, trackId, track.getStartTime()));
@@ -182,7 +182,7 @@ public class VoiceAnnouncement {
sensorStatistics = contentProviderUtils.getSensorStats(track.getId()); sensorStatistics = contentProviderUtils.getSensorStats(track.getId());
} }
Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track.getActivityTypeLocalized()), lastInterval, sensorStatistics); Spannable announcement = VoiceAnnouncementUtils.getAnnouncement(context, track.getTrackStatistics(), PreferencesUtils.getUnitSystem(), PreferencesUtils.isReportSpeed(track), lastInterval, sensorStatistics);
if (announcement.length() > 0) { if (announcement.length() > 0) {
// We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called. // We don't care about the utterance id. It is supplied here to force onUtteranceCompleted to be called.
@@ -77,8 +77,8 @@ public class ActivityTypePreference extends DialogPreference {
final Context context = getActivity(); final Context context = getActivity();
textView = view.findViewById(R.id.activity_type_preference_text_view); textView = view.findViewById(R.id.activity_type_preference_text_view);
String category = PreferencesUtils.getDefaultActivityTypeLocalized(); String activityTypeLocalized = PreferencesUtils.getDefaultActivityTypeLocalized();
textView.setText(category); textView.setText(activityTypeLocalized);
ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context)); ArrayAdapter<String> adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context));
textView.setAdapter(adapter); textView.setAdapter(adapter);
textView.setOnItemClickListener((parent, v, position, id) -> { textView.setOnItemClickListener((parent, v, position, id) -> {
@@ -97,12 +97,12 @@ public class ActivityTypePreference extends DialogPreference {
iconView = view.findViewById(R.id.activity_type_preference_spinner); iconView = view.findViewById(R.id.activity_type_preference_spinner);
iconView.setOnClickListener((it) -> showIconSelectDialog()); iconView.setOnClickListener((it) -> showIconSelectDialog());
updateIcon(ActivityType.findByLocalizedString(context, category)); updateIcon(ActivityType.findByLocalizedString(context, activityTypeLocalized));
} }
private void showIconSelectDialog() { private void showIconSelectDialog() {
String category = PreferencesUtils.getDefaultActivityTypeLocalized(); String category = PreferencesUtils.getDefaultActivityTypeLocalized();
ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), category); ChooseActivityTypeDialogFragment.showDialog(getActivity().getSupportFragmentManager(), getContext(), category);
} }
@Override @Override
@@ -118,7 +118,7 @@ public class ActivityTypePreference extends DialogPreference {
public void updateUI(ActivityType activityType) { public void updateUI(ActivityType activityType) {
updateIcon(activityType); updateIcon(activityType);
textView.setText(getActivity().getString(activityType.getFirstLocalizedStringId())); textView.setText(getActivity().getString(activityType.getLocalizedStringId()));
textView.clearFocus(); textView.clearFocus();
} }
@@ -46,6 +46,7 @@ import de.dennisguse.opentracks.data.models.DistanceFormatter;
import de.dennisguse.opentracks.data.models.HeartRate; import de.dennisguse.opentracks.data.models.HeartRate;
import de.dennisguse.opentracks.data.models.HeartRateZones; import de.dennisguse.opentracks.data.models.HeartRateZones;
import de.dennisguse.opentracks.data.models.Speed; import de.dennisguse.opentracks.data.models.Speed;
import de.dennisguse.opentracks.data.models.Track;
import de.dennisguse.opentracks.io.file.TrackFileFormat; import de.dennisguse.opentracks.io.file.TrackFileFormat;
import de.dennisguse.opentracks.io.file.TrackFilenameGenerator; import de.dennisguse.opentracks.io.file.TrackFilenameGenerator;
import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils; import de.dennisguse.opentracks.ui.customRecordingLayout.CsvLayoutUtils;
@@ -233,17 +234,21 @@ public class PreferencesUtils {
} }
} }
public static boolean isReportSpeed(String category) { public static boolean isReportSpeed(String activityTypeLocalized) {
final String STATS_RATE_DEFAULT = resources.getString(R.string.stats_rate_default); final String STATS_RATE_DEFAULT = resources.getString(R.string.stats_rate_default);
String currentStatsRate = getString(R.string.stats_rate_key, STATS_RATE_DEFAULT); String currentStatsRate = getString(R.string.stats_rate_key, STATS_RATE_DEFAULT);
if (currentStatsRate.equals(getString(R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) { if (currentStatsRate.equals(getString(R.string.stats_rate_speed_or_pace_default, STATS_RATE_DEFAULT))) {
return ActivityType.findByLocalizedString(resources, category) return ActivityType.findByLocalizedString(resources, activityTypeLocalized)
.isShowSpeedPreferred(); .isShowSpeedPreferred();
} }
return currentStatsRate.equals(resources.getString(R.string.stats_rate_speed)); return currentStatsRate.equals(resources.getString(R.string.stats_rate_speed));
} }
public static boolean isReportSpeed(Track track) {
return isReportSpeed(track.getActivityTypeLocalized());
}
private static String getBluetoothSensorAddressNone() { private static String getBluetoothSensorAddressNone() {
return resources.getString(R.string.sensor_type_value_none); return resources.getString(R.string.sensor_type_value_none);
} }
@@ -25,7 +25,7 @@ public class AggregatedStatistics {
dataList.addAll(dataMap.values()); dataList.addAll(dataMap.values());
dataList.sort((o1, o2) -> { dataList.sort((o1, o2) -> {
if (o1.getCountTracks() == o2.getCountTracks()) { if (o1.getCountTracks() == o2.getCountTracks()) {
return o1.getActivityType().compareTo(o2.getActivityType()); return o1.getActivityTypeLocalized().compareTo(o2.getActivityTypeLocalized());
} }
return (o1.getCountTracks() < o2.getCountTracks() ? 1 : -1); return (o1.getCountTracks() < o2.getCountTracks() ? 1 : -1);
}); });
@@ -33,11 +33,11 @@ public class AggregatedStatistics {
@VisibleForTesting @VisibleForTesting
public void aggregate(@NonNull Track track) { public void aggregate(@NonNull Track track) {
String activityType = track.getActivityTypeLocalized(); String activityTypeLocalized = track.getActivityTypeLocalized();
if (dataMap.containsKey(activityType)) { if (dataMap.containsKey(activityTypeLocalized)) {
dataMap.get(activityType).add(track.getTrackStatistics()); dataMap.get(activityTypeLocalized).add(track.getTrackStatistics());
} else { } else {
dataMap.put(activityType, new AggregatedStatistic(activityType, track.getTrackStatistics())); dataMap.put(activityTypeLocalized, new AggregatedStatistic(activityTypeLocalized, track.getTrackStatistics()));
} }
} }
@@ -54,17 +54,17 @@ public class AggregatedStatistics {
} }
public static class AggregatedStatistic { public static class AggregatedStatistic {
private final String activityType; private final String activityTypeLocalized;
private final TrackStatistics trackStatistics; private final TrackStatistics trackStatistics;
private int countTracks = 1; private int countTracks = 1;
public AggregatedStatistic(String activityType, TrackStatistics trackStatistics) { public AggregatedStatistic(String activityTypeLocalized, TrackStatistics trackStatistics) {
this.activityType = activityType; this.activityTypeLocalized = activityTypeLocalized;
this.trackStatistics = trackStatistics; this.trackStatistics = trackStatistics;
} }
public String getActivityType() { public String getActivityTypeLocalized() {
return activityType; return activityTypeLocalized;
} }
public TrackStatistics getTrackStatistics() { public TrackStatistics getTrackStatistics() {
@@ -64,7 +64,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
} }
Resources resources = context.getResources(); Resources resources = context.getResources();
String localizedActivityType = aggregatedStatistic.getActivityType(); String localizedActivityType = aggregatedStatistic.getActivityTypeLocalized();
if (ActivityType.findByLocalizedString(resources, localizedActivityType) if (ActivityType.findByLocalizedString(resources, localizedActivityType)
.isShowSpeedPreferred()) { .isShowSpeedPreferred()) {
viewHolder.setSpeed(aggregatedStatistic); viewHolder.setSpeed(aggregatedStatistic);
@@ -84,7 +84,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
public List<String> getCategories() { public List<String> getCategories() {
List<String> categories = new ArrayList<>(); List<String> categories = new ArrayList<>();
for (int i = 0; i < aggregatedStatistics.getCount(); i++) { for (int i = 0; i < aggregatedStatistics.getCount(); i++) {
categories.add(aggregatedStatistics.getItem(i).getActivityType()); categories.add(aggregatedStatistics.getItem(i).getActivityTypeLocalized());
} }
return categories; return categories;
} }
@@ -163,7 +163,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
//TODO Check preference handling. //TODO Check preference handling.
private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { private void setCommonValues(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
String activityType = aggregatedStatistic.getActivityType(); String activityType = aggregatedStatistic.getActivityTypeLocalized();
reportSpeed = PreferencesUtils.isReportSpeed(activityType); reportSpeed = PreferencesUtils.isReportSpeed(activityType);
unitSystem = PreferencesUtils.getUnitSystem(); unitSystem = PreferencesUtils.getUnitSystem();
@@ -182,7 +182,7 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
} }
private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
String localizedActivityType = aggregatedStatistic.getActivityType(); String localizedActivityType = aggregatedStatistic.getActivityTypeLocalized();
String iconValue = ActivityType.findByLocalizedString(context, localizedActivityType) String iconValue = ActivityType.findByLocalizedString(context, localizedActivityType)
.getIconId(); .getIconId();
return ActivityType.findBy(iconValue) return ActivityType.findBy(iconValue)
@@ -151,7 +151,7 @@ public class IntervalsFragment extends Fragment {
ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext()); ContentProviderUtils contentProviderUtils = new ContentProviderUtils(getContext());
Track track = contentProviderUtils.getTrack(trackId); Track track = contentProviderUtils.getTrack(trackId);
if (track != null) { if (track != null) {
isReportSpeed = PreferencesUtils.isReportSpeed(track.getActivityTypeLocalized()); isReportSpeed = PreferencesUtils.isReportSpeed(track);
} }
viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class); viewModel = new ViewModelProvider(getActivity()).get(IntervalStatisticsModel.class);