camerauis/cameraapp/generic/src/CamStillPreCaptureContainer.cpp
branchRCL_3
changeset 24 bac7acad7cb3
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/CamStillPreCaptureContainer.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,1154 @@
+/*
+* Copyright (c) 2007-2010 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:  Container class for still image pre-capture view*
+*/
+
+// INCLUDE FILES
+#include <AknIconUtils.h>
+#include <cameraapp.mbg>
+
+#include <cameraapp.rsg>
+#include <vgacamsettings.rsg>
+#include <akntoolbar.h>
+#include <akntoolbarextension.h>
+#include <aknlayoutscalable_apps.cdl.h>
+
+#include "CamStillPreCaptureContainer.h"
+#include "CamLogger.h"
+#include "CamPreCaptureViewBase.h"
+#include "CamAppUi.h"
+#include "CamSidePane.h"
+#include "CamSelfTimer.h"
+#include "CamUtility.h"
+#include "camactivepalettehandler.h"
+#include "CameraUiConfigManager.h"
+#include "OstTraceDefinitions.h"
+#include "CamIndicator.h"
+#ifdef OST_TRACE_COMPILER_IN_USE
+#include "CamStillPreCaptureContainerTraces.h"
+#endif
+
+#include "camvfgridinterface.h"
+#include "camlinevfgriddrawer.h"
+#include "CamPanic.h"
+
+// Constants
+const TUid KGridDrawerUid = { KCamLineDrawVfGridUid };
+const TInt KGridHrzLines  = 2;
+const TInt KGridVrtLines  = 2;
+const TInt KGridThickness = 2;
+const TRgb KGridColor     = KRgbGray;
+const CGraphicsContext::TPenStyle KGridStyle = CGraphicsContext::ESolidPen;
+
+// ================= MEMBER FUNCTIONS =======================
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::NewL
+// Symbian OS two-phased constructor
+// ---------------------------------------------------------------------------
+//
+CCamStillPreCaptureContainer* CCamStillPreCaptureContainer::NewL(
+        CCamAppController& aController,
+        CAknView& aView,
+        const TRect& aRect )
+    {
+    CCamStillPreCaptureContainer* self = new( ELeave ) CCamStillPreCaptureContainer(
+        aController, aView );
+
+    CleanupStack::PushL( self );
+    self->ConstructL( aRect );
+    CleanupStack::Pop( self );
+    // Return newly created CCamStillPreCaptureContainer instance
+    return self;
+    }
+
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::~CCamStillPreCaptureContainer
+// Destructor
+// ---------------------------------------------------------------------------
+//
+CCamStillPreCaptureContainer::~CCamStillPreCaptureContainer()
+  {
+  PRINT( _L("Camera => ~CCamStillPreCaptureContainer" ))
+
+  if ( iAPCreateAO )
+      {
+      iAPCreateAO->Cancel();
+      delete iAPCreateAO;
+      }
+
+  if ( iXenonFlashSupported )
+      {
+      // Unsubscribe blink events
+      if( CCamFlashStatus* flashStatus = iController.FlashStatus() )
+        flashStatus->Subscribe( NULL );
+
+      delete iFlashBitmap;
+      delete iFlashBitmapMask;
+      }
+  PRINT( _L("Camera <= ~CCamStillPreCaptureContainer" ))
+  }
+
+// ---------------------------------------------------------
+// CCamStillPreCaptureContainer::ConstructL
+// Symbian OS 2nd phase constructor
+// ---------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::ConstructL( const TRect& aRect )
+  {
+  PRINT( _L("Camera => CCamStillPreCaptureContainer::ConstructL" ))
+  BaseConstructL( aRect );
+
+  if ( iController.UiConfigManagerPtr() &&
+       iController.UiConfigManagerPtr()->IsUIOrientationOverrideSupported() )
+      {
+      iAPCreateAO = CIdle::NewL(CActive::EPriorityStandard);
+      }
+
+  if ( iController.UiConfigManagerPtr() &&
+       iController.UiConfigManagerPtr()->IsAutoFocusSupported() )
+      {
+      if( iController.IntegerSettingValue( ECamSettingItemPhotoShowFocusPoint ) )
+        {
+        iShowReticule = EFalse;
+        }
+      else
+        {
+        iShowReticule = ETrue;
+        }
+    }
+
+  iSidePane->SetCaptureMode( ECamControllerImage );
+
+
+  iXenonFlashSupported = iController.UiConfigManagerPtr()->IsXenonFlashSupported();
+  if ( iXenonFlashSupported )
+      {
+      InitFlashIconL();
+      LayoutFlashIcon();
+      }
+
+  PrepareProcessingTextL( ETrue );
+
+  if ( !( iController.UiConfigManagerPtr() &&
+       iController.UiConfigManagerPtr()->IsUIOrientationOverrideSupported() ) )
+      {
+      OstTrace0( CAMERAAPP_PERFORMANCE, CCAMSTILLPRECAPTURECONTAINER_CONSTRUCTL, "e_CAM_APP_AP_SETUP 1" );
+      static_cast<CCamPreCaptureContainerBase*>( this )
+          ->SetupActivePaletteL( static_cast<CCamViewBase*>(&iView) );
+      OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMSTILLPRECAPTURECONTAINER_CONSTRUCTL, "e_CAM_APP_AP_SETUP 0" );
+      }
+
+  PRINT( _L("Camera <= CCamStillPreCaptureContainer::ConstructL" ))
+  }
+
+// ---------------------------------------------------------
+// CCamContainerBase::BaseConstructL
+// Symbian OS 2nd phase constructor
+// ---------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::BaseConstructL( const TRect& aRect )
+    {
+    CCamPreCaptureContainerBase::BaseConstructL( aRect );
+    // Layout the reticule.
+    if ( iController.UiConfigManagerPtr() &&
+         iController.UiConfigManagerPtr()->IsAutoFocusSupported() )
+        {
+        SizeChanged(); // Init layout
+        }
+    }
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::CCamStillPreCaptureContainer
+// C++ constructor
+// ---------------------------------------------------------------------------
+//
+
+CCamStillPreCaptureContainer::CCamStillPreCaptureContainer(
+        CCamAppController& aController,
+        CAknView& aView )
+: CCamPreCaptureContainerBase( aController, aView )
+    {
+    }
+
+
+// ---------------------------------------------------------
+// CCamStillPreCaptureContainer::HandleControllerEventL
+// Receives notifications about changes in recording state from the controller
+// ---------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::HandleControllerEventL( TCamControllerEvent aEvent, TInt aError )
+  {
+  PRINT1( _L("Camera => CCamStillPreCaptureContainer::HandleControllerEventL aEvent:%d" ), aEvent )
+  CCamAppUi* appUi = static_cast<CCamAppUi*>(CEikonEnv::Static()->AppUi());
+
+  switch( aEvent )
+    {
+    // ---------------------------------------------------
+  	case ECamEventImageQualityChanged:
+      {
+      PRINT( _L("Camera <> CCamStillPreCaptureContainer - ECamEventImageQualityChanged") );
+      // If our viewfinder area is already set and image quality changes,
+      // do re-layout.
+      if( !iRect.IsEmpty() )
+        {
+        const TRect r( ViewFinderFrameRect() );
+        if( iRect != r )
+          {
+          PRINT( _L("Camera <> CCamStillPreCaptureContainer - doing re-layout..") );
+          iRect = r;
+          SizeChanged();
+          }
+        }
+      SetResolutionIndicator();
+      break;
+      }
+    // ---------------------------------------------------
+  	case ECamEventLocationSettingChanged:
+      {
+      // If the location setting was changed on, then the indicator should be visible
+      SetLocationIndicatorVisibility();
+      break;
+      }
+    // ---------------------------------------------------
+  	case ECamEventCameraChanged:
+      {
+      break;
+      }
+    // ---------------------------------------------------
+  	case ECamEventOperationStateChanged:
+  	  {
+      if( ECamCapturing == iController.CurrentOperation() )
+        {
+        // If capture has just begun, and it's burst capture,
+        // will need to set the softkeys to Blank/Cancel (via UpdateCbaL call)
+        if ( appUi->IsBurstEnabled() )
+            {
+            // Burst *is* enabled, so force the update of the CBA
+            static_cast<CCamViewBase&>(iView).UpdateCbaL();
+            }
+        else // if burst is not enabled show the saving image wait note
+       	    {
+			Window().Invalidate();
+       	    }
+        }
+      else
+       	{
+       	}
+      break;
+  	  }
+    // ---------------------------------------------------
+    case ECamEventSetupStateChanged:
+      {
+      appUi->APHandler()->UpdateActivePaletteL();
+      break;
+      }
+    // ---------------------------------------------------
+    case ECamEventEngineStateChanged:
+        {
+        if( iController.CurrentImageModeSetup() == ECamImageCaptureBurst &&
+            !iController.SequenceCaptureInProgress() )
+            {
+            // Burst mode - processing text needed
+            PrepareBurstProcessingTextL();
+            }
+         break;
+         }
+    // ---------------------------------------------------
+    case ECamEventInitReady:
+        {
+        // event only received if UIOrientationOverride feature is supported
+        if( iAPCreateAO->IsActive() )
+            {
+            iAPCreateAO->Cancel();
+            }
+		iAPCreateAO->Start( TCallBack( BackgroundAPL,this ) );
+        break;
+        }
+    // ---------------------------------------------------
+    default:
+      {
+      // otherwise, do nothing
+      break;
+      }
+    // ---------------------------------------------------
+    }
+    CCamPreCaptureContainerBase::HandleControllerEventL( aEvent, aError );
+    PRINT( _L("Camera <= CCamStillPreCaptureContainer::HandleControllerEventL" ) )
+    }
+
+
+//----------------------------------------------
+// BackgroundAPL
+// Create AP ItemActive object Callback
+//----------------------------------------------
+TInt CCamStillPreCaptureContainer::BackgroundAPL( TAny *aparam )
+    {
+    CCamStillPreCaptureContainer* camStillCaptureContainer = reinterpret_cast<CCamStillPreCaptureContainer*> (aparam);
+    return camStillCaptureContainer->SetupActivePaletteCallbackL();
+    }
+
+
+//----------------------------------------------
+// SetupActivePaletteCallbackL
+// Initializes ActivePalette
+//----------------------------------------------
+TInt CCamStillPreCaptureContainer::SetupActivePaletteCallbackL()
+    {
+    PRINT( _L("Camera => CCamStillPreCaptureContainer::SetupActivePaletteCallbackL" ) )
+    CCamAppUi* appUi = static_cast<CCamAppUi*>(CEikonEnv::Static()->AppUi());
+    if ( !iController.IsTouchScreenSupported() &&
+         iController.CurrentMode()== ECamControllerImage )
+        {
+        if ( appUi )
+            {
+            appUi->SetActivePaletteVisibility( EFalse);
+            if ( !appUi->ActivePalette() )
+                {
+                OstTrace0( CAMERAAPP_PERFORMANCE, CCAMSTILLPRECAPTURECONTAINER_HANDLECONTROLLEREVENTL, "e_CAM_APP_AP_SETUP 1" );
+                static_cast<CCamPreCaptureContainerBase*>( this )
+                    ->SetupActivePaletteL( static_cast<CCamViewBase*>(&iView) );
+                OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMSTILLPRECAPTURECONTAINER_HANDLECONTROLLEREVENTL, "e_CAM_APP_AP_SETUP 0" );
+                }
+            else
+                {
+                OstTrace0( CAMERAAPP_PERFORMANCE, DUP2_CCAMSTILLPRECAPTURECONTAINER_HANDLECONTROLLEREVENTL, "e_CAM_APP_AP_UPDATE 1" );
+                appUi->APHandler()->UpdateActivePaletteL();
+                OstTrace0( CAMERAAPP_PERFORMANCE, DUP3_CCAMSTILLPRECAPTURECONTAINER_HANDLECONTROLLEREVENTL, "e_CAM_APP_AP_UPDATE 0" );
+                }
+            appUi->SetActivePaletteVisibility( ETrue );
+            }
+        else
+            {
+            }
+        }
+    PRINT( _L("Camera <= CCamStillPreCaptureContainer::SetupActivePaletteCallbackL" ) )
+    return EFalse;
+    }
+
+// ---------------------------------------------------------
+// CCamStillPreCaptureContainer::OfferKeyEventL
+// Handle key events
+// ---------------------------------------------------------
+//
+TKeyResponse
+CCamStillPreCaptureContainer::OfferKeyEventL( const TKeyEvent& aKeyEvent,
+                                                    TEventCode aType )
+    {
+    // if the cancel softkey is pressed
+
+    // If currently capturing a burst
+    if ( iController.SequenceCaptureInProgress() )
+        {
+        if ( aKeyEvent.iScanCode == EStdKeyDevice1 )
+            {
+            // Just return so the key press does not pass up to the base
+            // class This will now be handled in HandleCommandL()
+            return EKeyWasNotConsumed;
+            }
+        }
+    return CCamPreCaptureContainerBase::OfferKeyEventL( aKeyEvent, aType );
+    }
+
+// ---------------------------------------------------------
+// CCamStillPreCaptureContainer::ViewFinderLayoutResourceIds
+// Return the layout resource id for the viewfinder
+// ---------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::ViewFinderLayoutResourceIds(
+                                                TInt& aViewFinderLayoutId,
+                                                TInt& aReticuleLayoutId ) const
+    {
+        {
+        aViewFinderLayoutId = ROID(R_CAM_VIEWFINDER_RECT_STILL_ID);
+        CCamAppUiBase* appui = static_cast<CCamAppUiBase*>( iEikonEnv->AppUi() );
+        if ( appui->IsSecondCameraEnabled() )
+            {
+            aViewFinderLayoutId = ROID(R_CAM_STILL_DISPLAYED_RECT_SECONDARY_ID);
+            }
+        }
+    if ( iController.UiConfigManagerPtr() &&
+         iController.UiConfigManagerPtr()->IsAutoFocusSupported() )
+        {
+        // set the layouts for the still capture viewfinder and reticule
+        aReticuleLayoutId = R_CAM_IMG_PRECAP_RETICULE;
+        }
+    else
+        {
+        aReticuleLayoutId = 0;
+        }
+    }
+
+// ---------------------------------------------------------
+// CCamStillPreCaptureContainer::SetResolutionIndicator
+// Sets the resolution indicator to the required icon
+// ---------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::SetResolutionIndicator()
+    {
+    // The setting stored is an index into the array of supported qualities,
+    // and since this matches the array of supported quality icons, we do
+    // not need to do any further lookup on this value.
+    iCurrentIndicator = iController.IntegerSettingValue( ECamSettingItemPhotoQuality );
+    }
+
+// ---------------------------------------------------------
+// CCamStillPreCaptureContainer::SetLocationIndicatorVisibility
+// Sets the resolution indicator visibility, if it is set or not
+// ---------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::SetLocationIndicatorVisibility()
+    {
+    // The setting stored is an index of whether the location setting is on or off
+    iLocationIndicatorVisible = (/*TCamLocationId::ECamLocationOn*/1 == iController.IntegerSettingValue( ECamSettingItemRecLocation ));
+    }
+
+// ----------------------------------------------------
+// CCamStillPreCaptureContainer::IncreaseFlashSettingL
+// Move up through the flash settings
+// ----------------------------------------------------
+//
+void CCamStillPreCaptureContainer::IncreaseFlashSettingL()
+    {
+    if ( iZoomPane->IsVisible()
+         || static_cast<CCamAppUiBase*>( iEikonEnv->AppUi() )->IsSecondCameraEnabled()
+        )
+        {
+        return;
+        }
+    // get current setting
+    TInt setting =
+            iController.IntegerSettingValue( ECamSettingItemDynamicPhotoFlash );
+
+    // Max/Min settings are ECamFlashAuto/ECamFlashOff
+    // and navi-key right moves down the list of settings
+    if ( setting == ECamFlashOff )
+        {
+        setting = ECamFlashAuto;
+        }
+    else if ( setting >= ECamFlashAuto )
+        {
+        setting++;
+        }
+    else
+        {
+        // remove Lint warning
+        }
+
+    // only update if setting is invalid
+    if ( setting >= ECamFlashAuto && setting <= ECamFlashOff )
+        {
+        iController.SetIntegerSettingValueL(
+                                ECamSettingItemDynamicPhotoFlash, ( setting ) );
+        }
+    }
+
+// ----------------------------------------------------
+// CCamStillPreCaptureContainer::DecreaseFlashSettingL
+// Move down through the flash settings
+// ----------------------------------------------------
+//
+void CCamStillPreCaptureContainer::DecreaseFlashSettingL()
+    {
+    if ( iZoomPane->IsVisible()
+         || static_cast<CCamAppUiBase*>( iEikonEnv->AppUi() )->IsSecondCameraEnabled()
+        )
+        {
+        return;
+        }
+    // get current setting
+    TInt setting =
+            iController.IntegerSettingValue( ECamSettingItemDynamicPhotoFlash );
+
+    // Max/Min settings are ECamFlashAuto/ECamFlashOff
+    // and navi-key left moves up the list of settings
+    if ( setting == ECamFlashAuto )
+        {
+        setting = ECamFlashOff;
+        }
+    else if ( setting > ECamFlashAuto )
+        {
+        setting--;
+        }
+    else
+        {
+        // remove Lint warning
+        }
+
+    // only update if setting is invalid
+    if ( setting >= ECamFlashAuto && setting <= ECamFlashOff )
+        {
+        iController.SetIntegerSettingValueL(
+                                ECamSettingItemDynamicPhotoFlash, ( setting ) );
+        }
+    }
+
+// ----------------------------------------------------
+// CCamStillPreCaptureContainer::HandleCaptureKeyEventL
+// Change the current capture state
+// ----------------------------------------------------
+//
+TKeyResponse
+CCamStillPreCaptureContainer::HandleCaptureKeyEventL( const TKeyEvent& aKeyEvent )
+  {
+  PRINT( _L("Camera => CCamStillPreCaptureContainer::HandleCaptureKeyEventL"))
+  TKeyResponse keyResponse = EKeyWasNotConsumed;
+  CCamAppUi* appui = static_cast<CCamAppUi*>( iEikonEnv->AppUi() );
+  __ASSERT_DEBUG(appui, CamPanic(ECamPanicNullPointer));
+  TBool MSKCapture(EFalse);
+  // First handle middle softkey and enter key capture event
+  if ( !appui->IsToolBarVisible()
+       && ( aKeyEvent.iScanCode == EStdKeyDevice3
+            || aKeyEvent.iScanCode == EStdKeyEnter
+            || aKeyEvent.iScanCode == EStdKeyNkpEnter ) )
+    {
+    if ( iController.UiConfigManagerPtr() )
+        {
+        if ( iController.UiConfigManagerPtr()->IsOpticalJoyStickSupported() )
+            {
+            MSKCapture = ETrue;
+            }
+        else
+            {
+            if ( iController.UiConfigManagerPtr()->IsXenonFlashSupported() )
+                {
+                if ( iController.CheckFlash()
+                       && static_cast<CCamPreCaptureViewBase*>( &iView )
+                           ->StartMskCaptureL() )
+                    {
+                    return EKeyWasConsumed;
+                    }
+                }
+             else if ( static_cast<CCamPreCaptureViewBase*>( &iView )->StartMskCaptureL() )
+                {
+                return EKeyWasConsumed;
+                }
+            }
+        }
+    }
+
+  TBool selfTimerEnabled = appui->SelfTimerEnabled();
+  TBool timeLapseEnabled = appui->CurrentBurstMode() == ECamImageCaptureTimeLapse;
+
+  // if currently capturing a sequence
+  if ( iController.SequenceCaptureInProgress() )
+    {
+    // if capturing an advanced timelapse under the press to start, press to stop rules
+    // (i.e. not selftimer which captures 6 images)
+    if ( timeLapseEnabled && !selfTimerEnabled )
+      {
+      // Stop the capture now
+      iController.StopSequenceCaptureL();
+      // Update CBA for setup pane usage
+      TRAP_IGNORE( static_cast<CCamPreCaptureViewBase*>( &iView )->UpdateCbaL() );
+      PRINT( _L("Camera <= CCamStillPreCaptureContainer: sequence capture stopped"))
+      return EKeyWasConsumed;
+      }
+    else
+      {
+      // For certain products normal sequence capture, if we
+      // are already capturing a burst, just consume but ignore it.
+      PRINT( _L("Camera <= CCamStillPreCaptureContainer: ignored during sequence"))
+      return EKeyWasConsumed;
+      }
+    }
+
+  if ( iController.UiConfigManagerPtr() &&
+       iController.UiConfigManagerPtr()->IsAutoFocusSupported() )
+      {
+      // If the shutter key has continued to a full press OR
+      // we are already focussed (as scene is a forced focus mode)
+      if ( iKeyShutter
+        || !iPhotoSceneUsesReticule
+         )
+        {
+        iKeyShutter = EFalse;
+
+        // Check if we are in Burst Mode with the controller not currently focussed.
+        if ( appui->IsBurstEnabled()
+          && iController.CurrentOperation() != ECamFocused &&
+             iController.CurrentOperation() != ECamFocusFailed )
+          {
+          // We want to start focus if in multishot and NOT in self-timer mode
+          // and current scene allows autofocus (ie if it's not forced)
+          if ( !selfTimerEnabled
+            && iPhotoSceneUsesReticule
+             )
+            {
+            if( iXenonFlashSupported && timeLapseEnabled && !iController.CheckFlash() )
+              {
+              // In time lapse mode, do not start focusing with full press if
+              // Xenon flash is not ready. This is not the case for normal
+              // burst mode, because flash is not used there.
+              iKeyShutter = ETrue;
+              PRINT( _L("Camera <= CCamStillPreCaptureContainer: Flash not ready in timelapse mode, ignore key"))
+              return EKeyWasConsumed;
+              }
+            // Below code commented out - fast capture should be supported also
+            // in burst/sequence capture mode. Also, in case focusing is already
+            // in progress, the call won't do anything.
+            // iController.StartAutoFocus();
+            }
+          }
+        }
+#ifndef __WINS__
+      else
+        {
+        // This means we've received a full press without a half press -
+        // probably because the half press was consumed by the post capture view
+        // and triggered a switch to this view.  In this case, we don't want to
+        // take a picture, therefore ignore the event.
+        if ( !appui->IsSecondCameraEnabled()
+             && !MSKCapture )
+          {
+          PRINT( _L("Camera <= CCamStillPreCaptureContainer: full press without half press ignored"))
+          return EKeyWasConsumed;
+          }
+        }
+#endif // __WINS__
+      }
+  else
+      {
+      // in case AF is not supported, check memory here before capturing
+      if ( !iController.IsViewFinding() || !appui->CheckMemoryL() )
+          {
+          return EKeyWasConsumed; 
+          }         
+      }
+      
+  if( iXenonFlashSupported
+   && !appui->IsSecondCameraEnabled()
+   && !MSKCapture
+   && !iController.CheckFlash() )
+    {
+    if( !appui->IsBurstEnabled() || (timeLapseEnabled && selfTimerEnabled) )
+      {
+      // For non-burst case, or time lapse captures with self timer,
+      // we do not allow primary camera capture if flash is required,
+      // but not ready.
+      iKeyShutter = ETrue;
+      PRINT( _L("Camera <= CCamStillPreCaptureContainer: Flash not ready, ignore key"))
+      return EKeyWasNotConsumed;
+      }
+    }
+  if ( iController.UiConfigManagerPtr() 
+         && !iController.UiConfigManagerPtr()->IsAutoFocusSupported()
+         && iController.IsTouchScreenSupported() )
+         {
+         CAknToolbar* fixedToolbar = appui->CurrentFixedToolbar();
+         if ( fixedToolbar )
+            {
+             CAknToolbarExtension* extension = fixedToolbar->ToolbarExtension();
+            if ( extension )
+                {
+                 extension->SetShown( EFalse ); 
+                }
+             }
+         }
+
+  // Go straight to capture
+  keyResponse = appui->StartCaptureL( aKeyEvent );
+
+  // Blank out the softkeys if we are capturing
+  if ( EKeyWasConsumed == keyResponse
+    && !iController.SequenceCaptureInProgress()
+    && !iController.CaptureModeTransitionInProgress()
+     )
+    {
+    // Only blank the cba if self timer is not enabled
+    // or it is enabled but not counting down
+    if ( !selfTimerEnabled
+      || (  selfTimerEnabled && !appui->SelfTimer()->IsActive() )
+       )
+      {
+      static_cast<CCamViewBase*>( &iView )->BlankSoftkeysL();
+      }
+     if ( iController.IsTouchScreenSupported() )
+         {
+         CAknToolbar* fixedToolbar = appui->CurrentFixedToolbar();
+         if ( fixedToolbar )
+             {
+             fixedToolbar->SetToolbarVisibility( EFalse );
+             }
+         }
+    }
+
+  if ( iController.IsTouchScreenSupported() )
+      {
+      // Hide the toolbar in case full press in burstmode
+      if ( appui->IsBurstEnabled() )
+          {
+          CAknToolbar* fixedToolbar = appui->CurrentFixedToolbar();
+          if ( fixedToolbar )
+              {
+              fixedToolbar->SetToolbarVisibility( EFalse );
+              }
+          }
+      }
+
+  PRINT( _L("Camera <= CCamStillPreCaptureContainer::HandleCaptureKeyEventL"))
+  return keyResponse;
+  }
+
+
+// ----------------------------------------------------
+// CCamStillPreCaptureContainer::HandleShutterKeyEventL
+// Change the current capture state following shutter
+// key events
+// ----------------------------------------------------
+//
+TKeyResponse
+CCamStillPreCaptureContainer::HandleShutterKeyEventL( const TKeyEvent& aKeyEvent,
+                                                            TEventCode aType )
+  {
+  CCamAppUi* appui = static_cast<CCamAppUi*>( iEikonEnv->AppUi() );
+  __ASSERT_DEBUG(appui, CamPanic(ECamPanicNullPointer));
+  TBool MSKCapture(EFalse);
+  if ( !appui->IsToolBarVisible()
+       && aKeyEvent.iScanCode == EStdKeyDevice3
+       && iController.UiConfigManagerPtr()
+       && iController.UiConfigManagerPtr()->IsOpticalJoyStickSupported() )
+    {
+    MSKCapture = ETrue;
+    }
+
+  // If the key is a half-press and down
+#ifndef __WINS__
+    if ( aKeyEvent.iScanCode == iPrimaryCameraAFKeys[0]
+#else
+    if ( aKeyEvent.iScanCode == EProductKeyCaptureHalf &&
+         !( aKeyEvent.iModifiers & EModifierShift )
+#endif //__WINS__
+        && iController.UiConfigManagerPtr()
+        && iController.UiConfigManagerPtr()->IsAutoFocusSupported() )
+    {
+    if ( aType == EEventKeyDown )
+      {
+      OstTrace0( CAMERAAPP_PERFORMANCE, DUP1_CCAMSTILLPRECAPTURECONTAINER_HANDLESHUTTERKEYEVENTL, "e_CAM_PRI_AF_LOCK 1" );
+      PRINT( _L("Camera => CCamStillPreCaptureContainer::HandleHalfKeyEventL DOWN"))
+      PERF_MESSAGE_L2( EPerfMessageCaptureKeyHalfPressed );
+      // If the shutter key has been half pressed
+      iKeyShutter = ETrue; // Shutter key - first stage press -> start focussing...
+
+      // check for active viewfinder and available space before proceeding with capture
+      if ( !iController.IsViewFinding() || !appui->CheckMemoryL() )
+        {
+        // no memory available - stop capture
+        return EKeyWasConsumed;
+        }
+
+      if ( iController.UiConfigManagerPtr()
+           && iController.UiConfigManagerPtr()->IsAutoFocusSupported()
+           && !appui->SelfTimerEnabled()
+           && iPhotoSceneUsesReticule )
+        {
+        OstTrace0( CAMERAAPP_PERFORMANCE, CCAMSTILLPRECAPTURECONTAINER_HANDLESHUTTERKEYEVENTL, "e_CAM_APP_AF 1" );  //CCORAPP_AF_START
+        iController.StartAutoFocus();
+        }
+
+      CAknToolbar* fixedToolbar = appui->CurrentFixedToolbar();
+
+      if ( fixedToolbar )
+        {
+        CAknToolbarExtension* extension = fixedToolbar->ToolbarExtension();
+        if ( extension )
+            {
+            extension->SetShown( EFalse );
+            }
+        }
+      iZoomPane->MakeVisible( EFalse, ETrue );
+
+      return EKeyWasConsumed;
+      }
+    else if ( aType == EEventKeyUp && !MSKCapture )
+      {
+      PRINT( _L("Camera => CCamStillPreCaptureContainer::HandleKeyEventL EProductKeyCaptureHalf up "))
+      // If full shutter press is released
+      // The order of conditions is important here as half shutter only release resets the
+      // value of iKeyShutter
+      if ( !iKeyShutter )
+        {
+        // Cancelling of a press-and-hold burst is handled
+        // when the full-press is released, so nothing to
+        // do when release the half-press apart from consume it
+        PRINT( _L("Camera <= CCamStillPreCaptureContainer::HandleKeyEventL no action, return EKeyWasConsumed"))
+        return EKeyWasConsumed;
+        }
+      else
+        {
+        // if half shutter only is released
+        iKeyShutter = EFalse;
+        TCamCaptureOperation operation = iController.CurrentOperation();
+        // if not in self timer mode or about to start a capture
+        if ( !appui->SelfTimerEnabled()
+          && !iController.CapturePending()
+          || ECamFocusing == operation
+           )
+          {
+          // In timelapse mode, when stopping with capture key,
+          // need this condition to avoid unnecessary entering
+          // to no-operation while already completing.
+          if( ECamCompleting != operation )
+            {
+            iController.CancelFocusAndCapture();
+            }
+
+          // if not currently capturing
+          if ( ECamCapturing != operation )
+            {
+            appui->UpdateCba();
+            }
+          }
+        return EKeyWasConsumed;
+        }
+      }
+    else
+      {
+      // Removal of warning
+      }
+    }
+  return EKeyWasNotConsumed;
+  }
+
+
+
+// ---------------------------------------------------------------------------
+// DrawAdditionalIcons
+//
+// ---------------------------------------------------------------------------
+//
+void
+CCamStillPreCaptureContainer::DrawAdditionalIcons( CBitmapContext& aGc ) const
+  {
+  if( iXenonFlashSupported && iFlashIconVisible && ECamActiveCameraSecondary != iController.ActiveCamera() )
+    {
+    DrawFlashIcon( aGc );
+    }
+  }
+
+// ----------------------------------------------------
+// CCamStillPreCaptureContainer::ResolutionIndicatorIconPsiKey
+// Returns the PSI key relating to the array of resolution
+// indicator bitmaps.
+// ----------------------------------------------------
+//
+TCamPsiKey CCamStillPreCaptureContainer::ResolutionIndicatorIconPsiKey() const
+    {
+    return ECamPsiPrecapStillQualityIconIds;
+    }
+
+// ---------------------------------------------------------------------------
+// virtual GetAPResourceId
+// (From CCamPreCaptureContainerBase)
+//
+// Helper method to select the AP resource used to set AP items.
+// ---------------------------------------------------------------------------
+//
+TInt CCamStillPreCaptureContainer::GetAPResourceId() const
+    {
+    CCamAppUi* appUi =  static_cast<CCamAppUi*>( iEikonEnv->AppUi() );
+    TBool embedded   = appUi->IsEmbedded();
+    TInt resId = 0;
+    if( embedded )
+        {
+        if ( !appUi->IsSecondCameraEnabled() )
+            {
+            resId = R_CAM_EMB_STILL_PRE_CAPTURE_AP_ITEMS_ADVANCED;
+            }
+        }
+    else
+        {
+        if ( !appUi->IsSecondCameraEnabled() )
+            {
+            resId = R_CAM_STILL_PRE_CAPTURE_AP_ITEMS_ADVANCED;
+            }
+        else
+            {
+            resId = R_CAM_STILL_PRE_CAPTURE_AP_ITEMS_SECONDARY;
+            }
+        }
+    return resId;
+    }
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::SizeChanged
+// Called by framework when the component size is changed
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::SizeChanged()
+  {
+  CCamPreCaptureContainerBase::SizeChanged();
+  if ( iXenonFlashSupported )
+      {
+      LayoutFlashIcon();
+      }
+  }
+
+
+// ---------------------------------------------------------------------------
+// HandleForegroundEventL
+// ---------------------------------------------------------------------------
+//
+void
+CCamStillPreCaptureContainer::HandleForegroundEventL( TBool aForeground )
+  {
+  PRINT( _L("Camera => CCamStillPreCaptureContainer::HandleForegroundEventL") )
+
+  CCamPreCaptureContainerBase::HandleForegroundEventL( aForeground );
+  if ( iXenonFlashSupported )
+      {
+
+      // Subscribe / unsubscribe from flash related events
+      // When going to background -> unsubscribe
+      // Otherwise -> subscribe
+      SubscribeFlashEvents( aForeground );
+      }
+
+  PRINT( _L("Camera => CCamStillPreCaptureContainer::HandleForegroundEventL") )
+  }
+
+
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::FlashIconVisible
+// Called when Xenon flash icon visibility changes
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::FlashIconVisible( TBool aVisible )
+  {
+  PRINT( _L("Camera => CCamStillPreCaptureContainer::FlashIconVisible") )
+  if( ECamActiveCameraSecondary == iController.ActiveCamera() )
+    {
+    // Do not draw the flash icon even if visible, if using secondary
+    // camera, as it does not use the flash at all.
+    return;
+    }
+
+
+  if( ECamCapturing  == iController.CurrentOperation() ||
+      ECamCompleting == iController.CurrentOperation() )
+    {
+    if ( !iFlashIconVisible && aVisible  )
+      {
+      // During capture, if flash icon is currently invisible,
+      // do not make it visible. Also if the state has not changed,
+      // we don't need to redraw anything
+      return;
+      }
+    }
+
+  if( iFlashIconVisible != aVisible )
+    {
+    // Icon state has changed. Redraw.
+
+    iFlashIconVisible = aVisible;
+
+    // State changed, need to redraw
+    ActivateGc();
+
+    // Invalidate the flash icon area
+    RWindow window = Window();
+    window.Invalidate( iFlashIconRect );
+    window.BeginRedraw( iFlashIconRect );
+
+    // Redraw the background in that area
+    Redraw( iFlashIconRect );
+
+    // Draw the flash icon itself
+    CWindowGc& gc = SystemGc();
+    if( aVisible )
+      {
+      DrawFlashIcon( gc );
+      }
+
+    // Tell the window redraw is finished and deactivate Gc
+    window.EndRedraw();
+    DeactivateGc();
+    }
+  PRINT( _L("Camera <= CCamStillPreCaptureContainer::FlashIconVisible") )
+  }
+
+
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::FlashError
+// Called when there was an error while recharging
+// the Xenon flash.
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::FlashError()
+  {
+  }
+
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::InitFlashIconL
+//
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::InitFlashIconL()
+  {
+  iFlashIconVisible = EFalse;
+
+  // Init flash icon bitmap and mask
+  TFileName resFileName;
+  CamUtility::ResourceFileName( resFileName );
+  TPtrC resname = resFileName;
+
+  AknIconUtils::CreateIconL( iFlashBitmap,
+                           iFlashBitmapMask,
+                           resname,
+                           EMbmCameraappQgn_indi_cam4_flash_on,
+                           EMbmCameraappQgn_indi_cam4_flash_on_mask );
+
+  // Subscribe to blink events
+  if( CCamFlashStatus* flashStatus = iController.FlashStatus() )
+    {
+    flashStatus->Subscribe( this );
+    iFlashIconVisible = flashStatus->FlashIconVisible();
+    PRINT( _L("Camera :: CCamStillPreCaptureContainer::InitFlashIconL - Flash events subscribed") )
+    }
+  else
+    {
+    iFlashIconVisible = EFalse;
+    }
+  }
+
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::LayoutFlashIcon
+//
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::LayoutFlashIcon()
+  {
+  // Set rectangle
+    TRect rect;
+    AknLayoutUtils::LayoutMetricsRect( AknLayoutUtils::EScreen, rect );
+    TInt cba =  AknLayoutUtils::CbaLocation() ==
+                AknLayoutUtils::EAknCbaLocationLeft;
+    TAknLayoutRect parent;
+    parent.LayoutRect( rect, AknLayoutScalable_Apps::cam6_mode_pane( cba ) );
+    TAknLayoutRect l;
+    l.LayoutRect( parent.Rect(),
+                  AknLayoutScalable_Apps::main_camera4_pane_g3( 1 ) );
+    iFlashIconRect = l.Rect();
+    if( iFlashBitmap )
+      {
+      AknIconUtils::SetSize( iFlashBitmap, iFlashIconRect.Size() );
+      }
+  }
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::DrawFlashIcon
+//
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::DrawFlashIcon( CBitmapContext& aGc ) const
+  {
+  if( iFlashBitmap )
+    {
+    // aGc.DrawBitmap( iFlashIconRect, iFlashBitmap );
+    aGc.BitBltMasked( iFlashIconRect.iTl, iFlashBitmap, iFlashIconRect.Size(), iFlashBitmapMask, ETrue );
+    }
+  }
+
+// ---------------------------------------------------------------------------
+// SubscribeFlashEvents
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::SubscribeFlashEvents( TBool aSubscribe )
+  {
+  if( CCamFlashStatus* flashStatus = iController.FlashStatus() )
+    {
+    if( aSubscribe )
+      {
+      // Re-subscribe when going to foreground
+      // Duplicate subscription is acceptable since only one observer can subscribe to
+      // flash related events.
+      flashStatus->Subscribe( this );
+      iFlashIconVisible = flashStatus->FlashIconVisible();
+      PRINT( _L("Camera :: CCamStillPreCaptureContainer::SubscribeFlashEvents - Flash events subscribed") )
+      }
+    else
+      {
+      // Un-subscribe when going to background
+      flashStatus->Subscribe( NULL );
+      iFlashIconVisible = EFalse;
+      PRINT( _L("Camera :: CCamStillPreCaptureContainer::SubscribeFlashEvents - Flash events unsubscribed") )
+      }
+    }
+  }
+
+// ---------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::MakeVisible
+//
+// Used to subscribe / unsubscribe from flash events when the control is
+// activated / deactivated (standby mode is enabled)
+// ---------------------------------------------------------------------------
+//
+void CCamStillPreCaptureContainer::MakeVisible( TBool aVisible )
+  {
+  PRINT1( _L("Camera => CCamPreCaptureContainerBase::MakeVisible %d"), aVisible )
+  if ( iXenonFlashSupported )
+      {
+      // Subscribe / unsubscribe from flash related events
+      // When going to background -> unsubscribe
+      // Otherwise -> subscribe
+      SubscribeFlashEvents( aVisible );
+
+      }
+  CCamPreCaptureContainerBase::MakeVisible( aVisible );
+  PRINT( _L("Camera <= CCamPreCaptureContainerBase::MakeVisible") )
+  }
+
+
+// -----------------------------------------------------------------------------
+// CCamStillPreCaptureContainer::InitVfGridL
+// -----------------------------------------------------------------------------
+// 
+void 
+CCamStillPreCaptureContainer::InitVfGridL( const TRect& /*aRect*/ )
+  {
+  PRINT( _L("Camera => CCamStillPreCaptureContainer::InitVfGridL") );  
+  iVfGridRect = ViewFinderFrameRect(ECamControllerImage);
+
+  // No vf grid in secondary camera.
+  if( ECamActiveCameraSecondary != iController.ActiveCamera() )
+    {
+    // Create grid drawer if not done yet
+    if( !iVfGridDrawer )
+      {
+      iVfGridDrawer = CCamVfGridFactory::CreateVfGridDrawerL( KGridDrawerUid );
+      }
+    ResetVFGridVisibility();
+  
+    PRINT( _L("Camera <> CCamStillPreCaptureContainer: Setting vf grid lines..") );  
+    
+    // Setting the lines for grid is specific operation
+    // for CCamLineVfGridDrawer class not defined in MCamVfGridDrawer interface.
+    CCamLineVfGridDrawer* ptr = static_cast<CCamLineVfGridDrawer*>( iVfGridDrawer );
+    ptr->SetLinesL  ( iVfGridRect, KGridHrzLines, KGridVrtLines, EFalse );
+    ptr->SetPenStyle( KGridStyle ); 
+    ptr->SetPenSize ( TSize( KGridThickness, KGridThickness ) );
+    ptr->SetPenColor( KGridColor );
+    }
+  else
+    {
+    PRINT( _L("Camera <> CCamStillPreCaptureContainer: Secondary cam active, no vf grid") );  
+    }
+  PRINT( _L("Camera <= CCamStillPreCaptureContainer::InitVfGridL") );  
+  }
+// End of File