Revision: 201025
authorDremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 06 Jul 2010 14:16:36 +0300
changeset 11 64a47b97e1e1
parent 10 b04270301d3b
child 12 d56c5d6796ca
child 14 f27aebe284bb
Revision: 201025 Kit: 2010127
logsui/logsapp/inc/logsbaseview.h
logsui/logsapp/inc/logscomponentrepository.h
logsui/logsapp/inc/logsdefs.h
logsui/logsapp/inc/logseffecthandler.h
logsui/logsapp/inc/logsmatchesview.h
logsui/logsapp/inc/logsrecentcallsview.h
logsui/logsapp/inc/logsservicehandler.h
logsui/logsapp/inc/logsservicehandlerold.h
logsui/logsapp/inc/logsviewmanager.h
logsui/logsapp/logsapp.pro
logsui/logsapp/resources/matchesView.docml
logsui/logsapp/resources/recentCallsView.docml
logsui/logsapp/src/logsbaseview.cpp
logsui/logsapp/src/logscomponentrepository.cpp
logsui/logsapp/src/logsdetailsview.cpp
logsui/logsapp/src/logseffecthandler.cpp
logsui/logsapp/src/logsmainwindow.cpp
logsui/logsapp/src/logsmatchesview.cpp
logsui/logsapp/src/logsrecentcallsview.cpp
logsui/logsapp/src/logsservicehandler.cpp
logsui/logsapp/src/logsservicehandlerold.cpp
logsui/logsapp/src/logsviewmanager.cpp
logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h
logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h
logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h
logsui/logsapp/tsrc/ut_logsapp/src/ut_logsbaseview.cpp
logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp
logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp
logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp
logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp
logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp
logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp
logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp
logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h
logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro
logsui/logscntfinder/src/logscntfinder.cpp
logsui/logscntfinder/src/logspredictivetranslator.cpp
logsui/logscntfinder/tsrc/pt_logscntfinder/src/main.cpp
logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp
logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinderqwerty.cpp
logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h
logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp
logsui/logscntfinder/tsrc/stubs/qtcontacts_stubs.cpp
logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivethai12keytranslator.cpp
logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp
logsui/logsengine/inc/logsengdefs.h
logsui/logsengine/inc/logsmatchesmodel.h
logsui/logsengine/inc/logsmessage.h
logsui/logsengine/logssymbianos/src/logsdbconnector.cpp
logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp
logsui/logsengine/src/logscontact.cpp
logsui/logsengine/src/logsmatchesmodel.cpp
logsui/logsengine/src/logsmessage.cpp
logsui/logsengine/tsrc/stubs/logscntfinder.h
logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp
logsui/logsengine/tsrc/stubs/qthighway_stub.cpp
logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h
logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp
--- a/logsui/logsapp/inc/logsbaseview.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsbaseview.h	Tue Jul 06 14:16:36 2010 +0300
@@ -47,7 +47,7 @@
     friend class UT_LogsBaseView;
     
 public:
-
+    
     virtual ~LogsBaseView();
 
 public:
@@ -74,7 +74,6 @@
     
     virtual void handleExit();
     virtual void callKeyPressed();
-    void closeEmptyMenu();
     
 signals:
 
@@ -139,7 +138,7 @@
     /**
      * Loads appropriate section from *.docml to resize list widget
      */
-    void updateListSize();
+    void updateListSize( HbListView& list );
   
 protected:
     
@@ -190,6 +189,11 @@
     void updateDialpadCallAndMessagingActions();
     bool tryMatchesViewTransition();
     bool isDialpadInput() const;
+    void ensureListPositioning( HbListView& list );
+    void scrollToTopItem( HbListView* list );
+    
+    void updateMenuVisibility();
+    void setMenuVisible(bool visible);
     
 protected:
     
@@ -214,6 +218,7 @@
     QString mLayoutSectionName;
     
     QStringList mActivities;
+    HbMenu* mOptionsMenu;
 };
 
 
--- a/logsui/logsapp/inc/logscomponentrepository.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logscomponentrepository.h	Tue Jul 06 14:16:36 2010 +0300
@@ -31,8 +31,10 @@
 /**
  * 
  */
