securitydialogs/Autolock/src/AutolockContainer.cpp
author Pat Downey <patd@symbian.org>
Wed, 01 Sep 2010 12:19:59 +0100
branchRCL_3
changeset 22 03674e5abf46
permissions -rw-r--r--
Revert incorrect RCL_3 drop: Revision: 201033 Kit: 201035

/*
* Copyright (c) 2002 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:
*
*/


// INCLUDE FILES
#include "AutolockContainer.h"
#include <eikenv.h>
#include <autolock.mbg>
#include <avkon.hrh>
#include <aknlayoutscalable_avkon.cdl.h>
#include <aknlayoutscalable_apps.cdl.h>
#include <layoutmetadata.cdl.h>
#include <data_caging_path_literals.hrh>
#include "AutolockAppUiPS.h"
#include <Autolock.rsg>
#include "autolock.hrh"
#include <eikdef.h>
#include <aknnotedialog.h>
#include <aknkeylock.h>
#include <AknSoftNotifier.h>

#include <coreapplicationuisdomainpskeys.h>

#include <AknsLayeredBackgroundControlContext.h>
#include <AknsDrawUtils.h>
#include <AknBitmapAnimation.h>
#include    <AknsUtils.h>
#include	<AknUtils.h>

#include <e32property.h>
#include <PSVariables.h>   // Property values
#include <coreapplicationuisdomainpskeys.h>
#include <startupdomainpskeys.h>
#include <ctsydomainpskeys.h>
_LIT(BitmapName,"AutoLock.mbm");

// CONSTANTS

#ifdef RD_FULLSCREEN_WALLPAPER
enum TAutolockBgLayers
    {
    EAutolockBgLayerWallpaper      = 0,    
    EAutolockBgLayerBackground     = 1,
    EAutolockBgLayersN             = 2
    };
#else
enum TAutolockBgLayers
    {
    EAutolockBgLayerBackground     = 0,
    EAutolockBgLayerWallpaper      = 1,
    EAutolockBgLayersN             = 2
    };
#endif //RD_FULLSCREEN_WALLPAPER

        TInt aCallRect_x;
        TInt aCallRect_y;
        TInt aCallRect_width;
        TInt aCallRect_height;
// ================= MEMBER FUNCTIONS =======================

// ---------------------------------------------------------
// CAutolockContainer::ConstructL(const TRect& aRect)
// Symbian OS two phased constructor
// ---------------------------------------------------------
//
void CAutolockContainer::ConstructL(const TRect& aRect)
    {
    #if defined(_DEBUG)
    RDebug::Print(_L("(AUTOLOCK)CAutolockContainer::ConstructL"));
    #endif
    CreateWindowL();

    HBufC* bitMapPath = HBufC::NewLC(KMaxPath);
    TPtr BitmapFile(bitMapPath->Des());
    BitmapFile.Append(_L("Z:"));
    BitmapFile.Append(KDC_APP_BITMAP_DIR);
    BitmapFile.Append(BitmapName);

    iEikBitmap = 0;
    iEikBitmapCall = 0;
    AknsUtils::CreateIconL( 
        AknsUtils::SkinInstance(), 
        KAknsIIDQgnGrafPhoneLocked,
        iBitmap,
        iMask,
        BitmapFile,
        EMbmAutolockQgn_graf_phone_locked, 
        EMbmAutolockQgn_graf_phone_locked_mask );
    AknsUtils::CreateIconL( 
        AknsUtils::SkinInstance(), 
        KAknsIIDQgnGrafPhoneLocked,
        iBitmapCall,
        iMaskCall,
        BitmapFile,
        EMbmAutolockQgn_indi_button_end_call, 
        EMbmAutolockQgn_indi_button_end_call_mask );
    
#ifdef RD_FULLSCREEN_WALLPAPER
    TSize screenSize = iCoeEnv->ScreenDevice()->SizeInPixels();
    TRect wallpaperRect( TPoint(0,0), screenSize );    
    iBgContext = CAknsLayeredBackgroundControlContext::NewL(
    KAknsIIDWallpaper, wallpaperRect, ETrue, EAutolockBgLayersN );
    SetRect(aRect);
#else    
    // Create background control context for skins. Use parent absolute mode,
    // as this is window owning control
    iBgContext = CAknsLayeredBackgroundControlContext::NewL(
        KAknsIIDQsnBgAreaMainIdle, aRect, ETrue, EAutolockBgLayersN );
    iBgContext->SetLayerImage( EAutolockBgLayerWallpaper, KAknsIIDWallpaper );
    iBgContext->SetLayerRect( EAutolockBgLayerWallpaper, aRect );
    SetRect(aRect);
#endif // RD_FULLSCREEN_WALLPAPER
    ActivateL();

    CleanupStack::PopAndDestroy(bitMapPath); //bitMapPath
    #if defined(_DEBUG)
    RDebug::Print(_L("(AUTOLOCK)CAutolockContainer::ConstructL END"));
    #endif
    }


