DO NOT MERGE: Fix contact page always loading for 0 contacts
Register content observer to ContentResolver since Cursor could be null.
Test: manual
Bug: 166323672
Change-Id: I774b2dc01b9fe948ca6ad044f7d1a679ca2be5a6
diff --git a/car-telephony-common/src/com/android/car/telephony/common/InMemoryPhoneBook.java b/car-telephony-common/src/com/android/car/telephony/common/InMemoryPhoneBook.java
index 592b832..2ebe8a8 100644
--- a/car-telephony-common/src/com/android/car/telephony/common/InMemoryPhoneBook.java
+++ b/car-telephony-common/src/com/android/car/telephony/common/InMemoryPhoneBook.java
@@ -26,8 +26,8 @@
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.lifecycle.LiveData;
-import androidx.lifecycle.MutableLiveData;
import androidx.lifecycle.Observer;
+import androidx.lifecycle.Transformations;
import java.util.ArrayList;
import java.util.Collections;
@@ -58,10 +58,9 @@
private final Map<String, Map<String, Contact>> mLookupKeyContactMap = new HashMap<>();
/**
- * A map which divides contacts LiveData by account.
+ * A map which divides contacts by account.
*/
- private final Map<String, MutableLiveData<List<Contact>>> mAccountContactsLiveDataMap =
- new ArrayMap<>();
+ private final Map<String, List<Contact>> mAccountContactsMap = new ArrayMap<>();
private boolean mIsLoaded = false;
/**
@@ -159,10 +158,8 @@
* Bluetooth address.
*/
public LiveData<List<Contact>> getContactsLiveDataByAccount(String accountName) {
- if (!mAccountContactsLiveDataMap.containsKey(accountName)) {
- mAccountContactsLiveDataMap.put(accountName, new MutableLiveData<>());
- }
- return mAccountContactsLiveDataMap.get(accountName);
+ return Transformations.map(mContactListAsyncQueryLiveData,
+ contacts -> contacts == null ? null : mAccountContactsMap.get(accountName));
}
/**
@@ -251,12 +248,13 @@
subMap.put(lookupKey, Contact.fromCursor(mContext, cursor, subMap.get(lookupKey)));
}
+ mAccountContactsMap.clear();
for (String accountName : contactMap.keySet()) {
Map<String, Contact> subMap = contactMap.get(accountName);
contactList.addAll(subMap.values());
- MutableLiveData<List<Contact>> accountContactsLiveData =
- (MutableLiveData<List<Contact>>) getContactsLiveDataByAccount(accountName);
- accountContactsLiveData.postValue(new ArrayList<>(subMap.values()));
+ List<Contact> accountContacts = new ArrayList<>();
+ accountContacts.addAll(subMap.values());
+ mAccountContactsMap.put(accountName, accountContacts);
}
mLookupKeyContactMap.clear();
diff --git a/car-telephony-common/src/com/android/car/telephony/common/ObservableAsyncQuery.java b/car-telephony-common/src/com/android/car/telephony/common/ObservableAsyncQuery.java
index de0242b..8ab35f2 100644
--- a/car-telephony-common/src/com/android/car/telephony/common/ObservableAsyncQuery.java
+++ b/car-telephony-common/src/com/android/car/telephony/common/ObservableAsyncQuery.java
@@ -49,9 +49,9 @@
private AsyncQueryHandler mAsyncQueryHandler;
private QueryParam.Provider mQueryParamProvider;
- private Cursor mCurrentCursor;
private OnQueryFinishedListener mOnQueryFinishedListener;
private ContentObserver mContentObserver;
+ private ContentResolver mContentResolver;
private boolean mIsActive = false;
private int mToken;
@@ -64,6 +64,7 @@
@NonNull ContentResolver cr,
@NonNull OnQueryFinishedListener listener) {
mAsyncQueryHandler = new AsyncQueryHandlerImpl(this, cr);
+ mContentResolver = cr;
mContentObserver = new ContentObserver(mAsyncQueryHandler) {
@Override
public void onChange(boolean selfChange) {
@@ -82,6 +83,7 @@
public void startQuery() {
Log.d(TAG, "startQuery");
mAsyncQueryHandler.cancelOperation(mToken); // Cancel the query task.
+ mContentResolver.unregisterContentObserver(mContentObserver);
mToken++;
QueryParam queryParam = mQueryParamProvider.getQueryParam();
@@ -94,6 +96,7 @@
queryParam.mSelection,
queryParam.mSelectionArgs,
queryParam.mOrderBy);
+ mContentResolver.registerContentObserver(queryParam.mUri, false, mContentObserver);
} else {
mOnQueryFinishedListener.onQueryFinished(null);
}
@@ -108,7 +111,7 @@
public void stopQuery() {
Log.d(TAG, "stopQuery");
mIsActive = false;
- cleanupCursorIfNecessary();
+ mContentResolver.unregisterContentObserver(mContentObserver);
mAsyncQueryHandler.cancelOperation(mToken); // Cancel the query task.
}
@@ -117,23 +120,11 @@
return;
}
Log.d(TAG, "onQueryComplete");
- cleanupCursorIfNecessary();
- if (cursor != null) {
- cursor.registerContentObserver(mContentObserver);
- mCurrentCursor = cursor;
- }
if (mOnQueryFinishedListener != null) {
mOnQueryFinishedListener.onQueryFinished(cursor);
}
}
- protected void cleanupCursorIfNecessary() {
- if (mCurrentCursor != null) {
- mCurrentCursor.unregisterContentObserver(mContentObserver);
- }
- mCurrentCursor = null;
- }
-
private static class AsyncQueryHandlerImpl extends AsyncQueryHandler {
private ObservableAsyncQuery mQuery;