javauis/lcdui_akn/javalcdui/src.nokialcdui/CMIDDeviceControl.cpp
branchRCL_3
changeset 19 04becd199f91
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/javauis/lcdui_akn/javalcdui/src.nokialcdui/CMIDDeviceControl.cpp	Tue Apr 27 16:30:29 2010 +0300
@@ -0,0 +1,430 @@
+/*
+* Copyright (c) 2005-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:  Controls device backlight
+*
+*/
+
+
+
+// INCLUDE FILES
+#include    "CMIDDeviceControl.h"
+
+#include <jdebug.h>
+
+// CONSTANTS
+namespace
+{
+// Light devices supported by this API.
+const TInt KSupportedLightCount = 4;
+
+const TInt KSupportedLights[] = { CHWRMLight::EPrimaryDisplay,
+                                  CHWRMLight::EPrimaryKeyboard, CHWRMLight::ESecondaryDisplay,
+                                  CHWRMLight::ESecondaryKeyboard
+                                };
+
+const TInt KMIDMaxLightLevel = 100;
+}
+
+
+// ============================ MEMBER FUNCTIONS ===============================
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::CMIDDeviceControl
+// C++ default constructor can NOT contain any code, that
+// might leave.
+// -----------------------------------------------------------------------------
+//
+CMIDDeviceControl::CMIDDeviceControl(MMIDEnv& aEnv)
+        : iEnv(aEnv),
+        iLightLevel(KErrNotFound),
+        iSupportedLights(CHWRMLight::ENoTarget)
+{
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::ConstructL
+// Symbian 2nd phase constructor can leave.
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::ConstructL()
+{
+    DEBUG("nokialcdui::CMIDDeviceControl::ConstructL +");
+
+    iLight = CHWRMLight::NewL(this);
+
+    iEnv.AddObserverL(*this);
+
+    // Find out light devices on the phone that are supported
+    // by our API.
+
+    TInt supportedLights = iLight->SupportedTargets();
+
+    TInt mask = (CHWRMLight::EPrimaryDisplayAndKeyboard |
+                 CHWRMLight::ESecondaryDisplayAndKeyboard);
+
+    iSupportedLights = (supportedLights & mask);
+
+    DEBUG("nokialcdui::CMIDDeviceControl::ConstructL -");
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::NewLC
+// Two-phased constructor. Leaves object in cleanup stack.
+// -----------------------------------------------------------------------------
+//
+CMIDDeviceControl* CMIDDeviceControl::NewLC(MMIDEnv& aEnv)
+{
+    CMIDDeviceControl* self = new(ELeave) CMIDDeviceControl(aEnv);
+
+    CleanupStack::PushL(self);
+    self->ConstructL();
+
+    return self;
+}
+
+
+// Destructor
+CMIDDeviceControl::~CMIDDeviceControl()
+{
+    Release();
+    delete iLight;
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::resetUserInactivityTime
+// Reset the user inactivity time
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::GetUserInactivityTimeL(TInt* aRetVal)
+{
+    DEBUG("nokialcdui::CMIDDeviceControl::GetUserInactivityTimeL +");
+    TTimeIntervalSeconds ValInterval = User::InactivityTime() ;
+    *aRetVal = ValInterval.Int();
+    DEBUG("nokialcdui::CMIDDeviceControl::GetUserInactivityTimeL -");
+}
+
+void CMIDDeviceControl::StaticGetUserInactivityTimeL(CMIDDeviceControl* aDC,
+        TInt* aRetVal)
+{
+    aDC->GetUserInactivityTimeL(aRetVal);
+}
+
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::resetUserInactivityTime
+// Reset the user inactivity time
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::ResetUserInactivityTimeL()
+{
+    DEBUG("nokialcdui::CMIDDeviceControl::ResetUserInactivityTime +");
+    User::ResetInactivityTime();
+    DEBUG("nokialcdui::CMIDDeviceControl::ResetUserInactivityTime -");
+}
+
+void CMIDDeviceControl::StaticResetUserInactivityTimeL(CMIDDeviceControl* aDC)
+{
+    aDC->ResetUserInactivityTimeL();
+}
+
+/**
+ * Requests a flashing effect for the device's backlight
+ * Returns false as the emulator does not support this feature.
+ */
+#if defined(__WINSCW__)
+
+TBool CMIDDeviceControl::FlashBacklightL(TInt /*aDuration*/)
+{
+    DEBUG("nokialcdui::CMIDDeviceControl::FlashBacklightL");
+
+    return EFalse;
+}
+
+#else // __WINSCW__
+
+/**
+ * Requests a flashing effect for the device's backlight
+ * Must return true if the backlight can be controlled by the application
+ */
+TBool CMIDDeviceControl::FlashBacklightL(TInt aDuration)
+{
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::FlashBacklightL( %d ) +",
+              aDuration);
+
+    // Return EFalse if backlights cannot be controlled.
+    if (iSupportedLights == CHWRMLight::ENoTarget)
+    {
+        return EFalse;
+    }
+
+    // Delay the screen saver starting.
+    User::ResetInactivityTime();
+
+    // Reserve the light(s) if not yet reserved.
+    if (iLightLevel == KErrNotFound)
+    {
+        iLight->ReserveLightL(iSupportedLights);
+    }
+
+    if (!aDuration)
+    {
+        // 0 would be infinite
+        aDuration = 1;
+    }
+    iDuration = aDuration;
+    iStartTime = new TTime();
+    iStartTime->HomeTime();
+    iLight->LightBlinkL(iSupportedLights, aDuration);
+
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::FlashBacklightL( %d ) -",
+              aDuration);
+
+    return ETrue;
+}
+#endif // __WINSCW__
+
+
+void CMIDDeviceControl::StaticFlashBacklightL(
+    CMIDDeviceControl* aDC,
+    TInt aDuration,
+    TBool* aRetVal)
+{
+    *aRetVal = aDC->FlashBacklightL(aDuration);
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::SetLightL
+// sets the backlight level
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::SetLightL(TInt aLevel)
+{
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::SetLightL( %d ) +", aLevel);
+
+    if ((aLevel < 0) || (aLevel > KMIDMaxLightLevel))
+    {
+        User::Leave(KErrArgument);
+    }
+
+    // Delay the screen saver starting.
+    User::ResetInactivityTime();
+
+    // Do nothing if backlights cannot be controlled.
+    if (iSupportedLights != CHWRMLight::ENoTarget)
+    {
+        iLightLevel = aLevel;
+
+        // Do nothing at the moment if the blinking is ongoing.
+        // Adjust the new light level when the blinking has finished
+        // (LightStatusChanged() is called).
+        TBool isBlinking = LightsBlinking();
+
+        if (!isBlinking)
+        {
+            DoSetLightsL(aLevel);
+        }
+    }
+
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::SetLightL( %d ) -", aLevel);
+}
+
+
+
+void CMIDDeviceControl::HandleSwitchOnL(TBool /*aSwitchOn*/)
+{
+}
+
+void CMIDDeviceControl::HandleForegroundL(TBool aForeground)
+{
+    DEBUG_INT2("nokialcdui::CMIDDeviceControl::HandleForegroundL; aForeground=%d; iDuration=%d", aForeground, iDuration);
+
+    if (aForeground && iDuration > 0)
+    {
+        TTime* now = new TTime();
+        now->HomeTime();
+        TInt nowDuration = now->MicroSecondsFrom(*iStartTime).Int64()/1000;
+        if (nowDuration >= iDuration)
+        {
+            iDuration = 0;
+        }
+        else
+        {
+            DEBUG_INT("nokialcdui::CMIDDeviceControl::HandleForegroundL - continue blinking for ( %d ) -", (iDuration - nowDuration));
+            FlashBacklightL(iDuration - nowDuration);
+        }
+    }
+}
+
+void CMIDDeviceControl::HandleResourceChangeL(TInt /*aType*/)
+{
+}
+
+void CMIDDeviceControl::StaticSetLightL(CMIDDeviceControl* aDC, TInt aLevel)
+{
+    aDC->SetLightL(aLevel);
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::Release
+// Returns the backlight mode to sensor and releases resources
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::Release()
+{
+    DEBUG("nokialcdui::CMIDDeviceControl::Release +");
+
+    // Do nothing if backlights cannot be controlled.
+    if (iSupportedLights != CHWRMLight::ENoTarget)
+    {
+        TRAP_IGNORE(iLight->LightOnL(iSupportedLights,
+                                     KHWRMInfiniteDuration,
+                                     KHWRMDefaultIntensity, EFalse));
+
+        iLight->ReleaseLight(iSupportedLights);
+    }
+
+    DEBUG("nokialcdui::CMIDDeviceControl::Release -");
+}
+
+void CMIDDeviceControl::StaticRelease(CMIDDeviceControl* aDC)
+{
+    aDC->Release();
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::Dispose
+// Deletes this object
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::Dispose()
+{
+    delete this;
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::LightStatusChanged
+// If there is pending setLights call, do it now
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::LightStatusChanged(
+    TInt aTarget,
+    CHWRMLight::TLightStatus aStatus)
+{
+    DEBUG_INT2("nokialcdui::CMIDDeviceControl::LightStatusChanged( %d, %d ) +",
+               aTarget, aStatus);
+    (void)aTarget; // Just to suppress warning in release build
+
+    // Do nothing if the backlights cannot be controlled.
+    // Adjust the lights only if blinking has finished.
+    // If the status informs about some error, the light devices have to be
+    // released if blinking is not ongoing.
+    if ((aStatus != CHWRMLight::ELightBlink) &&
+            (iSupportedLights != CHWRMLight::ENoTarget))
+    {
+        // Check whether the blinking has stopped. Check that none of the light
+        // devices is blinking.
+        TBool isBlinking = LightsBlinking();
+
+        // Adjust the lights only if blinking has finished.
+        if (!isBlinking)
+        {
+            if (KErrNotFound == iLightLevel)
+            {
+                // lights haven't been set yet, so lights must be released after
+                // blinking
+
+                iLight->ReleaseLight(iSupportedLights);
+            }
+            // Set the stored level to the lights only if the lights are in a
+            // valid state (if the given status informed about some error, the
+            // level is not tried to be set to the lights).
+            else if ((aStatus == CHWRMLight::ELightOn) ||
+                     (aStatus == CHWRMLight::ELightOff))
+            {
+                TInt err;
+                TRAP(err, DoSetLightsL(iLightLevel));
+
+                DEBUG_INT(
+                    "nokialcdui::CMIDDeviceControl::DoSetLightsL, err=%d", err);
+            }
+        }
+    }
+
+    DEBUG_INT2("nokialcdui::CMIDDeviceControl::LightStatusChanged( %d, %d ) -",
+               aTarget, aStatus);
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::DoSetLightsL
+// Actually sets the lights
+// -----------------------------------------------------------------------------
+//
+void CMIDDeviceControl::DoSetLightsL(TInt aLevel)
+{
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::DoSetLightsL( %d ) +", aLevel);
+
+    iLight->ReserveLightL(iSupportedLights);
+
+    // 0 means off in our API, but default in HWRMLight API.
+    if (aLevel == 0)
+    {
+        iLight->LightOffL(iSupportedLights,
+                          KHWRMInfiniteDuration,
+                          EFalse);
+    }
+    else
+    {
+        iLight->LightOnL(iSupportedLights,
+                         KHWRMInfiniteDuration,
+                         aLevel, EFalse);
+    }
+
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::DoSetLightsL( %d ) -", aLevel);
+}
+
+// -----------------------------------------------------------------------------
+// CMIDDeviceControl::LightsBlinking
+// Checks whether lights are blinking.
+// -----------------------------------------------------------------------------
+//
+TBool CMIDDeviceControl::LightsBlinking()
+{
+    DEBUG("nokialcdui::CMIDDeviceControl::LightsBlinking +");
+
+    // Check all the supported lights.
+
+    TBool isBlinking = EFalse;
+
+    for (TInt i = 0; i < KSupportedLightCount; i++)
+    {
+        TInt light = KSupportedLights[ i ];
+
+        if ((iSupportedLights & light) == light)
+        {
+            CHWRMLight::TLightStatus lightStatus = iLight->LightStatus(light);
+            TBool blinking = (lightStatus == CHWRMLight::ELightBlink);
+
+            isBlinking |= blinking;
+        }
+    }
+
+
+    DEBUG_INT("nokialcdui::CMIDDeviceControl::LightsBlinking - %d",
+              isBlinking);
+
+    return isBlinking;
+}
+
+
+//  End of File