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

Commit 68101dbb authored by Santos Cordon's avatar Santos Cordon Committed by Android (Google) Code Review
Browse files

Merge "Specify display by Port in display-layout-config" into main

parents 7e7a8b84 f477d54c
Loading
Loading
Loading
Loading
+24 −0
Original line number Diff line number Diff line
@@ -138,6 +138,30 @@ public abstract class DisplayAddress implements Parcelable {
            out.writeLong(mPhysicalDisplayId);
        }

        /**
         * This method is meant to check to see if the ports match
         * @param a1 Address to compare
         * @param a2 Address to compare
         *
         * @return true if the arguments have the same port, and at least one does not specify
         *         a model.
         */
        public static boolean isPortMatch(DisplayAddress a1, DisplayAddress a2) {
            // Both displays must be of type Physical
            if (!(a1 instanceof Physical && a2 instanceof Physical)) {
                return false;
            }
            Physical p1 = (Physical) a1;
            Physical p2 = (Physical) a2;

            // If both addresses specify a model, fallback to a basic match check (which
            // also checks the port).
            if (p1.getModel() != null && p2.getModel() != null) {
                return p1.equals(p2);
            }
            return p1.getPort() == p2.getPort();
        }

        private Physical(long physicalDisplayId) {
            mPhysicalDisplayId = physicalDisplayId;
        }
+25 −4
Original line number Diff line number Diff line
@@ -27,6 +27,7 @@ import android.view.DisplayAddress;
import com.android.internal.annotations.VisibleForTesting;
import com.android.server.display.config.layout.Layouts;
import com.android.server.display.config.layout.XmlParser;
import com.android.server.display.feature.DisplayManagerFlags;
import com.android.server.display.layout.DisplayIdProducer;
import com.android.server.display.layout.Layout;

