1 /* 2 * Copyright (C) 2018 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.car.dialer.ui.favorite; 18 19 import android.view.LayoutInflater; 20 import android.view.View; 21 import android.view.ViewGroup; 22 23 import androidx.annotation.NonNull; 24 import androidx.recyclerview.widget.RecyclerView; 25 26 import com.android.car.dialer.R; 27 import com.android.car.dialer.log.L; 28 import com.android.car.dialer.ui.common.DialerUtils; 29 import com.android.car.dialer.ui.common.OnItemClickedListener; 30 import com.android.car.dialer.ui.common.entity.Header; 31 import com.android.car.telephony.common.Contact; 32 import com.android.car.ui.recyclerview.CarUiRecyclerView; 33 import com.android.car.ui.recyclerview.DelegatingContentLimitingAdapter; 34 35 import java.util.Collections; 36 import java.util.List; 37 38 /** 39 * Adapter class for binding favorite contacts. 40 */ 41 public class FavoriteAdapter extends RecyclerView.Adapter<FavoriteContactViewHolder> implements 42 DelegatingContentLimitingAdapter.ContentLimiting, CarUiRecyclerView.OnAttachListener { 43 private static final String TAG = "CD.FavoriteAdapter"; 44 static final int TYPE_CONTACT = 0; 45 static final int TYPE_HEADER = 1; 46 static final int TYPE_ADD_FAVORITE = 2; 47 48 private Integer mSortMethod; 49 private CarUiRecyclerView mRrecyclerView; 50 private int mLimitingAnchorIndex = 0; 51 52 /** 53 * Listener interface for when the add favorite button is clicked 54 */ 55 public interface OnAddFavoriteClickedListener { 56 /** 57 * Called when the add favorite button is clicked 58 */ onAddFavoriteClicked()59 void onAddFavoriteClicked(); 60 } 61 62 private List<Object> mFavoriteContacts = Collections.emptyList(); 63 private OnItemClickedListener<Contact> mListener; 64 private OnAddFavoriteClickedListener mAddFavoriteListener; 65 66 /** 67 * Sets the favorite contact list. 68 */ setFavoriteContacts(List<Object> favoriteContacts)69 public void setFavoriteContacts(List<Object> favoriteContacts) { 70 L.d(TAG, "setFavoriteContacts %s", favoriteContacts); 71 mFavoriteContacts = (favoriteContacts != null) ? favoriteContacts : Collections.emptyList(); 72 notifyDataSetChanged(); 73 } 74 75 /** 76 * Sets the sorting method for the list. 77 */ setSortMethod(Integer sortMethod)78 public void setSortMethod(Integer sortMethod) { 79 mSortMethod = sortMethod; 80 } 81 82 @Override getItemCount()83 public int getItemCount() { 84 return mFavoriteContacts.size(); 85 } 86 87 @Override getItemViewType(int position)88 public int getItemViewType(int position) { 89 Object item = mFavoriteContacts.get(position); 90 if (item instanceof Contact) { 91 return TYPE_CONTACT; 92 } else if (item instanceof Header) { 93 return TYPE_HEADER; 94 } else { 95 return TYPE_ADD_FAVORITE; 96 } 97 } 98 99 @Override onCreateViewHolder(ViewGroup parent, int viewType)100 public FavoriteContactViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 101 int layoutId; 102 if (viewType == TYPE_CONTACT) { 103 layoutId = R.layout.favorite_contact_list_item; 104 } else if (viewType == TYPE_HEADER) { 105 layoutId = R.layout.header_item; 106 } else { 107 layoutId = R.layout.add_favorite_list_item; 108 } 109 110 View view = LayoutInflater.from(parent.getContext()).inflate(layoutId, parent, false); 111 return new FavoriteContactViewHolder(view); 112 } 113 114 @Override onBindViewHolder(FavoriteContactViewHolder viewHolder, int position)115 public void onBindViewHolder(FavoriteContactViewHolder viewHolder, int position) { 116 int itemViewType = getItemViewType(position); 117 switch (itemViewType) { 118 case TYPE_CONTACT: 119 Contact contact = (Contact) mFavoriteContacts.get(position); 120 viewHolder.bind(contact, mSortMethod); 121 viewHolder.itemView.setOnClickListener(v -> onItemViewClicked(contact)); 122 break; 123 case TYPE_HEADER: 124 Header header = (Header) mFavoriteContacts.get(position); 125 viewHolder.onBind(header); 126 viewHolder.itemView.setOnClickListener(null); 127 viewHolder.itemView.setFocusable(false); 128 break; 129 case TYPE_ADD_FAVORITE: 130 viewHolder.itemView.setOnClickListener(v -> { 131 if (mAddFavoriteListener != null) { 132 mAddFavoriteListener.onAddFavoriteClicked(); 133 } 134 }); 135 break; 136 } 137 } 138 139 @Override onAttachedToCarUiRecyclerView(@onNull CarUiRecyclerView recyclerView)140 public void onAttachedToCarUiRecyclerView(@NonNull CarUiRecyclerView recyclerView) { 141 mRrecyclerView = recyclerView; 142 } 143 144 @Override onDetachedFromCarUiRecyclerView(@onNull CarUiRecyclerView recyclerView)145 public void onDetachedFromCarUiRecyclerView(@NonNull CarUiRecyclerView recyclerView) { 146 mRrecyclerView = null; 147 } 148 149 @Override getScrollToPositionWhenRestricted()150 public int getScrollToPositionWhenRestricted() { 151 // Not scrolling. 152 return -1; 153 } 154 155 @Override computeAnchorIndexWhenRestricting()156 public int computeAnchorIndexWhenRestricting() { 157 mLimitingAnchorIndex = DialerUtils.getFirstVisibleItemPosition(mRrecyclerView); 158 return mLimitingAnchorIndex; 159 } 160 161 /** 162 * Returns the previous list limiting anchor position. 163 */ getLastLimitingAnchorIndex()164 public int getLastLimitingAnchorIndex() { 165 return mLimitingAnchorIndex; 166 } 167 onItemViewClicked(Contact contact)168 private void onItemViewClicked(Contact contact) { 169 if (mListener != null) { 170 mListener.onItemClicked(contact); 171 } 172 } 173 174 /** 175 * Sets a {@link OnItemClickedListener listener} which will be called when an item is clicked. 176 */ setOnListItemClickedListener(OnItemClickedListener<Contact> listener)177 public void setOnListItemClickedListener(OnItemClickedListener<Contact> listener) { 178 mListener = listener; 179 } 180 181 /** 182 * Sets a {@link OnAddFavoriteClickedListener listener} which will be called when the "Add 183 * favorite" button is clicked. 184 */ setOnAddFavoriteClickedListener(OnAddFavoriteClickedListener listener)185 public void setOnAddFavoriteClickedListener(OnAddFavoriteClickedListener listener) { 186 mAddFavoriteListener = listener; 187 } 188 } 189