/*
* Copyright (c) 2010-2019 Belledonne Communications SARL.
*
* This file is part of linphone-android
* (see https://www.linphone.org).
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*/
package org.linphone.history;
import android.annotation.SuppressLint;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.List;
import org.linphone.R;
import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.LinphoneContact;
import org.linphone.contacts.views.ContactAvatar;
import org.linphone.core.Address;
import org.linphone.core.Call;
import org.linphone.core.CallLog;
import org.linphone.utils.LinphoneUtils;
import org.linphone.utils.SelectableAdapter;
import org.linphone.utils.SelectableHelper;
public class HistoryAdapter extends SelectableAdapter {
private final List mLogs;
private final HistoryActivity mActivity;
private final HistoryViewHolder.ClickListener mClickListener;
public HistoryAdapter(
HistoryActivity activity,
List logs,
HistoryViewHolder.ClickListener listener,
SelectableHelper helper) {
super(helper);
mLogs = logs;
mActivity = activity;
mClickListener = listener;
}
public Object getItem(int position) {
return mLogs.get(position);
}
@NonNull
@Override
public HistoryViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View v =
LayoutInflater.from(parent.getContext())
.inflate(R.layout.history_cell, parent, false);
return new HistoryViewHolder(v, mClickListener);
}
@Override
public void onBindViewHolder(@NonNull final HistoryViewHolder holder, final int position) {
CallLog log = mLogs.get(position);
long timestamp = log.getStartDate() * 1000;
final Address address;
holder.contact.setSelected(true); // For automated horizontal scrolling of long texts
Calendar logTime = Calendar.getInstance();
logTime.setTimeInMillis(timestamp);
holder.separatorText.setText(timestampToHumanDate(logTime));
holder.select.setVisibility(isEditionEnabled() ? View.VISIBLE : View.GONE);
holder.select.setChecked(isSelected(position));
if (position > 0) {
CallLog previousLog = mLogs.get(position - 1);
long previousTimestamp = previousLog.getStartDate() * 1000;
Calendar previousLogTime = Calendar.getInstance();
previousLogTime.setTimeInMillis(previousTimestamp);
if (isSameDay(previousLogTime, logTime)) {
holder.separator.setVisibility(View.GONE);
} else {
holder.separator.setVisibility(View.VISIBLE);
}
} else {
holder.separator.setVisibility(View.VISIBLE);
}
if (log.getDir() == Call.Dir.Incoming) {
address = log.getFromAddress();
if (log.getStatus() == Call.Status.Missed) {
holder.callDirection.setImageResource(R.drawable.call_status_missed);
} else {
holder.callDirection.setImageResource(R.drawable.call_status_incoming);
}
} else {
address = log.getToAddress();
holder.callDirection.setImageResource(R.drawable.call_status_outgoing);
}
LinphoneContact c = ContactsManager.getInstance().findContactFromAddress(address);
String displayName = null;
String sipUri = (address != null) ? address.asString() : "";
if (c != null) {
displayName = c.getFullName();
}
if (displayName == null) {
holder.contact.setText(LinphoneUtils.getAddressDisplayName(sipUri));
} else {
holder.contact.setText(displayName);
}
if (c != null) {
ContactAvatar.displayAvatar(c, holder.avatarLayout);
} else {
ContactAvatar.displayAvatar(holder.contact.getText().toString(), holder.avatarLayout);
}
holder.detail.setVisibility(isEditionEnabled() ? View.INVISIBLE : View.VISIBLE);
holder.detail.setOnClickListener(
!isEditionEnabled()
? new View.OnClickListener() {
@Override
public void onClick(View v) {
mActivity.showHistoryDetails(address);
}
}
: null);
}
@Override
public int getItemCount() {
return mLogs.size();
}
@SuppressLint("SimpleDateFormat")
private String timestampToHumanDate(Calendar cal) {
SimpleDateFormat dateFormat;
if (isToday(cal)) {
return mActivity.getString(R.string.today);
} else if (isYesterday(cal)) {
return mActivity.getString(R.string.yesterday);
} else {
dateFormat =
new SimpleDateFormat(
mActivity.getResources().getString(R.string.history_date_format));
}
return dateFormat.format(cal.getTime());
}
private boolean isSameDay(Calendar cal1, Calendar cal2) {
if (cal1 == null || cal2 == null) {
return false;
}
return (cal1.get(Calendar.ERA) == cal2.get(Calendar.ERA)
&& cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR)
&& cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR));
}
private boolean isToday(Calendar cal) {
return isSameDay(cal, Calendar.getInstance());
}
private boolean isYesterday(Calendar cal) {
Calendar yesterday = Calendar.getInstance();
yesterday.roll(Calendar.DAY_OF_MONTH, -1);
return isSameDay(cal, yesterday);
}
}