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

Commit ba223760 authored by Bjorn Bringert's avatar Bjorn Bringert
Browse files

Close suggestion cursors that arrive after adapter is closed

Before, after using the Browser, memory-hungry apps could
become very sluggish. This was because the search dialog in the
system process had the BrowserProvider open, which in turn had
EnhancedGoogleSearch open. Since EhancedGoogleSearch runs in acore,
the system would keep both the Browser process and acore to stay
around forever.

The cause (or at least one common cause) for this was that
if the user types quickly, and clicks on a suggestion before
the displayed suggestions have caught up, some suggestion cursors
are not be closed.

This change solves this problem by adding a close() method to
SuggestionsAdapter. SuggestionsAdapter now closes any cursors
that are passed to it after close() is called.

Fixes http://b/issue?id=2078226
"global search holding reference to browser: system -> browser -> acore = :("
parent b56de747
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -428,7 +428,7 @@ public class SearchDialog extends Dialog implements OnItemClickListener, OnItemS
        mSearchAutoComplete.setAdapter((SuggestionsAdapter)null);
        mSearchAutoComplete.setAdapter((SuggestionsAdapter)null);
        // close any leftover cursor
        // close any leftover cursor
        if (mSuggestionsAdapter != null) {
        if (mSuggestionsAdapter != null) {
            mSuggestionsAdapter.changeCursor(null);
            mSuggestionsAdapter.close();
        }
        }
        mSuggestionsAdapter = null;
        mSuggestionsAdapter = null;
    }
    }
+13 −0
Original line number Original line Diff line number Diff line
@@ -65,6 +65,7 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
    private WeakHashMap<String, Drawable.ConstantState> mOutsideDrawablesCache;
    private WeakHashMap<String, Drawable.ConstantState> mOutsideDrawablesCache;
    private SparseArray<Drawable.ConstantState> mBackgroundsCache;
    private SparseArray<Drawable.ConstantState> mBackgroundsCache;
    private boolean mGlobalSearchMode;
    private boolean mGlobalSearchMode;
    private boolean mClosed = false;


    // Cached column indexes, updated when the cursor changes.
    // Cached column indexes, updated when the cursor changes.
    private int mFormatCol;
    private int mFormatCol;
@@ -199,6 +200,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
        }
        }
    }
    }


    public void close() {
        if (DBG) Log.d(LOG_TAG, "close()");
        changeCursor(null);
        mClosed = true;
    }

    /**
    /**
     * Cache columns.
     * Cache columns.
     */
     */
@@ -206,6 +213,12 @@ class SuggestionsAdapter extends ResourceCursorAdapter {
    public void changeCursor(Cursor c) {
    public void changeCursor(Cursor c) {
        if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")");
        if (DBG) Log.d(LOG_TAG, "changeCursor(" + c + ")");


        if (mClosed) {
            Log.w(LOG_TAG, "Tried to change cursor after adapter was closed.");
            if (c != null) c.close();
            return;
        }

        try {
        try {
            Cursor oldCursor = getCursor();
            Cursor oldCursor = getCursor();
            super.changeCursor(c);
            super.changeCursor(c);