| /* |
| * 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.car.dialer; |
| |
| import android.content.Context; |
| import android.content.Intent; |
| import android.graphics.Bitmap; |
| import android.graphics.BitmapFactory; |
| import android.net.Uri; |
| import android.view.View; |
| import android.widget.ImageView; |
| import android.widget.TextView; |
| |
| import com.android.car.apps.common.LetterTileDrawable; |
| import com.android.car.dialer.ui.CircleBitmapDrawable; |
| |
| import java.io.FileNotFoundException; |
| import java.io.InputStream; |
| |
| import androidx.annotation.Nullable; |
| import androidx.car.utils.ListItemBackgroundResolver; |
| import androidx.recyclerview.widget.RecyclerView; |
| |
| /** |
| * A {@link androidx.recyclerview.widget.RecyclerView.ViewHolder} that will parse relevant |
| * views out of a {@code contact_result} layout. |
| */ |
| public class ContactResultViewHolder extends RecyclerView.ViewHolder { |
| private final Context mContext; |
| private final View mContactCard; |
| private final TextView mContactName; |
| private final ImageView mContactPicture; |
| |
| public ContactResultViewHolder(View view) { |
| super(view); |
| mContext = view.getContext(); |
| mContactCard = view.findViewById(R.id.contact_result_card); |
| mContactName = view.findViewById(R.id.contact_name); |
| mContactPicture = view.findViewById(R.id.contact_picture); |
| } |
| |
| /** |
| * Populates the view that is represented by this ViewHolder with the information in the |
| * provided {@link ContactDetails}. |
| */ |
| public void bind(ContactDetails details, int itemCount) { |
| ListItemBackgroundResolver.setBackground(mContactCard, getAdapterPosition(), itemCount); |
| |
| mContactCard.setOnClickListener(v -> { |
| Intent intent = new Intent(); |
| intent.setAction(TelecomIntents.ACTION_SHOW_CONTACT_DETAILS); |
| intent.putExtra(TelecomIntents.CONTACT_LOOKUP_URI_EXTRA, details.lookupUri.toString()); |
| mContext.startActivity(intent); |
| }); |
| |
| mContactName.setText(details.displayName); |
| |
| if (details.photoUri == null) { |
| setLetterDrawableForContact(details); |
| return; |
| } |
| |
| Bitmap bitmap = getContactBitmapFromUri(mContext, details.photoUri); |
| if (bitmap == null) { |
| setLetterDrawableForContact(details); |
| } else { |
| mContactPicture.setScaleType(ImageView.ScaleType.CENTER_CROP); |
| mContactPicture.setImageDrawable( |
| new CircleBitmapDrawable(mContext.getResources(), bitmap)); |
| } |
| } |
| |
| /** |
| * Sets the contact picture to be a rounded, colored circle that has the first letter of the |
| * contact's name in it. |
| */ |
| private void setLetterDrawableForContact(ContactDetails details) { |
| mContactPicture.setScaleType(ImageView.ScaleType.CENTER_INSIDE); |
| LetterTileDrawable letterTileDrawable = new LetterTileDrawable(mContext.getResources()); |
| letterTileDrawable.setContactDetails(details.displayName, details.displayName); |
| letterTileDrawable.setIsCircular(true); |
| mContactPicture.setImageDrawable(letterTileDrawable); |
| } |
| |
| /** |
| * Retrieves the picture that is specified by the given {@link Uri}. |
| */ |
| @Nullable |
| private static Bitmap getContactBitmapFromUri(Context context, Uri uri) { |
| try { |
| InputStream input = context.getContentResolver().openInputStream(uri); |
| return input == null ? null : BitmapFactory.decodeStream(input); |
| } catch (FileNotFoundException e) { |
| return null; |
| } |
| } |
| |
| /** |
| * A struct that holds the details for a contact row. |
| */ |
| public static class ContactDetails { |
| public final String displayName; |
| public final Uri photoUri; |
| public final Uri lookupUri; |
| |
| public ContactDetails(String displayName, String photoUri, Uri lookupUri) { |
| this.displayName = displayName; |
| this.photoUri = photoUri == null ? null : Uri.parse(photoUri); |
| this.lookupUri = lookupUri; |
| } |
| } |
| } |