package org.ebookdroid.core; import org.ebookdroid.common.bitmaps.ByteBufferManager; import org.ebookdroid.common.bitmaps.GLBitmaps; import android.graphics.RectF; import java.util.ArrayList; import java.util.List; import java.util.Queue; public class EventChildLoaded extends AbstractEvent { private final Queue<EventChildLoaded> eventQueue; public Page page; public PageTree nodes; public PageTreeNode child; public EventChildLoaded(final Queue<EventChildLoaded> eventQueue) { this.eventQueue = eventQueue; } final void init(final AbstractViewController ctrl, final PageTreeNode child) { this.viewState = ViewState.get(ctrl); this.ctrl = ctrl; this.page = child.page; this.nodes = page.nodes; this.child = child; } final void release() { this.ctrl = null; this.viewState = null; this.child = null; this.nodes = null; this.page = null; this.bitmapsToRecycle.clear(); this.nodesToDecode.clear(); eventQueue.offer(this); } /** * {@inheritDoc} * * @see org.ebookdroid.core.AbstractEvent#process() */ @Override public final ViewState process() { try { if (ctrl == null || viewState.book == null) { return null; } final RectF bounds = viewState.getBounds(page); final PageTreeNode parent = child.parent; if (parent != null) { recycleParent(parent, bounds); } recycleChildren(); ctrl.pageUpdated(viewState, page); if (viewState.isPageVisible(page) && viewState.isNodeVisible(child, viewState.getBounds(page))) { ctrl.redrawView(viewState); } return viewState; } finally { release(); } } protected void recycleParent(final PageTreeNode parent, final RectF bounds) { final boolean hiddenByChildren = nodes.isHiddenByChildren(parent, viewState, bounds); // if (LCTX.isDebugEnabled()) { // LCTX.d("Node " + parent.fullId + " is: " + (hiddenByChildren ? "" : "not") + " hidden by children"); // } if (!viewState.isNodeVisible(parent, bounds) || hiddenByChildren) { final List<GLBitmaps> bitmapsToRecycle = new ArrayList<GLBitmaps>(); final boolean res = nodes.recycleParents(child, bitmapsToRecycle); ByteBufferManager.release(bitmapsToRecycle); if (res) { if (LCTX.isDebugEnabled()) { LCTX.d("Recycle parent nodes for: " + child.fullId + " " + bitmapsToRecycle.size()); } } } } protected void recycleChildren() { final boolean res = nodes.recycleChildren(child, bitmapsToRecycle); ByteBufferManager.release(bitmapsToRecycle); if (res) { if (LCTX.isDebugEnabled()) { LCTX.d("Recycle children nodes for: " + child.fullId + " " + bitmapsToRecycle.size()); } } } @Override public boolean process(final PageTree nodes) { return false; } @Override public boolean process(final PageTreeNode node) { return false; } }