Loading core/java/android/hardware/display/DisplayManager.java +8 −5 Original line number Diff line number Diff line Loading @@ -559,18 +559,21 @@ public final class DisplayManager { * @see #DISPLAY_CATEGORY_PRESENTATION */ public Display[] getDisplays(String category) { final int[] displayIds = mGlobal.getDisplayIds(); boolean includeDisabledDisplays = (category != null && category.equals(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)); final int[] displayIds = mGlobal.getDisplayIds(includeDisabledDisplays); synchronized (mLock) { try { if (category == null || DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED.equals(category)) { addAllDisplaysLocked(mTempDisplays, displayIds); } else if (category.equals(DISPLAY_CATEGORY_PRESENTATION)) { if (category != null && category.equals(DISPLAY_CATEGORY_PRESENTATION)) { addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_WIFI); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_EXTERNAL); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_OVERLAY); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_VIRTUAL); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_INTERNAL); } else if ((category == null || DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED.equals(category))) { // All displays requested. addAllDisplaysLocked(mTempDisplays, displayIds); } return mTempDisplays.toArray(new Display[mTempDisplays.size()]); } finally { Loading core/java/android/hardware/display/DisplayManagerGlobal.java +12 −1 Original line number Diff line number Diff line Loading @@ -206,6 +206,16 @@ public final class DisplayManagerGlobal { */ @UnsupportedAppUsage public int[] getDisplayIds() { return getDisplayIds(/* includeDisabledDisplays= */ false); } /** * Gets all valid logical display ids and invalid ones if specified. * * @return An array containing all display ids. */ @UnsupportedAppUsage public int[] getDisplayIds(boolean includeDisabledDisplays) { try { synchronized (mLock) { if (USE_CACHE) { Loading @@ -214,7 +224,8 @@ public final class DisplayManagerGlobal { } } int[] displayIds = mDm.getDisplayIds(); int[] displayIds = mDm.getDisplayIds(includeDisabledDisplays); if (USE_CACHE) { mDisplayIdCache = displayIds; } Loading core/java/android/hardware/display/IDisplayManager.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ import android.view.Surface; interface IDisplayManager { @UnsupportedAppUsage DisplayInfo getDisplayInfo(int displayId); int[] getDisplayIds(); int[] getDisplayIds(boolean includeDisabled); boolean isUidPresentOnDisplay(int uid, int displayId); Loading services/core/java/com/android/server/display/DisplayManagerService.java +18 −14 Original line number Diff line number Diff line Loading @@ -485,7 +485,7 @@ public final class DisplayManagerService extends SystemService { mUiHandler = UiThread.getHandler(); mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore); mLogicalDisplayMapper = new LogicalDisplayMapper(mContext, mDisplayDeviceRepo, new LogicalDisplayListener(), mSyncRoot, mHandler); new LogicalDisplayListener(), mSyncRoot, mHandler, new DeviceStateToLayoutMap()); mDisplayModeDirector = new DisplayModeDirector(context, mHandler); mBrightnessSynchronizer = new BrightnessSynchronizer(mContext); Resources resources = mContext.getResources(); Loading Loading @@ -945,7 +945,8 @@ public final class DisplayManagerService extends SystemService { private DisplayInfo getDisplayInfoInternal(int displayId, int callingUid) { synchronized (mSyncRoot) { final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(displayId); final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(displayId, /* includeDisabledDisplays= */ true); if (display != null) { final DisplayInfo info = getDisplayInfoForFrameRateOverride(display.getFrameRateOverrides(), Loading Loading @@ -2128,17 +2129,19 @@ public final class DisplayManagerService extends SystemService { } void resetBrightnessConfigurations() { synchronized (mSyncRoot) { mPersistentDataStore.setBrightnessConfigurationForUser(null, mContext.getUserId(), mContext.getPackageName()); mLogicalDisplayMapper.forEachLocked((logicalDisplay -> { if (logicalDisplay.getDisplayInfoLocked().type != Display.TYPE_INTERNAL) { return; } final String uniqueId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); String uniqueId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); setBrightnessConfigurationForDisplayInternal(null, uniqueId, mContext.getUserId(), mContext.getPackageName()); })); } } void setAutoBrightnessLoggingEnabled(boolean enabled) { synchronized (mSyncRoot) { Loading Loading @@ -2814,15 +2817,16 @@ public final class DisplayManagerService extends SystemService { } /** * Returns the list of all display ids. * Returns the list of all enabled display ids, and disabled ones if specified. */ @Override // Binder call public int[] getDisplayIds() { public int[] getDisplayIds(boolean includeDisabledDisplays) { final int callingUid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { synchronized (mSyncRoot) { return mLogicalDisplayMapper.getDisplayIdsLocked(callingUid); return mLogicalDisplayMapper.getDisplayIdsLocked(callingUid, includeDisabledDisplays); } } finally { Binder.restoreCallingIdentity(token); Loading services/core/java/com/android/server/display/LogicalDisplayMapper.java +98 −22 Original line number Diff line number Diff line Loading @@ -79,8 +79,12 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { private static final int MSG_TRANSITION_TO_PENDING_DEVICE_STATE = 1; private static final int UPDATE_STATE_NEW = 0; private static final int UPDATE_STATE_TRANSITION = 1; private static final int UPDATE_STATE_UPDATED = 2; private static final int UPDATE_STATE_UPDATED = 1; private static final int UPDATE_STATE_DISABLED = 2; private static final int UPDATE_STATE_MASK = 0x3; private static final int UPDATE_STATE_FLAG_TRANSITION = 0x100; /** * Temporary display info, used for comparing display configurations. Loading Loading @@ -166,7 +170,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { LogicalDisplayMapper(@NonNull Context context, @NonNull DisplayDeviceRepository repo, @NonNull Listener listener, @NonNull DisplayManagerService.SyncRoot syncRoot, @NonNull Handler handler) { @NonNull Handler handler, @NonNull DeviceStateToLayoutMap deviceStateToLayoutMap) { mSyncRoot = syncRoot; mPowerManager = context.getSystemService(PowerManager.class); mInteractive = mPowerManager.isInteractive(); Loading @@ -181,7 +185,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { mDeviceStatesOnWhichToSleep = toSparseBooleanArray(context.getResources().getIntArray( com.android.internal.R.array.config_deviceStatesOnWhichToSleep)); mDisplayDeviceRepo.addListener(this); mDeviceStateToLayoutMap = new DeviceStateToLayoutMap(); mDeviceStateToLayoutMap = deviceStateToLayoutMap; } @Override Loading Loading @@ -218,10 +222,29 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } public LogicalDisplay getDisplayLocked(int displayId) { return mLogicalDisplays.get(displayId); return getDisplayLocked(displayId, /* includeDisabled= */ false); } LogicalDisplay getDisplayLocked(int displayId, boolean includeDisabled) { LogicalDisplay display = mLogicalDisplays.get(displayId); if (display != null && (display.isEnabled() || includeDisabled)) { return display; } return null; } public LogicalDisplay getDisplayLocked(DisplayDevice device) { return getDisplayLocked(device, /* includeDisabled= */ false); } /** * Loops through the existing list of displays and returns one that is associated with the * specified display device. * * @param device The display device that should be associated with the LogicalDisplay. * @param includeDisabled True if this method should return disabled displays as well. */ private LogicalDisplay getDisplayLocked(DisplayDevice device, boolean includeDisabled) { if (device == null) { return null; } Loading @@ -229,18 +252,32 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { for (int i = 0; i < count; i++) { final LogicalDisplay display = mLogicalDisplays.valueAt(i); if (display.getPrimaryDisplayDeviceLocked() == device) { if (display.isEnabled() || includeDisabled) { return display; } else { return null; } } } return null; } // Returns display Ids, defaults to enabled only. public int[] getDisplayIdsLocked(int callingUid) { return getDisplayIdsLocked(callingUid, /* includeDisabledDisplays= */ false); } // Returns display Ids, specified whether enabled only, or all displays. public int[] getDisplayIdsLocked(int callingUid, boolean includeDisabledDisplays) { final int count = mLogicalDisplays.size(); int[] displayIds = new int[count]; int n = 0; for (int i = 0; i < count; i++) { LogicalDisplay display = mLogicalDisplays.valueAt(i); if (!includeDisabledDisplays && !display.isEnabled()) { continue; // Ignore disabled displays. } DisplayInfo info = display.getDisplayInfoLocked(); if (info.hasAccess(callingUid)) { displayIds[n++] = mLogicalDisplays.keyAt(i); Loading @@ -255,7 +292,10 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { public void forEachLocked(Consumer<LogicalDisplay> consumer) { final int count = mLogicalDisplays.size(); for (int i = 0; i < count; i++) { consumer.accept(mLogicalDisplays.valueAt(i)); LogicalDisplay display = mLogicalDisplays.valueAt(i); if (display.isEnabled()) { consumer.accept(display); } } } Loading Loading @@ -316,7 +356,8 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // Find or create the LogicalDisplay to map the DisplayDevice to. final int logicalDisplayId = displayLayout.getLogicalDisplayId(); final LogicalDisplay logicalDisplay = getDisplayLocked(logicalDisplayId); final LogicalDisplay logicalDisplay = getDisplayLocked(logicalDisplayId, /* includeDisabled= */ true); if (logicalDisplay == null) { Slog.w(TAG, "The logical display (" + address + "), is not available" + " for the display state " + deviceState); Loading Loading @@ -452,7 +493,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } /** * Returns if the device should be put to sleep or not. * Returns true if the device should be put to sleep or not. * * Includes a check to verify that the device state that we are moving to, {@code pendingState}, * is the same as the physical state of the device, {@code baseState}. Different values for Loading Loading @@ -598,9 +639,12 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { display.getNonOverrideDisplayInfoLocked(mTempNonOverrideDisplayInfo); display.updateLocked(mDisplayDeviceRepo); final DisplayInfo newDisplayInfo = display.getDisplayInfoLocked(); final int updateState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW); final boolean wasPreviouslyUpdated = updateState != UPDATE_STATE_NEW; DisplayInfo newDisplayInfo = display.getDisplayInfoLocked(); final int storedState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW); final int updateState = storedState & UPDATE_STATE_MASK; final boolean isTransitioning = (storedState & UPDATE_STATE_FLAG_TRANSITION) != 0; final boolean wasPreviouslyUpdated = updateState == UPDATE_STATE_UPDATED; // The display is no longer valid and needs to be removed. if (!display.isValidLocked()) { Loading @@ -624,6 +668,35 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } continue; // The display has been newly disabled, we report this as a removed display but // don't actually remove it from our internal list in LogicalDisplayMapper. The reason // is that LogicalDisplayMapper assumes and relies on the fact that every DisplayDevice // has a LogicalDisplay wrapper, but certain displays that are unusable (like the inner // display on a folded foldable device) are not available for use by the system and // we keep them hidden. To do this, we mark those LogicalDisplays as "disabled". // Also, if the display is in TRANSITION but was previously reported as disabled // then keep it unreported. } else if (!display.isEnabled() || (display.getPhase() == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION && updateState == UPDATE_STATE_DISABLED)) { mUpdatedLogicalDisplays.put(displayId, UPDATE_STATE_DISABLED); // If we never told anyone about this display, nothing to do if (!wasPreviouslyUpdated) { continue; } // Remove from group final DisplayGroup displayGroup = getDisplayGroupLocked( getDisplayGroupIdFromDisplayIdLocked(displayId)); if (displayGroup != null) { displayGroup.removeDisplayLocked(display); } Slog.i(TAG, "Removing (disabled) display: " + displayId); mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_REMOVED); continue; // The display is new. } else if (!wasPreviouslyUpdated) { Slog.i(TAG, "Adding new display: " + displayId + ": " + newDisplayInfo); Loading @@ -643,7 +716,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_CHANGED); // The display is involved in a display layout transition } else if (updateState == UPDATE_STATE_TRANSITION) { } else if (isTransitioning) { mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION); Loading Loading @@ -717,7 +790,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } final int id = mLogicalDisplaysToUpdate.keyAt(i); final LogicalDisplay display = getDisplayLocked(id); final LogicalDisplay display = getDisplayLocked(id, /* includeDisabled= */ true); if (DEBUG) { final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); final String uniqueId = device == null ? "null" : device.getUniqueId(); Loading @@ -725,7 +798,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { + " with device=" + uniqueId); } mListener.onLogicalDisplayEventLocked(display, msg); if (msg == LOGICAL_DISPLAY_EVENT_REMOVED) { if (msg == LOGICAL_DISPLAY_EVENT_REMOVED && !display.isValidLocked()) { // We wait until we sent the EVENT_REMOVED event before actually removing the // display. mLogicalDisplays.delete(id); Loading Loading @@ -845,7 +918,8 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { if (isTransitioning) { setDisplayPhase(logicalDisplay, phase); if (phase == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION) { mUpdatedLogicalDisplays.put(displayId, UPDATE_STATE_TRANSITION); int oldState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW); mUpdatedLogicalDisplays.put(displayId, oldState | UPDATE_STATE_FLAG_TRANSITION); } } } Loading Loading @@ -879,14 +953,15 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // Now that we have a display-device, we need a LogicalDisplay to map it to. Find the // right one, if it doesn't exist, create a new one. final int logicalDisplayId = displayLayout.getLogicalDisplayId(); LogicalDisplay newDisplay = getDisplayLocked(logicalDisplayId); LogicalDisplay newDisplay = getDisplayLocked(logicalDisplayId, /* includeDisabled= */ true); if (newDisplay == null) { newDisplay = createNewLogicalDisplayLocked( null /*displayDevice*/, logicalDisplayId); /* displayDevice= */ null, logicalDisplayId); } // Now swap the underlying display devices between the old display and the new display final LogicalDisplay oldDisplay = getDisplayLocked(device); final LogicalDisplay oldDisplay = getDisplayLocked(device, /* includeDisabled= */ true); if (newDisplay != oldDisplay) { newDisplay.swapDisplaysLocked(oldDisplay); } Loading @@ -903,13 +978,14 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { * Creates a new logical display for the specified device and display Id and adds it to the list * of logical displays. * * @param device The device to associate with the LogicalDisplay. * @param displayDevice The displayDevice to associate with the LogicalDisplay. * @param displayId The display ID to give the new display. If invalid, a new ID is assigned. * @return The new logical display if created, null otherwise. */ private LogicalDisplay createNewLogicalDisplayLocked(DisplayDevice device, int displayId) { private LogicalDisplay createNewLogicalDisplayLocked(DisplayDevice displayDevice, int displayId) { final int layerStack = assignLayerStackLocked(displayId); final LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device); final LogicalDisplay display = new LogicalDisplay(displayId, layerStack, displayDevice); display.updateLocked(mDisplayDeviceRepo); mLogicalDisplays.put(displayId, display); setDisplayPhase(display, LogicalDisplay.DISPLAY_PHASE_ENABLED); Loading Loading
core/java/android/hardware/display/DisplayManager.java +8 −5 Original line number Diff line number Diff line Loading @@ -559,18 +559,21 @@ public final class DisplayManager { * @see #DISPLAY_CATEGORY_PRESENTATION */ public Display[] getDisplays(String category) { final int[] displayIds = mGlobal.getDisplayIds(); boolean includeDisabledDisplays = (category != null && category.equals(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED)); final int[] displayIds = mGlobal.getDisplayIds(includeDisabledDisplays); synchronized (mLock) { try { if (category == null || DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED.equals(category)) { addAllDisplaysLocked(mTempDisplays, displayIds); } else if (category.equals(DISPLAY_CATEGORY_PRESENTATION)) { if (category != null && category.equals(DISPLAY_CATEGORY_PRESENTATION)) { addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_WIFI); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_EXTERNAL); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_OVERLAY); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_VIRTUAL); addPresentationDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_INTERNAL); } else if ((category == null || DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED.equals(category))) { // All displays requested. addAllDisplaysLocked(mTempDisplays, displayIds); } return mTempDisplays.toArray(new Display[mTempDisplays.size()]); } finally { Loading
core/java/android/hardware/display/DisplayManagerGlobal.java +12 −1 Original line number Diff line number Diff line Loading @@ -206,6 +206,16 @@ public final class DisplayManagerGlobal { */ @UnsupportedAppUsage public int[] getDisplayIds() { return getDisplayIds(/* includeDisabledDisplays= */ false); } /** * Gets all valid logical display ids and invalid ones if specified. * * @return An array containing all display ids. */ @UnsupportedAppUsage public int[] getDisplayIds(boolean includeDisabledDisplays) { try { synchronized (mLock) { if (USE_CACHE) { Loading @@ -214,7 +224,8 @@ public final class DisplayManagerGlobal { } } int[] displayIds = mDm.getDisplayIds(); int[] displayIds = mDm.getDisplayIds(includeDisabledDisplays); if (USE_CACHE) { mDisplayIdCache = displayIds; } Loading
core/java/android/hardware/display/IDisplayManager.aidl +1 −1 Original line number Diff line number Diff line Loading @@ -36,7 +36,7 @@ import android.view.Surface; interface IDisplayManager { @UnsupportedAppUsage DisplayInfo getDisplayInfo(int displayId); int[] getDisplayIds(); int[] getDisplayIds(boolean includeDisabled); boolean isUidPresentOnDisplay(int uid, int displayId); Loading
services/core/java/com/android/server/display/DisplayManagerService.java +18 −14 Original line number Diff line number Diff line Loading @@ -485,7 +485,7 @@ public final class DisplayManagerService extends SystemService { mUiHandler = UiThread.getHandler(); mDisplayDeviceRepo = new DisplayDeviceRepository(mSyncRoot, mPersistentDataStore); mLogicalDisplayMapper = new LogicalDisplayMapper(mContext, mDisplayDeviceRepo, new LogicalDisplayListener(), mSyncRoot, mHandler); new LogicalDisplayListener(), mSyncRoot, mHandler, new DeviceStateToLayoutMap()); mDisplayModeDirector = new DisplayModeDirector(context, mHandler); mBrightnessSynchronizer = new BrightnessSynchronizer(mContext); Resources resources = mContext.getResources(); Loading Loading @@ -945,7 +945,8 @@ public final class DisplayManagerService extends SystemService { private DisplayInfo getDisplayInfoInternal(int displayId, int callingUid) { synchronized (mSyncRoot) { final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(displayId); final LogicalDisplay display = mLogicalDisplayMapper.getDisplayLocked(displayId, /* includeDisabledDisplays= */ true); if (display != null) { final DisplayInfo info = getDisplayInfoForFrameRateOverride(display.getFrameRateOverrides(), Loading Loading @@ -2128,17 +2129,19 @@ public final class DisplayManagerService extends SystemService { } void resetBrightnessConfigurations() { synchronized (mSyncRoot) { mPersistentDataStore.setBrightnessConfigurationForUser(null, mContext.getUserId(), mContext.getPackageName()); mLogicalDisplayMapper.forEachLocked((logicalDisplay -> { if (logicalDisplay.getDisplayInfoLocked().type != Display.TYPE_INTERNAL) { return; } final String uniqueId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); String uniqueId = logicalDisplay.getPrimaryDisplayDeviceLocked().getUniqueId(); setBrightnessConfigurationForDisplayInternal(null, uniqueId, mContext.getUserId(), mContext.getPackageName()); })); } } void setAutoBrightnessLoggingEnabled(boolean enabled) { synchronized (mSyncRoot) { Loading Loading @@ -2814,15 +2817,16 @@ public final class DisplayManagerService extends SystemService { } /** * Returns the list of all display ids. * Returns the list of all enabled display ids, and disabled ones if specified. */ @Override // Binder call public int[] getDisplayIds() { public int[] getDisplayIds(boolean includeDisabledDisplays) { final int callingUid = Binder.getCallingUid(); final long token = Binder.clearCallingIdentity(); try { synchronized (mSyncRoot) { return mLogicalDisplayMapper.getDisplayIdsLocked(callingUid); return mLogicalDisplayMapper.getDisplayIdsLocked(callingUid, includeDisabledDisplays); } } finally { Binder.restoreCallingIdentity(token); Loading
services/core/java/com/android/server/display/LogicalDisplayMapper.java +98 −22 Original line number Diff line number Diff line Loading @@ -79,8 +79,12 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { private static final int MSG_TRANSITION_TO_PENDING_DEVICE_STATE = 1; private static final int UPDATE_STATE_NEW = 0; private static final int UPDATE_STATE_TRANSITION = 1; private static final int UPDATE_STATE_UPDATED = 2; private static final int UPDATE_STATE_UPDATED = 1; private static final int UPDATE_STATE_DISABLED = 2; private static final int UPDATE_STATE_MASK = 0x3; private static final int UPDATE_STATE_FLAG_TRANSITION = 0x100; /** * Temporary display info, used for comparing display configurations. Loading Loading @@ -166,7 +170,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { LogicalDisplayMapper(@NonNull Context context, @NonNull DisplayDeviceRepository repo, @NonNull Listener listener, @NonNull DisplayManagerService.SyncRoot syncRoot, @NonNull Handler handler) { @NonNull Handler handler, @NonNull DeviceStateToLayoutMap deviceStateToLayoutMap) { mSyncRoot = syncRoot; mPowerManager = context.getSystemService(PowerManager.class); mInteractive = mPowerManager.isInteractive(); Loading @@ -181,7 +185,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { mDeviceStatesOnWhichToSleep = toSparseBooleanArray(context.getResources().getIntArray( com.android.internal.R.array.config_deviceStatesOnWhichToSleep)); mDisplayDeviceRepo.addListener(this); mDeviceStateToLayoutMap = new DeviceStateToLayoutMap(); mDeviceStateToLayoutMap = deviceStateToLayoutMap; } @Override Loading Loading @@ -218,10 +222,29 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } public LogicalDisplay getDisplayLocked(int displayId) { return mLogicalDisplays.get(displayId); return getDisplayLocked(displayId, /* includeDisabled= */ false); } LogicalDisplay getDisplayLocked(int displayId, boolean includeDisabled) { LogicalDisplay display = mLogicalDisplays.get(displayId); if (display != null && (display.isEnabled() || includeDisabled)) { return display; } return null; } public LogicalDisplay getDisplayLocked(DisplayDevice device) { return getDisplayLocked(device, /* includeDisabled= */ false); } /** * Loops through the existing list of displays and returns one that is associated with the * specified display device. * * @param device The display device that should be associated with the LogicalDisplay. * @param includeDisabled True if this method should return disabled displays as well. */ private LogicalDisplay getDisplayLocked(DisplayDevice device, boolean includeDisabled) { if (device == null) { return null; } Loading @@ -229,18 +252,32 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { for (int i = 0; i < count; i++) { final LogicalDisplay display = mLogicalDisplays.valueAt(i); if (display.getPrimaryDisplayDeviceLocked() == device) { if (display.isEnabled() || includeDisabled) { return display; } else { return null; } } } return null; } // Returns display Ids, defaults to enabled only. public int[] getDisplayIdsLocked(int callingUid) { return getDisplayIdsLocked(callingUid, /* includeDisabledDisplays= */ false); } // Returns display Ids, specified whether enabled only, or all displays. public int[] getDisplayIdsLocked(int callingUid, boolean includeDisabledDisplays) { final int count = mLogicalDisplays.size(); int[] displayIds = new int[count]; int n = 0; for (int i = 0; i < count; i++) { LogicalDisplay display = mLogicalDisplays.valueAt(i); if (!includeDisabledDisplays && !display.isEnabled()) { continue; // Ignore disabled displays. } DisplayInfo info = display.getDisplayInfoLocked(); if (info.hasAccess(callingUid)) { displayIds[n++] = mLogicalDisplays.keyAt(i); Loading @@ -255,7 +292,10 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { public void forEachLocked(Consumer<LogicalDisplay> consumer) { final int count = mLogicalDisplays.size(); for (int i = 0; i < count; i++) { consumer.accept(mLogicalDisplays.valueAt(i)); LogicalDisplay display = mLogicalDisplays.valueAt(i); if (display.isEnabled()) { consumer.accept(display); } } } Loading Loading @@ -316,7 +356,8 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // Find or create the LogicalDisplay to map the DisplayDevice to. final int logicalDisplayId = displayLayout.getLogicalDisplayId(); final LogicalDisplay logicalDisplay = getDisplayLocked(logicalDisplayId); final LogicalDisplay logicalDisplay = getDisplayLocked(logicalDisplayId, /* includeDisabled= */ true); if (logicalDisplay == null) { Slog.w(TAG, "The logical display (" + address + "), is not available" + " for the display state " + deviceState); Loading Loading @@ -452,7 +493,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } /** * Returns if the device should be put to sleep or not. * Returns true if the device should be put to sleep or not. * * Includes a check to verify that the device state that we are moving to, {@code pendingState}, * is the same as the physical state of the device, {@code baseState}. Different values for Loading Loading @@ -598,9 +639,12 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { display.getNonOverrideDisplayInfoLocked(mTempNonOverrideDisplayInfo); display.updateLocked(mDisplayDeviceRepo); final DisplayInfo newDisplayInfo = display.getDisplayInfoLocked(); final int updateState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW); final boolean wasPreviouslyUpdated = updateState != UPDATE_STATE_NEW; DisplayInfo newDisplayInfo = display.getDisplayInfoLocked(); final int storedState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW); final int updateState = storedState & UPDATE_STATE_MASK; final boolean isTransitioning = (storedState & UPDATE_STATE_FLAG_TRANSITION) != 0; final boolean wasPreviouslyUpdated = updateState == UPDATE_STATE_UPDATED; // The display is no longer valid and needs to be removed. if (!display.isValidLocked()) { Loading @@ -624,6 +668,35 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } continue; // The display has been newly disabled, we report this as a removed display but // don't actually remove it from our internal list in LogicalDisplayMapper. The reason // is that LogicalDisplayMapper assumes and relies on the fact that every DisplayDevice // has a LogicalDisplay wrapper, but certain displays that are unusable (like the inner // display on a folded foldable device) are not available for use by the system and // we keep them hidden. To do this, we mark those LogicalDisplays as "disabled". // Also, if the display is in TRANSITION but was previously reported as disabled // then keep it unreported. } else if (!display.isEnabled() || (display.getPhase() == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION && updateState == UPDATE_STATE_DISABLED)) { mUpdatedLogicalDisplays.put(displayId, UPDATE_STATE_DISABLED); // If we never told anyone about this display, nothing to do if (!wasPreviouslyUpdated) { continue; } // Remove from group final DisplayGroup displayGroup = getDisplayGroupLocked( getDisplayGroupIdFromDisplayIdLocked(displayId)); if (displayGroup != null) { displayGroup.removeDisplayLocked(display); } Slog.i(TAG, "Removing (disabled) display: " + displayId); mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_REMOVED); continue; // The display is new. } else if (!wasPreviouslyUpdated) { Slog.i(TAG, "Adding new display: " + displayId + ": " + newDisplayInfo); Loading @@ -643,7 +716,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_CHANGED); // The display is involved in a display layout transition } else if (updateState == UPDATE_STATE_TRANSITION) { } else if (isTransitioning) { mLogicalDisplaysToUpdate.put(displayId, LOGICAL_DISPLAY_EVENT_DEVICE_STATE_TRANSITION); Loading Loading @@ -717,7 +790,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { } final int id = mLogicalDisplaysToUpdate.keyAt(i); final LogicalDisplay display = getDisplayLocked(id); final LogicalDisplay display = getDisplayLocked(id, /* includeDisabled= */ true); if (DEBUG) { final DisplayDevice device = display.getPrimaryDisplayDeviceLocked(); final String uniqueId = device == null ? "null" : device.getUniqueId(); Loading @@ -725,7 +798,7 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { + " with device=" + uniqueId); } mListener.onLogicalDisplayEventLocked(display, msg); if (msg == LOGICAL_DISPLAY_EVENT_REMOVED) { if (msg == LOGICAL_DISPLAY_EVENT_REMOVED && !display.isValidLocked()) { // We wait until we sent the EVENT_REMOVED event before actually removing the // display. mLogicalDisplays.delete(id); Loading Loading @@ -845,7 +918,8 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { if (isTransitioning) { setDisplayPhase(logicalDisplay, phase); if (phase == LogicalDisplay.DISPLAY_PHASE_LAYOUT_TRANSITION) { mUpdatedLogicalDisplays.put(displayId, UPDATE_STATE_TRANSITION); int oldState = mUpdatedLogicalDisplays.get(displayId, UPDATE_STATE_NEW); mUpdatedLogicalDisplays.put(displayId, oldState | UPDATE_STATE_FLAG_TRANSITION); } } } Loading Loading @@ -879,14 +953,15 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { // Now that we have a display-device, we need a LogicalDisplay to map it to. Find the // right one, if it doesn't exist, create a new one. final int logicalDisplayId = displayLayout.getLogicalDisplayId(); LogicalDisplay newDisplay = getDisplayLocked(logicalDisplayId); LogicalDisplay newDisplay = getDisplayLocked(logicalDisplayId, /* includeDisabled= */ true); if (newDisplay == null) { newDisplay = createNewLogicalDisplayLocked( null /*displayDevice*/, logicalDisplayId); /* displayDevice= */ null, logicalDisplayId); } // Now swap the underlying display devices between the old display and the new display final LogicalDisplay oldDisplay = getDisplayLocked(device); final LogicalDisplay oldDisplay = getDisplayLocked(device, /* includeDisabled= */ true); if (newDisplay != oldDisplay) { newDisplay.swapDisplaysLocked(oldDisplay); } Loading @@ -903,13 +978,14 @@ class LogicalDisplayMapper implements DisplayDeviceRepository.Listener { * Creates a new logical display for the specified device and display Id and adds it to the list * of logical displays. * * @param device The device to associate with the LogicalDisplay. * @param displayDevice The displayDevice to associate with the LogicalDisplay. * @param displayId The display ID to give the new display. If invalid, a new ID is assigned. * @return The new logical display if created, null otherwise. */ private LogicalDisplay createNewLogicalDisplayLocked(DisplayDevice device, int displayId) { private LogicalDisplay createNewLogicalDisplayLocked(DisplayDevice displayDevice, int displayId) { final int layerStack = assignLayerStackLocked(displayId); final LogicalDisplay display = new LogicalDisplay(displayId, layerStack, device); final LogicalDisplay display = new LogicalDisplay(displayId, layerStack, displayDevice); display.updateLocked(mDisplayDeviceRepo); mLogicalDisplays.put(displayId, display); setDisplayPhase(display, LogicalDisplay.DISPLAY_PHASE_ENABLED); Loading