/* * 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.ImageView; import android.widget.ListView; import android.widget.RelativeLayout; import android.widget.TextView; import java.util.Arrays; import java.util.List; import org.linphone.LinphoneManager; import org.linphone.R; import org.linphone.activities.MainActivity; 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.core.ChatRoom; import org.linphone.core.ChatRoomBackend; import org.linphone.core.ChatRoomListenerStub; import org.linphone.core.ChatRoomParams; import org.linphone.core.Core; import org.linphone.core.CoreListenerStub; import org.linphone.core.Factory; import org.linphone.core.FriendCapability; import org.linphone.core.ProxyConfig; import org.linphone.core.tools.Log; import org.linphone.settings.LinphonePreferences; import org.linphone.utils.LinphoneUtils; public class HistoryDetailFragment extends Fragment { private ImageView mAddToContacts; private ImageView mGoToContact; private TextView mContactName, mContactAddress; private String mSipUri, mDisplayName; private RelativeLayout mWaitLayout, mAvatarLayout, mChatSecured; private LinphoneContact mContact; private ChatRoom mChatRoom; private ChatRoomListenerStub mChatRoomCreationListener; private ListView mLogsList; private CoreListenerStub mListener; @Override public View onCreateView( LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { mSipUri = getArguments().getString("SipUri"); mDisplayName = getArguments().getString("DisplayName"); View view = inflater.inflate(R.layout.history_detail, container, false); mWaitLayout = view.findViewById(R.id.waitScreen); mWaitLayout.setVisibility(View.GONE); ImageView dialBack = view.findViewById(R.id.call); dialBack.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { ((MainActivity) getActivity()).newOutgoingCall(mSipUri); } }); ImageView back = view.findViewById(R.id.back); back.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { ((HistoryActivity) getActivity()).goBack(); } }); back.setVisibility( getResources().getBoolean(R.bool.isTablet) ? View.INVISIBLE : View.VISIBLE); ImageView chat = view.findViewById(R.id.chat); chat.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { goToChat(false); } }); mChatSecured = view.findViewById(R.id.chat_secured); mChatSecured.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { goToChat(true); } }); if (getResources().getBoolean(R.bool.force_end_to_end_encryption_in_chat)) { chat.setVisibility(View.GONE); } if (getResources().getBoolean(R.bool.disable_chat)) { chat.setVisibility(View.GONE); mChatSecured.setVisibility(View.GONE); } mAddToContacts = view.findViewById(R.id.add_contact); mAddToContacts.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { Address addr = Factory.instance().createAddress(mSipUri); if (addr != null) { addr.clean(); ((HistoryActivity) getActivity()) .showContactsListForCreationOrEdition(addr); } } }); mGoToContact = view.findViewById(R.id.goto_contact); mGoToContact.setOnClickListener( new OnClickListener() { @Override public void onClick(View v) { ((HistoryActivity) getActivity()).showContactDetails(mContact); } }); mAvatarLayout = view.findViewById(R.id.avatar_layout); mContactName = view.findViewById(R.id.contact_name); mContactAddress = view.findViewById(R.id.contact_address); mChatRoomCreationListener = new ChatRoomListenerStub() { @Override public void onStateChanged(ChatRoom cr, ChatRoom.State newState) { if (newState == ChatRoom.State.Created) { mWaitLayout.setVisibility(View.GONE); ((HistoryActivity) getActivity()) .showChatRoom(cr.getLocalAddress(), cr.getPeerAddress()); } else if (newState == ChatRoom.State.CreationFailed) { mWaitLayout.setVisibility(View.GONE); ((HistoryActivity) getActivity()).displayChatRoomError(); Log.e( "[History Detail Fragment] Group mChat room for address " + cr.getPeerAddress() + " has failed !"); } } }; mLogsList = view.findViewById(R.id.logs_list); 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) { displayHistory(); } } }; return view; } @Override public void onResume() { super.onResume(); LinphoneManager.getCore().addListener(mListener); displayHistory(); } @Override public void onPause() { if (mChatRoom != null) { mChatRoom.removeListener(mChatRoomCreationListener); } LinphoneManager.getCore().removeListener(mListener); super.onPause(); } private void displayHistory() { if (mSipUri != null) { Address address = Factory.instance().createAddress(mSipUri); mChatSecured.setVisibility(View.GONE); Core core = LinphoneManager.getCore(); if (address != null && core != null) { address.clean(); ProxyConfig proxyConfig = core.getDefaultProxyConfig(); CallLog[] logs; if (proxyConfig != null) { logs = core.getCallHistory(address, proxyConfig.getIdentityAddress()); } else { logs = core.getCallHistoryForAddress(address); } List logsList = Arrays.asList(logs); mLogsList.setAdapter( new HistoryLogAdapter( getActivity(), R.layout.history_detail_cell, logsList)); mContactAddress.setText(LinphoneUtils.getDisplayableAddress(address)); mContact = ContactsManager.getInstance().findContactFromAddress(address); if (mDisplayName == null) { mDisplayName = LinphoneUtils.getAddressDisplayName(address); } if (mContact != null) { mContactName.setText(mContact.getFullName()); ContactAvatar.displayAvatar(mContact, mAvatarLayout); mAddToContacts.setVisibility(View.GONE); mGoToContact.setVisibility(View.VISIBLE); if (!getResources().getBoolean(R.bool.disable_chat) && mContact.hasPresenceModelForUriOrTelCapability( address.asStringUriOnly(), FriendCapability.LimeX3Dh)) { mChatSecured.setVisibility(View.VISIBLE); } } else { mContactName.setText(mDisplayName); ContactAvatar.displayAvatar(mDisplayName, mAvatarLayout); mAddToContacts.setVisibility(View.VISIBLE); mGoToContact.setVisibility(View.GONE); } } else { mContactAddress.setText(mSipUri); mContactName.setText( mDisplayName == null ? LinphoneUtils.getAddressDisplayName(mSipUri) : mDisplayName); } } } private void goToChat(boolean isSecured) { Core core = LinphoneManager.getCore(); if (core == null) return; Address participant = Factory.instance().createAddress(mSipUri); if (participant == null) { Log.e("[History Detail] Couldn't parse ", mSipUri); return; } ProxyConfig defaultProxyConfig = core.getDefaultProxyConfig(); if (defaultProxyConfig != null) { ChatRoom room = core.findOneToOneChatRoom( defaultProxyConfig.getIdentityAddress(), participant, isSecured); if (room != null) { ((HistoryActivity) getActivity()) .showChatRoom(room.getLocalAddress(), room.getPeerAddress()); } else { if (defaultProxyConfig.getConferenceFactoryUri() != null && (isSecured || !LinphonePreferences.instance().useBasicChatRoomFor1To1())) { mWaitLayout.setVisibility(View.VISIBLE); ChatRoomParams params = core.createDefaultChatRoomParams(); params.enableEncryption(isSecured); params.enableGroup(false); // We don't want a basic chat room, // so if isSecured is false we have to set this manually params.setBackend(ChatRoomBackend.FlexisipChat); Address[] participants = new Address[1]; participants[0] = participant; mChatRoom = core.createChatRoom( params, getString(R.string.dummy_group_chat_subject), participants); if (mChatRoom != null) { mChatRoom.addListener(mChatRoomCreationListener); } else { Log.w("[History Detail Fragment] createChatRoom returned null..."); mWaitLayout.setVisibility(View.GONE); } } else { room = core.getChatRoom(participant); if (room != null) { ((HistoryActivity) getActivity()) .showChatRoom(room.getLocalAddress(), room.getPeerAddress()); } } } } else { if (isSecured) { Log.e( "[History Detail Fragment] Can't create a secured chat room without proxy config"); return; } ChatRoom room = core.getChatRoom(participant); if (room != null) { ((HistoryActivity) getActivity()) .showChatRoom(room.getLocalAddress(), room.getPeerAddress()); } } } }