From 8cc4fd1d4f30c0679d61ca2ce9efa7c4461c8d5c Mon Sep 17 00:00:00 2001 From: Dennis Guse Date: Fri, 27 Jan 2023 20:27:10 +0100 Subject: [PATCH] Bugfix: not all activityTypes were shown in dropdownlist. --- .../opentracks/TrackEditActivity.java | 3 +- .../opentracks/TrackStoppedActivity.java | 3 +- .../opentracks/data/models/ActivityType.java | 71 +++++++++++------ .../settings/ActivityTypePreference.java | 3 +- .../opentracks/util/TrackIconUtils.java | 78 +++---------------- src/main/res/values/settings.xml | 69 ---------------- 6 files changed, 66 insertions(+), 161 deletions(-) diff --git a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java index 17fed559d..6ea2453b9 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackEditActivity.java @@ -24,6 +24,7 @@ import android.widget.ArrayAdapter; import androidx.annotation.NonNull; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.Track; import de.dennisguse.opentracks.databinding.TrackEditBinding; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; @@ -75,7 +76,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit viewBinding.fields.trackEditActivityType.setText(track.getCategory()); - ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.activity_types, android.R.layout.simple_dropdown_item_1line); + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); viewBinding.fields.trackEditActivityType.setAdapter(adapter); viewBinding.fields.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.fields.trackEditActivityType.getAdapter().getItem(position)))); viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> { diff --git a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java index 762e004ea..b4403ce30 100644 --- a/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java +++ b/src/main/java/de/dennisguse/opentracks/TrackStoppedActivity.java @@ -8,6 +8,7 @@ import android.view.View; import android.widget.ArrayAdapter; import de.dennisguse.opentracks.data.ContentProviderUtils; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.DistanceFormatter; import de.dennisguse.opentracks.data.models.SpeedFormatter; import de.dennisguse.opentracks.data.models.Track; @@ -51,7 +52,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements viewBinding.trackEditActivityType.setText(track.getCategory()); - ArrayAdapter adapter = ArrayAdapter.createFromResource(this, R.array.activity_types, android.R.layout.simple_dropdown_item_1line); + ArrayAdapter adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); viewBinding.trackEditActivityType.setAdapter(adapter); viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.trackEditActivityType.getAdapter().getItem(position)))); viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> { diff --git a/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java b/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java index 01875e507..6cd2f0c59 100644 --- a/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java +++ b/src/main/java/de/dennisguse/opentracks/data/models/ActivityType.java @@ -1,39 +1,48 @@ package de.dennisguse.opentracks.data.models; +import android.content.Context; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.stream.Collectors; + import de.dennisguse.opentracks.R; public enum ActivityType { - AIRPLANE("AIRPLANE", R.drawable.ic_activity_flight_24dp, 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, 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, R.string.activity_type_mountain_biking), - MOTOR_BIKE("MOTOR_BIKE", R.drawable.ic_activity_motorbike_24dp, R.string.activity_type_motor_bike), - KAYAK("KAYAK", R.drawable.ic_activity_kayaking_24dp, R.string.activity_type_kayaking), - BOAT("BOAT", R.drawable.ic_activity_boat_24dp, 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, R.string.activity_type_sailing), - DRIVE("DRIVE", R.drawable.ic_activity_drive_24dp, 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, 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, R.string.activity_type_cross_country_skiing, R.string.activity_type_skiing), - SNOW_BOARDING("SNOW_BOARDING", R.drawable.ic_activity_snowboarding_24dp, R.string.activity_type_snow_boarding), - UNKNOWN("UNKNOWN", R.drawable.ic_logo_24dp, R.string.activity_type_unknown), - WALK("WALK", R.drawable.ic_activity_walk_24dp, 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, R.string.activity_type_escooter), - INLINE_SKATING("INLINES_SKATING", R.drawable.ic_activity_inline_skating_24dp, R.string.activity_type_inline_skating), - SKATE_BOARDING("SKATE_BOARDING", R.drawable.ic_activity_skateboarding_24dp, R.string.activity_type_skate_boarding), - CLIMBING("CLIMBING", R.drawable.ic_activity_climbing_24dp, R.string.activity_type_climbing), - SWIMMING("SWIMMING", R.drawable.ic_activity_swimming_24dp, R.string.activity_type_swimming), - SWIMMING_OPEN("SWIMMING_OPEN", R.drawable.ic_activity_swimming_open_24dp, R.string.activity_type_swimming_open), - WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, R.string.activity_type_workout); + 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 id; - final int[] localizedStringIds; final int iconId; + final boolean showSpeedPreferred; + final int[] localizedStringIds; //isSpeed? - ActivityType(java.lang.String id, int iconId, int... localizedStringIds) { + ActivityType(String id, int iconId, boolean showSpeedPreferred, int... localizedStringIds) { this.id = id; - this.localizedStringIds = localizedStringIds; this.iconId = iconId; + this.showSpeedPreferred = showSpeedPreferred; + this.localizedStringIds = localizedStringIds; } public String getId() { @@ -44,6 +53,10 @@ public enum ActivityType { return iconId; } + public boolean isShowSpeedPreferred() { + return showSpeedPreferred; + } + public int[] getLocalizedStringIds() { return localizedStringIds; } @@ -51,4 +64,16 @@ public enum ActivityType { public int getFirstLocalizedStringId() { return localizedStringIds[0]; } + + public static List getLocalizedStrings(Context context) { + List result = new ArrayList<>(); + for (ActivityType activityType : values()) { + List strings = Arrays.stream(activityType.localizedStringIds) + .mapToObj(context::getString) + .collect(Collectors.toList()); + result.addAll(strings); + } + + return result; + } } diff --git a/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java b/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java index 50ff9b772..5eb1a2225 100644 --- a/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java +++ b/src/main/java/de/dennisguse/opentracks/settings/ActivityTypePreference.java @@ -28,6 +28,7 @@ import androidx.preference.DialogPreference; import androidx.preference.PreferenceDialogFragmentCompat; import de.dennisguse.opentracks.R; +import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.fragments.ChooseActivityTypeDialogFragment; import de.dennisguse.opentracks.util.TrackIconUtils; @@ -79,7 +80,7 @@ public class ActivityTypePreference extends DialogPreference { textView = view.findViewById(R.id.activity_type_preference_text_view); String category = PreferencesUtils.getDefaultActivity(); textView.setText(category); - ArrayAdapter adapter = ArrayAdapter.createFromResource(context, R.array.activity_types, android.R.layout.simple_dropdown_item_1line); + ArrayAdapter adapter = new ArrayAdapter<>(context, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(context)); textView.setAdapter(adapter); textView.setOnItemClickListener((parent, v, position, id) -> { String iconValue = TrackIconUtils.getIconValue(context, (String) textView.getAdapter().getItem(position)); diff --git a/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java b/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java index b38843061..38c9eb65d 100644 --- a/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java +++ b/src/main/java/de/dennisguse/opentracks/util/TrackIconUtils.java @@ -26,7 +26,6 @@ import java.util.List; import java.util.Optional; import java.util.stream.Collectors; -import de.dennisguse.opentracks.R; import de.dennisguse.opentracks.data.models.ActivityType; /** @@ -36,49 +35,6 @@ import de.dennisguse.opentracks.data.models.ActivityType; */ public class TrackIconUtils { - // List of icons whose sports associated use speed (in km/h or mi/h). - private static final int[] SPEED_ICON = { - // Unknown. - R.string.activity_type_unknown, - // All airplane categories. - R.string.activity_type_airplane, R.string.activity_type_commercial_airplane, R.string.activity_type_rc_airplane, - // All bike categories. - R.string.activity_type_biking, R.string.activity_type_cycling, R.string.activity_type_dirt_bike, R.string.activity_type_motor_bike, R.string.activity_type_mountain_biking, R.string.activity_type_road_biking, R.string.activity_type_track_cycling, R.string.activity_type_inline_skating, - // All boat categories. - R.string.activity_type_boat, R.string.activity_type_ferry, R.string.activity_type_motor_boating, R.string.activity_type_rc_boat, R.string.activity_type_sailing, R.string.activity_type_kayaking, - // All drive categories. - R.string.activity_type_atv, R.string.activity_type_driving, R.string.activity_type_driving_bus, R.string.activity_type_driving_car, R.string.activity_type_escooter, R.string.activity_type_skate_boarding, - // All wintersport categories - R.string.activity_type_skiing, R.string.activity_type_snow_boarding - }; - - private static final List MAP = List.of( - //Reflects order in ChooseActivityTypeDialogFragmentActivity - ActivityType.UNKNOWN, - ActivityType.RUN, - ActivityType.WALK, - ActivityType.CLIMBING, - ActivityType.SKATE_BOARDING, - ActivityType.INLINE_SKATING, - ActivityType.SNOW_BOARDING, - ActivityType.SKI, - ActivityType.ESCOOTER, - ActivityType.BIKE, - ActivityType.MOUNTAIN_BIKE, - ActivityType.MOTOR_BIKE, - ActivityType.DRIVE, - ActivityType.AIRPLANE, - ActivityType.KAYAK, - ActivityType.BOAT, - ActivityType.SAILING, - ActivityType.SWIMMING, - ActivityType.SWIMMING_OPEN, - ActivityType.WORKOUT - ); - - private TrackIconUtils() { - } - public static int getIconDrawable(String activityTypeId) { Optional found = Arrays.stream(ActivityType.values()).filter( it -> it.getId().equals(activityTypeId) @@ -132,28 +88,18 @@ public class TrackIconUtils { return selected.get().getId(); } - /** - * Returns true if the activity type is in the list. - * - * @param context the context - * @param activityType the activity type - * @param list the list - */ - private static boolean inList(Resources context, String activityType, int[] list) { - for (int i : list) { - if (context.getString(i).equals(activityType)) { - return true; - } - } - return false; - } + public static boolean isSpeedIcon(Resources resources, String activityTypeId) { + Optional selected = Arrays.stream(ActivityType.values()) + .filter( + it -> Arrays.stream(it.getLocalizedStringIds()) + .anyMatch(id -> resources.getString(id).equals(activityTypeId)) + ) + .findFirst(); - /** - * Returns true if category is in the SPEED_ICON array. Otherwise returns false. - * - * @param category the name of the category, activity type. - */ - public static boolean isSpeedIcon(Resources resources, String category) { - return inList(resources, category, SPEED_ICON); + if (selected.isEmpty()) { + return false; + } + + return selected.get().isShowSpeedPreferred(); } } diff --git a/src/main/res/values/settings.xml b/src/main/res/values/settings.xml index b7e6abb86..9c0238d3f 100644 --- a/src/main/res/values/settings.xml +++ b/src/main/res/values/settings.xml @@ -64,75 +64,6 @@ defaultActivity @string/activity_type_unknown - - @string/default_activity_default - - @string/activity_type_airplane - @string/activity_type_atv - @string/activity_type_biking - @string/activity_type_blimp - @string/activity_type_boat - @string/activity_type_climbing - @string/activity_type_commercial_airplane - @string/activity_type_cross_country_skiing - @string/activity_type_cycling - @string/activity_type_dirt_bike - @string/activity_type_donkey_back_riding - @string/activity_type_driving - @string/activity_type_driving_bus - @string/activity_type_driving_car - @string/activity_type_ferry - @string/activity_type_frisbee - @string/activity_type_gliding - @string/activity_type_hang_gliding - @string/activity_type_helicopter - @string/activity_type_hiking - @string/activity_type_horse_back_riding - @string/activity_type_hot_air_balloon - @string/activity_type_ice_sailing - @string/activity_type_inline_skating - @string/activity_type_kayaking - @string/activity_type_kite_surfing - @string/activity_type_land_sailing - @string/activity_type_mixed_type - @string/activity_type_motor_bike - @string/activity_type_motor_boating - @string/activity_type_mountain_biking - @string/activity_type_off_trail_hiking - @string/activity_type_other - @string/activity_type_paddling - @string/activity_type_para_gliding - @string/activity_type_rc_airplane - @string/activity_type_rc_boat - @string/activity_type_rc_helicopter - @string/activity_type_riding - @string/activity_type_road_biking - @string/activity_type_roller_skiing - @string/activity_type_rowing - @string/activity_type_running - @string/activity_type_sailing - @string/activity_type_seaplane - @string/activity_type_skate_boarding - @string/activity_type_skating - @string/activity_type_skiing - @string/activity_type_sky_jumping - @string/activity_type_sled - @string/activity_type_snow_boarding - @string/activity_type_snow_shoeing - @string/activity_type_speed_walking - @string/activity_type_street_running - @string/activity_type_surfing - @string/activity_type_track_cycling - @string/activity_type_track_running - @string/activity_type_trail_hiking - @string/activity_type_trail_running - @string/activity_type_train - @string/activity_type_ultimate_frisbee - @string/activity_type_wakeboarding - @string/activity_type_walking - @string/activity_type_water_skiing - @string/activity_type_wind_surfing - recordingDistanceInterval 10