Use existing respond hack to close GlobalSearch cursor
Before, when using Quick Search Box, this showed up in the log:
W/SuggestionCursor( 1013): received unexpectd respond: no DialogCursorProtocol.METHOD specified.
And a while later, this:
W/SuggestionCursor( 1013): SuggestionCursor finalized without being closed. Someone is leaking.
This latter warning is because of http://b/issue?id=2015069, where cross-process Cursor.close()
doesn't actually close the target cursor. The first warning is because
GlobalSearch.SuggestionCursor does not handle EXTRA_CURSOR_RESPOND_CLOSE_CURSOR
as sent by SuggestionsAdapter, which is a work-around for http://b/issue?id=2015069.
This change modified GlobalSearch.SuggestionCursor to close itself when
it receives EXTRA_CURSOR_RESPOND_CLOSE_CURSOR.
This will reduce some memory and thread life drag in GlobalSearch.
Fixes http://b/issue?id=2085248
Change-Id: If9cf3482dcacf245bd18cda5bb2871ff825ccf65
diff --git a/src/com/android/globalsearch/SuggestionCursor.java b/src/com/android/globalsearch/SuggestionCursor.java
index 9768b16..4445359 100644
--- a/src/com/android/globalsearch/SuggestionCursor.java
+++ b/src/com/android/globalsearch/SuggestionCursor.java
@@ -48,6 +48,11 @@
private static final String TAG = SuggestionCursor.class.getSimpleName();
+ // The extra used to tell a cursor to close itself. This is a hack to work around
+ // the fact that cross-process cursors currently don't get closed by Cursor.close(),
+ // http://b/issue?id=2015069
+ private static final String EXTRA_CURSOR_RESPOND_CLOSE_CURSOR = "cursor_respond_close_cursor";
+
// the same as the string in suggestActionMsgColumn in res/xml/searchable.xml
private static final String SUGGEST_COLUMN_ACTION_MSG_CALL = "suggest_action_msg_call";
@@ -177,6 +182,13 @@
public Bundle respond(Bundle extras) {
if (DBG) Log.d(TAG, "respond(" + extras + ")");
+ // Hack to work around http://b/issue?id=2015069,
+ // "CursorToBulkCursorAdaptor.close() does not call mCursor.close()"
+ if (extras.getBoolean(EXTRA_CURSOR_RESPOND_CLOSE_CURSOR)) {
+ close();
+ return Bundle.EMPTY;
+ }
+
final int method = extras.getInt(SearchManager.DialogCursorProtocol.METHOD, -1);
if (method == -1) {