-class LogsComponentRepository : public HbDocumentLoader   
+class LogsComponentRepository : public QObject, public HbDocumentLoader
 {   
+    Q_OBJECT
+    
     friend class UT_LogsComponentRepository;
     friend class UT_LogsViewManager;
     
@@ -43,9 +45,9 @@
 
 public:
     
-    LogsRecentCallsView* recentCallsView();
-    LogsDetailsView* detailsView();
-    LogsMatchesView* matchesView();
+    LogsRecentCallsView* recentCallsView(bool onlyInit = false);
+    LogsDetailsView* detailsView(bool onlyInit = false);
+    LogsMatchesView* matchesView(bool onlyInit = false);
 
     /**
      * Returns dialpad. Must be always a valid pointer.
@@ -63,6 +65,10 @@
     void setObjectTreeToView( LogsAppViewId viewId );
     
     bool loadSection(  LogsAppViewId viewId, const QString& sectionName );
+
+private slots:
+
+    void lazyInit();
     
 private: 
 
@@ -71,6 +77,10 @@
 
     void addToolbarToObjectList( QObjectList& list );
     
+    QGraphicsWidget* doLoadView( 
+        const QString &fileName, const QString &viewName, 
+        QObjectList &viewComponents, LogsAppViewId viewId, bool onlyInit );
+    
 private:
     
     LogsAbstractViewManager& mViewManager;
@@ -84,6 +94,7 @@
     Dialpad* mDialpad;
     DialpadKeyHandler* mDialpadKeyHandler;
     LogsModel*  mModel;
+    QObjectList* mCurrentObjectTree;
 };
 
 #endif // LOGSCOMPONENTREPOSITORY_H
--- a/logsui/logsapp/inc/logsdefs.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsdefs.h	Tue Jul 06 14:16:36 2010 +0300
@@ -39,6 +39,7 @@
 const char logsToolbarId[] = "logs_toolbar";
 const char logsButtonAddToContactsId[] = "logs_button_addtocontacts";
 const char logsPageIndicatorId[] = "logs_page_indicator";
+const char logsContentId[] = "logs_content";
 
 //action ids
 const char logsCommonVideoCallMenuActionId[] = "logs_act_video_call";
@@ -101,6 +102,7 @@
 
 const char logsActivityParamShowDialpad[] = "show_dialpad"; // val type bool
 const char logsActivityParamDialpadText[] = "dialpad_text"; // val type string
+const char logsActivityParamInternalViewId[] = "view_id"; // val type int
 
 
 #endif // LOGSDEFS_H
--- a/logsui/logsapp/inc/logseffecthandler.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logseffecthandler.h	Tue Jul 06 14:16:36 2010 +0300
@@ -41,13 +41,15 @@
 
     void startDissappearAppearByFadingEffect(QObject& effectTarget);
     void startDissappearAppearByMovingEffect(
-        QObject& effectTarget, QObject& secondaryEffectTarget, bool dissappearToLeft, int origX);
+        QObject& effectTarget, QObject& secondaryEffectTarget, bool dissappearToLeft, 
+        int origX, int secondaryOrigX);
     void startMoveNotPossibleEffect(QObject& effectTarget, bool moveLeft, int origX);
     
 signals:
 
     void dissappearByMovingComplete();
     void dissappearByFadingComplete();
+    void appearByMovingComplete();
 
 private slots:
 
--- a/logsui/logsapp/inc/logsmatchesview.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsmatchesview.h	Tue Jul 06 14:16:36 2010 +0300
@@ -74,6 +74,7 @@
     HbListView* mListView;    //not owned
     LogsMatchesModel* mModel; //owned
     HbPushButton* mAddToContactsButton; // not owned
+    bool mAddToContactsButtonDisabled;
 };
 
 #endif // LOGSMATCHESVIEW_H
--- a/logsui/logsapp/inc/logsrecentcallsview.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsrecentcallsview.h	Tue Jul 06 14:16:36 2010 +0300
@@ -19,6 +19,7 @@
 
 #include "logsfilter.h"
 #include "logsbaseview.h"
+#include <hbscrollarea.h>
 
 class HbListView;
 class HbLabel;
@@ -79,8 +80,8 @@
     void rightFlick();
     void dissappearByFadingComplete();
     void dissappearByMovingComplete();
+    void appearByMovingComplete();
     bool markMissedCallsSeen();
-    void scrollToTopItem();
     
 private: // from LogsBaseView
     
@@ -124,11 +125,14 @@
     bool mMoveLeftInList;
     LogsEffectHandler* mEffectHandler;
     int mListViewX;
+    int mEmptyListLabelX;
     LogsMatchesModel* mMatchesModel; 
     bool mMarkingMissedAsSeen;
     LogsPageIndicator* mPageIndicator;
     bool mFirstActivation;
     
+    HbScrollArea::ScrollBarPolicy mListScrollBarPolicy;
+    
 };
 
 #endif // LOGSRECENTCALLSVIEW_H
--- a/logsui/logsapp/inc/logsservicehandler.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsservicehandler.h	Tue Jul 06 14:16:36 2010 +0300
@@ -36,7 +36,7 @@
         
     signals:
     
-        void activateView(LogsServices::LogsView activatedView, bool showDialpad);
+        void activateView(LogsServices::LogsView activatedView, bool showDialpad, QString dialpadText);
         void activateView(QString dialpadText);
     
     public:
--- a/logsui/logsapp/inc/logsservicehandlerold.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsservicehandlerold.h	Tue Jul 06 14:16:36 2010 +0300
@@ -35,7 +35,7 @@
         
     signals:
     
-        void activateView(LogsServices::LogsView activatedView, bool showDialpad);
+        void activateView(LogsServices::LogsView activatedView, bool showDialpad, QString dialpadText);
         void activateView(QString dialpadText);
     
     public:
--- a/logsui/logsapp/inc/logsviewmanager.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/inc/logsviewmanager.h	Tue Jul 06 14:16:36 2010 +0300
@@ -55,8 +55,10 @@
 
 public slots:
 
+    void changeRecentViewViaService(
+        LogsServices::LogsView view, bool showDialpad, QString dialpadText);
+    void changeMatchesViewViaService(QString dialpadText);
     void changeRecentView(LogsServices::LogsView view, bool showDialpad);
-    void changeMatchesView(QString dialpadText);
     
 public: // From LogsAbstractViewManager
     
@@ -75,13 +77,13 @@
     
 private:
     
-    void initViews();
     bool doActivateView(LogsAppViewId viewId, bool showDialpad, 
                         QVariant args, const QString& dialpadText = QString());
     bool loadActivity();
     LogsAppViewId checkMatchesViewTransition(
         LogsAppViewId viewId, const QString& dialpadText);
     void handleFirstActivation();
+    LogsBaseView* createView(LogsAppViewId viewId);
     
 private: //data 
     
--- a/logsui/logsapp/logsapp.pro	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/logsapp.pro	Tue Jul 06 14:16:36 2010 +0300
@@ -43,6 +43,7 @@
 HEADERS += inc/logseffecthandler.h
 HEADERS += inc/logspageindicator.h
 HEADERS += inc/logspageindicatoritem.h
+HEADERS += inc/logscomponentrepository.h
 
 SOURCES += src/main.cpp 
 SOURCES += src/logsmainwindow.cpp
--- a/logsui/logsapp/resources/matchesView.docml	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/resources/matchesView.docml	Tue Jul 06 14:16:36 2010 +0300
@@ -46,6 +46,7 @@
                 <icon iconName="qtg_mono_add_to_contact" name="icon"/>
                 <real name="z" value="2"/>
                 <sizehint height="9un" type="PREFERRED" width="22un"/>
+                <bool name="visible" value="FALSE"/>
             </widget>
             <widget name="container" type="HbWidget">
                 <widget name="logs_groupbox_matched_calls" type="HbGroupBox">
--- a/logsui/logsapp/resources/recentCallsView.docml	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/resources/recentCallsView.docml	Tue Jul 06 14:16:36 2010 +0300
@@ -57,7 +57,6 @@
                     <widget name="logs_groupbox_recent_calls" type="HbGroupBox">
                         <real name="z" value="1"/>
                         <bool name="collapsable" value="FALSE"/>
-                        <string locid="txt_dialer_subhead_recent_calls" name="heading" value="Recent calls"/>
                     </widget>
                     <widget name="logs_page_indicator" type="LogsPageIndicator">
                         <real name="z" value="2"/>
--- a/logsui/logsapp/src/logsbaseview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsbaseview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -43,7 +43,8 @@
 #include <QGraphicsLinearLayout>
 #include <hbpushbutton.h>
 #include <hbactivitymanager.h>
-
+#include <hbmodeliterator.h>
+#include <hbscrollbar.h>
 
 Q_DECLARE_METATYPE(LogsCall*)
 Q_DECLARE_METATYPE(LogsMessage*)
@@ -70,7 +71,8 @@
       mMessage(0),
       mContact(0),
       mDetailsModel(0),
-      mCallTypeMapper(0)
+      mCallTypeMapper(0),
+      mOptionsMenu(0)
 {
     LOGS_QDEBUG( "logs [UI] -> LogsBaseView::LogsBaseView()" );
 
@@ -96,6 +98,7 @@
     delete mContact;
     delete mDetailsModel;    
     delete mCallTypeMapper;
+    delete mOptionsMenu;
 
     LOGS_QDEBUG( "logs [UI] <- LogsBaseView::~LogsBaseView()" );
 }
@@ -278,8 +281,6 @@
     mInitialized = true;
     initFilterMenu();
     addActionNamesToMap();
-    connect(menu(), SIGNAL(aboutToShow()), this, 
-            SLOT(closeEmptyMenu()), Qt::QueuedConnection);
 }
 
 // -----------------------------------------------------------------------------
@@ -336,7 +337,7 @@
         listView()->scrollTo( topIndex );
         listView()->setCurrentIndex( topIndex, QItemSelectionModel::Select );
         initiateCallback(topIndex); 
-    }  
+    }
     LOGS_QDEBUG( "logs [UI] <- LogsBaseView::callKeyPressed()" );
 }
 
@@ -366,32 +367,17 @@
 }
 
 // -----------------------------------------------------------------------------
-// LogsBaseView::closeEmptyMenu()
-// -----------------------------------------------------------------------------
-//
-void LogsBaseView::closeEmptyMenu()
-{
-    bool visibleActionsExist = false;
-    foreach (QAction* action, menu()->actions()) {
-        if  (action->isVisible()) {
-            visibleActionsExist = true ;
-        }
-    }
-    
-    if (!visibleActionsExist) {
-        menu()->close();
-    }
-}
-// -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
 void LogsBaseView::openDialpad()
 {
     LOGS_QDEBUG( "logs [UI] -> LogsBaseView::openDialpad()" );
+   
     updateCallButton();
     setDialpadPosition();
     mDialpad->openDialpad();
+    
     LOGS_QDEBUG( "logs [UI] <- LogsBaseView::openDialpad()" );
 }
 
@@ -402,16 +388,12 @@
 void LogsBaseView::openContactsApp()
 {
     LOGS_QDEBUG( "logs [UI] -> LogsBaseView::openContactsApp()" );
-    
-    // Need to do request in async manner, otherwise new phonebook ui process
-    // will be started due bug(?) in highway.
-    XQServiceRequest snd("com.nokia.services.phonebookappservices.Launch","launch()", false);
+    XQServiceRequest snd("com.nokia.services.phonebookappservices.Launch","launch()");
     XQRequestInfo info;
     info.setForeground(true);
     snd.setInfo(info);
     int retValue;
     snd.send(retValue);
-    
     LOGS_QDEBUG( "logs [UI] <- LogsBaseView::openContactsApp()" );
 }
 
@@ -1034,7 +1016,7 @@
 // Loads appropriate section from *.docml to resize list widget
 // -----------------------------------------------------------------------------
 //
-void LogsBaseView::updateListSize()
+void LogsBaseView::updateListSize( HbListView& list )
 {
     LOGS_QDEBUG( "logs [UI] -> LogsBaseView::updateListSize()" );
     QString newSection( logsViewDefaultSection );
@@ -1050,10 +1032,13 @@
         newSection = QString( logsViewDefaultSection );
     }
     
-    if (newSection != mLayoutSectionName) {
-        mLayoutSectionName = newSection;
-        LOGS_QDEBUG_2( "logs [UI]  loading new section: ", newSection );
-        mRepository.loadSection( viewId(), newSection );
+    bool sectionChanged( mLayoutSectionName != newSection );
+    mLayoutSectionName = newSection;
+    LOGS_QDEBUG_2( "logs [UI]  loading new section: ", newSection );
+    mRepository.loadSection( viewId(), newSection );
+    
+    if ( sectionChanged ){
+        ensureListPositioning( list );
     }
     
     LOGS_QDEBUG( "logs [UI] <- LogsBaseView::updateListSize()" );
@@ -1202,3 +1187,87 @@
     return ( mDialpad->isOpen() && !mDialpad->editor().text().isEmpty() );
 }
 
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsBaseView::ensureListPositioning( HbListView& list )
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsBaseView::ensureListPositioning()" );
+
+    HbWidget* content = 
+        qobject_cast<HbWidget*>( mRepository.findWidget( logsContentId ) );
+    QList<HbAbstractViewItem *> visibleItems = list.visibleItems();
+    if ( content && visibleItems.count() > 0 ){
+        LOGS_QDEBUG_2( "logs [UI]   contentsRect:", content->contentsRect() );
+        QRectF rect = content->contentsRect();
+        rect.adjust( 0, list.pos().y(), 0, -list.pos().y() );
+        LOGS_QDEBUG_2( "logs [UI]   listRect:", rect );
+        list.setGeometry(rect);
+        
+        HbScrollArea::ScrollBarPolicy prevPolicy = list.verticalScrollBarPolicy();
+        list.setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);
+        list.setVerticalScrollBarPolicy(prevPolicy);
+        
+        qreal itemHeight = visibleItems.at(0)->size().height();
+        HbModelIterator* modelIt = list.modelIterator();
+        if ( modelIt && itemHeight > 0 ) {
+            int maxVisibleItems = rect.height() / itemHeight;
+            LOGS_QDEBUG_2( "logs [UI]   max visible items:", maxVisibleItems );
+            if ( modelIt->indexCount() <= maxVisibleItems ){
+                // All items can fit the rect reserved for the list, force them to fit
+                list.ensureVisible(QPointF(0,0));
+            } else if ( visibleItems.count() < maxVisibleItems ) {
+                // All items cannot fit the rect reserved, force to reserve whole
+                // area so that current index is tried to be centered
+                list.scrollTo(list.currentIndex(), HbAbstractItemView::PositionAtCenter);
+            }
+        }
+    }
+    LOGS_QDEBUG( "logs [UI] <- LogsBaseView::ensureListPositioning()" );
+}
+
+// -----------------------------------------------------------------------------
+// LogsBaseView::scrollToTopItem
+// -----------------------------------------------------------------------------
+//
+void LogsBaseView::scrollToTopItem( HbListView* list )
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsBaseView::scrollToTopItem()" );
+    
+    if ( list && list->verticalScrollBar() ){
+        list->verticalScrollBar()->setValue(0.0);
+    }
+    
+    LOGS_QDEBUG( "logs [UI] <- LogsBaseView::scrollToTopItem()" );
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsBaseView::updateMenuVisibility()
+{
+   bool visibleActionsExist = false;
+   HbMenu* optionsMenu = mOptionsMenu ? mOptionsMenu : menu();
+   foreach (QAction* action, optionsMenu->actions()) {
+       if  (action->isVisible()) {
+           visibleActionsExist = true;
+       }
+   }
+   setMenuVisible(visibleActionsExist);
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsBaseView::setMenuVisible(bool visible)
+{
+    if (!visible && !mOptionsMenu) {
+        mOptionsMenu = takeMenu();
+    } else if (visible && mOptionsMenu) {
+        setMenu(mOptionsMenu);
+        mOptionsMenu = 0;
+    }
+}
--- a/logsui/logsapp/src/logscomponentrepository.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logscomponentrepository.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -29,21 +29,28 @@
 #include <dialpad.h>
 #include <dialpadkeyhandler.h>
 #include <hbtoolbar.h>
+#include <hbmainwindow.h>
+#include <QTimer>
+
+const int logsRepositoryLazyInitTimerMsec = 3000;
 
 // -----------------------------------------------------------------------------
 // 
 // -----------------------------------------------------------------------------
 //
 LogsComponentRepository::LogsComponentRepository(LogsAbstractViewManager& viewManager)
-    : HbDocumentLoader(),
+    : QObject(), 
+      HbDocumentLoader(),
       mViewManager(viewManager),
       mRecentCallsView(0),
       mDetailsView(0),
       mMatchesView(0),
       mDialpad(0),
-      mDialpadKeyHandler(0)
+      mDialpadKeyHandler(0),
+      mCurrentObjectTree(0)
 {
-    mModel = new LogsModel(LogsModel::LogsRecentModel);
+    mModel = new LogsModel(LogsModel::LogsRecentModel, ETrue);
+    QTimer::singleShot(logsRepositoryLazyInitTimerMsec, this, SLOT(lazyInit()));
 }
 
 // -----------------------------------------------------------------------------
@@ -85,22 +92,16 @@
 // 
 // -----------------------------------------------------------------------------
 //
-LogsRecentCallsView* LogsComponentRepository::recentCallsView()
+LogsRecentCallsView* LogsComponentRepository::recentCallsView(bool onlyInit)
 {
     LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::recentCallsView()" );
-    setObjectTreeToView( LogsRecentViewId );
     
     if ( !mRecentCallsView ) {
-        bool ok = false;
-        mRecentViewComponents = load( logsRecentCallsViewFile, &ok );
-        if ( ok ) {
-            mRecentCallsView = qobject_cast<LogsRecentCallsView*>
-                ( findWidget(logsRecentCallsViewId) );
-            
-            addToolbarToObjectList(mRecentViewComponents);
-        } else {
-            LOGS_QCRITICAL( "logs [UI] XML loading failed..." );
-        }         
+        mRecentCallsView = qobject_cast<LogsRecentCallsView*>(doLoadView( 
+            logsRecentCallsViewFile, logsRecentCallsViewId, 
+            mRecentViewComponents, LogsRecentViewId, onlyInit));
+    } else if ( !onlyInit ){
+        setObjectTreeToView( LogsRecentViewId );
     }
      
     LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::recentCallsView()" );
@@ -111,23 +112,18 @@
 // 
 // -----------------------------------------------------------------------------
 //
-LogsDetailsView* LogsComponentRepository::detailsView()
+LogsDetailsView* LogsComponentRepository::detailsView(bool onlyInit)
 {
-    LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::detailsView()" );   
-    setObjectTreeToView( LogsDetailsViewId );
-    
+    LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::detailsView()" ); 
+
     if ( !mDetailsView ) {
-        bool ok = false;
-        mDetailsViewComponents = load( logsDetailsViewFile, &ok );
-        if ( ok ) {
-            mDetailsView = qobject_cast<LogsDetailsView*>
-                ( findWidget(logsDetailsViewId) );
-            
-            addToolbarToObjectList(mDetailsViewComponents);
-        } else {
-            LOGS_QCRITICAL( "logs [UI] XML loading failed..." );
-        }         
+        mDetailsView = qobject_cast<LogsDetailsView*>(doLoadView( 
+            logsDetailsViewFile, logsDetailsViewId, 
+            mDetailsViewComponents, LogsDetailsViewId, onlyInit));
+    } else if ( !onlyInit ){
+        setObjectTreeToView( LogsDetailsViewId );
     }
+    
     LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::detailsView()" );
     return mDetailsView;
 }
@@ -136,22 +132,16 @@
 // 
 // -----------------------------------------------------------------------------
 //
-LogsMatchesView* LogsComponentRepository::matchesView()
+LogsMatchesView* LogsComponentRepository::matchesView(bool onlyInit)
 {
     LOGS_QDEBUG( "logs [UI] -> LogsComponentRepository::matchedCallsView()" );
-    setObjectTreeToView( LogsMatchesViewId );
 
     if ( !mMatchesView ) {
-        bool ok = false;
-        mMatchesViewComponents = load( logsMatchedCallsViewFile, &ok );
-        if ( ok ) {
-            mMatchesView = qobject_cast<LogsMatchesView*>
-                ( findWidget(logsMatchesViewId) );
-
-            addToolbarToObjectList(mMatchesViewComponents);
-        } else {
-            LOGS_QCRITICAL( "logs [UI] XML loading failed..." );
-        }         
+        mMatchesView = qobject_cast<LogsMatchesView*>(doLoadView( 
+            logsMatchedCallsViewFile, logsMatchesViewId, 
+            mMatchesViewComponents, LogsMatchesViewId, onlyInit));
+    } else if ( !onlyInit ){
+        setObjectTreeToView( LogsMatchesViewId );
     }
      
     LOGS_QDEBUG( "logs [UI] <- LogsComponentRepository::matchedCallsView()" );
@@ -188,12 +178,17 @@
 void  LogsComponentRepository::setObjectTreeToView( LogsAppViewId viewId )
 {
     reset();
+    QObjectList* objTree = 0;
     if ( viewId == LogsRecentViewId ) {
-        setObjectTree( mRecentViewComponents );
+        objTree = &mRecentViewComponents;
     } else if ( viewId == LogsDetailsViewId ) {
-        setObjectTree( mDetailsViewComponents );
+        objTree = &mDetailsViewComponents;
     } else if ( viewId == LogsMatchesViewId ) {
-        setObjectTree( mMatchesViewComponents );        
+        objTree = &mMatchesViewComponents;      
+    }
+    if ( objTree ){
+        setObjectTree( *objTree );
+        mCurrentObjectTree = objTree;
     }
 }
 
@@ -259,3 +254,43 @@
     return ok;
     }
 
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsComponentRepository::lazyInit()
+{
+    mModel->refreshData();
+    recentCallsView(true);
+    detailsView(true);
+    matchesView(true);
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+QGraphicsWidget* LogsComponentRepository::doLoadView( 
+    const QString &fileName, const QString &viewName, 
+    QObjectList& viewComponents, LogsAppViewId viewId, bool onlyInit)
+{
+    QObjectList* prevObjectTree = mCurrentObjectTree;
+    setObjectTreeToView( viewId );
+    
+    QGraphicsWidget* view = 0;
+    bool ok = false;
+    viewComponents = load( fileName, &ok );
+    if ( ok ) {
+        view = findWidget(viewName);
+        addToolbarToObjectList(viewComponents);
+    } else {
+       LOGS_QCRITICAL( "logs [UI] XML loading failed..." );
+    }  
+    
+    if ( onlyInit && prevObjectTree ){
+        LOGS_QDEBUG( "logs [UI] set back previous object tree" )   
+        mCurrentObjectTree = prevObjectTree;
+        setObjectTree( *mCurrentObjectTree );
+    }
+    return view;
+}
--- a/logsui/logsapp/src/logsdetailsview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsdetailsview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -97,6 +97,8 @@
     
     updateMenu();
     
+    scrollToTopItem(mListView);
+    
     LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::activated()" );
 }
 
@@ -390,7 +392,7 @@
     if ( mListView ) {
         updateMenu();
         updateListLayoutName(*mListView, true);
-        updateListSize();
+        updateListSize(*mListView);
     }
     LOGS_QDEBUG( "logs [UI] <- LogsDetailsView::updateWidgetsSizeAndLayout()" );
 }
--- a/logsui/logsapp/src/logseffecthandler.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logseffecthandler.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -31,6 +31,7 @@
 const int logsMoveNotPossibleAmount = 30;
 
 const int logsDissappearByMovingIndex = 0;
+const int logsPauseBetweenDissappearAndAppearIndex = 1;
 const int logsAppearByMovingIndex = 2;
 
 // -----------------------------------------------------------------------------
@@ -72,6 +73,7 @@
 
     connect(mMoveGroup, SIGNAL(currentAnimationChanged(QAbstractAnimation *)), 
             this, SLOT( moveAnimationChanged(QAbstractAnimation *)));
+    connect(mMoveGroup, SIGNAL(finished()), this, SIGNAL(appearByMovingComplete()) );
     connect(mFadeGroup, SIGNAL(currentAnimationChanged(QAbstractAnimation *)), 
             this, SLOT( fadeAnimationChanged(QAbstractAnimation *)));        
     
@@ -101,7 +103,8 @@
 //
 void LogsEffectHandler::moveAnimationChanged(QAbstractAnimation *currentAnimation)
 {
-    if ( mMoveGroup->indexOfAnimation(currentAnimation) == 1 ) {
+    int indexOfAnimation = mMoveGroup->indexOfAnimation(currentAnimation);
+    if (indexOfAnimation == logsPauseBetweenDissappearAndAppearIndex ) {
         emit dissappearByMovingComplete();
     }
 }
@@ -112,7 +115,8 @@
 //
 void LogsEffectHandler::fadeAnimationChanged(QAbstractAnimation *currentAnimation)
 {
-    if ( mFadeGroup->indexOfAnimation(currentAnimation) == 1 ) {
+    int indexOfAnimation = mFadeGroup->indexOfAnimation(currentAnimation);
+    if ( indexOfAnimation == logsPauseBetweenDissappearAndAppearIndex ) {
         emit dissappearByFadingComplete();
     }
 }
@@ -137,12 +141,13 @@
 //
 void LogsEffectHandler::startDissappearAppearByMovingEffect(
         QObject& effectTarget, QObject& secondaryEffectTarget, 
-        bool dissappearToLeft, int origX)
+        bool dissappearToLeft, int origX, int secondaryOrigX)
 {
     doStartDissappearAppearByMovingEffect(
             *mMoveGroup, effectTarget, dissappearToLeft, origX);
+    
     doStartDissappearAppearByMovingEffect(
-            *mMoveGroup2, secondaryEffectTarget, dissappearToLeft, origX);
+            *mMoveGroup2, secondaryEffectTarget, dissappearToLeft, secondaryOrigX);
 }
 
 // -----------------------------------------------------------------------------
--- a/logsui/logsapp/src/logsmainwindow.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsmainwindow.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -26,9 +26,6 @@
 //
 LogsMainWindow::LogsMainWindow() : HbMainWindow(), mForeground(false)
 {
-    if ( viewport() ){
-        viewport()->grabGesture(Qt::SwipeGesture);
-    }
 }
 
 // -----------------------------------------------------------------------------
@@ -37,9 +34,6 @@
 //
 LogsMainWindow::~LogsMainWindow()
 {
-    if ( viewport() ){
-        viewport()->ungrabGesture(Qt::SwipeGesture);
-    }
 }
 
 // -----------------------------------------------------------------------------
--- a/logsui/logsapp/src/logsmatchesview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsmatchesview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -45,7 +45,8 @@
     : LogsBaseView(LogsMatchesViewId, repository, viewManager),
       mListView(0),
       mModel(0),
-      mAddToContactsButton(0)
+      mAddToContactsButton(0),
+      mAddToContactsButtonDisabled(false)
 {
     LOGS_QDEBUG( "logs [UI] <-> LogsMatchesView::LogsMatchesView()" );
     
@@ -69,7 +70,10 @@
 //
 void LogsMatchesView::activated(bool showDialer, QVariant args)
 {
-    //base class handling first
+    // Disable add to contacts button handling while view is activated
+    // to avoid unnecessary quick appear/dissappear of it.
+    mAddToContactsButtonDisabled = true;
+    
     LogsBaseView::activated(showDialer, args);
     
     LogsMatchesModel* model = qVariantValue<LogsMatchesModel*>(args);
@@ -77,6 +81,10 @@
     dialpadEditorTextChanged();
     
     activateEmptyListIndicator(mModel);
+    
+    scrollToTopItem(mListView);
+    
+    mAddToContactsButtonDisabled = false;
 }
 
 // -----------------------------------------------------------------------------
@@ -190,8 +198,9 @@
 void LogsMatchesView::handleBackSoftkey()
 {
     LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::::handleBackSoftkey()" );
- 
+    mDialpad->editor().blockSignals(true);
     mDialpad->editor().setText(QString());
+    mDialpad->editor().blockSignals(false);
     
     if (mDialpad->isOpen()){
         LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::::handleBackSoftkey() closeDialpad" );
@@ -201,7 +210,7 @@
         mDialpad->closeDialpad();
         mDialpad->blockSignals(false);
     }
-    
+
     LogsBaseView::handleBackSoftkey();
 
     LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::::handleBackSoftkey()" );
@@ -213,6 +222,7 @@
 //
 void LogsMatchesView::dialpadEditorTextChanged()
 {
+    LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::::dialpadEditorTextChanged()" );
     updateCallButton();
     updateMenu();
     
@@ -223,6 +233,7 @@
     } else if ( mModel ) {
         mModel->logsMatches( pattern );
     }
+    LOGS_QDEBUG_2( "logs [UI] <- LogsMatchesView::::dialpadEditorTextChanged(), text: ", pattern );
 }
 
 // -----------------------------------------------------------------------------
@@ -257,7 +268,7 @@
     if ( mListView ) {
         updateMenu();
         updateListLayoutName(*mListView);
-        updateListSize();
+        updateListSize(*mListView);
     }
     LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::updateWidgetsSizeAndLayout()" );
 }
@@ -295,9 +306,9 @@
 {
     LOGS_QDEBUG( "logs [UI] -> LogsMatchesView::updateMenu()" );
     
-    updateDialpadCallAndMessagingActions();
-    
+    updateDialpadCallAndMessagingActions();    
     updateContactSearchAction();
+    updateMenuVisibility();
 	
     LOGS_QDEBUG( "logs [UI] <- LogsMatchesView::updateMenu()" );
 }
@@ -311,6 +322,7 @@
     if (mAddToContactsButton) {
         LOGS_QDEBUG( "logs [UI] <-> LogsMatchesView::updateAddContactButton()" );
         bool matchesFound(model() && (model()->rowCount() > 0));
-        mAddToContactsButton->setVisible(!matchesFound && isDialpadInput());
+        mAddToContactsButton->setVisible(
+            !mAddToContactsButtonDisabled && !matchesFound && isDialpadInput() );
     }
 }
--- a/logsui/logsapp/src/logsrecentcallsview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsrecentcallsview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -65,10 +65,12 @@
       mMoveLeftInList(false),
       mEffectHandler(0),
       mListViewX(0),
+      mEmptyListLabelX(0),
       mMatchesModel(0),
       mMarkingMissedAsSeen(false),
       mPageIndicator(0),
-      mFirstActivation(true)
+      mFirstActivation(true),
+      mListScrollBarPolicy(HbScrollArea::ScrollBarAutoHide)
 {
     LOGS_QDEBUG( "logs [UI] <-> LogsRecentCallsView::LogsRecentCallsView()" );
     mModel = mRepository.model();
@@ -130,6 +132,10 @@
 
     mFirstActivation = false;
     
+    if (mEmptyListLabel) {
+        mEmptyListLabelX = mEmptyListLabel->pos().x();
+    }
+  
     LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::activated()" );  
 }
 
@@ -213,7 +219,8 @@
             this, SLOT(dissappearByMovingComplete()));
     connect(mEffectHandler, SIGNAL(dissappearByFadingComplete()), 
             this, SLOT(dissappearByFadingComplete()));
-    
+    connect(mEffectHandler, SIGNAL(appearByMovingComplete()), 
+            this, SLOT(appearByMovingComplete()));
     mPageIndicator = qobject_cast<LogsPageIndicator*>
                         (mRepository.findWidget(logsPageIndicatorId));
     
@@ -440,6 +447,8 @@
     mListViewX = mListView->pos().x();
     
     grabGesture(Qt::SwipeGesture);
+    
+    mListScrollBarPolicy = mListView->verticalScrollBarPolicy();
 
     LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::initListWidget() " );
 }
@@ -464,7 +473,7 @@
         
         mListView->setModel( mFilter );//ownership not transferred
         
-        scrollToTopItem();
+        scrollToTopItem(mListView);
         
         activateEmptyListIndicator(mFilter);
          
@@ -569,7 +578,8 @@
         if (model() && model()->rowCount() > 0) {
             mEffectHandler->startMoveNotPossibleEffect(*mListView, false, mListViewX);
         } else {
-            mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, false, mListViewX);
+            mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, 
+                    false, mEmptyListLabelX);
         }
     }
     LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::leftFlick()" );
@@ -590,7 +600,8 @@
         if (model() && model()->rowCount() > 0) {
             mEffectHandler->startMoveNotPossibleEffect(*mListView, true, mListViewX);
         } else {
-            mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, true, mListViewX);
+            mEffectHandler->startMoveNotPossibleEffect(*mEmptyListLabel, 
+                    true, mEmptyListLabelX);
         }
     }
     LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::rightFlick()" );
@@ -613,11 +624,13 @@
     }
     
     mMoveLeftInList = mConversionMap.value(view) < mConversionMap.value(mCurrentView);
-
     mAppearingView = view;
+    // Disable scrollbar while moving the list for more nice looks
+    mListView->setVerticalScrollBarPolicy(HbScrollArea::ScrollBarAlwaysOff);  
     mEffectHandler->startDissappearAppearByFadingEffect(*mViewName);
     mEffectHandler->startDissappearAppearByMovingEffect(
-            *mListView, *mEmptyListLabel, !mMoveLeftInList, mListViewX);
+            *mListView, *mEmptyListLabel, !mMoveLeftInList, 
+             mListViewX, mEmptyListLabelX);
 
     mPageIndicator->setActiveItemIndex(mConversionMap.value(mAppearingView));
     
@@ -647,11 +660,26 @@
 {
     LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::dissappearByMovingComplete()" )
     
-    updateView( mAppearingView );
+    updateView( mAppearingView ); 
     
     LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::dissappearByMovingComplete()" )
 }
 
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void LogsRecentCallsView::appearByMovingComplete()
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::appearByMovingComplete()" )
+    
+    // Restore scrollbar which was hidden when animation started
+    mListView->setVerticalScrollBarPolicy(mListScrollBarPolicy);
+    
+    LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::appearByMovingComplete()" )
+}
+
 // -----------------------------------------------------------------------------
 // LogsRecentCallsView::updateMenu
 // -----------------------------------------------------------------------------
@@ -673,6 +701,8 @@
     updateDialpadCallAndMessagingActions();
     updateContactSearchAction();
     
+    updateMenuVisibility();
+    
     LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::updateMenu()" );
 }
 
@@ -697,7 +727,7 @@
     if ( mListView ) {
         updateMenu();
         updateListLayoutName(*mListView);
-        updateListSize();
+        updateListSize(*mListView);
         LogsConfigurationParams param;
         param.setListItemTextWidth( getListItemTextWidth() );
         mModel->updateConfiguration(param);
@@ -785,18 +815,3 @@
     }
     return mMarkingMissedAsSeen;
 }
-
-// -----------------------------------------------------------------------------
-// LogsRecentCallsView::scrollToTopItem
-// -----------------------------------------------------------------------------
-//
-void LogsRecentCallsView::scrollToTopItem()
-{
-    LOGS_QDEBUG( "logs [UI] -> LogsRecentCallsView::scrollToTopItem()" );
-    disconnect( mFilter, SIGNAL(rowsInserted(const QModelIndex&,int,int)), 
-                this, SLOT(scrollToTopItem()));
-    if ( mFilter && mFilter->hasIndex(0,0) ) {
-        mListView->scrollTo( mFilter->index(0,0) );
-    }
-    LOGS_QDEBUG( "logs [UI] <- LogsRecentCallsView::scrollToTopItem()" );
-}
--- a/logsui/logsapp/src/logsservicehandler.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsservicehandler.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -82,7 +82,7 @@
     if (!dialpadText.isEmpty()) {
         emit activateView(dialpadText);
     } else {
-        emit activateView((LogsServices::LogsView)activatedView, showDialpad);
+        emit activateView((LogsServices::LogsView)activatedView, showDialpad, dialpadText);
     }
     LOGS_QDEBUG( "logs [UI] <- LogsServiceHandler::show()" )
     return 0;
--- a/logsui/logsapp/src/logsservicehandlerold.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsservicehandlerold.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -69,7 +69,7 @@
     LOGS_QDEBUG( "logs [UI]     Bring app to foreground" )
     mMainWindow.bringAppToForeground();
     
-    emit activateView((LogsServices::LogsView)activatedView, showDialpad);
+    emit activateView((LogsServices::LogsView)activatedView, showDialpad, QString());
 
     LOGS_QDEBUG( "logs [UI] <- LogsServiceHandlerOld::start()" )
     return 0;
--- a/logsui/logsapp/src/logsviewmanager.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/src/logsviewmanager.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -56,19 +56,18 @@
             this, SLOT(handleOrientationChanged()) );
 
     mComponentsRepository = new LogsComponentRepository(*this);
-    initViews();
     
-    connect( &mService, SIGNAL( activateView(LogsServices::LogsView, bool) ), 
-             this, SLOT( changeRecentView(LogsServices::LogsView, bool) ) );
+    connect( &mService, SIGNAL( activateView(LogsServices::LogsView, bool, QString) ), 
+             this, SLOT( changeRecentViewViaService(LogsServices::LogsView, bool, QString) ) );
 
     connect( &mService, SIGNAL( activateView(QString) ), 
-             this, SLOT( changeMatchesView(QString) ));
+             this, SLOT( changeMatchesViewViaService(QString) ));
 
-    connect( &mServiceOld, SIGNAL( activateView(LogsServices::LogsView, bool) ), 
-             this, SLOT( changeRecentView(LogsServices::LogsView, bool) ) );
+    connect( &mServiceOld, SIGNAL( activateView(LogsServices::LogsView, bool, QString) ), 
+             this, SLOT( changeRecentViewViaService(LogsServices::LogsView, bool, QString) ) );
 
     connect( &mServiceOld, SIGNAL( activateView(QString) ), 
-             this, SLOT( changeMatchesView(QString) ));
+             this, SLOT( changeMatchesViewViaService(QString) ));
     
     QObject::connect(qApp, SIGNAL(aboutToQuit()), this, SLOT(saveActivity()));
 
@@ -92,55 +91,40 @@
 }
 
 // -----------------------------------------------------------------------------
-// LogsViewManager::initViews
+// LogsViewManager::changeRecentViewViaService
 // -----------------------------------------------------------------------------
 //
-void LogsViewManager::initViews()
+void LogsViewManager::changeRecentViewViaService(
+    LogsServices::LogsView view, bool showDialpad, QString dialpadText)
 {
-    LOGS_QDEBUG( "logs [UI] -> LogsViewManager::initViews()" );
-    
-    // Don't activate any view, app focus gaining or service request
-    // will cause view activation
-    //
-    LogsRecentCallsView* view = mComponentsRepository->recentCallsView();    
-    Q_ASSERT_X(view != 0, "logs [UI] ", "recentCallsView not found!");
-    LOGS_QDEBUG( "logs [UI] adding view" );
-    mViewStack.append(view);
-    mMainWindow.addView(view);
-        
-    LogsDetailsView* detailsView = mComponentsRepository->detailsView();
-    mViewStack.append(detailsView);
-    mMainWindow.addView(detailsView);
-    
-    LogsMatchesView* matchesView = mComponentsRepository->matchesView();
-    mViewStack.append(matchesView);
-    mMainWindow.addView(matchesView);
+    mComponentsRepository->dialpad()->editor().setText(dialpadText);
+    changeRecentView(view, showDialpad);
+}
 
-    LOGS_QDEBUG( "logs [UI] <- LogsViewManager::initViews()" );
+// -----------------------------------------------------------------------------
+// LogsViewManager::changeMatchesViewViaService
+// -----------------------------------------------------------------------------
+//
+void LogsViewManager::changeMatchesViewViaService(QString dialpadText)
+{
+    LOGS_QDEBUG( "logs [UI] -> LogsViewManager::changeMatchesView()" );
+    mComponentsRepository->dialpad()->editor().setText(dialpadText);
+    doActivateView(LogsMatchesViewId, true, QVariant());
+    LOGS_QDEBUG( "logs [UI] <- LogsViewManager::changeMatchesView()" );
 }
 
 // -----------------------------------------------------------------------------
 // LogsViewManager::changeRecentView
 // -----------------------------------------------------------------------------
 //
-void LogsViewManager::changeRecentView(LogsServices::LogsView view, bool showDialpad)
+void LogsViewManager::changeRecentView(
+    LogsServices::LogsView view, bool showDialpad)
 {
     QVariant args(view);
     doActivateView(LogsRecentViewId, showDialpad, args);
 }
 
 // -----------------------------------------------------------------------------
-// LogsViewManager::changeMatchesView
-// -----------------------------------------------------------------------------
-//
-void LogsViewManager::changeMatchesView(QString dialpadText)
-{
-    LOGS_QDEBUG( "logs [UI] -> LogsViewManager::changeMatchesView()" );
-    doActivateView(LogsMatchesViewId, true, QVariant(), dialpadText);
-    LOGS_QDEBUG( "logs [UI] <- LogsViewManager::changeMatchesView()" );
-}
-
-// -----------------------------------------------------------------------------
 // LogsViewManager::proceedExit
 // -----------------------------------------------------------------------------
 //
@@ -148,11 +132,6 @@
 {
     LOGS_QDEBUG( "logs [UI] -> LogsViewManager::proceedExit()" );
     
-    // Instead of compressing data, exit the application for real because
-    // of bug in wk16 platform which prevents bg/fg switching of the app.
-    //
-    
-    //mComponentsRepository->model()->compressData();
     qApp->quit();
     
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::proceedExit()" );
@@ -225,10 +204,9 @@
 //
 bool LogsViewManager::activatePreviousView()
 {
-    if ( mViewStack.count() < 2 ){
-        return false;
-    }
-    return doActivateView(mViewStack.at(1)->viewId(), false, QVariant());
+    LogsAppViewId viewId = ( mViewStack.count() > 1 ) ? 
+        mViewStack.at(1)->viewId() : LogsRecentViewId;
+    return doActivateView(viewId, false, QVariant());
 }
 
 // -----------------------------------------------------------------------------
@@ -255,6 +233,10 @@
         }
     }
     
+    if ( !newView ){
+        newView = createView(viewId);
+    }
+    
     if ( oldView && newView && oldView != newView ){   
         oldView->deactivated();
         disconnect( &mMainWindow, SIGNAL( callKeyPressed() ), oldView, 0 );
@@ -263,6 +245,9 @@
     if ( newView ){
         mViewStack.insert(0, newView);
         mMainWindow.setCurrentView(newView);
+        //Setting mainwindow interactive to enable user input during
+        //view switching animation.
+        mMainWindow.setInteractive(true);
         mViewActivationArgs = args;
         mViewActivationShowDialpad = showDialpad;
         completeViewActivation();
@@ -326,12 +311,23 @@
     }
     
     QVariantHash metaData;
-    metaData.insert("screenshot", QPixmap::grabWidget(&mMainWindow, mMainWindow.rect()));
+    
+    LOGS_QDEBUG( "logs [UI] Start taking screenshot" );
+    QImage* img = new QImage(mMainWindow.rect().size(), QImage::Format_ARGB32_Premultiplied);
+    QPainter p( img );
+    // Use render instead of QPixmap::grabWidget as otherwise screenshot
+    // may become empty.
+    mMainWindow.render( &p, mMainWindow.rect(), mMainWindow.rect() );
+    metaData.insert("screenshot", QPixmap::fromImage(*img));
+    delete img;
+    LOGS_QDEBUG( "logs [UI] End taking screenshot" );
     
     QByteArray serializedActivity;
     QDataStream stream(&serializedActivity, QIODevice::WriteOnly | QIODevice::Append);
     
     metaData.insert( 
+        logsActivityParamInternalViewId, mViewStack.at(0)->viewId() );
+    metaData.insert( 
         logsActivityParamShowDialpad, mComponentsRepository->dialpad()->isOpen() );
     metaData.insert( 
         logsActivityParamDialpadText, mComponentsRepository->dialpad()->editor().text() );
@@ -368,6 +364,16 @@
         }
     }
     
+    QList<QVariantHash> allParams = hbApp->activityManager()->activities();  
+    QVariantHash params = allParams.isEmpty() ? QVariantHash() : allParams.at(0);
+    LOGS_QDEBUG_2( "logs [UI] Activity params", params );
+            
+    if ( !matchingView ){
+        // Try if creating such view is possible
+        int viewId = params.value(logsActivityParamInternalViewId).toInt();
+        matchingView = createView(static_cast<LogsAppViewId>(viewId));
+    }
+    
     if ( matchingView ){
         // Should have only one param hash in the list, use first always
         QList<QVariantHash> allParams = hbApp->activityManager()->activities();  
@@ -394,8 +400,7 @@
     LogsAppViewId viewId, const QString& dialpadText)
 {
     if ( !dialpadText.isEmpty() ){
-        Dialpad* dialpad = mComponentsRepository->dialpad();
-        dialpad->editor().setText(dialpadText);
+        mComponentsRepository->dialpad()->editor().setText(dialpadText);
     }
     
     if ( viewId == LogsMatchesViewId ){
@@ -435,3 +440,23 @@
     }
     LOGS_QDEBUG( "logs [UI] <- LogsViewManager::handleFirstActivation()" );
 }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+LogsBaseView* LogsViewManager::createView(LogsAppViewId viewId)
+{
+    LogsBaseView* newView = 0;
+    if ( viewId == LogsRecentViewId ){
+        newView = mComponentsRepository->recentCallsView();
+        mMainWindow.addView(newView);
+    } else if ( viewId == LogsMatchesViewId ) {
+        newView = mComponentsRepository->matchesView();
+        mMainWindow.addView(newView);
+    } else if ( viewId == LogsDetailsViewId ) {
+        newView = mComponentsRepository->detailsView();
+        mMainWindow.addView(newView);
+    }
+    return newView;
+}
--- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsbaseview.h	Tue Jul 06 14:16:36 2010 +0300
@@ -67,7 +67,8 @@
     void testInitiateCallback();
     void testShowListItemMenu();
     void testPopulateListItemMenu();
-    void testCloseEmptyMenu();
+    void testUpdateMenuVisibility();
+    void testSetMenuVisible();
     void testSaveContact();
     void testUpdateCall();
     void testUpdateMessage();
@@ -89,6 +90,7 @@
     void testSaveActivity();
     void testLoadActivity();
     void testClearActivity();
+    void testEnsureListPositioning();
     
 private:
  
--- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logscomponentrepository.h	Tue Jul 06 14:16:36 2010 +0300
@@ -56,6 +56,7 @@
     void testDialpad();
     void testLoadSection();
     void testAddToolbarToObjectList();
+    void testLazyInit();
     
 private:
  
--- a/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/inc/ut_logsviewmanager.h	Tue Jul 06 14:16:36 2010 +0300
@@ -53,6 +53,7 @@
     void testConstructorDestructor();
     void testActivateView();
     void testchangeMatchesView();
+    void testchangeRecentView();
     void testExitApplication();
     void testStartingWithService();
     void testHandleOrientationChanged();
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsbaseview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsbaseview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -80,6 +80,7 @@
     QVERIFY( !mBaseView->mMessage );
     QVERIFY( !mBaseView->mContact );
     QVERIFY( !mBaseView->mCallTypeMapper );
+    QVERIFY( !mBaseView->mOptionsMenu );
 }
 
 void UT_LogsBaseView::testActivated()
@@ -273,30 +274,71 @@
     QVERIFY( HbStubHelper::widgetActionsCount() == 5 );
 }
 
-
-
-void UT_LogsBaseView::testCloseEmptyMenu()
+void UT_LogsBaseView::testUpdateMenuVisibility()
 {
-    LogsRecentCallsView* view = mRepository->recentCallsView();
-    
-    //visible actions exist
-    QVERIFY( view->menu()->actions().count() > 0 );
-    HbStubHelper::setWidgetOpen(true);
-    view->closeEmptyMenu();
-    QVERIFY(HbStubHelper::isWidgetOpen());
+    HbMenu* menu = new HbMenu;
+    HbAction* action = menu->addAction("action1");
+    mBaseView->setMenu(menu);
     
-    //no visible actions
-    foreach (QAction* action, view->menu()->actions()) {
-        action->setVisible(false);
-    }
-    view->closeEmptyMenu();
-    QVERIFY(!HbStubHelper::isWidgetOpen());
+    // No visible actions in menu => menu is replaced by empty one
+    QVERIFY(!mBaseView->mOptionsMenu);
+    QVERIFY(!mBaseView->menu()->isEmpty());
+    action->setVisible(false);
+    mBaseView->updateMenuVisibility();
+    QVERIFY(mBaseView->menu()->isEmpty());
+    QVERIFY(mBaseView->mOptionsMenu == menu);
+    QVERIFY(mBaseView->menu() != menu);
+  
+    // Visible action exists => restoring the menu
+    action->setVisible(true);
+    QVERIFY(mBaseView->mOptionsMenu);
+    mBaseView->updateMenuVisibility();
+    QVERIFY(!mBaseView->menu()->isEmpty());
+    QVERIFY(!mBaseView->mOptionsMenu);
+    QVERIFY(mBaseView->menu() == menu);
+ 
+    // Menu has no actions => menu is replaced by empty one
+    mBaseView->setMenu(0);
+    menu = mBaseView->menu();
+    QVERIFY(!mBaseView->mOptionsMenu);
+    QVERIFY(mBaseView->menu()->isEmpty());
+    mBaseView->updateMenuVisibility();
+    QVERIFY(mBaseView->menu()->isEmpty());
+    QVERIFY(mBaseView->mOptionsMenu == menu);
+    QVERIFY(mBaseView->menu() != menu);   
+}
+
+void UT_LogsBaseView::testSetMenuVisible()
+{
+    HbMenu* menu = new HbMenu;
+    menu->addAction("action1");
+    mBaseView->setMenu(menu);
     
-    //no actions
-    HbStubHelper::setWidgetOpen(true);
-    view->menu()->actions().clear();
-    view->closeEmptyMenu();
-    QVERIFY(!HbStubHelper::isWidgetOpen());
+    // Hiding menu, view menu is replaced by empty menu
+    QVERIFY(!mBaseView->mOptionsMenu);
+    QVERIFY(!mBaseView->menu()->isEmpty());
+    mBaseView->setMenuVisible(false);
+    QVERIFY(mBaseView->menu()->isEmpty());
+    QVERIFY(mBaseView->mOptionsMenu == menu);
+    QVERIFY(mBaseView->menu() != menu);
+        
+    // Trying to hide again, nothing happens
+    mBaseView->setMenuVisible(false);
+    QVERIFY(mBaseView->menu()->isEmpty());
+    QVERIFY(mBaseView->mOptionsMenu == menu);
+    QVERIFY(mBaseView->menu() != menu);
+    
+    // Showing menu, original menu is restored
+    mBaseView->setMenuVisible(true);
+    QVERIFY(!mBaseView->menu()->isEmpty());
+    QVERIFY(!mBaseView->mOptionsMenu);
+    QVERIFY(mBaseView->menu() == menu);
+    
+    // Showing again, nothing happen
+    mBaseView->setMenuVisible(true);
+    QVERIFY(!mBaseView->menu()->isEmpty());
+    QVERIFY(!mBaseView->mOptionsMenu);
+    QVERIFY(mBaseView->menu() == menu);    
 }
 
 void UT_LogsBaseView::testSaveContact()
@@ -409,23 +451,24 @@
     mBaseView->mLayoutSectionName = "dummy";
     
     //default section is loaded
+    HbListView view;
     mBaseView->mViewManager.mainWindow().setOrientation( Qt::Vertical );
     mBaseView->mDialpad->closeDialpad();
-    mBaseView->updateListSize();
+    mBaseView->updateListSize(view);
     QVERIFY( mBaseView->mLayoutSectionName == logsViewDefaultSection );
     
     //same section again, not loaded
-    mBaseView->updateListSize();
+    mBaseView->updateListSize(view);
     QVERIFY( mBaseView->mLayoutSectionName == logsViewDefaultSection );
 
     //portrait with dialpad
     mBaseView->mDialpad->openDialpad();
-    mBaseView->updateListSize();
+    mBaseView->updateListSize(view);
     QVERIFY( mBaseView->mLayoutSectionName == logsViewPortraitDialpadSection );
     
     //landscape with dialpad
     mBaseView->mViewManager.mainWindow().setOrientation( Qt::Horizontal );
-    mBaseView->updateListSize();
+    mBaseView->updateListSize(view);
     QVERIFY( mBaseView->mLayoutSectionName == logsViewLandscapeDialpadSection );
 }
 
@@ -571,3 +614,75 @@
     mBaseView->clearActivity(*manager);
     QCOMPARE( manager->activities().count(), 0 );
 }
+
+void UT_LogsBaseView::testEnsureListPositioning()
+{
+    HbStubHelper::reset();
+    HbListView list;
+    QStringList itemTexts;
+    itemTexts.append( "foo1" );
+    itemTexts.append( "foo2" );
+    QStringListModel model;
+    model.setStringList(itemTexts);
+    
+    itemTexts.append( "foo3" );
+    itemTexts.append( "foo4" );
+    QStringListModel model2;
+    model2.setStringList(itemTexts);
+    
+    list.setModel(&model);
+    
+    // No content found, nop
+    mBaseView->ensureListPositioning(list);
+    QVERIFY( !HbStubHelper::listEnsureVisibleCalled() );
+    QVERIFY( !HbStubHelper::listScrollToCalled() );
+    
+    // Content found, no visible items, nop
+    mRepository->recentCallsView();
+    mBaseView->activated(false, QVariant());
+    mBaseView->ensureListPositioning(list);
+    QVERIFY( !HbStubHelper::listEnsureVisibleCalled() );
+    QVERIFY( !HbStubHelper::listScrollToCalled() );
+    
+    // Content found and visible items which can fit the screen, height of item zero, nop
+    HbWidget* content = 
+            qobject_cast<HbWidget*>( mRepository->findWidget( logsContentId ) );
+    content->setContentsMargins(0,0,0,0);
+    content->setGeometry( QRectF(0,0,100,200) );
+    
+    HbListViewItem* item = new HbListViewItem;
+    HbStubHelper::listItems().append(item);
+    HbListViewItem* item2 = new HbListViewItem;
+    HbStubHelper::listItems().append(item2);
+    mBaseView->ensureListPositioning(list);
+    QVERIFY( !HbStubHelper::listEnsureVisibleCalled() );
+    QVERIFY( !HbStubHelper::listScrollToCalled() );
+    
+    // Screen is already filled with items, nop
+    list.setModel(&model2);
+    HbListViewItem* item3 = new HbListViewItem;
+    HbStubHelper::listItems().append(item3);
+    item->setGeometry(QRectF(0,0,100,100));
+    item2->setGeometry(QRectF(0,0,100,100));
+    item3->setGeometry(QRectF(0,0,100,100));
+    mBaseView->ensureListPositioning(list);
+    QVERIFY( !HbStubHelper::listEnsureVisibleCalled() );
+    QVERIFY( !HbStubHelper::listScrollToCalled() );
+       
+    // Content found and visible items which can fit the screen, all items ensured visible
+    list.setModel(&model);
+    delete HbStubHelper::listItems().takeLast();
+    mBaseView->ensureListPositioning(list);
+    QVERIFY( HbStubHelper::listEnsureVisibleCalled() );
+    QVERIFY( !HbStubHelper::listScrollToCalled() );
+    
+    // Content found and more visible items which can fit the screen and currently screen
+    // is not full of items, ensure that area is filled by scrolling 
+    list.setModel(&model2);
+    list.setCurrentIndex(model2.index(0,0));
+    delete HbStubHelper::listItems().takeLast();
+    mBaseView->ensureListPositioning(list);
+    QVERIFY( HbStubHelper::listEnsureVisibleCalled() );
+    QVERIFY( HbStubHelper::listScrollToCalled() );
+
+}
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logscomponentrepository.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -151,3 +151,19 @@
     QVERIFY( mRepository->mRecentViewComponents.at(0)->objectName() == logsToolbarId );
     delete view;
 }
+
+void UT_LogsComponentRepository::testLazyInit()
+{
+    QObjectList dummyObjList;
+    mRepository->mCurrentObjectTree = &dummyObjList;
+    QVERIFY( !mRepository->mRecentCallsView );
+    QVERIFY( !mRepository->mDetailsView );
+    QVERIFY( !mRepository->mMatchesView );
+    QVERIFY( !mRepository->model()->mRefreshCalled );
+    mRepository->lazyInit();
+    QVERIFY( mRepository->mRecentCallsView );
+    QVERIFY( mRepository->mDetailsView );
+    QVERIFY( mRepository->mMatchesView );
+    QVERIFY( mRepository->model()->mRefreshCalled );
+    QVERIFY( mRepository->mCurrentObjectTree == &dummyObjList );
+}
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logseffecthandler.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -77,7 +77,7 @@
 void UT_LogsEffectHandler::testStartDissappearAppearByMovingEffect()
 {
     QVERIFY( mEffect->mMoveGroup->state() == QAbstractAnimation::Stopped );
-    mEffect->startDissappearAppearByMovingEffect(*mLabel, *mLabel2, false, 0);
+    mEffect->startDissappearAppearByMovingEffect(*mLabel, *mLabel2, false, 0, 0);
     QVERIFY( mEffect->mMoveGroup->state() == QAbstractAnimation::Running );
     QVERIFY( mEffect->mMoveGroup2->state() == QAbstractAnimation::Running );
     
@@ -90,7 +90,7 @@
     QVERIFY(spy.count() == 1 );
     
     // When effect is running and new effect is requested, previous effect is stopped
-    mEffect->startDissappearAppearByMovingEffect(*mLabel, *mLabel2, true, 0); 
+    mEffect->startDissappearAppearByMovingEffect(*mLabel, *mLabel2, true, 0, 0); 
 }
 
 void UT_LogsEffectHandler::testStartMoveNotPossibleEffect()
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsmatchesview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -90,6 +90,7 @@
     QVERIFY( mMatchesView->mListView->layoutName() == logsListDefaultLayout );
     QVERIFY( mMatchesView->mLayoutSectionName == logsViewDefaultSection );
     QVERIFY( mMatchesView->mAddToContactsButton );
+    QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() );
     
     //activate once again, model recreated
     mMatchesView->mViewManager.mainWindow().setOrientation( Qt::Horizontal );
@@ -101,6 +102,7 @@
     QVERIFY( mMatchesView->mActionMap.count() == 4 );
     QVERIFY( mMatchesView->mListView->layoutName() == logsListLandscapeDialpadLayout );
     QVERIFY( mMatchesView->mLayoutSectionName == logsViewLandscapeDialpadSection );
+    QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() );
     
     //Pass model as input arg
     LogsDbConnector* dbConnector = 0;
@@ -119,6 +121,7 @@
     QVERIFY( mMatchesView->mListView );
     QVERIFY( mMatchesView->mModel == model2 );
     QVERIFY( mMatchesView->mModel->mLastCall.isEmpty() );
+    QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() );
     
     // After passing model as input arg, do not pass model
     mMatchesView->activated( true,QVariant() );
@@ -366,6 +369,12 @@
     
     QVERIFY( mMatchesView->mEmptyListLabel->isVisible() );
     QVERIFY( mMatchesView->mAddToContactsButton->isVisible() );
+    
+    mMatchesView->mAddToContactsButtonDisabled = true;
+    mMatchesView->updateEmptyListWidgetsVisibility();
+    QVERIFY( mMatchesView->mEmptyListLabel->isVisible() );
+    QVERIFY( !mMatchesView->mAddToContactsButton->isVisible() );
+    
     delete mMatchesView->mEmptyListLabel;
     mMatchesView->mEmptyListLabel = 0;
     delete mMatchesView->mAddToContactsButton;
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsrecentcallsview.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -251,11 +251,15 @@
     HbAction*  action = new HbAction();
     action->setObjectName(logsShowFilterMissedMenuActionId);
     mRecentCallsView->changeFilter(action);
+    // Scrollbar is disbaled while changing the list and is restored when appearByMoving slot is called
+    QVERIFY( mRecentCallsView->mListView->verticalScrollBarPolicy() == HbScrollArea::ScrollBarAlwaysOff );
     
     // Because of effects, filter is not changed immediately, simulate effect completion
     QVERIFY( mRecentCallsView->mAppearingView == LogsServices::ViewMissed );
     mRecentCallsView->dissappearByMovingComplete();
-    QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::Missed );        
+    QVERIFY( mRecentCallsView->mFilter->filterType() == LogsFilter::Missed );   
+    mRecentCallsView->appearByMovingComplete();
+    QVERIFY( mRecentCallsView->mListView->verticalScrollBarPolicy() != HbScrollArea::ScrollBarAlwaysOff );
     
     delete action;
     delete mRecentCallsView->mListView;
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsservicehandler.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -89,7 +89,7 @@
 void UT_LogsServiceHandler::testStart()
 {
     qRegisterMetaType< LogsServices::LogsView >("LogsServices::LogsView");
-    QSignalSpy spy(mServiceOld, SIGNAL(activateView(LogsServices::LogsView, bool)));
+    QSignalSpy spy(mServiceOld, SIGNAL(activateView(LogsServices::LogsView, bool, QString)));
      
     // Wrong view
     QVERIFY( mServiceOld->start( 9999, true ) != 0 );
@@ -121,7 +121,7 @@
 void UT_LogsServiceHandler::testShow()
 {
     qRegisterMetaType< LogsServices::LogsView >("LogsServices::LogsView");
-    QSignalSpy spy(mService, SIGNAL(activateView(LogsServices::LogsView, bool)));
+    QSignalSpy spy(mService, SIGNAL(activateView(LogsServices::LogsView, bool, QString)));
     QSignalSpy spy2(mService, SIGNAL(activateView(QString)));
     QVariantMap map;
 
--- a/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/src/ut_logsviewmanager.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -68,37 +68,39 @@
 {
     QVERIFY( mLogsViewManager );
     QVERIFY( mLogsViewManager->mComponentsRepository );
-    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 3 );
+    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 1 );
     QVERIFY( mLogsViewManager->mMainWindow.currentView() != 0 );
     QVERIFY( static_cast<LogsBaseView*>( mLogsViewManager->mMainWindow.currentView() )->viewId() == LogsRecentViewId );
-    QVERIFY( mLogsViewManager->mViewStack.count() == 3 );
+    QVERIFY( mLogsViewManager->mViewStack.count() == 1 );
     
     delete mLogsViewManager;
     mLogsViewManager = 0;
     
     // Contructor when activity restoring started the app
+    delete mMainWindow;
+    mMainWindow = 0;
+    mMainWindow = new LogsMainWindow();
     HbStubHelper::setActivityReason(Hb::ActivationReasonActivity);
     mLogsViewManager = new LogsViewManager(*mMainWindow, *mService, *mServiceOld);
     QVERIFY( mLogsViewManager->mComponentsRepository );
-    QVERIFY( mLogsViewManager->mMainWindow.currentView() != 0 );
-    QVERIFY( static_cast<LogsBaseView*>( mLogsViewManager->mMainWindow.currentView() )->viewId() == LogsMatchesViewId );
-    QVERIFY( mLogsViewManager->mViewStack.count() == 3 );
+    QVERIFY( static_cast<LogsBaseView*>( mLogsViewManager->mMainWindow.currentView() )->viewId() == LogsRecentViewId );
+    QVERIFY( mLogsViewManager->mViewStack.count() == 1 );
     HbStubHelper::reset();
+}
 
-}
 
 void UT_LogsViewManager::testActivateView()
 {
     // Activate already active view
     QVERIFY( mLogsViewManager->activateView(LogsRecentViewId) );
     QVERIFY( mLogsViewManager->activateView(LogsRecentViewId) );
-    QCOMPARE( mLogsViewManager->mMainWindow.views().count(), 3 );
+    QCOMPARE( mLogsViewManager->mMainWindow.views().count(), 1 );
     QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
              mLogsViewManager->mComponentsRepository->recentCallsView() );
     
     // Activate other view
     QVERIFY( mLogsViewManager->activateView(LogsDetailsViewId) );
-    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 3 );
+    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 2 );
     QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
              mLogsViewManager->mComponentsRepository->detailsView() );
     QVERIFY( mLogsViewManager->mViewStack.at(0) == 
@@ -106,7 +108,7 @@
     
     // Try to activate unknown view
     QVERIFY( !mLogsViewManager->activateView(LogsUnknownViewId) );
-    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 3 );
+    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 2 );
     QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
              mLogsViewManager->mComponentsRepository->detailsView() );
     QVERIFY( mLogsViewManager->mViewStack.at(0) == 
@@ -114,7 +116,7 @@
     
     // Go back to previous view
     QVERIFY( mLogsViewManager->activatePreviousView() );
-    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 3 );
+    QVERIFY( mLogsViewManager->mMainWindow.views().count() == 2 );
     QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
              mLogsViewManager->mComponentsRepository->recentCallsView() );
     QVERIFY( mLogsViewManager->mViewStack.at(0) == 
@@ -124,15 +126,32 @@
 void UT_LogsViewManager::testchangeMatchesView()
 {
     //Open Matches view, dialpad visible with predefined number
-    mLogsViewManager->changeMatchesView(QString("+123456"));
+    mLogsViewManager->changeMatchesViewViaService(QString("+123456"));
     QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
              mLogsViewManager->mComponentsRepository->matchesView() );
              
     // Contact search disabled, go to recent calls view instead
     mLogsViewManager->mComponentsRepository->mModel->mPredectiveSearchStatus = 0;
-    mLogsViewManager->changeMatchesView(QString("+123456777"));
+    QString dialString("+123456777");
+    mLogsViewManager->changeMatchesViewViaService(dialString);
     QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
              mLogsViewManager->mComponentsRepository->recentCallsView() );
+    QVERIFY( mLogsViewManager->mComponentsRepository->mDialpad->mLineEdit->text() == dialString );
+}
+
+void UT_LogsViewManager::testchangeRecentView()
+{
+    QString dialString("+123456777");
+    mLogsViewManager->changeRecentViewViaService(LogsServices::ViewCalled, false, dialString);
+    QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
+             mLogsViewManager->mComponentsRepository->recentCallsView() );
+    QVERIFY( mLogsViewManager->mComponentsRepository->mDialpad->mLineEdit->text() == dialString );
+    
+    // Empty string clears dialpad input
+    mLogsViewManager->changeRecentViewViaService(LogsServices::ViewCalled, false, "");
+    QVERIFY( mLogsViewManager->mMainWindow.currentView() == 
+             mLogsViewManager->mComponentsRepository->recentCallsView() );
+    QVERIFY( mLogsViewManager->mComponentsRepository->mDialpad->mLineEdit->text().isEmpty() );
 }
 
 void UT_LogsViewManager::testExitApplication()
@@ -171,9 +190,9 @@
     service.mIsAppStartedUsingService = true;
     LogsViewManager vm(window, service, serviceOld);
     QVERIFY( vm.mComponentsRepository );
-    QVERIFY( vm.mMainWindow.views().count() == 3 );
+    QVERIFY( vm.mMainWindow.views().count() == 0 );
     QVERIFY( vm.mMainWindow.currentView() == 0 );
-    QVERIFY( vm.mViewStack.count() == 3 );
+    QVERIFY( vm.mViewStack.count() == 0 );
 }
 
 void UT_LogsViewManager::testHandleOrientationChanged()
@@ -196,6 +215,7 @@
 
 void UT_LogsViewManager::testSaveActivity()
 {
+    mLogsViewManager->activateView(LogsRecentViewId, false, QVariant());
     HbStubHelper::setActivityReason(Hb::ActivationReasonActivity);
     HbApplication* hbApp = static_cast<HbApplication*>(qApp);
     HbActivityManager* manager = hbApp->activityManager();
@@ -204,6 +224,7 @@
     QCOMPARE( manager->activities().count(), 1 );
     QVERIFY( !manager->activities().at(0).value(logsActivityParamShowDialpad).toBool() );
     QVERIFY( manager->activities().at(0).value(logsActivityParamDialpadText).toString().isEmpty() );
+    QCOMPARE( manager->activities().at(0).value(logsActivityParamInternalViewId).toInt(), (int)LogsRecentViewId );
     
     // Make sure that only one activity is reported
     mLogsViewManager->mComponentsRepository->dialpad()->mIsOpen = true;
@@ -212,6 +233,7 @@
     QCOMPARE( manager->activities().count(), 1 );
     QVERIFY( manager->activities().at(0).value(logsActivityParamShowDialpad).toBool() );
     QCOMPARE( manager->activities().at(0).value(logsActivityParamDialpadText).toString(), QString("12345") );
+    QCOMPARE( manager->activities().at(0).value(logsActivityParamInternalViewId).toInt(), (int)LogsMatchesViewId );
     
     // No views, nothing to save
     mLogsViewManager->mViewStack.clear();
@@ -233,6 +255,7 @@
     QVariantHash params;
     params.insert(logsActivityParamShowDialpad, false);
     params.insert(logsActivityParamDialpadText, QString(""));
+    params.insert(logsActivityParamInternalViewId, LogsRecentViewId);
     manager->addActivity(QString(), QVariant(), params);
     QVERIFY( mLogsViewManager->loadActivity() );
     QVERIFY( static_cast<LogsBaseView*>( mLogsViewManager->mMainWindow.currentView() )->viewId() == LogsRecentViewId );
@@ -245,6 +268,7 @@
     QVariantHash params2;
     params2.insert(logsActivityParamShowDialpad, true);
     params2.insert(logsActivityParamDialpadText, QString("33333"));
+    params.insert(logsActivityParamInternalViewId, LogsMatchesViewId);
     manager->addActivity(QString(), QVariant(), params2);
     QVERIFY( mLogsViewManager->loadActivity() );
     QVERIFY( static_cast<LogsBaseView*>( mLogsViewManager->mMainWindow.currentView() )->viewId() == LogsMatchesViewId );
--- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -29,6 +29,8 @@
 #include <QApplication>
 #include <QTimer>
 #include <QGesture>
+#include <hblistview.h>
+#include <hblistviewitem.h>
 
 int actionCount = 0;
 Qt::Orientation windowOrientation = Qt::Vertical;
@@ -50,6 +52,9 @@
 HbActivityManager testActivityManager;
 Hb::ActivationReason testActivationReason = Hb::ActivationReasonNormal;
 QString testActivityId = "LogsViewMatches";
+QList<HbListViewItem*> testViewItems;
+bool testEnsureVisibleCalled = false;
+bool testScrollToCalled = false;
 
 void HbStubHelper::reset()
 {
@@ -63,10 +68,12 @@
     testActivationReason = Hb::ActivationReasonNormal;
     testActivityId = "LogsViewMatches";
     testActivities.clear();
+    qDeleteAll(testViewItems);
+    testViewItems.clear();
+    testScrollToCalled = false;
+    testEnsureVisibleCalled = false;
 }
 
-
-
 int HbStubHelper::widgetActionsCount()
 {
     return actionCount;
@@ -135,6 +142,21 @@
     testActivityId = activityId;
 }
 
+QList<HbListViewItem*>& HbStubHelper::listItems()
+{
+    return testViewItems;
+}
+
+bool HbStubHelper::listScrollToCalled()
+{
+    return testScrollToCalled;
+}
+
+bool HbStubHelper::listEnsureVisibleCalled()
+{
+    return testEnsureVisibleCalled;
+}
+
 // -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
@@ -331,7 +353,6 @@
 
 void HbMainWindow::setCurrentView(HbView *view, bool animate, Hb::ViewSwitchFlags flags)
 {
-    Q_UNUSED(animate)
     Q_UNUSED(flags)
     testView = view;
 }
@@ -404,3 +425,39 @@
     Q_UNUSED(colorRole);
     return testColor;
 }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void HbListView::scrollTo(const QModelIndex &index, ScrollHint hint)
+{
+    Q_UNUSED(index);
+    Q_UNUSED(hint);
+    testScrollToCalled = true;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+QList<HbAbstractViewItem *> HbAbstractItemView::visibleItems() const
+{
+    QList<HbAbstractViewItem*> visible;
+    foreach ( HbListViewItem* item, testViewItems ){
+        visible.append( item );
+    }
+    return visible;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void HbScrollArea::ensureVisible(const QPointF &position, qreal xMargin, qreal yMargin)
+{
+    Q_UNUSED(position);
+    Q_UNUSED(xMargin);
+    Q_UNUSED(yMargin);
+    testEnsureVisibleCalled = true;
+}
--- a/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/stubs/hbstubs_helper.h	Tue Jul 06 14:16:36 2010 +0300
@@ -17,6 +17,9 @@
 
 #ifndef HBSTUB_HELPER_H
 #define HBSTUB_HELPER_H
+
+class HbListViewItem;
+
 /**
 * Helper class to control logsdbconnector stub behavior
 *
@@ -37,6 +40,9 @@
         static void setColorScheme(QColor col);
         static void setActivityReason(Hb::ActivationReason reason);
         static void setActivityId(QString activityId);
+        static QList<HbListViewItem*>& listItems();
+        static bool listScrollToCalled();
+        static bool listEnsureVisibleCalled();
 };
 
 #endif
--- a/logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsapp/tsrc/ut_logsapp/ut_logsapp.pro	Tue Jul 06 14:16:36 2010 +0300
@@ -51,6 +51,7 @@
 HEADERS += inc/ut_logsservicehandler.h
 HEADERS += ../../inc/logsmainwindow.h
 HEADERS += ../../inc/logsviewmanager.h
+HEADERS += ../../inc/logscomponentrepository.h
 HEADERS += ../../inc/logsrecentcallsview.h
 HEADERS += ../../inc/logsbaseview.h
 HEADERS += ../../inc/logsdetailsview.h
--- a/logsui/logscntfinder/src/logscntfinder.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/src/logscntfinder.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -1,4 +1,4 @@
-/*
+    /*
 * Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
 * All rights reserved.
 * This component and the accompanying materials are made available
--- a/logsui/logscntfinder/src/logspredictivetranslator.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/src/logspredictivetranslator.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -143,7 +143,8 @@
     } else { 
         delete mNameTranslator;
         mNameTranslator = new LogsPredictiveLatin12KeyTranslator();
-        if( mNameTranslator->encodes( name ) ) {
+        if( mNameTranslator->mKeyMap && 
+            mNameTranslator->encodes( name ) ) {
             nameTranslator = mNameTranslator;
             LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
 nameTranslator() - use latin" )
@@ -151,7 +152,8 @@
         }
         delete mNameTranslator;
         mNameTranslator = new LogsPredictiveThai12KeyTranslator();
-        if( mNameTranslator->encodes( name ) ) {
+        if( mNameTranslator->mKeyMap && 
+            mNameTranslator->encodes( name ) ) {
             nameTranslator = mNameTranslator;
             LOGS_QDEBUG( "logs [FINDER] <- LogsPredictiveTranslator::\
 nameTranslator() - use thai" )
--- a/logsui/logscntfinder/tsrc/pt_logscntfinder/src/main.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/src/main.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -42,9 +42,9 @@
     
     PT_LogsCntFinderQwerty pt_LogsCntFinderQwerty( samples );
     resultFileName = "c:/data/others/pt_logscntfinderqwerty.txt";
-    QStringList args_logsCntFinderQwertry( "PT_LogsCntFinderQwerty");
-    args_logsCntFinder << "-o" << resultFileName;
-    QTest::qExec(&pt_LogsCntFinderQwerty, args_logsCntFinderQwertry);
+    QStringList args_logsCntFinderQwerty( "PT_LogsCntFinderQwerty");
+    args_logsCntFinderQwerty << "-o" << resultFileName;
+    QTest::qExec(&pt_LogsCntFinderQwerty, args_logsCntFinderQwerty);
     
     return 0;   
 }
--- a/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinder.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -145,17 +145,33 @@
     //open symbian database
     m_manager = new QContactManager("symbian");
     
+    /*
     //qDebug() << "PT_LogsCntFinder::init remove old contacts";
     // Remove all contacts from the database
     
+    QList<QString> firstnamelist;
+    QList<QString> Lastnamelist;
+    firstnamelist<<"Micheal"<<"Evans"<<"Kacris"<<"Xiao";
+    Lastnamelist<<"Ribecca"<<"Tina"<<"Bob"<<"George"<<"Anna";
+
+    for( int z = 0;z<30;z++) {
+    //for( int z = 0;z<10;z++) {
+      for(int i =0; i < firstnamelist.count(); i++) {
+        for(int k =0; k < Lastnamelist.count(); k++) {
+          //emailaddress = firstnamelist[i].Lastnamelist[k]
+          createContact_one_Contact(firstnamelist[i], Lastnamelist[k], QString("03432"));
+        }
+      }
+    }
+    */
+    
     QList<QContactLocalId> cnt_ids = m_manager->contactIds();
     qDebug() << "contacts now in db" << cnt_ids.count();
-    if ( cnt_ids.count() == 600 ) {
+    if ( cnt_ids.count() < 600 ) {
          QString f("Jack");
          QString l("Whatever");
          createContact_one_Contact( f,l, QString("03432"));
     }
-
     cnt_ids = m_manager->contactIds();
     qDebug() << "contacts now " << cnt_ids.count();
     
@@ -175,6 +191,7 @@
 
 
 
+//void PT_LogsCntFinder::createContact_one_Contact(QString& firstname, QString& Lastname, QString phnumber, QString& emailaddress)
 void PT_LogsCntFinder::createContact_one_Contact(QString& firstname, QString& Lastname, QString phnumber)
 {
     //Currenlty we can only fetch firstname,lastname,companyname and sip/email/phone from the databse
@@ -193,6 +210,11 @@
     number.setNumber(phnumber);
     phonecontact.saveDetail(&number);
     
+    QContactEmailAddress email;
+    QString emailaddress = firstname + "." + Lastname + "@ovi.com";
+    email.setEmailAddress(emailaddress);
+    phonecontact.saveDetail(&email);
+    
     m_manager->saveContact(&phonecontact);
    
 }
@@ -298,9 +320,12 @@
 
     QList<PtTest> tests;
     tests.append( PtTest("5") );
+    tests.append( PtTest("05") );    
     tests.append( PtTest("52") );
     tests.append( PtTest("522") );
     tests.append( PtTest("5220") );
+    tests.append( PtTest("05220") );
+    tests.append( PtTest("052207") );
     tests.append( PtTest("522000000000007") );
     tests.append( PtTest("205") );
     tests.append( PtTest("34096") );
--- a/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinderqwerty.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/pt_logscntfinder/src/pt_logscntfinderqwerty.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -80,7 +80,8 @@
     tests.append( PtTest("a") );
     tests.append( PtTest("5") );
     tests.append( PtTest("Paul") );
-    tests.append( PtTest("Paul Mes") );
+    tests.append( PtTest("Paul sw") );
+    tests.append( PtTest("P S") );
    
     t.start();
     
--- a/logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/st_logscntfinder/inc/st_logscntfinder.h	Tue Jul 06 14:16:36 2010 +0300
@@ -67,7 +67,8 @@
     void testPredictiveSearchQueryFullyCached();
     void testPredictiveSearchQueryPartialCachedNoResults();
     void testPredictiveSearchQueryFullyCachedNoResults();
-    void testPredictiveSearchQueryCachedZeroCase();
+    void testPredictiveSearchQueryPartialCachedZeroCase();
+    void testPredictiveSearchQueryFullyCachedZerosCase();
     void testPredictiveSearchQueryLogs();
     void testPredictiveSearchQueryLogsZeroCase();
     void testPredictiveSearchQueryLogsContactsPartialCached();
@@ -76,6 +77,7 @@
     void testPredictiveSearchQueryLogsContactsPhoneNumberMatch();
     void testPredictiveSearchQueryLimit();
     void testQueryOrder();
+    void testContactWithNonMappedChars();
 
 private:
 
@@ -89,6 +91,7 @@
     void createContacts();
     void createContactsForQueryOrder();
     void createContactsForQueryZero();
+    void createContactsWithNonMappedChars();
     void createHistoryEvents();
     void createLogEvent(
         QString firstname, 
--- a/logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/st_logscntfinder/src/st_logscntfinder.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -127,17 +127,23 @@
 void ST_LogsCntFinder::createContactsForQueryZero()
 {
     createContacts();
-    createOneContact( QString("Dlice 00202"), QString("Qwerty"), QString("45789348") );
+    createOneContact( QString("Dlice 0202"), QString("Qwerty"), QString("45789348") );
     createOneContact( QString("#Paula 2003"), QString("Augustin Ci"), QString("0078945617") );
     createOneContact( QString("Paula 02010"), QString("Ezerty Adam"), QString("78945617") );
-    createOneContact( QString("Ced"), QString("Y,g"), QString("+78945617") );
+    createOneContact( QString("Ced"), QString(",Yg"), QString("+78945617") );
     createOneContact( QString("Jari-Pekka"), QString(" "), QString("78945617") );
 
     int contactsCount = m_manager->contactIds().count();
     QCOMPARE(contactsCount, 18);
 }
 
-
+void ST_LogsCntFinder::createContactsWithNonMappedChars()
+{
+    
+    createOneContact( QString("Hannu%"), QString(""), QString("932472398") );
+    createOneContact( QString("%Hannu"), QString(""), QString("932472398") );
+    
+}
 
 void ST_LogsCntFinder::createHistoryEvents()
 { 
@@ -307,7 +313,7 @@
 {
     createContactsForQueryZero();
     
-    m_finder->predictiveSearchQuery( QString("00202") );
+    m_finder->predictiveSearchQuery( QString("0202") );
     QCOMPARE( m_finder->resultsCount(), 2 );
 }
 
@@ -316,7 +322,7 @@
     createContactsForQueryZero();
         
     m_finder->predictiveSearchQuery( QString("02010") );
-    QCOMPARE( m_finder->resultsCount(), 1 );
+    QCOMPARE( m_finder->resultsCount(), 2 );
 }
 
 void ST_LogsCntFinder::testPredictiveSearchQueryZeroMiddle()
@@ -464,33 +470,67 @@
     
 }
 
-// 6 -> 69 (no match) -> 692 (no match) -> 69 (no match) -> 6 (all cached)
-void ST_LogsCntFinder::testPredictiveSearchQueryCachedZeroCase()
+// 
+void ST_LogsCntFinder::testPredictiveSearchQueryPartialCachedZeroCase()
 {
     createContacts();
     
-    m_finder->predictiveSearchQuery( QString("2") );
+    m_finder->predictiveSearchQuery( QString("2") );//db
     QCOMPARE( m_finder->resultsCount(), 3 );
     CHECK_RESULTS( 2, "Levis", "Augustin" );//Augustin Zi
 
-    m_finder->predictiveSearchQuery( QString("20") );
+    m_finder->predictiveSearchQuery( QString("20") );//db
     QCOMPARE( m_finder->resultsCount(), 3 );
     CHECK_RESULTS( 2, "Levis", "Augustin" );//Augustin Zi
     
-    m_finder->predictiveSearchQuery( QString("209") );
+    m_finder->predictiveSearchQuery( QString("209") );//db
     QCOMPARE( m_finder->resultsCount(), 1 );
     CHECK_RESULTS( 1, "Levis", "Augustin" ); //Augustin Zi
     
-    m_finder->predictiveSearchQuery( QString("20") );
+    m_finder->predictiveSearchQuery( QString("20") );//db
     QCOMPARE( m_finder->resultsCount(), 3 );
     CHECK_RESULTS( 2, "Levis", "Augustin" );//Augustin Zi
     
-    m_finder->predictiveSearchQuery( QString("2") );
+    m_finder->predictiveSearchQuery( QString("2") );//db
     QCOMPARE( m_finder->resultsCount(), 3 );
     CHECK_RESULTS( 2, "Levis", "Augustin" );//Augustin Zi
        
 }
 
+// 
+void ST_LogsCntFinder::testPredictiveSearchQueryFullyCachedZerosCase()
+{
+    createContacts();
+    
+    m_finder->predictiveSearchQuery( QString("2") ); //db
+    QCOMPARE( m_finder->resultsCount(), 3 );
+    CHECK_RESULTS( 3, "Levis", "Augustin" );//Augustin Zi
+
+    m_finder->predictiveSearchQuery( QString("20") );//cache
+    QCOMPARE( m_finder->resultsCount(), 3 );
+    CHECK_RESULTS( 3, "Levis", "Augustin" );//Augustin Zi
+    
+    m_finder->predictiveSearchQuery( QString("200") );//cache
+    QCOMPARE( m_finder->resultsCount(), 3 );
+    CHECK_RESULTS( 3, "Levis", "Augustin" );//Augustin Zi
+    
+    m_finder->predictiveSearchQuery( QString("2009") );//cache
+    QCOMPARE( m_finder->resultsCount(), 1 );
+    CHECK_RESULTS( 1, "Levis", "Augustin" ); //Augustin Zi
+    
+    m_finder->predictiveSearchQuery( QString("200") );//db
+    QCOMPARE( m_finder->resultsCount(), 3 );
+    CHECK_RESULTS( 3, "Levis", "Augustin" );//Augustin Zi
+    
+    m_finder->predictiveSearchQuery( QString("20") );//db
+    QCOMPARE( m_finder->resultsCount(), 3 );
+    CHECK_RESULTS( 3, "Levis", "Augustin" );//Augustin Zi
+    
+    m_finder->predictiveSearchQuery( QString("2") );//db
+    QCOMPARE( m_finder->resultsCount(), 3 );
+    CHECK_RESULTS( 3, "Levis", "Augustin" );//Augustin Zi
+       
+}
 
 //There is recent call in logs, no contacts DB
 void ST_LogsCntFinder::testPredictiveSearchQueryLogs()
@@ -710,3 +750,24 @@
     QCOMPARE(m_finder->resultAt(7).lastName().at(0).text(), QString("Yadira"));
 }
 
+void ST_LogsCntFinder::testContactWithNonMappedChars()
+{
+    //Hannu%
+    //%Hannu
+    createContactsWithNonMappedChars();
+    
+    m_finder->predictiveSearchQuery( QString("4") );
+    QCOMPARE( m_finder->resultsCount(), 1 );//Hannu%
+    QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Hannu%"));
+
+    m_finder->predictiveSearchQuery( QString("42") );//all cached
+    QCOMPARE( m_finder->resultsCount(), 1 );//Hannu%
+    QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Hannu%"));
+
+    m_finder->predictiveSearchQuery( QString("") );//empty cache
+    m_finder->predictiveSearchQuery( QString("42") );
+    QCOMPARE( m_finder->resultsCount(), 1 );//Hannu%
+    QCOMPARE(m_finder->resultAt(0).firstName().at(0).text(), QString("Hannu%"));
+    
+}
+
--- a/logsui/logscntfinder/tsrc/stubs/qtcontacts_stubs.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/stubs/qtcontacts_stubs.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -170,9 +170,10 @@
     return list;
 }
 
