From 7ce25938eb7d4c4dba818733dc69f20dce21d71d Mon Sep 17 00:00:00 2001 From: Saalim Quadri Date: Mon, 13 Oct 2025 23:49:44 +0530 Subject: [PATCH] feat: Fix blinking of search results while installing an app Signed-off-by: Saalim Quadri --- .../ui/applicationlist/ApplicationDiffUtil.kt | 20 +++++++++++++ .../ApplicationListRVAdapter.kt | 28 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationDiffUtil.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationDiffUtil.kt index aea640d79..006bc9273 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationDiffUtil.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationDiffUtil.kt @@ -19,6 +19,7 @@ package foundation.e.apps.ui.applicationlist import androidx.recyclerview.widget.DiffUtil import foundation.e.apps.data.application.data.Application +import foundation.e.apps.data.enums.Status import foundation.e.apps.di.CommonUtilsModule.LIST_OF_NULL class ApplicationDiffUtil : DiffUtil.ItemCallback() { @@ -29,4 +30,23 @@ class ApplicationDiffUtil : DiffUtil.ItemCallback() { override fun areContentsTheSame(oldItem: Application, newItem: Application): Boolean { return oldItem == newItem } + + override fun getChangePayload(oldItem: Application, newItem: Application): Any? { + // If only the status changed, trigger partial update + val status = oldItem.status != newItem.status + val id = oldItem._id == newItem._id + val presentation = + oldItem.name == newItem.name && + oldItem.package_name == newItem.package_name && + oldItem.icon_image_path == newItem.icon_image_path + + if (status && id && presentation) { + return StatusChangePayload(newItem.status) + } + + // Else + return null + } + + data class StatusChangePayload(val newStatus: Status) } diff --git a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt index b782362a4..839fb0584 100644 --- a/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt +++ b/app/src/main/java/foundation/e/apps/ui/applicationlist/ApplicationListRVAdapter.kt @@ -153,6 +153,34 @@ class ApplicationListRVAdapter( } } + override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList) { + if (payloads.isEmpty()) { + super.onBindViewHolder(holder, position, payloads) + return + } + + // Partial update + val payload = payloads[0] + if (payload is ApplicationDiffUtil.StatusChangePayload) { + val searchApp = getItem(position) + holder.app = searchApp + val view = holder.itemView + + holder.binding.apply { + if (appInfoFetchViewModel.isAppInBlockedList(searchApp)) { + setupShowMoreButton() + } else { + mainActivityViewModel.verifyUiFilter(searchApp) { + setupInstallButton(searchApp, view, holder) + } + } + } + } else { + // Unknown payload + super.onBindViewHolder(holder, position, payloads) + } + } + private fun ApplicationListItemBinding.setInstallButtonDimensions(item: View) { item.post { val maxAllowedWidth = item.measuredWidth / 2 -- GitLab