javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtflipwatch.cpp
changeset 21 2a9601315dfc
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/eswt_qt/org.eclipse.swt/Eclipse_SWT_PI/qt/library/swtflipwatch.cpp	Mon May 03 12:27:20 2010 +0300
@@ -0,0 +1,215 @@
+/*******************************************************************************
+ * Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies).
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     Nokia Corporation - initial implementation
+ *******************************************************************************/
+
+#include <org_eclipse_swt_internal_qt_OS.h>
+#include <hwrmdomainpskeys.h>
+
+#include "swtflipwatch.h"
+#include "swtapplication.h"
+#include "swts60.h"
+
+namespace Java { namespace eSWT {
+
+// Priority of the flip watch CActive. If for some reason the flip watch
+// CActive gets blocked, the watch timer should wait also. Therefore the
+// priority of the watch timer should be lower than this.
+const TInt KSwtFlipWatchPriority = 0;
+
+// Using a short delay on the flip watch will avoid ui unresponsiveness when
+// fast swaping the flip back and forth.
+const TInt KSwtFlipWatchTimeout = 250000;
+
+
+// ======== MEMBER FUNCTIONS ========
+
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::NewL
+// ---------------------------------------------------------------------------
+//
+CSwtFlipWatch* CSwtFlipWatch::NewL()
+{
+    CSwtFlipWatch* self = new(ELeave) CSwtFlipWatch();
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::~CSwtFlipWatch
+// ---------------------------------------------------------------------------
+//
+CSwtFlipWatch::~CSwtFlipWatch()
+{
+    Cancel();
+    iProperty.Close();
+
+    if (iTimer)
+    {
+        iTimer->Cancel();
+        delete iTimer;
+    }
+}
+
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::CSwtFlipWatch
+// ---------------------------------------------------------------------------
+//
+CSwtFlipWatch::CSwtFlipWatch()
+        : CActive(KSwtFlipWatchPriority)
+{
+  
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatch::ConstructL()
+{
+    isInitializationState = ETrue;
+    User::LeaveIfError(iProperty.Attach(KPSUidHWRM, KHWRMFlipStatus));
+    iTimer = CSwtFlipWatchTimer::NewL(this);
+    CActiveScheduler::Add(this);
+    RunL();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatch::DoCancel()
+{
+    iProperty.Cancel();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::RunL
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatch::RunL()
+{
+    iTimer->Cancel();
+    iProperty.Subscribe(iStatus);
+    // For performance reasons while in fast sequence of swaps the observers
+    // will get screen deactivated event only once.
+    if (!iFlipChanging)
+        {
+        SymbianUtils::eventFilter( swtApp, -1, org_eclipse_swt_internal_qt_OS_QSWTEVENT_SCREENDEACTIVATED);
+        }
+    iFlipChanging = ETrue;
+    iTimer->SetTimer(KSwtFlipWatchTimeout);
+    SetActive();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatch::HandleTimeoutL
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatch::HandleTimeoutL()
+{
+    TInt flipStatus = 0;
+    TInt err = iProperty.Get(flipStatus);
+    if ( !isInitializationState && err == KErrNone)
+        {
+        iFlipChanging = EFalse;
+        // Report flip change
+        if (flipStatus ==  EPSHWRMFlipClosed)
+            {
+            SymbianUtils::eventFilter( swtApp, -1, org_eclipse_swt_internal_qt_OS_QSWTEVENT_MOBILEDEVICECLOSED);
+            } else{
+            SymbianUtils::eventFilter( swtApp, -1, org_eclipse_swt_internal_qt_OS_QSWTEVENT_MOBILEDEVICEOPENED);
+            }
+        // For performance reasons while in fast sequence of swaps the observers
+        // will get screen deactivated event only once.
+        // ASSUMPTION: The screen changes if the flip changes.
+        SymbianUtils::eventFilter( swtApp, -1, org_eclipse_swt_internal_qt_OS_QSWTEVENT_SCREENACTIVATED);
+        }
+    isInitializationState = EFalse;
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::NewL
+// ---------------------------------------------------------------------------
+//
+CSwtFlipWatchTimer* CSwtFlipWatchTimer::NewL(MSwtFlipWatchTimerHandler* aHandler)
+{
+    CSwtFlipWatchTimer* self = new(ELeave) CSwtFlipWatchTimer(aHandler);
+    CleanupStack::PushL(self);
+    self->ConstructL();
+    CleanupStack::Pop(self);
+    return self;
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::CSwtFlipWatchTimer
+// ---------------------------------------------------------------------------
+//
+CSwtFlipWatchTimer::CSwtFlipWatchTimer(MSwtFlipWatchTimerHandler* aHandler)
+        : CActive(KSwtFlipWatchPriority - 1)
+        , iHandler(aHandler)
+{
+    ASSERT(iHandler);
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::ConstructL
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatchTimer::ConstructL()
+{
+    TInt err = iTimer.CreateLocal();
+    User::LeaveIfError(err);
+    CActiveScheduler::Add(this);
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::~CSwtFlipWatchTimer
+// ---------------------------------------------------------------------------
+//
+CSwtFlipWatchTimer::~CSwtFlipWatchTimer()
+{
+    Cancel();
+    iTimer.Close();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::RunL
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatchTimer::RunL()
+{
+    iHandler->HandleTimeoutL();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::DoCancel
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatchTimer::DoCancel()
+{
+    iTimer.Cancel();
+}
+
+// ---------------------------------------------------------------------------
+// CSwtFlipWatchTimer::SetTimer
+// ---------------------------------------------------------------------------
+//
+void CSwtFlipWatchTimer::SetTimer(TTimeIntervalMicroSeconds32 aDelay)
+{
+    Cancel();
+    iTimer.After(iStatus, aDelay);
+    SetActive();
+}
+
+}}