summaryrefslogtreecommitdiffstats
path: root/gui/blanktimer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'gui/blanktimer.cpp')
-rw-r--r--gui/blanktimer.cpp152
1 files changed, 152 insertions, 0 deletions
diff --git a/gui/blanktimer.cpp b/gui/blanktimer.cpp
new file mode 100644
index 000000000..220525387
--- /dev/null
+++ b/gui/blanktimer.cpp
@@ -0,0 +1,152 @@
+/*
+ Copyright 2012 bigbiff/Dees_Troy TeamWin
+ This file is part of TWRP/TeamWin Recovery Project.
+
+ TWRP is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ TWRP is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with TWRP. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+using namespace std;
+#include <string>
+#include <pthread.h>
+#include <sys/time.h>
+#include <time.h>
+#include <unistd.h>
+#include "pages.hpp"
+#include "blanktimer.hpp"
+#include "../data.hpp"
+extern "C" {
+#include "../twcommon.h"
+}
+#include "../minuitwrp/minui.h"
+#include "../twrp-functions.hpp"
+#include "../variables.h"
+
+blanktimer::blanktimer(void) {
+ pthread_mutex_init(&mutex, NULL);
+ setTime(0); // no timeout
+ state = kOn;
+ orig_brightness = getBrightness();
+}
+
+bool blanktimer::isScreenOff() {
+ return state >= kOff;
+}
+
+void blanktimer::setTime(int newtime) {
+ pthread_mutex_lock(&mutex);
+ sleepTimer = newtime;
+ pthread_mutex_unlock(&mutex);
+}
+
+void blanktimer::setTimer(void) {
+ clock_gettime(CLOCK_MONOTONIC, &btimer);
+}
+
+void blanktimer::checkForTimeout() {
+#ifndef TW_NO_SCREEN_TIMEOUT
+ pthread_mutex_lock(&mutex);
+ timespec curTime, diff;
+ clock_gettime(CLOCK_MONOTONIC, &curTime);
+ diff = TWFunc::timespec_diff(btimer, curTime);
+ if (sleepTimer > 2 && diff.tv_sec > (sleepTimer - 2) && state == kOn) {
+ orig_brightness = getBrightness();
+ state = kDim;
+ TWFunc::Set_Brightness("5");
+ }
+ if (sleepTimer && diff.tv_sec > sleepTimer && state < kOff) {
+ state = kOff;
+ TWFunc::Set_Brightness("0");
+ TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
+ PageManager::ChangeOverlay("lock");
+ }
+#ifndef TW_NO_SCREEN_BLANK
+ if (state == kOff) {
+ gr_fb_blank(true);
+ state = kBlanked;
+ }
+#endif
+ pthread_mutex_unlock(&mutex);
+#endif
+}
+
+string blanktimer::getBrightness(void) {
+ string result;
+
+ if (DataManager::GetIntValue("tw_has_brightnesss_file")) {
+ DataManager::GetValue("tw_brightness", result);
+ if (result.empty())
+ result = "255";
+ }
+ return result;
+}
+
+void blanktimer::resetTimerAndUnblank(void) {
+#ifndef TW_NO_SCREEN_TIMEOUT
+ pthread_mutex_lock(&mutex);
+ setTimer();
+ switch (state) {
+ case kBlanked:
+#ifndef TW_NO_SCREEN_BLANK
+ gr_fb_blank(false);
+#endif
+ // TODO: this is asymmetric with postscreenblank.sh - shouldn't it be under the next case label?
+ TWFunc::check_and_run_script("/sbin/postscreenunblank.sh", "unblank");
+ // No break here, we want to keep going
+ case kOff:
+ gui_forceRender();
+ // No break here, we want to keep going
+ case kDim:
+ if (!orig_brightness.empty())
+ TWFunc::Set_Brightness(orig_brightness);
+ state = kOn;
+ case kOn:
+ break;
+ }
+ 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();
+ }
+}