Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Verified Commit 7ce25938 authored by Saalim Quadri's avatar Saalim Quadri
Browse files

feat: Fix blinking of search results while installing an app

parent a424ccce
Loading
Loading
Loading
Loading
Loading
+20 −0
Original line number Diff line number Diff line
@@ -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<Application>() {
@@ -29,4 +30,23 @@ class ApplicationDiffUtil : DiffUtil.ItemCallback<Application>() {
    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)
}
+28 −0
Original line number Diff line number Diff line
@@ -153,6 +153,34 @@ class ApplicationListRVAdapter(
        }
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int, payloads: MutableList<Any>) {
        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