14b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov/* 24b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Copyright (C) 2013 The Android Open Source Project 34b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 44b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Licensed under the Apache License, Version 2.0 (the "License"); 54b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * you may not use this file except in compliance with the License. 64b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * You may obtain a copy of the License at 74b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 84b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * http://www.apache.org/licenses/LICENSE-2.0 94b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Unless required by applicable law or agreed to in writing, software 114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * distributed under the License is distributed on an "AS IS" BASIS, 124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * See the License for the specific language governing permissions and 144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * limitations under the License. 154b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 174b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovpackage android.print; 184b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 19c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.IntRange; 20c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmannimport android.annotation.NonNull; 214b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.os.Parcel; 224b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovimport android.os.Parcelable; 234b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 244b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov/** 254b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Represents a range of pages. The start and end page indices of 26fd90651cfcc7e2b75254666fd6861038b72fb4acSvetoslav * the range are zero based and inclusive. 274b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 284b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganovpublic final class PageRange implements Parcelable { 294b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 304b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 314b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Constant for specifying all pages. 324b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 334b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public static final PageRange ALL_PAGES = new PageRange(0, Integer.MAX_VALUE); 344b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 354ef83c4647471aa5aefce463ed8abfe37da7fd00Philip P. Moltmann /** @hide */ 364ef83c4647471aa5aefce463ed8abfe37da7fd00Philip P. Moltmann public static final PageRange[] ALL_PAGES_ARRAY = new PageRange[]{PageRange.ALL_PAGES}; 374ef83c4647471aa5aefce463ed8abfe37da7fd00Philip P. Moltmann 384b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov private final int mStart; 394b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov private final int mEnd; 404b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 414b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 424b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Creates a new instance. 434b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 444b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * @param start The start page index (zero based and inclusive). 454b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * @param end The end page index (zero based and inclusive). 464b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 474d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * @throws IllegalArgumentException If start is less than zero or end 484d4c66dd38e940082e385b49a33f4022ab04c738Svetoslav Ganov * is less than zero or start greater than end. 494b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 50c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann public PageRange(@IntRange(from = 0) int start, @IntRange(from = 0) int end) { 514b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (start < 0) { 524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov throw new IllegalArgumentException("start cannot be less than zero."); 534b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 544b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (end < 0) { 554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov throw new IllegalArgumentException("end cannot be less than zero."); 564b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 574b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov if (start > end) { 584b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov throw new IllegalArgumentException("start must be lesser than end."); 594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 604b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov mStart = start; 614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov mEnd = end; 624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 64c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann private PageRange(@NonNull Parcel parcel) { 654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov this(parcel.readInt(), parcel.readInt()); 664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Gets the start page index (zero based and inclusive). 704b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * @return The start page index. 724b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 73c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann public @IntRange(from = 0) int getStart() { 744b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return mStart; 754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 764b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov /** 784b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * Gets the end page index (zero based and inclusive). 794b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * 804b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov * @return The end page index. 814b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov */ 82c43639c3067dda5df189fb3cbf14f256c17e677dPhilip P. Moltmann public @IntRange(from = 0) int getEnd() { 834b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return mEnd; 844b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 854b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 86525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov /** 87525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * Gets whether a page range contains a a given page. 88525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * 89525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * @param pageIndex The page index. 90525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * @return True if the page is within this range. 91525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * 92525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * @hide 93525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov */ 94525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov public boolean contains(int pageIndex) { 9515cbc8a03250eafdf947cd8ad4e77f34444d5ba4Svetoslav return (pageIndex >= mStart) && (pageIndex <= mEnd); 96525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov } 97525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov 98525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov /** 99525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * Get the size of this range which is the number of 100525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * pages it contains. 101525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * 102525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * @return The size of the range. 103525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * 104525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov * @hide 105525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov */ 106525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov public int getSize() { 107525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov return mEnd - mStart + 1; 108525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov } 109525a66b2bb5abf844aff2109bdc9ed819566beceSvet Ganov 1104b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 1114b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public int describeContents() { 1124b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return 0; 1134b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1144b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 1154b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 1164b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public void writeToParcel(Parcel parcel, int flags) { 1174b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov parcel.writeInt(mStart); 1184b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov parcel.writeInt(mEnd); 1194b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1204b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 1214b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 12285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov public int hashCode() { 12385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov final int prime = 31; 12485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov int result = 1; 12585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov result = prime * result + mEnd; 12685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov result = prime * result + mStart; 12785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return result; 12885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 12985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov 13085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov @Override 13185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov public boolean equals(Object obj) { 13285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (this == obj) { 13385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return true; 13485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 13585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (obj == null) { 13685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return false; 13785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 13885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (getClass() != obj.getClass()) { 13985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return false; 14085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 14185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov PageRange other = (PageRange) obj; 14285b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (mEnd != other.mEnd) { 14385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return false; 14485b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 14585b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (mStart != other.mStart) { 14685b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return false; 14785b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 14885b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov return true; 14985b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov } 15085b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov 15185b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov @Override 1524b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public String toString() { 15385b1f883056a1d74473fd9ce774948878f389ab6Svetoslav Ganov if (mStart == 0 && mEnd == Integer.MAX_VALUE) { 1544b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return "PageRange[<all pages>]"; 1554b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1564b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov StringBuilder builder = new StringBuilder(); 1574b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov builder.append("PageRange[") 1584b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov .append(mStart) 1594b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov .append(" - ") 1604b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov .append(mEnd) 1614b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov .append("]"); 1624b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return builder.toString(); 1634b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1644b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 1654b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public static final Parcelable.Creator<PageRange> CREATOR = 1664b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov new Creator<PageRange>() { 1674b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 1684b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public PageRange createFromParcel(Parcel parcel) { 1694b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return new PageRange(parcel); 1704b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1714b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov 1724b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov @Override 1734b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov public PageRange[] newArray(int size) { 1744b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov return new PageRange[size]; 1754b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov } 1764b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov }; 1774b9a4d16872bbb50712e007b419ac0b35ff1582dSvetoslav Ganov} 178