+
 QContact QContactManager::contact( 
-    const QContactLocalId& contactId, 
-    const QStringList& /*definitionRestrictions*/ ) const
+        const QContactLocalId& contactId, 
+        const QContactFetchHint& /*fetchHint*/) const
 {
     QContact contact;
     QContactId id;
@@ -182,6 +183,7 @@
     return contact;
 }
 
+
 // ----------------------------------------------------------------------------
 // QContactDetailFilter
 // ----------------------------------------------------------------------------
--- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivethai12keytranslator.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivethai12keytranslator.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -56,6 +56,7 @@
 
 void UT_LogsPredictiveThai12KeyTranslator::testTranslateText()
 {
+    QEXPECT_FAIL("", "No proper Thai keymap yet", Abort );
     QCOMPARE( mTranslator->translateText( QString( "0123456789" ) ), QString( "0123456789" ) );
     //finds name latin name translator
     QCOMPARE( mTranslator->translateText( QString( "Nokia" ) ), QString( "66542" ) );
@@ -81,6 +82,7 @@
 
 void UT_LogsPredictiveThai12KeyTranslator::testTranslateChar()
 {
+    QEXPECT_FAIL("", "No proper Thai keymap yet", Abort );
     bool ok;
     
     QCOMPARE( mTranslator->translateChar( QChar('0'), ok ), QChar('0') );
@@ -113,12 +115,6 @@
 
 void UT_LogsPredictiveThai12KeyTranslator::testEncodes()
 {
-    //thai
-    const int ucsize = 9;
-    const QChar thaiName2[] = {0x0E01,0x0E06,0x0E2F,0x0E0E,0x0E14,0x0E19,0x0E30,0x0E23,0x0E2A };
-    
-    QVERIFY( mTranslator->encodes( QString( thaiName2,ucsize ) ) );
-    
     //china
     QString uni1;
     uni1.append(QChar(0x4E0E));
@@ -126,7 +122,14 @@
     QVERIFY( !mTranslator->encodes( uni1) );
     
     QVERIFY( !mTranslator->encodes( QString( "Zulu" ) ) );
-        
+    
+    QEXPECT_FAIL("", "No proper Thai keymap yet", Abort );
+    //thai
+    const int ucsize = 9;
+    const QChar thaiName2[] = {0x0E01,0x0E06,0x0E2F,0x0E0E,0x0E14,0x0E19,0x0E30,0x0E23,0x0E2A };
+    
+    QVERIFY( mTranslator->encodes( QString( thaiName2,ucsize ) ) );
+    
 
 }
 
--- a/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logscntfinder/tsrc/ut_logscntfinder/src/ut_logspredictivetranslator.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -87,6 +87,10 @@
               2 );
     QVERIFY( ok );
     
+    QString test2( "Hannu%");
+    QCOMPARE( mTranslator->LogsPredictiveTranslator::translate( test2, &ok ).length(),test2.length() -1 );
+    QVERIFY( !ok );
+    
 }
 
 void UT_LogsPredictiveTranslator::testTranslatePattern()
