Merge "SurfaceControlViewHost: Expose transferTouchGesture API."
This commit is contained in:
@@ -353,4 +353,6 @@ interface IWindowSession {
|
||||
* Returns whether this window needs to cancel draw and retry later.
|
||||
*/
|
||||
boolean cancelDraw(IWindow window);
|
||||
|
||||
boolean transferEmbeddedTouchFocusToHost(IWindow embeddedWindow);
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@ public class SurfaceControlViewHost {
|
||||
* is more akin to a PopupWindow in that the size is user specified
|
||||
* independent of configuration width and height.
|
||||
*
|
||||
* In order to receive the configuration change via
|
||||
* In order to receive the configuration change via
|
||||
* {@link View#onConfigurationChanged}, the context used with the
|
||||
* SurfaceControlViewHost and it's embedded view hierarchy must
|
||||
* be a WindowContext obtained from {@link Context#createWindowContext}.
|
||||
@@ -460,5 +460,26 @@ public class SurfaceControlViewHost {
|
||||
(WindowManagerImpl) mViewRoot.mContext.getSystemService(Context.WINDOW_SERVICE);
|
||||
attrs.token = wm.getDefaultToken();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Transfer the currently in progress touch gesture to the parent
|
||||
* (if any) of this SurfaceControlViewHost. This requires that the
|
||||
* SurfaceControlViewHost was created with an associated hostInputToken.
|
||||
*
|
||||
* @return Whether the touch stream was transferred.
|
||||
* @hide
|
||||
*/
|
||||
public boolean transferTouchGestureToHost() {
|
||||
if (mViewRoot == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final IWindowSession realWm = WindowManagerGlobal.getWindowSession();
|
||||
try {
|
||||
return realWm.transferEmbeddedTouchFocusToHost(mViewRoot.mWindow);
|
||||
} catch (RemoteException e) {
|
||||
e.rethrowAsRuntimeException();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -561,4 +561,11 @@ public class WindowlessWindowManager implements IWindowSession {
|
||||
public boolean cancelDraw(IWindow window) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean transferEmbeddedTouchFocusToHost(IWindow window) {
|
||||
Log.e(TAG, "Received request to transferEmbeddedTouch focus on WindowlessWindowManager" +
|
||||
" we shouldn't get here!");
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -909,6 +909,22 @@ class Session extends IWindowSession.Stub implements IBinder.DeathRecipient {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean transferEmbeddedTouchFocusToHost(IWindow embeddedWindow) {
|
||||
if (embeddedWindow == null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
final long identity = Binder.clearCallingIdentity();
|
||||
boolean didTransfer = false;
|
||||
try {
|
||||
didTransfer = mService.transferEmbeddedTouchFocusToHost(embeddedWindow);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(identity);
|
||||
}
|
||||
return didTransfer;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void generateDisplayHash(IWindow window, Rect boundsInWindow, String hashAlgorithm,
|
||||
RemoteCallback callback) {
|
||||
|
||||
@@ -8682,6 +8682,38 @@ public class WindowManagerService extends IWindowManager.Stub
|
||||
clientChannel.copyTo(outInputChannel);
|
||||
}
|
||||
|
||||
boolean transferEmbeddedTouchFocusToHost(IWindow embeddedWindow) {
|
||||
final IBinder windowBinder = embeddedWindow.asBinder();
|
||||
final IBinder hostInputChannel, embeddedInputChannel;
|
||||
synchronized (mGlobalLock) {
|
||||
final EmbeddedWindowController.EmbeddedWindow ew =
|
||||
mEmbeddedWindowController.getByWindowToken(windowBinder);
|
||||
if (ew == null) {
|
||||
Slog.w(TAG, "Attempt to transfer touch focus from non-existent embedded window");
|
||||
return false;
|
||||
}
|
||||
final WindowState hostWindowState = ew.getWindowState();
|
||||
if (hostWindowState == null) {
|
||||
Slog.w(TAG, "Attempt to transfer touch focus from embedded window with no" +
|
||||
" associated host");
|
||||
return false;
|
||||
}
|
||||
embeddedInputChannel = ew.getInputChannelToken();
|
||||
if (embeddedInputChannel == null) {
|
||||
Slog.w(TAG, "Attempt to transfer touch focus from embedded window with no input" +
|
||||
" channel");
|
||||
return false;
|
||||
}
|
||||
hostInputChannel = hostWindowState.mInputChannelToken;
|
||||
if (hostInputChannel == null) {
|
||||
Slog.w(TAG, "Attempt to transfer touch focus to a host window with no" +
|
||||
" input channel");
|
||||
return false;
|
||||
}
|
||||
return mInputManager.transferTouchFocus(embeddedInputChannel, hostInputChannel);
|
||||
}
|
||||
}
|
||||
|
||||
private void updateInputChannel(IBinder channelToken, int callingUid, int callingPid,
|
||||
int displayId, SurfaceControl surface, String name,
|
||||
InputApplicationHandle applicationHandle, int flags,
|
||||
|
||||
Reference in New Issue
Block a user