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