Implemented option to see more or less reports. Fixed tags' visibility

This commit is contained in:
Pau 2025-05-30 08:52:13 +02:00
parent 02469295b4
commit 4aee95207a
2 changed files with 144 additions and 46 deletions

View File

@ -69,6 +69,8 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
private PlaceReportsAdapter adapter;
private final List<Report> reportList = new ArrayList<>();
private BottomSheetBehavior<View> behavior;
private TextView tvViewAllReports;
private List<Report> allReportsList = new ArrayList<>();
public PlaceBottomSheetDialog(Place place) {
this.place = place;
@ -100,7 +102,7 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
@Override
public void onSlide(@NonNull View bottomSheet, float slideOffset) {
// Do nothing for now
// Do nothing
}
});
}
@ -136,6 +138,7 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
btnAddReport = view.findViewById(R.id.btnAddReport);
rvReports = view.findViewById(R.id.rvReports);
rvAccessibilityOverview = view.findViewById(R.id.rvAccessibilityOverview);
tvViewAllReports = view.findViewById(R.id.tvViewAllReports);
rvReports.setLayoutManager(new LinearLayoutManager(context));
rvAccessibilityOverview.setLayoutManager(new LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false));
@ -219,15 +222,24 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
dismiss();
});
View.OnClickListener fullScreenListener = v -> {
/*View.OnClickListener fullScreenListener = v -> {
Helper.goTo(context, PlaceDetailActivity.class, Constants.PLACE, place);
dismiss();
};
};*/
tvPlaceName.setOnClickListener(fullScreenListener);
tvViewAllReports.setOnClickListener(v -> {
//expand
showAllReports();
// fullscreen
// Helper.goTo(context, PlaceDetailActivity.class, Constants.PLACE, place);
// dismiss();
});
/*tvPlaceName.setOnClickListener(fullScreenListener);
tvAddress.setOnClickListener(fullScreenListener);
tvDescription.setOnClickListener(fullScreenListener);
ivPlaceImage.setOnClickListener(fullScreenListener);
ivPlaceImage.setOnClickListener(fullScreenListener);*/
}
private void loadReports() {
@ -243,19 +255,28 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
JsonObject data = responseBody.getAsJsonObject("_data");
if (data != null && data.has("reports")) {
reportList.clear();
allReportsList.clear();
for (JsonElement element : data.getAsJsonArray("reports")) {
Report report = getReport(element);
reportList.add(report);
allReportsList.add(report);
}
Collections.reverse(reportList);
List<Report> latestReports = reportList.size() > 3 ?
reportList.subList(0, 3) : reportList;
Collections.reverse(allReportsList);
List<Report> latestReports = allReportsList.size() > 3 ?
allReportsList.subList(0, 3) : allReportsList;
updateReportsUI(latestReports);
calculateAndShowAccessibilityStats(reportList);
if (allReportsList.size() > 3) {
tvViewAllReports.setVisibility(View.VISIBLE);
tvViewAllReports.setText(getString(R.string.view_all) + " (" + allReportsList.size() + ")");
} else {
tvViewAllReports.setVisibility(View.GONE);
}
calculateAndShowAccessibilityStats(allReportsList);
} else {
showNoReports();
}
@ -275,37 +296,68 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
JsonObject reportObject = element.getAsJsonObject();
Report report = new Report();
report.setUuid(reportObject.get("uuid").getAsString());
report.setReportRating(reportObject.get("rating").getAsInt());
report.setDescription(reportObject.get("description").getAsString());
report.setPlaceName(reportObject.get("place_name").getAsString());
report.setPlaceUuid(reportObject.get("place_uuid").getAsString());
try {
// Campos básicos con verificación de null
if (reportObject.has("uuid") && !reportObject.get("uuid").isJsonNull()) {
report.setUuid(reportObject.get("uuid").getAsString());
}
List<String> reportTypeUuids = new ArrayList<>();
List<String> reportTypeNames = new ArrayList<>();
if (reportObject.has("rating") && !reportObject.get("rating").isJsonNull()) {
report.setReportRating(reportObject.get("rating").getAsInt());
}
processReportTypeField(reportObject, "report_type_uuids", reportTypeUuids);
processReportTypeField(reportObject, "report_type_names", reportTypeNames);
if (reportObject.has("description") && !reportObject.get("description").isJsonNull()) {
report.setDescription(reportObject.get("description").getAsString());
}
// Fallback for legacy fields (singular)
if (reportTypeUuids.isEmpty() && reportObject.has("report_type_uuid") && !reportObject.get("report_type_uuid").isJsonNull()) {
reportTypeUuids.add(reportObject.get("report_type_uuid").getAsString());
if (reportObject.has("place_name") && !reportObject.get("place_name").isJsonNull()) {
report.setPlaceName(reportObject.get("place_name").getAsString());
}
if (reportObject.has("place_uuid") && !reportObject.get("place_uuid").isJsonNull()) {
report.setPlaceUuid(reportObject.get("place_uuid").getAsString());
}
// Images
if (reportObject.has("images") && !reportObject.get("images").isJsonNull()) {
JsonElement imagesElement = reportObject.get("images");
if (imagesElement.isJsonArray()) {
report.setImage(imagesElement.toString());
} else {
report.setImage(imagesElement.getAsString());
}
}
//report type
List<String> reportTypeUuids = new ArrayList<>();
List<String> reportTypeNames = new ArrayList<>();
processReportTypeField(reportObject, "report_type_uuids", reportTypeUuids);
processReportTypeField(reportObject, "report_type_names", reportTypeNames);
// Fallback para campos legacy (singular)
if (reportTypeUuids.isEmpty() && reportObject.has("report_type_uuid") && !reportObject.get("report_type_uuid").isJsonNull()) {
reportTypeUuids.add(reportObject.get("report_type_uuid").getAsString());
}
if (reportTypeNames.isEmpty() && reportObject.has("report_type_name") && !reportObject.get("report_type_name").isJsonNull()) {
reportTypeNames.add(reportObject.get("report_type_name").getAsString());
}
report.setReportTypeUuids(reportTypeUuids);
report.setReportTypeNames(reportTypeNames);
} catch (Exception e) {
Log.e(TAG, "Error parsing report: " + (report.getUuid() != null ? report.getUuid() : "unknown"), e);
}
if (reportTypeNames.isEmpty() && reportObject.has("report_type_name") && !reportObject.get("report_type_name").isJsonNull()) {
reportTypeNames.add(reportObject.get("report_type_name").getAsString());
}
report.setReportTypeUuids(reportTypeUuids);
report.setReportTypeNames(reportTypeNames);
return report;
}
private static void processReportTypeField(JsonObject reportObject, String fieldName, List<String> resultList) {
try {
if (!reportObject.has(fieldName) || reportObject.get(fieldName).isJsonNull()) {
return; // null
return;
}
JsonElement element = reportObject.get(fieldName);
@ -314,9 +366,11 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
// array JSON
JsonArray array = element.getAsJsonArray();
for (JsonElement item : array) {
String value = item.getAsString().trim();
if (!value.isEmpty()) {
resultList.add(value);
if (!item.isJsonNull()) {
String value = item.getAsString().trim();
if (!value.isEmpty()) {
resultList.add(value);
}
}
}
Log.d(TAG, fieldName + " processed as array: " + resultList.size() + " items");
@ -333,10 +387,7 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
resultList.add(cleanValue);
}
}
Log.d(TAG, fieldName + " processed as string: " + resultList.size() + " items from '" + stringValue + "'");
}
} else {
Log.w(TAG, fieldName + " is neither array nor primitive: " + element.getClass().getSimpleName());
}
} catch (Exception e) {
@ -344,6 +395,31 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
}
}
private void showAllReports() {
updateReportsUI(allReportsList);
tvViewAllReports.setText(getString(R.string.show_less));
tvViewAllReports.setOnClickListener(v -> showLessReports());
// Expand bottom sheet if it is not expanded
if (behavior != null && behavior.getState() != BottomSheetBehavior.STATE_EXPANDED) {
behavior.setState(BottomSheetBehavior.STATE_EXPANDED);
}
}
private void showLessReports() {
// Mostrar solo los primeros 3 reportes
List<Report> latestReports = allReportsList.size() > 3 ?
allReportsList.subList(0, 3) : allReportsList;
updateReportsUI(latestReports);
// Restaurar texto y listener original
tvViewAllReports.setText(getString(R.string.view_all) + " (" + allReportsList.size() + ")");
tvViewAllReports.setOnClickListener(v -> showAllReports());
}
private void calculateAndShowAccessibilityStats(List<Report> allReports) {
if (allReports.isEmpty()) {
rvAccessibilityOverview.setVisibility(View.GONE);
@ -600,4 +676,4 @@ public class PlaceBottomSheetDialog extends BottomSheetDialogFragment {
}
});
}
}
}

View File

@ -55,7 +55,6 @@
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentStart="true"
android:layout_toStartOf="@+id/ivExpand"
android:textColor="?attr/colorOnSurface"
android:textSize="20sp"
android:textStyle="bold"
@ -223,14 +222,37 @@
android:orientation="vertical"
android:padding="24dp">
<TextView
<!-- Reports Header with View All button -->
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="?attr/colorPrimary"
android:text="@string/recent_reports"
android:layout_marginBottom="16dp" />
android:orientation="horizontal"
android:gravity="center_vertical"
android:layout_marginBottom="16dp">
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:textSize="18sp"
android:textStyle="bold"
android:textColor="?attr/colorPrimary"
android:text="@string/recent_reports" />
<TextView
android:id="@+id/tvViewAllReports"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/view_all"
android:textSize="14sp"
android:textStyle="bold"
android:textColor="?attr/colorPrimary"
android:background="?attr/selectableItemBackground"
android:padding="8dp"
android:visibility="gone"
tools:visibility="visible" />
</LinearLayout>
<!-- Empty State -->
<LinearLayout
@ -263,4 +285,4 @@
</LinearLayout>
</androidx.core.widget.NestedScrollView>
</androidx.core.widget.NestedScrollView>