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 aea640d79fa8e556d1f083facc251dddc70c6407..006bc9273b87a7b4ce62f8230f368a95804f3205 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 b782362a4e4d344d96891e29424a3282c4cbb5d4..839fb058462a88b9845f6991aa9bf8ba1d7b6110 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