Fix for N_SE-44446 N_SE-44426
[apps/osp/Call.git] / src / CallEndCallForm.cpp
index ae7ada8..e9b3b80 100644 (file)
@@ -1,7 +1,7 @@
 //
 // Copyright (c) 2012 Samsung Electronics Co., Ltd.
 //
-// Licensed under the Flora License, Version 1.0 (the License);
+// Licensed under the Flora License, Version 1.1 (the License);
 // you may not use this file except in compliance with the License.
 // You may obtain a copy of the License at
 //
@@ -28,6 +28,7 @@
 #include "CallPresentationModel.h"
 #include "CallSceneRegister.h"
 #include "CallTypes.h"
+#include "CallAppControlRequestMgr.h"
 
 using namespace Tizen::App;
 using namespace Tizen::Base;
@@ -47,12 +48,19 @@ const int X_PHOTO_LBL = 166;
 const int Y_PHOTO_LBL = 232;
 const int W_PHOTO_LBL = 388;
 const int H_PHOTO_LBL = 388;
+const int END_CALL_TIMER_VAL = 2000;
+const int END_CALL_WAIT_TIMER_VAL = 500;
 static const wchar_t* IDL_END_CALL_FORM = L"IDL_END_CALL_FORM";
 static const wchar_t* IDC_NUMBER1_LABEL = L"IDC_NUMBER1_LABEL";
 static const wchar_t* IDC_CALLER1_LABEL = L"IDC_CALLER1_LABEL";
 static const wchar_t* IDC_KEY_BG_LABEL = L"IDC_KEY_BG_LABEL";
 static const wchar_t* IDC_CALLER1_BIGPHOTO_LABEL = L"IDC_CALLER1_BIGPHOTO_LABEL";
 static const wchar_t* IDB_END_CALL_DEFAULT_ICON = L"C01-1_call_default_caller ID_720x720.png";
+static const wchar_t* IDC_VOICECALL_BUTTON = L"IDC_VOICECALL_BUTTON";
+static const wchar_t* IDC_VIDEOCALL_BUTTON = L"IDC_VIDEOCALL_BUTTON";
+static const wchar_t* IDC_ADD_TO_CONTACT_BUTTON = L"IDC_ADD_TO_CONTACT_BUTTON";
+static const wchar_t* IDC_MSG_BUTTON = L"IDC_MSG_BUTTON";
+
 
 
 EndCallForm::EndCallForm(void)
@@ -64,6 +72,7 @@ EndCallForm::EndCallForm(void)
        __pSmallPhotoLabel = null;
        __isMsgAppControlLaunched = false;
        __isContactAppControlLaunched = false;
+       __pAddressBook = null;
 }
 
 EndCallForm::~EndCallForm(void)
@@ -78,6 +87,11 @@ EndCallForm::~EndCallForm(void)
        {
                __pSmallPhotoLabel = null;
        }
+       if (__pAddressBook != null)
+       {
+               delete __pAddressBook;
+               __pAddressBook = null;
+       }
 }
 
 void
@@ -115,7 +129,7 @@ EndCallForm::InitializeCallButtonsPanel(void)
                __pCallButtonsPanel = new (std::nothrow) CallButtonsPanel();
                __pCallButtonsPanel->ConstructPanel(this, FORMTYPE_ENDCALL);
                __pCallButtonsPanel->SetBounds(pKeysBgLbl->GetBounds());
-               AddControl(*__pCallButtonsPanel);
+               AddControl(__pCallButtonsPanel);
        }
 
        RelativeLayout* pRelativeLayout = dynamic_cast<RelativeLayout*>(GetPortraitLayoutN());
@@ -149,6 +163,11 @@ EndCallForm::OnTerminating(void)
 
        if (__pCallPresentor)
        {
+               //Abort any AppControl Request running already to show incoming call screen
+               if (__pCallPresentor->IsAppControlRunning() == true)
+               {
+                       __pCallPresentor->AbortAppControlRequest();
+               }
                __pCallPresentor = null;
        }
        return r;
