FileDocCategorySizeDatePackage
PageRangeUtils.javaAPI DocAndroid 5.1 API9997Thu Mar 12 22:22:42 GMT 2015com.android.printspooler.util

PageRangeUtils

public final class PageRangeUtils extends Object
This class contains utility functions for working with page ranges.

Fields Summary
private static final android.print.PageRange[]
ALL_PAGES_RANGE
private static final Comparator
sComparator
Constructors Summary
private PageRangeUtils()


      
        /* do nothing - hide constructor */
    
Methods Summary
public static android.print.PageRangeasAbsoluteRange(android.print.PageRange pageRange, int pageCount)

        if (PageRange.ALL_PAGES.equals(pageRange)) {
            return new PageRange(0, pageCount - 1);
        }
        return pageRange;
    
public static android.print.PageRange[]computePrintedPages(android.print.PageRange[] requestedPages, android.print.PageRange[] writtenPages, int pageCount)

        // Adjust the print job pages based on what was requested and written.
        // The cases are ordered in the most expected to the least expected
        // with a special case first where the app does not know the page count
        // so we ask for all to be written.
        if (Arrays.equals(requestedPages, ALL_PAGES_RANGE)
                && pageCount == PrintDocumentInfo.PAGE_COUNT_UNKNOWN) {
            return ALL_PAGES_RANGE;
        } else if (Arrays.equals(writtenPages, requestedPages)) {
            // We got a document with exactly the pages we wanted. Hence,
            // the printer has to print all pages in the data.
            return ALL_PAGES_RANGE;
        } else if (Arrays.equals(writtenPages, ALL_PAGES_RANGE)) {
            // We requested specific pages but got all of them. Hence,
            // the printer has to print only the requested pages.
            return requestedPages;
        } else if (PageRangeUtils.contains(writtenPages, requestedPages, pageCount)) {
            // We requested specific pages and got more but not all pages.
            // Hence, we have to offset appropriately the printed pages to
            // be based off the start of the written ones instead of zero.
            // The written pages are always non-null and not empty.
            final int offset = -writtenPages[0].getStart();
            PageRangeUtils.offset(requestedPages, offset);
            return requestedPages;
        } else if (Arrays.equals(requestedPages, ALL_PAGES_RANGE)
                && isAllPages(writtenPages, pageCount)) {
            // We requested all pages via the special constant and got all
            // of them as an explicit enumeration. Hence, the printer has
            // to print only the requested pages.
            return ALL_PAGES_RANGE;
        }

        return null;
    
public static booleancontains(android.print.PageRange[] pageRanges, int pageIndex)
Gets whether page ranges contains a given page.

param
pageRanges The page ranges.
param
pageIndex The page for which to check.
return
Whether the page is within the ranges.

        final int rangeCount = pageRanges.length;
        for (int i = 0; i < rangeCount; i++) {
            PageRange pageRange = pageRanges[i];
            if (pageRange.contains(pageIndex)) {
                return true;
            }
        }
        return false;
    
public static booleancontains(android.print.PageRange[] ourRanges, android.print.PageRange[] otherRanges, int pageCount)
Checks whether one page range array contains another one.

param
ourRanges The container page ranges.
param
otherRanges The contained page ranges.
param
pageCount The total number of pages.
return
Whether the container page ranges contains the contained ones.

        if (ourRanges == null || otherRanges == null) {
            return false;
        }

        if (Arrays.equals(ourRanges, ALL_PAGES_RANGE)) {
            return true;
        }

        if (Arrays.equals(otherRanges, ALL_PAGES_RANGE)) {
            otherRanges[0] = new PageRange(0, pageCount - 1);
        }

        ourRanges = normalize(ourRanges);
        otherRanges = normalize(otherRanges);

        // Note that the code below relies on the ranges being normalized
        // which is they contain monotonically increasing non-intersecting
        // sub-ranges whose start is less that or equal to the end.
        int otherRangeIdx = 0;
        final int ourRangeCount = ourRanges.length;
        final int otherRangeCount = otherRanges.length;
        for (int ourRangeIdx = 0; ourRangeIdx < ourRangeCount; ourRangeIdx++) {
            PageRange ourRange = ourRanges[ourRangeIdx];
            for (; otherRangeIdx < otherRangeCount; otherRangeIdx++) {
                PageRange otherRange = otherRanges[otherRangeIdx];
                if (otherRange.getStart() > ourRange.getEnd()) {
                    break;
                }
                if (otherRange.getStart() < ourRange.getStart()
                        || otherRange.getEnd() > ourRange.getEnd()) {
                    return false;
                }
            }
        }
        return (otherRangeIdx >= otherRangeCount);
    
