diff --git a/data/CMakeLists.txt b/data/CMakeLists.txt
index 2cb8c2d5a2..d6d146d3a8 100644
--- a/data/CMakeLists.txt
+++ b/data/CMakeLists.txt
@@ -22,6 +22,7 @@ install(FILES
add_custom_target(pkgversion ALL COMMAND dpkg-parsechangelog -l${CMAKE_SOURCE_DIR}/debian/changelog --show-field version > ${CMAKE_CURRENT_BINARY_DIR}/version)
+install(FILES com.lomiri.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
install(FILES com.canonical.Unity8.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
install(FILES com.canonical.Unity.gschema.xml DESTINATION ${CMAKE_INSTALL_DATADIR}/glib-2.0/schemas)
install(FILES ${CMAKE_CURRENT_BINARY_DIR}/version DESTINATION ${CMAKE_INSTALL_LOCALSTATEDIR}/lib/unity8)
diff --git a/data/com.canonical.Unity8.gschema.xml b/data/com.canonical.Unity8.gschema.xml
index 417175864d..0041fd35ae 100644
--- a/data/com.canonical.Unity8.gschema.xml
+++ b/data/com.canonical.Unity8.gschema.xml
@@ -72,4 +72,5 @@
If too many unsuccessful login attempts have been made in a row, the greeter locks you out for a while. This unix timestamp indicates when you were locked out, so unity8 knows when to let you back in.
+
diff --git a/data/com.lomiri.gschema.xml b/data/com.lomiri.gschema.xml
new file mode 100644
index 0000000000..c4794f0cdb
--- /dev/null
+++ b/data/com.lomiri.gschema.xml
@@ -0,0 +1,11 @@
+
+
+
+
+ true
+ Whether the battery charging state should be shown using the notification led
+ Toggle the visibility of the battery charging state in the notification led patterns
+
+
+
+
diff --git a/qml/Panel/Indicators/IndicatorsLight.qml b/qml/Panel/Indicators/IndicatorsLight.qml
index db053bc25e..a5475d4762 100644
--- a/qml/Panel/Indicators/IndicatorsLight.qml
+++ b/qml/Panel/Indicators/IndicatorsLight.qml
@@ -24,6 +24,7 @@ import Lights 0.1
import QMenuModel 0.1 as QMenuModel
import Unity.Indicators 0.1 as Indicators
import Wizard 0.1
+import GSettings 1.0
import "../../.."
@@ -45,10 +46,18 @@ QtObject {
property string batteryIconName: Status.batteryIcon
property string displayStatus: Powerd.status
+
onSupportsMultiColorLedChanged: {
updateLightState("onSupportsMultiColorLedChanged")
}
+ property var _lomiriSettings: GSettings {
+ schema.id: "com.lomiri.LedIndication"
+ onChanged: {
+ root.updateLightState("onChanged (settings)")
+ }
+ }
+
onDisplayStatusChanged: {
updateLightState("onDisplayStatusChanged")
}
@@ -65,8 +74,11 @@ QtObject {
+ ", icon: " + batteryIconName
+ ", displayStatus: " + displayStatus
+ ", deviceState: " + deviceState
- + ", batteryLevel: " + batteryLevel)
+ + ", batteryLevel: " + batteryLevel
+ + ", chargingStateVisible: " + _lomiriSettings.chargingStateVisible)
+ //
+ // If charging state visibility is disabled then only show messages.
//
// priorities:
// unread messsages (highest), full&charging, charging, low
@@ -114,7 +126,12 @@ QtObject {
// if device does not support a multi color led set led off
if(!supportsMultiColorLed) {
-console.log("no support for Multicolor LED. " + indicatorState)
+ indicatorState = "INDICATOR_OFF"
+ return
+ }
+
+ // if charging state is not to be shown set led off
+ if(!_lomiriSettings.chargingStateVisible) {
indicatorState = "INDICATOR_OFF"
return
}
diff --git a/tests/mocks/GSettings.1.0/fake_gsettings.cpp b/tests/mocks/GSettings.1.0/fake_gsettings.cpp
index cd6b57ef45..6f70afa063 100644
--- a/tests/mocks/GSettings.1.0/fake_gsettings.cpp
+++ b/tests/mocks/GSettings.1.0/fake_gsettings.cpp
@@ -29,6 +29,7 @@ GSettingsControllerQml::GSettingsControllerQml()
, m_edgeDragWidth(2)
, m_enableIndicatorMenu(true)
, m_appstoreUri("http://uappexplorer.com")
+ , m_chargingStateVisible(true)
{
}
@@ -160,6 +161,19 @@ void GSettingsControllerQml::setEnableIndicatorMenu(bool enableIndicatorMenu)
}
}
+bool GSettingsControllerQml::chargingStateVisible() const
+{
+ return m_chargingStateVisible;
+}
+
+void GSettingsControllerQml::setChargingStateVisible(bool chargingStateVisible)
+{
+ if (m_chargingStateVisible != chargingStateVisible) {
+ m_chargingStateVisible = chargingStateVisible;
+ Q_EMIT chargingStateVisibleChanged(chargingStateVisible);
+ }
+}
+
QString GSettingsControllerQml::appstoreUri() const
{
return m_appstoreUri;
@@ -398,3 +412,19 @@ void GSettingsQml::setEnableIndicatorMenu(const QVariant &enableIndicatorMenu)
GSettingsControllerQml::instance()->setEnableIndicatorMenu(enableIndicatorMenu.toBool());
}
}
+
+QVariant GSettingsQml::chargingStateVisible() const
+{
+ if (m_valid && m_schema->id() == "com.lomiri.LedIndication") {
+ return GSettingsControllerQml::instance()->chargingStateVisible();
+ } else {
+ return QVariant();
+ }
+}
+
+void GSettingsQml::setChargingStateVisible(const QVariant &chargingStateVisible)
+{
+ if (m_valid && m_schema->id() == "com.lomiri.LedIndication") {
+ GSettingsControllerQml::instance()->setChargingStateVisible(chargingStateVisible.toBool());
+ }
+}
diff --git a/tests/mocks/GSettings.1.0/fake_gsettings.h b/tests/mocks/GSettings.1.0/fake_gsettings.h
index 8ce6fc7617..d4b727bbaa 100644
--- a/tests/mocks/GSettings.1.0/fake_gsettings.h
+++ b/tests/mocks/GSettings.1.0/fake_gsettings.h
@@ -59,6 +59,7 @@ class GSettingsQml: public QObject, public QQmlParserStatus
Q_PROPERTY(QVariant edgeDragWidth READ edgeDragWidth WRITE setEdgeDragWidth NOTIFY edgeDragWidthChanged)
Q_PROPERTY(QVariant enableIndicatorMenu READ enableIndicatorMenu WRITE setEnableIndicatorMenu NOTIFY enableIndicatorMenuChanged)
Q_PROPERTY(QVariant appstoreUri READ appstoreUri NOTIFY appstoreUriChanged)
+ Q_PROPERTY(QVariant chargingStateVisible READ chargingStateVisible WRITE setChargingStateVisible NOTIFY chargingStateVisibleChanged)
public:
GSettingsQml(QObject *parent = nullptr);
@@ -77,6 +78,7 @@ class GSettingsQml: public QObject, public QQmlParserStatus
QVariant edgeDragWidth() const;
QVariant enableIndicatorMenu() const;
QVariant appstoreUri() const;
+ QVariant chargingStateVisible() const;
void setDisableHeight(const QVariant &val);
void setPictureUri(const QVariant &str);
@@ -87,6 +89,7 @@ class GSettingsQml: public QObject, public QQmlParserStatus
void setLauncherWidth(const QVariant &launcherWidth);
void setEdgeDragWidth(const QVariant &edgeDragWidth);
void setEnableIndicatorMenu(const QVariant &enableIndicatorMenu);
+ void setChargingStateVisible(const QVariant &chargingStateVisible);
Q_SIGNALS:
void disableHeightChanged();
@@ -100,6 +103,11 @@ class GSettingsQml: public QObject, public QQmlParserStatus
void edgeDragWidthChanged();
void enableIndicatorMenuChanged();
void appstoreUriChanged();
+ void chargingStateVisibleChanged();
+
+ // This signal is not implemented but it's declaration is required
+ // for qml elements using the GSettings onChanged event.
+ void changed(const QString &key, const QVariant &value);
private:
GSettingsSchemaQml* m_schema;
@@ -145,6 +153,9 @@ class GSettingsControllerQml: public QObject
QString appstoreUri() const;
+ bool chargingStateVisible() const;
+ Q_INVOKABLE void setChargingStateVisible(bool chargingStateVisible);
+
Q_SIGNALS:
void disableHeightChanged();
void pictureUriChanged(const QString&);
@@ -156,6 +167,7 @@ class GSettingsControllerQml: public QObject
void edgeDragWidthChanged(uint edgeDragWidth);
void enableIndicatorMenuChanged(bool enableIndicatorMenu);
void appstoreUriChanged(const QString &appstoreUri);
+ void chargingStateVisibleChanged(bool chargingStateVisible);
private:
GSettingsControllerQml();
@@ -170,6 +182,7 @@ class GSettingsControllerQml: public QObject
uint m_edgeDragWidth;
bool m_enableIndicatorMenu;
QString m_appstoreUri;
+ bool m_chargingStateVisible;
static GSettingsControllerQml* s_controllerInstance;
QList m_registeredGSettings;
diff --git a/tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml b/tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml
index 0595c683b3..f3d7b24f76 100644
--- a/tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml
+++ b/tests/qmltests/Panel/Indicators/tst_IndicatorsLight.qml
@@ -19,6 +19,7 @@ import QtQuick.Layouts 1.1
import Unity.Test 0.1 as UT
import Unity.Indicators 0.1 as Indicators
import Ubuntu.Components 1.3
+import GSettings 1.0
import Powerd 0.1
import Lights 0.1
import QMenuModel 0.1
@@ -46,21 +47,16 @@ Item {
}
};
- Component {
- id: light
- IndicatorsLight {}
- }
-
- Loader {
- id: loader
- sourceComponent: light
- }
-
Component.onCompleted: {
ActionData.data = newMessage;
Powerd.setStatus(Powerd.On, Powerd.Unknown);
}
+ GSettings {
+ id: lomiriSettings
+ schema.id: "com.lomiri.LedIndication"
+ }
+
RowLayout {
anchors.fill: parent
anchors.margins: units.gu(1)
@@ -147,14 +143,15 @@ Item {
property color orangeRed: "orangeRed"
UT.UnityTestCase {
+ id: testCase
name: "IndicatorsLight"
when: windowShown
function init() {
// reload
ActionData.data = noNewMessage;
- loader.sourceComponent = undefined;
- loader.sourceComponent = light;
+ lomiriSettings.chargingStateVisible = true;
+ Powerd.setStatus(Powerd.On, Powerd.Unknown);
}
function test_LightsStatus_data() {
@@ -265,22 +262,42 @@ Item {
{ tag: "Powerd.Off while charging & no support for multicolor led",
expectedLightsState: Lights.Off,
powerd: Powerd.Off, actionData: deviceStateDBusSignals.charging, supportsMultiColorLed: false },
+
+ //
+ // Charging state visibility
+ //
+ { tag: "Powerd.Off with New Message & chargingStateVisible==false",
+ expectedLightsState: Lights.On,
+ powerd: Powerd.Off, actionData: newMessage, chargingStateVisible: false },
+ { tag: "Powerd.Off while charging & chargingStateVisible==false",
+ expectedLightsState: Lights.Off,
+ powerd: Powerd.Off, actionData: deviceStateDBusSignals.charging, chargingStateVisible: false },
+ { tag: "Powerd.Off while charging & chargingStateVisible==true",
+ expectedLightsState: Lights.On,
+ powerd: Powerd.Off, actionData: deviceStateDBusSignals.charging, chargingStateVisible: true },
+ { tag: "Powerd.Off while charging & chargingStateVisible==true & no support for multicolor led",
+ expectedLightsState: Lights.Off,
+ powerd: Powerd.Off, actionData: deviceStateDBusSignals.charging, chargingStateVisible: true, supportsMultiColorLed: false },
+
]
}
function test_LightsStatus(data) {
- console.log("----------------------------------------------------------------")
+ var item = createTemporaryQmlObject("import QtQuick 2.0; import\"" + Qt.resolvedUrl("../../../../qml/Panel/Indicators") + "\"; IndicatorsLight {}", testCase);
+ console.log("----------------------------------------------------------------")
if (data.hasOwnProperty("supportsMultiColorLed"))
- loader.item.supportsMultiColorLed = data.supportsMultiColorLed
+ item.supportsMultiColorLed = data.supportsMultiColorLed
+ if (data.hasOwnProperty("chargingStateVisible"))
+ lomiriSettings.chargingStateVisible = data.chargingStateVisible
if (data.hasOwnProperty("powerd"))
Powerd.setStatus(data.powerd, Powerd.Unknown)
if (data.hasOwnProperty("actionData"))
ActionData.data = data.actionData
if (data.hasOwnProperty("wizardStatus"))
- loader.item.batteryIconName = data.wizardStatus
+ item.batteryIconName = data.wizardStatus
- compare(Lights.state, data.expectedLightsState, "Lights state does not match expected value");
+ compare(Lights.state, data.expectedLightsState, "Lights state does not match expected value")
if (data.hasOwnProperty("expectedLightsColor"))
compare(Lights.color, data.expectedLightsColor, "Lights color does not match expected value")
if (data.hasOwnProperty("expectedLightsOnMillisec"))