Fixing a memory leak in ViewRootImpl and a focus change callback issue.
1. ViewRootImpl was keeping reference to the old focused view so it can call back the global on focus change listener when another view gets focus. The stashed reference, however was not cleared which caused a memory leak if the last focused view was removed from the view tree. In general keeping additional state for the last focus in ViewRootImpl is not a good idea since this add complexity due to additional book keeping work that is required. The view tree already keeps track of where the focus is and it should be the only place that holds this data. Since focus does not change that frequently it is fine to look up the focus since this operation is O(m) where m is the depth of the view tree. This change removes the duplicate book keeping from ViewRootImpl and the focus is looked up as needed. 2. ViewRootImpl was calling the global focus change callbacks when focus is gained, lost, or transferred to another view. This was done in *ChildFocus methods. In the case of a child losing focus, i.e. in clearChildFocus, there was a check whether focus searh yields a view to take focus and if so it did not call back the global focus listener assuming the the found view will take focus (the view tree gives focus to the first focusable when a view looses focus). This is not a correct assumption since some views override methods called as a result of View.requestFocus that determine what the next focused view should be. For example, HorizontalScrollView overrides onRequestFocusInDescendants and changes the direction of the search. In fact focus search does not take into accound ViewGroup descendant focusability. Hence, the view found by calling the focus search from the root is not necessarily the one that will get focus after calling requestFocus. Actually, it is possible that the focus search will find a view but no view will take focus. Now the View class is responsible for calling the global focus listeners which avoids the above problem. Also this saves book keeping in ViewRootImpl. bug:7962363 Change-Id: Ic95a18b364e997021f3f6bb46943559aac07d95a
Loading
Please register or sign in to comment