camerauis/cameraxui/cxui/src/main.cpp
changeset 43 0e652f8f1fbd
parent 28 3075d9b614e6
child 45 24fd82631616
--- a/camerauis/cameraxui/cxui/src/main.cpp	Thu May 13 21:30:19 2010 +0300
+++ b/camerauis/cameraxui/cxui/src/main.cpp	Thu Jul 15 01:55:05 2010 +0300
@@ -1,5 +1,5 @@
 /*
-* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
+* Copyright (c) 2009-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"
@@ -15,34 +15,39 @@
 *
 */
 
-#include <coemain.h>
-#include <eikenv.h>
 #include <QApplication>
 #include <QGraphicsProxyWidget>
 // needed for localization
-#include <QTranslator>
 #include <QLocale>
+#include <HbTranslator>
 #include <hbmainwindow.h>
-#include <xqserviceutil.h>
+
+#ifdef Q_OS_SYMBIAN
+#include <coemain.h>
+#include <eikenv.h>
+#endif // Q_OS_SYMBIAN
 
 #include "cxeengine.h"
 #include "cxecameradevicecontrol.h"
 #include "cxuiapplication.h"
 #include "cxuiviewmanager.h"
+#include "cxuiapplicationstate.h"
+#include "cxuienums.h"
 #include "cxutils.h"
 #include "cxuiserviceprovider.h"
 
+#ifdef Q_OS_SYMBIAN
 #include "OstTraceDefinitions.h"
 #ifdef OST_TRACE_COMPILER_IN_USE
 #include "mainTraces.h"
-#endif
+#endif // OST_TRACE_COMPILER_IN_USE
+#endif // Q_OS_SYMBIAN
 
 using namespace Cxe;
 
 // CONSTANTS