@@ -164,6 +183,15 @@ EndCallForm::OnActionPerformed(const Control& source, int actionId)
        {
        case IDA_VOICE_CALL:
        {
+               if(CallAppControlRequestMgr::GetInstance()->IsAppControlRunning() == true)
+               {
+                       return;
+               }
+               if (__isMsgAppControlLaunched == true)
+               {
+                       //AppControl already launched.
+                       return;
+               }
                //check if EndCallTimer is running, then cancel it
                if(__pEndCallEventTimer != null)
                {
@@ -180,15 +208,33 @@ EndCallForm::OnActionPerformed(const Control& source, int actionId)
                bool isSimInitialized = __pCallPresentor->CheckSimInitializationIsCompleted();
                if (isSimInitialized)
                {
+                       //Disable all buttons
+                       Button* pButton = static_cast<Button*>(GetControl(IDC_VIDEOCALL_BUTTON,true));
+                       pButton->SetEnabled(false);
+                       pButton->Invalidate(true);
+                       pButton = static_cast<Button*>(GetControl(IDC_VOICECALL_BUTTON,true));
+                       pButton->SetEnabled(false);
+                       pButton->Invalidate(true);
+                       pButton = static_cast<Button*>(GetControl(IDC_ADD_TO_CONTACT_BUTTON,true));
+                       if(pButton->GetShowState() == true)
+                       {
+                               pButton->SetEnabled(false);
+                               pButton->Invalidate(true);
+                       }
+                       pButton = static_cast<Button*>(GetControl(IDC_MSG_BUTTON,true));
+                       pButton->SetEnabled(false);
+                       pButton->Invalidate(true);
                        //Check if dialing an emergency call
                        bool isEmergencyCall = __pCallPresentor->IsEmergencyNumber(*contactTxt, true);
                        if (isEmergencyCall)
                        {
-                               pSceneManager->GoForward( ForwardSceneTransition( IDSCN_SCENE_OUT_EMERGENCYCALL), pContact);
+                               pSceneManager->GoForward( ForwardSceneTransition( IDSCN_SCENE_OUT_EMERGENCYCALL,
+                                               SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pContact);
                        }
                        else
                        {
-                               pSceneManager->GoForward( ForwardSceneTransition(IDSCN_SCENE_OUTCALL), pContact);
+                               pSceneManager->GoForward( ForwardSceneTransition(IDSCN_SCENE_OUTCALL,
+                                               SCENE_TRANSITION_ANIMATION_TYPE_NONE, SCENE_HISTORY_OPTION_NO_HISTORY,SCENE_DESTROY_OPTION_DESTROY), pContact);
                        }
                }
                else
@@ -216,6 +262,19 @@ EndCallForm::OnActionPerformed(const Control& source, int actionId)
                {
                        //cancel EndCallTimer, if AppControl request was successful.
                        __pEndCallEventTimer->Cancel();
+                       //Disable the call buttons
+                       Button* pButton = static_cast<Button*>(GetControl(IDC_VIDEOCALL_BUTTON,true));
+                       pButton->SetEnabled(false);
+                       pButton->Invalidate(true);
+                       pButton = static_cast<Button*>(GetControl(IDC_VOICECALL_BUTTON,true));
+                       pButton->SetEnabled(false);
+                       pButton->Invalidate(true);
+                       pButton = static_cast<Button*>(GetControl(IDC_ADD_TO_CONTACT_BUTTON,true));
+                       if(pButton->GetShowState() == true)
+                       {
+                               pButton->SetEnabled(false);
+                               pButton->Invalidate(true);
+                       }
                }
        }
        break;
@@ -229,6 +288,21 @@ EndCallForm::OnActionPerformed(const Control& source, int actionId)
                        return;
                }
                HandleAddToContacts();
+               Button* pButton = static_cast<Button*>(GetControl(IDC_VIDEOCALL_BUTTON,true));
+               pButton->SetEnabled(false);
+               pButton->Invalidate(true);
+               pButton = static_cast<Button*>(GetControl(IDC_VOICECALL_BUTTON,true));
+               pButton->SetEnabled(false);
+               pButton->Invalidate(true);
+               pButton = static_cast<Button*>(GetControl(IDC_ADD_TO_CONTACT_BUTTON,true));
+               if(pButton->GetShowState() == true)
+               {
+                       pButton->SetEnabled(false);
+                       pButton->Invalidate(true);
+               }
+               pButton = static_cast<Button*>(GetControl(IDC_MSG_BUTTON,true));
+               pButton->SetEnabled(false);
+               pButton->Invalidate(true);
        }
        break;
 
@@ -287,13 +361,24 @@ EndCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& cu
 
                //contact number
                __pContactNumber = new (std::nothrow) String();
-               if(pEndCall->GetContactNumber().IsEmpty() == false)
+               if(pEndCall->IsConferenceCall() == false)
                {
-                       __pContactNumber->Append(pEndCall->GetContactNumber());
+                       if(pEndCall->GetContactNumber().IsEmpty() == false)
+                       {
+                               __pContactNumber->Append(pEndCall->GetContactNumber());
+                       }
+                       else
+                       {
+                               __pContactNumber->Append(AppUtility::GetResourceString(IDS_NUMBER_UNKNOWN));
+                       }
                }
                else
                {
-                       __pContactNumber->Append(AppUtility::GetResourceString(IDS_NUMBER_UNKNOWN));
+                       String count;
+                       count.Append(pEndCall->GetCallerListCount());
+                       count.Append(" ");
+                       count.Append(AppUtility::GetResourceString(IDS_PEOPLE_STR));
+                       __pContactNumber->Append(count);
                }
 
                //Fetch & show contact person details
@@ -324,13 +409,20 @@ EndCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& cu
 
                //Check if call is Emergency call or Hidden call,
                //then disable all button in Call button panel.
-               if (pEndCall->IsEmergency() == true || pEndCall->GetContactNumber().IsEmpty() == true)
+               if(pEndCall->IsConferenceCall() == false)
                {
-                       __pCallButtonsPanel->SetEndCallPanelState(false);
+                       if (pEndCall->IsEmergency() == true || pEndCall->GetContactNumber().IsEmpty() == true)
+                       {
+                               __pCallButtonsPanel->SetEndCallPanelState(false);
+                       }
+                       else
+                       {
+                               __pCallButtonsPanel->SetEndCallPanelState(true);
+                       }
                }
                else
                {
-                       __pCallButtonsPanel->SetEndCallPanelState(true);
+                       __pCallButtonsPanel->SetEndCallPanelState(false);
                }
 
                //check if we reached the end call form of an outgoing call then don't show add to contacts
@@ -340,7 +432,10 @@ EndCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& cu
                }
                else if(pEndCall->GetCalllogType() == CALL_LOG_TYPE_VOICE_INCOMING)
                {
-                       __pCallButtonsPanel->ShowOrHideAddtoContactsButton(true);
+                       if(pEndCall->GetContactNumber().IsEmpty() == false)
+                       {
+                               __pCallButtonsPanel->ShowOrHideAddtoContactsButton(true);
+                       }
                }
 
        }
