From f67f8f0edb198c1078a0b0fceaadde85a37a6768 Mon Sep 17 00:00:00 2001 From: Yasin Kilicdere Date: Tue, 8 Apr 2025 17:01:21 +0100 Subject: UserSwitchingDialog timeout shouldn't remove all callbacks and messages. The UserSwitchingDialog's timeout mechanism incorrectly removes all callbacks and messages. This causes unexpected behavior, notably the loss of a crucial post message (linked in the bugs). Bug: 409311749 Bug: 406689907 Test: atest UserControllerTest Flag: EXEMPT bugfix (cherry picked from https://googleplex-android-review.googlesource.com/q/commit:82fc90457b122310ebcc4315958985db8db714bf) Merged-In: I4e353d751ea211cac2c1014c7b201da4d1cd1f7f Change-Id: I4e353d751ea211cac2c1014c7b201da4d1cd1f7f --- services/core/java/com/android/server/am/UserController.java | 1 + services/core/java/com/android/server/am/UserSwitchingDialog.java | 6 ++++-- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/services/core/java/com/android/server/am/UserController.java b/services/core/java/com/android/server/am/UserController.java index 40a9bbec3598..10c81531f02c 100644 --- a/services/core/java/com/android/server/am/UserController.java +++ b/services/core/java/com/android/server/am/UserController.java @@ -203,6 +203,7 @@ class UserController implements Handler.Callback { static final int COMPLETE_USER_SWITCH_MSG = 130; static final int USER_COMPLETED_EVENT_MSG = 140; static final int SCHEDULED_STOP_BACKGROUND_USER_MSG = 150; + static final int USER_SWITCHING_DIALOG_ANIMATION_TIMEOUT_MSG = 160; private static final int NO_ARG2 = 0; diff --git a/services/core/java/com/android/server/am/UserSwitchingDialog.java b/services/core/java/com/android/server/am/UserSwitchingDialog.java index f4e733a0c99f..a1cc9dca092d 100644 --- a/services/core/java/com/android/server/am/UserSwitchingDialog.java +++ b/services/core/java/com/android/server/am/UserSwitchingDialog.java @@ -16,6 +16,8 @@ package com.android.server.am; +import static com.android.server.am.UserController.USER_SWITCHING_DIALOG_ANIMATION_TIMEOUT_MSG; + import android.annotation.NonNull; import android.annotation.Nullable; import android.annotation.UserIdInt; @@ -302,14 +304,14 @@ class UserSwitchingDialog extends Dialog { final AtomicBoolean isFirst = new AtomicBoolean(true); final Runnable onAnimationEndOrTimeout = () -> { if (isFirst.getAndSet(false)) { - mHandler.removeCallbacksAndMessages(null); + mHandler.removeMessages(USER_SWITCHING_DIALOG_ANIMATION_TIMEOUT_MSG); onAnimationEnd.run(); } }; mHandler.postDelayed(() -> { Slog.w(TAG, name + " animation not completed in " + ANIMATION_TIMEOUT_MS + " ms"); onAnimationEndOrTimeout.run(); - }, ANIMATION_TIMEOUT_MS); + }, USER_SWITCHING_DIALOG_ANIMATION_TIMEOUT_MSG, ANIMATION_TIMEOUT_MS); return onAnimationEndOrTimeout; } -- cgit v1.2.3-59-g8ed1b