diff options
author | linyuh <linyuh@google.com> | 2018-03-14 15:21:01 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-03-14 23:40:58 -0700 |
commit | 664284702162f44c681fac95d95a97a3f1711490 (patch) | |
tree | 68b322d28d444284dc987acee519c211de2973fa /java/com/android/dialer/calldetails/CallDetailsAdapterCommon.java | |
parent | ede6377e397f4b4d6f6a46d09c10efc52724531a (diff) |
Split CallDetailsActivity
Bug: 74202944
Test: Existing tests
PiperOrigin-RevId: 189095432
Change-Id: I13015ee6c5767edd95b78c3fb2e7338495e9e1d7
Diffstat (limited to 'java/com/android/dialer/calldetails/CallDetailsAdapterCommon.java')
-rw-r--r-- | java/com/android/dialer/calldetails/CallDetailsAdapterCommon.java | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/java/com/android/dialer/calldetails/CallDetailsAdapterCommon.java b/java/com/android/dialer/calldetails/CallDetailsAdapterCommon.java new file mode 100644 index 000000000..27feff89d --- /dev/null +++ b/java/com/android/dialer/calldetails/CallDetailsAdapterCommon.java @@ -0,0 +1,152 @@ +/* + * 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.dialer.calldetails; + +import android.content.Context; +import android.support.annotation.CallSuper; +import android.support.v7.widget.RecyclerView; +import android.support.v7.widget.RecyclerView.ViewHolder; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import com.android.dialer.calldetails.CallDetailsEntries.CallDetailsEntry; +import com.android.dialer.calldetails.CallDetailsFooterViewHolder.DeleteCallDetailsListener; +import com.android.dialer.calldetails.CallDetailsFooterViewHolder.ReportCallIdListener; +import com.android.dialer.calldetails.CallDetailsHeaderViewHolder.CallDetailsHeaderListener; +import com.android.dialer.calllogutils.CallTypeHelper; +import com.android.dialer.calllogutils.CallbackActionHelper; +import com.android.dialer.calllogutils.CallbackActionHelper.CallbackAction; +import com.android.dialer.common.Assert; +import com.android.dialer.duo.DuoComponent; + +/** + * Contains common logic shared between {@link OldCallDetailsAdapter} and {@link + * CallDetailsAdapter}. + */ +abstract class CallDetailsAdapterCommon extends RecyclerView.Adapter<RecyclerView.ViewHolder> { + + private static final int HEADER_VIEW_TYPE = 1; + private static final int CALL_ENTRY_VIEW_TYPE = 2; + private static final int FOOTER_VIEW_TYPE = 3; + + private final CallDetailsHeaderListener callDetailsHeaderListener; + private final ReportCallIdListener reportCallIdListener; + private final DeleteCallDetailsListener deleteCallDetailsListener; + private final CallTypeHelper callTypeHelper; + + private CallDetailsEntries callDetailsEntries; + + protected abstract void bindCallDetailsHeaderViewHolder( + CallDetailsHeaderViewHolder viewHolder, int position); + + protected abstract CallDetailsHeaderViewHolder createCallDetailsHeaderViewHolder( + View container, CallDetailsHeaderListener callDetailsHeaderListener); + + /** Returns the phone number of the call details. */ + protected abstract String getNumber(); + + CallDetailsAdapterCommon( + Context context, + CallDetailsEntries callDetailsEntries, + CallDetailsHeaderListener callDetailsHeaderListener, + ReportCallIdListener reportCallIdListener, + DeleteCallDetailsListener deleteCallDetailsListener) { + this.callDetailsEntries = callDetailsEntries; + this.callDetailsHeaderListener = callDetailsHeaderListener; + this.reportCallIdListener = reportCallIdListener; + this.deleteCallDetailsListener = deleteCallDetailsListener; + this.callTypeHelper = + new CallTypeHelper(context.getResources(), DuoComponent.get(context).getDuo()); + } + + @Override + @CallSuper + public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { + LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + switch (viewType) { + case HEADER_VIEW_TYPE: + return createCallDetailsHeaderViewHolder( + inflater.inflate(R.layout.contact_container, parent, false), callDetailsHeaderListener); + case CALL_ENTRY_VIEW_TYPE: + return new CallDetailsEntryViewHolder( + inflater.inflate(R.layout.call_details_entry, parent, false)); + case FOOTER_VIEW_TYPE: + return new CallDetailsFooterViewHolder( + inflater.inflate(R.layout.call_details_footer, parent, false), + reportCallIdListener, + deleteCallDetailsListener); + default: + throw Assert.createIllegalStateFailException( + "No ViewHolder available for viewType: " + viewType); + } + } + + @Override + @CallSuper + public void onBindViewHolder(ViewHolder holder, int position) { + if (position == 0) { // Header + bindCallDetailsHeaderViewHolder((CallDetailsHeaderViewHolder) holder, position); + } else if (position == getItemCount() - 1) { + ((CallDetailsFooterViewHolder) holder).setPhoneNumber(getNumber()); + } else { + CallDetailsEntryViewHolder viewHolder = (CallDetailsEntryViewHolder) holder; + CallDetailsEntry entry = callDetailsEntries.getEntries(position - 1); + viewHolder.setCallDetails( + getNumber(), + entry, + callTypeHelper, + !entry.getHistoryResultsList().isEmpty() && position != getItemCount() - 2); + } + } + + @Override + @CallSuper + public int getItemViewType(int position) { + if (position == 0) { // Header + return HEADER_VIEW_TYPE; + } else if (position == getItemCount() - 1) { + return FOOTER_VIEW_TYPE; + } else { + return CALL_ENTRY_VIEW_TYPE; + } + } + + @Override + @CallSuper + public int getItemCount() { + return callDetailsEntries.getEntriesCount() == 0 + ? 0 + : callDetailsEntries.getEntriesCount() + 2; // plus header and footer + } + + final CallDetailsEntries getCallDetailsEntries() { + return callDetailsEntries; + } + + final void updateCallDetailsEntries(CallDetailsEntries entries) { + callDetailsEntries = entries; + notifyDataSetChanged(); + } + + final @CallbackAction int getCallbackAction() { + Assert.checkState(!callDetailsEntries.getEntriesList().isEmpty()); + + CallDetailsEntry entry = callDetailsEntries.getEntries(0); + return CallbackActionHelper.getCallbackAction( + getNumber(), entry.getFeatures(), entry.getIsDuoCall()); + } +} |