@@ -68,12 +69,15 @@ class DeviceStateToLayoutMap {

    private final SparseArray<Layout> mLayoutMap = new SparseArray<>();
    private final DisplayIdProducer mIdProducer;
    private final boolean mIsPortInDisplayLayoutEnabled;

    DeviceStateToLayoutMap(DisplayIdProducer idProducer) {
        this(idProducer, getConfigFile());
    DeviceStateToLayoutMap(DisplayIdProducer idProducer, DisplayManagerFlags flags) {
        this(idProducer, flags, getConfigFile());
    }

    DeviceStateToLayoutMap(DisplayIdProducer idProducer, File configFile) {
    DeviceStateToLayoutMap(DisplayIdProducer idProducer, DisplayManagerFlags flags,
            File configFile) {
        mIsPortInDisplayLayoutEnabled = flags.isPortInDisplayLayoutEnabled();
        mIdProducer = idProducer;
        loadLayoutsFromConfig(configFile);
        createLayout(STATE_DEFAULT);
@@ -93,6 +97,7 @@ class DeviceStateToLayoutMap {
        ipw.println("DeviceStateToLayoutMap:");
        ipw.increaseIndent();

        ipw.println("mIsPortInDisplayLayoutEnabled=" + mIsPortInDisplayLayoutEnabled);
        ipw.println("Registered Layouts:");
        for (int i = 0; i < mLayoutMap.size(); i++) {
            ipw.println("state(" + mLayoutMap.keyAt(i) + "): " + mLayoutMap.valueAt(i));
@@ -132,13 +137,15 @@ class DeviceStateToLayoutMap {
                final Layout layout = createLayout(state);
                for (com.android.server.display.config.layout.Display d: l.getDisplay()) {
                    assert layout != null;
                    final DisplayAddress address = getDisplayAddressForLayoutDisplay(d);

                    int position = getPosition(d.getPosition());
                    BigInteger leadDisplayPhysicalId = d.getLeadDisplayAddress();
                    DisplayAddress leadDisplayAddress = leadDisplayPhysicalId == null ? null
                            : DisplayAddress.fromPhysicalDisplayId(
                                    leadDisplayPhysicalId.longValue());
                    layout.createDisplayLocked(
                            DisplayAddress.fromPhysicalDisplayId(d.getAddress().longValue()),
                            address,
                            d.isDefaultDisplay(),
                            d.isEnabled(),
                            d.getDisplayGroup(),
@@ -158,6 +165,20 @@ class DeviceStateToLayoutMap {
        }
    }

    private DisplayAddress getDisplayAddressForLayoutDisplay(
            @NonNull com.android.server.display.config.layout.Display display) {
        BigInteger xmlAddress = display.getAddress_optional();
        if (xmlAddress != null) {
            return DisplayAddress.fromPhysicalDisplayId(xmlAddress.longValue());
        }
        if (!mIsPortInDisplayLayoutEnabled || display.getPort_optional() == null) {
            throw new IllegalArgumentException(
                  "Must specify a display identifier in display layout configuration: " + display);
        }
        return DisplayAddress.fromPortAndModel((int) display.getPort_optional().longValue(),
                /* model= */ null);
    }

    private int getPosition(@NonNull String position) {
        int positionInt = POSITION_UNKNOWN;
        if (FRONT_STRING.equals(position)) {
+3 −1
Original line number Diff line number Diff line
@@ -129,7 +129,9 @@ class DisplayDeviceRepository implements DisplayAdapter.Listener {
    public DisplayDevice getByAddressLocked(@NonNull DisplayAddress address) {
        for (int i = mDisplayDevices.size() - 1; i >= 0; i--) {
            final DisplayDevice device = mDisplayDevices.get(i);
            if (address.equals(device.getDisplayDeviceInfoLocked().address)) {
            final DisplayDeviceInfo info = device.getDisplayDeviceInfoLocked();
            if (address.equals(info.address)
                    || DisplayAddress.Physical.isPortMatch(address, info.address)) {
                return device;
            }
        }
+3 −3
Original line number Diff line number Diff line
@@ -205,7 +205,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
            @NonNull Handler handler, DisplayManagerFlags flags) {
        this(context, foldSettingProvider, repo, listener, syncRoot, handler,
                new DeviceStateToLayoutMap((isDefault) -> isDefault ? DEFAULT_DISPLAY
                        : sNextNonDefaultDisplayId++), flags);
                        : sNextNonDefaultDisplayId++, flags), flags);
    }

    LogicalDisplayMapper(@NonNull Context context, FoldSettingProvider foldSettingProvider,
@@ -1094,8 +1094,8 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener {
            final DisplayAddress address = displayLayout.getAddress();
            final DisplayDevice device = mDisplayDeviceRepo.getByAddressLocked(address);
            if (device == null) {
                Slog.w(TAG, "The display device (" + address + "), is not available"
                        + " for the display state " + mDeviceState);
                Slog.w(TAG, "applyLayoutLocked: The display device (" + address + "), is not "
                        + "available for the display state " + mDeviceState);
                continue;
            }

+10 −0
Original line number Diff line number Diff line
@@ -37,6 +37,9 @@ public class DisplayManagerFlags {
    // 'adb shell setprop persist.log.tag.DisplayManagerFlags DEBUG && adb reboot'
    private static final boolean DEBUG = DebugUtils.isDebuggable(TAG);

    private final FlagState mPortInDisplayLayoutFlagState = new FlagState(
            Flags.FLAG_ENABLE_PORT_IN_DISPLAY_LAYOUT,
            Flags::enablePortInDisplayLayout);

    private final FlagState mConnectedDisplayManagementFlagState = new FlagState(
            Flags.FLAG_ENABLE_CONNECTED_DISPLAY_MANAGEMENT,
@@ -114,6 +117,13 @@ public class DisplayManagerFlags {
            Flags::refreshRateVotingTelemetry
    );

    /**
     * @return {@code true} if 'port' is allowed in display layout configuration file.
     */
    public boolean isPortInDisplayLayoutEnabled() {
        return mPortInDisplayLayoutFlagState.isEnabled();
    }

    /** Returns whether connected display management is enabled or not. */
    public boolean isConnectedDisplayManagementEnabled() {
        return mConnectedDisplayManagementFlagState.isEnabled();
Loading