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

Commit 639ce078 authored by Adrian Roos's avatar Adrian Roos
Browse files

WM: Support device-specific DisplayArea (4/n)

Adds support for providing a device-specific DisplayAreaPolicy, by
overriding the new config_deviceSpecificDisplayAreaPolicyProvider
property.

Bug: 147406652
Test: atest WmTests DisplayAreaProviderTest
Change-Id: Ia9535960f4f0e6ca088b52759527a1182cadff3b
parent 43361f71
Loading
Loading
Loading
Loading
+4 −0
Original line number Diff line number Diff line
@@ -3792,6 +3792,10 @@
         or empty if the default should be used. -->
    <string translatable="false" name="config_deviceSpecificAudioService"></string>

    <!-- Class name of the device specific implementation of DisplayAreaPolicy.Provider
         or empty if the default should be used. -->
    <string translatable="false" name="config_deviceSpecificDisplayAreaPolicyProvider"></string>

    <!-- Component name of media projection permission dialog -->
    <string name="config_mediaProjectionPermissionDialogComponent" translatable="false">com.android.systemui/com.android.systemui.media.MediaProjectionPermissionActivity</string>

+2 −0
Original line number Diff line number Diff line
@@ -3864,6 +3864,8 @@
  <!-- Toast message for background started foreground service while-in-use permission restriction feature -->
  <java-symbol type="string" name="allow_while_in_use_permission_in_fgs" />

  <java-symbol type="string" name="config_deviceSpecificDisplayAreaPolicyProvider" />

  <!-- Whether to expand the lock screen user switcher by default -->
  <java-symbol type="bool" name="config_expandLockScreenUserSwitcher" />
</resources>
+65 −1
Original line number Diff line number Diff line
@@ -18,6 +18,9 @@ package com.android.server.wm;

import static android.view.WindowManager.LayoutParams.TYPE_INPUT_METHOD;

import android.content.res.Resources;
import android.text.TextUtils;

import com.android.server.wm.DisplayContent.TaskContainers;

/**
@@ -42,7 +45,18 @@ public abstract class DisplayAreaPolicy {
     */
    protected final TaskContainers mTaskContainers;

    DisplayAreaPolicy(WindowManagerService wmService,
    /**
     * Construct a new {@link DisplayAreaPolicy}
     *
     * @param wmService the window manager service instance
     * @param content the display content for which the policy applies
     * @param root the root display area under which the policy operates
     * @param imeContainer the ime container that the policy must attach
     * @param taskContainers the task container that the policy must attach
     *
     * @see #attachDisplayAreas()
     */
    protected DisplayAreaPolicy(WindowManagerService wmService,
            DisplayContent content, DisplayArea.Root root,
            DisplayArea<? extends WindowContainer> imeContainer, TaskContainers taskContainers) {
        mWmService = wmService;
@@ -119,5 +133,55 @@ public abstract class DisplayAreaPolicy {
                    throw new IllegalArgumentException("don't know how to sort " + token);
            }
        }

        /** Provider for {@link DisplayAreaPolicy.Default platform-default display area policy}. */
        static class Provider implements DisplayAreaPolicy.Provider {
            @Override
            public DisplayAreaPolicy instantiate(WindowManagerService wmService,
                    DisplayContent content, DisplayArea.Root root,
                    DisplayArea<? extends WindowContainer> imeContainer,
                    TaskContainers taskContainers) {
                return new DisplayAreaPolicy.Default(wmService, content, root, imeContainer,
                        taskContainers);
            }
        }
    }

    /**
     * Provider for {@link DisplayAreaPolicy} instances.
     *
     * By implementing this interface and overriding the
     * {@code config_deviceSpecificDisplayAreaPolicyProvider}, a device-specific implementations
     * of {@link DisplayAreaPolicy} can be supplied.
     */
    public interface Provider {
        /**
         * Instantiate a new DisplayAreaPolicy.
         *
         * @see DisplayAreaPolicy#DisplayAreaPolicy
         */
        DisplayAreaPolicy instantiate(WindowManagerService wmService,
                DisplayContent content, DisplayArea.Root root,
                DisplayArea<? extends WindowContainer> imeContainer,
                TaskContainers taskContainers);

        /**
         * Instantiate the device-specific {@link Provider}.
         */
        static Provider fromResources(Resources res) {
            String name = res.getString(
                    com.android.internal.R.string.config_deviceSpecificDisplayAreaPolicyProvider);
            if (TextUtils.isEmpty(name)) {
                return new DisplayAreaPolicy.Default.Provider();
            }
            try {
                return (Provider) Class.forName(name).newInstance();
            } catch (ReflectiveOperationException | ClassCastException e) {
                throw new IllegalStateException("Couldn't instantiate class " + name
                        + " for config_deviceSpecificDisplayAreaPolicyProvider:"
                        + " make sure it has a public zero-argument constructor"
                        + " and implements DisplayAreaPolicy.Provider", e);
            }
        }
    }
}
+3 −2
Original line number Diff line number Diff line
@@ -304,8 +304,7 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo

    private final DisplayArea.Root mRootDisplayArea = new DisplayArea.Root(mWmService);

    private final DisplayAreaPolicy mDisplayAreaPolicy = new DisplayAreaPolicy.Default(
            mWmService, this, mRootDisplayArea, mImeWindowsContainers, mTaskContainers);
    private final DisplayAreaPolicy mDisplayAreaPolicy;

    private WindowState mTmpWindow;
    private WindowState mTmpWindow2;
@@ -1027,6 +1026,8 @@ class DisplayContent extends WindowContainer<DisplayContent.DisplayChildWindowCo
        super.addChild(mWindowContainers, null);
        super.addChild(mOverlayContainers, null);

        mDisplayAreaPolicy = mWmService.mDisplayAreaPolicyProvider.instantiate(
                mWmService, this, mRootDisplayArea, mImeWindowsContainers, mTaskContainers);
        mWindowContainers.addChildren();

        // Sets the display content for the children.
+6 −0
Original line number Diff line number Diff line
@@ -413,6 +413,8 @@ public class WindowManagerService extends IWindowManager.Stub

    final WindowTracing mWindowTracing;

    final DisplayAreaPolicy.Provider mDisplayAreaPolicyProvider;

    final private KeyguardDisableHandler mKeyguardDisableHandler;
    // TODO: eventually unify all keyguard state in a common place instead of having it spread over
    // AM's KeyguardController and the policy's KeyguardServiceDelegate.
@@ -1255,6 +1257,10 @@ public class WindowManagerService extends IWindowManager.Stub

        LocalServices.addService(WindowManagerInternal.class, new LocalService());
        mEmbeddedWindowController = new EmbeddedWindowController(mGlobalLock);

        mDisplayAreaPolicyProvider = DisplayAreaPolicy.Provider.fromResources(
                mContext.getResources());

        setGlobalShadowSettings();
    }

Loading