Refactored AccessibilityHelper for a better read experience

This commit is contained in:
Pau 2025-05-30 08:49:36 +02:00
parent eabc2aa0cd
commit 00c211aa75
1 changed files with 162 additions and 126 deletions

View File

@ -1,20 +1,90 @@
package com.example.acloc.utility; package com.example.acloc.utility;
import android.content.Context; import android.content.Context;
import androidx.annotation.DrawableRes;
import androidx.annotation.StringRes;
import androidx.annotation.ColorRes;
import com.ieslamar.acloc.R; import com.ieslamar.acloc.R;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
public class AccessibilityHelper { public class AccessibilityHelper {
public enum AccessibilityType {
WHEELCHAIR(R.string.accessibility_wheelchair, R.drawable.ic_accessible,
new String[]{"silla", "wheelchair", "rueda", "silla_de_ruedas"}),
VISUAL(R.string.accessibility_visual, R.drawable.ic_visibility,
new String[]{"visual", "vista", "ciego", "vision", "sight"}),
HEARING(R.string.accessibility_hearing, R.drawable.ic_hearing,
new String[]{"auditivo", "hearing", "sordo", "audio", "sound"}),
COGNITIVE(R.string.accessibility_cognitive, R.drawable.ic_psychology,
new String[]{"cognitivo", "mental", "cognitive", "psicologico"}),
MOBILITY(R.string.accessibility_mobility, R.drawable.ic_directions_walk,
new String[]{"movilidad", "mobility", "caminar", "walking", "movement"}),
PARKING(R.string.accessibility_parking, R.drawable.ic_local_parking,
new String[]{"estacionamiento", "parking", "aparcamiento", "plaza"}),
ENTRANCE(R.string.accessibility_entrance, R.drawable.ic_door_front,
new String[]{"entrada", "entrance", "puerta", "door", "acceso"}),
BATHROOM(R.string.accessibility_bathroom, R.drawable.ic_wc,
new String[]{"baño", "bathroom", "aseo", "wc", "toilet"}),
ELEVATOR(R.string.accessibility_elevator, R.drawable.ic_elevator,
new String[]{"ascensor", "elevator", "lift"}),
RAMP(R.string.accessibility_ramp, R.drawable.ic_trending_up,
new String[]{"rampa", "ramp", "slope", "incline"});
@StringRes public final int displayNameRes;
@DrawableRes public final int iconRes;
public final String[] keywords;
AccessibilityType(@StringRes int displayNameRes, @DrawableRes int iconRes, String[] keywords) {
this.displayNameRes = displayNameRes;
this.iconRes = iconRes;
this.keywords = keywords;
}
}
public enum RatingLevel {
GOOD(Constants.GOOD_RATING, R.color.accessibility_good_bg,
R.color.accessibility_good_text, R.color.accessibility_good_border),
AVERAGE(Constants.AVERAGE_RATING, R.color.accessibility_average_bg,
R.color.accessibility_average_text, R.color.accessibility_average_border),
BAD(Constants.BAD_RATING, R.color.accessibility_poor_bg,
R.color.accessibility_poor_text, R.color.accessibility_poor_border);
public final int value;
@ColorRes public final int backgroundColorRes;
@ColorRes public final int textColorRes;
@ColorRes public final int borderColorRes;
RatingLevel(int value, @ColorRes int backgroundColorRes,
@ColorRes int textColorRes, @ColorRes int borderColorRes) {
this.value = value;
this.backgroundColorRes = backgroundColorRes;
this.textColorRes = textColorRes;
this.borderColorRes = borderColorRes;
}
public static RatingLevel fromValue(int rating) {
for (RatingLevel level : values()) {
if (level.value == rating) return level;
}
return AVERAGE;
}
}
public static class AccessibilityInfo { public static class AccessibilityInfo {
public final String displayName; public final String displayName;
public final int iconResource; @DrawableRes public final int iconResource;
public final int backgroundColorRes; @ColorRes public final int backgroundColorRes;
public final int textColorRes; @ColorRes public final int textColorRes;
public final int borderColorRes; @ColorRes public final int borderColorRes;
public AccessibilityInfo(String displayName, int iconResource, public AccessibilityInfo(String displayName, @DrawableRes int iconResource,
int backgroundColorRes, int textColorRes, int borderColorRes) { @ColorRes int backgroundColorRes, @ColorRes int textColorRes,
@ColorRes int borderColorRes) {
this.displayName = displayName; this.displayName = displayName;
this.iconResource = iconResource; this.iconResource = iconResource;
this.backgroundColorRes = backgroundColorRes; this.backgroundColorRes = backgroundColorRes;
@ -23,142 +93,108 @@ public class AccessibilityHelper {
} }
} }
public static AccessibilityInfo getAccessibilityInfo(String reportTypeName, int rating) { private static final Map<String, AccessibilityType> typeCache = new HashMap<>();
// Get icon based on report type name private static final Pattern TIMESTAMP_PATTERN = Pattern.compile("\\d{17}_");
int iconResource = getIconForReportType(reportTypeName); private static final Pattern SUFFIX_PATTERN = Pattern.compile("_[a-z0-9]{8}$");
// Get colors based on rating public static AccessibilityInfo getAccessibilityInfo(Context context, String reportTypeName, int rating) {
int[] colors = getColorsForRating(rating); AccessibilityType type = getAccessibilityType(reportTypeName);
RatingLevel ratingLevel = RatingLevel.fromValue(rating);
return new AccessibilityInfo( String displayName = type != null ?
reportTypeName, context.getString(type.displayNameRes) :
iconResource, getCleanDisplayName(context, reportTypeName);
colors[0], // background
colors[1], // text int iconResource = type != null ? type.iconRes : R.drawable.ic_accessible;
colors[2] // border
); return new AccessibilityInfo(displayName, iconResource, ratingLevel.backgroundColorRes,
ratingLevel.textColorRes, ratingLevel.borderColorRes);
} }
// Made public for ReportTypeAdapter
public static int getIconForReportType(String reportTypeName) {
if (reportTypeName == null) return R.drawable.ic_accessible;
String name = reportTypeName.toLowerCase();
// Map based on common accessibility type names
if (name.contains("silla") || name.contains("wheelchair") || name.contains("rueda")) {
return R.drawable.ic_accessible;
} else if (name.contains("visual") || name.contains("vista") || name.contains("ciego")) {
return R.drawable.ic_visibility;
} else if (name.contains("auditivo") || name.contains("hearing") || name.contains("sordo")) {
return com.ieslamar.acloc.R.drawable.ic_hearing;
} else if (name.contains("cognitivo") || name.contains("mental") || name.contains("cognitive")) {
return R.drawable.ic_psychology;
} else if (name.contains("movilidad") || name.contains("mobility") || name.contains("caminar")) {
return R.drawable.ic_directions_walk;
} else if (name.contains("estacionamiento") || name.contains("parking") || name.contains("aparcamiento")) {
return R.drawable.ic_local_parking;
} else if (name.contains("entrada") || name.contains("entrance") || name.contains("puerta")) {
return R.drawable.ic_door_front;
} else if (name.contains("baño") || name.contains("bathroom") || name.contains("aseo")) {
return R.drawable.ic_wc;
} else if (name.contains("ascensor") || name.contains("elevator")) {
return R.drawable.ic_elevator;
} else if (name.contains("rampa") || name.contains("ramp")) {
return R.drawable.ic_trending_up;
} else {
return R.drawable.ic_accessible; // Default accessibility icon
}
}
// New method for getting display name
public static String getDisplayName(Context context, String reportTypeName) { public static String getDisplayName(Context context, String reportTypeName) {
if (reportTypeName == null || reportTypeName.trim().isEmpty()) { AccessibilityType type = getAccessibilityType(reportTypeName);
return context.getString(R.string.accessibility_unknown); if (type != null) {
} return context.getString(type.displayNameRes);
// Clean up the name first - remove timestamps and weird suffixes
String cleanName = cleanReportTypeName(reportTypeName);
String name = cleanName.toLowerCase();
// Return localized display names
if (name.contains("silla") || name.contains("wheelchair") || name.contains("rueda")) {
return context.getString(R.string.accessibility_wheelchair);
} else if (name.contains("visual") || name.contains("vista") || name.contains("ciego")) {
return context.getString(R.string.accessibility_visual);
} else if (name.contains("auditivo") || name.contains("hearing") || name.contains("sordo")) {
return context.getString(R.string.accessibility_hearing);
} else if (name.contains("cognitivo") || name.contains("mental") || name.contains("cognitive")) {
return context.getString(R.string.accessibility_cognitive);
} else if (name.contains("movilidad") || name.contains("mobility") || name.contains("caminar")) {
return context.getString(R.string.accessibility_mobility);
} else if (name.contains("estacionamiento") || name.contains("parking") || name.contains("aparcamiento")) {
return context.getString(R.string.accessibility_parking);
} else if (name.contains("entrada") || name.contains("entrance") || name.contains("puerta")) {
return context.getString(R.string.accessibility_entrance);
} else if (name.contains("baño") || name.contains("bathroom") || name.contains("aseo")) {
return context.getString(R.string.accessibility_bathroom);
} else if (name.contains("ascensor") || name.contains("elevator")) {
return context.getString(R.string.accessibility_elevator);
} else if (name.contains("rampa") || name.contains("ramp")) {
return context.getString(R.string.accessibility_ramp);
} else {
// If no mapping found, return the cleaned name
return capitalizeFirstLetter(cleanName);
} }
return getCleanDisplayName(context, reportTypeName);
}
@DrawableRes
public static int getIconForReportType(String reportTypeName) {
AccessibilityType type = getAccessibilityType(reportTypeName);
return type != null ? type.iconRes : R.drawable.ic_accessible;
}
private static AccessibilityType getAccessibilityType(String reportTypeName) {
if (reportTypeName == null || reportTypeName.trim().isEmpty()) {
return null;
}
String cacheKey = reportTypeName.toLowerCase();
if (typeCache.containsKey(cacheKey)) {
return typeCache.get(cacheKey);
}
String cleanName = cleanReportTypeName(reportTypeName).toLowerCase();
for (AccessibilityType type : AccessibilityType.values()) {
for (String keyword : type.keywords) {
if (cleanName.contains(keyword.toLowerCase())) {
typeCache.put(cacheKey, type);
return type;
}
}
}
typeCache.put(cacheKey, null);
return null;
} }
// Add this new method to clean report type names
private static String cleanReportTypeName(String reportTypeName) { private static String cleanReportTypeName(String reportTypeName) {
if (reportTypeName == null) return ""; if (reportTypeName == null) return "";
// Remove timestamp patterns like "20250418155930234_" String cleaned = reportTypeName;
String cleaned = reportTypeName.replaceAll("\\d{17}_", ""); cleaned = TIMESTAMP_PATTERN.matcher(cleaned).replaceAll("");
cleaned = SUFFIX_PATTERN.matcher(cleaned).replaceAll("");
// Remove random suffixes like "_a1kzpr9q" cleaned = cleaned.replace("_", " ").trim();
cleaned = cleaned.replaceAll("_[a-z0-9]{8}$", "");
// Remove any remaining underscores and replace with spaces
cleaned = cleaned.replace("_", " ");
// Trim whitespace
cleaned = cleaned.trim();
return cleaned; return cleaned;
} }
private static String capitalizeFirstLetter(String text) { private static String getCleanDisplayName(Context context, String reportTypeName) {
if (text == null || text.isEmpty()) return text; if (reportTypeName == null || reportTypeName.trim().isEmpty()) {
return text.substring(0, 1).toUpperCase() + text.substring(1).toLowerCase(); return context.getString(R.string.accessibility_unknown);
}
String cleanName = cleanReportTypeName(reportTypeName);
return capitalizeFirstLetter(cleanName);
} }
private static int[] getColorsForRating(int rating) { private static String capitalizeFirstLetter(String text) {
// Returns [background, text, border] colors if (text == null || text.isEmpty()) return text;
switch (rating) {
case Constants.GOOD_RATING: // 3 String[] words = text.split("\\s+");
return new int[]{ StringBuilder result = new StringBuilder();
R.color.accessibility_good_bg,
R.color.accessibility_good_text, for (int i = 0; i < words.length; i++) {
R.color.accessibility_good_border if (i > 0) result.append(" ");
}; String word = words[i];
case Constants.AVERAGE_RATING: // 2 if (!word.isEmpty()) {
return new int[]{ result.append(Character.toUpperCase(word.charAt(0)));
R.color.accessibility_average_bg, if (word.length() > 1) {
R.color.accessibility_average_text, result.append(word.substring(1).toLowerCase());
R.color.accessibility_average_border }
}; }
case Constants.BAD_RATING: // 1
return new int[]{
R.color.accessibility_poor_bg,
R.color.accessibility_poor_text,
R.color.accessibility_poor_border
};
default:
return new int[]{
R.color.accessibility_default_bg,
R.color.accessibility_default_text,
R.color.accessibility_default_border
};
} }
return result.toString();
}
public static void clearCache() {
typeCache.clear();
}
public static RatingLevel getRatingLevel(int rating) {
return RatingLevel.fromValue(rating);
} }
} }