1d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/* 2d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Copyright (C) 2017 The Android Open Source Project 3d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 4d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Licensed under the Apache License, Version 2.0 (the "License"); 5d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * you may not use this file except in compliance with the License. 6d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * You may obtain a copy of the License at 7d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 8d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * http://www.apache.org/licenses/LICENSE-2.0 9d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * 10d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * Unless required by applicable law or agreed to in writing, software 11d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * distributed under the License is distributed on an "AS IS" BASIS, 12d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * See the License for the specific language governing permissions and 14d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian * limitations under the License. 15d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian */ 16d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 17d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianpackage com.android.dialer.calldetails; 18d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 19d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.content.Context; 208369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanianimport android.support.annotation.NonNull; 21d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.support.v7.widget.RecyclerView; 22d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.support.v7.widget.RecyclerView.ViewHolder; 23d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.view.LayoutInflater; 24d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport android.view.ViewGroup; 258369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanianimport com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; 26d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.dialer.calllogutils.CallTypeHelper; 27d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanianimport com.android.dialer.common.Assert; 282f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianimport com.android.dialer.dialercontact.DialerContact; 298369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanianimport java.util.List; 30d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 31d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian/** Adapter for RecyclerView in {@link CallDetailsActivity}. */ 322f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanianfinal class CallDetailsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 33d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 34d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private static final int HEADER_VIEW_TYPE = 1; 35d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private static final int CALL_ENTRY_VIEW_TYPE = 2; 36d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private static final int FOOTER_VIEW_TYPE = 3; 37d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 382f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian private final DialerContact contact; 398369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian private final List<CallDetailsEntry> callDetailsEntries; 402f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian private final CallDetailsFooterViewHolder.ReportCallIdListener listener; 41d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian private final CallTypeHelper callTypeHelper; 42d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 432f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian CallDetailsAdapter( 448369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian Context context, 452f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @NonNull DialerContact contact, 462f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian @NonNull List<CallDetailsEntry> callDetailsEntries, 472f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian CallDetailsFooterViewHolder.ReportCallIdListener listener) { 48d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian this.contact = Assert.isNotNull(contact); 498369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian this.callDetailsEntries = callDetailsEntries; 502f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian this.listener = listener; 5110ae593a59aa50963e1d3159747da2d65ca79bedEric Erfanian callTypeHelper = new CallTypeHelper(context.getResources()); 52d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 53d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 54d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 55d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 56d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 57d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian switch (viewType) { 58d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian case HEADER_VIEW_TYPE: 59d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new CallDetailsHeaderViewHolder( 60d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian inflater.inflate(R.layout.contact_container, parent, false)); 61d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian case CALL_ENTRY_VIEW_TYPE: 62d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new CallDetailsEntryViewHolder( 63d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian inflater.inflate(R.layout.call_details_entry, parent, false)); 64d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian case FOOTER_VIEW_TYPE: 65d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return new CallDetailsFooterViewHolder( 662f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian inflater.inflate(R.layout.call_details_footer, parent, false), listener); 67d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian default: 682f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian throw Assert.createIllegalStateFailException( 692f1c7586bcce334ca69022eb8dc6d8965ceb6a05Eric Erfanian "No ViewHolder available for viewType: " + viewType); 70d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 71d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 72d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 73d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 74d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public void onBindViewHolder(ViewHolder holder, int position) { 75d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (position == 0) { // Header 76d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian ((CallDetailsHeaderViewHolder) holder).updateContactInfo(contact); 77d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else if (position == getItemCount() - 1) { 788369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian ((CallDetailsFooterViewHolder) holder).setPhoneNumber(contact.getNumber()); 79d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else { 80d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian CallDetailsEntryViewHolder viewHolder = (CallDetailsEntryViewHolder) holder; 818369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian CallDetailsEntry entry = callDetailsEntries.get(position - 1); 82d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian viewHolder.setCallDetails( 838369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian contact.getNumber(), 849a090c89e7a0c43a668bd6e2ac5e5e680f323aedEric Erfanian entry, 85d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian callTypeHelper, 868369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian !entry.getHistoryResultsList().isEmpty() && position != getItemCount() - 2); 87d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 88d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 89d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 90d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 91d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int getItemViewType(int position) { 92d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian if (position == 0) { // Header 93d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return HEADER_VIEW_TYPE; 94d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else if (position == getItemCount() - 1) { 95d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return FOOTER_VIEW_TYPE; 96d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } else { 97d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian return CALL_ENTRY_VIEW_TYPE; 98d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 99d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 100d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian 101d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian @Override 102d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian public int getItemCount() { 1038369df095a73a77b3715f8ae7ba06089cebca4ceEric Erfanian return callDetailsEntries.size() + 2; // Header + footer 104d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian } 105d5e47f6da5b08b13ecdfa7f1edc7e12aeb83fab9Eric Erfanian} 106