/* * Copyright (C) 2018 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License */ package com.android.dialer.speeddial.loader; import android.database.Cursor; import android.provider.ContactsContract.CommonDataKinds.Phone; import android.provider.ContactsContract.Data; import android.support.annotation.Nullable; import android.text.TextUtils; import com.android.dialer.common.Assert; import com.android.dialer.speeddial.database.SpeedDialEntry; import com.android.dialer.speeddial.database.SpeedDialEntry.Channel; import com.google.auto.value.AutoValue; import com.google.common.collect.ImmutableList; import java.util.ArrayList; import java.util.List; import java.util.Objects; /** * POJO representation of each speed dial list element. * *
Contains all data needed for the UI so that the UI never needs do additional contact queries. * *
Differs from {@link SpeedDialEntry} in that entries are specific to favorited/starred contacts * and {@link SpeedDialUiItem}s can be both favorites and suggested contacts. */ @AutoValue public abstract class SpeedDialUiItem { public static final int LOOKUP_KEY = 0; public static final int CONTACT_ID = 1; public static final int DISPLAY_NAME = 2; public static final int STARRED = 3; public static final int NUMBER = 4; public static final int TYPE = 5; public static final int LABEL = 6; public static final int PHOTO_ID = 7; public static final int PHOTO_URI = 8; public static final int CARRIER_PRESENCE = 9; public static final String[] PHONE_PROJECTION = { Phone.LOOKUP_KEY, Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.STARRED, Phone.NUMBER, Phone.TYPE, Phone.LABEL, Phone.PHOTO_ID, Phone.PHOTO_URI, Phone.CARRIER_PRESENCE }; public static Builder builder() { return new AutoValue_SpeedDialUiItem.Builder().setChannels(ImmutableList.of()); } /** * Convert a cursor with projection {@link #PHONE_PROJECTION} into a {@link SpeedDialUiItem}. * *
This cursor is structured such that contacts are grouped by contact id and lookup key and * each row that shares the same contact id and lookup key represents a phone number that belongs * to a single contact. * *
If the cursor started at row X, this method will advance to row Y s.t. rows X, X + 1, ... Y
* - 1 all belong to the same contact (that is, share the same contact id and lookup key).
*/
public static SpeedDialUiItem fromCursor(Cursor cursor) {
Assert.checkArgument(cursor != null);
Assert.checkArgument(cursor.getCount() != 0);
String lookupKey = cursor.getString(LOOKUP_KEY);
SpeedDialUiItem.Builder builder =
SpeedDialUiItem.builder()
.setLookupKey(lookupKey)
.setContactId(cursor.getLong(CONTACT_ID))
// TODO(a bug): handle last name first preference
.setName(cursor.getString(DISPLAY_NAME))
.setIsStarred(cursor.getInt(STARRED) == 1)
.setPhotoId(cursor.getLong(PHOTO_ID))
.setPhotoUri(
TextUtils.isEmpty(cursor.getString(PHOTO_URI)) ? "" : cursor.getString(PHOTO_URI));
// While there are more rows and the lookup keys are the same, add a channel for each of the
// contact's phone numbers.
List