summaryrefslogtreecommitdiff
path: root/core/java/android/view/SurfaceControlViewHost.java
diff options
context:
space:
mode:
authorRobert Carr <racarr@google.com>2019-12-18 00:38:40 -0800
committerRobert Carr <racarr@google.com>2019-12-30 20:59:39 -0800
commit59b1888bb95544a57e29d8a3c29960087d9f7ae9 (patch)
tree2eb97f0fcc30e78b07890fa084f254e9976c01c3 /core/java/android/view/SurfaceControlViewHost.java
parentf06d584d39723ed4ddfb326c256d67121d5e5d5a (diff)
Rename WindowlessViewRoot to SurfaceControlViewHost and rework API
Should be a little more clear. The internal IWindowSession implementation keeps the WindowlessWindowManager name, but the API section definitely needs a more usable name. Instead of passing in a root Surface we want it to be owned by the SurfaceControlViewHost itself. This way we can ensure we only return a SurfacePackage. In follow up CLs we will add an accessibility ID to the SurfacePackage so we can ensure the Control is passed around with the accessibility ID. Test: Builds Bug: 134365580 Change-Id: I30520e8b169d3744a66ccedf61cc4515cfef4dee
Diffstat (limited to 'core/java/android/view/SurfaceControlViewHost.java')
-rw-r--r--core/java/android/view/SurfaceControlViewHost.java104
1 files changed, 104 insertions, 0 deletions
diff --git a/core/java/android/view/SurfaceControlViewHost.java b/core/java/android/view/SurfaceControlViewHost.java
new file mode 100644
index 000000000000..4f8aecd08f6d
--- /dev/null
+++ b/core/java/android/view/SurfaceControlViewHost.java
@@ -0,0 +1,104 @@
+/*
+ * Copyright (C) 2019 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.view;
+
+import android.annotation.NonNull;
+import android.annotation.Nullable;
+import android.annotation.TestApi;
+import android.content.Context;
+import android.os.IBinder;
+
+/**
+ * Utility class for adding a view hierarchy to a SurfaceControl.
+ *
+ * See WindowlessWmTest for example usage.
+ * @hide
+ */
+@TestApi
+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 SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
+ @NonNull WindowlessWindowManager wwm) {
+ mWm = wwm;
+ mViewRoot = new ViewRootImpl(c, d, mWm);
+ }
+
+ public SurfaceControlViewHost(@NonNull Context c, @NonNull Display d,
+ @Nullable IBinder hostInputToken) {
+ 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);
+ }
+
+ public void relayout(WindowManager.LayoutParams attrs) {
+ mViewRoot.setLayoutParams(attrs, false);
+ mViewRoot.setReportNextDraw();
+ mWm.setCompletionCallback(mViewRoot.mWindow.asBinder(), (SurfaceControl.Transaction t) -> {
+ t.apply();
+ });
+ }
+
+ public void dispose() {
+ mViewRoot.dispatchDetachedFromWindow();
+ }
+
+ /**
+ * Tell this viewroot to clean itself up.
+ * @hide
+ */
+ public void die() {
+ mViewRoot.die(false /* immediate */);
+ }
+}