javauis/lcdui_akn/lcdui/src/CMIDCallIndicator.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Fri, 14 May 2010 15:47:24 +0300
changeset 23 98ccebc37403
parent 21 2a9601315dfc
permissions -rw-r--r--
Revision: v2.1.24 Kit: 201019

/*
* Copyright (c) 2008-2008 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0"
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  ?Description
*
*/


#include <e32base.h>
//using CTelephony class
#include <etel3rdparty.h>
#include "CMIDCallIndicator.h"
//using CMIDCanvas class - needed for CMIDNetworkIndicator
#include "CMIDCanvas.h"
//using CMIDNetworkIndicator class - iNetworkIndicator
#include "CMIDNetworkIndicator.h"
#include <j2me/jdebug.h>

/**
 * Constructor. Defines the priority for this active object and adds him to AS.
 */
CMIDCallIndicator::CMIDCallIndicator(
    CMIDNetworkIndicator *aNetworkIndicator):
        CActive(EPriorityStandard)
        , iNetworkIndicator(aNetworkIndicator)
        , iLineStatusPckg(iLineStatus)
{
    iNetworkIndicator->SetCallIndicator(this);
    CActiveScheduler::Add(this);
}

/**
 * Two-phased constructor.
 */
CMIDCallIndicator* CMIDCallIndicator::NewL(
    CMIDNetworkIndicator *aNetworkIndicator)
{
    DEBUG(">>> CMIDCallIndicator::NewL");
    CMIDCallIndicator* self = CMIDCallIndicator::NewLC(aNetworkIndicator);
    CleanupStack::Pop(self);
    DEBUG("<<< CMIDCallIndicator::NewL");
    return self;
}

/**
 * Two-phased constructor.
 */
CMIDCallIndicator* CMIDCallIndicator::NewLC(
    CMIDNetworkIndicator *aNetworkIndicator)
{
    CMIDCallIndicator* self = new(ELeave) CMIDCallIndicator(
        aNetworkIndicator);
    CleanupStack::PushL(self);
    self->ConstructL();
    return self;
}

/**
 * 2nd phase constructor.
 */
void CMIDCallIndicator::ConstructL()
{
    iTelephony = CTelephony::NewL();
    Init();
}

/**
 * Destructor.
 */
CMIDCallIndicator::~CMIDCallIndicator()
{
    DEBUG(">>> CMIDCallIndicator::~CMIDCallIndicator");
    Cancel();
    delete iTelephony;
    DEBUG("<<< CMIDCallIndicator::~CMIDCallIndicator");
}

/**
 * Activates the AO and register for notification by the CTelephony
 */
void CMIDCallIndicator::SetActiveLocal()
{
    // XXX DEBUG(">>> CMIDCallIndicator::SetActiveLocal");
    if (!this->IsActive())
    {
        iTelephony->NotifyChange(iStatus,
                                 CTelephony::EVoiceLineStatusChange,
                                 iLineStatusPckg);
        SetActive();
    }
    // XXX DEBUG("<<< CMIDCallIndicator::SetActiveLocal");
}

/**
 * Finds out if call is ongoing when opening canvas and sets members.
 */
void CMIDCallIndicator::Init()
{
    CTelephony::TPhoneLine line = CTelephony::EVoiceLine;

    iTelephony->GetLineStatus(line, iLineStatusPckg);

    if (CallInProgress(iLineStatus.iStatus))
    {
        // Call in progress, show call indicator.
        TRAPD(ignoreError,
              iNetworkIndicator->CreateNetworkResourceL(EBearerInfoCSD, 0));
        if (ignoreError != KErrNone)
        { // Leave is ignored. It is not so important to pass leave only
            // because the icon wasnt created.
            DEBUG_INT("CMIDCallIndicator::SetActiveLocal - Exception from CreateNetworkResourceL. Error = %d", ignoreError);
        }
        iNetworkIndicator->Repaint();
        iView = ETrue;
    }
    else
    {
        iLineStatus.iStatus = CTelephony::EStatusUnknown;
        iView = EFalse;
    }
}

/*
* Check the call status. If there is call established
* return true orwise return false.
*
* @param   aCallStatus     call status.
* @return ETrue if calling else EFalse.
*/
TBool CMIDCallIndicator::CallInProgress(CTelephony::TCallStatus aCallStatus)
{
    switch (aCallStatus)
    {
    case CTelephony::EStatusDialling:
    case CTelephony::EStatusRinging:
    case CTelephony::EStatusAnswering:
    case CTelephony::EStatusConnecting:
    case CTelephony::EStatusConnected:
    case CTelephony::EStatusReconnectPending:
    case CTelephony::EStatusDisconnecting:
    case CTelephony::EStatusHold:
    case CTelephony::EStatusTransferring:
    case CTelephony::EStatusTransferAlerting:
    {
        return ETrue; // call is in progress
    }
    case CTelephony::EStatusIdle:
    case CTelephony::EStatusUnknown:
    default:
    {
        return EFalse; // no active call
    }
    }
}

/**
 * Returns the call activity.
 *
 * @return Member iView. ETrue when active call indicator is shown = call
 *         is ongoing and EFalse otherwise.
 */
TBool CMIDCallIndicator::GetCallActivity()
{
    return iView;
}

/**
 * From CActive.
 */
void CMIDCallIndicator::RunL()
{
    DEBUG(">>> CMIDCallIndicator::RunL");

    TBool callOn = CallInProgress(iLineStatus.iStatus);

    if (!iView && callOn)
    {
        // Draw active call indicator because the call just started.
        // Create the network resource.
        // XXX    DEBUG("CMIDCallIndicator::RunL() -Newcall");
        TRAPD(ignoreError,
              iNetworkIndicator->CreateNetworkResourceL(EBearerInfoCSD, 0));
        if (ignoreError != KErrNone)
        { // Leave is ignored. It is not so important to pass leave only
            // because the icon wasnt created.
            DEBUG_INT("CMIDCallIndicator::SetActiveLocal - Exception from CreateNetworkResourceL. Error = %d", ignoreError);
        }
        iView = ETrue;
        // Repaints the indicator
        iNetworkIndicator->Repaint(ETrue);
    }
    else if (iView && !callOn)
    {
        // XXX    DEBUG("CMIDCallIndicator::RunL() -Idle/unknown - iView=ETrue >>>");
        // Call just ended. Clean the bitmap. Fill it with network indicator
        // stored in temp bitmaps only if the network connection is active.
        // Used to repaints the active call indicator with network indicator
        // immediately after the call ends.
        iNetworkIndicator->CleanNetworkResource();
        if (iNetworkIndicator->IsNetworkActive())
        {
            // There is active network connection, show its indicator.
            // XXX DEBUG("CMIDCallIndicator::RunL() -Network is active - copybitmaps");
            iNetworkIndicator->CopyBitmaps();
            iNetworkIndicator->ResizeBitmap();
        }
        iView = EFalse;
        iNetworkIndicator->Repaint(ETrue);
        // XXX DEBUG("CMIDCallIndicator::RunL() -Idle/unknown - iView=ETrue <<<");
    }
    // Set active to get next voice line status change.
    SetActiveLocal();
    DEBUG("<<< CMIDCallIndicator::RunL");
}

/**
 * From CActive.
 */
TInt CMIDCallIndicator::RunError(TInt anError)
{
    return anError;
}

/**
 * From CActive.
 */
void CMIDCallIndicator::DoCancel()
{
    // The EVoiceLineStatusChange cancellation code.
    iTelephony->CancelAsync(CTelephony::EVoiceLineStatusChangeCancel);
}