Print - platform  APIs

Related changes:
    Skia (inlcude PDF APIs): https://googleplex-android-review.googlesource.com/#/c/305814/
    Canvas to PDF: https://googleplex-android-review.googlesource.com/#/c/319367/
    Settings (initial version): https://googleplex-android-review.googlesource.com/#/c/306077/
    Build: https://googleplex-android-review.googlesource.com/#/c/292437/
    Sample print services: https://googleplex-android-review.googlesource.com/#/c/281785/

Change-Id: I104d12efd12577f05c7b9b2a5e5e49125c0f09da
diff --git a/core/java/android/print/PageRange.java b/core/java/android/print/PageRange.java
new file mode 100644
index 0000000..044a715
--- /dev/null
+++ b/core/java/android/print/PageRange.java
@@ -0,0 +1,119 @@
+/*
+ * Copyright (C) 2013 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.print;
+
+import android.os.Parcel;
+import android.os.Parcelable;
+
+/**
+ * Represents a range of pages. The start and end page indices of
+ * the range are zero based and are inclusive.
+ */
+public final class PageRange implements Parcelable {
+
+    /**
+     * Constant for specifying all pages.
+     */
+    public static final PageRange ALL_PAGES = new PageRange(0, Integer.MAX_VALUE);
+
+    private final int mStart;
+    private final int mEnd;
+
+    /**
+     * Creates a new instance.
+     *
+     * @param start The start page index (zero based and inclusive).
+     * @param end The end page index (zero based and inclusive).
+     *
+     * @throws IllegalArgumentException If start is less than zero.
+     * @throws IllegalArgumentException If end is less than zero.
+     * @throws IllegalArgumentException If start greater than end.
+     */
+    PageRange(int start, int end) {
+        if (start < 0) {
+            throw new IllegalArgumentException("start cannot be less than zero.");
+        }
+        if (end < 0) {
+            throw new IllegalArgumentException("end cannot be less than zero.");
+        }
+        if (start > end) {
+            throw new IllegalArgumentException("start must be lesser than end.");
+        }
+        mStart = start;
+        mEnd = end;
+    }
+
+    private PageRange (Parcel parcel) {
+        this(parcel.readInt(), parcel.readInt());
+    }
+
+    /**
+     * Gets the start page index (zero based and inclusive).
+     *
+     * @return The start page index.
+     */
+    public int getStart() {
+        return mStart;
+    }
+
+    /**
+     * Gets the end page index (zero based and inclusive).
+     *
+     * @return The end page index.
+     */
+    public int getEnd() {
+        return mEnd;
+    }
+
+    @Override
+    public int describeContents() {
+        return 0;
+    }
+
+    @Override
+    public void writeToParcel(Parcel parcel, int flags) {
+        parcel.writeInt(mStart);
+        parcel.writeInt(mEnd);
+    }
+
+    @Override
+    public String toString() {
+        if (this == ALL_PAGES) {
+            return "PageRange[<all pages>]";
+        }
+        StringBuilder builder = new StringBuilder();
+        builder.append("PageRange[")
+            .append(mStart)
+            .append(" - ")
+            .append(mEnd)
+            .append("]");
+        return builder.toString();
+    }
+
+    public static final Parcelable.Creator<PageRange> CREATOR =
+            new Creator<PageRange>() {
+        @Override
+        public PageRange createFromParcel(Parcel parcel) {
+            return new PageRange(parcel);
+        }
+
+        @Override
+        public PageRange[] newArray(int size) {
+            return new PageRange[size];
+        }
+    };
+}