blob: 220525387c2ca2bf8004e9ac40396657dd92f066 [file] [log] [blame]
bigbiff bigbiff8a68c312013-02-10 14:28:30 -05001/*
2 Copyright 2012 bigbiff/Dees_Troy TeamWin
3 This file is part of TWRP/TeamWin Recovery Project.
4
5 TWRP is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation, either version 3 of the License, or
8 (at your option) any later version.
9
10 TWRP is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with TWRP. If not, see <http://www.gnu.org/licenses/>.
17*/
18
19using namespace std;
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050020#include <string>
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050021#include <pthread.h>
22#include <sys/time.h>
23#include <time.h>
24#include <unistd.h>
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050025#include "pages.hpp"
26#include "blanktimer.hpp"
bigbiff bigbifff8e2f372013-02-27 20:50:43 -050027#include "../data.hpp"
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050028extern "C" {
Dees_Troy2673cec2013-04-02 20:22:16 +000029#include "../twcommon.h"
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050030}
Ethan Yonkerfbb43532015-12-28 21:54:50 +010031#include "../minuitwrp/minui.h"
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050032#include "../twrp-functions.hpp"
33#include "../variables.h"
34
35blanktimer::blanktimer(void) {
thatfb759d42015-01-11 12:16:53 +010036 pthread_mutex_init(&mutex, NULL);
37 setTime(0); // no timeout
38 state = kOn;
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050039 orig_brightness = getBrightness();
gordon13370d9133d2013-06-08 14:17:07 +020040}
41
thatfb759d42015-01-11 12:16:53 +010042bool blanktimer::isScreenOff() {
43 return state >= kOff;
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050044}
45
Dees_Troy2f9117a2013-02-17 19:52:09 -060046void blanktimer::setTime(int newtime) {
thatfb759d42015-01-11 12:16:53 +010047 pthread_mutex_lock(&mutex);
Dees_Troy2f9117a2013-02-17 19:52:09 -060048 sleepTimer = newtime;
thatfb759d42015-01-11 12:16:53 +010049 pthread_mutex_unlock(&mutex);
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050050}
51
52void blanktimer::setTimer(void) {
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050053 clock_gettime(CLOCK_MONOTONIC, &btimer);
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050054}
55
thatfb759d42015-01-11 12:16:53 +010056void blanktimer::checkForTimeout() {
57#ifndef TW_NO_SCREEN_TIMEOUT
58 pthread_mutex_lock(&mutex);
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050059 timespec curTime, diff;
thatfb759d42015-01-11 12:16:53 +010060 clock_gettime(CLOCK_MONOTONIC, &curTime);
61 diff = TWFunc::timespec_diff(btimer, curTime);
62 if (sleepTimer > 2 && diff.tv_sec > (sleepTimer - 2) && state == kOn) {
63 orig_brightness = getBrightness();
64 state = kDim;
65 TWFunc::Set_Brightness("5");
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050066 }
thatfb759d42015-01-11 12:16:53 +010067 if (sleepTimer && diff.tv_sec > sleepTimer && state < kOff) {
68 state = kOff;
69 TWFunc::Set_Brightness("0");
70 TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
71 PageManager::ChangeOverlay("lock");
72 }
73#ifndef TW_NO_SCREEN_BLANK
Ethan Yonkerfbb43532015-12-28 21:54:50 +010074 if (state == kOff) {
75 gr_fb_blank(true);
thatfb759d42015-01-11 12:16:53 +010076 state = kBlanked;
77 }
78#endif
79 pthread_mutex_unlock(&mutex);
80#endif
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050081}
82
xNUTxe85f02d2014-07-18 01:30:58 +020083string blanktimer::getBrightness(void) {
84 string result;
Tatsuyuki Ishi548a1752015-12-28 10:08:58 +090085
86 if (DataManager::GetIntValue("tw_has_brightnesss_file")) {
87 DataManager::GetValue("tw_brightness", result);
88 if (result.empty())
89 result = "255";
Dees_Troya13d74f2013-03-24 08:54:55 -050090 }
91 return result;
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050092}
93
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050094void blanktimer::resetTimerAndUnblank(void) {
thatfb759d42015-01-11 12:16:53 +010095#ifndef TW_NO_SCREEN_TIMEOUT
96 pthread_mutex_lock(&mutex);
bigbiff bigbiff8a68c312013-02-10 14:28:30 -050097 setTimer();
thatfb759d42015-01-11 12:16:53 +010098 switch (state) {
99 case kBlanked:
bigbiff bigbiff87940362013-03-09 09:58:50 -0500100#ifndef TW_NO_SCREEN_BLANK
Ethan Yonkerfbb43532015-12-28 21:54:50 +0100101 gr_fb_blank(false);
bigbiff bigbiff87940362013-03-09 09:58:50 -0500102#endif
thatfb759d42015-01-11 12:16:53 +0100103 // TODO: this is asymmetric with postscreenblank.sh - shouldn't it be under the next case label?
Dees_Troy1c8d4fb2013-07-12 15:05:29 +0000104 TWFunc::check_and_run_script("/sbin/postscreenunblank.sh", "unblank");
Dees_Troy70237dc2013-02-28 21:31:48 +0000105 // No break here, we want to keep going
thatfb759d42015-01-11 12:16:53 +0100106 case kOff:
Dees_Troy70237dc2013-02-28 21:31:48 +0000107 gui_forceRender();
108 // No break here, we want to keep going
thatfb759d42015-01-11 12:16:53 +0100109 case kDim:
Tatsuyuki Ishi548a1752015-12-28 10:08:58 +0900110 if (!orig_brightness.empty())
xNUTxe85f02d2014-07-18 01:30:58 +0200111 TWFunc::Set_Brightness(orig_brightness);
thatfb759d42015-01-11 12:16:53 +0100112 state = kOn;
113 case kOn:
Dees_Troy70237dc2013-02-28 21:31:48 +0000114 break;
bigbiff bigbiff8a68c312013-02-10 14:28:30 -0500115 }
thatfb759d42015-01-11 12:16:53 +0100116 pthread_mutex_unlock(&mutex);
117#endif
bigbiff bigbiff8a68c312013-02-10 14:28:30 -0500118}
Matt Mower9472ba12016-01-20 18:12:47 -0600119
120void blanktimer::blank(void) {
121/* 1) No need for timer handling since checkForTimeout() verifies
122 * state of screen before performing screen-off
123 * 2) Assume screen-off causes issues for devices that set
124 * TW_NO_SCREEN_TIMEOUT and do not blank screen here either
125 */
126
127#ifndef TW_NO_SCREEN_TIMEOUT
128 pthread_mutex_lock(&mutex);
129 if (state == kOn) {
130 orig_brightness = getBrightness();
131 state = kOff;
132 TWFunc::Set_Brightness("0");
133 TWFunc::check_and_run_script("/sbin/postscreenblank.sh", "blank");
134 }
135#ifndef TW_NO_SCREEN_BLANK
136 if (state == kOff) {
137 gr_fb_blank(true);
138 state = kBlanked;
139 }
140#endif
141 pthread_mutex_unlock(&mutex);
142#endif
143}
144
145void blanktimer::toggleBlank(void) {
146 if (state == kOn) {
147 blank();
148 PageManager::ChangeOverlay("lock");
149 } else {
150 resetTimerAndUnblank();
151 }
152}