gui: Actions: Toggle backlight on power key

Create GUIAction to handle KEY_POWER with a screen backlight toggle.

Change-Id: Iad0a7923b4a776e0336722db74d6fc46cd0107a2
diff --git a/gui/action.cpp b/gui/action.cpp
index 7d34da8..ef110bc 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -198,6 +198,7 @@
 		ADD_ACTION(mountsystemtoggle);
 		ADD_ACTION(setlanguage);
 		ADD_ACTION(checkforapp);
+		ADD_ACTION(togglebacklight);
 
 		// remember actions that run in the caller thread
 		for (mapFunc::const_iterator it = mf.begin(); it != mf.end(); ++it)
@@ -1865,6 +1866,12 @@
 	return 0;
 }
 
+int GUIAction::togglebacklight(std::string arg __unused)
+{
+	blankTimer.toggleBlank();
+	return 0;
+}
+
 int GUIAction::setbootslot(std::string arg)
 {
 	operation_start("Set Boot Slot");
diff --git a/gui/blanktimer.cpp b/gui/blanktimer.cpp
index 4662b1f..2205253 100644
--- a/gui/blanktimer.cpp
+++ b/gui/blanktimer.cpp
@@ -116,3 +116,37 @@
 	pthread_mutex_unlock(&mutex);
 #endif
 }
+
+void blanktimer::blank(void) {
+/*  1) No need for timer handling since checkForTimeout() verifies
+ *     state of screen before performing screen-off
+ *  2) Assume screen-off causes issues for devices that set
+ *     TW_NO_SCREEN_TIMEOUT and do not blank screen here either
+ */
+
+#ifndef TW_NO_SCREEN_TIMEOUT
+	pthread_mutex_lock(&mutex);
+	if (state == kOn) {
+		orig_brightness = getBrightness();
+		state = kOff;
+		TWFunc::Set_Brightness("0");
+		TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
+	}
+#ifndef TW_NO_SCREEN_BLANK
+	if (state == kOff) {
+		gr_fb_blank(true);
+		state = kBlanked;
+	}
+#endif
+	pthread_mutex_unlock(&mutex);
+#endif
+}
+
+void blanktimer::toggleBlank(void) {
+	if (state == kOn) {
+		blank();
+		PageManager::ChangeOverlay("lock");
+	} else {
+		resetTimerAndUnblank();
+	}
+}
diff --git a/gui/blanktimer.hpp b/gui/blanktimer.hpp
index 5e61790..fe7b77c 100644
--- a/gui/blanktimer.hpp
+++ b/gui/blanktimer.hpp
@@ -37,11 +37,15 @@
 	// call this when an input event is received or when an operation is finished
 	void resetTimerAndUnblank();
 
+	// call this when power button is pressed
+	void toggleBlank(void);
+
 	bool isScreenOff();
 
 private:
 	void setTimer(void);
 	string getBrightness(void);
+	void blank(void);
 
 	pthread_mutex_t mutex;
 	enum State { kOn = 0, kDim = 1, kOff = 2, kBlanked = 3 };
diff --git a/gui/gui.cpp b/gui/gui.cpp
index 17ed108..3f1312f 100644
--- a/gui/gui.cpp
+++ b/gui/gui.cpp
@@ -205,7 +205,9 @@
 		break;
 	}
 
-	blankTimer.resetTimerAndUnblank();
+	if (ev.code != KEY_POWER && ev.code > KEY_RESERVED)
+		blankTimer.resetTimerAndUnblank();
+
 	return true;  // we got an event, so there might be more in the queue
 }
 
diff --git a/gui/objects.hpp b/gui/objects.hpp
index f1c9c49..28ed29c 100644
--- a/gui/objects.hpp
+++ b/gui/objects.hpp
@@ -363,6 +363,7 @@
 	int checkpartitionlifetimewrites(std::string arg);
 	int mountsystemtoggle(std::string arg);
 	int setlanguage(std::string arg);
+	int togglebacklight(std::string arg);
 	int twcmd(std::string arg);
 	int setbootslot(std::string arg);
 	int installapp(std::string arg);