@@ -105,11 +109,16 @@
     
     QCOMPARE( mTranslator->translateText( test1 ).length(), test1.length() );
     
+    QString test2( "Hannu%");
+    QCOMPARE( mTranslator->translateText( test2 ).length(), test2.length() - 1 );
+
+    QEXPECT_FAIL("", "No proper Thai keymap yet", Abort );
     //text is thai, input lang latin
     const int ucsize = 9;
     //                           1      2      3      4      5     6      7      8     9
     const QChar thaiName1[] = {0x0E01,0x0E06,0x0E0A,0x0E0E,0x0E14,0x0E19,0x0E1E,0x0E23,0x0E2A };
     QCOMPARE( mTranslator->translateText( QString( thaiName1,ucsize ) ), QString( "123456789" ) );
+
     
 }
 
@@ -120,6 +129,22 @@
     QVERIFY( !mTranslator->mNameTranslator );
     QCOMPARE( mTranslator->nameTranslator( test1 ).mib(), MIBenumLatin );
     QVERIFY( mTranslator->mNameTranslator );
+
+    //china
+    QString uni;
+    uni.append(QChar(0x0219));
+    uni.append(QChar(0x4E0F));
+    QCOMPARE( mTranslator->nameTranslator( uni ).mib(), MIBenumLatin );
+    QVERIFY( !mTranslator->mNameTranslator );
+    QCOMPARE( mTranslator->mib(), MIBenumLatin );
+    
+    //unmapped
+    QString test2( "Hannu%");
+    QCOMPARE( mTranslator->nameTranslator( test2 ).mib(), MIBenumLatin );
+    QVERIFY( !mTranslator->mNameTranslator );
+    QCOMPARE( mTranslator->mib(), MIBenumLatin );
+
+    QEXPECT_FAIL("", "No proper Thai keymap yet", Abort );
     
     //text is thai, input lang latin
     const int ucsize = 9;
