diff --git a/app/src/main/java/com/p_vacho/neat_calendar/activities/NotificationsActivity.kt b/app/src/main/java/com/p_vacho/neat_calendar/activities/NotificationsActivity.kt index 6baa624..93e7128 100644 --- a/app/src/main/java/com/p_vacho/neat_calendar/activities/NotificationsActivity.kt +++ b/app/src/main/java/com/p_vacho/neat_calendar/activities/NotificationsActivity.kt @@ -19,6 +19,7 @@ import com.p_vacho.neat_calendar.api.models.InvitationResponse import com.p_vacho.neat_calendar.api.models.NotificationResponse import com.p_vacho.neat_calendar.api.models.UserResponse import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.async import kotlinx.coroutines.launch import kotlinx.coroutines.withContext import org.json.JSONException @@ -85,9 +86,15 @@ class NotificationsActivity : AppCompatActivity() { return emptyMap() } + // Fetch the lists in parallel val fetchedInvitations = withContext(Dispatchers.IO) { - RetrofitClient.invitationService.getIncomingInvitations(userId) + val incomingDeferred = async { RetrofitClient.invitationService.getIncomingInvitations(userId) } + val ownedDeferred = async { RetrofitClient.invitationService.getInvitations(userId) } + val incomingInvitations = incomingDeferred.await() + val ownedInvitations = ownedDeferred.await() + (incomingInvitations + ownedInvitations).distinctBy { it.id } } + return fetchedInvitations.associateBy { it.id } } @@ -95,6 +102,7 @@ class NotificationsActivity : AppCompatActivity() { val ret = invitations[invitationId] if (ret == null) { Log.w("NotificationsActivity", "NotificationAdapter requested unknown invitation: $invitationId") + Log.w("NotificationsActivity", "Known invitations: $invitations") } return ret } @@ -116,15 +124,14 @@ class NotificationsActivity : AppCompatActivity() { } } catch (e: HttpException) { if (e.code() != 404) { throw e } - val errorBody = e.response()?.errorBody()?.string() - if (errorBody == null) { throw e } + val errorBody = e.response()?.errorBody()?.string() ?: throw e try { val jsonObj = JSONObject(errorBody) val errDetail = jsonObj.optString("detail") if (errDetail != "No such user") { throw e } } catch (jsonParseExc: JSONException) { throw e } - Log.e("NotificationsActivity", "Failed to fetch user: $userId", e) + Log.e("NotificationsActivity", "Failed to fetch user: $userId") users[userId] = null // Cache null for non-existing users // No need for an adapter update here, null is already the default @@ -139,7 +146,7 @@ class NotificationsActivity : AppCompatActivity() { NotificationAdapter.Action.ACCEPT -> { lifecycleScope.launch(Dispatchers.IO) { val invitationId = notification.data - RetrofitClient.invitationService.acceptInvitation(invitationId) + invitations[invitationId] = RetrofitClient.invitationService.acceptInvitation(invitationId) withContext(Dispatchers.Main) { Toast.makeText(this@NotificationsActivity, "Invitation accepted", Toast.LENGTH_SHORT).show() @@ -152,7 +159,8 @@ class NotificationsActivity : AppCompatActivity() { // but otherwise, we'll need to trigger an item update ourselves, to make sure that // the accept/decline buttons are removed rvNotifications.adapter!!.notifyItemChanged(position) - } } + } + } } } NotificationAdapter.Action.DECLINE -> { @@ -188,8 +196,7 @@ class NotificationsActivity : AppCompatActivity() { RetrofitClient.notificationsService.markNotificationRead(notification.id) notifications[position] = updatedNotification - val adapter = rvNotifications.adapter as NotificationAdapter - adapter.notifyItemChanged(position) + rvNotifications.adapter!!.notifyItemChanged(position) if (sendToast) { Toast.makeText(this@NotificationsActivity, "Marked as read", Toast.LENGTH_SHORT) diff --git a/app/src/main/java/com/p_vacho/neat_calendar/adapters/NotificationAdapter.kt b/app/src/main/java/com/p_vacho/neat_calendar/adapters/NotificationAdapter.kt index 26ed47a..d18974b 100644 --- a/app/src/main/java/com/p_vacho/neat_calendar/adapters/NotificationAdapter.kt +++ b/app/src/main/java/com/p_vacho/neat_calendar/adapters/NotificationAdapter.kt @@ -90,17 +90,15 @@ class NotificationAdapter( val user = getUserData(usernameId, position) val username = user?.username ?: "Unknown User" - val statusSuffix = when (invitation.status) { - "accepted" -> " [already accepted]" - "declined" -> " [already declined]" - "pending" -> "" - else -> throw IllegalStateException("Unexpected invitation status: ${invitation.status} for invitation ID: ${invitation.id}") - } - return when (notification.message) { - "new-invitation" -> "You have received an event invitation from @$username$statusSuffix" - "invitation-accepted" -> "@$username has accepted your event invitation$statusSuffix" - "invitation-declined" -> "@$username has declined your event invitation$statusSuffix" + "new-invitation" -> when (invitation.status) { + "accepted" -> "You have received an event invitation from @$username [already accepted]" + "declined" -> "You have received an event invitation from @$username [already declined]" + "pending" -> "You have received an event invitation from @$username" + else -> throw IllegalStateException("Unexpected invitation status: ${invitation.status} for invitation ID: ${invitation.id}") + } + "invitation-accepted" -> "@$username has accepted your event invitation" + "invitation-declined" -> "@$username has declined your event invitation" else -> throw IllegalArgumentException("Unexpected notification message: ${notification.message}") } }