Remove iterators (DO NOT MERGE)

Remove DisplayContentsIterator and AllWindowsIterator. These were cute
but they take up valuable resources. Iterate over ArrayList members
in their place.

Change-Id: Ie0c537608532cfb36f34d976cc6eacd21bad98cd
This commit is contained in:
Craig Mautner
2013-07-16 12:30:28 -07:00
parent c0f5bb70b7
commit 7c6be10d31
3 changed files with 207 additions and 251 deletions

View File

@@ -19,7 +19,6 @@ package com.android.server.wm;
import com.android.server.input.InputManagerService; import com.android.server.input.InputManagerService;
import com.android.server.input.InputApplicationHandle; import com.android.server.input.InputApplicationHandle;
import com.android.server.input.InputWindowHandle; import com.android.server.input.InputWindowHandle;
import com.android.server.wm.WindowManagerService.AllWindowsIterator;
import android.app.ActivityManagerNative; import android.app.ActivityManagerNative;
import android.graphics.Rect; import android.graphics.Rect;
@@ -31,7 +30,6 @@ import android.view.InputChannel;
import android.view.KeyEvent; import android.view.KeyEvent;
import android.view.WindowManager; import android.view.WindowManager;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
final class InputMonitor implements InputManagerService.WindowManagerCallbacks { final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
@@ -249,10 +247,12 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
} }
// Add all windows on the default display. // Add all windows on the default display.
final AllWindowsIterator iterator = mService.new AllWindowsIterator( final int numDisplays = mService.mDisplayContents.size();
WindowManagerService.REVERSE_ITERATOR); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
while (iterator.hasNext()) { final WindowList windows =
final WindowState child = iterator.next(); mService.mDisplayContents.valueAt(displayNdx).getWindowList();
for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
final WindowState child = windows.get(winNdx);
final InputChannel inputChannel = child.mInputChannel; final InputChannel inputChannel = child.mInputChannel;
final InputWindowHandle inputWindowHandle = child.mInputWindowHandle; final InputWindowHandle inputWindowHandle = child.mInputWindowHandle;
if (inputChannel == null || inputWindowHandle == null || child.mRemoved) { if (inputChannel == null || inputWindowHandle == null || child.mRemoved) {
@@ -290,6 +290,7 @@ final class InputMonitor implements InputManagerService.WindowManagerCallbacks {
isVisible, hasFocus, hasWallpaper); isVisible, hasFocus, hasWallpaper);
} }
} }
}
// Send windows to native code. // Send windows to native code.
mService.mInputManager.setInputWindows(mInputWindowHandles); mService.mInputManager.setInputWindows(mInputWindowHandles);

View File