// ---------------------------------------------------------
// CAutolockContainer::~CAutolockContainer()
// Destructor
// ---------------------------------------------------------
//
CAutolockContainer::~CAutolockContainer()
    {
    delete iBgContext;
    delete iBitmap;
    delete iMask;
    delete iBitmapCall;
    delete iMaskCall;

	}
// ---------------------------------------------------------
// CAutolockContainer::SizeChanged()
// Called by framework when the view size is changed
// ---------------------------------------------------------
//
void CAutolockContainer::SizeChanged()
    {
    #if defined(_DEBUG)
    RDebug::Print(_L("(AUTOLOCK)CAutolockContainer::SizeChanged()"));
    #endif
    
    TRect mainPaneRect(Rect());
    TAknLayoutRect idleTradPane;
    idleTradPane.LayoutRect(mainPaneRect, AknLayoutScalable_Avkon::main_idle_trad_pane());

    TInt variety = 3;
    if (Layout_Meta_Data::IsLandscapeOrientation())
        {
        variety = 2;
        }


    TAknLayoutRect idlePaneG2;
    idlePaneG2.LayoutRect(idleTradPane.Rect(), AknLayoutScalable_Avkon::main_idle_pane_g2(variety));

    TInt callState = 0;
	  RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallState, callState );
    if ( callState == EPSCTsyCallStateNone || callState == EPSCTsyCallStateUninitialized )
    	{
    AknIconUtils::SetSize( iBitmap, idlePaneG2.Rect().Size() );
    	}
    else
    	{
		  TSize lockSize = TSize(0.8 * idlePaneG2.Rect().Size().iWidth, 0.8 * idlePaneG2.Rect().Size().iHeight);
	    AknIconUtils::SetSize( iBitmap, lockSize );
    	}
		TSize callSize = TSize(60,60);
    AknIconUtils::SetSize( iBitmapCall, callSize );
    
#ifdef  RD_FULLSCREEN_WALLPAPER
    TSize screenSize = iCoeEnv->ScreenDevice()->SizeInPixels();
    TRect wallpaperRect( TPoint(0,0), screenSize );    
    iBgContext->SetLayerRect( EAutolockBgLayerBackground, Rect() ) ;
    iBgContext->SetLayerRect( EAutolockBgLayerWallpaper, wallpaperRect ) ;
    
    TPoint origo( 0, 0);
    iBgContext->SetParentPos(origo);
#else

    iBgContext->SetLayerRect( EAutolockBgLayerBackground, Rect() ) ;
    iBgContext->SetLayerRect( EAutolockBgLayerWallpaper, Rect() ) ;
     
    TPoint positionRelativeToScreen = PositionRelativeToScreen();
    //parent must be set when using parent absolute mode.
    iBgContext->SetParentPos(positionRelativeToScreen);
#endif //RD_FULLSCREEN_WALLPAPER

        RRegion autolockRegion;
#ifdef  RD_FULLSCREEN_WALLPAPER    	
    	autolockRegion.AddRect( wallpaperRect);
#else    	
    	autolockRegion.AddRect(Rect());
