Loading core/java/android/view/DisplayAddress.java +24 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading services/core/java/com/android/server/display/DeviceStateToLayoutMap.java +25 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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)); Loading Loading @@ -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(), Loading @@ -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)) { Loading services/core/java/com/android/server/display/DisplayDeviceRepository.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; } } Loading services/core/java/com/android/server/display/LogicalDisplayMapper.java +3 −3 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; } Loading services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +10 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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 Loading
core/java/android/view/DisplayAddress.java +24 −0 Original line number Diff line number Diff line Loading @@ -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; } Loading
services/core/java/com/android/server/display/DeviceStateToLayoutMap.java +25 −4 Original line number Diff line number Diff line Loading @@ -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; Loading Loading @@ -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); Loading @@ -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)); Loading Loading @@ -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(), Loading @@ -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)) { Loading
services/core/java/com/android/server/display/DisplayDeviceRepository.java +3 −1 Original line number Diff line number Diff line Loading @@ -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; } } Loading
services/core/java/com/android/server/display/LogicalDisplayMapper.java +3 −3 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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; } Loading
services/core/java/com/android/server/display/feature/DisplayManagerFlags.java +10 −0 Original line number Diff line number Diff line Loading @@ -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, Loading Loading @@ -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