blob: b1bab2c829633425345337d25e8747fcad119e75 [file] [log] [blame]
Hadrien De Sousaccc947d2017-04-12 14:26:52 -04001/*
Sébastien Blinab53ada2019-01-02 17:23:00 -05002 * Copyright (C) 2004-2019 Savoir-faire Linux Inc.
Hadrien De Sousaccc947d2017-04-12 14:26:52 -04003 *
4 * Author: Hadrien De Sousa <hadrien.desousa@savoirfairelinux.com>
Adrien Béraudace37a22018-06-22 14:58:36 -04005 * Author: Adrien Béraud <adrien.beraud@savoirfairelinux.com>
Hadrien De Sousaccc947d2017-04-12 14:26:52 -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.call;
22
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040023import java.util.concurrent.TimeUnit;
24
25import javax.inject.Inject;
Adrien Béraudace37a22018-06-22 14:58:36 -040026import javax.inject.Named;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040027
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040028import cx.ring.model.SipCall;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040029import cx.ring.mvp.RootPresenter;
30import cx.ring.services.AccountService;
31import cx.ring.services.CallService;
Adrien Béraud8d710752019-02-20 13:53:59 -050032import cx.ring.services.ContactService;
Rayan Osseiran38206c62019-05-15 14:49:03 -040033import cx.ring.services.DeviceRuntimeService;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040034import cx.ring.services.HardwareService;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040035import cx.ring.services.NotificationService;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040036import cx.ring.utils.Log;
Hadrien De Sousac165e9b2017-11-24 12:33:32 -050037import cx.ring.utils.StringUtils;
Adrien Béraudace37a22018-06-22 14:58:36 -040038import io.reactivex.Scheduler;
Adrien Béraud3aeed5d2018-07-26 11:26:13 -040039import io.reactivex.disposables.Disposable;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040040
Adrien Béraudace37a22018-06-22 14:58:36 -040041public class CallPresenter extends RootPresenter<CallView> {
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040042
43 public final static String TAG = CallPresenter.class.getSimpleName();
44
Adrien Béraudace37a22018-06-22 14:58:36 -040045 private AccountService mAccountService;
Adrien Béraud8d710752019-02-20 13:53:59 -050046 private ContactService mContactService;
Adrien Béraudace37a22018-06-22 14:58:36 -040047 private NotificationService mNotificationService;
48 private HardwareService mHardwareService;
49 private CallService mCallService;
Rayan Osseiran38206c62019-05-15 14:49:03 -040050 private DeviceRuntimeService mDeviceRuntimeService;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040051
52 private SipCall mSipCall;
53 private boolean mOnGoingCall = false;
Hadrien De Sousa203164c2017-12-05 17:41:42 -050054 private boolean mAudioOnly = true;
Adrien Béraud335d32e2019-05-31 09:31:40 -040055 private boolean permissionChanged = false;
Rayan Osseiranc1532d42019-06-05 13:17:53 -040056 private boolean pipIsActive = false;
Rayan Osseiran3dd04662019-06-28 16:47:48 -040057 private boolean incomingIsFullIntent = true;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040058
59 private int videoWidth = -1;
60 private int videoHeight = -1;
61 private int previewWidth = -1;
62 private int previewHeight = -1;
63
Adrien Béraud3aeed5d2018-07-26 11:26:13 -040064 private Disposable timeUpdateTask = null;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040065
66 @Inject
Adrien Béraudace37a22018-06-22 14:58:36 -040067 @Named("UiScheduler")
68 protected Scheduler mUiScheduler;
69
70 @Inject
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040071 public CallPresenter(AccountService accountService,
Adrien Béraud8d710752019-02-20 13:53:59 -050072 ContactService contactService,
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040073 NotificationService notificationService,
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040074 HardwareService hardwareService,
Rayan Osseiran38206c62019-05-15 14:49:03 -040075 CallService callService, DeviceRuntimeService deviceRuntimeService) {
Adrien Béraudace37a22018-06-22 14:58:36 -040076 mAccountService = accountService;
Adrien Béraud8d710752019-02-20 13:53:59 -050077 mContactService = contactService;
Adrien Béraudace37a22018-06-22 14:58:36 -040078 mNotificationService = notificationService;
79 mHardwareService = hardwareService;
80 mCallService = callService;
Rayan Osseiran38206c62019-05-15 14:49:03 -040081 mDeviceRuntimeService = deviceRuntimeService;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040082 }
83
Rayan Osseiran38206c62019-05-15 14:49:03 -040084 public void cameraPermissionChanged(boolean isGranted) {
85 if (isGranted && mHardwareService.isVideoAvailable()) {
86 mHardwareService.initVideo();
Adrien Béraud335d32e2019-05-31 09:31:40 -040087 permissionChanged = true;
Rayan Osseiran38206c62019-05-15 14:49:03 -040088 }
89 }
90
91 public void audioPermissionChanged(boolean isGranted) {
Rayan Osseirandb4667e2019-05-31 09:41:54 -040092 if (isGranted && mHardwareService.hasMicrophone()) {
Rayan Osseiran38206c62019-05-15 14:49:03 -040093 mCallService.setAudioPlugin(mCallService.getCurrentAudioOutputPlugin());
94 }
95 }
96
97
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040098 @Override
Hadrien De Sousaccc947d2017-04-12 14:26:52 -040099 public void unbindView() {
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500100 if (!mAudioOnly) {
Adrien Béraud30532a52018-09-11 15:10:05 -0400101 mHardwareService.endCapture();
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400102 }
Adrien Béraud99fd4202018-12-13 13:02:21 -0500103 super.unbindView();
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400104 }
105
106 @Override
107 public void bindView(CallView view) {
108 super.bindView(view);
Adrien Béraudace37a22018-06-22 14:58:36 -0400109 mCompositeDisposable.add(mAccountService.getRegisteredNames()
110 .observeOn(mUiScheduler)
111 .subscribe(r -> {
112 if (mSipCall != null && mSipCall.getContact() != null) {
113 getView().updateContactBubble(mSipCall.getContact());
114 }
115 }));
116 mCompositeDisposable.add(mHardwareService.getVideoEvents()
117 .observeOn(mUiScheduler)
118 .subscribe(this::onVideoEvent));
Adrien Béraud057e9a32018-09-30 17:48:55 -0400119 mCompositeDisposable.add(mHardwareService
120 .getBluetoothEvents()
121 .subscribe(event -> {
122 if (!event.connected && mSipCall != null) {
123 hangupCall();
124 }
125 }));
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400126 }
127
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500128 public void initOutGoing(String accountId, String contactRingId, boolean audioOnly) {
Adrien Béraud85683c22018-05-23 11:18:43 -0400129 if (accountId == null || contactRingId == null) {
130 Log.e(TAG, "initOutGoing: null account or contact");
131 getView().finish();
132 return;
133 }
Hadrien De Sousafcf2a992017-12-15 11:08:56 -0500134 if (mHardwareService.getCameraCount() == 0) {
Adrien Béraudd3bf4e42018-02-14 14:44:41 +0100135 audioOnly = true;
Hadrien De Sousafcf2a992017-12-15 11:08:56 -0500136 }
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400137 //getView().blockScreenRotation();
Adrien Béraudace37a22018-06-22 14:58:36 -0400138
139 mCompositeDisposable.add(mCallService
140 .placeCallObservable(accountId, StringUtils.toNumber(contactRingId), audioOnly)
141 .observeOn(mUiScheduler)
Rayan Osseiran38206c62019-05-15 14:49:03 -0400142 .subscribe(call -> {
Adrien Béraud2c378b32018-07-11 15:24:02 -0400143 contactUpdate(call);
Adrien Béraud99fd4202018-12-13 13:02:21 -0500144 confUpdate(call);
Rayan Osseirandb4667e2019-05-31 09:41:54 -0400145 }, e -> {
146 hangupCall();
147 Log.e(TAG, "Error with initOutgoing: " + e.getMessage());
148 }));
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400149 }
150
Rayan Osseiran3dd04662019-06-28 16:47:48 -0400151 public void updateIncomingCall(String confId) {
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400152 //getView().blockScreenRotation();
Adrien Béraudace37a22018-06-22 14:58:36 -0400153 mCompositeDisposable.add(mCallService.getCallUpdates(confId)
154 .observeOn(mUiScheduler)
155 .subscribe(call -> {
Adrien Béraud2c378b32018-07-11 15:24:02 -0400156 contactUpdate(call);
Adrien Béraud99fd4202018-12-13 13:02:21 -0500157 confUpdate(call);
Rayan Osseirandb4667e2019-05-31 09:41:54 -0400158 }, e -> {
159 hangupCall();
Rayan Osseiran3dd04662019-06-28 16:47:48 -0400160 Log.e(TAG, "Error with updateIncoming: " + e.getMessage());
Rayan Osseirandb4667e2019-05-31 09:41:54 -0400161 }));
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400162 }
163
Rayan Osseiran3dd04662019-06-28 16:47:48 -0400164 public void initIncoming(String confId) {
165 mCompositeDisposable.add(mCallService.getCallUpdates(confId).observeOn(mUiScheduler).firstOrError().subscribe(call -> {
166 incomingIsFullIntent = false;
167 contactUpdate(call);
168 confUpdate(call);
169 getView().prepareCall(true);
170 }, e -> {
171 hangupCall();
172 Log.e(TAG, "Error with initIncoming: " + e.getMessage());
173 }));
174 }
175
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400176 public void prepareOptionMenu() {
177 boolean isSpeakerOn = mHardwareService.isSpeakerPhoneOn();
178 boolean hasContact = mSipCall != null && null != mSipCall.getContact() && mSipCall.getContact().isUnknown();
179 boolean canDial = mOnGoingCall && mSipCall != null && !mSipCall.isIncoming();
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500180 boolean hasMultipleCamera = mHardwareService.getCameraCount() > 1 && mOnGoingCall && !mAudioOnly;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400181 getView().initMenu(isSpeakerOn, hasContact, hasMultipleCamera, canDial, mOnGoingCall);
182 }
183
184 public void chatClick() {
185 if (mSipCall == null
186 || mSipCall.getContact() == null
187 || mSipCall.getContact().getIds() == null
188 || mSipCall.getContact().getIds().isEmpty()) {
189 return;
190 }
Adrien Béraudace37a22018-06-22 14:58:36 -0400191 getView().goToConversation(mSipCall.getAccount(), mSipCall.getContact().getIds().get(0));
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400192 }
193
Adrien Béraudbc0898e2018-08-23 14:31:11 -0400194 public void speakerClick(boolean checked) {
195 mHardwareService.toggleSpeakerphone(checked);
196 }
197
198 public void muteMicrophoneToggled(boolean checked) {
199 mCallService.setMuted(checked);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400200 }
201
Rayan Osseiran38206c62019-05-15 14:49:03 -0400202
Adrien Béraudec19fad2018-12-30 16:51:05 -0500203 public boolean isMicrophoneMuted() {
204 return mCallService.isCaptureMuted();
205 }
206
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400207 public void switchVideoInputClick() {
Adrien Béraud335d32e2019-05-31 09:31:40 -0400208 mHardwareService.switchInput(mSipCall.getCallId(), false);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400209 getView().switchCameraIcon(mHardwareService.isPreviewFromFrontCamera());
210 }
211
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400212 public void configurationChanged(int rotation) {
213 mHardwareService.setDeviceOrientation(rotation);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400214 }
215
216 public void dialpadClick() {
217 getView().displayDialPadKeyboard();
218 }
219
220 public void acceptCall() {
221 if (mSipCall == null) {
222 return;
223 }
224 mCallService.accept(mSipCall.getCallId());
225 }
226
227 public void hangupCall() {
228 if (mSipCall != null) {
229 mCallService.hangUp(mSipCall.getCallId());
230 }
231 finish();
232 }
233
234 public void refuseCall() {
Adrien Béraudace37a22018-06-22 14:58:36 -0400235 final SipCall call = mSipCall;
236 if (call != null) {
237 mCallService.refuse(call.getCallId());
238 mNotificationService.cancelCallNotification(call.getCallId().hashCode());
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400239 }
240 finish();
241 }
242
243 public void videoSurfaceCreated(Object holder) {
Alexandre Lisione4d40262016-12-12 14:30:09 -0500244 if (mSipCall == null) {
245 return;
246 }
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400247 mHardwareService.addVideoSurface(mSipCall.getCallId(), holder);
248 getView().displayContactBubble(false);
249 }
250
251 public void previewVideoSurfaceCreated(Object holder) {
Adrien Béraud0c14a9e2019-06-01 19:28:14 -0400252 mHardwareService.addPreviewVideoSurface(holder, mSipCall);
Adrien Béraud30532a52018-09-11 15:10:05 -0400253 //mHardwareService.startCapture(null);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400254 }
255
256 public void videoSurfaceDestroyed() {
257 if (mSipCall == null) {
258 return;
259 }
260 mHardwareService.removeVideoSurface(mSipCall.getCallId());
261 }
262
263 public void previewVideoSurfaceDestroyed() {
264 mHardwareService.removePreviewVideoSurface();
Adrien Béraud30532a52018-09-11 15:10:05 -0400265 mHardwareService.endCapture();
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400266 }
267
268 public void displayChanged() {
Adrien Béraud335d32e2019-05-31 09:31:40 -0400269 mHardwareService.switchInput(mSipCall.getCallId(), false);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400270 }
271
272 public void layoutChanged() {
Adrien Béraudde0d4522018-12-12 12:11:02 -0500273 //getView().resetVideoSize(videoWidth, videoHeight, previewWidth, previewHeight);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400274 }
275
Rayan Osseiran38206c62019-05-15 14:49:03 -0400276
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400277 public void uiVisibilityChanged(boolean displayed) {
Adrien Béraud665faa22018-07-26 16:51:20 -0400278 CallView view = getView();
279 if (view != null)
280 view.displayHangupButton(mOnGoingCall && displayed);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400281 }
282
283 private void finish() {
Adrien Béraud3aeed5d2018-07-26 11:26:13 -0400284 if (timeUpdateTask != null && !timeUpdateTask.isDisposed()) {
285 timeUpdateTask.dispose();
286 timeUpdateTask = null;
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400287 }
288 mSipCall = null;
Adrien Béraud8d6baf32018-08-03 23:37:31 -0400289 CallView view = getView();
290 if (view != null)
291 view.finish();
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400292 }
293
Adrien Béraud2c378b32018-07-11 15:24:02 -0400294 private void contactUpdate(final SipCall call) {
295 if (mSipCall != call) {
296 mSipCall = call;
Adrien Béraud8d710752019-02-20 13:53:59 -0500297 mCompositeDisposable.add(mContactService.observeContact(call.getAccount(), call.getContact())
Adrien Béraud2c378b32018-07-11 15:24:02 -0400298 .observeOn(mUiScheduler)
Rayan Osseirandb4667e2019-05-31 09:41:54 -0400299 .subscribe(c -> getView().updateContactBubble(c), e -> Log.e(TAG, e.getMessage())));
Adrien Béraud2c378b32018-07-11 15:24:02 -0400300 }
301 }
302
Adrien Béraud99fd4202018-12-13 13:02:21 -0500303 private void confUpdate(SipCall call) {
304 mAudioOnly = call.isAudioOnly();
Adrien Béraudace37a22018-06-22 14:58:36 -0400305 CallView view = getView();
Adrien Béraud99fd4202018-12-13 13:02:21 -0500306 if (view == null)
307 return;
308 view.updateMenu();
309 if (call.isOnGoing()) {
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400310 mOnGoingCall = true;
Rayan Osseiran8c59d2e2019-06-28 11:06:08 -0400311 mHardwareService.toggleSpeakerphone(!mAudioOnly);
Adrien Béraudec19fad2018-12-30 16:51:05 -0500312 view.initNormalStateDisplay(mAudioOnly, mHardwareService.isSpeakerPhoneOn(), isMicrophoneMuted());
Adrien Béraudace37a22018-06-22 14:58:36 -0400313 view.updateMenu();
Hadrien De Sousa203164c2017-12-05 17:41:42 -0500314 if (!mAudioOnly) {
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400315 mHardwareService.setPreviewSettings();
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400316 view.displayVideoSurface(true, mDeviceRuntimeService.hasVideoPermission());
Rayan Osseiran3dd04662019-06-28 16:47:48 -0400317 if (permissionChanged) {
Adrien Béraud335d32e2019-05-31 09:31:40 -0400318 mHardwareService.switchInput(mSipCall.getCallId(), permissionChanged);
319 permissionChanged = false;
Rayan Osseiran38206c62019-05-15 14:49:03 -0400320 }
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400321 }
Adrien Béraud3aeed5d2018-07-26 11:26:13 -0400322 if (timeUpdateTask != null)
323 timeUpdateTask.dispose();
Adrien Béraud99fd4202018-12-13 13:02:21 -0500324 timeUpdateTask = mUiScheduler.schedulePeriodicallyDirect(this::updateTime, 0, 1, TimeUnit.SECONDS);
325 } else if (call.isRinging()) {
326 if (call.isIncoming()) {
327 if (mAccountService.getAccount(call.getAccount()).isAutoanswerEnabled()) {
328 mCallService.accept(call.getCallId());
Rayan Osseiran3dd04662019-06-28 16:47:48 -0400329 // only display the incoming call screen if the notification is a full screen intent
330 } else if (incomingIsFullIntent) {
Adrien Béraudace37a22018-06-22 14:58:36 -0400331 view.initIncomingCallDisplay();
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400332 }
333 } else {
334 mOnGoingCall = false;
Adrien Béraud99fd4202018-12-13 13:02:21 -0500335 view.updateCallStatus(call.getCallState());
Adrien Béraudace37a22018-06-22 14:58:36 -0400336 view.initOutGoingCallDisplay();
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400337 }
338 } else {
339 finish();
340 }
341 }
342
343 private void updateTime() {
Adrien Béraud6325fad2018-08-15 15:34:11 -0400344 CallView view = getView();
345 if (view != null && mSipCall != null) {
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400346 long duration = System.currentTimeMillis() - mSipCall.getTimestampStart();
347 duration = duration / 1000;
348 if (mSipCall.isOnGoing()) {
Adrien Béraud6325fad2018-08-15 15:34:11 -0400349 view.updateTime(duration);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400350 }
351 }
352 }
353
Adrien Béraudace37a22018-06-22 14:58:36 -0400354 private void onVideoEvent(HardwareService.VideoEvent event) {
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400355 Log.d(TAG, "VIDEO_EVENT: " + event.start + " " + event.callId + " " + event.w + "x" + event.h);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400356
Adrien Béraudace37a22018-06-22 14:58:36 -0400357 if (event.start) {
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400358 getView().displayVideoSurface(true, !isPipMode() && mDeviceRuntimeService.hasVideoPermission());
Adrien Béraudace37a22018-06-22 14:58:36 -0400359 } else if (mSipCall != null && mSipCall.getCallId().equals(event.callId)) {
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400360 getView().displayVideoSurface(event.started, event.started && !isPipMode() && mDeviceRuntimeService.hasVideoPermission());
Adrien Béraudace37a22018-06-22 14:58:36 -0400361 if (event.started) {
362 videoWidth = event.w;
363 videoHeight = event.h;
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400364 getView().resetVideoSize(videoWidth, videoHeight);
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400365 }
Adrien Béraud30532a52018-09-11 15:10:05 -0400366 } else if (event.callId == null) {
367 if (event.started) {
368 previewWidth = event.w;
369 previewHeight = event.h;
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400370 getView().resetPreviewVideoSize(previewWidth, previewHeight, event.rot);
Adrien Béraud30532a52018-09-11 15:10:05 -0400371 }
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400372 }
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400373 /*if (event.started || event.start) {
Adrien Béraudde0d4522018-12-12 12:11:02 -0500374 getView().resetVideoSize(videoWidth, videoHeight, previewWidth, previewHeight);
Adrien Béraudeb4bb002019-03-14 15:52:48 -0400375 }*/
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400376 }
Pierre Duchemin8b2c1b52017-12-29 17:17:13 -0500377
378 public void positiveButtonClicked() {
379 if (mSipCall.isRinging() && mSipCall.isIncoming()) {
380 acceptCall();
381 } else {
382 hangupCall();
383 }
384 }
385
386 public void negativeButtonClicked() {
387 if (mSipCall.isRinging() && mSipCall.isIncoming()) {
388 refuseCall();
389 } else {
390 hangupCall();
391 }
392 }
393
394 public void toggleButtonClicked() {
395 if (!(mSipCall.isRinging() && mSipCall.isIncoming())) {
396 hangupCall();
397 }
398 }
Adrien Béraud79808d02018-02-20 00:16:28 +0100399
Rayan Osseiran38206c62019-05-15 14:49:03 -0400400 public boolean isAudioOnly() {
401 return mAudioOnly;
402 }
403
Adrien Béraud79808d02018-02-20 00:16:28 +0100404 public void requestPipMode() {
Adrien Béraud6325fad2018-08-15 15:34:11 -0400405 if (mSipCall != null && mSipCall.isOnGoing() && !mSipCall.isAudioOnly()) {
Adrien Béraud79808d02018-02-20 00:16:28 +0100406 getView().enterPipMode(mSipCall);
407 }
408 }
409
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400410 public boolean isPipMode() {
411 return pipIsActive;
412 }
413
Adrien Béraud79808d02018-02-20 00:16:28 +0100414 public void pipModeChanged(boolean pip) {
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400415 pipIsActive = pip;
Adrien Béraud79808d02018-02-20 00:16:28 +0100416 if (pip) {
417 getView().displayHangupButton(false);
418 getView().displayPreviewSurface(false);
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400419 getView().displayVideoSurface(true, false);
Adrien Béraud79808d02018-02-20 00:16:28 +0100420 } else {
421 getView().displayPreviewSurface(true);
Rayan Osseiranc1532d42019-06-05 13:17:53 -0400422 getView().displayVideoSurface(true, mDeviceRuntimeService.hasVideoPermission());
Adrien Béraud79808d02018-02-20 00:16:28 +0100423 }
424 }
Adrien Béraudbc0898e2018-08-23 14:31:11 -0400425
426 public boolean isSpeakerphoneOn() {
427 return mHardwareService.isSpeakerPhoneOn();
428 }
Adrien Béraudbcbb4d42018-12-08 16:06:39 -0500429
430 public void sendDtmf(CharSequence s) {
431 mCallService.playDtmf(s.toString());
432 }
Hadrien De Sousaccc947d2017-04-12 14:26:52 -0400433}