FocusResolver::isTokenFocusable: 判断焦点窗口状态
这里要遍历的windows是从SurfaceFlinger发来的最新的输入窗口列表,而token是之前设置的焦点窗口,这个函数的大意是根据最新的输入窗口信息判断之前设置的焦点窗口是否有效。
那么可能有几种情况,即对应Focusability的4个值:
1. 返回NO_WINDOW,说明之前设置的焦点窗口已经不在最新的输入窗口列表里了,即该输入窗口的Layer已经被移除了,或者不满足Layer.needsInputInfo的条件
2. 返回NOT_FOCUSABLE,说明之前设置的焦点窗口还在最新的输入窗口列表里,但是被设置了NOT_FOCUSABLE这个标志位,不满足作为焦点窗口的条件了
3. 返回NOT_VISIBLE,说明之前设置的焦点窗口还在最新的输入窗口列表里,但是被设置了NOT_VISIBLE,即该Layer已经不可见了,所以不能再作为焦点窗口了
4. 返回OK,找到了一个符合条件的窗口作为焦点窗口,并且将该窗口保存在传参outFocusableWindow中
InputDispatcher::setFocusedWindow:异步BpBn;//进程system_server的binder线程调用InputManager.cpp的setFocusedWindow(),内调InputDispatcher.cpp的setFocusedWindow();
InputDispatcher::dispatchFocusLocked:在这里打印日志"Focus entering" 或 "Focus leaving"