summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Issei Suzuki <issei@google.com> 2022-12-08 14:10:21 +0000
committer Issei Suzuki <issei@google.com> 2022-12-15 13:17:24 +0000
commit673d3f362ba4f2d76b809cbbea45985579e630ac (patch)
treeac5aaaac6cf060aee282fa712aae439cc0dc5bdd
parentc9f75fda7430e95d721953f63d443aa544c2dde1 (diff)
Make StateMachine#handle call handler defined in root state.
Bug: 242545520 Test: atest com.android.server.wm.utils.StateMachineTest Change-Id: I6f85afa75e30d41dfd8ed90106ce5edd819b02b9
-rw-r--r--services/core/java/com/android/server/wm/utils/StateMachine.java11
-rw-r--r--services/tests/wmtests/src/com/android/server/wm/utils/StateMachineTest.java14
2 files changed, 19 insertions, 6 deletions
diff --git a/services/core/java/com/android/server/wm/utils/StateMachine.java b/services/core/java/com/android/server/wm/utils/StateMachine.java
index 91a5dc43a69d..350784e64799 100644
--- a/services/core/java/com/android/server/wm/utils/StateMachine.java
+++ b/services/core/java/com/android/server/wm/utils/StateMachine.java
@@ -177,19 +177,18 @@ public class StateMachine {
}
/**
- * Process an event. Search handler for a given event and {@link Handler#handle(int)}. If the
- * handler cannot handle the event, delegate it to a handler for a parent of the given state.
+ * Process an event. Search handler for a given event and {@link Handler#handle(int, Object)}.
+ * If the handler cannot handle the event, delegate it to a handler for a parent of the given
+ * state.
*
* @param event Type of an event.
*/
public void handle(int event, @Nullable Object param) {
- int state = mState;
- while (state != 0) {
+ for (int state = mState;; state >>= 4) {
final Handler h = mStateHandlers.get(state);
- if (h != null && h.handle(event, param)) {
+ if ((h != null && h.handle(event, param)) || state == 0) {
return;
}
- state >>= 4;
}
}
diff --git a/services/tests/wmtests/src/com/android/server/wm/utils/StateMachineTest.java b/services/tests/wmtests/src/com/android/server/wm/utils/StateMachineTest.java
index e82a7c222b8f..fb0ce56ddd2c 100644
--- a/services/tests/wmtests/src/com/android/server/wm/utils/StateMachineTest.java
+++ b/services/tests/wmtests/src/com/android/server/wm/utils/StateMachineTest.java
@@ -215,6 +215,20 @@ public class StateMachineTest {
}
@Test
+ public void testStateMachineTriggerStateActionDelegateRoot() {
+ final StringBuffer log = new StringBuffer();
+
+ StateMachine stateMachine = new StateMachine(0x2);
+ stateMachine.addStateHandler(0x0, new LoggingHandler(0x0, log));
+ stateMachine.addStateHandler(0x2,
+ new LoggingHandler(0x2, log, false /* handleSelf */));
+
+ // state 0x2 delegate the message handling to its parent state
+ stateMachine.handle(0, null);
+ assertEquals("h0;", log.toString());
+ }
+
+ @Test
public void testStateMachineNestedTransition() {
final StringBuffer log = new StringBuffer();