blob: fc5bce1b2ed932e0bf6b0895cbdca497274ab81d [file] [log] [blame]
/*
* Copyright (C) 2017 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.searchfragment.directories;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Contacts;
import android.support.v7.widget.RecyclerView;
import android.text.TextUtils;
import android.view.View;
import android.widget.ImageView;
import android.widget.QuickContactBadge;
import android.widget.TextView;
import com.android.contacts.common.compat.DirectoryCompat;
import com.android.dialer.callintent.CallInitiationType;
import com.android.dialer.callintent.CallIntentBuilder;
import com.android.dialer.contactphoto.ContactPhotoManager;
import com.android.dialer.lettertile.LetterTileDrawable;
import com.android.dialer.precall.PreCall;
import com.android.dialer.searchfragment.common.Projections;
import com.android.dialer.searchfragment.common.QueryBoldingUtil;
import com.android.dialer.searchfragment.common.R;
import com.android.dialer.searchfragment.common.SearchCursor;
/** ViewHolder for a directory contact row. */
public final class DirectoryContactViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener {
private final Context context;
private final TextView nameView;
private final TextView numberView;
private final QuickContactBadge photo;
private final ImageView workBadge;
private String number;
public DirectoryContactViewHolder(View view) {
super(view);
view.setOnClickListener(this);
photo = view.findViewById(R.id.photo);
nameView = view.findViewById(R.id.primary);
numberView = view.findViewById(R.id.secondary);
workBadge = view.findViewById(R.id.work_icon);
context = view.getContext();
}
/**
* Binds the ViewHolder with a cursor from {@link DirectoryContactsCursorLoader} with the data
* found at the cursors current position.
*/
public void bind(SearchCursor cursor, String query) {
number = cursor.getString(Projections.PHONE_NUMBER);
String name = cursor.getString(Projections.DISPLAY_NAME);
String label = getLabel(context.getResources(), cursor);
String secondaryInfo =
TextUtils.isEmpty(label)
? number
: context.getString(
com.android.contacts.common.R.string.call_subject_type_and_number, label, number);
nameView.setText(QueryBoldingUtil.getNameWithQueryBolded(query, name, context));
numberView.setText(QueryBoldingUtil.getNameWithQueryBolded(query, secondaryInfo, context));
workBadge.setVisibility(
// TODO(a bug): Consider moving DirectoryCompat out of "contacts/common" and share it
// with PhoneLookups.
DirectoryCompat.isOnlyEnterpriseDirectoryId(cursor.getDirectoryId())
? View.VISIBLE
: View.GONE);
if (shouldShowPhoto(cursor)) {
nameView.setVisibility(View.VISIBLE);
photo.setVisibility(View.VISIBLE);
String photoUri = cursor.getString(Projections.PHOTO_URI);
ContactPhotoManager.getInstance(context)
.loadDialerThumbnailOrPhoto(
photo,
getContactUri(cursor),
cursor.getLong(Projections.PHOTO_ID),
photoUri == null ? null : Uri.parse(photoUri),
name,
LetterTileDrawable.TYPE_DEFAULT);
} else {
nameView.setVisibility(View.GONE);
photo.setVisibility(View.INVISIBLE);
}
}
// Show the contact photo next to only the first number if a contact has multiple numbers
private boolean shouldShowPhoto(SearchCursor cursor) {
int currentPosition = cursor.getPosition();
String currentLookupKey = cursor.getString(Projections.LOOKUP_KEY);
cursor.moveToPosition(currentPosition - 1);
if (!cursor.isHeader() && !cursor.isBeforeFirst()) {
String previousLookupKey = cursor.getString(Projections.LOOKUP_KEY);
cursor.moveToPosition(currentPosition);
return !currentLookupKey.equals(previousLookupKey);
}
cursor.moveToPosition(currentPosition);
return true;
}
// TODO(calderwoodra): unify this into a utility method with CallLogAdapter#getNumberType
private static String getLabel(Resources resources, Cursor cursor) {
int numberType = cursor.getInt(Projections.PHONE_TYPE);
String numberLabel = cursor.getString(Projections.PHONE_LABEL);
// Returns empty label instead of "custom" if the custom label is empty.
if (numberType == Phone.TYPE_CUSTOM && TextUtils.isEmpty(numberLabel)) {
return "";
}
return (String) Phone.getTypeLabel(resources, numberType, numberLabel);
}
private static Uri getContactUri(SearchCursor cursor) {
long contactId = cursor.getLong(Projections.ID);
String lookupKey = cursor.getString(Projections.LOOKUP_KEY);
return Contacts.getLookupUri(contactId, lookupKey)
.buildUpon()
.appendQueryParameter(
ContactsContract.DIRECTORY_PARAM_KEY, String.valueOf(cursor.getDirectoryId()))
.build();
}
@Override
public void onClick(View v) {
PreCall.start(context, new CallIntentBuilder(number, CallInitiationType.Type.REGULAR_SEARCH));
}
}