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

Commit 6d06825a authored by Henrik Engström's avatar Henrik Engström Committed by Johan Redestig
Browse files

Fix for infinite loop in RemoteViewsAdapter

This patch fixes an error in RemoteViewsAdapter when there is only one
view in the cache, and it is bigger than the cache size threshold. This
would cause the cleanup of the cache to get stuck in an infinite loop
while holding the mCache lock that is also needed by for example
getView which is called on the UI thread, leading to ANRs. This patch
breaks the loop when it sees that it can not remove the next view up
for removal.

Change-Id: I331259bb10eae9fe91e5112102e08f49cc078a1b
parent 38fcaf40
Loading
Loading
Loading
Loading
+9 −1
Original line number Diff line number Diff line
@@ -620,7 +620,15 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
                // remove based on both its position as well as it's current memory usage, as well
                // as whether it was directly requested vs. whether it was preloaded by our caching
                // mechanism.
                mIndexRemoteViews.remove(getFarthestPositionFrom(pruneFromPosition, visibleWindow));
                int trimIndex = getFarthestPositionFrom(pruneFromPosition, visibleWindow);

                // Need to check that this is a valid index, to cover the case where you have only
                // a single view in the cache, but it's larger than the max memory limit
                if (trimIndex < 0) {
                    break;
                }

                mIndexRemoteViews.remove(trimIndex);
            }

            // Update the metadata cache