OSDN Git Service

android-2.1_r1 snapshot
[android-x86/packages-apps-Gallery2.git] / src / com / cooliris / media / DisplayList.java
diff --git a/src/com/cooliris/media/DisplayList.java b/src/com/cooliris/media/DisplayList.java
new file mode 100644 (file)
index 0000000..c58de5c
--- /dev/null
@@ -0,0 +1,120 @@
+package com.cooliris.media;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+
+// CR: comment.
+public final class DisplayList {
+    private DirectLinkedList<DisplayItem> mAnimatables = new DirectLinkedList<DisplayItem>();
+    private HashMap<MediaItem, DisplayItem> mDisplayMap = new HashMap<MediaItem, DisplayItem>(1024);
+    private ArrayList<DisplayItem> mItems = new ArrayList<DisplayItem>(1024);
+
+    public DisplayItem get(MediaItem item) {
+        HashMap<MediaItem, DisplayItem> displayMap = mDisplayMap;
+        DisplayItem displayItem = displayMap.get(item);
+        if (displayItem == null) {
+            displayItem = new DisplayItem(item);
+            displayMap.put(item, displayItem);
+            mItems.add(displayItem);
+        }
+        return displayItem;
+    }
+
+    public void setPositionAndStackIndex(DisplayItem item, Vector3f position, int stackId, boolean performTransition) {
+        item.set(position, stackId, performTransition);
+        if (!performTransition) {
+            item.commit();
+        } else {
+            markIfDirty(item);
+        }
+    }
+
+    public void setHasFocus(DisplayItem item, boolean hasFocus, boolean pushDown) {
+        boolean currentHasFocus = item.getHasFocus();
+        if (currentHasFocus != hasFocus) {
+            item.setHasFocus(hasFocus, pushDown);
+            markIfDirty(item);
+        }
+    }
+
+    public ArrayList<DisplayItem> getAllDisplayItems() {
+        return mItems;
+    }
+
+    public void update(float timeElapsed) {
+        final DirectLinkedList<DisplayItem> animatables = mAnimatables;
+        synchronized (animatables) {
+            DirectLinkedList.Entry<DisplayItem> entry = animatables.getHead();
+            while (entry != null) {
+                DisplayItem item = entry.value;
+                item.update(timeElapsed);
+                if (!item.isAnimating()) {
+                    entry = animatables.remove(entry);
+                } else {
+                    entry = entry.next;
+                }
+            }
+        }
+    }
+
+    public int getNumAnimatables() {
+        return mAnimatables.size();
+    }
+
+    public void setAlive(DisplayItem item, boolean alive) {
+        item.mAlive = alive;
+        if (alive && item.isAnimating()) {
+            final DirectLinkedList.Entry<DisplayItem> entry = item.getAnimatablesEntry();
+            if (!entry.inserted) {
+                mAnimatables.add(entry);
+            }
+        }
+    }
+
+    public void commit(DisplayItem item) {
+        item.commit();
+        final DirectLinkedList<DisplayItem> animatables = mAnimatables;
+        synchronized (animatables) {
+            animatables.remove(item.getAnimatablesEntry());
+        }
+    }
+
+    public void addToAnimatables(DisplayItem item) {
+        final DirectLinkedList.Entry<DisplayItem> entry = item.getAnimatablesEntry();
+        if (!entry.inserted) {
+            final DirectLinkedList<DisplayItem> animatables = mAnimatables;
+            synchronized (animatables) {
+                animatables.add(entry);
+            }
+        }
+    }
+
+    private void markIfDirty(DisplayItem item) {
+        if (item.isAnimating()) {
+            addToAnimatables(item);
+        }
+    }
+
+    public void clear() {
+        mDisplayMap.clear();
+        synchronized (mItems) {
+            mItems.clear();
+        }
+    }
+
+    public void clearExcept(DisplayItem[] displayItems) {
+        HashMap<MediaItem, DisplayItem> displayMap = mDisplayMap;
+        displayMap.clear();
+        synchronized (mItems) {
+            mItems.clear();
+            int numItems = displayItems.length;
+            for (int i = 0; i < numItems; ++i) {
+                DisplayItem displayItem = displayItems[i];
+                if (displayItem != null) {
+                    displayMap.put(displayItem.mItemRef, displayItem);
+                    mItems.add(displayItem);
+                }
+            }
+        }
+    }
+}