#endif //RD_FULLSCREEN_WALLPAPER   
        Window().SetShape(autolockRegion);
        autolockRegion.Close();
    
     #if defined(_DEBUG)
    RDebug::Print(_L("(AUTOLOCK)CAutolockContainer::SizeChanged() END"));
    #endif
	 }
// ---------------------------------------------------------
// CAutolockContainer::CountComponentControls() const
// ---------------------------------------------------------
//
TInt CAutolockContainer::CountComponentControls() const
    {
    TInt controlCount = 0;

    return controlCount;
    }

// ---------------------------------------------------------
// CAutolockContainer::ComponentControl(TInt aIndex) const
// ---------------------------------------------------------
//
CCoeControl* CAutolockContainer::ComponentControl(TInt /*aIndex*/) const
    {
    return NULL;
	} 
 // ---------------------------------------------------------
// CAutolockContainer::Draw(const TRect& aRect) const
// ---------------------------------------------------------
//
void CAutolockContainer::Draw(const TRect& aRect) const
    {
    #if defined(_DEBUG)
    RDebug::Print(_L("(AUTOLOCK)CAutolockContainer::Draw"));
    #endif
    if (AknLayoutUtils::PenEnabled() )
    	{
			TInt value = 0;
			RProperty::Get(KPSUidCoreApplicationUIs, KCoreAppUIsAutolockStatus, value);	    
			if(value <= EAutolockOff)
				{	// Avoid displaying the icon
				#if defined(_DEBUG)
				RDebug::Printf( "%s %s (%u) no Draw value=%x", __FILE__, __PRETTY_FUNCTION__, __LINE__, value );
				#endif
				// If it returns, it will not handle orientation changes.
				// However it will not really draw because the view is hidden
				// return;
				}
			}

    CWindowGc& gc = SystemGc();
    gc.SetPenStyle(CGraphicsContext::ENullPen);
    gc.SetBrushColor(KRgbWhite); 
    gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
    MAknsSkinInstance* skin = AknsUtils::SkinInstance();
    MAknsControlContext* cc = AknsDrawUtils::ControlContext( this );
    AknsDrawUtils::Background( skin, cc, this, gc, aRect );

    // Draw "lock" icon centered to this control    
    // fist calculate the correct x coordinate based on this 
    // controls rect and bitmap width    
    TInt x = Rect().Width()/2 - iBitmap->SizeInPixels().iWidth /2;
    // and do same with y
    TInt y = Rect().Height()/2 - iBitmap->SizeInPixels().iHeight/2;
		TInt width =iBitmap->SizeInPixels().iWidth;
		TInt height =iBitmap->SizeInPixels().iHeight;
		
		TInt gripStatus = EPSHWRMGripClosed;
		RProperty::Get( KPSUidHWRM, KHWRMGripStatus, gripStatus );
		#if defined(_DEBUG)
		RDebug::Printf( "%s %s (%u) gripStatus=%x", __FILE__, __PRETTY_FUNCTION__, __LINE__, gripStatus );
		#endif
		
      TInt callState = 0;
  	  RProperty::Get( KPSUidCtsyCallInformation, KCTsyCallState, callState );
    if ( callState == EPSCTsyCallStateNone || callState == EPSCTsyCallStateUninitialized )
    	{
    	}
    else
    	{
			if (gripStatus != EPSHWRMGripOpen)
    		y-=100;
    	}
    
    if (iBitmap && iMask)
        {
          // gc.BitBltMasked(TPoint(x,y),iBitmap,TRect(TPoint(0,0),iBitmap->SizeInPixels()), iMask, ETrue);
          gc.BitBltMasked(TPoint(x,y),iBitmap,TRect(TPoint(0,0),TPoint(width,height)), iMask, ETrue);
    	  if ( callState == EPSCTsyCallStateNone || callState == EPSCTsyCallStateUninitialized )
    	  	{
    	  }
    	  else
    	  	{
		    	if (gripStatus != EPSHWRMGripOpen)
		    		{
	   	    	aCallRect_x=Rect().Width()/2 - iBitmapCall->SizeInPixels().iWidth/2;
		    		aCallRect_y=Rect().Height() * 0.75;
		    		}
		    	else
		    		{
		    		aCallRect_x=Rect().Width()* 0.75 - iBitmapCall->SizeInPixels().iWidth/2;
		    		aCallRect_y = Rect().Height()/2-3*10;
		    		}
		    	aCallRect_width=iBitmapCall->SizeInPixels().iWidth;
		    	aCallRect_height=iBitmapCall->SizeInPixels().iHeight;
    	  	TSize cornerSize(20,20); 
    	  	TSize cornerEllipseSize(cornerSize.iHeight*2,cornerSize.iWidth*2);
    	  	TRect box(aCallRect_x-3*10	, aCallRect_y-3*10, aCallRect_x+aCallRect_width+3*10, aCallRect_y+aCallRect_height+3*10);
					TRect cornerRectTl(box.iTl,cornerEllipseSize);
					gc.SetBrushColor(KRgbRed); 
					gc.SetBrushStyle(CGraphicsContext::ESolidBrush);
					gc.SetPenStyle(CGraphicsContext::EDottedPen);
					gc.DrawRoundRect(box,cornerSize);
        	gc.BitBltMasked(TPoint(aCallRect_x,aCallRect_y),iBitmapCall,TRect(TPoint(0,0),TPoint(aCallRect_width,aCallRect_height)), iMaskCall, ETrue);
    	  	if (gripStatus != EPSHWRMGripOpen)
    	  		aCallRect_y+=100;	// coordinates are relative to TRect, not to Screen
    	  	
    	  	// if active call, dismiss all pending notes. This avoids them on top of the BigRedButton
    	  	CAknSoftNotifier *softNotifier = NULL;
			    TRAPD (err, {
			            softNotifier = CAknSoftNotifier::NewL();
			            softNotifier->AddNotificationL(ESetIdleState, 0);
			            // softNotifier->SetIdleStateL(EFalse);
			    };)
			    delete softNotifier;
			    // during any call ,the touch need to be enabled, so that BigRedButton is available
			    // It will be re-enabled when the call ends
		    	RAknKeyLock keylock;
			    if ( keylock.Connect() == KErrNone )
				    {
				    keylock.DisableWithoutNote();
				    keylock.Close();
				    }
        	}
        }
    else if (iBitmap && !iMask)
        {
        gc.BitBlt(TPoint(x,y),iBitmap);
    	  if ( callState == EPSCTsyCallStateNone || callState == EPSCTsyCallStateUninitialized )
    	  	{
    	  	}
    	  else
    	  	{
        	gc.BitBlt(TPoint(x,y+iBitmap->SizeInPixels().iHeight),iBitmapCall);
        	}
        }
    #if defined(_DEBUG)
    RDebug::Print(_L("(AUTOLOCK)CAutolockContainer::Draw END"));
    #endif
    }

// ---------------------------------------------------------
// CAutolockContainer::HandleControlEventL(
//     CCoeControl* aControl,TCoeEvent aEventType)
// ---------------------------------------------------------
//
void CAutolockContainer::HandleControlEventL(
    CCoeControl* /*aControl*/,TCoeEvent /*aEventType*/)
    {
    }

// ---------------------------------------------------------
// CAutolockContainer::MopSupplyObject
// 
// ---------------------------------------------------------
//
TTypeUid::Ptr CAutolockContainer::MopSupplyObject( TTypeUid aId )
    {
    if (aId.iUid == MAknsControlContext::ETypeId)
        {
        return MAknsControlContext::SupplyMopObject( aId, iBgContext );
        }
    return CCoeControl::MopSupplyObject( aId );
    }
void CAutolockContainer::GiveCoords( TRect& aRect )
    {
    	aRect.iBr.iX=aCallRect_x;
    	aRect.iBr.iY=aCallRect_y;
    	aRect.iTl.iX=aCallRect_width+2*3*10;
    	aRect.iTl.iY=aCallRect_height+2*3*10;
    }
// End of File