Merge "Rename WindowlessViewRoot to SurfaceControlViewHost and rework API"

This commit is contained in:
Rob Carr
2020-01-02 05:18:58 +00:00
committed by Android (Google) Code Review
8 changed files with 75 additions and 37 deletions

View File

@@ -4350,6 +4350,18 @@ package android.view {
method public abstract String asyncImpl() default "";
}
public class SurfaceControlViewHost {
ctor public SurfaceControlViewHost(@NonNull android.content.Context, @NonNull android.view.Display, @Nullable android.os.IBinder);
method public void addView(android.view.View, android.view.WindowManager.LayoutParams);
method public void dispose();
method @Nullable public android.view.SurfaceControlViewHost.SurfacePackage getSurfacePackage();
method public void relayout(android.view.WindowManager.LayoutParams);
}
public class SurfaceControlViewHost.SurfacePackage {
method @NonNull public android.view.SurfaceControl getSurfaceControl();
}
public class SurfaceView extends android.view.View {
method @Nullable public android.os.IBinder getInputToken();
}
@@ -4401,13 +4413,6 @@ package android.view {
field @android.view.ViewDebug.ExportedProperty(flagMapping={@android.view.ViewDebug.FlagToString(mask=0x1, equals=0x1, name="FAKE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x2, equals=0x2, name="FORCE_HARDWARE_ACCELERATED"), @android.view.ViewDebug.FlagToString(mask=0x4, equals=0x4, name="WANTS_OFFSET_NOTIFICATIONS"), @android.view.ViewDebug.FlagToString(mask=0x10, equals=0x10, name="SHOW_FOR_ALL_USERS"), @android.view.ViewDebug.FlagToString(mask=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, equals=android.view.WindowManager.LayoutParams.PRIVATE_FLAG_NO_MOVE_ANIMATION, name="NO_MOVE_ANIMATION"), @android.view.ViewDebug.FlagToString(mask=0x80, equals=0x80, name="COMPATIBLE_WINDOW"), @android.view.ViewDebug.FlagToString(mask=0x100, equals=0x100, name="SYSTEM_ERROR"), @android.view.ViewDebug.FlagToString(mask=0x400, equals=0x400, name="KEYGUARD"), @android.view.ViewDebug.FlagToString(mask=0x800, equals=0x800, name="DISABLE_WALLPAPER_TOUCH_EVENTS"), @android.view.ViewDebug.FlagToString(mask=0x1000, equals=0x1000, name="FORCE_STATUS_BAR_VISIBLE_TRANSPARENT"), @android.view.ViewDebug.FlagToString(mask=0x2000, equals=0x2000, name="PRESERVE_GEOMETRY"), @android.view.ViewDebug.FlagToString(mask=0x4000, equals=0x4000, name="FORCE_DECOR_VIEW_VISIBILITY"), @android.view.ViewDebug.FlagToString(mask=0x8000, equals=0x8000, name="WILL_NOT_REPLACE_ON_RELAUNCH"), @android.view.ViewDebug.FlagToString(mask=0x10000, equals=0x10000, name="LAYOUT_CHILD_WINDOW_IN_PARENT_FRAME"), @android.view.ViewDebug.FlagToString(mask=0x20000, equals=0x20000, name="FORCE_DRAW_STATUS_BAR_BACKGROUND"), @android.view.ViewDebug.FlagToString(mask=0x40000, equals=0x40000, name="SUSTAINED_PERFORMANCE_MODE"), @android.view.ViewDebug.FlagToString(mask=0x80000, equals=0x80000, name="HIDE_NON_SYSTEM_OVERLAY_WINDOWS"), @android.view.ViewDebug.FlagToString(mask=0x100000, equals=0x100000, name="IS_ROUNDED_CORNERS_OVERLAY"), @android.view.ViewDebug.FlagToString(mask=0x400000, equals=0x400000, name="IS_SCREEN_DECOR"), @android.view.ViewDebug.FlagToString(mask=0x800000, equals=0x800000, name="STATUS_FORCE_SHOW_NAVIGATION"), @android.view.ViewDebug.FlagToString(mask=0x1000000, equals=0x1000000, name="COLOR_SPACE_AGNOSTIC"), @android.view.ViewDebug.FlagToString(mask=0x4000000, equals=0x4000000, name="FIT_INSETS_CONTROLLED"), @android.view.ViewDebug.FlagToString(mask=0x8000000, equals=0x8000000, name="ONLY_DRAW_BOTTOM_BAR_BACKGROUND")}) public int privateFlags;
}
public class WindowlessViewRoot {
ctor public WindowlessViewRoot(@NonNull android.content.Context, @NonNull android.view.Display, @NonNull android.view.SurfaceControl, @Nullable android.os.IBinder);
method public void addView(android.view.View, android.view.WindowManager.LayoutParams);
method public void dispose();
method public void relayout(android.view.WindowManager.LayoutParams);
}
}
package android.view.accessibility {

View File

@@ -2079,17 +2079,17 @@ MissingNullability: android.view.ViewDebug#startRenderingCommandsCapture(android
MissingNullability: android.view.WindowManager.LayoutParams#accessibilityTitle:
MissingNullability: android.view.WindowlessViewRoot#WindowlessViewRoot(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #0:
MissingNullability: android.view.SurfaceControlViewHost#SurfaceControlViewHost(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #0:
MissingNullability: android.view.WindowlessViewRoot#WindowlessViewRoot(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #1:
MissingNullability: android.view.SurfaceControlViewHost#SurfaceControlViewHost(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #1:
MissingNullability: android.view.WindowlessViewRoot#WindowlessViewRoot(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #2:
MissingNullability: android.view.SurfaceControlViewHost#SurfaceControlViewHost(android.content.Context, android.view.Display, android.view.SurfaceControl) parameter #2:
MissingNullability: android.view.WindowlessViewRoot#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #0:
MissingNullability: android.view.SurfaceControlViewHost#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #0:
MissingNullability: android.view.WindowlessViewRoot#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #1:
MissingNullability: android.view.SurfaceControlViewHost#addView(android.view.View, android.view.WindowManager.LayoutParams) parameter #1:
MissingNullability: android.view.WindowlessViewRoot#relayout(android.view.WindowManager.LayoutParams) parameter #0:
MissingNullability: android.view.SurfaceControlViewHost#relayout(android.view.WindowManager.LayoutParams) parameter #0:
MissingNullability: android.view.accessibility.AccessibilityManager.AccessibilityServicesStateChangeListener#onAccessibilityServicesStateChanged(android.view.accessibility.AccessibilityManager) parameter #0:

View File

@@ -29,25 +29,55 @@ import android.os.IBinder;
* @hide
*/
@TestApi
public class WindowlessViewRoot {
public class SurfaceControlViewHost {
private ViewRootImpl mViewRoot;
private WindowlessWindowManager mWm;
private SurfaceControl mSurfaceControl;
/**
* @hide
*/
@TestApi
public class SurfacePackage {
final SurfaceControl mSurfaceControl;
// TODO: Accessibility ID goes here
SurfacePackage(SurfaceControl sc) {
mSurfaceControl = sc;
}
public @NonNull SurfaceControl getSurfaceControl() {
return mSurfaceControl;
}
}
/** @hide */
public WindowlessViewRoot(@NonNull Context c, @NonNull Display d,
public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
@NonNull WindowlessWindowManager wwm) {
mWm = wwm;
mViewRoot = new ViewRootImpl(c, d, mWm);
}
public WindowlessViewRoot(@NonNull Context c, @NonNull Display d,
@NonNull SurfaceControl rootSurface,
public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
@Nullable IBinder hostInputToken) {
mWm = new WindowlessWindowManager(c.getResources().getConfiguration(), rootSurface,
mSurfaceControl = new SurfaceControl.Builder()
.setContainerLayer()
.setName("SurfaceControlViewHost")
.build();
mWm = new WindowlessWindowManager(c.getResources().getConfiguration(), mSurfaceControl,
hostInputToken);
mViewRoot = new ViewRootImpl(c, d, mWm);
}
public @Nullable SurfacePackage getSurfacePackage() {
if (mSurfaceControl != null) {
return new SurfacePackage(mSurfaceControl);
} else {
return null;
}
}
public void addView(View view, WindowManager.LayoutParams attrs) {
mViewRoot.setView(view, attrs, null);
}

View File

@@ -42,7 +42,7 @@ import android.view.SurfaceControl;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.view.WindowlessViewRoot;
import android.view.SurfaceControlViewHost;
import android.view.WindowlessWindowManager;
import com.android.internal.os.IResultReceiver;
@@ -61,7 +61,7 @@ public class SystemWindows {
private static final String TAG = "SystemWindows";
private final SparseArray<PerDisplay> mPerDisplay = new SparseArray<>();
final HashMap<View, WindowlessViewRoot> mViewRoots = new HashMap<>();
final HashMap<View, SurfaceControlViewHost> mViewRoots = new HashMap<>();
Context mContext;
IWindowSession mSession;
DisplayWindowController mDisplayController;
@@ -121,7 +121,7 @@ public class SystemWindows {
* @param view
*/
public void removeView(View view) {
WindowlessViewRoot root = mViewRoots.remove(view);
SurfaceControlViewHost root = mViewRoots.remove(view);
root.die();
}
@@ -129,7 +129,7 @@ public class SystemWindows {
* Updates the layout params of a view.
*/
public void updateViewLayout(@NonNull View view, ViewGroup.LayoutParams params) {
WindowlessViewRoot root = mViewRoots.get(view);
SurfaceControlViewHost root = mViewRoots.get(view);
if (root == null || !(params instanceof WindowManager.LayoutParams)) {
return;
}
@@ -177,7 +177,7 @@ public class SystemWindows {
return;
}
final Display display = mDisplayController.getDisplay(mDisplayId);
WindowlessViewRoot viewRoot = new WindowlessViewRoot(mContext, display, wwm);
SurfaceControlViewHost viewRoot = new SurfaceControlViewHost(mContext, display, wwm);
attrs.flags |= FLAG_HARDWARE_ACCELERATED;
viewRoot.addView(view, attrs);
mViewRoots.put(view, viewRoot);

View File

@@ -40,8 +40,8 @@ import android.text.TextUtils;
import android.util.Slog;
import android.view.KeyEvent;
import android.view.SurfaceControl;
import android.view.SurfaceControlViewHost;
import android.view.WindowManager;
import android.view.WindowlessViewRoot;
import android.view.autofill.AutofillId;
import android.view.autofill.AutofillManager;
import android.view.autofill.AutofillValue;
@@ -217,14 +217,12 @@ public final class AutoFillUI {
}
final AutofillValue datasetValue = dataset.getFieldValues().get(index);
final SurfaceControl sc = new SurfaceControl.Builder()
// TODO(b/137800469): sanitize name
.setName("af suggestion")
.build();
//TODO(b/137800469): Pass in inputToken from IME.
final WindowlessViewRoot wvr = new WindowlessViewRoot(context, context.getDisplay(), sc,
null);
final SurfaceControlViewHost wvr = new SurfaceControlViewHost(context, context.getDisplay(),
(IBinder) null);
// TODO(b/134365580): Use the package instead of the SurfaceControl itself
// for accessibility support.
final SurfaceControl sc = wvr.getSurfacePackage().getSurfaceControl();
TextView textView = new TextView(context);
textView.setText(datasetValue.getTextValue());

View File

@@ -15,7 +15,7 @@
//
android_test {
name: "WindowlessWmTest",
name: "SurfaceControlViewHostTest",
srcs: ["**/*.java"],
platform_apis: true,
certificate: "platform",

View File

@@ -16,7 +16,7 @@
package="com.android.test.viewembed">
<application>
<activity android:name="WindowlessWmTest" android:label="View Embedding Test">
<activity android:name="SurfaceControlViewHostTest" android:label="View Embedding Test">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
<category android:name="android.intent.category.LAUNCHER"/>

View File

@@ -22,18 +22,19 @@ import android.graphics.Color;
import android.graphics.PixelFormat;
import android.os.Bundle;
import android.view.Gravity;
import android.view.SurfaceControl;
import android.view.SurfaceHolder;
import android.view.SurfaceView;
import android.view.View;
import android.view.WindowManager;
import android.view.WindowlessViewRoot;
import android.view.SurfaceControlViewHost;
import android.widget.Button;
import android.widget.FrameLayout;
public class WindowlessWmTest extends Activity implements SurfaceHolder.Callback{
public class SurfaceControlViewHostTest extends Activity implements SurfaceHolder.Callback{
SurfaceView mView;
WindowlessViewRoot mVr;
SurfaceControlViewHost mVr;
protected void onCreate(Bundle savedInstanceState) {
FrameLayout content = new FrameLayout(this);
@@ -49,8 +50,12 @@ public class WindowlessWmTest extends Activity implements SurfaceHolder.Callback
@Override
public void surfaceCreated(SurfaceHolder holder) {
mVr = new WindowlessViewRoot(this, this.getDisplay(), mView.getSurfaceControl(),
mVr = new SurfaceControlViewHost(this, this.getDisplay(),
mView.getInputToken());
final SurfaceControl.Transaction t = new SurfaceControl.Transaction();
t.reparent(mVr.getSurfacePackage().getSurfaceControl(), mView.getSurfaceControl()).apply();
Button v = new Button(this);
v.setBackgroundColor(Color.BLUE);
v.setOnClickListener(new View.OnClickListener() {