camerauis/cameraxui/cxui/src/cxuiapplicationframeworkmonitorprivate.cpp
changeset 56 01e205c615b9
parent 36 b12f3922a74f
child 58 ddba9caa7f32
--- a/camerauis/cameraxui/cxui/src/cxuiapplicationframeworkmonitorprivate.cpp	Wed Aug 18 09:37:18 2010 +0300
+++ b/camerauis/cameraxui/cxui/src/cxuiapplicationframeworkmonitorprivate.cpp	Thu Sep 02 20:14:28 2010 +0300
@@ -32,6 +32,7 @@
 #include <QMetaEnum>
 #include <QString>
 #include <QVariant>
+#include <QTimer>
 #include <qsymbianevent.h>
 
 #endif // Q_OS_SYMBIAN
@@ -42,6 +43,9 @@
 #include "cxesettings.h"
 #include "cxuiapplicationframeworkmonitorprivate.h"
 
+namespace{
+    const int CXUI_USB_MODE_CHECK_TIMER_DELAY = 1000; // 1 second
+}
 
 #ifdef Q_OS_SYMBIAN
 namespace
@@ -110,6 +114,7 @@
        mKeyLockState(EKeyguardNotActive),
        mBatteryStatus(EBatteryStatusUnknown),
        mUsbPersonality(0),
+       mUsbModeCheckTimer(this),
        mEventLog(NULL),
 #endif // Q_OS_SYMBIAN
        mState(CxuiApplicationFrameworkMonitor::ForegroundOwned)
@@ -120,6 +125,10 @@
     mWindowGroupName = windowGroupName(mWsSession, mWindowGroupId);
     mEventLog = new CxuiEventLog("CxuiApplicationFrameworkMonitorPrivate");
     init();
+    mUsbModeCheckTimer.setSingleShot(true);
+    mUsbModeCheckTimer.setInterval(CXUI_USB_MODE_CHECK_TIMER_DELAY);
+    connect(&mUsbModeCheckTimer, SIGNAL(timeout()),
+            this, SLOT(usbModeCheckTimerCallback()));
 #endif // Q_OS_SYMBIAN
     CX_DEBUG_EXIT_FUNCTION();
 }
@@ -234,7 +243,20 @@
 
             // Check if mass memory mode activity changed.
             if (wasUsbMassMemoryModeActive != isUsbMassMemoryModeActive()) {
-                emit q->usbMassMemoryModeToggled(isUsbMassMemoryModeActive());
+
+                // If the massmemory mode switched from on to off,
+                // the signal is emitted immediately.
+                // If the switch is from off to on, we need to use a timer
+                // as a workaround because  plugging in the USB charger
+                // sends a mass memory mode change event.
+                if (wasUsbMassMemoryModeActive) {
+                    emit q->usbMassMemoryModeToggled(isUsbMassMemoryModeActive());
+                } else {
+                    // (Re)starting the timer
+                    mUsbModeCheckTimer.stop();
+                    mUsbModeCheckTimer.start();
+                }
+
             }
         }
     }
@@ -243,6 +265,23 @@
 }
 
 /*!
+*  Callback function for the timer used to seperate USB charging
+*  from USB mass memory mode
+*/
+void CxuiApplicationFrameworkMonitorPrivate::usbModeCheckTimerCallback()
+{
+    CX_DEBUG_ENTER_FUNCTION();
+
+    // if the device is still in mass memory mode after the timer has finished,
+    // the device really is in massmemory mode and not plugged into the charger
+    if (isUsbMassMemoryModeActive()){
+        emit q->usbMassMemoryModeToggled(isUsbMassMemoryModeActive());
+    }
+
+    CX_DEBUG_EXIT_FUNCTION();
+}
+
+/*!
 * Set initial values.
 */
 void CxuiApplicationFrameworkMonitorPrivate::init()