Merge "Only preload selected pages" into oc-dev am: 314457a424

am: 1af7c0bdbe

Change-Id: Ia3ecca3507a8d3b2e18dee59f83af0c0804ab68c
This commit is contained in:
Philip P. Moltmann
2017-06-17 03:02:42 +00:00
committed by android-build-merger
2 changed files with 106 additions and 41 deletions

View File

@@ -16,6 +16,8 @@
package com.android.printspooler.model; package com.android.printspooler.model;
import android.annotation.NonNull;
import android.annotation.Nullable;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.content.ComponentName; import android.content.ComponentName;
import android.content.Context; import android.content.Context;
@@ -29,21 +31,27 @@ import android.os.AsyncTask;
import android.os.IBinder; import android.os.IBinder;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.os.RemoteException; import android.os.RemoteException;
import android.print.PageRange;
import android.print.PrintAttributes; import android.print.PrintAttributes;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.Margins;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintDocumentInfo; import android.print.PrintDocumentInfo;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.Log; import android.util.Log;
import android.view.View; import android.view.View;
import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.GuardedBy;
import com.android.printspooler.renderer.IPdfRenderer; import com.android.printspooler.renderer.IPdfRenderer;
import com.android.printspooler.renderer.PdfManipulationService; import com.android.printspooler.renderer.PdfManipulationService;
import com.android.printspooler.util.BitmapSerializeUtils; import com.android.printspooler.util.BitmapSerializeUtils;
import com.android.printspooler.util.PageRangeUtils;
import dalvik.system.CloseGuard; import dalvik.system.CloseGuard;
import libcore.io.IoUtils; import libcore.io.IoUtils;
import java.io.IOException; import java.io.IOException;
import java.util.Arrays;
import java.util.Iterator; import java.util.Iterator;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Map; import java.util.Map;
@@ -69,8 +77,9 @@ public final class PageContentRepository {
private RenderSpec mLastRenderSpec; private RenderSpec mLastRenderSpec;
private int mScheduledPreloadFirstShownPage = INVALID_PAGE_INDEX; @Nullable private PageRange mScheduledPreloadVisiblePages;
private int mScheduledPreloadLastShownPage = INVALID_PAGE_INDEX; @Nullable private PageRange[] mScheduledPreloadSelectedPages;
@Nullable private PageRange[] mScheduledPreloadWrittenPages;
private int mState; private int mState;
@@ -129,14 +138,24 @@ public final class PageContentRepository {
} }
} }
public void startPreload(int firstShownPage, int lastShownPage) { /**
* Preload selected, written pages around visiblePages.
*
* @param visiblePages The pages currently visible
* @param selectedPages The pages currently selected (e.g. they might become visible by
* scrolling)
* @param writtenPages The pages currently in the document
*/
public void startPreload(@NonNull PageRange visiblePages, @NonNull PageRange[] selectedPages,
@NonNull PageRange[] writtenPages) {
// If we do not have a render spec we have no clue what size the // If we do not have a render spec we have no clue what size the
// preloaded bitmaps should be, so just take a note for what to do. // preloaded bitmaps should be, so just take a note for what to do.
if (mLastRenderSpec == null) { if (mLastRenderSpec == null) {
mScheduledPreloadFirstShownPage = firstShownPage; mScheduledPreloadVisiblePages = visiblePages;
mScheduledPreloadLastShownPage = lastShownPage; mScheduledPreloadSelectedPages = selectedPages;
mScheduledPreloadWrittenPages = writtenPages;
} else if (mState == STATE_OPENED) { } else if (mState == STATE_OPENED) {
mRenderer.startPreload(firstShownPage, lastShownPage, mLastRenderSpec); mRenderer.startPreload(visiblePages, selectedPages, writtenPages, mLastRenderSpec);
} }
} }
@@ -225,11 +244,12 @@ public final class PageContentRepository {
// We tired to preload but didn't know the bitmap size, now // We tired to preload but didn't know the bitmap size, now
// that we know let us do the work. // that we know let us do the work.
if (mScheduledPreloadFirstShownPage != INVALID_PAGE_INDEX if (mScheduledPreloadVisiblePages != null) {
&& mScheduledPreloadLastShownPage != INVALID_PAGE_INDEX) { startPreload(mScheduledPreloadVisiblePages, mScheduledPreloadSelectedPages,
startPreload(mScheduledPreloadFirstShownPage, mScheduledPreloadLastShownPage); mScheduledPreloadWrittenPages);
mScheduledPreloadFirstShownPage = INVALID_PAGE_INDEX; mScheduledPreloadVisiblePages = null;
mScheduledPreloadLastShownPage = INVALID_PAGE_INDEX; mScheduledPreloadSelectedPages = null;
mScheduledPreloadWrittenPages = null;
} }
if (mState == STATE_OPENED) { if (mState == STATE_OPENED) {
@@ -526,10 +546,45 @@ public final class PageContentRepository {
mDestroyed = true; mDestroyed = true;
} }
public void startPreload(int firstShownPage, int lastShownPage, RenderSpec renderSpec) { /**
* How many pages are {@code pages} before pageNum. E.g. page 5 in [0-1], [4-7] has the
* index 4.
*
* @param pageNum The number of the page to find
* @param pages A normalized array of page ranges
*
* @return The index or {@link #INVALID_PAGE_INDEX} if not found
*/
private int findIndexOfPage(int pageNum, @NonNull PageRange[] pages) {
int pagesBefore = 0;
for (int i = 0; i < pages.length; i++) {
if (pages[i].contains(pageNum)) {
return pagesBefore + pageNum - pages[i].getStart();
} else {
pagesBefore += pages[i].getSize();
}
}
return INVALID_PAGE_INDEX;
}
void startPreload(@NonNull PageRange visiblePages, @NonNull PageRange[] selectedPages,
@NonNull PageRange[] writtenPages, RenderSpec renderSpec) {
if (PageRangeUtils.isAllPages(selectedPages)) {
selectedPages = new PageRange[]{new PageRange(0, mPageCount - 1)};
}
if (DEBUG) { if (DEBUG) {
Log.i(LOG_TAG, "Preloading pages around [" + firstShownPage Log.i(LOG_TAG, "Preloading pages around " + visiblePages + " from "
+ "-" + lastShownPage + "]"); + Arrays.toString(selectedPages));
}
int firstVisiblePageIndex = findIndexOfPage(visiblePages.getStart(), selectedPages);
int lastVisiblePageIndex = findIndexOfPage(visiblePages.getEnd(), selectedPages);
if (firstVisiblePageIndex == INVALID_PAGE_INDEX
|| lastVisiblePageIndex == INVALID_PAGE_INDEX) {
return;
} }
final int bitmapSizeInBytes = renderSpec.bitmapWidth * renderSpec.bitmapHeight final int bitmapSizeInBytes = renderSpec.bitmapWidth * renderSpec.bitmapHeight
@@ -537,28 +592,33 @@ public final class PageContentRepository {
final int maxCachedPageCount = mPageContentCache.getMaxSizeInBytes() final int maxCachedPageCount = mPageContentCache.getMaxSizeInBytes()
/ bitmapSizeInBytes; / bitmapSizeInBytes;
final int halfPreloadCount = (maxCachedPageCount final int halfPreloadCount = (maxCachedPageCount
- (lastShownPage - firstShownPage)) / 2 - 1; - (lastVisiblePageIndex - firstVisiblePageIndex)) / 2 - 1;
final int excessFromStart; final int fromIndex = Math.max(firstVisiblePageIndex - halfPreloadCount, 0);
if (firstShownPage - halfPreloadCount < 0) { final int toIndex = lastVisiblePageIndex + halfPreloadCount;
excessFromStart = halfPreloadCount - firstShownPage;
} else { if (DEBUG) {
excessFromStart = 0; Log.i(LOG_TAG, "fromIndex=" + fromIndex + " toIndex=" + toIndex);
} }
final int excessFromEnd; int previousRangeSizes = 0;
if (lastShownPage + halfPreloadCount >= mPageCount) { for (int rangeNum = 0; rangeNum < selectedPages.length; rangeNum++) {
excessFromEnd = (lastShownPage + halfPreloadCount) - mPageCount; PageRange range = selectedPages[rangeNum];
} else {
excessFromEnd = 0;
}
final int fromIndex = Math.max(firstShownPage - halfPreloadCount - excessFromEnd, 0); int thisRangeStart = Math.max(0, fromIndex - previousRangeSizes);
final int toIndex = Math.min(lastShownPage + halfPreloadCount + excessFromStart, int thisRangeEnd = Math.min(range.getSize(), toIndex - previousRangeSizes + 1);
mPageCount - 1);
for (int i = fromIndex; i <= toIndex; i++) { for (int i = thisRangeStart; i < thisRangeEnd; i++) {
renderPage(i, renderSpec, null); if (PageRangeUtils.contains(writtenPages, range.getStart() + i)) {
if (DEBUG) {
Log.i(LOG_TAG, "Preloading " + (range.getStart() + i));
}
renderPage(range.getStart() + i, renderSpec, null);
}
}
previousRangeSizes += range.getSize();
} }
} }

View File

@@ -16,6 +16,7 @@
package com.android.printspooler.ui; package com.android.printspooler.ui;
import android.annotation.NonNull;
import android.content.Context; import android.content.Context;
import android.graphics.Bitmap; import android.graphics.Bitmap;
import android.graphics.Canvas; import android.graphics.Canvas;
@@ -24,8 +25,8 @@ import android.os.Handler;
import android.os.Looper; import android.os.Looper;
import android.os.ParcelFileDescriptor; import android.os.ParcelFileDescriptor;
import android.print.PageRange; import android.print.PageRange;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintAttributes.Margins; import android.print.PrintAttributes.Margins;
import android.print.PrintAttributes.MediaSize;
import android.print.PrintDocumentInfo; import android.print.PrintDocumentInfo;
import android.support.v7.widget.RecyclerView.Adapter; import android.support.v7.widget.RecyclerView.Adapter;
import android.support.v7.widget.RecyclerView.ViewHolder; import android.support.v7.widget.RecyclerView.ViewHolder;
@@ -33,11 +34,12 @@ import android.util.Log;
import android.util.SparseArray; import android.util.SparseArray;
import android.view.LayoutInflater; import android.view.LayoutInflater;
import android.view.View; import android.view.View;
import android.view.View.MeasureSpec;
import android.view.View.OnClickListener; import android.view.View.OnClickListener;
import android.view.ViewGroup; import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams; import android.view.ViewGroup.LayoutParams;
import android.view.View.MeasureSpec;
import android.widget.TextView; import android.widget.TextView;
import com.android.printspooler.R; import com.android.printspooler.R;
import com.android.printspooler.model.OpenDocumentCallback; import com.android.printspooler.model.OpenDocumentCallback;
import com.android.printspooler.model.PageContentRepository; import com.android.printspooler.model.PageContentRepository;
@@ -45,6 +47,7 @@ import com.android.printspooler.model.PageContentRepository.PageContentProvider;
import com.android.printspooler.util.PageRangeUtils; import com.android.printspooler.util.PageRangeUtils;
import com.android.printspooler.widget.PageContentView; import com.android.printspooler.widget.PageContentView;
import com.android.printspooler.widget.PreviewPageFrame; import com.android.printspooler.widget.PreviewPageFrame;
import dalvik.system.CloseGuard; import dalvik.system.CloseGuard;
import java.util.ArrayList; import java.util.ArrayList;
@@ -797,14 +800,16 @@ public final class PageAdapter extends Adapter<ViewHolder> {
page.setTag(null); page.setTag(null);
} }
public void startPreloadContent(PageRange pageRangeInAdapter) { void startPreloadContent(@NonNull PageRange visiblePagesInAdapter) {
final int startPageInDocument = computePageIndexInDocument(pageRangeInAdapter.getStart()); int startVisibleDocument = computePageIndexInDocument(visiblePagesInAdapter.getStart());
final int startPageInFile = computePageIndexInFile(startPageInDocument); int endVisibleDocument = computePageIndexInDocument(visiblePagesInAdapter.getEnd());
final int endPageInDocument = computePageIndexInDocument(pageRangeInAdapter.getEnd()); if (startVisibleDocument == INVALID_PAGE_INDEX
final int endPageInFile = computePageIndexInFile(endPageInDocument); || endVisibleDocument == INVALID_PAGE_INDEX) {
if (startPageInDocument != INVALID_PAGE_INDEX && endPageInDocument != INVALID_PAGE_INDEX) { return;
mPageContentRepository.startPreload(startPageInFile, endPageInFile);
} }
mPageContentRepository.startPreload(new PageRange(startVisibleDocument, endVisibleDocument),
mSelectedPages, mWrittenPages);
} }
public void stopPreloadContent() { public void stopPreloadContent() {