Input dispatcher ANR handling enhancements.
This change is essentially a rewrite of the main input dispatcher loop with the target identification folded in. Since the input dispatcher now has all of the window state, it can make better decisions about when to ANR. Added a .5 second deadline for processing app switch keys. This behavior predates Gingerbread but had not previously been ported. Fixed some timing inaccuracies in the ANR accounting that could cause applications to ANR sooner than they should have. Added a mechanism for tracking key and motion events that have been dispatched to a window so that appropriate cancelation events can be synthesized when recovering from ANR. This change helps to keep applications in sync so they don't end up with stuck buttons upon recovery from ANRs. Added more comments to describe the tricky parts of PollLoop. Change-Id: I13dffca27acb436fc383980db536abc4d8b9e6f1
This commit is contained in:
@@ -5097,8 +5097,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
|
||||
/* Notifies the window manager about an input channel that is not responding.
|
||||
* The method can either cause dispatching to be aborted by returning -2 or
|
||||
* return a new timeout in nanoseconds.
|
||||
* Returns a new timeout to continue waiting in nanoseconds, or 0 to abort dispatch.
|
||||
*
|
||||
* Called by the InputManager.
|
||||
*/
|
||||
@@ -5107,7 +5106,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
synchronized (mWindowMap) {
|
||||
WindowState windowState = getWindowStateForInputChannelLocked(inputChannel);
|
||||
if (windowState == null) {
|
||||
return -2; // irrelevant, abort dispatching (-2)
|
||||
return 0; // window is unknown, abort dispatching
|
||||
}
|
||||
|
||||
Slog.i(TAG, "Input event dispatching timed out sending to "
|
||||
@@ -5130,8 +5129,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
|
||||
/* Notifies the window manager about an application that is not responding
|
||||
* in general rather than with respect to a particular input channel.
|
||||
* The method can either cause dispatching to be aborted by returning -2 or
|
||||
* return a new timeout in nanoseconds.
|
||||
* Returns a new timeout to continue waiting in nanoseconds, or 0 to abort dispatch.
|
||||
*
|
||||
* Called by the InputManager.
|
||||
*/
|
||||
@@ -5157,7 +5155,7 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
} catch (RemoteException ex) {
|
||||
}
|
||||
}
|
||||
return -2; // abort dispatching
|
||||
return 0; // abort dispatching
|
||||
}
|
||||
|
||||
private WindowState getWindowStateForInputChannel(InputChannel inputChannel) {
|
||||
@@ -5271,15 +5269,6 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
}
|
||||
}
|
||||
|
||||
/* Notifies that an app switch key (BACK / HOME) has just been pressed.
|
||||
* This essentially starts a .5 second timeout for the application to process
|
||||
* subsequent input events while waiting for the app switch to occur. If it takes longer
|
||||
* than this, the pending events will be dropped.
|
||||
*/
|
||||
public void notifyAppSwitchComing() {
|
||||
// TODO Not implemented yet. Should go in the native side.
|
||||
}
|
||||
|
||||
/* Notifies that the lid switch changed state. */
|
||||
public void notifyLidSwitchChanged(long whenNanos, boolean lidOpen) {
|
||||
mPolicy.notifyLidSwitchChanged(whenNanos, lidOpen);
|
||||
|
||||
Reference in New Issue
Block a user