diff -r 000000000000 -r 16d8024aca5e src/hbwidgets/devicedialogs/hbdevicenotificationdialogsymbian.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/hbwidgets/devicedialogs/hbdevicenotificationdialogsymbian.cpp Mon Apr 19 14:02:13 2010 +0300 @@ -0,0 +1,608 @@ +/**************************************************************************** +** +** Copyright (C) 2008-2010 Nokia Corporation and/or its subsidiary(-ies). +** All rights reserved. +** Contact: Nokia Corporation (developer.feedback@nokia.com) +** +** This file is part of the HbWidgets module of the UI Extensions for Mobile. +** +** GNU Lesser General Public License Usage +** This file may be used under the terms of the GNU Lesser General Public +** License version 2.1 as published by the Free Software Foundation and +** appearing in the file LICENSE.LGPL included in the packaging of this file. +** Please review the following information to ensure the GNU Lesser General +** Public License version 2.1 requirements will be met: +** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Nokia gives you certain additional +** rights. These rights are described in the Nokia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** If you have questions regarding the use of this file, please contact +** Nokia at developer.feedback@nokia.com. +** +****************************************************************************/ + +#include +#include +#include "hbdevicenotificationdialogsymbian.h" + +_LIT(KKeyTimeOut, "timeout"); +_LIT(KKeyIconName, "iconName"); +_LIT(KKeyText, "text"); +_LIT(KKeyTitle, "title"); +_LIT(KKeyTouchActivation, "touchActivation"); +_LIT(KKeyActivated, "result"); +_LIT(KKeyActivatedValue, "activated"); +_LIT(KPluginIdentifier, "com.nokia.hb.devicenotificationdialog/1.0"); +_LIT(KKeyTitleTextWrapping, "titleTextWrapping"); +_LIT(KKeyAnimationDefinition, "animationDefinition"); + +NONSHARABLE_CLASS(CHbDeviceNotificationDialogSymbianPrivate) : public CBase, + public MHbDeviceDialogObserver +{ +public: + CHbDeviceNotificationDialogSymbianPrivate(); + virtual ~CHbDeviceNotificationDialogSymbianPrivate(); + +public: + void ShowL(); + void UpdateL(); + void Close(); + + void AddVariantL(const TDesC& aKey, const TAny* aData, + CHbSymbianVariant::TType aDataType); + const CHbSymbianVariant* Variant(const TDesC& aKey) const; + +public: // MHbDeviceDialogObserver + void DataReceived(CHbSymbianVariantMap& aData); + void DeviceDialogClosed(TInt aCompletionCode); + + void ConstructL(CHbDeviceNotificationDialogSymbian* aDialog); + +public: + MHbDeviceNotificationDialogObserver* iObserver; + CHbDeviceDialogSymbian *iDeviceDialog; + CHbSymbianVariantMap* iVariantMap; + CHbDeviceNotificationDialogSymbian* q; + + TBool iEnable; + TInt iTimeout; + CHbDeviceNotificationDialogSymbian::TextWrapping iWrap; +}; + +CHbDeviceNotificationDialogSymbianPrivate::CHbDeviceNotificationDialogSymbianPrivate() + { + } + +CHbDeviceNotificationDialogSymbianPrivate::~CHbDeviceNotificationDialogSymbianPrivate() + { + if (!iObserver && q->Timeout() != 0) { + iDeviceDialog->SetObserver(NULL); + } + + delete iDeviceDialog; + delete iVariantMap; + } + +void CHbDeviceNotificationDialogSymbianPrivate::ConstructL(CHbDeviceNotificationDialogSymbian* aDialog) + { + q = aDialog; + iDeviceDialog = CHbDeviceDialogSymbian::NewL(); + iVariantMap = CHbSymbianVariantMap::NewL(); + } + +void CHbDeviceNotificationDialogSymbianPrivate::ShowL() + { + AddVariantL(KKeyTouchActivation, &iEnable, CHbSymbianVariant::EBool); + AddVariantL(KKeyTimeOut, &iTimeout, CHbSymbianVariant::EInt); + AddVariantL(KKeyTitleTextWrapping, &iWrap, CHbSymbianVariant::EInt); + User::LeaveIfError(iDeviceDialog->Show(KPluginIdentifier, *iVariantMap, this)); + } + +void CHbDeviceNotificationDialogSymbianPrivate::UpdateL() + { + AddVariantL(KKeyTouchActivation, &iEnable, CHbSymbianVariant::EBool); + AddVariantL(KKeyTimeOut, &iTimeout, CHbSymbianVariant::EInt); + AddVariantL(KKeyTitleTextWrapping, &iWrap, CHbSymbianVariant::EInt); + User::LeaveIfError(iDeviceDialog->Update(*iVariantMap)); + } + +void CHbDeviceNotificationDialogSymbianPrivate::Close() + { + iDeviceDialog->Cancel(); + } + +void CHbDeviceNotificationDialogSymbianPrivate::AddVariantL( + const TDesC& aKey, + const TAny* aData, + CHbSymbianVariant::TType aDataType) + { + CHbSymbianVariant *variant = CHbSymbianVariant::NewL(aData, aDataType); + CleanupStack::PushL(variant); + User::LeaveIfError(iVariantMap->Add(aKey, variant)); + CleanupStack::Pop(variant); + } + +const CHbSymbianVariant* CHbDeviceNotificationDialogSymbianPrivate::Variant( + const TDesC& aKey) const + { + return iVariantMap->Get(aKey); + } + +void CHbDeviceNotificationDialogSymbianPrivate::DataReceived(CHbSymbianVariantMap& aData) + { + const CHbSymbianVariant* variant = aData.Get(KKeyActivated); + if (variant && variant->IsValid()) + { + TPtrC p = *variant->Value(); + bool result = p.Compare(KKeyActivatedValue()) == 0; + if (iObserver && result) + { + // Observer callback may delete this object. Don't touch it after. + iObserver->NotificationDialogActivated(q); + } + } + } + +void CHbDeviceNotificationDialogSymbianPrivate::DeviceDialogClosed(TInt aCompletionCode) + { + if (iObserver) + { + // Observer callback may delete this object. Don't touch it after. + iObserver->NotificationDialogClosed(q, aCompletionCode); + } + } + +/*! + \class MHbDeviceNotificationDialogObserver + \brief MHbDeviceNotificationDialogObserver is an observer interface for observing CHbDeviceNotificationDialogSymbian. +*/ + +/*! + \fn void MHbDeviceNotificationDialogObserver::NotificationDialogActivated(const CHbDeviceNotificationDialogSymbian* aDialog) = 0; + + This callback is called when notification dialog is activated. + \a aDialog - Pointer to dialog instance which received activation event. +*/ + +/*! + \fn void MHbDeviceNotificationDialogObserver::NotificationDialogClosed(const CHbDeviceNotificationDialogSymbian* aDialog, TInt aCompletionCode) = 0; + + This callback is called when notification dialog is closed. + \a aDialog - Pointer to dialog instance which received closed event. + \a aCompletionCode - Result of the dialog completion. +*/ + +/*! + \fn void MHbDeviceNotificationDialogObserver::NotificationDialogError(const CHbDeviceNotificationDialogSymbian* aDialog, TInt aError) = 0; + + This callback is called when an error has occured. + \a aDialog - Pointer to dialog instance which received closed event. + \a aError - Error code. +*/ + +/*! + \class CHbDeviceNotificationDialogSymbian + \brief CHbDeviceNotificationDialogSymbian is a Symbian implementation of HbDeviceNotificationDialog. + + It is a client interface for s60 native application to show a non-modal dialog on top of applications when + HbDeviceNotificationDialog can not be used. + + CHbDeviceNotificationDialogSymbian provides similar interface and functionality as HbDeviceNotificationDialog. + Main difference is that signals are replaced by an observer interface CHbDeviceNotificationDialogSymbianObserver. + + For the content CHbDeviceNotificationDialogSymbian provides two rows of text, an image or an animation and for the usage + same rules as for the HbDeviceNotificationDialog apply. Dialog is shown when show() is called. It is recommended that + the dialog data is initialized before calling ShowL() or UpdateL() methods, because those methods use interprocess communication. + + \code + Following code snippet creates a device notification dialog containing title, text and icon. + + _LIT(KDialogText, "Dialog text"); + _LIT(KDialogTitle, "Dialog title"); + _LIT(KDialogIcon, "note_info.svg"); + + CHbDeviceNotificationDialogSymbian* dialog = CHbDeviceNotificationDialogSymbian::NewL(); + CleanupStack::PushL(dialog); + dialog->SetTextL(KDialogText); + dialog->SetTitleL(KDialogTitle); + dialog->SetIconNameL(KDialogIcon); + dialog->Show(); + CleanupStack::PopAndDestroy(dialog); + \endcode + + or equivalent dialog can be created using one of the provided convenience methods: + + \code + _LIT(KDialogText, "Dialog text"); + _LIT(KDialogTitle, "Dialog title"); + _LIT(KDialogIcon, "note_info.svg"); + + CHbDeviceNotificationDialogSymbian::Notification(KDialogIcon, KDialogText, KDialogTitle); + \endcode + + When using convenience methods, it is not possible to receive user interaction events, because the + HbDeviceNotificationDialog instance is destroyed when the call returns. Ownership and handling of the + dialog is transferred to HbDeviceDialog framework. Also dialog can not be closed nor updated. + + Below is an example of receiving user interaction events from device notification dialog. With following example + user is able to receive activated and close events. Note that dialog is cancelled, if it goes out of scope. + + \code + _LIT(KDialogText, "Dialog text"); + _LIT(KDialogTitle, "Dialog title"); + _LIT(KDialogIcon, "note_info.svg"); + + iDialog = CHbDeviceNotificationDialogSymbian::NewL(this); + iDialog->SetTextL(KDialogText); + iDialog->SetTitleL(KDialogTitle); + iDialog->SetIconNameL(KDialogIcon); + iDialog->ShowL(); + \endcode + + CHbDeviceNotificationDialogSymbian supports. + Supported formats are the following. + + - GIF (.gif) + - MNG (.mng) + - Frame animations + + There is a built-in support for GIF and MNG animations. + + Frame animations can be created by following way: + + \code + Create an animation definition file. + + + + c:\icon1.svg + c:\icon2.svg + c:\icon3.svg + + + + Create CHbDeviceNotificationDialogSymbian in a way described before and + set definition file and animation's logical name. + + _LIT(KAnimationDefinitionXML, "C:\animation.axml"); + _LITK(KLogicalIconName, "frame_anim_looping"); + + iDialog->SetAnimationDefinitionL(KAnimationDefinitionXML); + iDialog->SetIconNameL(KIconName); + iDialog->ShowL(); + \endcode + \sa HbIconAnimationManager::addDefinitionFile + \note Animation definition files must be stored to a place where they + can be accessed. + + \proto + \hbwidgets +*/ + +/*! + Symbian two phase constructor. Returns a pointer to CHbDeviceNotificationDialogSymbian instance. + \a aObserver Pointer to the observer. +*/ +EXPORT_C CHbDeviceNotificationDialogSymbian* CHbDeviceNotificationDialogSymbian::NewL( + MHbDeviceNotificationDialogObserver* aObserver) + { + CHbDeviceNotificationDialogSymbian* self = new (ELeave) CHbDeviceNotificationDialogSymbian(); + CleanupStack::PushL(self); + self->ConstructL(aObserver); + CleanupStack::Pop(self); + return self; + } + +/*! + Destructor. +*/ +EXPORT_C CHbDeviceNotificationDialogSymbian::~CHbDeviceNotificationDialogSymbian() + { + delete d; + } + +/*! + Convenience method for showing notification dialog with icon and title. + \param aIconName - path and name of the icon shown on dialog. + \param aTitle - title shown on dialog. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::NotificationL(const TDesC& aIconName, const TDesC& aTitle) + { + CHbDeviceNotificationDialogSymbian* self = CHbDeviceNotificationDialogSymbian::NewL(); + CleanupStack::PushL(self); + self->SetIconNameL(aIconName); + self->SetTitleL(aTitle); + self->ShowL(); + CleanupStack::PopAndDestroy(self); + } + +/*! + Convenience method for showing notification dialog with icon, text and title. + \param aIconName - path and name of the icon shown on dialog. + \param aText - text shown on dialog. + \param aTitle - title shown on dialog. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::NotificationL(const TDesC &aIconName, const TDesC& aText, const TDesC& aTitle) + { + CHbDeviceNotificationDialogSymbian* self = CHbDeviceNotificationDialogSymbian::NewL(); + CleanupStack::PushL(self); + self->SetIconNameL(aIconName); + self->SetTextL(aText); + self->SetTitleL(aTitle); + self->ShowL(); + CleanupStack::PopAndDestroy(self); + } + +/*! + Sets message box icon name or animation logical name. The dialog gets updated when method is called. + + \param aIconName Icon name. Icon can be from Hb resources or themes. Or can be a file in + a file system. + + \sa IconName() +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetIconNameL(const TDesC& aIconName) + { + d->AddVariantL(KKeyIconName, &aIconName, CHbSymbianVariant::EDes); + } + + +/*! + Get name and path of the icon shown on dialog or animation's logical name. + If not set, returns empty iconName. + + \sa SetIconNameL +*/ +EXPORT_C const TPtrC CHbDeviceNotificationDialogSymbian::IconName() const + { + const CHbSymbianVariant* variant = d->Variant(KKeyIconName); + if (variant && variant->IsValid()) + { + return *variant->Value(); + } + return TPtrC(KNullDesC()); + } + +/*! + Sets notification dialog's animation definition name. The dialogs get updated next when time ShowL() or UpdateL() + is called. + + \param aAnimationDefinition Animation definition file name. Definition can be from Hb resources or themes. + Or can be a file in a file system. + + \sa AnimationDefinition() +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetAnimationDefinitionL(const TDesC& aAnimationDefinition) +{ + d->AddVariantL(KKeyAnimationDefinition, &aAnimationDefinition, CHbSymbianVariant::EDes); +} + +/*! + Returns an animation definition set for a dialog. If not set, return string. + + \sa SetAnimationDefinitionL() +*/ +EXPORT_C TPtrC CHbDeviceNotificationDialogSymbian::AnimationDefinition() const +{ + const CHbSymbianVariant* variant = d->Variant(KKeyAnimationDefinition); + if (variant && variant->IsValid()) + { + return *variant->Value(); + } + return TPtrC(KNullDesC()); +} + + +/*! + Set and update text on dialog. Text is not set, if Show() or Update() + is not called. + \param aText - text shown on dialog. + \sa ShowL(), UpdateL() +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetTextL(const TDesC& aText) + { + d->AddVariantL(KKeyText, &aText, CHbSymbianVariant::EDes); + } + +/*! + Get text shown on dialog. If not set, returns empty string. + + \sa SetTextL() +*/ +EXPORT_C const TPtrC CHbDeviceNotificationDialogSymbian::Text() const + { + const CHbSymbianVariant* variant = d->Variant(KKeyText); + if (variant && variant->IsValid()) + { + return *variant->Value(); + } + return TPtrC(KNullDesC()); + } + +/*! + Set and update title on dialog. Title is not set, if Show() or Update() + is not called. + \param title - aTitle shown on dialog. + \sa ShowL(), UpdateL() +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetTitleL(const TDesC& aTitle) + { + d->AddVariantL(KKeyTitle, &aTitle, CHbSymbianVariant::EDes); + } + +/*! + Get title shown on dialog. If not set, returns empty string. + + \sa SetTitleL() +*/ +EXPORT_C const TPtrC CHbDeviceNotificationDialogSymbian::Title() const + { + TPtrC ptr = KKeyTitle(); + const CHbSymbianVariant* variant = d->Variant(KKeyTitle); + if (variant && variant->IsValid()) + { + return *variant->Value(); + } + return TPtrC(KNullDesC()); + } + +/*! + \deprecated void CHbDeviceNotificationDialogSymbian::EnableTouchActivationL(TBool aEnable) + is deprecated. Use CHbDeviceNotificationDialogSymbian::EnableTouchActivation(TBool aEnable) + instead. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::EnableTouchActivationL(TBool aEnable) + { + EnableTouchActivation(aEnable); + } + +/*! + Enable user interaction on dialog. Setting is not set, if Show() or Update() + is not called. + \param aEnable - When enabled, activation event is notified via observer interface. + + Default value is false. + \sa ShowL(), UpdateL(), MCHbDeviceNotificationDialogSymbianObserver. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::EnableTouchActivation(TBool aEnable) + { + d->iEnable = aEnable; + } + +/*! + Get touch activation setting. + + \sa EnableTouchActivation() +*/ +EXPORT_C TBool CHbDeviceNotificationDialogSymbian::IsTouchActivating() const + { + return d->iEnable; + } + +/*! + \deprecated void CHbDeviceNotificationDialogSymbian::SetTimeoutL(TInt aTimeout) + is deprecated. Use CHbDeviceNotificationDialogSymbian::SetTimeout(TInt aTimeout) + instead. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetTimeoutL(TInt aTimeout) + { + SetTimeout(aTimeout); + } + +/*! + Set dialog timeout. Timeout is not set, if Show() or Update() + is not called. + \param aTimeout - Set timeout for dialog. + + Default value is HbPopup::StandardTimeout (3000 ms). + \sa ShowL(), UpdateL() +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetTimeout(TInt aTimeout) + { + d->iTimeout = aTimeout; + } + +/*! + Get timeout setting. + + \sa SetTimeout() +*/ +EXPORT_C TInt CHbDeviceNotificationDialogSymbian::Timeout() const + { + return d->iTimeout; + } + +/*! + \deprecated void CHbDeviceNotificationDialogSymbian::SetTitleTextWrappingL( + TextWrapping aWrapping) is deprecated. Use CHbDeviceNotificationDialogSymbian::SetTitleTextWrapping( + TextWrapping aWrapping) instead. + instead. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetTitleTextWrappingL( + TextWrapping aWrapping) + { + SetTitleTextWrapping(aWrapping); + } + +/*! + Set dialog title text wrapping. Text wrapping is not set, if Show() or Update() + is not called. + \param aWrapping - Defines title text wrapping. + + Default value is CHbDeviceNotificationDialogSymbian::TextNoWrap. + \sa ShowL(), UpdateL() +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::SetTitleTextWrapping( + TextWrapping aWrapping) + { + d->iWrap = aWrapping; + } + +/*! + Get title text wrapping setting. + + \sa SetTitleTextWrapping() +*/ +EXPORT_C CHbDeviceNotificationDialogSymbian::TextWrapping CHbDeviceNotificationDialogSymbian::TitleTextWrapping() const + { + return d->iWrap; + } + +/*! + Show the dialog. + \code + // example to show dialog. + iNotificationDialog->SetTitleL("Dialog title text"); + iNotificationDialog->ShowL(); + \endcode +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::ShowL() + { + d->ShowL(); + } + +/*! + Update the dialog. Show must be called before update can be used. + \code + // example to update already showing dialog. + iNotificationDialog->SetTitleL("Update title"); + iNotificationDialog->UpdateL(); + \endcode +*/ + +EXPORT_C void CHbDeviceNotificationDialogSymbian::UpdateL() + { + d->UpdateL(); + } + +/*! + Close the dialog. Method has no effect if convenience methods + are used to show device notification dialog. +*/ +EXPORT_C void CHbDeviceNotificationDialogSymbian::Close() + { + d->Close(); + } + +/*! + Constructor. +*/ +CHbDeviceNotificationDialogSymbian::CHbDeviceNotificationDialogSymbian() + { + } + +/*! + Symbian 2nd phase constructor. +*/ +void CHbDeviceNotificationDialogSymbian::ConstructL( + MHbDeviceNotificationDialogObserver* aObserver) + { + d = new (ELeave) CHbDeviceNotificationDialogSymbianPrivate; + d->ConstructL(this); + d->iObserver = aObserver; + EnableTouchActivation(EFalse); + SetTimeout(KHbLongNotificationDialogTimeout); + SetTitleTextWrapping(CHbDeviceNotificationDialogSymbian::TextWordWrap); + }