blob: a5fd34f846198dccf468115da72da1ac211de486 [file] [log] [blame]
package com.android.car.dialer.telecom;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract;
import android.telephony.PhoneNumberUtils;
import com.android.car.dialer.ContactEntry;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.loader.content.CursorLoader;
import androidx.loader.content.Loader;
/**
* A singleton statically accessible helper class which pre-loads contacts list into memory so
* that they can be accessed more easily and quickly.
*/
public class InMemoryPhoneBook implements Loader.OnLoadCompleteListener<Cursor> {
private static InMemoryPhoneBook sInMemoryPhoneBook;
private final Context mContext;
private boolean mIsLoaded = false;
private List<ContactEntry> mContactEntries = new ArrayList<>();
Map<Integer, List<ContactEntry>> mIdToContactEntryMap;
private InMemoryPhoneBook(Context context) {
mContext = context;
}
public static InMemoryPhoneBook init(Context context) {
if (sInMemoryPhoneBook == null) {
sInMemoryPhoneBook = new InMemoryPhoneBook(context);
sInMemoryPhoneBook.onInit();
} else {
throw new IllegalStateException("Call teardown before reinitialized PhoneBook");
}
return get();
}
public static InMemoryPhoneBook get() {
if (sInMemoryPhoneBook != null) {
return sInMemoryPhoneBook;
} else {
throw new IllegalStateException("Call init before get InMemoryPhoneBook");
}
}
public static void tearDown() {
sInMemoryPhoneBook = null;
}
private void onInit() {
CursorLoader cursorLoader = createPhoneBookCursorLoader();
cursorLoader.registerListener(0, this);
cursorLoader.startLoading();
}
public boolean isLoaded() {
return mIsLoaded;
}
/**
* Returns a alphabetically sorted contact list.
*/
public List<ContactEntry> getOrderedContactEntries() {
return mContactEntries;
}
@Nullable
public ContactEntry lookupContactEntry(String phoneNumber) {
for (ContactEntry contactEntry : mContactEntries) {
if (PhoneNumberUtils.compare(mContext, phoneNumber, contactEntry.getNumber())) {
return contactEntry;
}
}
return null;
}
public Map<Integer, List<ContactEntry>> getIdToContactEntryMap() {
if (mIdToContactEntryMap == null) {
mIdToContactEntryMap = new HashMap<>();
for (ContactEntry contactEntry : mContactEntries) {
List<ContactEntry> list;
if (mIdToContactEntryMap.containsKey(contactEntry.getId())) {
list = mIdToContactEntryMap.get(contactEntry.getId());
} else {
list = new ArrayList<>();
}
list.add(contactEntry);
}
}
return mIdToContactEntryMap;
}
@Override
public void onLoadComplete(@NonNull Loader<Cursor> loader, @Nullable Cursor cursor) {
if (cursor != null) {
while (cursor.moveToNext()) {
mContactEntries.add(ContactEntry.fromCursor(cursor, mContext));
}
}
mIsLoaded = true;
}
private CursorLoader createPhoneBookCursorLoader() {
return new CursorLoader(mContext,
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.Data.MIMETYPE + " = '"
+ ContactsContract.CommonDataKinds.Phone
.CONTENT_ITEM_TYPE + "'",
null,
ContactsContract.Contacts.DISPLAY_NAME + " ASC ");
}
}