@@ -135,16 +160,6 @@
     QCOMPARE( mTranslator->mNameTranslator->mib(), MIBenumThai );
     QCOMPARE( mTranslator->mib(), MIBenumLatin );
     
-    
-    //china
-    QString uni;
-    uni.append(QChar(0x0219));
-    uni.append(QChar(0x4E0F));
-    QCOMPARE( mTranslator->nameTranslator( uni ).mib(), MIBenumLatin );
-    QVERIFY( !mTranslator->mNameTranslator );
-    QCOMPARE( mTranslator->mib(), MIBenumLatin );
-    
-    
 }
 
 
--- a/logsui/logsengine/inc/logsengdefs.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/inc/logsengdefs.h	Tue Jul 06 14:16:36 2010 +0300
@@ -56,18 +56,13 @@
 const int logsEventALS = 0x4;
 const int logsDeleteCountInit = -1;
 
-const int logsReadSizeCompressEnabled = 20;
+const int logsReadSizeCompressEnabled = 10;
 const int logsReadSizeUndefined = -1;
 
 // MACROS
 #define DESC_TO_QSTRING( desc )\
     QString::fromUtf16( desc.Ptr(), desc.Length() );
 
-#define LOGSENG_PANIC() User::Invariant()
-
-#define LOGSENG_ASSERT( cond )\
-if ( !(cond) ) LOGSENG_PANIC;
-
 // DATA TYPES
 
 class LogsEventStrings 
