From 551031eee3815750002b479b3171dea4a2fe09b7 Mon Sep 17 00:00:00 2001 From: Mugurell Date: Mon, 19 Apr 2021 09:07:50 +0300 Subject: [PATCH] For #18672 - Renaming a TopSite changes just the title Previously renaming a TopSite would bind that as a new item and in such update the entire list. This could potentially leading changes in the list and then it's ViewPager parent's layout. This patch switches the code to use the existing TopSitePayload and so do a partial update of an on-screen TopSite instead of rebind it as a new item. If a layout is requested while showing <=4 TopSites on the second page, by having "offscreenPageLimit = 1" the biggest height of ViewPager pages is used preventing an edgecase where the ViewPager would hide half of the items from the first page. --- .../sessioncontrol/viewholders/TopSitePagerViewHolder.kt | 4 ++++ .../viewholders/topsites/TopSiteItemViewHolder.kt | 6 ++++++ .../sessioncontrol/viewholders/topsites/TopSitesAdapter.kt | 2 +- .../viewholders/topsites/TopSitesPagerAdapter.kt | 5 ++++- 4 files changed, 15 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt index 724aa47308..471a0d796c 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/TopSitePagerViewHolder.kt @@ -45,6 +45,10 @@ class TopSitePagerViewHolder( view.top_sites_pager.apply { adapter = topSitesPagerAdapter registerOnPageChangeCallback(topSitesPageChangeCallback) + // Retain one more TopSites pages to ensure a new layout request will measure the first page also. + // Otherwise the second page with 3 TopSites will have the entire ViewPager only show + // the first row of TopSites, hiding half of those shown on the first page. + offscreenPageLimit = 1 } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt index e337a2b4b6..7ca0da2ca5 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSiteItemViewHolder.kt @@ -11,6 +11,7 @@ import android.view.View import android.widget.PopupWindow import androidx.appcompat.content.res.AppCompatResources.getDrawable import kotlinx.android.synthetic.main.top_site_item.* +import kotlinx.android.synthetic.main.top_site_item.view.* import mozilla.components.browser.menu.BrowserMenuBuilder import mozilla.components.browser.menu.item.SimpleBrowserMenuItem import mozilla.components.feature.top.sites.TopSite @@ -92,6 +93,11 @@ class TopSiteItemViewHolder( this.topSite = topSite } + fun bind(topSitePayload: TopSitesAdapter.TopSitePayload) { + itemView.top_site_title.text = topSitePayload.newTitle + topSite = topSite.copy(title = topSitePayload.newTitle) + } + private fun onTouchEvent( v: View, event: MotionEvent, diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesAdapter.kt index 78bf438d02..5519086992 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesAdapter.kt @@ -40,7 +40,7 @@ class TopSitesAdapter( holder.bind((payloads[0] as TopSite)) } is TopSitePayload -> { - holder.itemView.top_site_title.text = (payloads[0] as TopSitePayload).newTitle + holder.bind(payloads[0] as TopSitePayload) } } } diff --git a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt index e7ea586c8f..e60cc4cd65 100644 --- a/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt +++ b/app/src/main/java/org/mozilla/fenix/home/sessioncontrol/viewholders/topsites/TopSitesPagerAdapter.kt @@ -37,7 +37,10 @@ class TopSitesPagerAdapter( val adapter = holder.itemView.top_sites_list.adapter as TopSitesAdapter val payload = payloads[0] as AdapterItem.TopSitePagerPayload for (item in payload.changed) { - adapter.notifyItemChanged(item.first % TOP_SITES_PER_PAGE, item.second) + adapter.notifyItemChanged( + item.first % TOP_SITES_PER_PAGE, + TopSitesAdapter.TopSitePayload(item.second.title) + ) } } }