summaryrefslogtreecommitdiffstats
path: root/healthd
diff options
context:
space:
mode:
authorkentsou <kentsou@google.com>2018-07-17 17:49:34 +0800
committerThierry Strudel <tstrudel@google.com>2018-08-17 03:58:19 +0000
commitba61ea462fb8069ea26fa737ff40a454c46c5a2e (patch)
tree32c1090021297aaff82763b24656bdb8465c1c31 /healthd
parentc0f60b7e4d04b3bb94a891ef29e498bfcbaa1226 (diff)
downloadsystem_core-ba61ea462fb8069ea26fa737ff40a454c46c5a2e.tar.gz
system_core-ba61ea462fb8069ea26fa737ff40a454c46c5a2e.tar.bz2
system_core-ba61ea462fb8069ea26fa737ff40a454c46c5a2e.zip
charger: screen blank on disconnect and 0% not displayed
Bug: 74771887 Test: m -j succeeded and confirm offmode charge UI behavior Change-Id: I8c97230f6c1e32ac9949601a86added79a3ead82 Signed-off-by: kentsou <kentsou@google.com>
Diffstat (limited to 'healthd')
-rw-r--r--healthd/healthd_draw.cpp2
-rw-r--r--healthd/healthd_mode_charger.cpp49
2 files changed, 39 insertions, 12 deletions
diff --git a/healthd/healthd_draw.cpp b/healthd/healthd_draw.cpp
index 30f2cf3be..706dc80ba 100644
--- a/healthd/healthd_draw.cpp
+++ b/healthd/healthd_draw.cpp
@@ -173,7 +173,7 @@ void HealthdDraw::draw_percent(const animation* anim) {
cur_level = 100;
}
- if (cur_level <= 0) return;
+ if (cur_level < 0) return;
const animation::text_field& field = anim->text_percent;
if (field.font == nullptr || field.font->char_width == 0 || field.font->char_height == 0) {
diff --git a/healthd/healthd_mode_charger.cpp b/healthd/healthd_mode_charger.cpp
index 56a9f8691..2eb54972f 100644
--- a/healthd/healthd_mode_charger.cpp
+++ b/healthd/healthd_mode_charger.cpp
@@ -72,6 +72,7 @@ char* locale;
#define BATTERY_UNKNOWN_TIME (2 * MSEC_PER_SEC)
#define POWER_ON_KEY_TIME (2 * MSEC_PER_SEC)
#define UNPLUGGED_SHUTDOWN_TIME (10 * MSEC_PER_SEC)
+#define UNPLUGGED_DISPLAY_TIME (3 * MSEC_PER_SEC)
#define LAST_KMSG_MAX_SZ (32 * 1024)
@@ -91,6 +92,7 @@ struct key_state {
struct charger {
bool have_battery_state;
bool charger_connected;
+ bool screen_blanked;
int64_t next_screen_transition;
int64_t next_key_check;
int64_t next_pwr_check;
@@ -293,6 +295,7 @@ static void update_screen_state(charger* charger, int64_t now) {
#ifndef CHARGER_DISABLE_INIT_BLANK
healthd_draw->blank_screen(true);
+ charger->screen_blanked = true;
#endif
}
@@ -301,6 +304,7 @@ static void update_screen_state(charger* charger, int64_t now) {
reset_animation(batt_anim);
charger->next_screen_transition = -1;
healthd_draw->blank_screen(true);
+ charger->screen_blanked = true;
LOGV("[%" PRId64 "] animation done\n", now);
if (charger->charger_connected) request_suspend(true);
return;
@@ -308,8 +312,10 @@ static void update_screen_state(charger* charger, int64_t now) {
disp_time = batt_anim->frames[batt_anim->cur_frame].disp_time;
- /* unblank the screen on first cycle and first frame */
- if (batt_anim->cur_cycle == 0 && batt_anim->cur_frame == 0) healthd_draw->blank_screen(false);
+ if (charger->screen_blanked) {
+ healthd_draw->blank_screen(false);
+ charger->screen_blanked = false;
+ }
/* animation starting, set up the animation */
if (batt_anim->cur_frame == 0) {
@@ -327,9 +333,15 @@ static void update_screen_state(charger* charger, int64_t now) {
}
}
- // repeat the first frame first_frame_repeats times
- disp_time = batt_anim->frames[batt_anim->cur_frame].disp_time *
- batt_anim->first_frame_repeats;
+ if (charger->charger_connected) {
+ // repeat the first frame first_frame_repeats times
+ disp_time = batt_anim->frames[batt_anim->cur_frame].disp_time *
+ batt_anim->first_frame_repeats;
+ } else {
+ disp_time = UNPLUGGED_DISPLAY_TIME / batt_anim->num_cycles;
+ }
+
+ LOGV("cur_frame=%d disp_time=%d\n", batt_anim->cur_frame, disp_time);
}
}
}
@@ -348,7 +360,7 @@ static void update_screen_state(charger* charger, int64_t now) {
}
/* schedule next screen transition */
- charger->next_screen_transition = now + disp_time;
+ charger->next_screen_transition = curr_time_ms() + disp_time;
/* advance frame cntr to the next valid frame only if we are charging
* if necessary, advance cycle cntr, and reset frame cntr
@@ -458,6 +470,7 @@ static void process_key(charger* charger, int code, int64_t now) {
/* if the power key got released, force screen state cycle */
if (key->pending) {
kick_animation(charger->batt_anim);
+ request_suspend(false);
}
}
}
@@ -476,12 +489,18 @@ static void handle_power_supply_state(charger* charger, int64_t now) {
if (!charger->have_battery_state) return;
if (!charger->charger_connected) {
- /* Last cycle would have stopped at the extreme top of battery-icon
- * Need to show the correct level corresponding to capacity.
- */
- kick_animation(charger->batt_anim);
request_suspend(false);
if (charger->next_pwr_check == -1) {
+ /* Last cycle would have stopped at the extreme top of battery-icon
+ * Need to show the correct level corresponding to capacity.
+ *
+ * Reset next_screen_transition to update screen immediately.
+ * Reset & kick animation to show complete animation cycles
+ * when charger disconnected.
+ */
+ charger->next_screen_transition = now - 1;
+ reset_animation(charger->batt_anim);
+ kick_animation(charger->batt_anim);
charger->next_pwr_check = now + UNPLUGGED_SHUTDOWN_TIME;
LOGW("[%" PRId64 "] device unplugged: shutting down in %" PRId64 " (@ %" PRId64 ")\n",
now, (int64_t)UNPLUGGED_SHUTDOWN_TIME, charger->next_pwr_check);
@@ -494,8 +513,15 @@ static void handle_power_supply_state(charger* charger, int64_t now) {
} else {
/* online supply present, reset shutdown timer if set */
if (charger->next_pwr_check != -1) {
- LOGW("[%" PRId64 "] device plugged in: shutdown cancelled\n", now);
+ /* Reset next_screen_transition to update screen immediately.
+ * Reset & kick animation to show complete animation cycles
+ * when charger connected again.
+ */
+ request_suspend(false);
+ charger->next_screen_transition = now - 1;
+ reset_animation(charger->batt_anim);
kick_animation(charger->batt_anim);
+ LOGW("[%" PRId64 "] device plugged in: shutdown cancelled\n", now);
}
charger->next_pwr_check = -1;
}
@@ -523,6 +549,7 @@ void healthd_mode_charger_battery_update(android::BatteryProperties* props) {
if (!charger->have_battery_state) {
charger->have_battery_state = true;
charger->next_screen_transition = curr_time_ms() - 1;
+ request_suspend(false);
reset_animation(charger->batt_anim);
kick_animation(charger->batt_anim);
}