blob: 18339089616b67f37a0d891bb56d2a2678c8dc17 [file] [log] [blame]
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -04001/*
Adrien Béraude552f692020-11-03 14:30:52 -05002 * Copyright (C) 2004-2020 Savoir-faire Linux Inc.
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -04003 *
4 * Author: Hadrien De Sousa <hadrien.desousa@savoirfairelinux.com>
Adrien Béraud64538722018-03-15 17:34:00 -04005 * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -04006 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License as published by
9 * the Free Software Foundation; either version 3 of the License, or
10 * (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 */
21package cx.ring.conversation;
22
Pierre Duchemine0c3a492018-02-01 16:22:45 -050023import java.io.File;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040024
25import javax.inject.Inject;
Adrien Béraudace37a22018-06-22 14:58:36 -040026import javax.inject.Named;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040027
28import cx.ring.daemon.Blob;
29import cx.ring.facades.ConversationFacade;
Adrien Béraud20d42212018-03-02 14:40:38 -050030import cx.ring.model.Account;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040031import cx.ring.model.CallContact;
32import cx.ring.model.Conference;
33import cx.ring.model.Conversation;
Adrien Béraud7c505112018-03-20 16:03:28 -040034import cx.ring.model.DataTransfer;
Adrien Bérauda0226ff2019-11-21 15:24:42 -050035import cx.ring.model.Error;
Adrien Béraud37fb52e2020-10-02 19:24:31 -040036import cx.ring.model.Interaction;
Aline Bonnet15fdf0a2017-04-26 17:02:58 -040037import cx.ring.model.SipCall;
Pierre Duchemin1fa61922018-01-18 10:09:02 -050038import cx.ring.model.TrustRequest;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040039import cx.ring.model.Uri;
40import cx.ring.mvp.RootPresenter;
41import cx.ring.services.AccountService;
42import cx.ring.services.ContactService;
Pierre Duchemin4af6b392018-02-02 11:23:56 -050043import cx.ring.services.DeviceRuntimeService;
Hadrien De Sousa45fb21b2017-12-14 11:06:48 -050044import cx.ring.services.HardwareService;
Amirhossein4ae37ef2020-11-30 23:26:27 -050045import cx.ring.services.PreferencesService;
Hadrien De Sousa6cd2bd22018-01-02 16:11:32 -050046import cx.ring.services.VCardService;
Hadrien De Sousa0dc83162017-11-10 16:15:18 -050047import cx.ring.utils.Log;
Adrien Béraudace37a22018-06-22 14:58:36 -040048import cx.ring.utils.StringUtils;
Adrien Béraud5477ce82020-02-24 11:13:54 -050049import cx.ring.utils.Tuple;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040050import cx.ring.utils.VCardUtils;
Amirhossein5ee9d412020-04-04 13:44:52 -040051import io.reactivex.Observable;
Adrien Béraudace37a22018-06-22 14:58:36 -040052import io.reactivex.Scheduler;
53import io.reactivex.disposables.CompositeDisposable;
54import io.reactivex.schedulers.Schedulers;
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -040055import io.reactivex.subjects.BehaviorSubject;
56import io.reactivex.subjects.Subject;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040057
Adrien Béraudace37a22018-06-22 14:58:36 -040058public class ConversationPresenter extends RootPresenter<ConversationView> {
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040059
Hadrien De Sousa0dc83162017-11-10 16:15:18 -050060 private static final String TAG = ConversationPresenter.class.getSimpleName();
Adrien Béraud68f1adb2018-07-18 18:35:21 -040061 private final ContactService mContactService;
Adrien Béraudace37a22018-06-22 14:58:36 -040062 private final AccountService mAccountService;
Adrien Béraudace37a22018-06-22 14:58:36 -040063 private final HardwareService mHardwareService;
64 private final ConversationFacade mConversationFacade;
65 private final VCardService mVCardService;
66 private final DeviceRuntimeService mDeviceRuntimeService;
Amirhossein4ae37ef2020-11-30 23:26:27 -050067 private final PreferencesService mPreferencesService;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040068
69 private Conversation mConversation;
Adrien Béraudfd458ea2020-02-28 13:40:18 -050070 private Uri mContactUri;
Hadrien De Sousa0dc83162017-11-10 16:15:18 -050071 private String mAccountId;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040072
Adrien Béraudace37a22018-06-22 14:58:36 -040073 private CompositeDisposable mConversationDisposable;
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -040074 private final CompositeDisposable mVisibilityDisposable = new CompositeDisposable();
Adrien Béraudace37a22018-06-22 14:58:36 -040075
76 @Inject
77 @Named("UiScheduler")
78 protected Scheduler mUiScheduler;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040079
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -040080 private final Subject<Conversation> mConversationSubject = BehaviorSubject.create();
81
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040082 @Inject
Adrien Béraud64538722018-03-15 17:34:00 -040083 public ConversationPresenter(ContactService contactService,
84 AccountService accountService,
Hadrien De Sousa45fb21b2017-12-14 11:06:48 -050085 HardwareService hardwareService,
Hadrien De Sousa0dc83162017-11-10 16:15:18 -050086 ConversationFacade conversationFacade,
Hadrien De Sousa6cd2bd22018-01-02 16:11:32 -050087 VCardService vCardService,
Amirhossein4ae37ef2020-11-30 23:26:27 -050088 DeviceRuntimeService deviceRuntimeService, PreferencesService preferencesService) {
Adrien Béraudc35f7f42020-04-15 15:29:29 -040089 mContactService = contactService;
90 mAccountService = accountService;
91 mHardwareService = hardwareService;
92 mConversationFacade = conversationFacade;
93 mVCardService = vCardService;
94 mDeviceRuntimeService = deviceRuntimeService;
Amirhossein4ae37ef2020-11-30 23:26:27 -050095 mPreferencesService = preferencesService;
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -040096 }
97
98 @Override
Adrien Béraudace37a22018-06-22 14:58:36 -040099 public void bindView(ConversationView view) {
100 super.bindView(view);
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -0400101 mCompositeDisposable.add(mVisibilityDisposable);
102 if (mConversationDisposable == null && mConversation != null)
103 initView(mConversation, view);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400104 }
105
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500106 public void init(Uri contactRingId, String accountId) {
Adrien Béraudace37a22018-06-22 14:58:36 -0400107 Log.w(TAG, "init " + contactRingId + " " + accountId);
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500108 mContactUri = contactRingId;
Hadrien De Sousa0dc83162017-11-10 16:15:18 -0500109 mAccountId = accountId;
Adrien Béraude5ec8952018-07-11 15:14:44 -0400110 Account account = mAccountService.getAccount(accountId);
Adrien Béraud9c166312019-10-25 14:24:15 -0400111 if (account != null) {
Adrien Béraude5ec8952018-07-11 15:14:44 -0400112 initContact(account, contactRingId, getView());
Adrien Béraud9c166312019-10-25 14:24:15 -0400113 mCompositeDisposable.add(mConversationFacade.loadConversationHistory(account, contactRingId)
114 .observeOn(mUiScheduler)
115 .subscribe(this::setConversation, e -> getView().goToHome()));
116 } else {
117 getView().goToHome();
Adrien Bérauddbb351f2020-12-04 18:20:04 -0500118 return;
Adrien Béraud9c166312019-10-25 14:24:15 -0400119 }
Amirhossein5ee9d412020-04-04 13:44:52 -0400120
121 mCompositeDisposable.add(Observable.combineLatest(
122 mHardwareService.getConnectivityState(),
Adrien Bérauddbb351f2020-12-04 18:20:04 -0500123 mAccountService.getObservableAccount(account),
Amirhossein5ee9d412020-04-04 13:44:52 -0400124 (isConnected, a) -> isConnected || a.isRegistered())
125 .observeOn(mUiScheduler)
126 .subscribe(isOk -> {
127 ConversationView view = getView();
128 if (view != null) {
129 if (isOk)
130 view.hideErrorPanel();
131 else
132 view.displayNetworkErrorPanel();
133 }
134 }));
Adrien Béraudace37a22018-06-22 14:58:36 -0400135 }
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500136
Adrien Béraudace37a22018-06-22 14:58:36 -0400137 private void setConversation(final Conversation conversation) {
138 if (conversation == null || mConversation == conversation)
139 return;
140 mConversation = conversation;
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -0400141 mConversationSubject.onNext(conversation);
142 ConversationView view = getView();
143 if (view != null)
144 initView(conversation, view);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400145 }
146
147 public void pause() {
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -0400148 mVisibilityDisposable.clear();
Adrien Béraudace37a22018-06-22 14:58:36 -0400149 if (mConversation != null) {
Adrien Béraud64538722018-03-15 17:34:00 -0400150 mConversation.setVisible(false);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400151 }
152 }
153
Amirhossein68916382020-07-19 11:23:59 -0400154 public void resume(boolean isBubble) {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500155 Log.w(TAG, "resume " + mConversation + " " + mAccountId + " " + mContactUri);
Adrien Béraud7aa7a9e2018-06-29 19:50:32 -0400156 mVisibilityDisposable.clear();
Adrien Béraude5ec8952018-07-11 15:14:44 -0400157 mVisibilityDisposable.add(mConversationSubject
158 .firstOrError()
159 .subscribe(conversation -> {
160 conversation.setVisible(true);
Adrien Béraud4a643052019-11-18 12:41:23 -0500161 updateOngoingCallView(conversation);
Amirhossein68916382020-07-19 11:23:59 -0400162 mConversationFacade.readMessages(mAccountService.getAccount(mAccountId), conversation, !isBubble);
Rayan Osseiran6f415662019-10-25 14:23:25 -0400163 }, e -> Log.e(TAG, "Error loading conversation", e)));
Adrien Béraudace37a22018-06-22 14:58:36 -0400164 }
165
Rayan Osseiran6f415662019-10-25 14:23:25 -0400166 private CallContact initContact(final Account account, final Uri uri,
167 final ConversationView view) {
Adrien Béraudace37a22018-06-22 14:58:36 -0400168 CallContact contact;
Adrien Béraudf5d5ce92020-05-07 03:02:19 -0400169 if (account.isJami()) {
Adrien Béraudace37a22018-06-22 14:58:36 -0400170 String rawId = uri.getRawRingId();
171 contact = account.getContact(rawId);
172 if (contact == null) {
173 contact = account.getContactFromCache(uri);
Adrien Béraudbf81ead2019-06-29 00:16:43 -0400174 TrustRequest req = account.getRequest(uri);
Adrien Béraudace37a22018-06-22 14:58:36 -0400175 if (req == null) {
Adrien Béraude5ec8952018-07-11 15:14:44 -0400176 view.switchToUnknownView(contact.getRingUsername());
Adrien Béraudace37a22018-06-22 14:58:36 -0400177 } else {
Adrien Béraude5ec8952018-07-11 15:14:44 -0400178 view.switchToIncomingTrustRequestView(req.getDisplayname());
Adrien Béraudace37a22018-06-22 14:58:36 -0400179 }
180 } else {
Adrien Béraude5ec8952018-07-11 15:14:44 -0400181 view.switchToConversationView();
Adrien Béraudace37a22018-06-22 14:58:36 -0400182 }
183 Log.w(TAG, "initContact " + contact.getUsername());
184 if (contact.getUsername() == null) {
185 mAccountService.lookupAddress(mAccountId, "", rawId);
186 }
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500187 } else {
Adrien Béraudace37a22018-06-22 14:58:36 -0400188 contact = mContactService.findContact(account, uri);
Adrien Béraude5ec8952018-07-11 15:14:44 -0400189 view.switchToConversationView();
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500190 }
Adrien Béraud78ae7b92018-08-25 19:04:17 -0400191 view.displayContact(contact);
Adrien Béraudace37a22018-06-22 14:58:36 -0400192 return contact;
193 }
194
195 private void initView(final Conversation c, final ConversationView view) {
196 Log.w(TAG, "initView");
197 if (mConversationDisposable == null) {
198 mConversationDisposable = new CompositeDisposable();
199 mCompositeDisposable.add(mConversationDisposable);
200 }
201 mConversationDisposable.clear();
202 view.hideNumberSpinner();
203
204 Account account = mAccountService.getAccount(mAccountId);
Adrien Béraudace37a22018-06-22 14:58:36 -0400205
Rayan Osseiran6f415662019-10-25 14:23:25 -0400206
Adrien Béraudace37a22018-06-22 14:58:36 -0400207 mConversationDisposable.add(c.getSortedHistory()
Adrien Béraudf2c76ed2019-05-25 03:36:48 -0400208 .subscribe(view::refreshView, e -> Log.e(TAG, "Can't update element", e)));
Adrien Bérauda084cd12018-12-31 12:49:12 -0500209 mConversationDisposable.add(c.getCleared()
Adrien Béraud08eb45e2019-02-18 01:58:12 -0500210 .observeOn(mUiScheduler)
Rayan Osseiran6f415662019-10-25 14:23:25 -0400211 .subscribe(view::refreshView, e -> Log.e(TAG, "Can't update elements", e)));
Adrien Béraud9ec82442019-02-18 01:55:16 -0500212 mConversationDisposable.add(mContactService.getLoadedContact(c.getAccountId(), c.getContact())
Adrien Béraudace37a22018-06-22 14:58:36 -0400213 .observeOn(mUiScheduler)
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500214 .subscribe(contact -> initContact(account, mContactUri, view), e -> Log.e(TAG, "Can't get contact", e)));
Adrien Béraudace37a22018-06-22 14:58:36 -0400215 mConversationDisposable.add(c.getUpdatedElements()
216 .observeOn(mUiScheduler)
Rayan Osseiran6f415662019-10-25 14:23:25 -0400217 .subscribe(elementTuple -> {
218 switch(elementTuple.second) {
219 case ADD:
220 view.addElement(elementTuple.first);
221 break;
222 case UPDATE:
223 view.updateElement(elementTuple.first);
224 break;
225 case REMOVE:
226 view.removeElement(elementTuple.first);
227 break;
228 }
229 }, e -> Log.e(TAG, "Can't update element", e)));
Amirhossein4ae37ef2020-11-30 23:26:27 -0500230 if (showTypingIndicator()) {
231 mConversationDisposable.add(c.getComposingStatus()
232 .observeOn(mUiScheduler)
233 .subscribe(view::setComposingStatus));
234 }
Adrien Béraud263cd5c2020-03-13 13:36:57 -0400235 mConversationDisposable.add(c.getLastDisplayed()
236 .observeOn(mUiScheduler)
237 .subscribe(view::setLastDisplayed));
Adrien Béraudace37a22018-06-22 14:58:36 -0400238 mConversationDisposable.add(c.getCalls()
239 .observeOn(mUiScheduler)
Adrien Béraud4a643052019-11-18 12:41:23 -0500240 .subscribe(calls -> updateOngoingCallView(mConversation), e -> Log.e(TAG, "Can't update call view", e)));
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500241 mConversationDisposable.add(c.getColor()
242 .observeOn(mUiScheduler)
Rayan Osseiran6f415662019-10-25 14:23:25 -0400243 .subscribe(view::setConversationColor, e -> Log.e(TAG, "Can't update conversation color", e)));
Adrien Béraud5477ce82020-02-24 11:13:54 -0500244
245 Log.e(TAG, "getLocationUpdates subscribe");
246 mConversationDisposable.add(account
247 .getLocationUpdates(c.getContact().getPrimaryUri())
248 .observeOn(mUiScheduler)
249 .subscribe(u -> {
250 Log.e(TAG, "getLocationUpdates: update");
251 getView().showMap(c.getAccountId(), c.getContact().getPrimaryUri().getUri(), false);
252 }));
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400253 }
254
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500255 public void openContact() {
Adrien Béraud91f88742019-09-09 00:46:46 -0400256 if (mConversation != null)
257 getView().goToContactActivity(mAccountId, mConversation.getContact().getPrimaryNumber());
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400258 }
259
Hadrien De Sousa0dc83162017-11-10 16:15:18 -0500260 public void sendTextMessage(String message) {
Adrien Béraud91f88742019-09-09 00:46:46 -0400261 if (StringUtils.isEmpty(message) || mConversation == null) {
Adrien Béraudace37a22018-06-22 14:58:36 -0400262 return;
263 }
264 Conference conference = mConversation.getCurrentCall();
265 if (conference == null || !conference.isOnGoing()) {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500266 mConversationFacade.sendTextMessage(mAccountId, mConversation, mContactUri, message).subscribe();
Adrien Béraudace37a22018-06-22 14:58:36 -0400267 } else {
268 mConversationFacade.sendTextMessage(mConversation, conference, message);
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400269 }
270 }
271
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500272 public void selectFile() {
273 getView().openFilePicker();
274 }
275
Adrien Béraud64538722018-03-15 17:34:00 -0400276 public void sendFile(File file) {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500277 mConversationFacade.sendFile(mAccountId, mContactUri, file).subscribe();
Pierre Duchemine0c3a492018-02-01 16:22:45 -0500278 }
279
amine younes7c56f312019-06-10 11:34:25 -0400280 /**
281 * Gets the absolute path of the file dataTransfer and sends both the DataTransfer and the
282 * found path to the ConversationView in order to start saving the file
Rayan Osseiran6f415662019-10-25 14:23:25 -0400283 *
284 * @param interaction an interaction representing a datat transfer
amine younes7c56f312019-06-10 11:34:25 -0400285 */
Rayan Osseiran6f415662019-10-25 14:23:25 -0400286 public void saveFile(Interaction interaction) {
287 DataTransfer transfer = (DataTransfer) interaction;
288 String fileAbsolutePath = getDeviceRuntimeService().
amine younes7c56f312019-06-10 11:34:25 -0400289 getConversationPath(transfer.getPeerId(), transfer.getStoragePath())
Rayan Osseiran6f415662019-10-25 14:23:25 -0400290 .getAbsolutePath();
291 getView().startSaveFile(transfer, fileAbsolutePath);
Adrien Béraud7c505112018-03-20 16:03:28 -0400292 }
293
Rayan Osseiran6f415662019-10-25 14:23:25 -0400294 public void shareFile(Interaction interaction) {
295 DataTransfer file = (DataTransfer) interaction;
Adrien Béraudfcf457f2018-04-03 17:46:34 -0400296 File path = getDeviceRuntimeService().getConversationPath(file.getPeerId(), file.getStoragePath());
297 getView().shareFile(path);
298 }
299
Rayan Osseiran6f415662019-10-25 14:23:25 -0400300 public void openFile(Interaction interaction) {
301 DataTransfer file = (DataTransfer) interaction;
Adrien Béraudb2b3f442018-12-01 17:42:38 -0500302 File path = getDeviceRuntimeService().getConversationPath(file.getPeerId(), file.getStoragePath());
303 getView().openFile(path);
304 }
305
Rayan Osseiran6f415662019-10-25 14:23:25 -0400306 public void deleteConversationItem(Interaction element) {
Rayan Osseirane634a562019-05-29 13:44:55 -0400307 mConversationFacade.deleteConversationItem(element);
308 }
309
Rayan Osseiran6f415662019-10-25 14:23:25 -0400310 public void cancelMessage(Interaction message) {
Rayan Osseirane634a562019-05-29 13:44:55 -0400311 mConversationFacade.cancelMessage(message);
Adrien Béraud7c505112018-03-20 16:03:28 -0400312 }
313
Adrien Béraud4a643052019-11-18 12:41:23 -0500314 private void sendTrustRequest() {
Adrien Béraud0acf5a12018-08-02 13:40:40 -0400315 final String accountId = mAccountId;
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500316 final Uri contactId = mContactUri;
Adrien Béraud1cab7d12020-08-06 12:38:58 -0400317 CallContact contact = mContactService.findContact(mAccountService.getAccount(accountId), contactId);
318 if (contact != null) {
319 contact.setStatus(CallContact.Status.REQUEST_SENT);
320 }
Adrien Béraudbdfb5e12019-02-18 15:46:44 -0500321 mVCardService.loadSmallVCard(accountId, VCardService.MAX_SIZE_REQUEST)
322 .subscribeOn(Schedulers.computation())
Adrien Béraud1cab7d12020-08-06 12:38:58 -0400323 .subscribe(vCard -> mAccountService.sendTrustRequest(accountId, contactId.getRawRingId(), Blob.fromString(VCardUtils.vcardToString(vCard))),
324 e -> mAccountService.sendTrustRequest(accountId, contactId.getRawRingId(), null));
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400325 }
326
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400327 public void clickOnGoingPane() {
Amirhossein1cbc8df2020-08-14 11:48:30 -0400328 Conference conf = mConversation == null ? null : mConversation.getCurrentCall();
Adrien Beraud4f644382017-07-21 17:01:51 -0400329 if (conf != null) {
330 getView().goToCallActivity(conf.getId());
331 } else {
Hadrien De Sousa0dc83162017-11-10 16:15:18 -0500332 getView().displayOnGoingCallPane(false);
Adrien Beraud4f644382017-07-21 17:01:51 -0400333 }
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400334 }
335
Adrien Béraud4a643052019-11-18 12:41:23 -0500336 public void goToCall(boolean audioOnly) {
Adrien Béraudd3bf4e42018-02-14 14:44:41 +0100337 if (audioOnly && !mHardwareService.hasMicrophone()) {
Adrien Bérauda0226ff2019-11-21 15:24:42 -0500338 getView().displayErrorToast(Error.NO_MICROPHONE);
Hadrien De Sousa45fb21b2017-12-14 11:06:48 -0500339 return;
340 }
341
Adrien Béraud4a643052019-11-18 12:41:23 -0500342 mCompositeDisposable.add(mConversationSubject
343 .firstElement()
344 .subscribe(conversation -> {
345 ConversationView view = getView();
346 if (view != null) {
347 Conference conf = mConversation.getCurrentCall();
348 if (conf != null
349 && !conf.getParticipants().isEmpty()
350 && conf.getParticipants().get(0).getCallStatus() != SipCall.CallStatus.INACTIVE
351 && conf.getParticipants().get(0).getCallStatus() != SipCall.CallStatus.FAILURE) {
352 view.goToCallActivity(conf.getId());
353 } else {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500354 view.goToCallActivityWithResult(mAccountId, mContactUri.getRawUriString(), audioOnly);
Adrien Béraud4a643052019-11-18 12:41:23 -0500355 }
356 }
357 }));
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400358 }
359
Adrien Béraud4a643052019-11-18 12:41:23 -0500360 private void updateOngoingCallView(Conversation conversation) {
361 Conference conf = conversation == null ? null : conversation.getCurrentCall();
Rayan Osseiran6f415662019-10-25 14:23:25 -0400362 if (conf != null && (conf.getState() == SipCall.CallStatus.CURRENT || conf.getState() == SipCall.CallStatus.HOLD || conf.getState() == SipCall.CallStatus.RINGING)) {
Adrien Béraud20d42212018-03-02 14:40:38 -0500363 getView().displayOnGoingCallPane(true);
364 } else {
365 getView().displayOnGoingCallPane(false);
366 }
Hadrien De Sousaec95e5e2017-03-21 15:28:23 -0400367 }
368
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500369 public void onBlockIncomingContactRequest() {
370 String accountId = mAccountId == null ? mAccountService.getCurrentAccount().getAccountID() : mAccountId;
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500371 mConversationFacade.discardRequest(accountId, mContactUri);
372 mAccountService.removeContact(accountId, mContactUri.getHost(), true);
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500373
374 getView().goToHome();
375 }
376
377 public void onRefuseIncomingContactRequest() {
378 String accountId = mAccountId == null ? mAccountService.getCurrentAccount().getAccountID() : mAccountId;
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500379
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500380 mConversationFacade.discardRequest(accountId, mContactUri);
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500381 getView().goToHome();
382 }
383
384 public void onAcceptIncomingContactRequest() {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500385 mConversationFacade.acceptRequest(mAccountId, mContactUri);
Adrien Béraudace37a22018-06-22 14:58:36 -0400386 getView().switchToConversationView();
387 }
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500388
Adrien Béraudace37a22018-06-22 14:58:36 -0400389 public void onAddContact() {
390 sendTrustRequest();
Pierre Duchemin1fa61922018-01-18 10:09:02 -0500391 getView().switchToConversationView();
392 }
393
Pierre Duchemin4af6b392018-02-02 11:23:56 -0500394 public DeviceRuntimeService getDeviceRuntimeService() {
395 return mDeviceRuntimeService;
396 }
Pierre Duchemindf6cb5a2018-02-09 18:05:21 -0500397
398 public void noSpaceLeft() {
399 Log.e(TAG, "configureForFileInfoTextMessage: no space left on device");
Adrien Bérauda0226ff2019-11-21 15:24:42 -0500400 getView().displayErrorToast(Error.NO_SPACE_LEFT);
Pierre Duchemindf6cb5a2018-02-09 18:05:21 -0500401 }
Adrien Béraud0f3ee3d2018-12-08 22:03:54 -0500402
403 public void setConversationColor(int color) {
404 mCompositeDisposable.add(mConversationSubject
405 .firstElement()
406 .subscribe(conversation -> conversation.setColor(color)));
407 }
Rayan Osseiran38206c62019-05-15 14:49:03 -0400408
409 public void cameraPermissionChanged(boolean isGranted) {
410 if (isGranted && mHardwareService.isVideoAvailable()) {
Adrien Béraud37fb52e2020-10-02 19:24:31 -0400411 mHardwareService.initVideo()
412 .onErrorComplete()
413 .subscribe();
Rayan Osseiran38206c62019-05-15 14:49:03 -0400414 }
415 }
416
Adrien Béraud5477ce82020-02-24 11:13:54 -0500417 public void shareLocation() {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500418 getView().startShareLocation(mAccountId, mContactUri.getUri());
Adrien Béraud5477ce82020-02-24 11:13:54 -0500419 }
420
421 public Tuple<String, String> getPath() {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500422 return new Tuple<>(mAccountId, mContactUri.getUri());
423 }
424
425 public void onComposingChanged(boolean hasMessage) {
Amirhossein4ae37ef2020-11-30 23:26:27 -0500426 if (mConversation == null || !showTypingIndicator()) {
Adrien Béraudfd458ea2020-02-28 13:40:18 -0500427 return;
428 }
429 mConversationFacade.setIsComposing(mAccountId, mContactUri, hasMessage);
Adrien Béraud5477ce82020-02-24 11:13:54 -0500430 }
Amirhossein4ae37ef2020-11-30 23:26:27 -0500431
432 public boolean showTypingIndicator() {
433 return mPreferencesService.getSettings().isAllowTypingIndicator();
434 }
435
Adrien Béraude32ab742018-08-25 21:15:08 -0400436}