2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
4 // Licensed under the Flora License, Version 1.1 (the License);
5 // you may not use this file except in compliance with the License.
6 // You may obtain a copy of the License at
8 // http://floralicense.org/license/
10 // Unless required by applicable law or agreed to in writing, software
11 // distributed under the License is distributed on an AS IS BASIS,
12 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 // See the License for the specific language governing permissions and
14 // limitations under the License.
18 * @file CallBaseForm.cpp
19 * @brief Base class for all Call forms
21 #include "CallActiveCallForm.h"
22 #include "CallIncomingCallForm.h"
23 #include "CallBaseForm.h"
25 #include "CallPresentationModel.h"
26 #include "CallConfCallerListForm.h"
27 #include "CallPhoneFormFactory.h"
28 #include "CallSceneRegister.h"
31 using namespace Tizen::App;
32 using namespace Tizen::Base;
33 using namespace Tizen::Ui;
34 using namespace Tizen::Base::Collection;
35 using namespace Tizen::Ui;
36 using namespace Tizen::Ui::Scenes;
37 using namespace Tizen::Ui::Controls;
39 BaseForm::BaseForm(FormType formType)
40 : __formType(formType)
42 __pCallPresentor = null;
43 __pErrorMsgPopup = null;
46 BaseForm::~BaseForm(void)
51 BaseForm::OnInitializing(void)
53 //To be implemented in sub classes
58 BaseForm::OnActionPerformed(const Control& source, int actionId)
62 /////////////////////////////////////////////////////////////////
63 ///// Event Listener methods from ITelephonyEventListener /////
64 /////////////////////////////////////////////////////////////////
67 BaseForm::HandleCallConnected(IListT<AppCallInfo>& pCallList)
69 if(__pCallPresentor->IsIncomingorDialingCallPresent() == true)
71 //This scenario will come, if 1 call is disconnected from conf. call having 2 participants.
72 //In this case, if there is any dialing call exists, then ignore.
73 //Else, if there is any incoming call exists, then update call option popup.
76 case FORMTYPE_INCOMINGCALL:
78 IncomingCallForm* pIncomingCallForm = dynamic_cast<IncomingCallForm*>(this);
79 if (pIncomingCallForm != null)
81 pIncomingCallForm->CallDisconnected();
92 SceneManager* pSceneManager = SceneManager::GetInstance();
96 case FORMTYPE_OUTGOINGCALL:
97 case FORMTYPE_INCOMINGCALL:
98 case FORMTYPE_CONFCALLLIST:
99 case FORMTYPE_ACTIVECALL:
100 case FORMTYPE_ACTIVECONFCALL:
102 int noOfCalls = pCallList.GetCount();
103 //Ownership - To be deleted in 'OnSceneActivatedN' of next form
104 ArrayList* pCallInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter);
105 pCallInfoList->Construct(noOfCalls);
107 for (int index = 0; index < noOfCalls; index++)
109 //fetch call info and add to list
110 AppCallInfo callInfo;
111 result r = pCallList.GetAt(index, callInfo);
114 //copy call information to new instance
115 AppCallInfo* pCaller = new (std::nothrow) AppCallInfo();
117 pCallInfoList->Add(pCaller);
123 //Check if active call is conference call
124 AppCallInfo* pActiveCallInfo = static_cast<AppCallInfo*>(pCallInfoList->GetAt(0));
125 if(pActiveCallInfo->IsConferenceCall() == true)
127 //single Conference call - goto active Conf. call form
128 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_CONFCALL,
129 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
133 //single active call - goto active call form
134 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_ACTIVECALL,
135 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
138 else if(noOfCalls == 2)
140 //goto multiple active call form
141 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_MULTIPLEACTIVECALL,
142 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
147 case FORMTYPE_MULTIPLECALLS:
149 //This case can come on Multiple Calls screen, when one of the calls is conference call with 2 participants
150 //and one of the participants exits himself from ConfCall.
151 int noOfCalls = pCallList.GetCount();
152 AppLogDebug("Active Call Count = %d", noOfCalls);
153 //this is just a safety check, call count will aleays be 2 here.
154 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
155 if(noOfCalls == IDI_MAX_ACTIVE_CALLS && pActiveCallForm != null)
158 pActiveCallForm->UpdateMultipleCallScreen(pCallList);
163 case FORMTYPE_EMERGENCYOUTGOINGCALL:
165 //Ownership - To be deleted in 'OnSceneActivatedN' of next form
166 ArrayList* pCallInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter);
167 pCallInfoList->Construct(1);
169 //fetch call info and add to list
170 AppCallInfo callInfo;
171 result r = pCallList.GetAt(0, callInfo);
174 //copy call information to new instance
175 AppCallInfo* pCaller = new (std::nothrow) AppCallInfo();
177 pCallInfoList->Add(pCaller);
178 //single active call - goto active call form
179 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_ACTIVE_EMERGENCYCALL,
180 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
191 BaseForm::HandleCallActive(bool isActive)
193 AppLogDebug("Enter");
194 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
195 if(pActiveCallForm != null)
197 pActiveCallForm->OnActiveTelephonyCallback(isActive);
202 BaseForm::HandleCallHeld(bool isHeld)
204 AppLogDebug("Enter");
205 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
206 if(pActiveCallForm != null)
208 pActiveCallForm->OnHoldTelephonyCallback(isHeld);
213 BaseForm::HandleCallDisconnected(bool isLastCall, IListT<AppCallInfo>& pCurrentActiveCallList)
215 AppLogDebug("Enter");
216 if(__pCallPresentor->IsIncomingorDialingCallPresent() == true)
218 //This scenario will come, if this disconnected call is neither incoming nor dialing call.
219 //In this case, if there is any dialing call exists, then ignore.
220 //Else, if there is any incoming call exists, then update call option popup.
221 AppLogDebug("IsIncomingorDialingCallPresent %d",__formType);
224 case FORMTYPE_INCOMINGCALL:
226 IncomingCallForm* pIncomingCallForm = dynamic_cast<IncomingCallForm*>(this);
227 if (pIncomingCallForm != null)
229 pIncomingCallForm->CallDisconnected();
240 SceneManager* pSceneManager = SceneManager::GetInstance();
241 CallApp* pPhoneApp = static_cast<CallApp*>(UiApp::GetInstance());
243 int callCount = pCurrentActiveCallList.GetCount();
246 //Ownership - To be deleted in 'OnSceneActivatedN' of next form
247 ArrayList* pCallInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter);
248 pCallInfoList->Construct(callCount);
249 for (int index = 0; index < callCount; index++)
251 //fetch call info and add to list
252 AppCallInfo callInfo;
253 result r = pCurrentActiveCallList.GetAt(index, callInfo);
256 //copy call information to new instance
257 AppCallInfo* pCaller = new (std::nothrow) AppCallInfo();
259 pCallInfoList->Add(pCaller);
265 //fetch call info and add to list
266 AppCallInfo callInfo;
267 result r = pCurrentActiveCallList.GetAt(0, callInfo);
270 //copy call information to new instance
271 AppCallInfo* pCaller = new (std::nothrow) AppCallInfo();
273 pCallInfoList->Add(pCaller);
276 if (isLastCall == true)
278 //list contains 1 last ended call to show EndCall screen.
279 //goto End Call form if single call was ended else terminate
280 // if (callInfo.IsConferenceCall() == false)
283 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_ENDCALL,
284 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
288 pPhoneApp->Terminate();
293 //list contains 1 active call
294 if (pCurrentActiveCallList.GetCount() == 1)
296 if (callInfo.IsConferenceCall() == true)
298 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_CONFCALL,
299 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
303 //goto Single Active Call form
304 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_ACTIVECALL,
305 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
312 //multiple active calls are present.
313 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_MULTIPLEACTIVECALL,
314 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
319 //This is done to show end call form in missed call case also
320 //this was done on request received from HQ to solve a bug in
321 //camera application. In which if a call comes when camera is
322 //running and user disconnects before the ui is shown the camera
324 ArrayList* pCallInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter);
325 pCallInfoList->Construct(1);
326 AppCallInfo callInfo;
327 result r = pCurrentActiveCallList.GetAt(0, callInfo);
330 //copy call information to new instance
331 AppCallInfo* pCaller = new (std::nothrow) AppCallInfo();
333 pCallInfoList->Add(pCaller);
334 //multiple active calls are present.
335 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_ENDCALL,
336 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pCallInfoList);
341 pPhoneApp->Terminate();
349 BaseForm::HandleConferenceCall(AppCallInfo& pCallInfo)
351 SceneManager* pSceneManager = SceneManager::GetInstance();
353 //Ownership - To be deleted in 'OnSceneActivatedN' of next form
354 ArrayList* pCallInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter);
355 pCallInfoList->Construct(1);
357 //update list to be passed
358 AppCallInfo* pConfInfo = new (std::nothrow) AppCallInfo();
359 *pConfInfo = pCallInfo;
360 pCallInfoList->Add(pConfInfo);
362 //Todo: create screens for single conf call and conf call with another held call
363 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_CONFCALL,
364 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_KEEP), pCallInfoList);
368 BaseForm::HandleIncomingCall(AppCallInfo& pCallInfo)
370 SceneManager* pSceneManager = SceneManager::GetInstance();
372 //Ownership - To be deleted in 'OnSceneActivatedN' of next form
373 ArrayList* pCallInfoList = new (std::nothrow) ArrayList(SingleObjectDeleter);
374 pCallInfoList->Construct(1);
376 //update list to be passed
377 AppCallInfo* pIncomingCall = new (std::nothrow) AppCallInfo();
378 *pIncomingCall = pCallInfo;
379 pCallInfoList->Add(pIncomingCall);
381 pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_INCOMINGCALL,
382 SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_KEEP), pCallInfoList);
386 BaseForm::HandleConfCallHoldOccured(bool success)
391 case FORMTYPE_CONFCALLLIST:
393 ConfCallerListForm* pConfCallerListForm = dynamic_cast<ConfCallerListForm*>(this);
394 if(pConfCallerListForm != null)
396 pConfCallerListForm->OnConfCallHoldTelephoneCallBackOccured(success);
400 case FORMTYPE_ACTIVECONFCALL:
402 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
403 if(pActiveCallForm != null)
405 pActiveCallForm->OnConfCallHoldTelephonyCallback(success);
415 BaseForm::HandleConfCallActiveOccured(bool success)
419 case FORMTYPE_CONFCALLLIST:
421 ConfCallerListForm* pConfCallerListForm = dynamic_cast<ConfCallerListForm*>(this);
422 if(pConfCallerListForm != null)
424 pConfCallerListForm->OnConfCallActiveTelephoneCallBackOccured(success);
428 case FORMTYPE_ACTIVECONFCALL:
430 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
431 if(pActiveCallForm != null)
433 pActiveCallForm->OnConfCallActiveTelephonyCallback(success);
443 BaseForm::HandleCallSwapOccured(IListT<AppCallInfo>& pCallList)
445 int noOfCalls = pCallList.GetCount();
446 if(noOfCalls != IDI_MAX_ACTIVE_CALLS && __formType != FORMTYPE_MULTIPLECALLS)
450 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
451 if(pActiveCallForm != null)
454 pActiveCallForm->UpdateMultipleCallScreen(pCallList);
455 pActiveCallForm->SetSwapInProgress(false);
461 BaseForm::HandleConferenceChange(void)
463 if(__pCallPresentor->IsIncomingorDialingCallPresent() == true)
465 //This scenario will come, if 1 call is disconnected from conf. call having more than 2 participants.
466 //In this case, if there is any dialing call exists, then ignore.
467 //Else, if there is any incoming call exists, then update call option popup.
470 case FORMTYPE_INCOMINGCALL:
472 IncomingCallForm* pIncomingCallForm = dynamic_cast<IncomingCallForm*>(this);
473 if (pIncomingCallForm != null)
475 pIncomingCallForm->CallDisconnected();
488 case FORMTYPE_CONFCALLLIST:
490 ConfCallerListForm* pConfCallerListForm = dynamic_cast<ConfCallerListForm*>(this);
491 if(pConfCallerListForm != null)
493 pConfCallerListForm->HandleParticipantsChanged();
498 case FORMTYPE_ACTIVECONFCALL:
499 case FORMTYPE_MULTIPLECALLS:
501 ActiveCallForm* pActiveCallForm = dynamic_cast<ActiveCallForm*>(this);
502 if(pActiveCallForm != null)
504 pActiveCallForm->HandleConfCallChanged();
514 BaseForm::HandleTelephonyError(int errorCode)
516 //show error msg Popup
517 if (__pErrorMsgPopup == null)
519 __pErrorMsgPopup = new (std::nothrow) ErrorMsgPopup(this);
520 __pErrorMsgPopup->ShowErrorMsgPopupN(errorCode);
525 BaseForm::HandlePopupClosed(void)
528 delete __pErrorMsgPopup;
529 __pErrorMsgPopup = null;
533 case FORMTYPE_OUTGOINGCALL:
535 //fetch no of calls from telephony
536 CallPresentationModel* pPresentor = CallPresentationModel::GetInstance();
537 if(pPresentor != null)
539 //check if any call is present
540 if(pPresentor->GetCurrentCallCount() > 0)
542 //fetch current call list
543 IListT<AppCallInfo>* pCurrentCallList = pPresentor->GetCallListN();
544 HandleCallDisconnected(false,*pCurrentCallList);
545 delete pCurrentCallList;
546 pCurrentCallList = null;
550 //No more calls are active
551 CallApp* pPhoneApp = static_cast<CallApp*>(UiApp::GetInstance());
552 pPhoneApp->Terminate();
559 case FORMTYPE_ENDCALL:
561 //It comes here, only when we make voice call for Last call from EndCallForm
562 //and some TAPI error is encountered.
563 CallApp* pPhoneApp = static_cast<CallApp*>(UiApp::GetInstance());
564 pPhoneApp->Terminate();