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

Commit ff067190 authored by Adam Cohen's avatar Adam Cohen
Browse files

Making sure to clear state related to views that are being recycled (issue 7650538)

Change-Id: I5161ac261f963789537d2066a472cd3036c218aa
parent fff0fb87
Loading
Loading
Loading
Loading
+23 −1
Original line number Diff line number Diff line
@@ -318,9 +318,13 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
     */
    private class RemoteViewsFrameLayoutRefSet {
        private HashMap<Integer, LinkedList<RemoteViewsFrameLayout>> mReferences;
        private HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>>
                mViewToLinkedList;

        public RemoteViewsFrameLayoutRefSet() {
            mReferences = new HashMap<Integer, LinkedList<RemoteViewsFrameLayout>>();
            mViewToLinkedList =
                    new HashMap<RemoteViewsFrameLayout, LinkedList<RemoteViewsFrameLayout>>();
        }

        /**
@@ -337,6 +341,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
                refs = new LinkedList<RemoteViewsFrameLayout>();
                mReferences.put(pos, refs);
            }
            mViewToLinkedList.put(layout, refs);

            // Add the references to the list
            refs.add(layout);
@@ -355,14 +360,26 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
                final LinkedList<RemoteViewsFrameLayout> refs = mReferences.get(pos);
                for (final RemoteViewsFrameLayout ref : refs) {
                    ref.onRemoteViewsLoaded(view, mRemoteViewsOnClickHandler);
                    if (mViewToLinkedList.containsKey(ref)) {
                        mViewToLinkedList.remove(ref);
                    }
                }
                refs.clear();

                // Remove this set from the original mapping
                mReferences.remove(pos);
            }
        }

        /**
         * We need to remove views from this set if they have been recycled by the AdapterView.
         */
        public void removeView(RemoteViewsFrameLayout rvfl) {
            if (mViewToLinkedList.containsKey(rvfl)) {
                mViewToLinkedList.get(rvfl).remove(rvfl);
                mViewToLinkedList.remove(rvfl);
            }
        }

        /**
         * Removes all references to all RemoteViewsFrameLayouts returned by the adapter.
         */
@@ -370,6 +387,7 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
            // We currently just clear the references, and leave all the previous layouts returned
            // in their default state of the loading view.
            mReferences.clear();
            mViewToLinkedList.clear();
        }
    }

@@ -1133,6 +1151,10 @@ public class RemoteViewsAdapter extends BaseAdapter implements Handler.Callback
            boolean isConnected = mServiceConnection.isConnected();
            boolean hasNewItems = false;

            if (convertView != null && convertView instanceof RemoteViewsFrameLayout) {
                mRequestedViews.removeView((RemoteViewsFrameLayout) convertView);
            }

            if (!isInCache && !isConnected) {
                // Requesting bind service will trigger a super.notifyDataSetChanged(), which will
                // in turn trigger another request to getView()