X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2FCallApp.cpp;h=e790d96fc779e99f6ff0893cf2c6baa198ceab00;hb=b669e35b258dbe25bdf738fcc630eb662ea20643;hp=3545d3d1a4bd837896f5bb418b686ebac41546fb;hpb=34107747a89a32a103e24cb0a7d79a46e48c6d17;p=apps%2Fosp%2FCall.git diff --git a/src/CallApp.cpp b/src/CallApp.cpp index 3545d3d..e790d96 100644 --- a/src/CallApp.cpp +++ b/src/CallApp.cpp @@ -1,3 +1,18 @@ +// +// Copyright (c) 2012 Samsung Electronics Co., Ltd. +// +// 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 +// +// http://floralicense.org/license/ +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an AS IS BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +// /** * Name : CallApp * Version : @@ -23,6 +38,7 @@ using namespace Tizen::Ui::Scenes; using namespace Tizen::Base::Utility; using namespace Tizen::Base::Collection; using namespace Tizen::Base::Utility; +using namespace Tizen::Shell; CallApp::CallApp(void):__initialSceneId(L""), __pLaunchArgs(null) @@ -46,6 +62,7 @@ CallApp::OnAppInitializing(AppRegistry& appRegistry) { AppControlProviderManager* pProviderMgr = AppControlProviderManager::GetInstance(); pProviderMgr->SetAppControlProviderEventListener(this); + PowerManager::AddScreenEventListener(*this); return true; } @@ -86,6 +103,7 @@ CallApp::OnAppTerminating(AppRegistry& appRegistry, bool forcedTermination) // TODO: // Deallocate resources allocated by this App for termination. // The App's permanent data and context can be saved via appRegistry. + PowerManager::RemoveScreenEventListener(*this); return true; } @@ -139,12 +157,21 @@ CallApp::OnScreenOn(void) void CallApp::OnScreenOff(void) { - // TODO: - // Unless there is a strong reason to do otherwise, release resources (such as 3D, media, and sensors) to allow the device - // to enter the sleep mode to save the battery. - // Invoking a lengthy asynchronous method within this listener method can be risky, because it is not guaranteed to invoke a - // callback before the device enters the sleep mode. - // Similarly, do not perform lengthy operations in this listener method. Any operation must be a quick one. + AppLogDebug("Enter"); + IEnumerator* pEnum = __listenerList.GetEnumeratorN(); + while (pEnum->MoveNext() == E_SUCCESS) + { + IAppStateChangeListener* pInterface = static_cast(pEnum->GetCurrent()); + if (pInterface == null) + { + delete pEnum; + + return; + } + pInterface->OnScreenOff(); + } + delete pEnum; + } SceneId @@ -303,6 +330,19 @@ CallApp::HandleIncomingCallAppControlRequest(RequestId reqId,const IMap* pArgsMa //Fetch incoming call details CallPresentationModel* pCallPresentor = CallPresentationModel::GetInstance(); + //Check if there is already a dial call present .This can happen in some + //race conditions N_SE-39531 + if(pCallPresentor->IsIncomingorDialingCallPresent()) + { + int incomingHandle; + Integer::Parse(callHandle,incomingHandle); + pCallPresentor->RejectCall(incomingHandle,false,contactNumber); + AppLog("Cancelled already an incoming call present"); + appControlResult = APP_CTRL_RESULT_CANCELED; + AppControlProviderManager::GetInstance()->SendAppControlResult(reqId, appControlResult, null); + return; + } + AppCallInfo* pIncomingCall = pCallPresentor->FetchIncomingCallDetailsN(callHandle, contactNumber); if(pIncomingCall != null) { @@ -320,14 +360,17 @@ CallApp::HandleIncomingCallAppControlRequest(RequestId reqId,const IMap* pArgsMa else { //App already initialized, goto incoming call form - pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_INCOMINGCALL), __pLaunchArgs); + pSceneManager->GoForward(ForwardSceneTransition(IDSCN_SCENE_INCOMINGCALL, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY), __pLaunchArgs); __pLaunchArgs = null; } + + } else { //Show messageBox showing automatic call rejection - /* MessageBox callRejectedInoMsgBox; + /*MessageBox callRejectedInoMsgBox; String msg(L"Call From "); msg.Append(contactNumber); msg.Append(L" Rejected."); @@ -343,7 +386,6 @@ CallApp::HandleIncomingCallAppControlRequest(RequestId reqId,const IMap* pArgsMa AppLog("Terminate Phone Application"); Terminate(); } - } //set success message appControlResult = APP_CTRL_RESULT_SUCCEEDED; @@ -401,13 +443,6 @@ CallApp::HandleDialCallAppControlRequest(RequestId reqId,const IMap* pArgsMap,co //Check if its a valid number if(CheckNumberIsValid(phoneNumber) == false) { - //Show messageBox showing automatic call rejection - MessageBox InvalidNumberMsgBox; - InvalidNumberMsgBox.Construct(AppUtility::GetResourceString(IDS_INVALID_NUMBER), L"",MSGBOX_STYLE_NONE,1000); - int modalResult = 0; - // Calls ShowAndWait() : Draws and Shows itself and processes events - InvalidNumberMsgBox.ShowAndWait(modalResult); - //go back to previous scene if App was already running, else exit application. if(__initialSceneId.IsEmpty() == true) { @@ -417,7 +452,12 @@ CallApp::HandleDialCallAppControlRequest(RequestId reqId,const IMap* pArgsMap,co Terminate(); return; } - + else + { + //invalid phone number.always return, but App will come to foreground + //and show current screen, if any calls is present. + return; + } } //call type pKey = new (std::nothrow) String(PARAM_CALL_TYPE); @@ -448,10 +488,25 @@ CallApp::HandleDialCallAppControlRequest(RequestId reqId,const IMap* pArgsMap,co AppControlProviderManager::GetInstance()->SendAppControlResult(reqId, appControlResult, null); return; } + CallPresentationModel* pCallPresentor = CallPresentationModel::GetInstance(); + //Check if there is already an incoming call + //this can happen in some race conditions N_SE-39531 + if(pCallPresentor->IsIncomingorDialingCallPresent() == true) + { + AppLog("Cancelled already an incoming call present"); + appControlResult = APP_CTRL_RESULT_CANCELED; + AppControlProviderManager::GetInstance()->SendAppControlResult(reqId, appControlResult, null); + return; + } int currentActiveCallCount = pCallPresentor->GetCurrentCallCount(); if(currentActiveCallCount <= 1) { + //Abort any AppControl Request running already to show incoming call screen + if (pCallPresentor->IsAppControlRunning() == true) + { + pCallPresentor->AbortAppControlRequest(); + } //make an outgoing call with given number String* contactTxt = new (std::nothrow) String(phoneNumber); __pLaunchArgs = new (std::nothrow) ArrayList(SingleObjectDeleter); @@ -473,7 +528,8 @@ CallApp::HandleDialCallAppControlRequest(RequestId reqId,const IMap* pArgsMap,co else { AppLog("Outgoing call"); - pSceneManager->GoForward( ForwardSceneTransition( nextScene), __pLaunchArgs); + pSceneManager->GoForward( ForwardSceneTransition( nextScene, SCENE_TRANSITION_ANIMATION_TYPE_NONE, + SCENE_HISTORY_OPTION_NO_HISTORY, SCENE_DESTROY_OPTION_DESTROY), __pLaunchArgs); } appControlResult = APP_CTRL_RESULT_SUCCEEDED; } @@ -496,13 +552,19 @@ bool CallApp::CheckNumberIsValid(String phoneNumber) { //Pattern to compare all characters except 0-9 * # P ; , + - String phoneNumberPattern(L"[^0-9*#P,+;]"); + String phoneNumberPattern(L"[^0-9*#P,p+;]"); RegularExpression checkPhoneNumber; checkPhoneNumber.Construct(phoneNumberPattern); //If there is any character other than these listed above then display invalid number bool resultMatch = checkPhoneNumber.Match(phoneNumber,false); //return false for patterns other than 0-9 * # P ; , + - return !resultMatch; + if(resultMatch == true) + { + //return phone number is invalid + return false; + } + + return true; } @@ -517,23 +579,38 @@ CallApp::SetTopMostWindow(bool bTopMost) if(bTopMost == true) { GetAppFrame()->GetFrame()->SetZOrderGroup(WINDOW_Z_ORDER_GROUP_HIGHEST); - if(PowerManager::IsScreenOn() == false) + AppManager::GetInstance()->AddActiveAppEventListener(*this); + /*if(PowerManager::IsScreenOn() == false) { + AppLogDebug("TurnScreenOn"); res = PowerManager::TurnScreenOn(); - } - res = PowerManager::KeepScreenOnState(true,false); + AppLogDebug("TurnScreenOn %d",res); + }*/ } else { GetAppFrame()->GetFrame()->SetZOrderGroup(WINDOW_Z_ORDER_GROUP_NORMAL); PowerManager::KeepScreenOnState(false); + AppManager::GetInstance()->RemoveActiveAppEventListener(*this); } - //Unlock the phone if its locked -/* if(LockManager::GetInstance()->IsLocked()) + + if(LockManager::GetInstance()->IsLocked()) { AppLogDebug("Phone Locked"); LockManager::GetInstance()->Unlock(); - }*/ + } + +} +void +CallApp::OnActiveAppChanged(const String& appId) +{ + AppLogDebug("Enter %ls",appId.GetPointer()); + if(GetAppId().Equals(appId) == true) + { + result res = PowerManager::KeepScreenOnState(true,false); + AppLogDebug("KeepScreenOnState %d",res); + + } }