Add auto brightness
authorJinWang An <jinwang.an@samsung.com>
Thu, 30 Jan 2020 01:10:29 +0000 (10:10 +0900)
committerYoungjae Shin <yj99.shin@samsung.com>
Thu, 19 Mar 2020 04:30:37 +0000 (13:30 +0900)
display/DisplayAutoBrightness.cpp [new file with mode: 0644]
display/DisplayAutoBrightness.h [new file with mode: 0644]
display/DisplayFactory.cpp
display/DisplayFactory.h
display/DisplayTimeout.cpp
display/tizen_display_rule.xml
unittests/mdsp_test_display.cpp
unittests/mode/tizen_displayBlock_mode.xml

diff --git a/display/DisplayAutoBrightness.cpp b/display/DisplayAutoBrightness.cpp
new file mode 100644 (file)
index 0000000..e99ffa6
--- /dev/null
@@ -0,0 +1,121 @@
+/*
+ * Copyright (c) 2019-2020 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#include "DisplayAutoBrightness.h"
+#include <sstream>
+#include <string>
+#include <vconf.h>
+#include <modes_errors.h>
+#include "plugin-log.h"
+
+MODES_NAMESPACE_USE;
+
+const std::string DisplayAutoBrightness::NAME = "autoBrightness";
+const char* const DisplayAutoBrightness::key = VCONFKEY_SETAPPL_BRIGHTNESS_AUTOMATIC_INT;
+
+DisplayAutoBrightness::DisplayAutoBrightness()
+       :DisplayAction(NAME), oldVal(-1)
+{
+}
+
+DisplayAutoBrightness::~DisplayAutoBrightness()
+{
+}
+
+int DisplayAutoBrightness::set(int val)
+{
+       int ret = vconf_get_int(key, &oldVal);
+       if (0 != ret) {
+               ERR("vconf_get_int(%s) Fail(%d)", key, ret);
+               return MODES_ERROR_SYSTEM;
+       }
+
+       if (oldVal == val) {
+               INFO("Auto brightness already set(%d)", val);
+               return MODES_ERROR_NONE;
+       }
+
+       ret = vconf_set_int(key, val);
+       if (0 != ret) {
+               ERR("vconf_set_int(%s, %d) Fail(%d)", key, val, ret);
+               return MODES_ERROR_SYSTEM;
+       }
+
+       return MODES_ERROR_NONE;
+}
+
+void DisplayAutoBrightness::undo()
+{
+       RET_IF(-1 == oldVal);
+
+       int ret = vconf_set_int(key, oldVal);
+       if (0 != ret)
+               ERR("vconf_set_int(%s, %d) Fail(%d)", key, oldVal, ret);
+}
+
+std::string DisplayAutoBrightness::serialize()
+{
+       std::ostringstream ostr;
+
+       ostr << oldVal;
+       return ostr.str();
+}
+
+int DisplayAutoBrightness::parse(const std::string &archive)
+{
+       std::istringstream iss(archive);
+       iss >> oldVal;
+
+       return MODES_ERROR_NONE;
+}
+
+int DisplayAutoBrightness::setChangedCallback(valueChangedCB callback, void *userData)
+{
+       cbData = userData;
+       cb = callback;
+       int ret = vconf_notify_key_changed(key, autoBrightnessChangedCB, this);
+       if (0 != ret) {
+               ERR("vconf_notify_key_changed(%s) Fail(%d)", key, ret);
+               return MODES_ERROR_SYSTEM;
+       }
+       return MODES_ERROR_NONE;
+}
+
+void DisplayAutoBrightness::unSetChangedCallback(valueChangedCB callback, void *userData)
+{
+       int ret = vconf_ignore_key_changed(key, autoBrightnessChangedCB);
+       if (0 != ret)
+               ERR("vconf_ignore_key_changed(%s) Fail(%d)", key, ret);
+
+       cbData = NULL;
+       cb = NULL;
+}
+
+void DisplayAutoBrightness::autoBrightnessChangedCB(keynode_t *node, void *userData)
+{
+       DisplayAutoBrightness *action = (DisplayAutoBrightness*)userData;
+
+       RET_IF(NULL == userData);
+
+       int val = 0;
+       int ret = vconf_get_int(key, &val);
+       if (0 != ret) {
+               ERR("vconf_get_int(%s) Fail(%d)", key, ret);
+               return;
+       }
+
+       if (action->cb && (val != action->autoBrightness))
+               action->cb(action->cbData);
+}
diff --git a/display/DisplayAutoBrightness.h b/display/DisplayAutoBrightness.h
new file mode 100644 (file)
index 0000000..3383286
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * Copyright (c) 2019-2020 Samsung Electronics Co., Ltd All Rights Reserved
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+#pragma once
+
+#include <string>
+#include <vconf.h>
+#include "plugin-def.h"
+#include "DisplayAction.h"
+
+MODES_NAMESPACE_BEGIN
+
+class DisplayAutoBrightness : public DisplayAction {
+public:
+       DisplayAutoBrightness();
+       ~DisplayAutoBrightness();
+
+       int set(int val) override;
+       void undo() override;
+       std::string serialize() override;
+       int parse(const std::string &archive) override;
+
+       int setChangedCallback(valueChangedCB callback, void *userData) override;
+       void unSetChangedCallback(valueChangedCB callback, void *userData) override;
+
+       static const std::string NAME;
+
+private:
+       static void autoBrightnessChangedCB(keynode_t *node, void *userData);
+
+       static const char* const key;
+       int oldVal;
+       int autoBrightness;
+       valueChangedCB cb;
+       void *cbData;
+};
+
+MODES_NAMESPACE_END
index e60a782..b3e2dda 100644 (file)
@@ -18,6 +18,7 @@
 #include <device/power.h>
 #include "plugin-log.h"
 #include "DisplayBrightness.h"
+#include "DisplayAutoBrightness.h"
 #include "DisplayTimeout.h"
 #include "DisplayAllowPalmTouch.h"
 
@@ -26,6 +27,7 @@ MODES_NAMESPACE_USE;
 DisplayFactory::DisplayFactory()
 {
        actionMap[DisplayBrightness::NAME] = BRIGHTNESS;
+       actionMap[DisplayAutoBrightness::NAME] = AUTO_BRIGHTNESS;
        actionMap[DisplayTimeout::NAME] = TIMEOUT;
        actionMap[DisplayAllowPalmTouch::NAME] = ALLOW_PALM_TOUCH;
 }
@@ -43,6 +45,9 @@ DisplayAction* DisplayFactory::createAction(const std::string &key)
        case BRIGHTNESS:
                action = new DisplayBrightness();
                break;
+       case AUTO_BRIGHTNESS:
+               action = new DisplayAutoBrightness();
+               break;
        case TIMEOUT:
                action = new DisplayTimeout();
                break;
index 7c675ce..a440e3d 100644 (file)
@@ -31,6 +31,7 @@ public:
 private:
        enum actionKey{
                BRIGHTNESS,
+               AUTO_BRIGHTNESS,
                TIMEOUT,
                ALLOW_PALM_TOUCH,
        };
index 62f6deb..d68f0e9 100644 (file)
@@ -22,7 +22,7 @@
 
 MODES_NAMESPACE_USE;
 
-const std::string DisplayTimeout::NAME = "Timeout";
+const std::string DisplayTimeout::NAME = "timeout";
 DisplayTimeout::DisplayTimeout()
        :DisplayAction(NAME), key(VCONFKEY_SETAPPL_LCD_TIMEOUT_NORMAL), oldDisplayTimeout(-1)
 {
index de543b0..542619f 100644 (file)
@@ -5,7 +5,14 @@
       <desc>Display brightness</desc>
       <domain>System</domain>
     </rule>
-    <rule name="display.Timeout" type="int" since="6.0" plugin="display">
+    <rule name="display.autoBrightness" type="int" since="6.0" plugin="display">
+      <alias name="off">0</alias>
+      <alias name="on">1</alias>
+      <alias name="pause">2</alias>
+      <desc>Display auto brightness</desc>
+      <domain>System</domain>
+    </rule>
+    <rule name="display.timeout" type="int" since="6.0" plugin="display">
       <alias name="ALWAYS_ON">0</alias>
       <desc>Display Timeout</desc>
       <domain>System</domain>
index 430d479..fb86106 100644 (file)
@@ -69,7 +69,7 @@ protected:
        static gboolean displayPluginAlwaysOnIdler(gpointer data)
        {
                PluginAction *action;
-               result = plugin->set("Timeout", 0, &action);
+               result = plugin->set("timeout", 0, &action);
                EXPECT_EQ(MODES_ERROR_NONE, result);
 
                plugin->undo(action);
@@ -78,6 +78,22 @@ protected:
 
                return G_SOURCE_REMOVE;
        }
+
+       static gboolean displayPluginAutoBrightnessIdler(gpointer data)
+       {
+               PluginAction *action;
+               result = plugin->set("autoBrightness", 1, &action);
+               EXPECT_EQ(MODES_ERROR_NONE, result);
+
+               plugin->undo(action);
+
+               result = plugin->set("autoBrightness", 2, &action);
+               EXPECT_EQ(MODES_ERROR_NONE, result);
+
+               g_main_loop_quit(loop);
+
+               return G_SOURCE_REMOVE;
+       }
        static int result;
        static GMainLoop *loop;
        static Plugin *plugin;
@@ -93,6 +109,12 @@ TEST_F(displayPluginTest, setBrightness)
        g_main_loop_run(loop);
 }
 
+TEST_F(displayPluginTest, setAutoBrightness)
+{
+       g_idle_add(displayPluginAutoBrightnessIdler, plugin);
+       g_main_loop_run(loop);
+}
+
 TEST_F(displayPluginTest, setAlwaysOn)
 {
        g_idle_add(displayPluginAlwaysOnIdler, plugin);
index 5fd3b41..37b999a 100644 (file)
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <tizenModes xmlns="http://www.tizen.org" version="6.0">
   <mode name="displayBlock" type="exclusive">
-    <action rule="display.Timeout">ALWAYS_ON</action>
+    <action rule="display.timeout">ALWAYS_ON</action>
     <action rule="display.allowPalmTouch">off</action>
   </mode>
 </tizenModes>