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