PFW: Display warning messages to help user

BZ: 54512

Display a warning message when a configuration cannot be applied because
the TuningMode is on, in order to help user to identify potential issues.
Display a warning message when a criterion change doesn't lead to a
configuration application (a check is performed each time a criterion
is changed).

Change-Id: Id872655c92770d1f6f1b01b20db2fde3db826ceb
Signed-off-by: Frédéric Boisnard <fredericx.boisnard@intel.com>
Reviewed-on: http://android.intel.com:8080/63845
Reviewed-by: Rocard, KevinX <kevinx.rocard@intel.com>
Reviewed-by: De Chivre, Renaud <renaud.de.chivre@intel.com>
Reviewed-by: Denneulin, Guillaume <guillaume.denneulin@intel.com>
Tested-by: Barthes, FabienX <fabienx.barthes@intel.com>
Reviewed-by: buildbot <buildbot@intel.com>
Tested-by: buildbot <buildbot@intel.com>
diff --git a/parameter/ParameterMgr.cpp b/parameter/ParameterMgr.cpp
index 9f1d160..14a5b4b 100644
--- a/parameter/ParameterMgr.cpp
+++ b/parameter/ParameterMgr.cpp
@@ -1,4 +1,4 @@
-/* 
+/*
  * INTEL CONFIDENTIAL
  * Copyright © 2011 Intel 
  * Corporation All Rights Reserved.
@@ -576,6 +576,13 @@
 
             return false;
         }
+
+        // Reset the modified status of the current criteria to indicate that a new configuration has been applied
+        getSelectionCriteria()->resetModifiedStatus();
+
+    } else {
+
+        log("Warning: Configurations were not applied because the TuningMode is on");
     }
 
     return true;
diff --git a/parameter/SelectionCriteria.cpp b/parameter/SelectionCriteria.cpp
index 9a4aa04..f75ec35 100644
--- a/parameter/SelectionCriteria.cpp
+++ b/parameter/SelectionCriteria.cpp
@@ -62,6 +62,12 @@
     getSelectionCriteriaDefinition()->listSelectionCriteria(strResult, bWithTypeInfo);
 }
 
+// Reset the modified status of the children
+void CSelectionCriteria::resetModifiedStatus()
+{
+    getSelectionCriteriaDefinition()->resetModifiedStatus();
+}
+
 // Children access
 CSelectionCriterionLibrary* CSelectionCriteria::getSelectionCriterionLibrary()
 {
diff --git a/parameter/SelectionCriteria.h b/parameter/SelectionCriteria.h
index 19cfcdc..dd274d0 100644
--- a/parameter/SelectionCriteria.h
+++ b/parameter/SelectionCriteria.h
@@ -1,4 +1,4 @@
-/* 
+/*
  * INTEL CONFIDENTIAL
  * Copyright © 2011 Intel 
  * Corporation All Rights Reserved.
@@ -55,6 +55,9 @@
 
     // Base
     virtual string getKind() const;
+
+    // Reset the modified status of the children
+    void resetModifiedStatus();
 private:
     // Children access
     CSelectionCriterionLibrary* getSelectionCriterionLibrary();
diff --git a/parameter/SelectionCriteriaDefinition.cpp b/parameter/SelectionCriteriaDefinition.cpp
index ab2c42f..7027a94 100644
--- a/parameter/SelectionCriteriaDefinition.cpp
+++ b/parameter/SelectionCriteriaDefinition.cpp
@@ -70,3 +70,18 @@
     }
 }
 
+// Reset the modified status of the children
+void CSelectionCriteriaDefinition::resetModifiedStatus()
+{
+    // Propagate
+    uint32_t uiNbChildren = getNbChildren();
+    uint32_t uiChild;
+    CSelectionCriterion* pSelectionCriterion;
+
+    for (uiChild = 0; uiChild < uiNbChildren; uiChild++) {
+
+        pSelectionCriterion = static_cast<CSelectionCriterion*>(getChild(uiChild));
+
+        pSelectionCriterion->resetModifiedStatus();
+    }
+}
diff --git a/parameter/SelectionCriteriaDefinition.h b/parameter/SelectionCriteriaDefinition.h
index 6d6a24d..337f7c3 100644
--- a/parameter/SelectionCriteriaDefinition.h
+++ b/parameter/SelectionCriteriaDefinition.h
@@ -46,5 +46,8 @@
 
     // Base
     virtual string getKind() const;
+
+    // Reset the modified status of the children
+    void resetModifiedStatus();
 };
 
diff --git a/parameter/SelectionCriterion.cpp b/parameter/SelectionCriterion.cpp
index 7f2809a..453f244 100644
--- a/parameter/SelectionCriterion.cpp
+++ b/parameter/SelectionCriterion.cpp
@@ -27,7 +27,7 @@
 
 #define base CElement
 
-CSelectionCriterion::CSelectionCriterion(const string& strName, const CSelectionCriterionType* pType) : base(strName), _iState(0), _pType(pType)
+CSelectionCriterion::CSelectionCriterion(const string& strName, const CSelectionCriterionType* pType) : base(strName), _iState(0), _pType(pType), _uiNbModifications(0)
 {
 }
 
@@ -36,6 +36,16 @@
     return "SelectionCriterion";
 }
 
+bool CSelectionCriterion::hasBeenModified() const
+{
+    return _uiNbModifications != 0;
+}
+
+void CSelectionCriterion::resetModifiedStatus()
+{
+    _uiNbModifications = 0;
+}
+
 /// From ISelectionCriterionInterface
 // State
 void CSelectionCriterion::setCriterionState(int iState)
@@ -46,6 +56,16 @@
         _iState = iState;
 
         log("Selection criterion changed event: %s", getFormattedDescription(false).c_str());
+
+        // Check if the previous criterion value has been taken into account (i.e. at least one Configuration was applied
+        // since the last criterion change)
+        if (_uiNbModifications > 0) {
+
+            log("Warning: Selection criterion \"%s\" has been modified %d time(s) without any configuration application", getName().c_str(), _uiNbModifications);
+        }
+
+        // Track the number of modifications for this criterion
+        _uiNbModifications++;
     }
 }
 
diff --git a/parameter/SelectionCriterion.h b/parameter/SelectionCriterion.h
index be6eac2..cf66c45 100644
--- a/parameter/SelectionCriterion.h
+++ b/parameter/SelectionCriterion.h
@@ -45,6 +45,9 @@
     virtual string getCriterionName() const;
     // Type
     virtual const ISelectionCriterionTypeInterface* getCriterionType() const;
+    // Modified status
+    bool hasBeenModified() const;
+    void resetModifiedStatus();
 
     /// Match methods
     bool is(int iState) const;
@@ -62,5 +65,7 @@
     int _iState;
     // Type
     const CSelectionCriterionType* _pType;
+    // Counter to know how many modifications have been applied to this criterion
+    uint8_t _uiNbModifications;
 };