@@ -362,7 +457,15 @@ EndCallForm::OnSceneActivatedN(const SceneId& previousSceneId, const SceneId& cu
                delete pArgs;
                pArgs = null;
        }
+       CallApp* pCallApp = static_cast<CallApp*>(CallApp::GetInstance());
+       pCallApp->SetTopMostWindow(false);
        AddOrientationEventListener(*this);
+       __pAddressBook = AddressbookManager::GetInstance()->GetAddressbookN();
+       //Add address book listener to listen to contacts changed events
+       if(__pAddressBook != null)
+       {
+               __pAddressBook->SetAddressbookChangeEventListener(this);
+       }
 }
 
 void
@@ -381,6 +484,11 @@ EndCallForm::OnSceneDeactivated(const SceneId& currentSceneId, const SceneId& ne
        {
                __pSmallPhotoLabel->SetShowState(false);
        }
+       //remove contact change event listener
+       if(__pAddressBook != null)
+       {
+               __pAddressBook->SetAddressbookChangeEventListener(null);
+       }
        //remove itself as listener
        CallApp* pPhoneApp = static_cast<CallApp*>(CallApp::GetInstance());
        pPhoneApp->RemoveAppStateChangeListener(*this);
@@ -422,9 +530,21 @@ EndCallForm::ShowPersonDetails(const String& phoneNumber, const String& nameLblN
        Label* pNameLbl = static_cast<Label*>(GetControl(nameLblName));
        Label* pPhotoLbl = static_cast<Label*>(GetControl(photoLblName));
 
-       //fetch contact details based on phone number
-       String* pDisplayName = pCallInfo->FetchCallerNameN();
-       Bitmap* pPhotoBitmap = pCallInfo->FetchCallerPhotoN();
+       String* pDisplayName;
+       if(pCallInfo->IsConferenceCall() == false)
+       {
+               //fetch contact details based on phone number
+               pDisplayName = pCallInfo->FetchLatestCallerNameN(phoneNumber);
+       }
+       else
+       {
+               pDisplayName = new (std::nothrow) String(AppUtility::GetResourceString(IDS_CONFERENCE_CALL_STRING));
+       }
+       Bitmap* pPhotoBitmap = null;
+       if(pCallInfo->IsConferenceCall() == false)
+       {
+               pPhotoBitmap = pCallInfo->FetchLatestCallerPhotoN(phoneNumber);
+       }
 
        //passing an empty string to SetText fails in label,
        //if previously valid text has been set
@@ -467,7 +587,15 @@ EndCallForm::ShowPersonDetails(const String& phoneNumber, const String& nameLblN
        else
        {
                //Set Default Photo
-               Bitmap* pDefaultPhoto = AppUtility::GetBitmapFromResourcesN(IDB_END_CALL_DEFAULT_ICON,W_PHOTO_LABEL,H_PHOTO_LABEL);
+               Bitmap* pDefaultPhoto = null;
+               if(pCallInfo->IsConferenceCall() == false)
+               {
+                       pDefaultPhoto = AppUtility::GetBitmapFromResourcesN(IDB_END_CALL_DEFAULT_ICON,W_PHOTO_LABEL,H_PHOTO_LABEL);
+               }
+               else
+               {
+                       pDefaultPhoto = AppUtility::GetBitmapFromResourcesN(IDB_CONFERENCE_BG_ICON,W_CONFERENCE_PHOTO,H_CONFERENCE_PHOTO);
+               }
                if (pDefaultPhoto != null)
                {
                        pPhotoLbl->SetBackgroundBitmap(*pDefaultPhoto);
@@ -526,7 +654,7 @@ EndCallForm::ShowCallersPhotoThumbnail(const Bitmap& pPhotoId)
 {
        if (__pSmallPhotoLabel != null)
        {
-               RemoveControl(*__pSmallPhotoLabel);
+               RemoveControl(__pSmallPhotoLabel);
                __pSmallPhotoLabel = null;
        }
        //Draw Small Photo and show on small photo label
@@ -535,7 +663,7 @@ EndCallForm::ShowCallersPhotoThumbnail(const Bitmap& pPhotoId)
        __pSmallPhotoLabel->SetBackgroundColor(Color(0,0,0));
        __pSmallPhotoLabel->SetBackgroundBitmap(pPhotoId);
        // Add a Label to the Form
-       AddControl(*__pSmallPhotoLabel);
+       AddControl(__pSmallPhotoLabel);
        __pSmallPhotoLabel->Invalidate(true);
 }
 
@@ -570,8 +698,18 @@ EndCallForm::OnAppControlCompleteResponseReceived(const AppId& appId, const Stri
 void
 EndCallForm::HandleLastCallCompletion(void)
 {
-       CallApp* pPhoneApp = (static_cast<CallApp*>(UiApp::GetInstance()));
-       pPhoneApp->Terminate();
+       //Check if message sending is in progress if yes
+       //wait for it to complete by restarting the timer
+       AppLogDebug("Enter");
+       if(__pCallPresentor->IsMessageSendingInProgress() == true)
+       {
+               __pEndCallEventTimer->Start(END_CALL_WAIT_TIMER_VAL);
+       }
+       else
+       {
+               CallApp* pPhoneApp = (static_cast<CallApp*>(UiApp::GetInstance()));
+               pPhoneApp->Terminate();
+       }
 }
 
 void
@@ -584,33 +722,9 @@ EndCallForm::OnForeground(void)
        {
                if(__pEndCallEventTimer != null)
                {
-                       __pEndCallEventTimer->Start(2000);
+                       __pEndCallEventTimer->Start(END_CALL_TIMER_VAL);
                }
-               if (__pContactNumber != null && __pContactNumber->IsEmpty() == false)
-               {
-                       AppCallInfo* ActiveCallInfo = new (std::nothrow) AppCallInfo();
-                       ActiveCallInfo->SetContactNumber(*__pContactNumber);
-                       Contact* pContact = __pCallPresentor->GetContactN(*__pContactNumber);
-                       if (pContact != null)
-                       {
-                               ActiveCallInfo->SetContactInfo(*pContact);
-                       }
-                       //before setting check if the contact is deleted
-                       if(pContact != null)
-                       {
-
-                               ShowViewContactButton();
-                               delete pContact;
-                               pContact = null;
-                       }
-                       else
-                       {
-                               ShowAddContactButton();
-                       }
-                       ShowPersonDetails(*__pContactNumber, IDC_CALLER1_LABEL, IDC_CALLER1_BIGPHOTO_LABEL,ActiveCallInfo);
-                       delete ActiveCallInfo;
-               }
-
+               UpdatePersonDetail();
                //notify app control completed
                __isContactAppControlLaunched = false;
                __pCallPresentor->AppControlRequestCompleted();
@@ -633,6 +747,22 @@ EndCallForm::OnForeground(void)
                }
                __pCallPresentor->AppControlRequestCompleted();
        }
+       //Enable all buttons
+       Button* pButton = static_cast<Button*>(GetControl(IDC_VIDEOCALL_BUTTON,true));
+       pButton->SetEnabled(false);
+       pButton->Invalidate(true);
+       pButton = static_cast<Button*>(GetControl(IDC_VOICECALL_BUTTON,true));
+       pButton->SetEnabled(true);
+       pButton->Invalidate(true);
+       pButton = static_cast<Button*>(GetControl(IDC_ADD_TO_CONTACT_BUTTON,true));
+       if(pButton->GetShowState() == true)
+       {
+               pButton->SetEnabled(true);
+               pButton->Invalidate(true);
+       }
+       pButton = static_cast<Button*>(GetControl(IDC_MSG_BUTTON,true));
+       pButton->SetEnabled(true);
+       pButton->Invalidate(true);
        AppLogDebug("Exit");
 }
 
@@ -666,3 +796,39 @@ EndCallForm::OnOrientationChanged(const Tizen::Ui::Control& source, Tizen::Ui::O
                }
        }
 }
+
+void
+EndCallForm::OnContactsChanged(const IList& contactChangeInfoList)
+{
+       UpdatePersonDetail();
+}
+
+void
+EndCallForm::UpdatePersonDetail()
+{
+       AppLog("Enter");
+       if (__pContactNumber != null && __pContactNumber->IsEmpty() == false)
+       {
+               AppCallInfo* ActiveCallInfo = new (std::nothrow) AppCallInfo();
+               ActiveCallInfo->SetContactNumber(*__pContactNumber);
+               Contact* pContact = __pCallPresentor->GetContactN(*__pContactNumber);
+               if (pContact != null)
+               {
+                       ActiveCallInfo->SetContactInfo(*pContact);
+               }
+               //before setting check if the contact is deleted
+               if(pContact != null)
+               {
+                       ShowViewContactButton();
+                       delete pContact;
+                       pContact = null;
+               }
+               else
+               {
+                       ShowAddContactButton();
+               }
+               ShowPersonDetails(*__pContactNumber, IDC_CALLER1_LABEL, IDC_CALLER1_BIGPHOTO_LABEL,ActiveCallInfo);
+               delete ActiveCallInfo;
+       }
+       AppLog("Exit");
+}