--- a/logsui/logsengine/inc/logsmatchesmodel.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/inc/logsmatchesmodel.h	Tue Jul 06 14:16:36 2010 +0300
@@ -75,6 +75,7 @@
     void eventsUpdated(const QModelIndex& first, const QModelIndex& last);
     void eventsAdded(const QModelIndex& parent, int first, int last);
     void eventsRemoved(const QModelIndex& parent, int first, int last);
+    void eventsResetted();
 	
     void doSearchQuery();
     void doModelReset();
@@ -90,6 +91,7 @@
     void getLogsMatches( const QString& pattern, bool async = false, bool force = false );  
     void updateSearchEntry(LogsCntEntry& entry, LogsEvent& event);
     QString stripPhoneNumber(const QString& phoneNumber) const;
+    void addEventForSearching(int index, LogsEvent& event);
     
 private: //data 
     
@@ -126,6 +128,7 @@
     unsigned int contact() const;
     QString number() const;
     QString contactName() const;
+    QString contactNameSimple() const;
     bool isNull() const;
     bool isEventMatch() const;
     QStringList texts();
@@ -137,8 +140,10 @@
     
     QString getFormattedCallerId(const LogsCntEntry& entry) const;
     void getFormattedContactInfo( 
-            const LogsCntEntry& entry, QString& contactName, QString& contactNumber ) const;
-    void getFormattedName(QString& formattedName, 
+            const LogsCntEntry& entry, QString& contactName, 
+            QString& contactNameSimple, QString& contactNumber ) const;
+    void getFormattedName(QString& formattedName, const QList<LogsCntText>& list) const;
+    void getFormattedName(QString& formattedName, QString& formattedNameSimple,
             const QList<LogsCntText>& list) const;
     
 private:
@@ -146,6 +151,7 @@
     LogsAbstractModel& mParentModel;
     unsigned int mContactId;
     QString mContactName;
+    QString mContactNameSimple;
     QString mContactNumber;
     QString mAvatarPath;
     QString mFormattedCallerId;
--- a/logsui/logsengine/inc/logsmessage.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/inc/logsmessage.h	Tue Jul 06 14:16:36 2010 +0300
@@ -69,6 +69,7 @@
     XQServiceRequest* mService;
 private:
     friend class UT_LogsMessage;
+    friend class UT_LogsMatchesModel;
     
 };
                   
--- a/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/logssymbianos/src/logsdbconnector.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -509,10 +509,6 @@
     }
     
     deleteRemoved(readCount);
-    
-    if ( mCompressionEnabled ){
-        mReader->stop();
-    }    
 
     LOGS_QDEBUG( "logs [ENG] <- LogsDbConnector::readCompleted()" )
 }
--- a/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/logssymbianos/tsrc/ut_logssymbianos/src/ut_logsdbconnector.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -287,13 +287,13 @@
     QVERIFY( mDbConnector->mEvents.count() == 1 );
     QVERIFY( mEvents.count() == 1 );
 
-    // Read completed when compression is enabled, reader is stopped
+    // Read completed when compression is enabled, reader is not stopped
     QVERIFY( mDbConnector->init() == 0 );
     QVERIFY( mDbConnector->start() == 0 );
     QVERIFY( mDbConnector->mReader->mLogViewRecent != 0 );
     mDbConnector->mCompressionEnabled = true;
     mDbConnector->readCompleted(0);
-    QVERIFY( mDbConnector->mReader->mLogViewRecent == 0 );
+    QVERIFY( mDbConnector->mReader->mLogViewRecent != 0 );
 }
 
 void UT_LogsDbConnector::testErrorOccurred()
--- a/logsui/logsengine/src/logscontact.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/src/logscontact.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -200,7 +200,10 @@
             SLOT(handleRequestCompleted(QVariant)));
 
     mService->setArguments(arguments);
