AppSrc/ImagicAppUi.cpp
changeset 3 93fff7023be8
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/AppSrc/ImagicAppUi.cpp	Fri Oct 15 10:18:29 2010 +0900
@@ -0,0 +1,702 @@
+/*
+* Copyright (c) 2009 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: Juha Kauppinen, Mika Hokkanen
+* 
+* Description: Photo Browser
+*
+*/
+ 
+
+// INCLUDE FILES
+#include "ImagicAppUi.h"
+#include <IEImage.h>
+#include "ImagicViewBrowser.h"
+#include "Imagic.hrh"
+#include "MSVSTD.HRH"
+#include <avkon.hrh>
+#include <ImageConversion.h>
+#include <aknutils.h>
+#include "ImagicContainerBrowser.h"
+
+//statuspane
+#include <eikbtgpc.h> 
+#include <avkon.rsg>
+
+//for loading text from resource
+#include <aknnotewrappers.h>
+#include <stringloader.h>
+
+#include <PhotoBrowser.rsg>
+#include "ImagicUtils.h"
+
+
+
+
+// ================= MEMBER FUNCTIONS =======================
+//
+// ----------------------------------------------------------
+// CImagicAppUi::ConstructL()
+// ----------------------------------------------------------
+//
+void CImagicAppUi::ConstructL()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::ConstructL++"));
+    
+    //CArrayFix<TCoeHelpContext>* buf = CCoeAppUi::AppHelpContextL();
+    //HlpLauncher::LaunchHelpApplicationL(iEikonEnv->WsSession(), buf);
+
+    
+    iTNGenerationOnGoing = ETrue;
+    iMenuOn = EFalse;
+    iAppForeGround = ETrue;
+    
+    //Set the font
+    //SetFont();
+    
+    iImagesLoaded = EFalse;
+    iImageIndex = 0;     
+    iWzContainerSatus = EFalse;
+    //iTotalNumOfImages = 0;
+    //iNumOfImagesLoaded = 0;
+    //iNumOfFacesLoaded = 0;
+    iNumberOfIterations = 0;
+    iUIDrawMode = EImages;
+    iBrowserContainer = NULL;
+#ifdef USE_OOM    
+    ROomMonitorSession oomMonitor;
+    oomMonitor.Connect();
+    TInt errorCode = oomMonitor.RequestFreeMemory( 1024*12 );
+    
+    if ( errorCode != KErrNone )
+        {
+        // try one more time 
+        errorCode = oomMonitor.RequestFreeMemory( 1024*12 );
+        }
+    oomMonitor.Close();
+#endif    
+    User::LeaveIfError(iFileServer.Connect());
+    
+    //Initialises this app UI with standard values.
+    //The application’s standard resource file will be read unless
+    //the ENoAppResourceFile or ENonStandardResourceFile flags are passed.
+    BaseConstructL(0x08 | EAknEnableSkin); // Use ELayoutAwareAppFlag (0x08) to make the application support scalable UI on FP3 devices.
+
+    //Create engine and trap if there is error
+    iIEngine = CIEEngine::NewL(*this);
+	CleanupStack::PushL(iIEngine);
+    
+    //Browser view
+    CImagicViewBrowser* viewBrowser = new (ELeave) CImagicViewBrowser;
+    CleanupStack::PushL( viewBrowser );
+    viewBrowser->ConstructL(this);
+    AddViewL( viewBrowser );      // transfer ownership to CAknViewAppUi
+    CleanupStack::Pop( viewBrowser );
+    iViewIdBrowser = viewBrowser->Id(); // view id to get view from CAknViewAppUi
+    
+    SetDefaultViewL( *viewBrowser );
+    SetActiveView(BrowserView);
+    
+    //disable statuspane to get full screen
+    StatusPane()->MakeVisible(EFalse);
+    
+    //Creating Utility class
+    iImagicUtils = CImagicUtils::NewL(iFileServer);
+    
+    //Create timer to release Browser view resources and init opengl
+    iPeriodic = CPeriodic::NewL( CActive::EPriorityIdle );
+    
+    //Force orientation to be always landscape
+    SetOrientationL(CAknAppUiBase::EAppUiOrientationLandscape);
+    //SetOrientationL(CAknAppUiBase::EAppUiOrientationPortrait);
+
+	CleanupStack::Pop(iIEngine);	
+
+    DP0_IMAGIC(_L("CImagicAppUi::ConstructL--"));
+    }
+
+
+CArrayFix<TCoeHelpContext>* CImagicAppUi::HelpContextL() const
+    {
+    /*
+    //#warning "Please see comment about help and UID3..."
+    CArrayFixFlat<TCoeHelpContext>* array = new(ELeave)CArrayFixFlat<TCoeHelpContext>(1);
+    CleanupStack::PushL(array);
+    array->AppendL(TCoeHelpContext(KUidrsdApp, KGeneral_Information));
+    CleanupStack::Pop(array);
+    return array;
+    */
+    }
+
+void CImagicAppUi::CImagicAppUiReady()
+    {
+    iIEngine->AppUIReady();
+    }
+
+// ----------------------------------------------------
+// CImagicAppUi::~CImagicAppUi()
+// Destructor
+// Frees reserved resources
+// ----------------------------------------------------
+//
+CImagicAppUi::~CImagicAppUi()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::~CImagicAppUi++"));
+    if(iImagicUtils)
+        {
+        delete iImagicUtils;
+        iImagicUtils = NULL;
+        }
+    
+    iWizardBitmapArray.Close();
+    
+    if(iPeriodic->IsActive())
+        iPeriodic->Cancel();
+    delete iPeriodic;
+
+    // Doesn't delete engine yet, since container needs it when destroyed!
+    //DestructEngine();
+    
+    iFileServer.Close();
+
+    DP0_IMAGIC(_L("CImagicAppUi::~CImagicAppUi--"));
+    }
+
+void CImagicAppUi::DestructEngine()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::DestructEngine++"));    
+    delete iIEngine;
+    iIEngine = NULL;
+    DP0_IMAGIC(_L("CImagicAppUi::DestructEngine--"));    
+    }
+
+
+/*TInt CImagicAppUi::GetErrorCode()
+    {
+    return iEngineCreationError;
+    }*/
+  
+// ------------------------------------------------------------------------------
+// CImagicAppUi::DynInitMenuPaneL(TInt aResourceId,CEikMenuPane* aMenuPane)
+//  This function is called by the EIKON framework just before it displays
+//  a menu pane. Its default implementation is empty, and by overriding it,
+//  the application can set the state of menu items dynamically according
+//  to the state of application data.
+// ------------------------------------------------------------------------------
+//
+void CImagicAppUi::DynInitMenuPaneL(
+    TInt /*aResourceId*/,CEikMenuPane* /*aMenuPane*/)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::DynInitMenuPaneL"));
+    }
+
+
+void CImagicAppUi::BrowserContainerInitialized()
+    {
+    if(((CImagicViewBrowser*) View(iViewIdBrowser))->GetContainer() != NULL)
+        {
+        iBrowserContainer = ((CImagicViewBrowser*) View(iViewIdBrowser))->GetContainer();
+        iBrowserContainer->ImageListChanged(0, EFalse); // TODO: cheap trick to update coords
+        }
+    }
+
+
+// ------------------------------------------------------------------------------
+// CImagicAppUi::HandleForegroundEventL(TBool aForeground)
+//  This function is called by the  framework when the screen loses or gains focus.
+//   i.e. when it goes to the background or to the foreground. Incoming call
+//   softnote is an example.
+// This event applies to the entire application, all views.
+// ------------------------------------------------------------------------------
+//
+void CImagicAppUi::HandleForegroundEventL(TBool aForeground)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::HandleForegroundEventL++"));
+    
+    //SetOrientationL(CAknAppUiBase::EAppUiOrientationPortrait);
+    if(iBrowserContainer)
+        if (aForeground)
+            {
+            DP0_IMAGIC(_L("CImagicAppUi::HandleForegroundEventL - App Foreground"));
+            
+            //We were switched to foreground
+            iAppForeGround = ETrue;
+            //ScreenImmeadetaUpdate();
+            
+            if(iPeriodic->IsActive())
+                iPeriodic->Cancel();
+            
+            iIEngine->StartAccSensorMonitoring();
+            
+            iBrowserContainer->SetDeleteTextures(EFalse);
+            
+            iAppActiveState = ETrue;
+            
+            if(iViewNro == BrowserView)
+                {
+                if(iBrowserContainer && !iBrowserContainer->IsOpenGLInit())
+                    {
+                    iBrowserContainer->InitAfterPowerSaveL();
+                    }
+                else
+                    {
+                    if(iBrowserContainer)
+                        iBrowserContainer->EnableDisplayDraw();
+                    }
+                }
+            
+            if(iBrowserContainer)
+                {
+                iBrowserContainer->DrawNow();
+                iBrowserContainer->EnableDisplayDraw();
+                }
+            }
+        else
+            {//We were switched to background
+            DP0_IMAGIC(_L("CImagicAppUi::HandleForegroundEventL - App Background"));
+            
+            iAppForeGround = EFalse;
+            //ScreenImmeadetaUpdate();
+            
+            if(iViewNro == BrowserView)
+                {
+                //... disable frame loop timer ...
+                //iBrowserContainer->DisableDisplayDraw();
+                        
+                //... start a timer for 3 seconds to call to a power save callback ...
+                iPeriodic->Start( 3000000, 1000000000, TCallBack( CImagicAppUi::TimerCallBack, this ) );
+                //iBrowserContainer = ((CImagicViewBrowser*) View(iViewIdBrowser))->GetContainer();
+                }
+            
+            //iIEngine->StopAccSensorMonitoring();
+            
+            iAppActiveState = EFalse;
+            if(iBrowserContainer)
+                {
+                iBrowserContainer->DrawNow();
+                iBrowserContainer->DisableDisplayDraw();
+                }
+            }
+            
+    DP0_IMAGIC(_L("CImagicAppUi::HandleForegroundEventL--"));
+    }
+
+//Power save timer callback function
+//Cleans memory allocations for openGl draving
+TInt CImagicAppUi::TimerCallBack(TAny* aInstance)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::TimerCallBack++"));
+    
+    CImagicAppUi* instance = (CImagicAppUi*) aInstance;
+    
+    instance->iIEngine->StopAccSensorMonitoring();
+    
+    if(instance->iViewNro == BrowserView)
+        {
+        if(instance->iBrowserContainer && instance->iBrowserContainer->IsOpenGLInit())
+            {
+            DP0_IMAGIC(_L("CImagicAppUi::TimerCallBack - DeleteTextures"));
+            //instance->iBrowserContainer->DeleteTextures();
+            instance->iBrowserContainer->SetDeleteTextures(ETrue);
+            }
+        }
+    
+    DP0_IMAGIC(_L("CImagicAppUi::TimerCallBack--"));
+    return 0;
+    }
+
+void  CImagicAppUi::SetTNGenerationFlag(TBool aValue)
+    {
+    iTNGenerationOnGoing = aValue;
+    }
+
+// ----------------------------------------------------
+// CImagicAppUi::HandleKeyEventL(
+//     const TKeyEvent& aKeyEvent,TEventCode /*aType*/)
+// Here we handle key events: Right and left arrow key
+//   to change view.
+// ----------------------------------------------------
+//
+TKeyResponse CImagicAppUi::HandleKeyEventL(const TKeyEvent& /*aKeyEvent*/, TEventCode /*aType*/)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::HandleKeyEventL"));
+    //No need to handle events here
+    return EKeyWasNotConsumed;
+    }
+
+// ----------------------------------------------------
+// CImagicAppUi::HandleCommandL(TInt aCommand)
+// Here we handle commands on the application level.
+// In addition, each view has their own HandleCommandL()
+// ----------------------------------------------------
+//
+void CImagicAppUi::HandleCommandL(TInt aCommand)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::HandleCommandL"));
+    
+    switch ( aCommand )
+        {
+        case EEikCmdExit:
+            {
+            iIEngine->Stop();
+            
+            // send to background
+            TApaTask apaTask( CEikonEnv::Static()->WsSession() );
+            apaTask.SetWgId( iCoeEnv->RootWin().Identifier() );
+            apaTask.SendToBackground();
+
+            // Wait until engine is stopped
+            while (iIEngine->IsRunning())
+                {
+                User::After(200000);   // 200ms
+                }
+            DP0_IMAGIC(_L("CImagicAppUi::HandleCommandL end wait"));
+			if(iTNGenerationOnGoing)
+				{
+				TInt i = KErrNone;
+	            //iIEngine->StopFaceDetection(i);
+    	        iIEngine->StopTNGeneration(i);
+				}
+                
+            Exit();
+            break;
+            }
+            
+        case EImagicCmdViewCmd1:
+            {
+			break;
+            }
+        // You can add your all application applying commands here.
+        // You would handle here menu commands that are valid for all views.
+        }
+    
+    }
+
+TInt CImagicAppUi::ExitTimerCallBack(TAny* aInstance)
+    {
+    CImagicAppUi* instance = (CImagicAppUi*) aInstance;
+    instance->iNumberOfIterations++;
+    if(instance->iTNGenerationOnGoing)
+        {
+        if(instance->iNumberOfIterations == 10)
+            {
+            instance->iNumberOfIterations = 0;
+            instance->iPeriodic->Cancel();
+            //instance->CancelExitDialog();
+            instance->iImagicUtils->CancelWaitDialog();
+            User::Exit(KErrNone);
+            }
+        else
+            {
+            //nothing.. continue...
+            }
+        }
+    else
+        {
+        instance->iPeriodic->Cancel();
+        //instance->CancelExitDialog();
+        instance->iImagicUtils->CancelWaitDialog();
+        
+        User::Exit(KErrNone);
+        }
+        
+    return 0;
+    }
+
+// -----------------------------------------------------------------------------
+// CImagicAppUi::HandleResourceChangeL( TInt aType )
+// Called by framework when layout is changed.
+// -----------------------------------------------------------------------------
+//
+void CImagicAppUi::HandleResourceChangeL( TInt aType )
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::HandleResourceChangeL"));
+    
+    //on = aType = 268457666, off = aType = 268457667     
+    
+    if(iBrowserContainer != NULL)
+        {
+        if(aType == 268457666)
+            {
+            iMenuOn = ETrue;
+            //ScreenImmeadetaUpdate();
+            if(iBrowserContainer)
+                {
+                iBrowserContainer->SetScreenImmeadetaUpdate(ETrue);
+                iBrowserContainer->DisableDisplayDraw();
+                }
+            }
+        else if(aType == 268457667)
+            {
+            iMenuOn = EFalse;
+            //ScreenImmeadetaUpdate();
+            
+            if(iBrowserContainer)
+                {
+                iBrowserContainer->SetScreenImmeadetaUpdate(EFalse);
+                iBrowserContainer->EnableDisplayDraw();    
+                }
+            
+            }
+        
+        iBrowserContainer->DrawNow();
+        }
+    
+    CAknAppUi::HandleResourceChangeL( aType );
+    
+    // ADDED FOR SCALABLE UI SUPPORT
+    // *****************************
+    if ( aType==KEikDynamicLayoutVariantSwitch )
+        {
+		((CImagicViewBrowser*) View( iViewIdBrowser) )->HandleClientRectChange(  );
+		}
+    
+    }
+
+TBool CImagicAppUi::IsAppOnTop()
+    {
+    if(iMenuOn)
+        {
+        DP0_IMAGIC(_L("CImagicAppUi::IsAppOnTop: EFalse"));
+        return EFalse;
+        }
+    else if(!iAppForeGround)
+        {
+        DP0_IMAGIC(_L("CImagicAppUi::IsAppOnTop: EFalse"));
+        return EFalse;
+        }
+    else
+        {
+        DP0_IMAGIC(_L("CImagicAppUi::IsAppOnTop: ETrue"));
+        return ETrue;
+        }
+    }
+
+void CImagicAppUi::ScreenImmeadetaUpdate()
+    {
+    if(iMenuOn || !iAppForeGround)
+        iBrowserContainer->SetScreenImmeadetaUpdate(ETrue);
+    else
+        iBrowserContainer->SetScreenImmeadetaUpdate(EFalse);
+    }
+
+
+void CImagicAppUi::SetImageIndex(TInt aIndex)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::SetImageIndex"));
+    
+    if(aIndex >= iIEngine->GetTotalNumOfImages())
+        aIndex = 0;
+    if(aIndex < 0)
+        aIndex = iIEngine->GetTotalNumOfImages()-1;
+    
+    iImageIndex = aIndex;
+    }
+
+TInt CImagicAppUi::GetImageIndex()
+	{
+	DP0_IMAGIC(_L("CImagicAppUi::GetImageIndex"));
+	return iImageIndex;
+	}
+
+#ifdef _ACCELEROMETER_SUPPORTED_
+void CImagicAppUi::ImageRotated(TImagicDeviceOrientation aDeviceOrientation)
+    {
+    DP1_IMAGIC(_L("CImagicAppUi::ImageRotated, angle: %d"),aDeviceOrientation);
+    iBrowserContainer->PhoneRotated(aDeviceOrientation);
+    }
+#endif
+
+void CImagicAppUi::SetActiveView(TUid aViewNro)
+	{
+	DP0_IMAGIC(_L("CImagicAppUi::SetActiveView"));
+	iViewNro = aViewNro;
+	}
+
+TUid CImagicAppUi::GetActiveView()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::GetActiveView"));
+    return iViewNro;
+    }
+
+
+//Callback from engine that loaded Bitmap image is ready for drawing
+void CImagicAppUi::ImagesLoadedL(TInt aError)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::ImagesLoaded++"));
+    
+    if(iViewNro == BrowserView)
+        {
+        ((CImagicViewBrowser*) View(iViewIdBrowser))->BitmapLoadedByEngineL(aError);
+        }
+    
+    DP0_IMAGIC(_L("CImagicAppUi::ImagesLoaded--"));
+    }
+
+
+//To get engine interface for other class usage
+CIEEngine* CImagicAppUi::GetEngine()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::GetEngine"));
+    
+    return iIEngine;
+    }
+
+
+void CImagicAppUi::SetUIDrawMode(TImageArrayMode aMode)
+    {
+    iUIDrawMode = aMode;
+    }
+
+/*
+TImageArrayMode CImagicAppUi::GetUIDrawMode()
+    {
+    return iUIDrawMode;
+    }
+
+TRgb CImagicAppUi::GetTransparentWhite()
+    {
+    return iTransparentWhite;
+    }
+
+TRgb CImagicAppUi::GetTransparentBlack()
+    {
+    return iTransparentBlack;
+    }
+
+const CFont* CImagicAppUi::GetFont()
+    {
+    return iFont;
+    }
+*/
+
+CImagicUtils* CImagicAppUi::GetImagicUtils()
+    {
+    return iImagicUtils;
+    }
+
+
+/*void CImagicAppUi::SetFont()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::SetFont"));
+    
+    // set the font
+    iFont = AknLayoutUtils::FontFromId(EAknLogicalFontPrimaryFont);
+    //Set alpha colors
+    iTransparentWhite=TRgb(KRgbWhite);
+    iTransparentWhite.SetAlpha(128);
+    iTransparentBlack=TRgb(KRgbBlack);
+    iTransparentBlack.SetAlpha(128+64);
+    }*/
+
+
+void CImagicAppUi::ImageListChanged(TInt aIndex, TBool aAdded)
+    {
+    DP2_IMAGIC(_L("CImagicAppUi::ImageListChanged %d %d"), aIndex, aAdded);
+    if (iBrowserContainer)
+        iBrowserContainer->ImageListChanged(aIndex, aAdded);
+    }
+
+//This is called when single face Detection has been completed
+void CImagicAppUi::SingleFaceDetectionComplete()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::SingleFaceDetectionComplete"));
+    
+    //((CImagicViewBrowser*) View(iViewIdBrowser))->SingleFaceDetectionComplete();
+    }
+
+//Callback function from engine that BackGround Face Detection has been completed
+void CImagicAppUi::FaceDetectionComplete()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::FaceDetectionComplete"));
+    
+    ((CImagicViewBrowser*) View(iViewIdBrowser))->FaceDetectionComplete();
+    }
+
+//Callback function from engine that Face Browsing creation has been completed
+
+void CImagicAppUi::SingleTNCreationCompletedL(TInt /*aIndex*/, TThumbSize aTnRes)
+    {
+    DP1_IMAGIC(_L("CImagicAppUi::SingleTNCreationCompletedL - res: %d"),aTnRes);
+    
+    iBrowserContainer->NewImageAdded();
+    iBrowserContainer->SetLoadingOn(ETrue);
+    //iBrowserContainer->DrawScreen();
+    iBrowserContainer->DrawNow();
+    }
+
+//Callback function from engine that TN creation has been completed
+void CImagicAppUi::TNCreationCompleteL(TThumbSize aTnRes)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::TNCreationComplete++"));
+    
+    iTNGenerationOnGoing = EFalse; 
+    ((CImagicViewBrowser*) View(iViewIdBrowser))->TNCreationComplete();
+    
+    iBrowserContainer->DrawNow();
+    
+            
+    /*TApplicationFeature appFeature = ((CImagicViewBrowser*)View(iViewIdBrowser))->GetAppFeature(); 
+    
+    //This is in case we were editing and we did not have 320x320 tn created
+    if(appFeature == EAppFeatureEditing && aTnRes == ESize32x32)
+        {
+        iTNGenerationOnGoing = EFalse; 
+        ((CImagicViewBrowser*) View(iViewIdBrowser))->TNCreationComplete();
+        }
+    
+    else if(appFeature == EAppFeatureNone )
+        {
+        iTNGenerationOnGoing = EFalse; 
+        ((CImagicViewBrowser*) View(iViewIdBrowser))->TNCreationComplete();
+        }
+    
+    else if((appFeature == EAppFeatureEditing || appFeature == EAppFeatureCropping) &&  (aTnRes == ESize512x512 || aTnRes == ENotDefined))
+        {
+        iTNGenerationOnGoing = EFalse;
+        ((CImagicViewBrowser*) View(iViewIdBrowser))->TNCreationComplete();
+        
+        }*/
+    DP0_IMAGIC(_L("CImagicAppUi::TNCreationComplete--"));
+    }
+
+
+TInt CImagicAppUi::DeleteImage(TInt aIndex)
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::DeleteImage++"));
+    
+    TInt err = iIEngine->DeleteFile(aIndex);
+    
+    DP0_IMAGIC(_L("CImagicAppUi::DeleteImage--"));
+    
+    return err;
+    }
+
+void CImagicAppUi::AllFilesScanned()
+    {
+    DP0_IMAGIC(_L("CImagicAppUi::AllFilesScanned++"));
+    
+    if(iIEngine->GetTotalNumOfImages() <= 0)
+        GetImagicUtils()->ExecuteQueryDialog(0/*GetErrorCode()*/, R_NO_IMAGES_DIALOG);
+    
+    iBrowserContainer->DrawNow();
+    
+    DP0_IMAGIC(_L("CImagicAppUi::AllFilesScanned--"));
+    }
+
+TInt CImagicAppUi::GetGleMaxRes()
+    {
+    return iBrowserContainer->GetGleMaxRes();
+    }
+
+
+
+// End of File