SurfaceControlViewHost: Allow updating of WindowContext used for SCVH
Our initial attempt to allow updating the configuration of SurfaceControlViewHost was insufficient when the SurfaceControlViewHost is using a service context. This service context will always be on the global configuration, and ViewRoot won't be able to override it. We add some documentation suggesting the user use a window context, and wire up SurfaceControlViewHost VRI so that they are the authority on configuration (and propagate the change in to the context). Bug: 215204813 Test: SurfaceControlViewHostTests. Manual in game overlay+split-screen Change-Id: I24c0309593b7fddaeab8db355f63a5f6bd763562
This commit is contained in:
@@ -28,6 +28,7 @@ import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.os.RemoteException;
|
||||
import android.util.Log;
|
||||
import android.window.WindowTokenClient;
|
||||
import android.view.InsetsState;
|
||||
import android.view.WindowManagerGlobal;
|
||||
import android.view.accessibility.IAccessibilityEmbeddedConnection;
|
||||
@@ -193,6 +194,14 @@ 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
|
||||
* {@link View#onConfigurationChanged}, the context used with the
|
||||
* SurfaceControlViewHost and it's embedded view hierarchy must
|
||||
* be a WindowContext obtained from {@link Context#createWindowContext}.
|
||||
*
|
||||
* If a regular service context is used, then your embedded view hierarchy
|
||||
* will always perceive the global configuration.
|
||||
*
|
||||
* @param c The configuration to forward
|
||||
*/
|
||||
public void notifyConfigurationChanged(@NonNull Configuration c) {
|
||||
@@ -266,6 +275,8 @@ public class SurfaceControlViewHost {
|
||||
@NonNull WindowlessWindowManager wwm) {
|
||||
mWm = wwm;
|
||||
mViewRoot = new ViewRootImpl(c, d, mWm);
|
||||
addConfigCallback(c, d);
|
||||
|
||||
WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
|
||||
|
||||
mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
|
||||
@@ -294,11 +305,23 @@ public class SurfaceControlViewHost {
|
||||
mSurfaceControl, hostToken);
|
||||
|
||||
mViewRoot = new ViewRootImpl(context, display, mWm);
|
||||
addConfigCallback(context, display);
|
||||
|
||||
WindowManagerGlobal.getInstance().addWindowlessRoot(mViewRoot);
|
||||
|
||||
mAccessibilityEmbeddedConnection = mViewRoot.getAccessibilityEmbeddedConnection();
|
||||
}
|
||||
|
||||
private void addConfigCallback(Context c, Display d) {
|
||||
final IBinder token = c.getWindowContextToken();
|
||||
mViewRoot.addConfigCallback((conf) -> {
|
||||
if (token instanceof WindowTokenClient) {
|
||||
final WindowTokenClient w = (WindowTokenClient) token;
|
||||
w.onConfigurationChanged(conf, d.getDisplayId(), true);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* @hide
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user