Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 59b1888b authored by Robert Carr's avatar Robert Carr
Browse files

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
parent f06d584d
Loading
Loading
Loading
Loading
+12 −7
Original line number Diff line number Diff line
@@ -4424,6 +4424,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();
  }
@@ -4474,13 +4486,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 {
+6 −6
Original line number Diff line number Diff line
@@ -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:
    
+35 −5
Original line number Diff line number Diff line
@@ -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);
    }
+5 −5
Original line number Diff line number Diff line
@@ -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);
+6 −8
Original line number Diff line number Diff line
@@ -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());
Loading