Fixed recursive appcontrol issue. Fixed Call reject from event injector during answer...
[apps/osp/Call.git] / src / CallActiveCallForm.cpp
1 //
2 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
3 //
4 // Licensed under the Flora License, Version 1.0 (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
7 //
8 //     http://floralicense.org/license/
9 //
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.
15 //
16
17 /**
18  * @file        PhnActiveCallForm.cpp
19  * @brief       Active Call Form class
20  */
21 #include <FApp.h>
22 #include <FUi.h>
23 #include <FMedia.h>
24 #include <FSystem.h>
25 #include "CallActiveCallForm.h"
26 #include "CallButtonsPanel.h"
27 #include "CallInfo.h"
28 #include "CallAppUtility.h"
29 #include "CallDtmfKeypadPanel.h"
30 #include "CallPresentationModel.h"
31 #include "CallSceneRegister.h"
32 #include "CallTypes.h"
33
34 using namespace Tizen::App;
35 using namespace Tizen::Base;
36 using namespace Tizen::Base::Collection;
37 using namespace Tizen::Base::Utility;
38 using namespace Tizen::Graphics;
39 using namespace Tizen::Media;
40 using namespace Tizen::Social;
41 using namespace Tizen::System;
42 using namespace Tizen::Ui;
43 using namespace Tizen::Ui::Controls;
44 using namespace Tizen::Ui::Scenes;
45
46 //constants
47 const int IDI_MAX_SECONDS = 60;
48 const int IDI_MAX_MINS = 60;
49 const int W_HOLD_BITMAP = 78;
50 const int H_HOLD_BITMAP = 78;
51 //for Options menu list
52 const int IDI_POPUP_TEXT_SIZE = 33;
53 const unsigned int COLOR_POPUP_TEXT = Color32<255, 255, 255, 255>::Value;
54 const int IDI_MOREOPTIONS_LIST_ITEMS = 1;
55 const int W_OPTION_ANCHOR = 72;
56 const int H_OPTION_ANCHOR = 22;
57 const int W_MGR_CONFCALL_BITMAP = 64;
58 const int H_MGR_CONFCALL_BITMAP = 64;
59 const int X_POPUP_ANCHOR = 632;
60 const int Y_POPUP_ANCHOR = 140;
61 const int W_POPUP_ANCHOR = 72;
62 const int H_POPUP_ANCHOR = 22;
63 const int IDI_OPTIONMENU_ITEM_SPACING = 16;
64 const Point IDI_OPTIONMENU_POS(238, 162);
65 const Dimension IDI_OPTIONMENU_DIMEN(466, 99);
66 const int X_PHOTO_LBL = 166;
67 const int Y_PHOTO_LBL = 232;
68 const int W_PHOTO_LBL = 388;
69 const int H_PHOTO_LBL = 388;
70 const int W_PHOTO_LABEL = 720;
71 const int H_PHOTO_LABEL = 720;
72 const int W_RIGHT_MORE_ICON_MARGIN = 24;
73 const int W_MORE_LABEL = 466;
74 const int H_MORE_LABEL = 162;
75 const int W_MORE_ICON = 70;
76
77 static const wchar_t* IDC_CONF_CALL_MORE_BUTTON = L"IDC_CONF_CALL_MORE_BUTTON";
78 static const wchar_t* IDC_HOLD_BUTTON = L"IDC_HOLD_BUTTON";
79 static const wchar_t* IDC_SWAP_BUTTON = L"IDC_SWAP_BUTTON";
80 static const wchar_t* IDC_HOLD_LABEL = L"IDC_HOLD_LABEL";
81 static const wchar_t* IDC_TEXTBOX = L"IDC_NUM_EDITFIELD";
82 static const wchar_t* IDC_CALLER1_LABEL = L"IDC_CALLER1_LABEL";
83 static const wchar_t* IDC_BACKGROUND_LABEL = L"IDC_BACKGROUND_LABEL";
84 static const wchar_t* IDC_CALLER1_TIME_LABEL = L"IDC_CALLER1_TIME_LABEL";
85 static const wchar_t* IDC_NUMBER1_LABEL = L"IDC_NUMBER1_LABEL";
86 static const wchar_t* IDC_VOICE_CALL_ICON_LABEL = L"IDC_VOICE_CALL_ICON_LABEL";
87 static const wchar_t* IDC_CALLER2_LABEL = L"IDC_CALLER2_LABEL";
88 static const wchar_t* IDC_NUMBER2_LABEL = L"IDC_NUMBER2_LABEL";
89 static const wchar_t* IDC_CALLER2_TIME_LABEL = L"IDC_CALLER2_TIME_LABEL";
90 static const wchar_t* IDC_SWAP_LABEL = L"IDC_SWAP_LABEL";
91 static const wchar_t* IDC_BACKGROUND_LABEL2 = L"IDC_BACKGROUND_LABEL2";
92 static const wchar_t* IDC_PARTICIPANTS_LABEL = L"IDC_PARTICIPANTS_LABEL";
93 static const wchar_t* IDC_CALLER1_BIGPHOTO_LABEL = L"IDC_CALLER1_BIGPHOTO_LABEL";
94 static const wchar_t* IDC_CALLER2_PHOTO_LABEL = L"IDC_CALLER2_PHOTO_LABEL";
95 static const wchar_t* IDC_CALLER1_PHOTO_LABEL = L"IDC_CALLER1_PHOTO_LABEL";
96 static const wchar_t* IDC_KEY_BG_LABEL = L"IDC_KEY_BG_LABEL";
97
98 ActiveCallForm::ActiveCallForm(FormType formType)
99         : BaseForm(formType)
100 {
101         __pActiveCallTimer = null;
102         __pCallButtonsPanel = null;
103         __pDTMFKeypad = null;
104         __pMoreOptionsList = null;
105         __pMoreOptionsListAnchor = null;
106         __pSmallPhotoLabel = null;
107         __pActiveCallInfo = null;
108         __pHeldCallInfo = null;
109 }
110
111 ActiveCallForm::~ActiveCallForm(void)
112 {
113         if (__pActiveCallTimer != null)
114         {
115                 __pActiveCallTimer->Cancel();
116                 delete __pActiveCallTimer;
117         }
118         if (__pMoreOptionsList != null)
119         {
120                 __pMoreOptionsList = null;
121         }
122         if (__pMoreOptionsListAnchor != null)
123         {
124                 __pMoreOptionsListAnchor = null;
125         }
126         if (__pSmallPhotoLabel != null)
127         {
128                 __pSmallPhotoLabel = null;
129         }
130         if (__pActiveCallInfo != null)
131         {
132                 delete __pActiveCallInfo;
133         }
134         if (__pHeldCallInfo != null)
135         {
136                 delete __pHeldCallInfo;
137         }
138         if(__pDTMFKeypad != null)
139         {
140                 __pDTMFKeypad = null;
141         }
142 }
143
144 void
145 ActiveCallForm::Initialize(void)
146 {
147         switch (__formType)
148         {
149         case FORMTYPE_OUTGOINGCALL:
150                 Construct(IDL_OUTCALL_FORM);
151                 break;
152
153         case FORMTYPE_EMERGENCYOUTGOINGCALL:
154                 Construct(IDL_OUT_EMERGENCYCALL_FORM);
155                 break;
156
157         case FORMTYPE_ACTIVECALL:
158                 Construct(IDL_CALL_FORM);
159                 break;
160
161         case FORMTYPE_EMERGENCYACTIVECALL:
162                 Construct(IDL_EMERGENCY_CALL_FORM);
163                 break;
164
165         case FORMTYPE_MULTIPLECALLS:
166                 Construct(IDL_MULTIPLE_CALL_FORM);
167                 break;
168
169         case FORMTYPE_ACTIVECONFCALL:
170                 Construct(IDL_CONFCALL_FORM);
171                 break;
172
173         default:
174                 break;
175         }
176 }
177
178 result
179 ActiveCallForm::OnInitializing(void)
180 {
181         result r = E_SUCCESS;
182
183         //Hold Button - Shown on single active/conf call scene
184         InitializeHoldButton();
185         //Swap button for multiple call screen
186         InitializeSwapButton();
187         //Initialize manage conf. call list form
188         InitializeManageConfCallButton();
189
190         __pCallPresentor = CallPresentationModel::GetInstance();
191         return r;
192 }
193
194 void
195 ActiveCallForm::ShowDTMFKeypad(void)
196 {
197         if(__pDTMFKeypad == null)
198         {
199                 //update rect according to client screen area
200                 Rectangle rect(0, 0, 0, 0);
201                 if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
202                 {
203                         rect.width = GetClientAreaBounds().width;
204                         rect.height = GetClientAreaBounds().height - __pCallButtonsPanel->GetHeight();
205                 }
206                 else if (GetOrientationStatus() == ORIENTATION_STATUS_LANDSCAPE)
207                 {
208                         rect.height = GetClientAreaBounds().height;
209                         rect.width = GetClientAreaBounds().width - __pCallButtonsPanel->GetWidth();
210                 }
211
212                 AppLog("DTMF Keypad rect(%d,%d,%d,%d)",rect.x,rect.y,rect.width,rect.height);
213                 __pDTMFKeypad = new (std::nothrow) DtmfKeyPadPanel();
214                 __pDTMFKeypad->Initialize(this, rect);
215                 AddControl(*__pDTMFKeypad);
216
217                 //set layout relation w.r.t call buttons panel
218                 RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetLandscapeLayoutN());
219                 if (pRelativeLayout != null)
220                 {
221                         pRelativeLayout->SetRelation(*__pDTMFKeypad, this, RECT_EDGE_RELATION_LEFT_TO_LEFT);
222                         pRelativeLayout->SetRelation(*__pDTMFKeypad, __pCallButtonsPanel, RECT_EDGE_RELATION_RIGHT_TO_LEFT);
223                 }
224         }
225         __pDTMFKeypad->SetShowState(true);
226         if(__DtmfString.IsEmpty() == false)
227         {
228                 EditField* pTextBox = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
229                 pTextBox->SetText(__DtmfString);
230         }
231         __pDTMFKeypad->Draw(true);
232         __pDTMFKeypad->Show();
233 }
234
235 void
236 ActiveCallForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::OrientationStatus orientationStatus)
237 {
238         AppLog("ENTER");
239
240         if (__pCallButtonsPanel != null)
241         {
242                 //update position of call buttons panel
243                 Label* pKeysBgLbl = static_cast<Label*>(GetControl(IDC_KEY_BG_LABEL, true));
244                 __pCallButtonsPanel->SetBounds(pKeysBgLbl->GetBounds());
245
246                 //bring button on top
247                 __pCallButtonsPanel->SetButtonPosition();
248
249                 RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetPortraitLayoutN());
250                 if (pRelativeLayout != null)
251                 {
252                         pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
253                 }
254
255                 pRelativeLayout = dynamic_cast<RelativeLayout*>(GetLandscapeLayoutN());
256                 if (pRelativeLayout != null)
257                 {
258                         pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_LEFT_TO_LEFT);
259                         pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_RIGHT_TO_RIGHT);
260                 }
261
262                 //change orientation of DTMF Keypad, if it is visible.
263                 if (__pDTMFKeypad != null)
264                 {
265                         if (orientationStatus == ORIENTATION_STATUS_LANDSCAPE)
266                         {
267                                 //in landscape mode, caller info is visible.
268                                 SetShowStateOnKeypad(true);
269                         }
270                         else if (orientationStatus == ORIENTATION_STATUS_PORTRAIT)
271                         {
272                                 //in Portrait mode it is hidden beneath DTMF Keypad.
273                                 SetShowStateOnKeypad(false);
274                         }
275                         if(__pDTMFKeypad->GetShowState() == true)
276                         {
277                                 String dtmfText = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX))->GetText();
278                                 HideDTMFKeypad();
279                                 ShowDTMFKeypad();
280                         }
281                 }
282         }
283         //More option is displayed recreate it
284         if(__pMoreOptionsListAnchor != null)
285         {
286                 CreateMoreOptionsMenuList();
287                 CreateMoreOptionsMenuList();
288         }
289 }
290
291 void
292 ActiveCallForm::HideDTMFKeypad(void)
293 {
294         if(__pDTMFKeypad != null)
295         {
296                 __DtmfString = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX))->GetText();
297
298                 RemoveControl(*__pDTMFKeypad);
299                 __pDTMFKeypad = null;
300         }
301 }
302
303 result
304 ActiveCallForm::InitializeCallButtonsPanel(void)
305 {
306         result r = E_SUCCESS;
307         //Set background bitmap for call keypad
308         Label* pKeysBgLbl = static_cast<Label*>(GetControl(IDC_KEY_BG_LABEL, true));
309         Bitmap* pBgBitmap = AppUtility::GetBitmapFromResourcesN(IDB_BACKGROUND_BITMAP, pKeysBgLbl->GetWidth(), pKeysBgLbl->GetHeight());
310         if (pBgBitmap != null)
311         {
312                 pKeysBgLbl->SetBackgroundBitmap(*pBgBitmap);
313         }
314
315         if (__pCallButtonsPanel == null)
316         {
317                 __pCallButtonsPanel = new (std::nothrow) CallButtonsPanel();
318                 __pCallButtonsPanel->ConstructPanel(this, __formType);
319                 __pCallButtonsPanel->SetBounds(pKeysBgLbl->GetBounds());
320                 r = AddControl(*__pCallButtonsPanel);
321         }
322
323         RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetPortraitLayoutN());
324         if (pRelativeLayout != null)
325         {
326                 pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
327         }
328         pRelativeLayout = dynamic_cast<RelativeLayout*>(GetLandscapeLayoutN());
329         if (pRelativeLayout != null)
330         {
331                 pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_LEFT_TO_LEFT);
332                 pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_RIGHT_TO_RIGHT);
333                 pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_BOTTOM_TO_BOTTOM);
334                 pRelativeLayout->SetRelation(*__pCallButtonsPanel, *pKeysBgLbl, RECT_EDGE_RELATION_TOP_TO_TOP);
335         }
336
337         return r;
338 }
339
340 void
341 ActiveCallForm::InitializeSwapButton(void)
342 {
343         Button* pSwapBtn = static_cast<Button*>(GetControl(IDC_SWAP_BUTTON));
344         if (pSwapBtn)
345         {
346                 Bitmap* pSwapBmp = AppUtility::GetBitmapFromResourcesN(IDB_SWAP_ICON_NORMAL,
347                                                                                                                            W_HOLD_BITMAP, H_HOLD_BITMAP);
348                 if (pSwapBmp)
349                 {
350                         pSwapBtn->SetNormalBitmap(Point(0, 0), *pSwapBmp);
351                 }
352                 delete pSwapBmp;
353                 pSwapBmp = null;
354
355                 pSwapBmp = AppUtility::GetBitmapFromResourcesN(IDB_SWAP_ICON_PRESS,
356                                                                                                            W_HOLD_BITMAP, H_HOLD_BITMAP);
357                 if (pSwapBmp)
358                 {
359                         pSwapBtn->SetPressedBitmap(Point(0, 0), *pSwapBmp);
360                 }
361                 delete pSwapBmp;
362                 pSwapBmp = null;
363                 pSwapBtn->SetActionId(IDA_SWAP_CALLS);
364                 pSwapBtn->AddActionEventListener(*this);
365         }
366 }
367
368 void
369 ActiveCallForm::InitializeManageConfCallButton(void)
370 {
371         Button* pMoreBtn = static_cast<Button*>(GetControl(IDC_CONF_CALL_MORE_BUTTON));
372         if (pMoreBtn != null)
373         {
374                 pMoreBtn->SetActionId(IDA_MORE_OPTIONS_MENU);
375                 pMoreBtn->AddActionEventListener(*this);
376                 if (__formType == FORMTYPE_MULTIPLECALLS)
377                 {
378                         //Correct state will be set in OnSceneActivated based on the call
379                         pMoreBtn->SetShowState(false);
380                 }
381                 else if (__formType == FORMTYPE_ACTIVECONFCALL)
382                 {
383                         pMoreBtn->SetShowState(true);
384                 }
385         }
386 }
387
388 void
389 ActiveCallForm::InitializeHoldButton(void)
390 {
391         Button* pHoldBtn = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
392         if (pHoldBtn != null)
393         {
394                 //set status of Hold Button
395                 SetHoldButtonStatus(true);
396                 pHoldBtn->AddActionEventListener(*this);
397         }
398 }
399
400 void
401 ActiveCallForm::SetHoldButtonStatus(bool toHoldCall)
402 {
403         //background bitmap & button name
404         String btnName("");
405         Bitmap* normalImg = null;
406         Bitmap* pressImg = null;
407         if (toHoldCall)
408         {
409                 btnName.Append(AppUtility::GetResourceString(IDS_HOLD_BTN_NAME));
410                 normalImg = AppUtility::GetBitmapFromResourcesN(IDB_HOLD_NORMAL_BUTTON_ICON,
411                                                                                                                 W_HOLD_BITMAP, H_HOLD_BITMAP);
412                 pressImg = AppUtility::GetBitmapFromResourcesN(IDB_HOLD_PRESS_BUTTON_ICON,
413                                                                                                            W_HOLD_BITMAP, H_HOLD_BITMAP);
414         }
415         else
416         {
417                 btnName.Append(AppUtility::GetResourceString(IDS_UNHOLD_BTN_NAME));
418                 normalImg = AppUtility::GetBitmapFromResourcesN(IDB_UNHOLD_NORMAL_BUTTON_ICON,
419                                                                                                                 W_HOLD_BITMAP, H_HOLD_BITMAP);
420                 pressImg = AppUtility::GetBitmapFromResourcesN(IDB_UNHOLD_PRESS_BUTTON_ICON,
421                                                                                                            W_HOLD_BITMAP, H_HOLD_BITMAP);
422         }
423
424         //Action id
425         CommandIds cmdId = IDA_HOLD_CALL;
426         switch (__formType)
427         {
428         case FORMTYPE_ACTIVECALL:
429         {
430                 cmdId = toHoldCall ? IDA_HOLD_CALL : IDA_UNHOLD_CALL;
431         }
432         break;
433
434         case FORMTYPE_ACTIVECONFCALL:
435         {
436                 cmdId = toHoldCall ? IDA_HOLD_CONF_CALL : IDA_UNHOLD_CONF_CALL;
437         }
438         break;
439
440         default:
441                 break;
442         }
443
444         //set background bitmap, button name & action id
445         Button* pHoldBtn = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
446         Label* pHoldLbl = static_cast<Label*>(GetControl(IDC_HOLD_LABEL));
447         if (pHoldBtn)
448         {
449                 pHoldBtn->SetActionId(cmdId);
450                 pHoldBtn->SetNormalBitmap(Point(0, 0),*normalImg);
451                 pHoldBtn->SetPressedBitmap(Point(0, 0),*pressImg);
452         }
453         if (pHoldLbl)
454         {
455                 pHoldLbl->SetText(btnName);
456                 pHoldLbl->Invalidate(true);
457         }
458
459         //free the resources
460         delete normalImg;
461         normalImg = null;
462         delete pressImg;
463         pressImg = null;
464 }
465
466 void
467 ActiveCallForm::CreateMoreOptionsMenuList(void)
468 {
469         //create option list anchor
470         if (__pMoreOptionsListAnchor == null)
471         {
472                 Bitmap* pBgPopupArwBmp = AppUtility::GetBitmapFromResourcesN(IDB_POPUP_ARROW_ICON, W_OPTION_ANCHOR,
473                                                                                                                                          H_OPTION_ANCHOR);
474                 __pMoreOptionsListAnchor = new (std::nothrow) Label();
475                 __pMoreOptionsListAnchor->Construct(Rectangle(GetWidth()-W_RIGHT_MORE_ICON_MARGIN - W_MORE_ICON, Y_POPUP_ANCHOR, W_POPUP_ANCHOR, H_POPUP_ANCHOR), L"");
476                 __pMoreOptionsListAnchor->SetBackgroundBitmap(*pBgPopupArwBmp);
477
478                 delete pBgPopupArwBmp;
479                 pBgPopupArwBmp = null;
480
481                 // Adds a Label to the Form
482                 AddControl(*__pMoreOptionsListAnchor);
483         }
484
485         //create options menu list
486         if (__pMoreOptionsList == null)
487         {
488                 __pMoreOptionsList = new (std::nothrow) ListView();
489                 __pMoreOptionsList->Construct(Rectangle(Point(GetWidth()-W_RIGHT_MORE_ICON_MARGIN - W_MORE_LABEL,H_MORE_LABEL), IDI_OPTIONMENU_DIMEN), false, SCROLL_STYLE_FADE_OUT);
490                 __pMoreOptionsList->SetItemProvider(*this);
491                 __pMoreOptionsList->AddListViewItemEventListener(*this);
492                 //Add option list to the form
493                 AddControl(*__pMoreOptionsList);
494         }
495         else
496         {
497                 //Hide option menu list
498                 DestroyMoreOptionsMenuList();
499         }
500 }
501
502 void
503 ActiveCallForm::DestroyMoreOptionsMenuList(void)
504 {
505         if (__pMoreOptionsListAnchor != null)
506         {
507                 //removes and delete the child control
508                 RemoveControl(*__pMoreOptionsListAnchor);
509                 __pMoreOptionsListAnchor = null;
510         }
511
512         if (__pMoreOptionsList != null)
513         {
514                 //removes and delete the child control
515                 RemoveControl(*__pMoreOptionsList);
516                 __pMoreOptionsList = null;
517         }
518 }
519
520 result
521 ActiveCallForm::OnTerminating(void)
522 {
523         result r = E_SUCCESS;
524         if (__pCallPresentor != null)
525         {
526                 __pCallPresentor = null;
527         }
528         return r;
529 }
530
531 void
532 ActiveCallForm::OnActionPerformed(const Control& source, int actionId)
533 {
534
535         String dtmfString;
536         switch (actionId)
537         {
538         case IDA_END_CALL:
539         {
540                 //End the currently active / dialing call
541                 if (__pActiveCallInfo->IsConferenceCall() == false)
542                 {
543                         String activeContactNo;
544                         activeContactNo.Append(__pActiveCallInfo->GetContactNumber());
545                         //Check if it is call is in dialing state, then
546                         if (__formType == FORMTYPE_EMERGENCYOUTGOINGCALL || __formType == FORMTYPE_OUTGOINGCALL)
547                         {
548                                 __pCallPresentor->EndDialingCall(activeContactNo);
549                         }
550                         else
551                         {
552                                 //end active calls
553                                 __pCallPresentor->EndActiveCall(*__pActiveCallInfo->GetCallHandle());
554                         }
555                 }
556                 else
557                 {
558                         __pCallPresentor->EndConferenceCall();
559                 }
560         }
561         break;
562
563         case IDA_END_CONF_CALL:
564         {
565                 AppAssert(__formType == FORMTYPE_ACTIVECONFCALL);
566                 __pCallPresentor->EndConferenceCall();
567         }
568         break;
569
570         case IDA_OPEN_NUMKEYPAD:
571         {
572                 if (GetOrientationStatus() == ORIENTATION_STATUS_PORTRAIT)
573                 {
574                         //hide only in portrait mode.
575                 SetShowStateOnKeypad(false);
576                 }
577                 ShowDTMFKeypad();
578                 __pCallButtonsPanel->SetKeypadButtonState(IDA_CLOSE_NUMKEYPAD);
579         }
580         break;
581
582         case IDA_CLOSE_NUMKEYPAD:
583         {
584                 SetShowStateOnKeypad(true);
585                 HideDTMFKeypad();
586                 __pCallButtonsPanel->SetKeypadButtonState(IDA_OPEN_NUMKEYPAD);
587         }
588         break;
589
590         case IDA_ADD_CALL:
591         {
592                 //switch to Dialer Form to make an call
593                 if(__pCallPresentor->GetCurrentCallCount() == 1)
594                 {
595                 __pCallPresentor->LaunchDialAppControl();
596                 }
597         }
598         break;
599
600         case IDA_HOLD_CALL:
601         {
602                 bool success = true;
603                 if (__pActiveCallInfo->IsConferenceCall() == false)
604                 {
605                         if(__pActiveCallInfo->GetCallHandle() != null)
606                         {
607                                 success = __pCallPresentor->HoldCall(*__pActiveCallInfo->GetCallHandle());
608                         }
609                 }
610                 else
611                 {
612                         success = __pCallPresentor->HoldConferenceCall();
613                 }
614                 //reset hold status and "OnHold" text
615                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, success);
616                 if(__pActiveCallTimer != null)
617                 {
618                         __pActiveCallTimer->Cancel();
619                 }
620                 SetHoldButtonStatus(!success);
621         }
622         break;
623
624         case IDA_UNHOLD_CALL:
625         {
626                 bool success = false;
627                 if (__pActiveCallInfo->IsConferenceCall() == false)
628                 {
629                         if(__pActiveCallInfo->GetCallHandle() != null)
630                         {
631                                 success = __pCallPresentor->UnHoldCall(*__pActiveCallInfo->GetCallHandle());
632                         }
633                 }
634                 else
635                 {
636                         success = __pCallPresentor->ActivateConferenceCall();
637                 }
638                 //reset hold status and show call timer
639                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, !success, __activeCallStartTime);
640                 SetHoldButtonStatus(success);
641         }
642         break;
643
644         case IDA_HOLD_CONF_CALL:
645         {
646                 AppAssert(__formType == FORMTYPE_ACTIVECONFCALL);
647                 bool success = __pCallPresentor->HoldConferenceCall();
648                 //reset hold status and "OnHold" text
649                 SetHoldButtonStatus(!success);
650                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, success);
651                 if(__pActiveCallTimer != null)
652                 {
653                         __pActiveCallTimer->Cancel();
654                 }
655         }
656         break;
657
658         case IDA_UNHOLD_CONF_CALL:
659         {
660                 AppAssert(__formType == FORMTYPE_ACTIVECONFCALL);
661                 bool success = __pCallPresentor->ActivateConferenceCall();
662                 //reset hold status and show call timer
663                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, !success, __activeCallStartTime);
664                 SetHoldButtonStatus(success);
665         }
666         break;
667
668         case IDA_OPEN_CONTACTS:
669         {
670                 //Open Contacts APP
671                 //Launch call application
672                 AppManager* pAppManager = AppManager::GetInstance();
673                 pAppManager->LaunchApplication(PROVIDER_ID_CONTACTS);
674         }
675                 break;
676
677         case IDA_MUTE:
678         {
679                 bool success = __pCallPresentor->SetMuteStatus(true);
680                 if (success)
681                 {
682                         __pCallButtonsPanel->SetMuteButtonState(IDA_UNMUTE);
683                 }
684         }
685         break;
686
687         case IDA_UNMUTE:
688         {
689                 bool success = __pCallPresentor->SetMuteStatus(false);
690                 if (success)
691                 {
692                         __pCallButtonsPanel->SetMuteButtonState(IDA_MUTE);
693                 }
694         }
695         break;
696
697         case IDA_SPEAKER:
698         {
699                 bool success = __pCallPresentor->SetSpeakerStatus(true);
700                 if (success)
701                 {
702                         __pCallButtonsPanel->SetSpeakerButtonState(IDA_SPEAKER_OFF);
703                 }
704         }
705         break;
706
707         case IDA_SPEAKER_OFF:
708         {
709                 bool success = __pCallPresentor->SetSpeakerStatus(false);
710                 if (success)
711                 {
712                         __pCallButtonsPanel->SetSpeakerButtonState(IDA_SPEAKER);
713                 }
714         }
715         break;
716
717         case IDA_JOIN_CALL:
718         {
719                 AppAssert(__formType == FORMTYPE_MULTIPLECALLS);
720                 __pCallPresentor->JoinCall();
721         }
722         break;
723
724         case IDA_SWAP_CALLS:
725         {
726                 AppAssert(__formType == FORMTYPE_MULTIPLECALLS);
727                 __pCallPresentor->SwapCalls();
728         }
729         break;
730
731         case IDA_MORE_OPTIONS_MENU:
732         {
733                 //Show 'more' options menu
734                 CreateMoreOptionsMenuList();
735         }
736         break;
737
738         case NUM_KEY0:
739         {
740                 dtmfString.Append(L"0");
741                 SetTextToDTMFTextField(dtmfString);
742                 __pCallPresentor->SendDTMFSignal(dtmfString);
743         }
744         break;
745
746         case NUM_KEY1:
747         {
748                 dtmfString.Append(L"1");
749                 SetTextToDTMFTextField(dtmfString);
750                 __pCallPresentor->SendDTMFSignal(dtmfString);
751         }
752         break;
753
754         case NUM_KEY2:
755         {
756                 dtmfString.Append(L"2");
757                 SetTextToDTMFTextField(dtmfString);
758                 __pCallPresentor->SendDTMFSignal(dtmfString);
759         }
760         break;
761
762         case NUM_KEY3:
763         {
764                 dtmfString.Append(L"3");
765                 SetTextToDTMFTextField(dtmfString);
766                 __pCallPresentor->SendDTMFSignal(dtmfString);
767         }
768         break;
769
770         case NUM_KEY4:
771         {
772                 dtmfString.Append(L"4");
773                 SetTextToDTMFTextField(dtmfString);
774                 __pCallPresentor->SendDTMFSignal(dtmfString);
775         }
776         break;
777
778         case NUM_KEY5:
779         {
780                 dtmfString.Append(L"5");
781                 SetTextToDTMFTextField(dtmfString);
782                 __pCallPresentor->SendDTMFSignal(dtmfString);
783         }
784         break;
785
786         case NUM_KEY6:
787         {
788                 dtmfString.Append(L"6");
789                 SetTextToDTMFTextField(dtmfString);
790                 __pCallPresentor->SendDTMFSignal(dtmfString);
791         }
792         break;
793
794         case NUM_KEY7:
795         {
796                 dtmfString.Append(L"7");
797                 SetTextToDTMFTextField(dtmfString);
798                 __pCallPresentor->SendDTMFSignal(dtmfString);
799         }
800         break;
801
802         case NUM_KEY8:
803         {
804                 dtmfString.Append(L"8");
805                 SetTextToDTMFTextField(dtmfString);
806                 __pCallPresentor->SendDTMFSignal(dtmfString);
807         }
808         break;
809
810         case NUM_KEY9:
811         {
812                 dtmfString.Append(L"9");
813                 SetTextToDTMFTextField(dtmfString);
814                 __pCallPresentor->SendDTMFSignal(dtmfString);
815         }
816         break;
817
818         case PAUSE_KEY:
819         {
820                 dtmfString.Append(L"*");
821                 SetTextToDTMFTextField(dtmfString);
822                 __pCallPresentor->SendDTMFSignal(dtmfString);
823         }
824         break;
825
826         case HASH_KEY:
827         {
828                 dtmfString.Append(L"#");
829                 SetTextToDTMFTextField(dtmfString);
830                 __pCallPresentor->SendDTMFSignal(dtmfString);
831         }
832         break;
833
834         default:
835                 break;
836         }
837 }
838
839 void
840 ActiveCallForm::SetTextToDTMFTextField(const String& dtmfStr)
841 {
842         if(__pDTMFKeypad != null)
843         {
844                 EditField* pTextBox = static_cast<EditField*>(__pDTMFKeypad->GetControl(IDC_TEXTBOX));
845
846                 int startpos=-1,endpos=-1;
847                 pTextBox->GetBlockRange(startpos,endpos);
848                 if(startpos != -1)
849                 {
850                         pTextBox->Remove();
851                         pTextBox->ReleaseBlock();
852                 }
853
854                 pTextBox->InsertTextAtCursorPosition(dtmfStr);
855                 //pTextBox->AppendText(dtmfStr);
856                 pTextBox->SetFocus();
857                 pTextBox->Invalidate(true);
858         }
859 }
860
861 void
862 ActiveCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& currentSceneId, IList* pArgs)
863 {
864         AppLog("ENTER");
865         //set itself as listener
866         __pCallPresentor->SetTelEventListener(this);
867         AddOrientationEventListener(*this);
868
869         //Initialize keypad and buttons
870         InitializeCallButtonsPanel();
871
872         if (__pActiveCallInfo != null)
873         {
874                 delete __pActiveCallInfo;
875                 __pActiveCallInfo = null;
876         }
877         if (__pHeldCallInfo != null)
878         {
879                 delete __pHeldCallInfo;
880                 __pHeldCallInfo = null;
881         }
882         DestroyMoreOptionsMenuList();
883
884         switch (__formType)
885         {
886         case FORMTYPE_OUTGOINGCALL:
887         {
888                 String contactNo;
889                 contactNo.Append(*(static_cast<String*>(pArgs->GetAt(0))));
890                 __pActiveCallInfo = new (std::nothrow) AppCallInfo();
891                 __pActiveCallInfo->SetContactNumber(contactNo);
892                 Contact* pContact = __pCallPresentor->GetContactN(contactNo);
893                 if (pContact != null)
894                 {
895                         __pActiveCallInfo->SetContactInfo(*pContact);
896                         delete pContact;
897                 }
898                 ShowPersonDetails(contactNo, IDC_NUMBER1_LABEL, IDC_CALLER1_LABEL, false,__pActiveCallInfo);
899                 //make an normal outgoing call
900                 __pCallPresentor->DialCall(contactNo, false);
901         }
902         break;
903
904         case FORMTYPE_EMERGENCYOUTGOINGCALL:
905         {
906                 String* pContactNo = static_cast<String*>(pArgs->GetAt(0));
907                 __pActiveCallInfo = new (std::nothrow) AppCallInfo();
908                 long long phNumber = 0;
909                 LongLong::Parse(*pContactNo, phNumber);
910                 __pActiveCallInfo->SetContactNumber(*pContactNo);
911                 //make an emergency call
912                 __pCallPresentor->DialCall(*pContactNo, true);
913         }
914         break;
915
916         case FORMTYPE_ACTIVECALL:
917         {
918                 //get contact number
919                 AppCallInfo* pCall = static_cast<AppCallInfo*>(pArgs->GetAt(0));
920
921                 __pActiveCallInfo = new (std::nothrow) AppCallInfo();
922                 *__pActiveCallInfo =  *pCall;
923                 String activeContactNo;
924                 if(pCall->GetContactNumber().IsEmpty() == false)
925                 {
926                         activeContactNo.Append(pCall->GetContactNumber());
927                 }
928                 else
929                 {
930                         activeContactNo.Append(AppUtility::GetResourceString(IDS_NUMBER_UNKNOWN));
931                 }
932                 ShowPersonDetails(activeContactNo, IDC_NUMBER1_LABEL, IDC_CALLER1_LABEL, false,__pActiveCallInfo);
933
934                 //show call active time using Timer
935                 __activeCallStartTime = pCall->GetCallConnectTime();
936                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, pCall->IsOnHold(), __activeCallStartTime);
937         }
938         break;
939
940         case FORMTYPE_EMERGENCYACTIVECALL:
941         {
942                 //get contact number
943                 AppCallInfo* pCall = static_cast<AppCallInfo*>(pArgs->GetAt(0));
944
945                 __pActiveCallInfo = new (std::nothrow) AppCallInfo();
946                 *__pActiveCallInfo =  *pCall;
947
948                 //show call active time using Timer
949                 __activeCallStartTime = pCall->GetCallConnectTime();
950                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, pCall->IsOnHold(), __activeCallStartTime);
951         }
952         break;
953
954         case FORMTYPE_MULTIPLECALLS:
955         {
956                 IListT<AppCallInfo>* pCallsList = __pCallPresentor->GetCallListN();
957                 //update calls state
958                 UpdateMultipleCallScreen(*pCallsList);
959                 delete pCallsList;
960                 pCallsList = null;
961         }
962         break;
963
964         case FORMTYPE_ACTIVECONFCALL:
965         {
966                 //get Conf call
967                 AppCallInfo* pConfInfo = static_cast<AppCallInfo*>(pArgs->GetAt(0));
968                 __pActiveCallInfo = new (std::nothrow) AppCallInfo();
969                 *__pActiveCallInfo =  *pConfInfo;
970
971                 int participantsCount = __pActiveCallInfo->GetCallerListCount();
972
973                 // show participant count on name Label
974                 Label* pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_PARTICIPANTS_LABEL));
975                 if (pPeopleCountLbl)
976                 {
977                         String count;
978                         count.Append(participantsCount);
979                         count.Append(" ");
980                         count.Append(AppUtility::GetResourceString(IDS_PEOPLE_STR));
981                         pPeopleCountLbl->SetText(count);
982                 }
983
984                 if(participantsCount >= IDI_MAX_CONF_CALL_PARTICIPANTS)
985                 {
986                         __pCallButtonsPanel->EnableAddCallButton(false);
987                 }
988                 else
989                 {
990                         __pCallButtonsPanel->EnableAddCallButton(true);
991                 }
992
993                 //show call active time using Timer
994                 __activeCallStartTime = __pActiveCallInfo->GetCallConnectTime();
995                 ShowTimerInfo(IDC_CALLER1_TIME_LABEL, __pActiveCallInfo->IsOnHold(),__activeCallStartTime);
996         }
997         break;
998
999         default:
1000                 break;
1001         }
1002
1003         //Hide DTMFKeypad, if visible and show caller info
1004         HideDTMFKeypad();
1005         SetShowStateOnKeypad(true);
1006         __pCallButtonsPanel->SetKeypadButtonState(IDA_OPEN_NUMKEYPAD);
1007
1008         //Set the correct speaker status
1009         if(__pCallPresentor->IsSpeakerOn() == true)
1010         {
1011                 __pCallButtonsPanel->SetSpeakerButtonState(IDA_SPEAKER_OFF);
1012         }
1013         else
1014         {
1015                 __pCallButtonsPanel->SetSpeakerButtonState(IDA_SPEAKER);
1016         }
1017
1018         //Set the correct Mute status
1019         if (__pCallPresentor->IsCallMuted() == true)
1020         {
1021                 __pCallButtonsPanel->SetMuteButtonState(IDA_UNMUTE);
1022         }
1023         else
1024         {
1025                 __pCallButtonsPanel->SetMuteButtonState(IDA_MUTE);
1026         }
1027
1028         if (pArgs)
1029         {
1030                 pArgs->RemoveAll();
1031                 delete pArgs;
1032                 pArgs = null;
1033         }
1034 }
1035
1036 void
1037 ActiveCallForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& nextSceneId)
1038 {
1039         RemoveOrientationEventListener(*this);
1040         if (__pCallButtonsPanel != null)
1041         {
1042                 RemoveControl(*__pCallButtonsPanel);
1043                 __pCallButtonsPanel = null;
1044         }
1045         if (__pActiveCallTimer != null)
1046         {
1047                 __pActiveCallTimer->Cancel();
1048                 delete __pActiveCallTimer;
1049                 __pActiveCallTimer = null;
1050         }
1051         if (__pSmallPhotoLabel != null)
1052         {
1053                 __pSmallPhotoLabel->SetShowState(false);
1054         }
1055         //Hide "Manage conf. Call" Context menu
1056         if (__pMoreOptionsListAnchor != null)
1057         {
1058                 __pMoreOptionsListAnchor->SetShowState(false);
1059         }
1060         if (__pMoreOptionsList != null)
1061         {
1062                 __pMoreOptionsList->SetShowState(false);
1063         }
1064         __DtmfString.Clear();
1065 }
1066
1067 void
1068 ActiveCallForm::HandleConfCallChanged(void)
1069 {
1070         AppLog("ENTER");
1071         AppAssert((__formType == FORMTYPE_ACTIVECONFCALL) || (__formType == FORMTYPE_MULTIPLECALLS));
1072         //fetch changed conference call info
1073         AppCallInfo* pConfCallInfo = __pCallPresentor->GetConferenceCallInfoN();
1074         if (pConfCallInfo == null)
1075         {
1076                 AppLog("EXIT");
1077                 return;
1078         }
1079
1080         //fetch participant count in conf call
1081         int participantsCount = pConfCallInfo->GetCallerListCount();
1082         //update status of join and Add call
1083         bool isEnableAddCall = false;
1084         bool isEnableJoinCall = false;
1085         if(participantsCount < IDI_MAX_CONF_CALL_PARTICIPANTS)
1086         {
1087                 //available only at Active conf. call or active call screen
1088                 isEnableAddCall = true;
1089                 //join button is available only at multiple call screen
1090                 isEnableJoinCall = true;
1091         }
1092
1093         Label* pPeopleCountLbl = null;
1094         if (__pActiveCallInfo != null && __pActiveCallInfo->IsConferenceCall() == true)
1095         {
1096                 //Active call is conference call
1097                 delete __pActiveCallInfo;
1098                 __pActiveCallInfo = new (std::nothrow) AppCallInfo();
1099                 *__pActiveCallInfo = *pConfCallInfo;
1100
1101                 if (__formType == FORMTYPE_MULTIPLECALLS)
1102                 {
1103                         pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_NUMBER1_LABEL));
1104                 }
1105                 else if (__formType == FORMTYPE_ACTIVECONFCALL)
1106                 {
1107                         pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_PARTICIPANTS_LABEL));
1108                         AppLog("Active conf call...(%d)", pPeopleCountLbl);
1109                 }
1110         }
1111         else if(__pHeldCallInfo != null && __pHeldCallInfo->IsConferenceCall() == true)
1112         {
1113                 //Held call is conference call - this is definitely multiple call screen.
1114                 delete __pHeldCallInfo;
1115                 __pHeldCallInfo = new (std::nothrow) AppCallInfo();
1116                 *__pHeldCallInfo = *pConfCallInfo;
1117                 pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_NUMBER2_LABEL));
1118         }
1119
1120         // update participant count on name Label
1121         if (pPeopleCountLbl != null)
1122         {
1123                 String count;
1124                 count.Append(participantsCount);
1125                 count.Append(" ");
1126                 count.Append(AppUtility::GetResourceString(IDS_PEOPLE_STR));
1127                 pPeopleCountLbl->SetText(count);
1128                 pPeopleCountLbl->Invalidate(true);
1129         }
1130         //change AddCall Button status
1131         __pCallButtonsPanel->EnableAddCallButton(isEnableAddCall);
1132         //change JoinCall Button status
1133         __pCallButtonsPanel->EnableJoinCallButton(__pCallPresentor->IsEnableJoinCallButton());
1134         AppLog("EXIT");
1135 }
1136
1137 void
1138 ActiveCallForm::UpdateMultipleCallScreen(Tizen::Base::Collection::IListT<AppCallInfo>& activeCallsList)
1139 {
1140         AppLog("ENTER");
1141         if(__pActiveCallInfo != null)
1142         {
1143                 delete __pActiveCallInfo;
1144                 __pActiveCallInfo = null;
1145         }
1146         if(__pHeldCallInfo != null)
1147         {
1148                 delete __pHeldCallInfo;
1149                 __pHeldCallInfo = null;
1150         }
1151
1152         Button* pMoreBtn = static_cast<Button*>(GetControl(IDC_CONF_CALL_MORE_BUTTON));
1153         if (pMoreBtn != null)
1154         {
1155                 pMoreBtn->SetShowState(false);
1156         }
1157
1158         //show caller's info.
1159         for (int index = 0; index < activeCallsList.GetCount(); index++)
1160         {
1161                 //Fetch call info
1162                 AppCallInfo callInfo;
1163                 activeCallsList.GetAt(index, callInfo);
1164
1165                 String contactNo;
1166                 if(callInfo.GetContactNumber().IsEmpty() == false)
1167                 {
1168                         contactNo.Append(callInfo.GetContactNumber());
1169                 }
1170                 else
1171                 {
1172                         contactNo.Append(AppUtility::GetResourceString(IDS_NUMBER_UNKNOWN));
1173                 }
1174
1175                 if (callInfo.IsOnHold() == false)
1176                 {
1177                         __pActiveCallInfo = new (std::nothrow) AppCallInfo();
1178                         *__pActiveCallInfo =  callInfo;
1179
1180                         if (__pActiveCallInfo->IsConferenceCall() == false)
1181                         {
1182                                 Label* pVoiceIconLbl = static_cast<Label*>(GetControl(IDC_VOICE_CALL_ICON_LABEL));
1183                                 if (pVoiceIconLbl)
1184                                 {
1185                                         pVoiceIconLbl->SetShowState(true);
1186                                 }
1187                                 if (pMoreBtn != null)
1188                                 {
1189                                         pMoreBtn->SetShowState(false);
1190                                 }
1191                                 ShowPersonDetails(contactNo, IDC_NUMBER1_LABEL, IDC_CALLER1_LABEL, false,__pActiveCallInfo);
1192                                 if(__pMoreOptionsListAnchor != null && __pMoreOptionsListAnchor->GetShowState() == true)
1193                                 {
1194                                         CreateMoreOptionsMenuList();
1195                                 }
1196                         }
1197                         else
1198                         {
1199                                 // show participant count on name Label
1200                                 Label* pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_NUMBER1_LABEL));
1201                                 if (pPeopleCountLbl)
1202                                 {
1203                                         String count;
1204                                         count.Append(__pActiveCallInfo->GetCallerListCount());
1205                                         count.Append(" ");
1206                                         count.Append(AppUtility::GetResourceString(IDS_PEOPLE_STR));
1207                                         pPeopleCountLbl->SetText(count);
1208                                 }
1209                                 String nameStr = AppUtility::GetResourceString(L"IDS_CONFERENCE_CALL_STRING");
1210                                 Label* pNameLbl = static_cast<Label*>(GetControl(IDC_CALLER1_LABEL));
1211                                 if (pNameLbl)
1212                                 {
1213                                         pNameLbl->SetText(nameStr);
1214                                 }
1215                                 Label* pVoiceIconLbl = static_cast<Label*>(GetControl(IDC_VOICE_CALL_ICON_LABEL));
1216                                 if (pVoiceIconLbl)
1217                                 {
1218                                         pVoiceIconLbl->SetShowState(false);
1219                                 }
1220                                 if (pMoreBtn != null)
1221                                 {
1222                                         pMoreBtn->SetShowState(true);
1223                                 }
1224                                 Bitmap* pPhotoBitmap = AppUtility::GetBitmapFromResourcesN(IDB_CONFERENCE_BG_ICON,W_CONFERENCE_PHOTO,H_CONFERENCE_PHOTO);
1225                                 if (pPhotoBitmap != null)
1226                                 {
1227                                         Label* pPhotoLbl = static_cast<Label*>(GetControl(IDC_CALLER1_PHOTO_LABEL));
1228                                         if (pPhotoLbl)
1229                                         {
1230                                                 pPhotoLbl->SetBackgroundBitmap(*pPhotoBitmap);
1231                                                 pPhotoLbl->Invalidate(true);
1232                                         }
1233                                         delete pPhotoBitmap;
1234                                 }
1235                         }
1236                         //show call active time using Timer
1237                         __activeCallStartTime = __pActiveCallInfo->GetCallConnectTime();
1238                         ShowTimerInfo(IDC_CALLER1_TIME_LABEL,false,__activeCallStartTime);
1239                 }
1240                 else
1241                 {
1242                         __pHeldCallInfo = new (std::nothrow) AppCallInfo();
1243                         *__pHeldCallInfo = callInfo;
1244
1245                         if (__pHeldCallInfo->IsConferenceCall() == false)
1246                         {
1247                                 ShowPersonDetails(contactNo, IDC_NUMBER2_LABEL, IDC_CALLER2_LABEL, true,__pHeldCallInfo);
1248                         }
1249                         else
1250                         {
1251                                 // show participant count on name Label
1252                                 Label* pPeopleCountLbl = static_cast<Label*>(GetControl(IDC_NUMBER2_LABEL));
1253                                 if (pPeopleCountLbl)
1254                                 {
1255                                         String count;
1256                                         count.Append(__pHeldCallInfo->GetCallerListCount());
1257                                         count.Append(" ");
1258                                         count.Append(AppUtility::GetResourceString(IDS_PEOPLE_STR));
1259                                         pPeopleCountLbl->SetText(count);
1260                                 }
1261                                 String nameStr = AppUtility::GetResourceString(L"IDS_CONFERENCE_CALL_STRING");
1262                                 Label* pNameLbl = static_cast<Label*>(GetControl(IDC_CALLER2_LABEL));
1263                                 if (pNameLbl)
1264                                 {
1265                                         pNameLbl->SetText(nameStr);
1266                                 }
1267                                 Bitmap* pPhotoBitmap = AppUtility::GetBitmapFromResourcesN(IDB_CONFERENCE_BG_ICON,W_CONFERENCE_PHOTO,H_CONFERENCE_PHOTO);
1268                                 if (pPhotoBitmap != null)
1269                                 {
1270                                         Label* pPhotoLbl = static_cast<Label*>(GetControl(IDC_CALLER2_PHOTO_LABEL));
1271                                         if (pPhotoLbl)
1272                                         {
1273                                                 pPhotoLbl->SetBackgroundBitmap(*pPhotoBitmap);
1274                                                 pPhotoLbl->Invalidate(true);
1275                                         }
1276                                         delete pPhotoBitmap;
1277                                 }
1278                         }
1279                         //show "On Hold"
1280                         ShowTimerInfo(IDC_CALLER2_TIME_LABEL, true);
1281                 }
1282         }
1283
1284         //update JoinCall button status
1285         __pCallButtonsPanel->EnableJoinCallButton(__pCallPresentor->IsEnableJoinCallButton());
1286         Invalidate(true);
1287         AppLog("EXIT");
1288 }
1289
1290 void
1291 ActiveCallForm::ShowPersonDetails(const String& phoneNumber, const String& contactLblName, const String& nameLblName, bool isSecondCaller, AppCallInfo* pCallInfo)
1292 {
1293         //call individual methods to show contact number, caller name & photo
1294         ShowPhoneNumber(phoneNumber, contactLblName);
1295
1296         //fetch contact details based on phone number
1297         String* pDisplayName = pCallInfo->FetchCallerNameN();
1298         ShowCallerName(*pDisplayName, nameLblName);
1299
1300         Bitmap* pPhotoBitmap = pCallInfo->FetchCallerPhotoN();
1301         ShowCallerPhoto(pPhotoBitmap, isSecondCaller);
1302
1303         //free resources
1304         if (pDisplayName)
1305         {
1306                 delete pDisplayName;
1307                 pDisplayName = null;
1308         }
1309         if (pPhotoBitmap)
1310         {
1311                 delete pPhotoBitmap;
1312                 pPhotoBitmap = null;
1313         }
1314 }
1315
1316 void
1317 ActiveCallForm::ShowPhoneNumber(const String& phoneNumber, const String& contactLblName)
1318 {
1319         String formattedNumber = phoneNumber;
1320
1321         Label* pContactLbl = static_cast<Label*>(GetControl(contactLblName));
1322         if (pContactLbl)
1323         {
1324                 pContactLbl->SetText(formattedNumber);
1325                 pContactLbl->Invalidate(true);
1326         }
1327 }
1328
1329 void
1330 ActiveCallForm::ShowCallerName(const String& callerName, const String& nameLblName)
1331 {
1332         // show display name on name Label
1333         Label* pNameLbl = static_cast<Label*>(GetControl(nameLblName));
1334         if (pNameLbl)
1335         {
1336                 //passing an empty string to SetText fails in label,
1337                 //if previously valid text has been set
1338                 if (callerName.IsEmpty() == true && pNameLbl->GetText().IsEmpty() == false)
1339                 {
1340                         String stringToBeSet(L" ");
1341                         pNameLbl->SetText(stringToBeSet);
1342                 }
1343                 else
1344                 {
1345                         pNameLbl->SetText(callerName);
1346                 }
1347                 pNameLbl->Invalidate(true);
1348         }
1349 }
1350
1351 void
1352 ActiveCallForm::ShowCallerPhoto(Bitmap* pPhotoId, bool isSecondCaller)
1353 {
1354         //to check if default image is to be shown
1355         bool showDefaultPhoto = false;
1356         bool showSmallPhoto = false;
1357         String photoLabel("");
1358
1359         switch (__formType)
1360         {
1361         case FORMTYPE_OUTGOINGCALL:
1362         case FORMTYPE_ACTIVECALL:
1363         {
1364                 if (pPhotoId == null)
1365                 {
1366                         //show default caller image
1367                         showDefaultPhoto = true;
1368                 }
1369                 else
1370                 {
1371                         //Check the size of photo
1372                         // Now checking the condition with && but actually it should be ||
1373                         //But for now keeping it as && because _pContact->GetThubNail() returns image width as
1374                         // height 270 and width = 480 . So all images set thru gallery is show as small image
1375                         if(pPhotoId->GetHeight() <= H_SMALL_PHOTO
1376                                         && pPhotoId->GetWidth() <= W_SMALL_PHOTO)
1377                         {
1378                                 showSmallPhoto = true;
1379                         }
1380
1381                 }
1382                 photoLabel.Append(IDC_CALLER1_BIGPHOTO_LABEL);
1383         }
1384         break;
1385
1386         case FORMTYPE_MULTIPLECALLS:
1387         {
1388                 if (isSecondCaller)
1389                 {
1390                         photoLabel.Append(IDC_CALLER2_PHOTO_LABEL);
1391                 }
1392                 else
1393                 {
1394                         photoLabel.Append(IDC_CALLER1_PHOTO_LABEL);
1395                 }
1396
1397                 if (pPhotoId == null)
1398                 {
1399                         showDefaultPhoto = true;
1400                 }
1401                 else
1402                 {
1403                         if (pPhotoId->GetHeight() <= H_SMALL_PHOTO
1404                                 && pPhotoId->GetWidth() <= W_SMALL_PHOTO)
1405                         {
1406                                 //pPhotoId->Scale(Dimension(W_CONFERENCE_PHOTO,H_CONFERENCE_PHOTO));
1407                                 showSmallPhoto = true;
1408                         }
1409                 }
1410         }
1411         break;
1412
1413         default:
1414                 break;
1415         }
1416
1417         //Remove small photo label
1418         if (__pSmallPhotoLabel != null)
1419         {
1420                 RemoveControl(*__pSmallPhotoLabel);
1421                 __pSmallPhotoLabel = null;
1422         }
1423
1424         //show photo - for Big Photo Id, Animated Call Image
1425         if (!showDefaultPhoto)
1426         {
1427                 if(showSmallPhoto == true)
1428                 {
1429                         ShowThumbnailImage(pPhotoId,photoLabel);
1430                 }
1431                 else
1432                 {
1433                         Label* pPhotoLbl = static_cast<Label*>(GetControl(photoLabel));
1434                         if (pPhotoLbl)
1435                         {
1436                                 Canvas* pCanvas = new (std::nothrow) Canvas;
1437                                 Rectangle canvasRect(Rectangle(0, 0, pPhotoLbl->GetBounds().width, pPhotoLbl->GetBounds().height));
1438                                 pCanvas->Construct(canvasRect);
1439                                 //draw the contact bitmap
1440                                 pCanvas->DrawBitmap(canvasRect,*pPhotoId);
1441                                 Bitmap* pNewPhotoId = new Bitmap();
1442                                 pNewPhotoId->Construct(*pCanvas, pCanvas->GetBounds());
1443                                 delete pCanvas;
1444
1445                                 pPhotoLbl->SetBackgroundBitmap(*pNewPhotoId);
1446                                 pPhotoLbl->Invalidate(true);
1447                                 delete pNewPhotoId;
1448                         }
1449                 }
1450         }
1451         else
1452         {
1453                 Bitmap* pDefaultPhoto = null;
1454                 switch (__formType)
1455                 {
1456                 case FORMTYPE_OUTGOINGCALL:
1457                 case FORMTYPE_ACTIVECALL:
1458                         pDefaultPhoto = AppUtility::GetBitmapFromResourcesN(IDB_ACTIVE_CALL_DEFAULT_ICON,W_CONFERENCE_PHOTO,W_CONFERENCE_PHOTO);
1459                         break;
1460
1461                 case FORMTYPE_MULTIPLECALLS:
1462                         pDefaultPhoto = AppUtility::GetBitmapFromResourcesN(IDB_MULTIPLE_CALL_DEFAULT_ICON,W_CONFERENCE_PHOTO,H_CONFERENCE_PHOTO);
1463                         break;
1464
1465                 case FORMTYPE_ACTIVECONFCALL:
1466                         pDefaultPhoto = AppUtility::GetBitmapFromResourcesN(IDB_CONFERENCE_BIG_BG_ICON,W_CONFERENCE_PHOTO,W_CONFERENCE_PHOTO);
1467                         break;
1468
1469                 default:
1470                         break;
1471                 }
1472                 if (pDefaultPhoto != null)
1473                 {
1474                         Label* pPhotoLbl = static_cast<Label*>(GetControl(photoLabel));
1475                         if (pPhotoLbl)
1476                         {
1477                                 pPhotoLbl->SetBackgroundBitmap(*pDefaultPhoto);
1478                         }
1479                         delete pDefaultPhoto;
1480                 }
1481         }
1482 }
1483
1484 void
1485 ActiveCallForm::ShowThumbnailImage(const Bitmap* pPhotoId,String& photoLabel)
1486 {
1487         Label* pPhotoLbl = static_cast<Label*>(GetControl(photoLabel));
1488
1489         if (pPhotoLbl != null && pPhotoId != null)
1490         {
1491                 Canvas* pCanvas = new (std::nothrow) Canvas;
1492                 Bitmap* pBackground = AppUtility::GetBitmapFromResourcesN(IDB_CALL_THUMBNAIL_BACKGROUND,W_CALL_THUMBNAIL,H_CALL_THUMBNAIL);
1493                 Bitmap* pShadow = AppUtility::GetBitmapFromResourcesN(IDB_CALL_THUMBNAIL_SHADOW,W_CALL_THUMBNAIL_SHADOW,H_CALL_THUMBNAIL_SHADOW);
1494                 Rectangle canvasRect(Rectangle(0, 0, pPhotoLbl->GetBounds().width, pPhotoLbl->GetBounds().height));
1495                 pCanvas->Construct(canvasRect);
1496                 //draw the back ground
1497                 pCanvas->DrawBitmap(canvasRect,*pBackground);
1498                 //draw shadow (to be enabled after correct shadow image is provided )
1499                 //pCanvas->DrawBitmap(Rectangle((pPhotoLbl->GetBounds().width/2)-(W_CALL_THUMBNAIL_SHADOW/2),
1500                         //      (pPhotoLbl->GetBounds().height/2)-(H_CALL_THUMBNAIL_SHADOW/2),W_CALL_THUMBNAIL_SHADOW,H_CALL_THUMBNAIL_SHADOW),*pShadow);
1501                 //draw the contact bitmap
1502                 pCanvas->DrawBitmap(Rectangle((pPhotoLbl->GetBounds().width/2)-(W_SMALL_PHOTO/2),
1503                                 (pPhotoLbl->GetBounds().height/2)-(H_SMALL_PHOTO/2),W_SMALL_PHOTO,H_SMALL_PHOTO),*pPhotoId);
1504                 Bitmap* pNewPhotoId = new Bitmap();
1505                 pNewPhotoId->Construct(*pCanvas, pCanvas->GetBounds());
1506                 delete pCanvas;
1507
1508                 pPhotoLbl->SetBackgroundBitmap(*pNewPhotoId);
1509                 pPhotoLbl->Invalidate(true);
1510                 delete pNewPhotoId;
1511                 delete pBackground;
1512                 delete pShadow;
1513         }
1514
1515 }
1516
1517 void
1518 ActiveCallForm::ShowCallersPhotoThumbnail(const Bitmap& pPhotoId)
1519 {
1520         if (__pSmallPhotoLabel != null)
1521         {
1522                 RemoveControl(*__pSmallPhotoLabel);
1523                 __pSmallPhotoLabel = null;
1524         }
1525         //Draw Small Photo and show on small photo label
1526         __pSmallPhotoLabel  = new (std::nothrow) Label();//static_cast<Label*>(GetControl(IDC_SMALL_PHOTO_LABEL));
1527         __pSmallPhotoLabel->Construct(Rectangle(X_PHOTO_LBL, Y_PHOTO_LBL, W_PHOTO_LBL, H_PHOTO_LBL), L"");
1528         __pSmallPhotoLabel->SetBackgroundColor(Color(0,0,0));
1529         __pSmallPhotoLabel->SetBackgroundBitmap(pPhotoId);
1530         // Add a Label to the Form
1531         AddControl(*__pSmallPhotoLabel);
1532         __pSmallPhotoLabel->Invalidate(true);
1533 }
1534
1535 void
1536 ActiveCallForm::ShowTimerInfo(const String& timerLblName, bool isOnHold, long long startTime)
1537 {
1538         Label* pTimerLbl = static_cast<Label*>(GetControl(timerLblName));
1539
1540         if (__pActiveCallTimer == null)
1541         {
1542                 __pActiveCallTimer = new (std::nothrow) Tizen::Base::Runtime::Timer();
1543                 __pActiveCallTimer->Construct(*this);
1544         }
1545
1546         if (pTimerLbl != null)
1547         {
1548                 if (isOnHold == true)
1549                 {
1550                         pTimerLbl->SetText(AppUtility::GetResourceString(IDS_TIMER_ON_HOLD));
1551                         //update Hold button status
1552                         SetHoldButtonStatus(false);
1553                 }
1554                 else
1555                 {
1556                         //update Hold button status
1557                         SetHoldButtonStatus(true);
1558                         //current system time
1559                         long long currTime = 0;
1560                         SystemTime::GetTicks(currTime);
1561                         //Set call duration
1562                         TimeSpan diffSpan(abs(startTime - currTime));
1563
1564                         String activeCallTime(L"");
1565
1566                         long long hr = diffSpan.GetHours();
1567                         if (hr <= 9)
1568                         {
1569                                 activeCallTime.Append("0");
1570                         }
1571                         activeCallTime.Append(hr);
1572                         activeCallTime.Append(L":");
1573
1574                         long long min = diffSpan.GetMinutes();
1575                         if (min <= 9)
1576                         {
1577                                 activeCallTime.Append("0");
1578                         }
1579                         activeCallTime.Append(min);
1580                         activeCallTime.Append(L":");
1581
1582                         long long sec = diffSpan.GetSeconds();
1583                         if (sec <= 9)
1584                         {
1585                                 activeCallTime.Append("0");
1586                         }
1587                         activeCallTime.Append(sec);
1588
1589                         pTimerLbl->SetText(activeCallTime);
1590                         __pActiveCallTimer->StartAsRepeatable(TimeSpan::NUM_OF_TICKS_IN_SECOND);
1591                 }
1592                 pTimerLbl->Invalidate(true);
1593         }
1594 }
1595
1596 void
1597 ActiveCallForm::SetShowStateOnKeypad(bool showState)
1598 {
1599         Label* pLblControl = static_cast<Label*>(GetControl(IDC_CALLER1_LABEL));
1600         pLblControl->SetShowState(showState);
1601         pLblControl = static_cast<Label*>(GetControl(IDC_BACKGROUND_LABEL));
1602         pLblControl->SetShowState(showState);
1603         pLblControl = static_cast<Label*>(GetControl(IDC_CALLER1_TIME_LABEL));
1604         pLblControl->SetShowState(showState);
1605         if (__pSmallPhotoLabel != null)
1606         {
1607                 __pSmallPhotoLabel->SetShowState(showState);
1608         }
1609
1610         switch (__formType)
1611         {
1612         case FORMTYPE_ACTIVECALL:
1613         {
1614                 pLblControl = static_cast<Label*>(GetControl(IDC_NUMBER1_LABEL));
1615                 pLblControl->SetShowState(showState);
1616                 pLblControl = static_cast<Label*>(GetControl(IDC_VOICE_CALL_ICON_LABEL));
1617                 pLblControl->SetShowState(showState);
1618                 pLblControl = static_cast<Label*>(GetControl(IDC_HOLD_LABEL));
1619                 pLblControl->SetShowState(showState);
1620                 Button* pButtonControl = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
1621                 pButtonControl->SetShowState(showState);
1622         }
1623         break;
1624
1625         case FORMTYPE_MULTIPLECALLS:
1626         {
1627                 pLblControl = static_cast<Label*>(GetControl(IDC_NUMBER1_LABEL));
1628                 pLblControl->SetShowState(showState);
1629                 pLblControl = static_cast<Label*>(GetControl(IDC_CALLER2_LABEL));
1630                 pLblControl->SetShowState(showState);
1631                 pLblControl = static_cast<Label*>(GetControl(IDC_NUMBER2_LABEL));
1632                 pLblControl->SetShowState(showState);
1633                 pLblControl = static_cast<Label*>(GetControl(IDC_CALLER2_TIME_LABEL));
1634                 pLblControl->SetShowState(showState);
1635                 pLblControl = static_cast<Label*>(GetControl(IDC_SWAP_LABEL));
1636                 pLblControl->SetShowState(showState);
1637                 pLblControl = static_cast<Label*>(GetControl(IDC_BACKGROUND_LABEL2));
1638                 pLblControl->SetShowState(showState);
1639                 if (__pActiveCallInfo != null && __pActiveCallInfo->IsConferenceCall() == false)
1640                 {
1641                         pLblControl = static_cast<Label*>(GetControl(IDC_VOICE_CALL_ICON_LABEL));
1642                         pLblControl->SetShowState(showState);
1643                 }
1644                 else
1645                 {
1646                         Button* pButtonControl = static_cast<Button*>(GetControl(IDC_CONF_CALL_MORE_BUTTON));
1647                         pButtonControl->SetShowState(showState);
1648                 }
1649                 Button* pButtonControl = static_cast<Button*>(GetControl(IDC_SWAP_BUTTON));
1650                 pButtonControl->SetShowState(showState);
1651         }
1652         break;
1653
1654         case FORMTYPE_ACTIVECONFCALL:
1655         {
1656                 pLblControl = static_cast<Label*>(GetControl(IDC_PARTICIPANTS_LABEL));
1657                 pLblControl->SetShowState(showState);
1658                 pLblControl = static_cast<Label*>(GetControl(IDC_HOLD_LABEL));
1659                 pLblControl->SetShowState(showState);
1660                 Button* pButtonControl = static_cast<Button*>(GetControl(IDC_HOLD_BUTTON));
1661                 pButtonControl->SetShowState(showState);
1662                 pButtonControl = static_cast<Button*>(GetControl(IDC_CONF_CALL_MORE_BUTTON));
1663                 pButtonControl->SetShowState(showState);
1664         }
1665         break;
1666
1667         default:
1668                 break;
1669         }
1670 }
1671
1672 void
1673 ActiveCallForm::OnTimerExpired(Tizen::Base::Runtime::Timer& timer)
1674 {
1675         //Call default implementation of "Object.Equals()"
1676         //returns true, if they are pointing to same address.
1677         if (__pActiveCallTimer->Equals(timer))
1678         {
1679                 Label* pTimerLbl = static_cast<Label*>(GetControl(IDC_CALLER1_TIME_LABEL));
1680                 if (pTimerLbl)
1681                 {
1682                         String activeCallTime = pTimerLbl->GetText();
1683                         // Create a StringTokenizer instance
1684                         StringTokenizer strTokens(activeCallTime, L":");
1685
1686                         int count = strTokens.GetTokenCount(); // count == 3
1687                         String token;
1688                         int sec = 0;
1689                         int min = 0;
1690                         int hr = 0;
1691                         for (int index = 0; index < count; index++)
1692                         {
1693                                 switch (index)
1694                                 {
1695                                 case 0:
1696                                         strTokens.GetNextToken(token);
1697                                         Integer::Parse(token, hr);
1698                                         break;
1699
1700                                 case 1:
1701                                         strTokens.GetNextToken(token);
1702                                         Integer::Parse(token, min);
1703                                         break;
1704
1705                                 case 2:
1706                                         strTokens.GetNextToken(token);
1707                                         Integer::Parse(token, sec);
1708                                         break;
1709                                 }
1710                         }
1711                         //update all values
1712                         sec = sec + 1;
1713                         if (sec == IDI_MAX_SECONDS)
1714                         {
1715                                 sec = 0;
1716                                 min = min + 1;
1717                         }
1718                         if (min == IDI_MAX_MINS)
1719                         {
1720                                 min = 0;
1721                                 hr = hr + 1;
1722                         }
1723
1724                         //replace string
1725                         activeCallTime.Clear();
1726                         if (hr <= 9)
1727                         {
1728                                 activeCallTime.Append("0");
1729                         }
1730                         activeCallTime.Append(hr);
1731                         activeCallTime.Append(":");
1732                         if (min <= 9)
1733                         {
1734                                 activeCallTime.Append("0");
1735                         }
1736                         activeCallTime.Append(min);
1737                         activeCallTime.Append(":");
1738                         if (sec <= 9)
1739                         {
1740                                 activeCallTime.Append("0");
1741                         }
1742                         activeCallTime.Append(sec);
1743                         //update timer label
1744                         pTimerLbl->SetText(activeCallTime);
1745                         pTimerLbl->Invalidate(true);
1746                 }
1747         }
1748 }
1749
1750 ///////////////////////////////////////////////////////////
1751 ///////////     Options Menu List Functionality   /////////
1752 ///////////////////////////////////////////////////////////
1753 void
1754 ActiveCallForm::OnListViewContextItemStateChanged(ListView& listView, int index, int elementId, ListContextItemStatus state)
1755 {
1756 }
1757
1758 void
1759 ActiveCallForm::OnListViewItemStateChanged(ListView& listView, int index, int elementId, ListItemStatus status)
1760 {
1761         //Goto conference call list form
1762         SceneManager* pSceneManager = SceneManager::GetInstance();
1763         pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_CONFCALLLIST), null);
1764 }
1765
1766 void
1767 ActiveCallForm::OnListViewItemSwept(ListView& listView, int index, SweepDirection direction)
1768 {
1769 }
1770
1771 void
1772 ActiveCallForm::OnListViewItemLongPressed(ListView& listView, int index, int elementId, bool& invokeListViewItemCallback)
1773 {
1774 }
1775
1776 int
1777 ActiveCallForm::GetItemCount(void)
1778 {
1779         return IDI_MOREOPTIONS_LIST_ITEMS;
1780 }
1781
1782 ListItemBase*
1783 ActiveCallForm::CreateItem(int index, int itemWidth)
1784 {
1785         //create 1st Menu option
1786         CustomItem* pItem = new (std::nothrow) CustomItem();
1787         pItem->Construct(IDI_OPTIONMENU_DIMEN, LIST_ANNEX_STYLE_NORMAL);
1788
1789         //Set background 9-patch bitmap to option menu
1790         Bitmap* pBgBmp = AppUtility::GetBitmapFromResourcesN(IDB_POPUP_BG_ICON);
1791         if (pBgBmp != null && pBgBmp->IsNinePatchedBitmap())
1792         {
1793                 Canvas bgCanvas;
1794                 bgCanvas.Construct(Rectangle(IDI_OPTIONMENU_POS, IDI_OPTIONMENU_DIMEN));
1795                 bgCanvas.DrawNinePatchedBitmap(bgCanvas.GetBounds(), *pBgBmp);
1796         }
1797         else
1798         {
1799                 pItem->SetBackgroundColor(LIST_ITEM_DRAWING_STATUS_NORMAL, Color(40, 45, 48));
1800         }
1801         delete pBgBmp;
1802         pBgBmp = null;
1803
1804         //Set bitmap to option menu
1805         Bitmap* pNormalConfCallBmp = AppUtility::GetBitmapFromResourcesN(IDB_MORE_MANAGE_CONFERENCE_ICON ,
1806                                                                                                                                          W_MGR_CONFCALL_BITMAP, H_MGR_CONFCALL_BITMAP);
1807         pItem->AddElement(Rectangle(16, 17, W_MGR_CONFCALL_BITMAP, H_MGR_CONFCALL_BITMAP), 1, *pNormalConfCallBmp, null, null);
1808         // Deallocate bitmaps
1809         delete pNormalConfCallBmp;
1810         pNormalConfCallBmp = null;
1811
1812         //Set text to menu option
1813         String confCallName = AppUtility::GetResourceString(IDS_MGR_CONF_CALL_LIST_STR);
1814
1815         TextElement* pTextElement = new (std::nothrow) TextElement();
1816         pTextElement->Construct(confCallName);
1817         pTextElement->SetTextColor(COLOR_POPUP_TEXT);
1818         //create font
1819         Font font;
1820         font.Construct(FONT_STYLE_PLAIN, IDI_POPUP_TEXT_SIZE);
1821         pTextElement->SetFont(font);
1822         //construct Enriched text
1823         EnrichedText* pEnrichedText = new (std::nothrow) EnrichedText();
1824         FloatDimension textDimension;
1825         font.GetTextExtent(confCallName, confCallName.GetLength(), textDimension);
1826         textDimension.height = textDimension.height + font.GetDescender();
1827         pEnrichedText->Construct(textDimension);
1828         //add text element to enriched text
1829         pEnrichedText->Add(*pTextElement);
1830
1831         //Add Enriched text to pItem
1832         FloatPoint textPos(((2 * IDI_OPTIONMENU_ITEM_SPACING) + W_MGR_CONFCALL_BITMAP), ((IDI_OPTIONMENU_DIMEN.height - textDimension.height) / 2));
1833         pItem->AddElement(FloatRectangle(textPos, textDimension), 2, *pEnrichedText);
1834         // Cleans up
1835         pEnrichedText->RemoveAll(true);
1836         delete pEnrichedText;
1837         return pItem;
1838 }
1839
1840 bool
1841 ActiveCallForm::DeleteItem(int index, ListItemBase* pItem, int itemWidth)
1842 {
1843         delete pItem;
1844         return true;
1845 }