+//
+// 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 :
using namespace Tizen::Base::Utility;
using namespace Tizen::Base::Collection;
using namespace Tizen::Base::Utility;
+using namespace Tizen::Shell;
+
+static const int FONT_SIZE_AUTOREJECT_POPUP_TEXT = 36;
CallApp::CallApp(void):__initialSceneId(L""), __pLaunchArgs(null)
{
__listenerList.Construct();
+ __pCallRejectedIonPopup = null;
+ __pCallAppTimer = null;
+ __callTicks = 0;
}
CallApp::~CallApp(void)
{
+ if(__pCallRejectedIonPopup != null)
+ {
+ delete __pCallRejectedIonPopup;
+ __pCallRejectedIonPopup=null;
+ }
}
UiApp*
AppControlProviderManager* pProviderMgr = AppControlProviderManager::GetInstance();
pProviderMgr->SetAppControlProviderEventListener(this);
PowerManager::AddScreenEventListener(*this);
+ __callRejectedIontimer.Construct(*this);
return true;
}
return false;
}
+ if (__pCallAppTimer == null)
+ {
+ __pCallAppTimer = new (std::nothrow) Tizen::Base::Runtime::Timer();
+ __pCallAppTimer->Construct(*this);
+ long long currTime = 0;
+ SystemTime::GetTicks(currTime);
+ __callTicks = currTime;
+ __pCallAppTimer->StartAsRepeatable(TimeSpan::NUM_OF_TICKS_IN_SECOND);
+ }
+
+
return true;
}
// Deallocate resources allocated by this App for termination.
// The App's permanent data and context can be saved via appRegistry.
PowerManager::RemoveScreenEventListener(*this);
+ if (__pCallAppTimer != null)
+ {
+ __pCallAppTimer->Cancel();
+ delete __pCallAppTimer;
+ }
+
return true;
}
//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)
{
bool isCallRejected = pCallPresentor->CheckIncomingCallToBeRejected(pIncomingCall);
if(isCallRejected == false)
{
- //Abort any AppControl Request running already to show incoming call screen
- if (pCallPresentor->IsAppControlRunning() == true)
- {
- pCallPresentor->AbortAppControlRequest();
- }
//save app launch argument list
__pLaunchArgs = new (std::nothrow) ArrayList(SingleObjectDeleter);
__pLaunchArgs->Construct(1);
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_KEEP), __pLaunchArgs);
__pLaunchArgs = null;
}
+
+
}
else
{
int modalResult = 0;
// Calls ShowAndWait() : Draws and Shows itself and processes events
callRejectedInoMsgBox.ShowAndWait(modalResult);*/
-
//go back to previous scene if App was already running, else exit application.
if(__initialSceneId.IsEmpty() == true)
{
AppLog("Terminate Phone Application");
Terminate();
}
+ else
+ {
+ ShowAutoRejectPopup(contactNumber);
+ }
}
//set success message
appControlResult = APP_CTRL_RESULT_SUCCEEDED;
}
void
+CallApp::ShowAutoRejectPopup(Tizen::Base::String contactNumber)
+{
+ String msg(AppUtility::GetResourceString(IDS_CALL_REJECT_FROM_STRING));
+ msg.Append(L" ");
+ msg.Append(contactNumber);
+ if(__pCallRejectedIonPopup != null)
+ {
+ delete __pCallRejectedIonPopup;
+ __pCallRejectedIonPopup = null;
+ }
+ __pCallRejectedIonPopup = new (std::nothrow) Popup();
+ Tizen::Graphics::Dimension dim(600,200);
+ __pCallRejectedIonPopup->Construct(true, dim);
+ __pCallRejectedIonPopup->SetTitleText(AppUtility::GetResourceString(IDS_CALL_REJECTED_TITLE_STRING));
+ Label* pLabelText = new (std::nothrow) Label();
+ pLabelText->Construct(Tizen::Graphics::Rectangle(0, 0, dim.width, dim.height-100), msg);
+ pLabelText->SetTextConfig(FONT_SIZE_AUTOREJECT_POPUP_TEXT, LABEL_TEXT_STYLE_NORMAL);
+ pLabelText->SetTextHorizontalAlignment(ALIGNMENT_LEFT);
+ pLabelText->SetTextVerticalAlignment(ALIGNMENT_MIDDLE);
+ __pCallRejectedIonPopup->AddControl(pLabelText);
+ __pCallRejectedIonPopup->Show();
+ __pCallRejectedIonPopup->SetShowState(true);
+ __callRejectedIontimer.Start(3000);
+}
+
+void
+CallApp::OnTimerExpired(Tizen::Base::Runtime::Timer &timer)
+{
+ if (__callRejectedIontimer.Equals(timer))
+ {
+ if(__pCallRejectedIonPopup != null)
+ {
+ delete __pCallRejectedIonPopup;
+ __pCallRejectedIonPopup = null;
+ }
+ }
+
+ if(__pCallAppTimer->Equals(timer))
+ {
+ __callTicks += 1000;
+ }
+}
+
+void
CallApp::HandleDialCallAppControlRequest(RequestId reqId,const IMap* pArgsMap,const String* pUriData)
{
//response message
}
delete pKey;
//Check if its a valid number
- if(CheckNumberIsValid(phoneNumber) == false)
+ /* if(CheckNumberIsValid(phoneNumber) == false)
{
//go back to previous scene if App was already running, else exit application.
if(__initialSceneId.IsEmpty() == true)
//and show current screen, if any calls is present.
return;
}
- }
+ }*/
//call type
pKey = new (std::nothrow) String(PARAM_CALL_TYPE);
if(pArgsMap->ContainsKey(*pKey) == true)
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)
{
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_KEEP), __pLaunchArgs);
}
appControlResult = APP_CTRL_RESULT_SUCCEEDED;
}
{
//Pattern to compare all characters except 0-9 * # P ; , +
String phoneNumberPattern(L"[^0-9*#P,p+;]");
- String phoneNumberEndingWithHash(L"#$");
- RegularExpression checkPhoneNumber,checkHash;
+ RegularExpression checkPhoneNumber;
checkPhoneNumber.Construct(phoneNumberPattern);
- checkHash.Construct(phoneNumberEndingWithHash);
//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 ; , +
- bool endsWithHash = checkHash.Match(phoneNumber,false);
- //returns false for any numbers that end with Hash
- if(resultMatch == true || endsWithHash == true)
+ if(resultMatch == true)
{
//return phone number is invalid
return false;
CallApp::SetTopMostWindow(bool bTopMost)
{
AppLogDebug("bTopMost = %d",bTopMost);
+ result res = E_FAILURE;
//ToDO: Need to see if there is better way to handle
//this case
{
GetAppFrame()->GetFrame()->SetZOrderGroup(WINDOW_Z_ORDER_GROUP_HIGHEST);
AppManager::GetInstance()->AddActiveAppEventListener(*this);
+ /*if(PowerManager::IsScreenOn() == false)
+ {
+ AppLogDebug("TurnScreenOn");
+ res = PowerManager::TurnScreenOn();
+ AppLogDebug("TurnScreenOn %d",res);
+ }*/
}
else
AppManager::GetInstance()->RemoveActiveAppEventListener(*this);
}
+ if(LockManager::GetInstance()->IsLocked())
+ {
+ AppLogDebug("Phone Locked");
+ LockManager::GetInstance()->Unlock();
+ }
}
void
CallApp::OnActiveAppChanged(const String& appId)
{
- result res = E_FAILURE;
AppLogDebug("Enter %ls",appId.GetPointer());
if(GetAppId().Equals(appId) == true)
{
- if(PowerManager::IsScreenOn() == false)
- {
- AppLogDebug("TurnScreenOn");
- res = PowerManager::TurnScreenOn();
- AppLogDebug("TurnScreenOn %d",res);
- }
result res = PowerManager::KeepScreenOnState(true,false);
AppLogDebug("KeepScreenOnState %d",res);
-
}
}
+
+long long
+CallApp::GetCallAppTicks(void)
+{
+ return __callTicks;
+}