summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--core/java/android/hardware/display/DisplayManager.java119
1 files changed, 55 insertions, 64 deletions
diff --git a/core/java/android/hardware/display/DisplayManager.java b/core/java/android/hardware/display/DisplayManager.java
index 72a3f6c0bc88..b4533042b4a3 100644
--- a/core/java/android/hardware/display/DisplayManager.java
+++ b/core/java/android/hardware/display/DisplayManager.java
@@ -53,12 +53,16 @@ import android.view.Surface;
import com.android.internal.R;
import com.android.internal.annotations.GuardedBy;
+import libcore.util.EmptyArray;
+
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.List;
+import java.util.Objects;
import java.util.concurrent.Executor;
+import java.util.function.Predicate;
/**
@@ -86,9 +90,6 @@ public final class DisplayManager {
@GuardedBy("mLock")
private final WeakDisplayCache mDisplayCache = new WeakDisplayCache();
- @GuardedBy("mLock")
- private final ArrayList<Display> mTempDisplays = new ArrayList<Display>();
-
/**
* Broadcast receiver that indicates when the Wifi display status changes.
* <p>
@@ -627,9 +628,7 @@ public final class DisplayManager {
* @return The display object, or null if there is no valid display with the given id.
*/
public Display getDisplay(int displayId) {
- synchronized (mLock) {
- return getOrCreateDisplayLocked(displayId, false /*assumeValid*/);
- }
+ return getOrCreateDisplay(displayId, false /*assumeValid*/);
}
/**
@@ -661,75 +660,67 @@ public final class DisplayManager {
boolean includeDisabled = (category != null
&& category.equals(DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED));
final int[] displayIds = mGlobal.getDisplayIds(includeDisabled);
- synchronized (mLock) {
- try {
- if (DISPLAY_CATEGORY_PRESENTATION.equals(category)) {
- addDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_WIFI,
- Display.FLAG_PRESENTATION);
- addDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_EXTERNAL,
- Display.FLAG_PRESENTATION);
- addDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_OVERLAY,
- Display.FLAG_PRESENTATION);
- addDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_VIRTUAL,
- Display.FLAG_PRESENTATION);
- addDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_INTERNAL,
- Display.FLAG_PRESENTATION);
- } else if (DISPLAY_CATEGORY_REAR.equals(category)) {
- addDisplaysLocked(mTempDisplays, displayIds, Display.TYPE_INTERNAL,
- Display.FLAG_REAR);
- } else if (category == null
- || DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED.equals(category)) {
- addAllDisplaysLocked(mTempDisplays, displayIds);
- }
- return mTempDisplays.toArray(new Display[mTempDisplays.size()]);
- } finally {
- mTempDisplays.clear();
- }
+ if (DISPLAY_CATEGORY_PRESENTATION.equals(category)) {
+ return getDisplays(displayIds, DisplayManager::isPresentationDisplay);
+ } else if (DISPLAY_CATEGORY_REAR.equals(category)) {
+ return getDisplays(displayIds, DisplayManager::isRearDisplay);
+ } else if (category == null || DISPLAY_CATEGORY_ALL_INCLUDING_DISABLED.equals(category)) {
+ return getDisplays(displayIds, Objects::nonNull);
}
+ return (Display[]) EmptyArray.OBJECT;
}
- @GuardedBy("mLock")
- private void addAllDisplaysLocked(ArrayList<Display> displays, int[] displayIds) {
- for (int i = 0; i < displayIds.length; i++) {
- Display display = getOrCreateDisplayLocked(displayIds[i], true /*assumeValid*/);
- if (display != null) {
- displays.add(display);
+ private Display[] getDisplays(int[] displayIds, Predicate<Display> predicate) {
+ ArrayList<Display> tmpDisplays = new ArrayList<>();
+ for (int displayId : displayIds) {
+ Display display = getOrCreateDisplay(displayId, /*assumeValid=*/true);
+ if (predicate.test(display)) {
+ tmpDisplays.add(display);
}
}
+ return tmpDisplays.toArray(new Display[tmpDisplays.size()]);
}
- @GuardedBy("mLock")
- private void addDisplaysLocked(
- ArrayList<Display> displays, int[] displayIds, int matchType, int flagMask) {
- for (int displayId : displayIds) {
- if (displayId == DEFAULT_DISPLAY) {
- continue;
- }
-
- Display display = getOrCreateDisplayLocked(displayId, /* assumeValid= */ true);
- if (display != null
- && (display.getFlags() & flagMask) == flagMask
- && display.getType() == matchType) {
- displays.add(display);
- }
+ private static boolean isPresentationDisplay(@Nullable Display display) {
+ if (display == null || (display.getDisplayId() == DEFAULT_DISPLAY)
+ || (display.getFlags() & Display.FLAG_PRESENTATION) == 0) {
+ return false;
+ }
+ switch (display.getType()) {
+ case Display.TYPE_INTERNAL:
+ case Display.TYPE_EXTERNAL:
+ case Display.TYPE_WIFI:
+ case Display.TYPE_OVERLAY:
+ case Display.TYPE_VIRTUAL:
+ return true;
+ default:
+ return false;
}
}
- @GuardedBy("mLock")
- private Display getOrCreateDisplayLocked(int displayId, boolean assumeValid) {
- Display display = mDisplayCache.get(displayId);
- if (display == null) {
- // TODO: We cannot currently provide any override configurations for metrics on displays
- // other than the display the context is associated with.
- final Resources resources = mContext.getDisplayId() == displayId
- ? mContext.getResources() : null;
-
- display = mGlobal.getCompatibleDisplay(displayId, resources);
- if (display != null) {
- mDisplayCache.put(display);
+ private static boolean isRearDisplay(@Nullable Display display) {
+ return display != null && display.getDisplayId() != DEFAULT_DISPLAY
+ && display.getType() == Display.TYPE_INTERNAL
+ && (display.getFlags() & Display.FLAG_REAR) != 0;
+ }
+
+ private Display getOrCreateDisplay(int displayId, boolean assumeValid) {
+ Display display;
+ synchronized (mLock) {
+ display = mDisplayCache.get(displayId);
+ if (display == null) {
+ // TODO: We cannot currently provide any override configurations for metrics on
+ // displays other than the display the context is associated with.
+ final Resources resources = mContext.getDisplayId() == displayId
+ ? mContext.getResources() : null;
+
+ display = mGlobal.getCompatibleDisplay(displayId, resources);
+ if (display != null) {
+ mDisplayCache.put(display);
+ }
+ } else if (!assumeValid && !display.isValid()) {
+ display = null;
}
- } else if (!assumeValid && !display.isValid()) {
- display = null;
}
return display;
}