package org.ebookdroid.core; import org.ebookdroid.common.bitmaps.GLBitmaps; import org.ebookdroid.common.bitmaps.ByteBufferManager; import org.ebookdroid.ui.viewer.IViewController.InvalidateSizeReason; import android.graphics.RectF; import java.util.ArrayList; import java.util.List; import java.util.Queue; public class EventReset extends AbstractEvent { private final Queue<EventReset> eventQueue; protected PageTreeLevel level; protected InvalidateSizeReason reason; protected boolean clearPages; EventReset(final Queue<EventReset> eventQueue) { this.eventQueue = eventQueue; } void init(final AbstractViewController ctrl, final InvalidateSizeReason reason, final boolean clearPages) { this.viewState = ViewState.get(ctrl); this.ctrl = ctrl; this.level = PageTreeLevel.getLevel(viewState.zoom); this.reason = reason; this.clearPages = clearPages; } void release() { this.ctrl = null; this.viewState = null; this.level = null; this.reason = null; this.bitmapsToRecycle.clear(); this.nodesToDecode.clear(); eventQueue.offer(this); } /** * {@inheritDoc} * * @see org.ebookdroid.core.AbstractEvent#process() */ @Override public ViewState process() { try { if (clearPages) { final List<GLBitmaps> bitmapsToRecycle = new ArrayList<GLBitmaps>(); for (final Page page : ctrl.model.getPages()) { page.nodes.recycleAll(bitmapsToRecycle, true); } ByteBufferManager.release(bitmapsToRecycle); } if (reason != null) { ctrl.invalidatePageSizes(reason, null); ctrl.invalidateScroll(); viewState.update(); } return super.process(); } finally { release(); } } /** * {@inheritDoc} * * @see org.ebookdroid.core.IEvent#process(org.ebookdroid.core.ViewState, org.ebookdroid.core.PageTree) */ @Override public boolean process(final PageTree nodes) { return process(nodes, level); } /** * {@inheritDoc} * * @see org.ebookdroid.core.IEvent#process(org.ebookdroid.core.ViewState, org.ebookdroid.core.PageTreeNode) */ @Override public boolean process(final PageTreeNode node) { final RectF pageBounds = viewState.getBounds(node.page); if (!viewState.isNodeKeptInMemory(node, pageBounds)) { node.recycle(bitmapsToRecycle); return false; } if (!node.holder.hasBitmaps()) { node.decodePageTreeNode(nodesToDecode, viewState); } return true; } }