From 140ed429ea1829e8e786266cf1b41bac1ea6ada2 Mon Sep 17 00:00:00 2001 From: Stefan Andonian Date: Fri, 20 May 2022 23:30:02 +0000 Subject: [PATCH] Fix folder app icon truncation after rotating to landscape. The folder bubble text views were being recycled after the launcher's cache was cleared. This caused the new orientation's folders to re-use the old views with their stale configuration. After this change, the cache won't recycle views whose cache entry has been recreated, implying that their environment might have changed and new setup is required. Bug: 230304658 Test: Verified erroneous UX on device was no longer reproducible after fix. Change-Id: Ib01cf5792d83df752e05534e5aa08ab8e8763bdc --- res/values/id.xml | 1 + src/com/android/launcher3/util/ViewCache.java | 18 ++++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/res/values/id.xml b/res/values/id.xml index 7ad1412357..af21b27caf 100644 --- a/res/values/id.xml +++ b/res/values/id.xml @@ -37,4 +37,5 @@ + diff --git a/src/com/android/launcher3/util/ViewCache.java b/src/com/android/launcher3/util/ViewCache.java index 08b8744167..98e6822542 100644 --- a/src/com/android/launcher3/util/ViewCache.java +++ b/src/com/android/launcher3/util/ViewCache.java @@ -21,6 +21,8 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import com.android.launcher3.R; + /** * Utility class to cache views at an activity level */ @@ -39,18 +41,26 @@ public class ViewCache { mCache.put(layoutId, entry); } + T result; if (entry.mCurrentSize > 0) { entry.mCurrentSize --; - T result = (T) entry.mViews[entry.mCurrentSize]; + result = (T) entry.mViews[entry.mCurrentSize]; entry.mViews[entry.mCurrentSize] = null; - return result; + } else { + result = (T) LayoutInflater.from(context).inflate(layoutId, parent, false); + result.setTag(R.id.cache_entry_tag_id, entry); } - - return (T) LayoutInflater.from(context).inflate(layoutId, parent, false); + return result; } public void recycleView(int layoutId, View view) { CacheEntry entry = mCache.get(layoutId); + if (entry != view.getTag(R.id.cache_entry_tag_id)) { + // Since this view was created, the cache has been reset. The view should not be + // recycled since this means the environment could also have changed, requiring new + // view setup. + return; + } if (entry != null && entry.mCurrentSize < entry.mMaxSize) { entry.mViews[entry.mCurrentSize] = view; entry.mCurrentSize++;