diff --git a/gui/theme/common/landscape.xml b/gui/theme/common/landscape.xml
index 3aed198..b0e4238 100644
--- a/gui/theme/common/landscape.xml
+++ b/gui/theme/common/landscape.xml
@@ -3517,6 +3517,11 @@
 				<text>{@swipe_to_unlock=Swipe to Unlock}</text>
 				<action function="overlay"/>
 			</slider>
+
+			<action>
+				<touch key="power"/>
+				<action function="togglebacklight"/>
+			</action>
 		</page>
 
 		<page name="filemanagerlist">
diff --git a/gui/theme/common/portrait.xml b/gui/theme/common/portrait.xml
index 80e358b..7e30be4 100644
--- a/gui/theme/common/portrait.xml
+++ b/gui/theme/common/portrait.xml
@@ -3779,6 +3779,11 @@
 				<text>{@swipe_to_unlock=Swipe to Unlock}</text>
 				<action function="overlay"/>
 			</slider>
+
+			<action>
+				<touch key="power"/>
+				<action function="togglebacklight"/>
+			</action>
 		</page>
 
 		<page name="filemanagerlist">
diff --git a/gui/theme/common/watch.xml b/gui/theme/common/watch.xml
index 921e72c..a62b2b3 100644
--- a/gui/theme/common/watch.xml
+++ b/gui/theme/common/watch.xml
@@ -4424,6 +4424,11 @@
 				<text>{@swipe_unlock=   Unlock}</text>
 				<action function="overlay"/>
 			</slider>
+
+			<action>
+				<touch key="power"/>
+				<action function="togglebacklight"/>
+			</action>
 		</page>
 
 		<page name="filemanagerlist">
diff --git a/gui/theme/landscape_hdpi/ui.xml b/gui/theme/landscape_hdpi/ui.xml
index 2e26352..16efc88 100644
--- a/gui/theme/landscape_hdpi/ui.xml
+++ b/gui/theme/landscape_hdpi/ui.xml
@@ -432,7 +432,7 @@
 
 			<action>
 				<touch key="power"/>
-				<action function="overlay">lock</action>
+				<action function="togglebacklight"/>
 			</action>
 
 			<action>
diff --git a/gui/theme/landscape_mdpi/ui.xml b/gui/theme/landscape_mdpi/ui.xml
index 8b63dcb..bb8f172 100644
--- a/gui/theme/landscape_mdpi/ui.xml
+++ b/gui/theme/landscape_mdpi/ui.xml
@@ -432,7 +432,7 @@
 
 			<action>
 				<touch key="power"/>
-				<action function="overlay">lock</action>
+				<action function="togglebacklight"/>
 			</action>
 
 			<action>
diff --git a/gui/theme/portrait_hdpi/ui.xml b/gui/theme/portrait_hdpi/ui.xml
index a5ee22c..67eaa5a 100644
--- a/gui/theme/portrait_hdpi/ui.xml
+++ b/gui/theme/portrait_hdpi/ui.xml
@@ -336,7 +336,7 @@
 
 			<action>
 				<touch key="power"/>
-				<action function="overlay">lock</action>
+				<action function="togglebacklight"/>
 			</action>
 
 			<action>
diff --git a/gui/theme/portrait_mdpi/ui.xml b/gui/theme/portrait_mdpi/ui.xml
index 9a0adf3..8d424db 100644
--- a/gui/theme/portrait_mdpi/ui.xml
+++ b/gui/theme/portrait_mdpi/ui.xml
@@ -336,7 +336,7 @@
 
 			<action>
 				<touch key="power"/>
-				<action function="overlay">lock</action>
+				<action function="togglebacklight"/>
 			</action>
 
 			<action>
diff --git a/gui/theme/watch_mdpi/ui.xml b/gui/theme/watch_mdpi/ui.xml
index c56610b..b2f069d 100644
--- a/gui/theme/watch_mdpi/ui.xml
+++ b/gui/theme/watch_mdpi/ui.xml
@@ -258,7 +258,7 @@
 
 			<action>
 				<touch key="power"/>
-				<action function="overlay">lock</action>
+				<action function="togglebacklight"/>
 			</action>
 
 			<action>