camerauis/cameraapp/generic/src/CamRecordingIconDecoration.cpp
branchRCL_3
changeset 54 bac7acad7cb3
parent 0 1ddebce53859
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/camerauis/cameraapp/generic/src/CamRecordingIconDecoration.cpp	Wed Sep 01 12:30:54 2010 +0100
@@ -0,0 +1,279 @@
+/*
+* Copyright (c) 2007 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:  Camera UI recording icon decoration*
+*/
+
+
+
+#include <AknIconUtils.h>
+#include <fbs.h>
+
+#include <cameraapp.mbg>
+
+#include "CamRecordingIconDecoration.h"
+#include "CamObserverHandler.h"
+#include "Cam.hrh"
+#include "CamUtility.h"
+#include "CamAppController.h"
+#include "CamPanic.h"
+
+const TInt KCamVidPauseFlashInterval = 800000;
+
+// -----------------------------------------------------------------------------
+// CCamRecordingIconDecoration::CCamRecordingIconDecoration()
+// Default constructor
+// -----------------------------------------------------------------------------
+//
+CCamRecordingIconDecoration
+::CCamRecordingIconDecoration( CCamAppController& aController )
+  : iController( aController )
+  {
+  }
+
+// -----------------------------------------------------------------------------
+// CCamRecordingIconDecoration::NewL
+// Factory method to safely create a new instance
+// -----------------------------------------------------------------------------
+//
+CCamRecordingIconDecoration* 
+CCamRecordingIconDecoration::NewL( const TRect& aPosition, 
+                                   CCamAppController& aController)
+  {
+  CCamRecordingIconDecoration* me = 
+      new (ELeave) CCamRecordingIconDecoration( aController );
+
+  CleanupStack::PushL( me );
+  me->ConstructL( aPosition );
+  CleanupStack::Pop( me );
+
+  return me;
+  }
+
+// -----------------------------------------------------------------------------
+// CCamRecordingIconDecoration::ConstructL
+// Initializes a new instance
+// -----------------------------------------------------------------------------
+//
+void 
+CCamRecordingIconDecoration::ConstructL( const TRect& aPosition )
+  {
+  iPosition = aPosition.iTl;
+  iSize = TRect( TPoint(0,0), aPosition.Size() );
+  
+  iObserverHandler = CCamObserverHandler::NewL();
+  
+  iPauseFlashPeriodic = CPeriodic::NewL( CActive::EPriorityStandard );
+
+  // Register as a controller observer    
+  iController.AddControllerObserverL(this);
+  
+  // Load in the icons
+  TFileName resFileName;
+  CamUtility::ResourceFileName( resFileName );
+  TPtrC resname = resFileName;
+  
+  AknIconUtils::CreateIconL( iRecBitmap, 
+                             iRecBitmapMask, 
+                             resname, 
+                             EMbmCameraappQgn_indi_vid4_record, 
+                             EMbmCameraappQgn_indi_vid4_record_mask );
+  AknIconUtils::SetSize( iRecBitmap, aPosition.Size() );
+
+  AknIconUtils::CreateIconL( iRecPauseBitmap, 
+                             iRecPauseBitmapMask, 
+                             resname, 
+                             EMbmCameraappQgn_indi_vid4_pause, 
+                             EMbmCameraappQgn_indi_vid4_pause_mask );
+  AknIconUtils::SetSize( iRecPauseBitmap, aPosition.Size() );
+  
+  // Set iRecordState to the correct value
+  switch( iController.CurrentVideoOperation() )
+    {
+    case ECamCapturing:
+        iRecordState = ECamRecording;
+        break;
+    case ECamPaused:
+        iRecordState = ECamRecordPaused;
+        break;
+    default:
+        iRecordState = ECamNotRecording;
+        break;
+    }
+  }
+
+// -----------------------------------------------------------------------------
+// CCamRecordingIconDecoration::~CCamRecordingIconDecoration()
+// Destructor
+// -----------------------------------------------------------------------------
+//
+CCamRecordingIconDecoration::~CCamRecordingIconDecoration()
+  {
+  PRINT( _L("Camera => ~CCamRecordingIconDecoration") );
+  iController.RemoveControllerObserver(this);
+  
+  delete iObserverHandler;
+  
+  if( iPauseFlashPeriodic )
+    {
+    iPauseFlashPeriodic->Cancel();
+    }
+  delete iPauseFlashPeriodic;
+  
+  delete iRecBitmap;
+  delete iRecBitmapMask;
+  delete iRecPauseBitmap;
+  delete iRecPauseBitmapMask;
+  PRINT( _L("Camera <= ~CCamRecordingIconDecoration") );
+  }
+    
+// -----------------------------------------------------------------------------
+// CCamRecordingIconDecoration::Draw()
+// Draw the decoration
+// -----------------------------------------------------------------------------
+//
+void CCamRecordingIconDecoration::Draw(CBitmapContext& aGc, const TRect& /*aDrawRect*/)
+    {
+    if ( iRecordState == ECamRecording )
+        {
+		aGc.BitBltMasked(iPosition, iRecBitmap, iSize, iRecBitmapMask, ETrue);
+        }
+    else if ( iRecordState == ECamRecordPaused )
+        {
+        if( iShowPaused )
+            {
+    		aGc.BitBltMasked(iPosition, iRecPauseBitmap, iSize, iRecPauseBitmapMask, ETrue);
+            }
+        }
+    else
+        {
+        }
+    }
+
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::HandleControllerEventL
+// Listens for controller events
+// ---------------------------------------------------------
+//
+void 
+CCamRecordingIconDecoration
+::HandleControllerEventL( TCamControllerEvent aEvent, TInt /*aError*/ )
+  {
+  if( aEvent == ECamEventOperationStateChanged )
+    {
+    TCamCaptureOperation operation = iController.CurrentOperation();
+    
+    // Update based on new controller state
+    if( ECamCapturing == operation )
+      {
+      ChangeRecordState(ECamRecording);
+      }
+    else if( ECamPaused == operation )
+      {
+      ChangeRecordState(ECamRecordPaused);
+      iShowPaused = ETrue;
+
+      // Kick off the pause flash timer
+      if( !iPauseFlashPeriodic->IsActive() )
+        {
+        TCallBack cb( PauseFlashCallBack, this );
+        iPauseFlashPeriodic->Start( KCamVidPauseFlashInterval,
+                                    KCamVidPauseFlashInterval,
+                                    cb );
+        }
+      }
+    else
+      {
+      ChangeRecordState( ECamNotRecording );
+      }
+  
+    // Cancel the timer if need be
+    if( iRecordState != ECamRecordPaused )         
+      {
+      if( iPauseFlashPeriodic->IsActive() )
+        {
+        iPauseFlashPeriodic->Cancel();
+        }
+      }
+    }
+  }
+
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::ChangeRecordState
+// Changes iRecordState, tells observers to update
+// ---------------------------------------------------------
+//
+void CCamRecordingIconDecoration::ChangeRecordState(TCamRecordState aNewState)
+    {
+    if ( iRecordState != aNewState )
+        {
+        BroadcastEvent(ECamObserverEventRecordingIconUpdated);
+        }
+    iRecordState = aNewState;
+    }
+    
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::PauseFlashCallBack
+// Callback function from periodic timer used to flash paused icon every 0.8 secs
+// ---------------------------------------------------------
+//
+TInt CCamRecordingIconDecoration::PauseFlashCallBack( TAny* aRecordingIconDecoration )
+    {
+    __ASSERT_DEBUG( aRecordingIconDecoration, CamPanic( ECamPanicNullPointer ) );
+    static_cast <CCamRecordingIconDecoration*> ( aRecordingIconDecoration )->
+                                                    TogglePauseIconFlash();
+    return KErrNone;
+    }
+
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::TogglePauseIconFlash
+// Updates paused icon state in response to periodic timer 
+// ---------------------------------------------------------
+//
+void CCamRecordingIconDecoration::TogglePauseIconFlash()
+    {
+    PRINT(_L("CCamRecordingIconDecoration::TogglePauseIconFlash: broadcasting ECamObserverEventRecordingIconUpdated"));
+    iShowPaused = !iShowPaused;
+    BroadcastEvent(ECamObserverEventRecordingIconUpdated);
+    }
+
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::RegisterObserverL
+// Registers an observer
+// ---------------------------------------------------------
+//
+void CCamRecordingIconDecoration::RegisterObserverL(MCamObserver* aObserver)
+    {
+    iObserverHandler->RegisterObserverL(aObserver);
+    }
+
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::DeregisterObserver
+// Deregisters an observer
+// ---------------------------------------------------------
+//
+void CCamRecordingIconDecoration::DeregisterObserver(MCamObserver* aObserver)
+    {
+    iObserverHandler->DeregisterObserver(aObserver);
+    }
+
+// ---------------------------------------------------------
+// CCamRecordingIconDecoration::BroadcastEvent
+// Broadcasts an event code to all observers
+// ---------------------------------------------------------
+//
+void CCamRecordingIconDecoration::BroadcastEvent(TCamObserverEvent aEvent)
+    {
+    iObserverHandler->BroadcastEvent(aEvent);
+    }
+