/*
* 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.app.Fragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import androidx.recyclerview.widget.DividerItemDecoration;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import org.linphone.LinphoneContext;
import org.linphone.LinphoneManager;
import org.linphone.R;
import org.linphone.activities.MainActivity;
import org.linphone.call.views.LinphoneLinearLayoutManager;
import org.linphone.contacts.ContactsManager;
import org.linphone.contacts.ContactsUpdatedListener;
import org.linphone.core.Address;
import org.linphone.core.Call;
import org.linphone.core.CallLog;
import org.linphone.core.Core;
import org.linphone.core.CoreListenerStub;
import org.linphone.utils.SelectableHelper;
public class HistoryFragment extends Fragment
implements OnClickListener,
OnItemClickListener,
HistoryViewHolder.ClickListener,
ContactsUpdatedListener,
SelectableHelper.DeleteListener,
LinphoneContext.CoreStartedListener {
private RecyclerView mHistoryList;
private TextView mNoCallHistory, mNoMissedCallHistory;
private ImageView mMissedCalls, mAllCalls;
private View mAllCallsSelected, mMissedCallsSelected;
private boolean mOnlyDisplayMissedCalls;
private List mLogs;
private HistoryAdapter mHistoryAdapter;
private SelectableHelper mSelectionHelper;
private CoreListenerStub mListener;
@Override
public View onCreateView(
LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.history, container, false);
mSelectionHelper = new SelectableHelper(view, this);
mNoCallHistory = view.findViewById(R.id.no_call_history);
mNoMissedCallHistory = view.findViewById(R.id.no_missed_call_history);
mHistoryList = view.findViewById(R.id.history_list);
LinearLayoutManager layoutManager = new LinphoneLinearLayoutManager(getActivity());
mHistoryList.setLayoutManager(layoutManager);
// Divider between items
DividerItemDecoration dividerItemDecoration =
new DividerItemDecoration(
mHistoryList.getContext(), layoutManager.getOrientation());
dividerItemDecoration.setDrawable(getResources().getDrawable(R.drawable.divider));
mHistoryList.addItemDecoration(dividerItemDecoration);
mAllCalls = view.findViewById(R.id.all_calls);
mAllCalls.setOnClickListener(this);
mAllCallsSelected = view.findViewById(R.id.all_calls_select);
mMissedCalls = view.findViewById(R.id.missed_calls);
mMissedCalls.setOnClickListener(this);
mMissedCallsSelected = view.findViewById(R.id.missed_calls_select);
mAllCalls.setEnabled(false);
mOnlyDisplayMissedCalls = false;
mListener =
new CoreListenerStub() {
@Override
public void onCallStateChanged(
Core core, Call call, Call.State state, String message) {
if (state == Call.State.End || state == Call.State.Error) {
reloadData();
}
}
};
return view;
}
@Override
public void onResume() {
super.onResume();
ContactsManager.getInstance().addContactsListener(this);
LinphoneContext.instance().addCoreStartedListener(this);
LinphoneManager.getCore().addListener(mListener);
reloadData();
}
@Override
public void onPause() {
ContactsManager.getInstance().removeContactsListener(this);
LinphoneContext.instance().removeCoreStartedListener(this);
LinphoneManager.getCore().removeListener(mListener);
super.onPause();
}
@Override
public void onContactsUpdated() {
HistoryAdapter adapter = (HistoryAdapter) mHistoryList.getAdapter();
if (adapter != null) {
adapter.notifyDataSetChanged();
}
}
@Override
public void onCoreStarted() {
reloadData();
}
@Override
public void onClick(View v) {
int id = v.getId();
if (id == R.id.all_calls) {
mAllCalls.setEnabled(false);
mAllCallsSelected.setVisibility(View.VISIBLE);
mMissedCallsSelected.setVisibility(View.INVISIBLE);
mMissedCalls.setEnabled(true);
mOnlyDisplayMissedCalls = false;
refresh();
}
if (id == R.id.missed_calls) {
mAllCalls.setEnabled(true);
mAllCallsSelected.setVisibility(View.INVISIBLE);
mMissedCallsSelected.setVisibility(View.VISIBLE);
mMissedCalls.setEnabled(false);
mOnlyDisplayMissedCalls = true;
}
hideHistoryListAndDisplayMessageIfEmpty();
mHistoryAdapter =
new HistoryAdapter((HistoryActivity) getActivity(), mLogs, this, mSelectionHelper);
mHistoryList.setAdapter(mHistoryAdapter);
mSelectionHelper.setAdapter(mHistoryAdapter);
mSelectionHelper.setDialogMessage(R.string.chat_room_delete_dialog);
}
@Override
public void onItemClick(AdapterView> adapter, View view, int position, long id) {
if (mHistoryAdapter.isEditionEnabled()) {
CallLog log = mLogs.get(position);
Core core = LinphoneManager.getCore();
core.removeCallLog(log);
mLogs = Arrays.asList(core.getCallLogs());
}
}
@Override
public void onDeleteSelection(Object[] objectsToDelete) {
int size = mHistoryAdapter.getSelectedItemCount();
for (int i = 0; i < size; i++) {
CallLog log = (CallLog) objectsToDelete[i];
LinphoneManager.getCore().removeCallLog(log);
onResume();
}
}
@Override
public void onItemClicked(int position) {
if (mHistoryAdapter.isEditionEnabled()) {
mHistoryAdapter.toggleSelection(position);
} else {
if (position >= 0 && position < mLogs.size()) {
CallLog log = mLogs.get(position);
Address address;
if (log.getDir() == Call.Dir.Incoming) {
address = log.getFromAddress();
} else {
address = log.getToAddress();
}
if (address != null) {
((MainActivity) getActivity()).newOutgoingCall(address.asStringUriOnly());
}
}
}
}
@Override
public boolean onItemLongClicked(int position) {
if (!mHistoryAdapter.isEditionEnabled()) {
mSelectionHelper.enterEditionMode();
}
mHistoryAdapter.toggleSelection(position);
return true;
}
private void refresh() {
mLogs = Arrays.asList(LinphoneManager.getCore().getCallLogs());
}
public void displayFirstLog() {
Address addr;
if (mLogs != null && mLogs.size() > 0) {
CallLog log = mLogs.get(0); // More recent one is 0
if (log.getDir() == Call.Dir.Incoming) {
addr = log.getFromAddress();
} else {
addr = log.getToAddress();
}
((HistoryActivity) getActivity()).showHistoryDetails(addr);
} else {
((HistoryActivity) getActivity()).showEmptyChildFragment();
}
}
private void reloadData() {
mLogs = Arrays.asList(LinphoneManager.getCore().getCallLogs());
hideHistoryListAndDisplayMessageIfEmpty();
mHistoryAdapter =
new HistoryAdapter((HistoryActivity) getActivity(), mLogs, this, mSelectionHelper);
mHistoryList.setAdapter(mHistoryAdapter);
mSelectionHelper.setAdapter(mHistoryAdapter);
mSelectionHelper.setDialogMessage(R.string.call_log_delete_dialog);
}
private void removeNotMissedCallsFromLogs() {
if (mOnlyDisplayMissedCalls) {
List missedCalls = new ArrayList<>();
for (CallLog log : mLogs) {
if (log.getStatus() == Call.Status.Missed) {
missedCalls.add(log);
}
}
mLogs = missedCalls;
}
}
private void hideHistoryListAndDisplayMessageIfEmpty() {
removeNotMissedCallsFromLogs();
mNoCallHistory.setVisibility(View.GONE);
mNoMissedCallHistory.setVisibility(View.GONE);
if (mLogs.isEmpty()) {
if (mOnlyDisplayMissedCalls) {
mNoMissedCallHistory.setVisibility(View.VISIBLE);
} else {
mNoCallHistory.setVisibility(View.VISIBLE);
}
mHistoryList.setVisibility(View.GONE);
} else {
mNoCallHistory.setVisibility(View.GONE);
mNoMissedCallHistory.setVisibility(View.GONE);
mHistoryList.setVisibility(View.VISIBLE);
}
}
}