@@ -26,7 +26,6 @@ import android.view.SurfaceControl;
import android.view.WindowManagerPolicy; import android.view.WindowManagerPolicy;
import android.view.animation.Animation; import android.view.animation.Animation;
import com.android.server.wm.WindowManagerService.DisplayContentsIterator;
import com.android.server.wm.WindowManagerService.LayoutFields; import com.android.server.wm.WindowManagerService.LayoutFields;
import java.io.PrintWriter; import java.io.PrintWriter;
@@ -627,9 +626,9 @@ public class WindowAnimator {
} }
boolean hasPendingLayoutChanges = false; boolean hasPendingLayoutChanges = false;
DisplayContentsIterator iterator = mService.new DisplayContentsIterator(); final int numDisplays = mService.mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final DisplayContent displayContent = iterator.next(); final DisplayContent displayContent = mService.mDisplayContents.valueAt(displayNdx);
final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId()); final int pendingChanges = getPendingLayoutChanges(displayContent.getDisplayId());
if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) { if ((pendingChanges & WindowManagerPolicy.FINISH_LAYOUT_REDO_WALLPAPER) != 0) {
mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING; mBulkUpdateParams |= SET_WALLPAPER_ACTION_PENDING;

View File

@@ -450,7 +450,7 @@ public class WindowManagerService extends IWindowManager.Stub
String mLastANRState; String mLastANRState;
/** All DisplayDontents in the world, kept here */ /** All DisplayDontents in the world, kept here */
private SparseArray<DisplayContent> mDisplayContents = new SparseArray<DisplayContent>(); SparseArray<DisplayContent> mDisplayContents = new SparseArray<DisplayContent>();
int mRotation = 0; int mRotation = 0;
int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED; int mForcedAppOrientation = ActivityInfo.SCREEN_ORIENTATION_UNSPECIFIED;
@@ -4426,12 +4426,15 @@ public class WindowManagerService extends IWindowManager.Stub
void dumpWindowsLocked() { void dumpWindowsLocked() {
int i = 0; int i = 0;
final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState w = iterator.next(); final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
for (int winNdx = windows.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windows.get(winNdx);
Slog.v(TAG, " #" + i++ + ": " + w); Slog.v(TAG, " #" + i++ + ": " + w);
} }
} }
}
private int findWindowOffsetLocked(WindowList windows, int tokenPos) { private int findWindowOffsetLocked(WindowList windows, int tokenPos) {
final int NW = windows.size(); final int NW = windows.size();
@@ -4574,9 +4577,9 @@ public class WindowManagerService extends IWindowManager.Stub
if (tmpRemoveAppWindowsLocked(wtoken)) { if (tmpRemoveAppWindowsLocked(wtoken)) {
if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:"); if (DEBUG_REORDER) Slog.v(TAG, "Adding windows back in:");
if (DEBUG_REORDER) dumpWindowsLocked(); if (DEBUG_REORDER) dumpWindowsLocked();
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while(iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final DisplayContent displayContent = iterator.next(); final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
final WindowList windows = displayContent.getWindowList(); final WindowList windows = displayContent.getWindowList();
final int pos = findWindowOffsetLocked(windows, index); final int pos = findWindowOffsetLocked(windows, index);
final int newPos = reAddAppWindowsLocked(displayContent, pos, wtoken); final int newPos = reAddAppWindowsLocked(displayContent, pos, wtoken);
@@ -4628,9 +4631,9 @@ public class WindowManagerService extends IWindowManager.Stub
} }
// And now add them back at the correct place. // And now add them back at the correct place.
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final DisplayContent displayContent = iterator.next(); final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
final WindowList windows = displayContent.getWindowList(); final WindowList windows = displayContent.getWindowList();
// Where to start adding? // Where to start adding?
int pos = findWindowOffsetLocked(windows, tokenPos); int pos = findWindowOffsetLocked(windows, tokenPos);
@@ -4846,9 +4849,12 @@ public class WindowManagerService extends IWindowManager.Stub
@Override @Override
public void closeSystemDialogs(String reason) { public void closeSystemDialogs(String reason) {
synchronized(mWindowMap) { synchronized(mWindowMap) {
final AllWindowsIterator iterator = new AllWindowsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState w = iterator.next(); final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState w = windows.get(winNdx);
if (w.mHasSurface) { if (w.mHasSurface) {
try { try {
w.mClient.closeSystemDialogs(reason); w.mClient.closeSystemDialogs(reason);
@@ -4858,6 +4864,7 @@ public class WindowManagerService extends IWindowManager.Stub
} }
} }
} }
}
static float fixScale(float scale) { static float fixScale(float scale) {
if (scale < 0) scale = 0; if (scale < 0) scale = 0;
@@ -4985,9 +4992,10 @@ public class WindowManagerService extends IWindowManager.Stub
mPolicy.setCurrentUserLw(newUserId); mPolicy.setCurrentUserLw(newUserId);
// Hide windows that should not be seen by the new user. // Hide windows that should not be seen by the new user.
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowList windows = iterator.next().getWindowList(); final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
final WindowList windows = displayContent.getWindowList();
for (int i = 0; i < windows.size(); i++) { for (int i = 0; i < windows.size(); i++) {
final WindowState win = windows.get(i); final WindowState win = windows.get(i);
if (win.isHiddenFromUserLocked()) { if (win.isHiddenFromUserLocked()) {
@@ -5243,14 +5251,18 @@ public class WindowManagerService extends IWindowManager.Stub
// the background..) // the background..)
if (on) { if (on) {
boolean isVisible = false; boolean isVisible = false;
final AllWindowsIterator iterator = new AllWindowsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState ws = iterator.next(); final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState ws = windows.get(winNdx);
if (ws.mSession.mPid == pid && ws.isVisibleLw()) { if (ws.mSession.mPid == pid && ws.isVisibleLw()) {
isVisible = true; isVisible = true;
break; break;
} }
} }
}
if (!isVisible) { if (!isVisible) {
return; return;
} }
@@ -5998,9 +6010,10 @@ public class WindowManagerService extends IWindowManager.Stub
WindowList windows = new WindowList(); WindowList windows = new WindowList();
synchronized (mWindowMap) { synchronized (mWindowMap) {
//noinspection unchecked //noinspection unchecked
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while(iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
windows.addAll(iterator.next().getWindowList()); final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
windows.addAll(displayContent.getWindowList());
} }
} }
@@ -6228,14 +6241,18 @@ public class WindowManagerService extends IWindowManager.Stub
} }
synchronized (mWindowMap) { synchronized (mWindowMap) {
final AllWindowsIterator iterator = new AllWindowsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState w = iterator.next(); final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState w = windows.get(winNdx);
if (System.identityHashCode(w) == hashCode) { if (System.identityHashCode(w) == hashCode) {
return w; return w;
} }
} }
} }
}
return null; return null;
} }
@@ -6780,15 +6797,19 @@ public class WindowManagerService extends IWindowManager.Stub
// TODO(multidisplay): Call isScreenOn for each display. // TODO(multidisplay): Call isScreenOn for each display.
private void sendScreenStatusToClientsLocked() { private void sendScreenStatusToClientsLocked() {
final boolean on = mPowerManager.isScreenOn(); final boolean on = mPowerManager.isScreenOn();
final AllWindowsIterator iterator = new AllWindowsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
try { try {
iterator.next().mClient.dispatchScreenState(on); windows.get(winNdx).mClient.dispatchScreenState(on);
} catch (RemoteException e) { } catch (RemoteException e) {
// Ignored // Ignored
} }
} }
} }
}
// ------------------------------------------------------------- // -------------------------------------------------------------
// Async Handler // Async Handler
@@ -7629,9 +7650,9 @@ public class WindowManagerService extends IWindowManager.Stub
} }
final void rebuildAppWindowListLocked() { final void rebuildAppWindowListLocked() {
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
rebuildAppWindowListLocked(iterator.next()); rebuildAppWindowListLocked(mDisplayContents.valueAt(displayNdx));
} }
} }
@@ -8594,9 +8615,9 @@ public class WindowManagerService extends IWindowManager.Stub
boolean focusDisplayed = false; boolean focusDisplayed = false;
boolean updateAllDrawn = false; boolean updateAllDrawn = false;
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final DisplayContent displayContent = iterator.next(); final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
WindowList windows = displayContent.getWindowList(); WindowList windows = displayContent.getWindowList();
DisplayInfo displayInfo = displayContent.getDisplayInfo(); DisplayInfo displayInfo = displayContent.getDisplayInfo();
final int displayId = displayContent.getDisplayId(); final int displayId = displayContent.getDisplayId();
@@ -9035,9 +9056,9 @@ public class WindowManagerService extends IWindowManager.Stub
defaultDisplay.layoutNeeded = true; defaultDisplay.layoutNeeded = true;
} }
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
DisplayContent displayContent = iterator.next(); final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
if (displayContent.pendingLayoutChanges != 0) { if (displayContent.pendingLayoutChanges != 0) {
displayContent.layoutNeeded = true; displayContent.layoutNeeded = true;
} }
@@ -9224,9 +9245,10 @@ public class WindowManagerService extends IWindowManager.Stub
} }
private boolean needsLayout() { private boolean needsLayout() {
DisplayContentsIterator iterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
if (iterator.next().layoutNeeded) { final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
if (displayContent.layoutNeeded) {
return true; return true;
} }
} }
@@ -9287,10 +9309,12 @@ public class WindowManagerService extends IWindowManager.Stub
// window list to make sure we haven't left any dangling surfaces // window list to make sure we haven't left any dangling surfaces
// around. // around.
AllWindowsIterator iterator = new AllWindowsIterator(); final int numDisplays = mDisplayContents.size();
Slog.i(TAG, "Out of memory for surface! Looking for leaks..."); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
while (iterator.hasNext()) { final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
WindowState ws = iterator.next(); final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState ws = windows.get(winNdx);
WindowStateAnimator wsa = ws.mWinAnimator; WindowStateAnimator wsa = ws.mWinAnimator;
if (wsa.mSurfaceControl != null) { if (wsa.mSurfaceControl != null) {
if (!mSessions.contains(wsa.mSession)) { if (!mSessions.contains(wsa.mSession)) {
@@ -9319,13 +9343,16 @@ public class WindowManagerService extends IWindowManager.Stub
} }
} }
} }
}
if (!leakedSurface) { if (!leakedSurface) {
Slog.w(TAG, "No leaked surfaces; killing applicatons!"); Slog.w(TAG, "No leaked surfaces; killing applicatons!");
SparseIntArray pidCandidates = new SparseIntArray(); SparseIntArray pidCandidates = new SparseIntArray();
iterator = new AllWindowsIterator(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
while (iterator.hasNext()) { final WindowList windows = mDisplayContents.valueAt(displayNdx).getWindowList();
WindowState ws = iterator.next(); final int numWindows = windows.size();
for (int winNdx = 0; winNdx < numWindows; ++winNdx) {
final WindowState ws = windows.get(winNdx);
if (mForceRemoves.contains(ws)) { if (mForceRemoves.contains(ws)) {
continue; continue;
} }
@@ -9347,6 +9374,7 @@ public class WindowManagerService extends IWindowManager.Stub
} }
} }
} }
}
if (leakedSurface || killedApps) { if (leakedSurface || killedApps) {
// We managed to reclaim some memory, so get rid of the trouble // We managed to reclaim some memory, so get rid of the trouble
@@ -9974,9 +10002,9 @@ public class WindowManagerService extends IWindowManager.Stub
void dumpDisplayContentsLocked(PrintWriter pw, boolean dumpAll) { void dumpDisplayContentsLocked(PrintWriter pw, boolean dumpAll) {
pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)"); pw.println("WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)");
if (mDisplayReady) { if (mDisplayReady) {
DisplayContentsIterator dCIterator = new DisplayContentsIterator(); final int numDisplays = mDisplayContents.size();
while (dCIterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
dCIterator.next().dump(" ", pw); mDisplayContents.valueAt(displayNdx).dump(" ", pw);
} }
} else { } else {
pw.println(" NO DISPLAY"); pw.println(" NO DISPLAY");
@@ -9992,15 +10020,18 @@ public class WindowManagerService extends IWindowManager.Stub
void dumpWindowsNoHeaderLocked(PrintWriter pw, boolean dumpAll, void dumpWindowsNoHeaderLocked(PrintWriter pw, boolean dumpAll,
ArrayList<WindowState> windows) { ArrayList<WindowState> windows) {
int j = 0; int j = 0;
final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState w = iterator.next(); final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList();
for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windowList.get(winNdx);
if (windows == null || windows.contains(w)) { if (windows == null || windows.contains(w)) {
pw.print(" Window #"); pw.print(j++); pw.print(' '); pw.print(" Window #"); pw.print(j++); pw.print(' ');
pw.print(w); pw.println(":"); pw.print(w); pw.println(":");
w.dump(pw, " ", dumpAll || windows != null); w.dump(pw, " ", dumpAll || windows != null);
} }
} }
}
if (mInputMethodDialogs.size() > 0) { if (mInputMethodDialogs.size() > 0) {
pw.println(); pw.println();
pw.println(" Input method dialogs:"); pw.println(" Input method dialogs:");
@@ -10151,9 +10182,8 @@ public class WindowManagerService extends IWindowManager.Stub
pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled); pw.print(" mDisplayEnabled="); pw.println(mDisplayEnabled);
if (needsLayout()) { if (needsLayout()) {
pw.print(" layoutNeeded on displays="); pw.print(" layoutNeeded on displays=");
DisplayContentsIterator dcIterator = new DisplayContentsIterator(); for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
while (dcIterator.hasNext()) { final DisplayContent displayContent = mDisplayContents.valueAt(displayNdx);
final DisplayContent displayContent = dcIterator.next();
if (displayContent.layoutNeeded) { if (displayContent.layoutNeeded) {
pw.print(displayContent.getDisplayId()); pw.print(displayContent.getDisplayId());
} }
@@ -10187,14 +10217,18 @@ public class WindowManagerService extends IWindowManager.Stub
WindowList windows = new WindowList(); WindowList windows = new WindowList();
if ("visible".equals(name)) { if ("visible".equals(name)) {
synchronized(mWindowMap) { synchronized(mWindowMap) {
final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState w = iterator.next(); final WindowList windowList =
mDisplayContents.valueAt(displayNdx).getWindowList();
for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windowList.get(winNdx);
if (w.mWinAnimator.mSurfaceShown) { if (w.mWinAnimator.mSurfaceShown) {
windows.add(w); windows.add(w);
} }
} }
} }
}
} else { } else {
int objectId = 0; int objectId = 0;
// See if this is an object ID. // See if this is an object ID.
@@ -10204,9 +10238,11 @@ public class WindowManagerService extends IWindowManager.Stub
} catch (RuntimeException e) { } catch (RuntimeException e) {
} }
synchronized(mWindowMap) { synchronized(mWindowMap) {
final AllWindowsIterator iterator = new AllWindowsIterator(REVERSE_ITERATOR); final int numDisplays = mDisplayContents.size();
while (iterator.hasNext()) { for (int displayNdx = 0; displayNdx < numDisplays; ++displayNdx) {
final WindowState w = iterator.next(); final WindowList windowList = mDisplayContents.valueAt(displayNdx).getWindowList();
for (int winNdx = windowList.size() - 1; winNdx >= 0; --winNdx) {
final WindowState w = windowList.get(winNdx);
if (name != null) { if (name != null) {
if (w.mAttrs.getTitle().toString().contains(name)) { if (w.mAttrs.getTitle().toString().contains(name)) {
windows.add(w); windows.add(w);
@@ -10217,6 +10253,7 @@ public class WindowManagerService extends IWindowManager.Stub
} }
} }
} }
}
if (windows.size() <= 0) { if (windows.size() <= 0) {
return false; return false;
@@ -10456,87 +10493,6 @@ public class WindowManagerService extends IWindowManager.Stub
return displayContent; return displayContent;
} }
class DisplayContentsIterator implements Iterator<DisplayContent> {
private int cur;
@Override
public boolean hasNext() {
return cur < mDisplayContents.size();
}
@Override
public DisplayContent next() {
if (hasNext()) {
return mDisplayContents.valueAt(cur++);
}
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new IllegalArgumentException("AllDisplayContentIterator.remove not implemented");
}
}
final static boolean REVERSE_ITERATOR = true;
class AllWindowsIterator implements Iterator<WindowState> {
private DisplayContent mDisplayContent;
private DisplayContentsIterator mDisplayContentsIterator;
private WindowList mWindowList;
private int mWindowListIndex;
private boolean mReverse;
AllWindowsIterator() {
mDisplayContentsIterator = new DisplayContentsIterator();
mDisplayContent = mDisplayContentsIterator.next();
mWindowList = mDisplayContent.getWindowList();
}
AllWindowsIterator(boolean reverse) {
this();
mReverse = reverse;
mWindowListIndex = reverse ? mWindowList.size() - 1 : 0;
}
@Override
public boolean hasNext() {
if (mReverse) {
return mWindowListIndex >= 0;
}
return mWindowListIndex < mWindowList.size();
}
@Override
public WindowState next() {
if (hasNext()) {
WindowState win = mWindowList.get(mWindowListIndex);
if (mReverse) {
mWindowListIndex--;
if (mWindowListIndex < 0 && mDisplayContentsIterator.hasNext()) {
mDisplayContent = mDisplayContentsIterator.next();
mWindowList = mDisplayContent.getWindowList();
mWindowListIndex = mWindowList.size() - 1;
}
} else {
mWindowListIndex++;
if (mWindowListIndex >= mWindowList.size()
&& mDisplayContentsIterator.hasNext()) {
mDisplayContent = mDisplayContentsIterator.next();
mWindowList = mDisplayContent.getWindowList();
mWindowListIndex = 0;
}
}
return win;
}
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new IllegalArgumentException("AllWindowsIterator.remove not implemented");
}
}
// There is an inherent assumption that this will never return null. // There is an inherent assumption that this will never return null.
public DisplayContent getDefaultDisplayContentLocked() { public DisplayContent getDefaultDisplayContentLocked() {
return getDisplayContentLocked(Display.DEFAULT_DISPLAY); return getDisplayContentLocked(Display.DEFAULT_DISPLAY);