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

Commit eb6ea4f0 authored by Chris Li's avatar Chris Li
Browse files

Store and return ImeContainer in RootDisplayArea for layers

Before, calling RootDisplayArea.findAreaForToken for TYPE_INPUT_METHOD
returns null. Now, it should return the ImeContainer if it is attached
below that RootDisplayArea.

Fix: 173478743
Test: atest WmTests:DisplayAreaPolicyBuilderTest
Change-Id: I28cc3223a0b9870accff56f93f4cb0fb87b0923f
parent 10963d5b
Loading
Loading
Loading
Loading
+10 −0
Original line number Diff line number Diff line
@@ -309,6 +309,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
        return this;
    }

    /** Cheap way of doing cast and instanceof. */
    DisplayArea.Tokens asTokens() {
        return null;
    }

    @Override
    void forAllDisplayAreas(Consumer<DisplayArea> callback) {
        super.forAllDisplayAreas(callback);
@@ -546,6 +551,11 @@ public class DisplayArea<T extends WindowContainer> extends WindowContainer<T> {
            mLastOrientationSource = win;
            return req;
        }

        @Override
        final DisplayArea.Tokens asTokens() {
            return this;
        }
    }

    @Override
+2 −2
Original line number Diff line number Diff line
@@ -86,7 +86,7 @@ public abstract class DisplayAreaPolicy {
        @Override
        public DisplayAreaPolicy instantiate(WindowManagerService wmService,
                DisplayContent content, RootDisplayArea root,
                DisplayArea<? extends WindowContainer> imeContainer) {
                DisplayArea.Tokens imeContainer) {
            final TaskDisplayArea defaultTaskDisplayArea = new TaskDisplayArea(content, wmService,
                    "DefaultTaskDisplayArea", FEATURE_DEFAULT_TASK_CONTAINER);
            final List<TaskDisplayArea> tdaList = new ArrayList<>();
@@ -151,7 +151,7 @@ public abstract class DisplayAreaPolicy {
         * @see DisplayAreaPolicy#DisplayAreaPolicy
         */
        DisplayAreaPolicy instantiate(WindowManagerService wmService, DisplayContent content,
                RootDisplayArea root, DisplayArea<? extends WindowContainer> imeContainer);
                RootDisplayArea root, DisplayArea.Tokens imeContainer);

        /**
         * Instantiates the device-specific {@link Provider}.
+13 −5
Original line number Diff line number Diff line
@@ -247,7 +247,7 @@ class DisplayAreaPolicyBuilder {
        private final ArrayList<DisplayAreaPolicyBuilder.Feature> mFeatures = new ArrayList<>();
        private final ArrayList<TaskDisplayArea> mTaskDisplayAreas = new ArrayList<>();
        @Nullable
        private DisplayArea<? extends WindowContainer> mImeContainer;
        private DisplayArea.Tokens mImeContainer;

        HierarchyBuilder(RootDisplayArea root) {
            mRoot = root;
@@ -270,7 +270,7 @@ class DisplayAreaPolicyBuilder {
        }

        /** Sets IME container as a child of this hierarchy root. */
        HierarchyBuilder setImeContainer(DisplayArea<? extends WindowContainer> imeContainer) {
        HierarchyBuilder setImeContainer(DisplayArea.Tokens imeContainer) {
            mImeContainer = imeContainer;
            return this;
        }
@@ -706,6 +706,10 @@ class DisplayAreaPolicyBuilder {
        private DisplayArea createArea(DisplayArea<DisplayArea> parent,
                DisplayArea.Tokens[] areaForLayer) {
            if (mExisting != null) {
                if (mExisting.asTokens() != null) {
                    // Store the WindowToken container for layers
                    fillAreaForLayers(mExisting.asTokens(), areaForLayer);
                }
                return mExisting;
            }
            if (mSkipTokens) {
@@ -722,14 +726,18 @@ class DisplayAreaPolicyBuilder {
            if (mFeature == null) {
                final DisplayArea.Tokens leaf = new DisplayArea.Tokens(parent.mWmService, type,
                        "Leaf:" + mMinLayer + ":" + mMaxLayer);
                for (int i = mMinLayer; i <= mMaxLayer; i++) {
                    areaForLayer[i] = leaf;
                }
                fillAreaForLayers(leaf, areaForLayer);
                return leaf;
            } else {
                return mFeature.mNewDisplayAreaSupplier.create(parent.mWmService, type,
                        mFeature.mName + ":" + mMinLayer + ":" + mMaxLayer, mFeature.mId);
            }
        }

        private void fillAreaForLayers(DisplayArea.Tokens leaf, DisplayArea.Tokens[] areaForLayer) {
            for (int i = mMinLayer; i <= mMaxLayer; i++) {
                areaForLayer[i] = leaf;
            }
        }
    }
}
+16 −1
Original line number Diff line number Diff line
@@ -16,11 +16,17 @@

package com.android.server.wm;

import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManagerPolicyConstants.APPLICATION_LAYER;
import static android.window.DisplayAreaOrganizer.FEATURE_IME_PLACEHOLDER;

import static com.android.server.wm.DisplayAreaPolicyBuilder.Feature;

import android.annotation.Nullable;

import com.android.server.policy.WindowManagerPolicy;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
@@ -72,7 +78,8 @@ class RootDisplayArea extends DisplayArea<DisplayArea> {
     * match the root.
     */
    void placeImeContainer(DisplayArea.Tokens imeContainer) {
        if (imeContainer.getRootDisplayArea() == this) {
        final RootDisplayArea previousRoot = imeContainer.getRootDisplayArea();
        if (previousRoot == this) {
            // No need to reparent if IME container is below the same root.
            return;
        }
@@ -88,7 +95,9 @@ class RootDisplayArea extends DisplayArea<DisplayArea> {
                            + "FEATURE_IME_PLACEHOLDER");
                }

                previousRoot.updateImeContainerForLayers(null /* imeContainer */);
                imeContainer.reparent(imeDisplayAreas.get(0), POSITION_TOP);
                updateImeContainerForLayers(imeContainer);
                return;
            }
        }
@@ -119,4 +128,10 @@ class RootDisplayArea extends DisplayArea<DisplayArea> {
        mAreaForLayer = areaForLayer;
        mFeatureToDisplayAreas = featureToDisplayAreas;
    }

    private void updateImeContainerForLayers(@Nullable DisplayArea.Tokens imeContainer) {
        final WindowManagerPolicy policy = mWmService.mPolicy;
        mAreaForLayer[policy.getWindowLayerFromTypeLw(TYPE_INPUT_METHOD)] = imeContainer;
        mAreaForLayer[policy.getWindowLayerFromTypeLw(TYPE_INPUT_METHOD_DIALOG)] = imeContainer;
    }
}
+8 −3
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@ import static android.os.Process.INVALID_UID;
import static android.view.WindowManager.LayoutParams.TYPE_ACCESSIBILITY_MAGNIFICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;
import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD_DIALOG;
import static android.view.WindowManager.LayoutParams.TYPE_NAVIGATION_BAR;
import static android.view.WindowManager.LayoutParams.TYPE_PRESENTATION;
import static android.view.WindowManager.LayoutParams.TYPE_STATUS_BAR;
@@ -82,7 +83,7 @@ public class DisplayAreaPolicyBuilderTest {
    private TestWindowManagerPolicy mPolicy = new TestWindowManagerPolicy(null, null);
    private WindowManagerService mWms;
    private RootDisplayArea mRoot;
    private DisplayArea<WindowContainer> mImeContainer;
    private DisplayArea.Tokens mImeContainer;
    private DisplayContent mDisplayContent;
    private TaskDisplayArea mDefaultTaskDisplayArea;
    private List<TaskDisplayArea> mTaskDisplayAreaList;
@@ -95,7 +96,7 @@ public class DisplayAreaPolicyBuilderTest {
    public void setup() {
        mWms = mSystemServices.getWindowManagerService();
        mRoot = new SurfacelessDisplayAreaRoot(mWms);
        mImeContainer = new DisplayArea<>(mWms, ABOVE_TASKS, "Ime");
        mImeContainer = new DisplayArea.Tokens(mWms, ABOVE_TASKS, "ImeContainer");
        mDisplayContent = mock(DisplayContent.class);
        mDefaultTaskDisplayArea = new TaskDisplayArea(mDisplayContent, mWms, "Tasks",
                FEATURE_DEFAULT_TASK_CONTAINER);
@@ -148,6 +149,10 @@ public class DisplayAreaPolicyBuilderTest {
        // The IME is below both foo and bar.
        assertThat(fooDescendantMatcher.matches(mImeContainer)).isTrue();
        assertThat(barDescendantMatcher.matches(mImeContainer)).isTrue();
        assertThat(policy.findAreaForToken(tokenOfType(TYPE_INPUT_METHOD)))
                .isEqualTo(mImeContainer);
        assertThat(policy.findAreaForToken(tokenOfType(TYPE_INPUT_METHOD_DIALOG)))
                .isEqualTo(mImeContainer);

        List<DisplayArea<?>> actualOrder = collectLeafAreas(mRoot);
        Map<DisplayArea<?>, Set<Integer>> zSets = calculateZSets(policy, mImeContainer,
@@ -547,7 +552,7 @@ public class DisplayAreaPolicyBuilderTest {

    private Map<DisplayArea<?>, Set<Integer>> calculateZSets(
            DisplayAreaPolicyBuilder.Result policy,
            DisplayArea<WindowContainer> ime,
            DisplayArea.Tokens ime,
            DisplayArea<Task> tasks) {
        Map<DisplayArea<?>, Set<Integer>> zSets = new HashMap<>();
        int[] types = {TYPE_STATUS_BAR, TYPE_NAVIGATION_BAR, TYPE_PRESENTATION,
Loading