-const QString TRANSLATIONS_PATH = "z:/resource/qt/translations/";
-const QString TRANSLATIONS_FILE_NAME = "camera_";
-const QString COMMON_TRANSLATIONS_FILE_NAME = "common_";
+const QString TRANSLATIONS_PATH = "/resource/qt/translations/";
+const QString TRANSLATIONS_FILE = "camera";
 
 int main(int argc, char *argv[])
 {
@@ -51,6 +56,11 @@
 
     Q_INIT_RESOURCE(cxui);
 
+    // Use software rendering / raster graphics system to save GPU memory.
+    CX_DEBUG(("CxUI: Take raster graphics system into use.."));
+    QApplication::setGraphicsSystem("raster");
+    CX_DEBUG(("CxUI: ..raster graphics system in use"));
+
     OstTrace0( camerax_performance, DUP1__MAIN, "msg: e_CX_HBAPP_CREATION 1" );
     CxuiApplication app(argc, argv);
     OstTrace0( camerax_performance, DUP2__MAIN, "msg: e_CX_HBAPP_CREATION 0" );
@@ -59,76 +69,97 @@
     // Reserve and power on can then proceed in parallel with
     // ui construction.
     OstTrace0( camerax_performance, DUP7__MAIN, "msg: e_CX_CREATE_ENGINE 1" );
-    CxeEngine *eng = CxeEngine::createEngine();
+    CxeEngine *engine = CxeEngine::createEngine();
     OstTrace0( camerax_performance, DUP8__MAIN, "msg: e_CX_CREATE_ENGINE 0" );
 
-    if (XQServiceUtil::isService()) {
+    if (app.activateReason() == Hb::ActivationReasonService) {
+        CX_DEBUG(("CxUI: Camera started as service"));
         // Embedded mode.  Engine is inited to correct mode
         // by service provider when request arrives
         CX_DEBUG(("CxUI: creating serviceprovider"));
-        CxuiServiceProvider::create(eng);
+        CxuiServiceProvider::create(engine);
         CX_DEBUG(("CxUI: done"));
-    } else {
-        // Normal mode. Init engine now.
-        OstTrace0( camerax_performance, DUP9__MAIN, "msg: e_CX_INIT_ENGINE 1" );
-		 //! @todo temporarily commented as part of a hack to change the startup sequence
-         // to avoid GOOM issues
-        //eng->initMode(Cxe::ImageMode);
-        OstTrace0( camerax_performance, DUP10__MAIN, "msg: e_CX_INIT_ENGINE 0" );
-    }
-
-    // Load the language specific localization files: application + common
-    OstTrace0( camerax_performance, DUP3__MAIN, "msg: e_CX_LOAD_TRANSLATIONS 1" );
-    QTranslator translator;
-    QString lang = QLocale::system().name();
+    } else if (app.activateReason() == Hb::ActivationReasonActivity) {
+        CX_DEBUG(("CxUI: Camera started as activity"));
+        Cxe::CameraMode mode = Cxe::ImageMode;
+        QString activityId = app.activateId();
+        if (activityId == CxuiActivityIds::VIDEO_PRECAPTURE_ACTIVITY ||
+            activityId == CxuiActivityIds::VIDEO_POSTCAPTURE_ACTIVITY) {
+            mode = Cxe::VideoMode;
+        }
 
-    CX_DEBUG(("CxUI: loading translation"));
-    bool ret = false;
-    ret = translator.load(TRANSLATIONS_PATH + TRANSLATIONS_FILE_NAME + lang);
-    CX_DEBUG(("load ok=%d", ret));
-    app.installTranslator( &translator );
+        if (activityId == CxuiActivityIds::STILL_PRECAPTURE_ACTIVITY ||
+            activityId == CxuiActivityIds::VIDEO_PRECAPTURE_ACTIVITY) {
+            // init engine only if going to pre-capture
+            engine->initMode(mode);
+        } else {
+            // in post-capture don't init but set the correct mode to engine
+            // so init can be done later
+            engine->setMode(mode);
+        }
+	} else {
+        CX_DEBUG(("CxUI: Camera started as normal app"));
+	    // normal start
+	    engine->initMode(engine->mode());
+	}
 
-    QTranslator commonTranslator;
-    CX_DEBUG(("CxUI: loading common translation"));
-    ret = false;
-    ret = commonTranslator.load(TRANSLATIONS_PATH + COMMON_TRANSLATIONS_FILE_NAME + lang);
-    CX_DEBUG(("load ok=%d", ret));
-    app.installTranslator(&commonTranslator);
+#ifdef Q_OS_SYMBIAN
+    //!@todo: Yield run time to system to get enough resources released to start camera.
+    CX_DEBUG(("CxUI: yield control for resource freeing.."));
+    User::After(2*1000*1000); // 2s
+    CX_DEBUG(("CxUI: waiting done.."));
+#endif // Q_OS_SYMBIAN
+
+    // Load language specific application localization file, e.g. "camera_en.qm"
+    // Translations need to be loaded before any widgets are created.
+    CX_DEBUG(("CxUI: Load translations.."));
+    OstTrace0( camerax_performance, DUP3__MAIN, "msg: e_CX_LOAD_TRANSLATIONS 1" );
+    HbTranslator translator(TRANSLATIONS_PATH, TRANSLATIONS_FILE);
+    // Load language specific common localization file
+    translator.loadCommon();
     OstTrace0( camerax_performance, DUP4__MAIN, "msg: e_CX_LOAD_TRANSLATIONS 0" );
+    CX_DEBUG(("CxUI: ..translations loaded"));
 
+    // Create main window
     OstTrace0( camerax_performance, DUP5__MAIN, "msg: e_CX_MAINWINDOW_CREATION 1" );
-    HbMainWindow *mainWindow = new HbMainWindow(0, Hb::WindowFlagTransparent |
-                                                   Hb::WindowFlagNoBackground);
-    mainWindow->setAttribute(Qt::WA_NoBackground);
+    HbMainWindow mainWindow(0, Hb::WindowFlagTransparent | Hb::WindowFlagNoBackground);
+    mainWindow.setAttribute(Qt::WA_NoBackground);
     OstTrace0( camerax_performance, DUP6__MAIN, "msg: e_CX_MAINWINDOW_CREATION 0" );
 
-    OstTrace0( camerax_performance, DUP11__MAIN, "msg: e_CX_CREATE_VIEW_MANAGER 1" );
-    CxuiViewManager *viewManager = new CxuiViewManager(app, *mainWindow, *eng);
-    OstTrace0( camerax_performance, DUP12__MAIN, "msg: e_CX_CREATE_VIEW_MANAGER 0" );
-
+    // Set main window to landscape and full screen
     OstTrace0( camerax_performance, DUP13__MAIN, "msg: e_CX_MAINWINDOW_SETORIENTATION 1" );
-    mainWindow->setOrientation(Qt::Horizontal);
+    mainWindow.setOrientation(Qt::Horizontal);
     OstTrace0( camerax_performance, DUP14__MAIN, "msg: e_CX_MAINWINDOW_SETORIENTATION 0" );
+    OstTrace0( camerax_performance, DUP15__MAIN, "msg: e_CX_MAINWINDOW_FULLSCREEN 1" );
 
-    OstTrace0( camerax_performance, DUP15__MAIN, "msg: e_CX_MAINWINDOW_FULLSCREEN 1" );
-    mainWindow->showFullScreen();
+#ifdef Q_OS_SYMBIAN
+    mainWindow.showFullScreen();
+#else
+    /*
+     * todo : check if this is an Orbit bug or if there's a better solution
+    */
+    mainWindow.resize(640, 360);
+    mainWindow.setOrientation(Qt::Vertical, false);
+    mainWindow.show();
+    mainWindow.setOrientation(Qt::Horizontal, false);
+#endif //Q_OS_SYMBIAN
     OstTrace0( camerax_performance, DUP16__MAIN, "msg: e_CX_MAINWINDOW_FULLSCREEN 0" );
 
+    // Create view manager
+    OstTrace0( camerax_performance, DUP11__MAIN, "msg: e_CX_CREATE_VIEW_MANAGER 1" );
+    CxuiViewManager *viewManager = new CxuiViewManager(app, mainWindow, *engine);
+    OstTrace0( camerax_performance, DUP12__MAIN, "msg: e_CX_CREATE_VIEW_MANAGER 0" );
+
+    // Give main window id to engine for setting up viewfinder window behind it
     OstTrace0( camerax_performance, DUP17__MAIN, "msg: e_CX_PREPAREWINDOW 1" );
-    viewManager->prepareWindow();
+    engine->viewfinderControl().setWindow(mainWindow.effectiveWinId());
     OstTrace0( camerax_performance, DUP18__MAIN, "msg: e_CX_PREPAREWINDOW 0" );
-    //! @todo initMode call added here as a temporary hack to change the startup sequence
-	// in order to avoid GOOM issues
-	  User::After(2000000);
-    eng->initMode(Cxe::ImageMode);
+
     int returnValue = app.exec();
 
-    // delete service provider instance
-    CxuiServiceProvider::destroy();
-
     delete viewManager;
-    delete mainWindow;
-    delete eng;
+    CxuiServiceProvider::destroy(); // delete service provider instance
+    delete engine;
 
     return returnValue;
 }