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