Cleanup: ActivityType lookup.

Part of #1608.
This commit is contained in:
Dennis Guse
2023-06-23 07:35:39 +02:00
parent 55cf60ef2f
commit d316a63fca
14 changed files with 79 additions and 92 deletions
@@ -40,7 +40,7 @@ public class AggregatedStatisticsTest {
statistics.setMinAltitude(1200.0); // Resulting min altitude statistics.setMinAltitude(1200.0); // Resulting min altitude
Track track = new Track(); Track track = new Track();
track.setIcon(TrackIconUtils.getIconValue(context, category)); track.setIcon(TrackIconUtils.getActivityTypeId(context, category));
track.setActivityType(category); track.setActivityType(category);
track.setTrackStatistics(statistics); track.setTrackStatistics(statistics);
return track; return track;
@@ -78,10 +78,10 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
viewBinding.fields.trackEditActivityType.setAdapter(adapter); 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.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getActivityTypeId(this, (String) viewBinding.fields.trackEditActivityType.getAdapter().getItem(position))));
viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> { viewBinding.fields.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) { if (!hasFocus) {
setActivityTypeIcon(TrackIconUtils.getIconValue( setActivityTypeIcon(TrackIconUtils.getActivityTypeId(
TrackEditActivity.this, viewBinding.fields.trackEditActivityType.getText().toString())); TrackEditActivity.this, viewBinding.fields.trackEditActivityType.getText().toString()));
} }
}); });
@@ -138,7 +138,7 @@ public class TrackEditActivity extends AbstractActivity implements ChooseActivit
private void setActivityTypeIcon(String iconValue) { private void setActivityTypeIcon(String iconValue) {
this.iconValue = iconValue; this.iconValue = iconValue;
viewBinding.fields.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue)); viewBinding.fields.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawableId(iconValue));
} }
@Override @Override
@@ -219,7 +219,7 @@ public class TrackListActivity extends AbstractTrackDeleteActivity implements Co
Track.Id trackId = new Track.Id(cursor.getLong(idIndex)); Track.Id trackId = new Track.Id(cursor.getLong(idIndex));
boolean isRecording = trackId.equals(recordingStatus.getTrackId()); boolean isRecording = trackId.equals(recordingStatus.getTrackId());
String icon = cursor.getString(iconIndex); String icon = cursor.getString(iconIndex);
int iconId = TrackIconUtils.getIconDrawable(icon); int iconId = TrackIconUtils.getIconDrawableId(icon);
String name = cursor.getString(nameIndex); String name = cursor.getString(nameIndex);
String totalTime = StringUtils.formatElapsedTime(Duration.ofMillis(cursor.getLong(totalTimeIndex))); String totalTime = StringUtils.formatElapsedTime(Duration.ofMillis(cursor.getLong(totalTimeIndex)));
String totalDistance = DistanceFormatter.Builder() String totalDistance = DistanceFormatter.Builder()
@@ -54,10 +54,10 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this)); ArrayAdapter<String> adapter = new ArrayAdapter<>(this, android.R.layout.simple_dropdown_item_1line, ActivityType.getLocalizedStrings(this));
viewBinding.trackEditActivityType.setAdapter(adapter); viewBinding.trackEditActivityType.setAdapter(adapter);
viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getIconValue(this, (String) viewBinding.trackEditActivityType.getAdapter().getItem(position)))); viewBinding.trackEditActivityType.setOnItemClickListener((parent, view, position, id) -> setActivityTypeIcon(TrackIconUtils.getActivityTypeId(this, (String) viewBinding.trackEditActivityType.getAdapter().getItem(position))));
viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> { viewBinding.trackEditActivityType.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) { if (!hasFocus) {
setActivityTypeIcon(TrackIconUtils.getIconValue( setActivityTypeIcon(TrackIconUtils.getActivityTypeId(
TrackStoppedActivity.this, viewBinding.trackEditActivityType.getText().toString())); TrackStoppedActivity.this, viewBinding.trackEditActivityType.getText().toString()));
} }
}); });
@@ -126,7 +126,7 @@ public class TrackStoppedActivity extends AbstractTrackDeleteActivity implements
} }
private void setActivityTypeIcon(String iconValue) { private void setActivityTypeIcon(String iconValue) {
viewBinding.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawable(iconValue)); viewBinding.trackEditActivityTypeIcon.setImageResource(TrackIconUtils.getIconDrawableId(iconValue));
} }
@Override @Override
@@ -100,7 +100,7 @@ public class ContentProviderUtils {
int uuidIndex = cursor.getColumnIndexOrThrow(TracksColumns.UUID); int uuidIndex = cursor.getColumnIndexOrThrow(TracksColumns.UUID);
int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME); int nameIndex = cursor.getColumnIndexOrThrow(TracksColumns.NAME);
int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION); int descriptionIndex = cursor.getColumnIndexOrThrow(TracksColumns.DESCRIPTION);
int categoryIndex = cursor.getColumnIndexOrThrow(TracksColumns.ACTIVITY_TYPE); int activityTypeIndex = cursor.getColumnIndexOrThrow(TracksColumns.ACTIVITY_TYPE);
int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME); int startTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME);
int startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET); int startTimeOffsetIndex = cursor.getColumnIndexOrThrow(TracksColumns.STARTTIME_OFFSET);
int stopTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPTIME); int stopTimeIndex = cursor.getColumnIndexOrThrow(TracksColumns.STOPTIME);
@@ -128,8 +128,8 @@ public class ContentProviderUtils {
if (!cursor.isNull(descriptionIndex)) { if (!cursor.isNull(descriptionIndex)) {
track.setDescription(cursor.getString(descriptionIndex)); track.setDescription(cursor.getString(descriptionIndex));
} }
if (!cursor.isNull(categoryIndex)) { if (!cursor.isNull(activityTypeIndex)) {
track.setActivityType(cursor.getString(categoryIndex)); track.setActivityType(cursor.getString(activityTypeIndex));
} }
if (!cursor.isNull(startTimeIndex)) { if (!cursor.isNull(startTimeIndex)) {
@@ -1,6 +1,9 @@
package de.dennisguse.opentracks.data.models; package de.dennisguse.opentracks.data.models;
import android.content.Context; import android.content.Context;
import android.content.res.Resources;
import androidx.annotation.NonNull;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
@@ -32,15 +35,15 @@ public enum ActivityType {
WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, false, R.string.activity_type_workout); WORKOUT("WORKOUT", R.drawable.ic_activity_workout_24dp, false, R.string.activity_type_workout);
final String id; final String id;
final int iconId; final int iconDrawableId;
final boolean showSpeedPreferred; final boolean showSpeedPreferred;
final int[] localizedStringIds; final int[] localizedStringIds;
//isSpeed? //isSpeed?
ActivityType(String id, int iconId, boolean showSpeedPreferred, int... localizedStringIds) { ActivityType(String id, int iconDrawableId, boolean showSpeedPreferred, int... localizedStringIds) {
this.id = id; this.id = id;
this.iconId = iconId; this.iconDrawableId = iconDrawableId;
this.showSpeedPreferred = showSpeedPreferred; this.showSpeedPreferred = showSpeedPreferred;
this.localizedStringIds = localizedStringIds; this.localizedStringIds = localizedStringIds;
} }
@@ -49,8 +52,8 @@ public enum ActivityType {
return id; return id;
} }
public int getIconId() { public int getIconDrawableId() {
return iconId; return iconDrawableId;
} }
public boolean isShowSpeedPreferred() { public boolean isShowSpeedPreferred() {
@@ -76,4 +79,25 @@ public enum ActivityType {
return result; return result;
} }
@NonNull
public static ActivityType findByActivityTypeId(String activityTypeId) {
return Arrays.stream(ActivityType.values()).filter(
it -> it.getId().equals(activityTypeId)
).findFirst()
.orElse(ActivityType.UNKNOWN);
}
public static ActivityType findByLocalizedString(Context context, String localizedActivityType) {
return findByLocalizedString(context.getResources(), localizedActivityType);
}
public static ActivityType findByLocalizedString(Resources resources, String localizedActivityType) {
return Arrays.stream(ActivityType.values())
.filter(
it -> Arrays.stream(it.getLocalizedStringIds())
.anyMatch(id -> resources.getString(id).equals(localizedActivityType))
).findFirst()
.orElse(ActivityType.UNKNOWN);
}
} }
@@ -13,9 +13,12 @@ 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.databinding.ChooseActivityTypeBinding; import de.dennisguse.opentracks.databinding.ChooseActivityTypeBinding;
import de.dennisguse.opentracks.util.TrackIconUtils; import de.dennisguse.opentracks.util.TrackIconUtils;
@@ -34,9 +37,9 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
if (category == null) { if (category == null) {
return -1; return -1;
} }
String iconValue = TrackIconUtils.getIconValue(context, category); String iconValue = TrackIconUtils.getActivityTypeId(context, category);
return TrackIconUtils.getAllIconValues().indexOf(iconValue); return getAllActivityTypeIds().indexOf(iconValue);
} }
private ChooseActivityTypeBinding viewBinding; private ChooseActivityTypeBinding viewBinding;
@@ -61,12 +64,12 @@ public class ChooseActivityTypeDialogFragment extends DialogFragment implements
public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { public View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false); viewBinding = ChooseActivityTypeBinding.inflate(inflater, container, false);
List<Integer> imageIds = new ArrayList<>(); List<Integer> iconDrawableIds = new ArrayList<>();
for (String iconValue : TrackIconUtils.getAllIconValues()) { for (String iconValue : getAllActivityTypeIds()) {
imageIds.add(TrackIconUtils.getIconDrawable(iconValue)); iconDrawableIds.add(TrackIconUtils.getIconDrawableId(iconValue));
} }
final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(imageIds); final ChooseActivityTypeImageAdapter imageAdapter = new ChooseActivityTypeImageAdapter(iconDrawableIds);
int position = getPosition(getContext(), preselectedCategory); int position = getPosition(getContext(), preselectedCategory);
if (position != -1) { if (position != -1) {
imageAdapter.setSelected(position); imageAdapter.setSelected(position);
@@ -94,10 +97,16 @@ 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(TrackIconUtils.getAllIconValues().get(position)); chooseActivityTypeCaller.onChooseActivityTypeDone(getAllActivityTypeIds().get(position));
dismiss(); dismiss();
} }
public static List<String> getAllActivityTypeIds() {
return Arrays.stream(ActivityType.values())
.map(ActivityType::getId)
.collect(Collectors.toList());
}
/** /**
* Interface for chooseActivityTypeCaller of this dialog fragment. * Interface for chooseActivityTypeCaller of this dialog fragment.
*/ */
@@ -191,8 +191,8 @@ public class StatisticsRecordedFragment extends Fragment {
// Set activity type // Set activity type
{ {
String trackIconValue = TrackIconUtils.getIconValue(getContext(), track.getActivityType()); String trackIconValue = TrackIconUtils.getActivityTypeId(getContext(), track.getActivityType());
viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), TrackIconUtils.getIconDrawable(trackIconValue))); viewBinding.statsActivityTypeIcon.setImageDrawable(ContextCompat.getDrawable(getContext(), TrackIconUtils.getIconDrawableId(trackIconValue)));
} }
// Set time and start datetime // Set time and start datetime
@@ -107,7 +107,7 @@ public class TrackImporter {
track.setActivityType(activityType); track.setActivityType(activityType);
if (icon == null) { if (icon == null) {
icon = TrackIconUtils.getIconValue(context, activityType); icon = TrackIconUtils.getActivityTypeId(context, activityType);
} }
} }
@@ -74,7 +74,7 @@ class TrackRecordingManager implements SharedPreferences.OnSharedPreferenceChang
String category = PreferencesUtils.getDefaultActivity(); String category = PreferencesUtils.getDefaultActivity();
track.setActivityType(category); track.setActivityType(category);
track.setIcon(TrackIconUtils.getIconValue(context, category)); track.setIcon(TrackIconUtils.getActivityTypeId(context, category));
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()));
@@ -83,12 +83,12 @@ public class ActivityTypePreference extends DialogPreference {
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) -> {
String iconValue = TrackIconUtils.getIconValue(context, (String) textView.getAdapter().getItem(position)); String iconValue = TrackIconUtils.getActivityTypeId(context, (String) textView.getAdapter().getItem(position));
updateIcon(iconValue); updateIcon(iconValue);
}); });
textView.setOnFocusChangeListener((v, hasFocus) -> { textView.setOnFocusChangeListener((v, hasFocus) -> {
if (!hasFocus) { if (!hasFocus) {
String iconValue = TrackIconUtils.getIconValue(context, textView.getText().toString()); String iconValue = TrackIconUtils.getActivityTypeId(context, textView.getText().toString());
updateIcon(iconValue); updateIcon(iconValue);
} }
}); });
@@ -96,7 +96,7 @@ 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(TrackIconUtils.getIconValue(context, category)); updateIcon(TrackIconUtils.getActivityTypeId(context, category));
} }
private void showIconSelectDialog() { private void showIconSelectDialog() {
@@ -122,7 +122,7 @@ public class ActivityTypePreference extends DialogPreference {
} }
private void updateIcon(String iconValue) { private void updateIcon(String iconValue) {
iconView.setImageResource(TrackIconUtils.getIconDrawable(iconValue)); iconView.setImageResource(TrackIconUtils.getIconDrawableId(iconValue));
} }
} }
} }
@@ -178,8 +178,8 @@ public class AggregatedStatisticsAdapter extends BaseAdapter {
} }
private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) { private int getIcon(AggregatedStatistics.AggregatedStatistic aggregatedStatistic) {
String iconValue = TrackIconUtils.getIconValue(context, aggregatedStatistic.getActivityType()); String iconValue = TrackIconUtils.getActivityTypeId(context, aggregatedStatistic.getActivityType());
return TrackIconUtils.getIconDrawable(iconValue); return TrackIconUtils.getIconDrawableId(iconValue);
} }
} }
} }
@@ -21,11 +21,6 @@ import android.content.res.Resources;
import androidx.annotation.NonNull; import androidx.annotation.NonNull;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import de.dennisguse.opentracks.data.models.ActivityType; import de.dennisguse.opentracks.data.models.ActivityType;
/** /**
@@ -35,65 +30,24 @@ import de.dennisguse.opentracks.data.models.ActivityType;
*/ */
public class TrackIconUtils { public class TrackIconUtils {
public static int getIconDrawable(String activityTypeId) { public static int getIconDrawableId(String activityTypeId) {
Optional<ActivityType> found = Arrays.stream(ActivityType.values()).filter( return ActivityType.findByActivityTypeId(activityTypeId)
it -> it.getId().equals(activityTypeId) .getIconDrawableId();
).findFirst();
return found.map(ActivityType::getIconId)
.orElseGet(ActivityType.UNKNOWN::getIconId);
} }
public static int getIconActivityType(String activityTypeId) { public static int getIconActivityType(String activityTypeId) {
Optional<ActivityType> found = Arrays.stream(ActivityType.values()).filter( return ActivityType.findByActivityTypeId(activityTypeId)
it -> it.getId().equals(activityTypeId) .getFirstLocalizedStringId();
).findFirst();
return found.map(ActivityType::getFirstLocalizedStringId)
.orElseGet(ActivityType.UNKNOWN::getFirstLocalizedStringId);
} }
/**
* Gets all icon values.
*/
public static List<String> getAllIconValues() {
return Arrays.stream(ActivityType.values())
.map(ActivityType::getId)
.collect(Collectors.toList());
}
/**
* Gets the icon value.
*
* @param context the context
* @param activityTypeId the activity type
*/
@NonNull @NonNull
public static String getIconValue(Context context, String activityTypeId) { public static String getActivityTypeId(Context context, String localizedActivityType) {
Optional<ActivityType> selected = Arrays.stream(ActivityType.values()) return ActivityType.findByLocalizedString(context, localizedActivityType)
.filter( .getId();
it -> Arrays.stream(it.getLocalizedStringIds())
.anyMatch(id -> context.getString(id).equals(activityTypeId))
)
.findFirst();
if (selected.isEmpty()) {
return ActivityType.UNKNOWN.getId();
}
return selected.get().getId();
} }
public static boolean isSpeedIcon(Resources resources, String activityTypeId) { public static boolean isSpeedIcon(Resources resources, String localizedActivityType) {
Optional<ActivityType> selected = Arrays.stream(ActivityType.values()) return ActivityType.findByLocalizedString(resources, localizedActivityType)
.filter( .isShowSpeedPreferred();
it -> Arrays.stream(it.getLocalizedStringIds())
.anyMatch(id -> resources.getString(id).equals(activityTypeId))
)
.findFirst();
return selected.map(ActivityType::isShowSpeedPreferred)
.orElse(false);
} }
} }
@@ -33,7 +33,7 @@ public class TrackUtils {
} }
public static void updateTrack(Context context, Track track, String name, String activityType, String description, ContentProviderUtils contentProviderUtils) { public static void updateTrack(Context context, Track track, String name, String activityType, String description, ContentProviderUtils contentProviderUtils) {
updateTrack(context, track, name, activityType, TrackIconUtils.getIconValue(context, activityType), description, contentProviderUtils); updateTrack(context, track, name, activityType, TrackIconUtils.getActivityTypeId(context, activityType), description, contentProviderUtils);
} }
public static void updateTrack(Context context, Track track, String name, String activityType, String iconValue, String description, ContentProviderUtils contentProviderUtils) { public static void updateTrack(Context context, Track track, String name, String activityType, String iconValue, String description, ContentProviderUtils contentProviderUtils) {
@@ -49,7 +49,7 @@ public class TrackUtils {
if (iconValue != null) { if (iconValue != null) {
track.setIcon(iconValue); track.setIcon(iconValue);
} else if (activityType != null) { } else if (activityType != null) {
track.setIcon(TrackIconUtils.getIconValue(context, activityType)); track.setIcon(TrackIconUtils.getActivityTypeId(context, activityType));
} }
if (description != null) { if (description != null) {
track.setDescription(description); track.setDescription(description);