Merge "Only preload selected pages" into oc-dev am: 314457a424
am: 1af7c0bdbe
Change-Id: Ia3ecca3507a8d3b2e18dee59f83af0c0804ab68c
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|||||||
Reference in New Issue
Block a user