public static intgetNormalizedPageCount(android.print.PageRange[] pageRanges, int layoutPageCount)
Gets the number of pages in a normalized range array.

param
pageRanges Normalized page ranges.
param
layoutPageCount Page count after reported after layout pass.
return
The page count in the ranges.

        int pageCount = 0;
        if (pageRanges != null) {
            final int pageRangeCount = pageRanges.length;
            for (int i = 0; i < pageRangeCount; i++) {
                PageRange pageRange = pageRanges[i];
                if (PageRange.ALL_PAGES.equals(pageRange)) {
                    return layoutPageCount;
                }
                pageCount += pageRange.getSize();
            }
        }
        return pageCount;
    
public static booleanisAllPages(android.print.PageRange[] pageRanges, int pageCount)

        final int pageRangeCount = pageRanges.length;
        for (int i = 0; i < pageRangeCount; i++) {
            PageRange pageRange = pageRanges[i];
            if (isAllPages(pageRange, pageCount)) {
                return true;
            }
        }
        return false;
    
public static booleanisAllPages(android.print.PageRange pageRanges, int pageCount)

        return pageRanges.getStart() == 0 && pageRanges.getEnd() == pageCount - 1;
    
public static booleanisAllPages(android.print.PageRange[] pageRanges)

        final int pageRangeCount = pageRanges.length;
        for (int i = 0; i < pageRangeCount; i++) {
            PageRange pageRange = pageRanges[i];
            if (isAllPages(pageRange)) {
                return true;
            }
        }
        return false;
    
public static booleanisAllPages(android.print.PageRange pageRange)

        return PageRange.ALL_PAGES.equals(pageRange);
    
public static android.print.PageRange[]normalize(android.print.PageRange[] pageRanges)
Normalizes a page range, which is the resulting page ranges are non-overlapping with the start lesser than or equal to the end and ordered in an ascending order.

param
pageRanges The page ranges to normalize.
return
The normalized page ranges.

        if (pageRanges == null) {
            return null;
        }

        final int oldRangeCount = pageRanges.length;
        if (oldRangeCount <= 1) {
            return pageRanges;
        }

        Arrays.sort(pageRanges, sComparator);

        int newRangeCount = 1;
        for (int i = 0; i < oldRangeCount - 1; i++) {
            PageRange currentRange = pageRanges[i];
            PageRange nextRange = pageRanges[i + 1];
            if (currentRange.getEnd() + 1 >= nextRange.getStart()) {
                pageRanges[i] = null;
                pageRanges[i + 1] = new PageRange(currentRange.getStart(),
                        Math.max(currentRange.getEnd(), nextRange.getEnd()));
            } else {
                newRangeCount++;
            }
        }

        if (newRangeCount == oldRangeCount) {
            return pageRanges;
        }

        int normalRangeIndex = 0;
        PageRange[] normalRanges = new PageRange[newRangeCount];
        for (int i = 0; i < oldRangeCount; i++) {
            PageRange normalRange = pageRanges[i];
            if (normalRange != null) {
                normalRanges[normalRangeIndex] = normalRange;
                normalRangeIndex++;
            }
        }

        return normalRanges;
    
public static voidoffset(android.print.PageRange[] pageRanges, int offset)
Offsets a the start and end of page ranges with the given value.

param
pageRanges The page ranges to offset.
param
offset The offset value.

        if (offset == 0) {
            return;
        }
        final int pageRangeCount = pageRanges.length;
        for (int i = 0; i < pageRangeCount; i++) {
            final int start = pageRanges[i].getStart() + offset;
            final int end = pageRanges[i].getEnd() + offset;
            pageRanges[i] = new PageRange(start, end);
        }