-
+    XQRequestInfo info;
+    info.setForeground(true);
+    mService->setInfo(info);
+    
     QVariant retValue;
     return mService->send(retValue);
 }
--- a/logsui/logsengine/src/logsmatchesmodel.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/src/logsmatchesmodel.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -165,7 +165,8 @@
     }
     const LogsMatchesModelItemContainer& matchItem = 
         static_cast<const LogsMatchesModelItemContainer&>( item ); 
-    LogsMessage* logsMessage = new LogsMessage(matchItem.contact(), matchItem.number(),matchItem.contactName());
+    LogsMessage* logsMessage = new LogsMessage(
+        matchItem.contact(), matchItem.number(),matchItem.contactNameSimple());
     if (!logsMessage->isMessagingAllowed()) {
         delete logsMessage;
         logsMessage = 0;
@@ -298,6 +299,39 @@
 }
 
 // -----------------------------------------------------------------------------
+// 
+// -----------------------------------------------------------------------------
+//
+void LogsMatchesModel::eventsResetted()
+{
+    LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::eventsResetted()" );
+    
+    QMap<LogsCntEntryHandle*, LogsEvent*> unusedEvents = mSearchEvents;
+    for ( int i = 0; i < mParentModel.rowCount(); ++i ){
+        LogsEvent* event = qVariantValue<LogsEvent*>( 
+            mParentModel.data( mParentModel.index(i, 0), LogsModel::RoleFullEvent ) );
+        if ( event ){
+            QObject* key = mSearchEvents.key(event);
+            if ( key ){
+                unusedEvents.remove(key);
+            } else {
+                addEventForSearching(i, *event);
+            }
+        }
+    }
+    
+    QMap<LogsCntEntryHandle*, LogsEvent*>::iterator unusedIt;
+    for (unusedIt = unusedEvents.begin(); unusedIt != unusedEvents.end(); ++unusedIt){
+        mLogsCntFinder->deleteEntry(*unusedIt.key());
+        mSearchEvents.remove(unusedIt.key());
+    }
+    
+    forceSearchQuery();
+    
+    LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::eventsResetted()" );
+}
+
+// -----------------------------------------------------------------------------
 //
 // -----------------------------------------------------------------------------
 //
@@ -315,7 +349,7 @@
                  this, SLOT(eventsAdded(const QModelIndex&,int,int)));
         connect( &mParentModel, SIGNAL(rowsRemoved(const QModelIndex&,int,int)), 
                  this, SLOT(eventsRemoved(const QModelIndex&,int,int)));
-        connect( &mParentModel, SIGNAL(modelReset()), this, SLOT(doModelReset()));
+        connect( &mParentModel, SIGNAL(modelReset()), this, SLOT(eventsResetted()));
         readEvents(0, mParentModel.rowCount());
         mIconManager = new LogsThumbIconManager();
         connect(mIconManager, SIGNAL(contactIconReady(int)),
@@ -373,11 +407,7 @@
         LogsEvent* event = qVariantValue<LogsEvent*>( 
                 mParentModel.data( mParentModel.index(i, 0), LogsModel::RoleFullEvent ) );
         if ( event ){
-            QObject* entryHandle = new QObject(this);
-            LogsCntEntry* entry = new LogsCntEntry(*entryHandle, 0);
-            updateSearchEntry(*entry, *event);
-            mLogsCntFinder->insertEntry(i, entry);
-            mSearchEvents.insert(entryHandle, event);
+            addEventForSearching(i, *event);
         }
     }
 }
@@ -447,10 +477,12 @@
 //
 void LogsMatchesModel::doModelReset()
 {
+    LOGS_QDEBUG( "logs [ENG] -> LogsMatchesModel::doModelReset()" );
     qDeleteAll(mMatches);
     mMatches.clear();
     mResultCount = 0;
     reset();
+    LOGS_QDEBUG( "logs [ENG] <- LogsMatchesModel::doModelReset()" );
 }
 
 // -----------------------------------------------------------------------------
@@ -512,6 +544,19 @@
 //
 // -----------------------------------------------------------------------------
 //
+void LogsMatchesModel::addEventForSearching(int index, LogsEvent& event)
+{
+     QObject* entryHandle = new QObject(this);
+     LogsCntEntry* entry = new LogsCntEntry(*entryHandle, 0);
+     updateSearchEntry(*entry, event);
+     mLogsCntFinder->insertEntry(index, entry);
+     mSearchEvents.insert(entryHandle, &event);
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
 LogsMatchesModelItemContainer::LogsMatchesModelItemContainer(
         LogsAbstractModel& parentModel,
 		LogsThumbIconManager& thumbIconManager, 
@@ -594,6 +639,15 @@
 //
 // -----------------------------------------------------------------------------
 //
+QString LogsMatchesModelItemContainer::contactNameSimple() const
+{
+   return mContactNameSimple;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
 bool LogsMatchesModelItemContainer::isNull() const
 {
     return ( !mEvent && !mContactId );
@@ -651,7 +705,7 @@
     if ( mEvent ){
         mFormattedCallerId = getFormattedCallerId(entry);
     } else if ( mContactId > 0 ){
-        getFormattedContactInfo(entry, mContactName, mContactNumber);
+        getFormattedContactInfo(entry, mContactName, mContactNameSimple, mContactNumber);
         mAvatarPath.clear();
         mAvatarPath = entry.avatarPath();
     }
@@ -690,15 +744,17 @@
 //
 void LogsMatchesModelItemContainer::getFormattedContactInfo( 
         const LogsCntEntry& entry,
-        QString& contactName, 
+        QString& contactName,
+        QString& contactNameSimple,
         QString& contactNumber ) const
 {
     contactName.clear();
     
-    getFormattedName(contactName, entry.firstName());
-    getFormattedName(contactName, entry.lastName());
+    getFormattedName(contactName, contactNameSimple, entry.firstName());
+    getFormattedName(contactName, contactNameSimple, entry.lastName());
 
     contactName = contactName.trimmed();
+    contactNameSimple = contactNameSimple.trimmed();
     contactNumber = entry.phoneNumber().text();
 }
 
@@ -706,13 +762,31 @@
 //
 // -----------------------------------------------------------------------------
 //
-void  LogsMatchesModelItemContainer::getFormattedName(QString& formattedName, 
-        const QList<LogsCntText>& list) const
+void  LogsMatchesModelItemContainer::getFormattedName(
+    QString& formattedName, const QList<LogsCntText>& list) const
 {
     foreach( LogsCntText name, list ) {
         if ( name.text().length() > 0 ) {
-            formattedName.append(name.richText());
+            formattedName.append(name.richText());   
             formattedName.append(" ");
         }
     }
 }
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
+void  LogsMatchesModelItemContainer::getFormattedName(
+    QString& formattedName, QString& formattedNameSimple,
+    const QList<LogsCntText>& list) const
+{
+    foreach( LogsCntText name, list ) {
+        if ( name.text().length() > 0 ) {
+            formattedName.append(name.richText());   
+            formattedName.append(" ");
+            formattedNameSimple.append(name.text());
+            formattedNameSimple.append(" ");
+        }
+    }
+}
--- a/logsui/logsengine/src/logsmessage.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/src/logsmessage.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -146,6 +146,9 @@
     arguments.append(QVariant(contactId));
     arguments.append(QVariant(displayName));
     request.setArguments(arguments);
+    XQRequestInfo info;
+    info.setForeground(true);
+    request.setInfo(info);
     QVariant retValue;
     bool ret = request.send(retValue);
     LOGS_QDEBUG_2( "logs [ENG] <- LogsMessage::doSendMessageToNumber()", ret )
--- a/logsui/logsengine/tsrc/stubs/logscntfinder.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/tsrc/stubs/logscntfinder.h	Tue Jul 06 14:16:36 2010 +0300
@@ -35,7 +35,7 @@
 
     inline LogsCntText() : mHighlights(0){}
     inline const QString& text() const {return mText;}
-    inline int highlights() const {return mHighlights;}
+    int highlights() const;
     QString richText( QString startTag = QString("<b><u>"), 
                       QString endTag = QString("</u></b>")) const;
     
@@ -48,6 +48,7 @@
     friend class LogsCntEntry;
     friend class UT_LogsCntEntry;
     friend class UT_LogsCntFinder;
+    friend class UT_LogsMatchesModel;
 };
 
 typedef QList<LogsCntText> LogsCntTextList;
@@ -100,6 +101,7 @@
     
     friend class UT_LogsCntEntry;
     friend class UT_LogsCntFinder;
+    friend class UT_LogsMatchesModel;
 };
 
 typedef QList<LogsCntEntry*> LogsCntEntryList;
--- a/logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/tsrc/stubs/logscntfinder_stub.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -24,6 +24,8 @@
 #include <QContactName.h>
 #include <QContactPhoneNumber.h>
 
+QString testHighlights;
+
 // -----------------------------------------------------------------------------
 // LogsCntEntry::richText()
 // -----------------------------------------------------------------------------
@@ -42,6 +44,15 @@
 }
 
 // -----------------------------------------------------------------------------
+// LogsCntEntry::highlights()
+// -----------------------------------------------------------------------------
+//
+int LogsCntText::highlights() const 
+{
+    return testHighlights.length() ;
+}
+
+// -----------------------------------------------------------------------------
 // LogsCntEntry::LogsCntEntry()
 // -----------------------------------------------------------------------------
 //
@@ -204,6 +215,7 @@
 //
 void LogsCntEntry::setHighlights( const QString& pattern )
 {
+    testHighlights = pattern;
 }
 
 // -----------------------------------------------------------------------------
--- a/logsui/logsengine/tsrc/stubs/qthighway_stub.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/tsrc/stubs/qthighway_stub.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -106,3 +106,9 @@
 {
     return qtHighwayStubRequestBg;
 }
+
+
+void XQRequestInfo::setForeground(bool on)
+{
+    Q_UNUSED(on)
+}
--- a/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/tsrc/ut_logsengine/inc/ut_logsmatchesmodel.h	Tue Jul 06 14:16:36 2010 +0300
@@ -52,6 +52,7 @@
     void testDataAdded();
     void testDataUpdated();
     void testDataRemoved();
+    void testDataResetted();
     void testLogsMatches();
     void testCreateContactWithNumber();
     void testCreateCall();
--- a/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp	Wed Jun 23 18:13:05 2010 +0300
+++ b/logsui/logsengine/tsrc/ut_logsengine/src/ut_logsmatchesmodel.cpp	Tue Jul 06 14:16:36 2010 +0300
@@ -331,6 +331,55 @@
 //
 // -----------------------------------------------------------------------------
 //
+void UT_LogsMatchesModel::testDataResetted()
+{
+    // Have few events and then get reset where one event is removed and
+    // one new event is added
+    //
+    LogsEvent* event = new LogsEvent();
+    QString event1Name("event1");
+    event->setRemoteParty(event1Name);
+    LogsEvent* event2 = new LogsEvent();
+    QString event2Name("event2");
+    event2->setRemoteParty(event2Name);
+    LogsEvent* event3 = new LogsEvent();
+    QString event3Name("event3");
+    event3->setRemoteParty(event3Name);
+    mModel->mEvents.append(event);
+    mModel->mEvents.append(event2);
+    mModel->mEvents.append(event3);
+    mMatchesModel->eventsAdded(QModelIndex(), 0, 2);
+    QCOMPARE( mMatchesModel->mSearchEvents.count(), 3 );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.count(), 3 );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.at(0)->firstName().at(0).text(), event1Name );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.at(1)->firstName().at(0).text(), event2Name );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.at(2)->firstName().at(0).text(), event3Name );
+    
+    mModel->mEvents.clear();
+
+    LogsEvent* event4 = new LogsEvent();
+    QString event4Name("event4");
+    event4->setRemoteParty(event4Name);
+    mModel->mEvents.append(event4);
+    
+    mModel->mEvents.append(event);
+    mModel->mEvents.append(event3);
+    
+    QSignalSpy spy(mMatchesModel, SIGNAL(modelReset()));
+    mMatchesModel->eventsResetted();
+    QCOMPARE( mMatchesModel->mSearchEvents.count(), 3 );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.count(), 3 );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.at(0)->firstName().at(0).text(), event4Name );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.at(1)->firstName().at(0).text(), event1Name );
+    QCOMPARE( mMatchesModel->mLogsCntFinder->mHistoryEvents.at(2)->firstName().at(0).text(), event3Name );
+    QCOMPARE( spy.count(), 1 ); 
+    delete event2;
+}
+
+// -----------------------------------------------------------------------------
+//
+// -----------------------------------------------------------------------------
+//
 void UT_LogsMatchesModel::testLogsMatches()
 {
     QVERIFY( mMatchesModel->mLogsCntFinder );
@@ -487,9 +536,12 @@
     // With contact, messaging supported
     LogsMatchesModelItemContainer item3(*mModel, *mMatchesModel->mIconManager, 2);  
     item3.setContact(2);
+    item3.mContactName = "<b>so</b>mename";
+    item3.mContactNameSimple = "somename";
     var = mMatchesModel->createMessage(item3);
     message = qVariantValue<LogsMessage *>( var );
     QVERIFY( message );
+    QVERIFY( message->mDisplayName == "somename" );
     delete message;
 }
 
@@ -605,22 +657,26 @@
 void UT_LogsMatchesModel::testGetFormattedContactInfo()
 {
     QString name;
+    QString nameSimple;
     QString number;
     QVERIFY( mMatchesModel->mIconManager );
     
     // Entry is not initialized, name and number are empty
     LogsCntEntry entry(0);
     LogsMatchesModelItemContainer item(*mModel, *mMatchesModel->mIconManager, 0);
-    item.getFormattedContactInfo(entry, name, number);
-    QVERIFY( name.length() == 0 && number.length() == 0 );
+    item.getFormattedContactInfo(entry, name, nameSimple, number);
+    QVERIFY( name.length() == 0 && nameSimple.length() == 0 && number.length() == 0 );
     
     // Entry is initialized, name and number are not empty
     entry.setFirstName("long firstname");
     entry.setLastName("long lastname");
     entry.setPhoneNumber("number");
-    item.getFormattedContactInfo(entry, name, number);
-    QVERIFY( name == "long firstname long lastname" );
-    QVERIFY( number == "number" );
+    entry.setHighlights("lo");
+    item.getFormattedContactInfo(entry, name, nameSimple, number);
+    QCOMPARE( nameSimple, QString("long firstname long lastname") );
+    QVERIFY( nameSimple.length() < name.length() );
+    QCOMPARE( number, QString("number") );
+    entry.setHighlights("");
 }
 
 // -----------------------------------------------------------------------------