Print API updated.
1. Removed the updatePrinters API on PrinterDiscoverySession. Now re-adding a printer updates it. 2. Added getTrackedPrinters() API to allow a print service to figure out which printers' state should be tracked by the service. 3. Removed the APIs on PrintDocumentInfo that describe the layout of the content as they are not needed. For example, if the print attributes passed in layout require landscape mode, the the app should just create a PDF page with the wider side up and draw its content in portrait. The printer will then rotate the page. Change-Id: Idd72c6e9c129e8b17eef1236573a99773f8ff0a2
This commit is contained in:
138
api/current.txt
138
api/current.txt
@@ -19040,39 +19040,21 @@ package android.print {
|
||||
method public void clear();
|
||||
method public int describeContents();
|
||||
method public int getColorMode();
|
||||
method public int getDuplexMode();
|
||||
method public int getFittingMode();
|
||||
method public android.print.PrintAttributes.Tray getInputTray();
|
||||
method public android.print.PrintAttributes.Margins getMargins();
|
||||
method public android.print.PrintAttributes.MediaSize getMediaSize();
|
||||
method public int getOrientation();
|
||||
method public android.print.PrintAttributes.Tray getOutputTray();
|
||||
method public android.print.PrintAttributes.Resolution getResolution();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field public static final int COLOR_MODE_COLOR = 2; // 0x2
|
||||
field public static final int COLOR_MODE_MONOCHROME = 1; // 0x1
|
||||
field public static final android.os.Parcelable.Creator CREATOR;
|
||||
field public static final int DUPLEX_MODE_LONG_EDGE = 2; // 0x2
|
||||
field public static final int DUPLEX_MODE_NONE = 1; // 0x1
|
||||
field public static final int DUPLEX_MODE_SHORT_EDGE = 4; // 0x4
|
||||
field public static final int FITTING_MODE_NONE = 1; // 0x1
|
||||
field public static final int FITTING_MODE_SCALE_TO_FILL = 4; // 0x4
|
||||
field public static final int FITTING_MODE_SCALE_TO_FIT = 2; // 0x2
|
||||
field public static final int ORIENTATION_LANDSCAPE = 2; // 0x2
|
||||
field public static final int ORIENTATION_PORTRAIT = 1; // 0x1
|
||||
}
|
||||
|
||||
public static final class PrintAttributes.Builder {
|
||||
ctor public PrintAttributes.Builder();
|
||||
method public android.print.PrintAttributes create();
|
||||
method public android.print.PrintAttributes.Builder setColorMode(int);
|
||||
method public android.print.PrintAttributes.Builder setDuplexMode(int);
|
||||
method public android.print.PrintAttributes.Builder setFittingMode(int);
|
||||
method public android.print.PrintAttributes.Builder setInputTray(android.print.PrintAttributes.Tray);
|
||||
method public android.print.PrintAttributes.Builder setMargins(android.print.PrintAttributes.Margins);
|
||||
method public android.print.PrintAttributes.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
|
||||
method public android.print.PrintAttributes.Builder setOrientation(int);
|
||||
method public android.print.PrintAttributes.Builder setOutputTray(android.print.PrintAttributes.Tray);
|
||||
method public android.print.PrintAttributes.Builder setResolution(android.print.PrintAttributes.Resolution);
|
||||
}
|
||||
|
||||
@@ -19086,67 +19068,65 @@ package android.print {
|
||||
}
|
||||
|
||||
public static final class PrintAttributes.MediaSize {
|
||||
ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int, int);
|
||||
ctor public PrintAttributes.MediaSize(java.lang.String, java.lang.String, int, int);
|
||||
method public static android.print.PrintAttributes.MediaSize createMediaSize(android.content.pm.PackageManager, int);
|
||||
method public android.print.PrintAttributes.MediaSize asLandscape();
|
||||
method public android.print.PrintAttributes.MediaSize asPortrait();
|
||||
method public int getHeightMils();
|
||||
method public java.lang.String getId();
|
||||
method public java.lang.String getLabel();
|
||||
method public java.lang.String getLabel(android.content.pm.PackageManager);
|
||||
method public int getWidthMils();
|
||||
field public static final int ISO_A0 = 1; // 0x1
|
||||
field public static final int ISO_A1 = 2; // 0x2
|
||||
field public static final int ISO_A10 = 11; // 0xb
|
||||
field public static final int ISO_A2 = 3; // 0x3
|
||||
field public static final int ISO_A3 = 4; // 0x4
|
||||
field public static final int ISO_A4 = 5; // 0x5
|
||||
field public static final int ISO_A5 = 6; // 0x6
|
||||
field public static final int ISO_A6 = 7; // 0x7
|
||||
field public static final int ISO_A7 = 8; // 0x8
|
||||
field public static final int ISO_A8 = 9; // 0x9
|
||||
field public static final int ISO_A9 = 10; // 0xa
|
||||
field public static final int ISO_B0 = 100; // 0x64
|
||||
field public static final int ISO_B1 = 101; // 0x65
|
||||
field public static final int ISO_B10 = 110; // 0x6e
|
||||
field public static final int ISO_B2 = 102; // 0x66
|
||||
field public static final int ISO_B3 = 103; // 0x67
|
||||
field public static final int ISO_B4 = 104; // 0x68
|
||||
field public static final int ISO_B5 = 105; // 0x69
|
||||
field public static final int ISO_B6 = 106; // 0x6a
|
||||
field public static final int ISO_B7 = 107; // 0x6b
|
||||
field public static final int ISO_B8 = 108; // 0x6c
|
||||
field public static final int ISO_B9 = 109; // 0x6d
|
||||
field public static final int ISO_C0 = 200; // 0xc8
|
||||
field public static final int ISO_C1 = 201; // 0xc9
|
||||
field public static final int ISO_C10 = 210; // 0xd2
|
||||
field public static final int ISO_C2 = 202; // 0xca
|
||||
field public static final int ISO_C3 = 203; // 0xcb
|
||||
field public static final int ISO_C4 = 204; // 0xcc
|
||||
field public static final int ISO_C5 = 205; // 0xcd
|
||||
field public static final int ISO_C6 = 206; // 0xce
|
||||
field public static final int ISO_C7 = 207; // 0xcf
|
||||
field public static final int ISO_C8 = 208; // 0xd0
|
||||
field public static final int ISO_C9 = 209; // 0xd1
|
||||
field public static final int NA_GOVT_LETTER = 301; // 0x12d
|
||||
field public static final int NA_JUNIOR_LEGAL = 303; // 0x12f
|
||||
field public static final int NA_LEDGER = 304; // 0x130
|
||||
field public static final int NA_LEGAL = 302; // 0x12e
|
||||
field public static final int NA_LETTER = 300; // 0x12c
|
||||
field public static final int NA_TBLOID = 305; // 0x131
|
||||
method public boolean isPortrait();
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A0;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A1;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A10;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A2;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A3;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A4;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A5;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A6;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A7;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A8;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_A9;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B0;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B1;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B10;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B2;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B3;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B4;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B5;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B6;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B7;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B8;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_B9;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C0;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C1;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C10;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C2;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C3;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C4;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C5;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C6;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C7;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C8;
|
||||
field public static final android.print.PrintAttributes.MediaSize ISO_C9;
|
||||
field public static final android.print.PrintAttributes.MediaSize NA_GOVT_LETTER;
|
||||
field public static final android.print.PrintAttributes.MediaSize NA_JUNIOR_LEGAL;
|
||||
field public static final android.print.PrintAttributes.MediaSize NA_LEDGER;
|
||||
field public static final android.print.PrintAttributes.MediaSize NA_LEGAL;
|
||||
field public static final android.print.PrintAttributes.MediaSize NA_LETTER;
|
||||
field public static final android.print.PrintAttributes.MediaSize NA_TBLOID;
|
||||
}
|
||||
|
||||
public static final class PrintAttributes.Resolution {
|
||||
ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int, int);
|
||||
ctor public PrintAttributes.Resolution(java.lang.String, java.lang.String, int, int);
|
||||
method public int getHorizontalDpi();
|
||||
method public java.lang.String getId();
|
||||
method public java.lang.String getLabel();
|
||||
method public java.lang.String getLabel(android.content.pm.PackageManager);
|
||||
method public int getVerticalDpi();
|
||||
}
|
||||
|
||||
public static final class PrintAttributes.Tray {
|
||||
ctor public PrintAttributes.Tray(java.lang.String, java.lang.String);
|
||||
method public java.lang.String getId();
|
||||
method public java.lang.String getLabel();
|
||||
}
|
||||
|
||||
public abstract class PrintDocumentAdapter {
|
||||
ctor public PrintDocumentAdapter();
|
||||
method public void onFinish();
|
||||
@@ -19170,34 +19150,22 @@ package android.print {
|
||||
|
||||
public final class PrintDocumentInfo implements android.os.Parcelable {
|
||||
method public int describeContents();
|
||||
method public int getColorMode();
|
||||
method public int getContentType();
|
||||
method public long getDataSize();
|
||||
method public int getFittingMode();
|
||||
method public android.print.PrintAttributes.Margins getMargins();
|
||||
method public android.print.PrintAttributes.MediaSize getMediaSize();
|
||||
method public java.lang.String getName();
|
||||
method public int getOrientation();
|
||||
method public int getPageCount();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field public static final int CONTENT_TYPE_DOCUMENT = 0; // 0x0
|
||||
field public static final int CONTENT_TYPE_PHOTO = 1; // 0x1
|
||||
field public static final int CONTENT_TYPE_UNKNOWN = -1; // 0xffffffff
|
||||
field public static final android.os.Parcelable.Creator CREATOR;
|
||||
field public static final android.print.PrintAttributes.MediaSize MEDIA_SIZE_UNKNOWN;
|
||||
field public static final int PAGE_COUNT_UNKNOWN = -1; // 0xffffffff
|
||||
}
|
||||
|
||||
public static final class PrintDocumentInfo.Builder {
|
||||
ctor public PrintDocumentInfo.Builder(java.lang.String, android.print.PrintAttributes);
|
||||
ctor public PrintDocumentInfo.Builder(java.lang.String);
|
||||
method public android.print.PrintDocumentInfo create();
|
||||
method public android.print.PrintDocumentInfo.Builder setColorMode(int);
|
||||
method public android.print.PrintDocumentInfo.Builder setContentType(int);
|
||||
method public android.print.PrintDocumentInfo.Builder setFittingMode(int);
|
||||
method public android.print.PrintDocumentInfo.Builder setMargins(android.print.PrintAttributes.Margins);
|
||||
method public android.print.PrintDocumentInfo.Builder setMediaSize(android.print.PrintAttributes.MediaSize);
|
||||
method public android.print.PrintDocumentInfo.Builder setOrientation(int);
|
||||
method public android.print.PrintDocumentInfo.Builder setPageCount(int);
|
||||
}
|
||||
|
||||
@@ -19244,13 +19212,8 @@ package android.print {
|
||||
method public int describeContents();
|
||||
method public int getColorModes();
|
||||
method public void getDefaults(android.print.PrintAttributes);
|
||||
method public int getDuplexModes();
|
||||
method public int getFittingModes();
|
||||
method public java.util.List<android.print.PrintAttributes.Tray> getInputTrays();
|
||||
method public java.util.List<android.print.PrintAttributes.MediaSize> getMediaSizes();
|
||||
method public android.print.PrintAttributes.Margins getMinMargins();
|
||||
method public int getOrientations();
|
||||
method public java.util.List<android.print.PrintAttributes.Tray> getOutputTrays();
|
||||
method public java.util.List<android.print.PrintAttributes.Resolution> getResolutions();
|
||||
method public void writeToParcel(android.os.Parcel, int);
|
||||
field public static final android.os.Parcelable.Creator CREATOR;
|
||||
@@ -19258,16 +19221,11 @@ package android.print {
|
||||
|
||||
public static final class PrinterCapabilitiesInfo.Builder {
|
||||
ctor public PrinterCapabilitiesInfo.Builder(android.print.PrinterId);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder addInputTray(android.print.PrintAttributes.Tray, boolean);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder addMediaSize(android.print.PrintAttributes.MediaSize, boolean);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder addOutputTray(android.print.PrintAttributes.Tray, boolean);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder addResolution(android.print.PrintAttributes.Resolution, boolean);
|
||||
method public android.print.PrinterCapabilitiesInfo create();
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder setColorModes(int, int);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder setDuplexModes(int, int);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder setFittingModes(int, int);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder setMinMargins(android.print.PrintAttributes.Margins, android.print.PrintAttributes.Margins);
|
||||
method public android.print.PrinterCapabilitiesInfo.Builder setOrientations(int, int);
|
||||
}
|
||||
|
||||
public final class PrinterId implements android.os.Parcelable {
|
||||
@@ -19388,6 +19346,7 @@ package android.printservice {
|
||||
ctor public PrinterDiscoverySession();
|
||||
method public final void addPrinters(java.util.List<android.print.PrinterInfo>);
|
||||
method public final java.util.List<android.print.PrinterInfo> getPrinters();
|
||||
method public final java.util.List<android.print.PrinterId> getTrackedPrinters();
|
||||
method public final boolean isDestroyed();
|
||||
method public final boolean isPrinterDiscoveryStarted();
|
||||
method public abstract void onDestroy();
|
||||
@@ -19397,7 +19356,6 @@ package android.printservice {
|
||||
method public abstract void onStopPrinterStateTracking(android.print.PrinterId);
|
||||
method public abstract void onValidatePrinters(java.util.List<android.print.PrinterId>);
|
||||
method public final void removePrinters(java.util.List<android.print.PrinterId>);
|
||||
method public final void updatePrinters(java.util.List<android.print.PrinterInfo>);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -21279,6 +21237,7 @@ package android.provider {
|
||||
field public static final java.lang.String ACTION_NFCSHARING_SETTINGS = "android.settings.NFCSHARING_SETTINGS";
|
||||
field public static final java.lang.String ACTION_NFC_PAYMENT_SETTINGS = "android.settings.NFC_PAYMENT_SETTINGS";
|
||||
field public static final java.lang.String ACTION_NFC_SETTINGS = "android.settings.NFC_SETTINGS";
|
||||
field public static final java.lang.String ACTION_PRINT_SETTINGS = "android.settings.ACTION_PRINT_SETTINGS";
|
||||
field public static final java.lang.String ACTION_PRIVACY_SETTINGS = "android.settings.PRIVACY_SETTINGS";
|
||||
field public static final java.lang.String ACTION_QUICK_LAUNCH_SETTINGS = "android.settings.QUICK_LAUNCH_SETTINGS";
|
||||
field public static final java.lang.String ACTION_SEARCH_SETTINGS = "android.search.action.SEARCH_SETTINGS";
|
||||
@@ -27162,6 +27121,7 @@ package android.view {
|
||||
|
||||
public class ScaleGestureDetector {
|
||||
ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener);
|
||||
ctor public ScaleGestureDetector(android.content.Context, android.view.ScaleGestureDetector.OnScaleGestureListener, android.os.Handler);
|
||||
method public float getCurrentSpan();
|
||||
method public float getCurrentSpanX();
|
||||
method public float getCurrentSpanY();
|
||||
|
||||
@@ -28,5 +28,4 @@ import android.print.PrinterInfo;
|
||||
oneway interface IPrinterDiscoveryObserver {
|
||||
void onPrintersAdded(in List<PrinterInfo> printers);
|
||||
void onPrintersRemoved(in List<PrinterId> printerIds);
|
||||
void onPrintersUpdated(in List<PrinterInfo> printerIds);
|
||||
}
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -101,28 +101,6 @@ public abstract class PrintDocumentAdapter {
|
||||
* LayoutResultCallback#onLayoutFailed(CharSequence)}, if an error occurred.
|
||||
* </p>
|
||||
* <p>
|
||||
* When doing a layout you may satisfy some of the constraints in the print
|
||||
* attributes such as applying the appropriate fitting, emitting content in the
|
||||
* requested orientation, using the specified margins, generating content with
|
||||
* the desired color mode, producing output with the given media size. Ideally,
|
||||
* you will satisfy all of these constraints. It is important that if you
|
||||
* satisfy a given constraint, you update the {@link PrintDocumentInfo} that
|
||||
* is returned in the given {@link LayoutResultCallback}. This way the printer
|
||||
* will have more accurate information about the content, thus producing a
|
||||
* better output. For example, assume that your application is printing
|
||||
* an image and the print attributes request landscape and fitting mode scale
|
||||
* to fill. The result of this operation should be the entire media is filled
|
||||
* and the content is rotated ninety degrees. In this case it is beneficial
|
||||
* you do the rotation and select a higher resolution image to utilize
|
||||
* the wider media (the height is now the width), rather to use a lower
|
||||
* resolution image that is later stretched by the printer. If you applied
|
||||
* the rotation you have to update the returned print document info to
|
||||
* reflect that the content is already in landscape by calling
|
||||
* {@link PrintDocumentInfo.Builder#setOrientation(int)} with {@link
|
||||
* PrintAttributes#ORIENTATION_LANDSCAPE}. In this case the printer does not
|
||||
* have to rotate the content.
|
||||
* </p>
|
||||
* <p>
|
||||
* <strong>Note:</strong> If the content is large and a layout will be
|
||||
* performed, it is a good practice to schedule the work on a dedicated
|
||||
* thread and register an observer in the provided {@link
|
||||
|
||||
@@ -18,8 +18,6 @@ package android.print;
|
||||
|
||||
import android.os.Parcel;
|
||||
import android.os.Parcelable;
|
||||
import android.print.PrintAttributes.Margins;
|
||||
import android.print.PrintAttributes.MediaSize;
|
||||
import android.text.TextUtils;
|
||||
|
||||
/**
|
||||
@@ -27,11 +25,6 @@ import android.text.TextUtils;
|
||||
*/
|
||||
public final class PrintDocumentInfo implements Parcelable {
|
||||
|
||||
/**
|
||||
* Constant for an unknown media size.
|
||||
*/
|
||||
public static final MediaSize MEDIA_SIZE_UNKNOWN = new MediaSize("Unknown", "Unknown", 1, 1);
|
||||
|
||||
/**
|
||||
* Constant for unknown page count..
|
||||
*/
|
||||
@@ -55,11 +48,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
private String mName;
|
||||
private int mPageCount;
|
||||
private int mContentType;
|
||||
private int mOrientation;
|
||||
private int mFittingMode;
|
||||
private int mColorMode;
|
||||
private Margins mMargins;
|
||||
private MediaSize mMediaSize;
|
||||
private long mDataSize;
|
||||
|
||||
/**
|
||||
@@ -78,11 +66,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
mName = prototype.mName;
|
||||
mPageCount = prototype.mPageCount;
|
||||
mContentType = prototype.mContentType;
|
||||
mOrientation = prototype.mOrientation;
|
||||
mFittingMode = prototype.mFittingMode;
|
||||
mColorMode = prototype.mColorMode;
|
||||
mMargins = prototype.mMargins;
|
||||
mMediaSize = prototype.mMediaSize;
|
||||
mDataSize = prototype.mDataSize;
|
||||
}
|
||||
|
||||
@@ -95,11 +78,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
mName = parcel.readString();
|
||||
mPageCount = parcel.readInt();
|
||||
mContentType = parcel.readInt();
|
||||
mOrientation = parcel.readInt();
|
||||
mFittingMode = parcel.readInt();
|
||||
mColorMode = parcel.readInt();
|
||||
mMargins = Margins.createFromParcel(parcel);
|
||||
mMediaSize = MediaSize.createFromParcel(parcel);
|
||||
mDataSize = parcel.readLong();
|
||||
}
|
||||
|
||||
@@ -136,61 +114,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
return mContentType;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the document orientation.
|
||||
*
|
||||
* @return The orientation.
|
||||
*
|
||||
* @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT
|
||||
* @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE
|
||||
*/
|
||||
public int getOrientation() {
|
||||
return mOrientation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the document fitting mode.
|
||||
*
|
||||
* @return The fitting mode.
|
||||
*
|
||||
* @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE
|
||||
* @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL
|
||||
* @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT
|
||||
*/
|
||||
public int getFittingMode() {
|
||||
return mFittingMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets document color mode.
|
||||
*
|
||||
* @return The color mode.
|
||||
*
|
||||
* @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR
|
||||
* @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME
|
||||
*/
|
||||
public int getColorMode() {
|
||||
return mColorMode;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the document margins.
|
||||
*
|
||||
* @return The margins.
|
||||
*/
|
||||
public Margins getMargins() {
|
||||
return mMargins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the media size.
|
||||
*
|
||||
* @return The media size.
|
||||
*/
|
||||
public MediaSize getMediaSize() {
|
||||
return mMediaSize;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the document data size in bytes.
|
||||
*
|
||||
@@ -221,11 +144,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
parcel.writeString(mName);
|
||||
parcel.writeInt(mPageCount);
|
||||
parcel.writeInt(mContentType);
|
||||
parcel.writeInt(mOrientation);
|
||||
parcel.writeInt(mFittingMode);
|
||||
parcel.writeInt(mColorMode);
|
||||
mMargins.writeToParcel(parcel);
|
||||
mMediaSize.writeToParcel(parcel);
|
||||
parcel.writeLong(mDataSize);
|
||||
}
|
||||
|
||||
@@ -236,11 +154,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
result = prime * result + ((mName != null) ? mName.hashCode() : 0);
|
||||
result = prime * result + mContentType;
|
||||
result = prime * result + mPageCount;
|
||||
result = prime * result + mOrientation;
|
||||
result = prime * result + mFittingMode;
|
||||
result = prime * result + mColorMode;
|
||||
result = prime * result + (mMargins != null ? mMargins.hashCode() : 0);
|
||||
result = prime * result + (mMediaSize != null ? mMediaSize.hashCode() : 0);
|
||||
result = prime * result + (int) mDataSize;
|
||||
result = prime * result + (int) mDataSize >> 32;
|
||||
return result;
|
||||
@@ -267,29 +180,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
if (mPageCount != other.mPageCount) {
|
||||
return false;
|
||||
}
|
||||
if (mOrientation != other.mOrientation) {
|
||||
return false;
|
||||
}
|
||||
if (mFittingMode != other.mFittingMode) {
|
||||
return false;
|
||||
}
|
||||
if (mColorMode != other.mColorMode) {
|
||||
return false;
|
||||
}
|
||||
if (mMargins == null) {
|
||||
if (other.mMargins != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!mMargins.equals(other.mMargins)) {
|
||||
return false;
|
||||
}
|
||||
if (mMediaSize == null) {
|
||||
if (other.mMediaSize != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!mMediaSize.equals(other.mMediaSize)) {
|
||||
return false;
|
||||
}
|
||||
if (mDataSize != other.mDataSize) {
|
||||
return false;
|
||||
}
|
||||
@@ -303,11 +193,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
builder.append("name=").append(mName);
|
||||
builder.append(", pageCount=").append(mPageCount);
|
||||
builder.append(", contentType=").append(contentTyepToString(mContentType));
|
||||
builder.append(", orientation=").append(PrintAttributes.orientationToString(mOrientation));
|
||||
builder.append(", fittingMode=").append(PrintAttributes.fittingModeToString(mFittingMode));
|
||||
builder.append(", colorMode=").append(PrintAttributes.colorModeToString(mColorMode));
|
||||
builder.append(", margins=").append(mMargins);
|
||||
builder.append(", mediaSize=").append(mMediaSize);
|
||||
builder.append(", size=").append(mDataSize);
|
||||
builder.append("}");
|
||||
return builder.toString();
|
||||
@@ -333,36 +218,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
public static final class Builder {
|
||||
private final PrintDocumentInfo mPrototype;
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* <p>
|
||||
* The values of the relevant properties are initialized from the
|
||||
* provided print attributes. For example, the orientation is set
|
||||
* to be the same as the orientation returned by calling {@link
|
||||
* PrintAttributes#getOrientation() PrintAttributes.getOrientation()}.
|
||||
* </p>
|
||||
*
|
||||
* @param name The document name. Cannot be empty.
|
||||
* @param attributes Print attributes. Cannot be null.
|
||||
*
|
||||
* @throws IllegalArgumentException If the name is empty.
|
||||
*/
|
||||
public Builder(String name, PrintAttributes attributes) {
|
||||
if (TextUtils.isEmpty(name)) {
|
||||
throw new IllegalArgumentException("name cannot be empty");
|
||||
}
|
||||
if (attributes == null) {
|
||||
throw new IllegalArgumentException("attributes cannot be null");
|
||||
}
|
||||
mPrototype = new PrintDocumentInfo();
|
||||
mPrototype.mName = name;
|
||||
mPrototype.mOrientation = attributes.getOrientation();
|
||||
mPrototype.mFittingMode = attributes.getFittingMode();
|
||||
mPrototype.mColorMode = attributes.getColorMode();
|
||||
mPrototype.mMargins = attributes.getMargins();
|
||||
mPrototype.mMediaSize = attributes.getMediaSize();
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
* <p>
|
||||
@@ -379,11 +234,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
}
|
||||
mPrototype = new PrintDocumentInfo();
|
||||
mPrototype.mName = name;
|
||||
mPrototype.mOrientation = PrintAttributes.ORIENTATION_PORTRAIT;
|
||||
mPrototype.mFittingMode = PrintAttributes.FITTING_MODE_NONE;
|
||||
mPrototype.mColorMode = PrintAttributes.COLOR_MODE_COLOR;
|
||||
mPrototype.mMargins = Margins.NO_MARGINS;
|
||||
mPrototype.mMediaSize = MEDIA_SIZE_UNKNOWN;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -422,95 +272,6 @@ public final class PrintDocumentInfo implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the orientation.
|
||||
* <p>
|
||||
* <strong>Default: </strong> {@link PrintAttributes#ORIENTATION_PORTRAIT
|
||||
* PrintAttributes.ORIENTATION_PORTRAIT}
|
||||
* </p>
|
||||
*
|
||||
* @param orientation The orientation.
|
||||
*
|
||||
* @see PrintAttributes#ORIENTATION_PORTRAIT PrintAttributes.ORIENTATION_PORTRAIT
|
||||
* @see PrintAttributes#ORIENTATION_LANDSCAPE PrintAttributes.ORIENTATION_LANDSCAPE
|
||||
*/
|
||||
public Builder setOrientation(int orientation) {
|
||||
PrintAttributes.enforceValidOrientation(orientation);
|
||||
mPrototype.mOrientation = orientation;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the content fitting mode.
|
||||
* <p>
|
||||
* <strong>Default: </strong> {@link PrintAttributes#FITTING_MODE_NONE
|
||||
* PrintAttributes.FITTING_MODE_NONE}
|
||||
* </p>
|
||||
*
|
||||
* @param fittingMode The fitting mode.
|
||||
*
|
||||
* @see PrintAttributes#FITTING_MODE_NONE PrintAttributes.FITTING_MODE_NONE
|
||||
* @see PrintAttributes#FITTING_MODE_SCALE_TO_FILL PrintAttributes.FITTING_MODE_SCALE_TO_FILL
|
||||
* @see PrintAttributes#FITTING_MODE_SCALE_TO_FIT PrintAttributes.FITTING_MODE_SCALE_TO_FIT
|
||||
*/
|
||||
public Builder setFittingMode(int fittingMode) {
|
||||
PrintAttributes.enforceValidFittingMode(fittingMode);
|
||||
mPrototype.mFittingMode = fittingMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the content color mode.
|
||||
* <p>
|
||||
* <strong>Default: </strong> {@link PrintAttributes#COLOR_MODE_COLOR
|
||||
* PrintAttributes.COLOR_MODE_COLOR}
|
||||
* </p>
|
||||
*
|
||||
* @param colorMode The color mode.
|
||||
*
|
||||
* @see PrintAttributes#COLOR_MODE_COLOR PrintAttributes.COLOR_MODE_COLOR
|
||||
* @see PrintAttributes#COLOR_MODE_MONOCHROME PrintAttributes.COLOR_MODE_MONOCHROME
|
||||
*/
|
||||
public Builder setColorMode(int colorMode) {
|
||||
PrintAttributes.enforceValidColorMode(colorMode);
|
||||
mPrototype.mColorMode = colorMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the document margins.
|
||||
* <p>
|
||||
* <strong>Default: </strong> {@link PrintAttributes.Margins#NO_MARGINS Margins.NO_MARGINS}
|
||||
* </p>
|
||||
*
|
||||
* @param margins The margins. Cannot be null.
|
||||
*/
|
||||
public Builder setMargins(Margins margins) {
|
||||
if (margins == null) {
|
||||
throw new IllegalArgumentException("margins cannot be null");
|
||||
}
|
||||
mPrototype.mMargins = margins;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the document media size.
|
||||
* <p>
|
||||
* <strong>Default: </strong>#MEDIA_SIZE_UNKNOWN
|
||||
* </p>
|
||||
*
|
||||
* @param mediaSize The media size. Cannot be null.
|
||||
*
|
||||
* @see #MEDIA_SIZE_UNKNOWN
|
||||
*/
|
||||
public Builder setMediaSize(MediaSize mediaSize) {
|
||||
if (mediaSize == null) {
|
||||
throw new IllegalArgumentException("media size cannot be null");
|
||||
}
|
||||
mPrototype.mMediaSize = mediaSize;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a new {@link PrintDocumentInfo} instance.
|
||||
*
|
||||
|
||||
@@ -21,7 +21,6 @@ import android.os.Parcelable;
|
||||
import android.print.PrintAttributes.Margins;
|
||||
import android.print.PrintAttributes.MediaSize;
|
||||
import android.print.PrintAttributes.Resolution;
|
||||
import android.print.PrintAttributes.Tray;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
@@ -40,26 +39,16 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
|
||||
private static final int PROPERTY_MEDIA_SIZE = 0;
|
||||
private static final int PROPERTY_RESOLUTION = 1;
|
||||
private static final int PROPERTY_INPUT_TRAY = 2;
|
||||
private static final int PROPERTY_OUTPUT_TRAY = 3;
|
||||
private static final int PROPERTY_DUPLEX_MODE = 4;
|
||||
private static final int PROPERTY_COLOR_MODE = 5;
|
||||
private static final int PROPERTY_FITTING_MODE = 6;
|
||||
private static final int PROPERTY_ORIENTATION = 7;
|
||||
private static final int PROPERTY_COUNT = 8;
|
||||
private static final int PROPERTY_COLOR_MODE = 2;
|
||||
private static final int PROPERTY_COUNT = 3;
|
||||
|
||||
private static final Margins DEFAULT_MARGINS = new Margins(0, 0, 0, 0);
|
||||
|
||||
private Margins mMinMargins = DEFAULT_MARGINS;
|
||||
private List<MediaSize> mMediaSizes;
|
||||
private List<Resolution> mResolutions;
|
||||
private List<Tray> mInputTrays;
|
||||
private List<Tray> mOutputTrays;
|
||||
|
||||
private int mDuplexModes;
|
||||
private int mColorModes;
|
||||
private int mFittingModes;
|
||||
private int mOrientations;
|
||||
|
||||
private final int[] mDefaults = new int[PROPERTY_COUNT];
|
||||
private Margins mDefaultMargins = DEFAULT_MARGINS;
|
||||
@@ -106,32 +95,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
mResolutions = null;
|
||||
}
|
||||
|
||||
if (other.mInputTrays != null) {
|
||||
if (mInputTrays != null) {
|
||||
mInputTrays.clear();
|
||||
mInputTrays.addAll(other.mInputTrays);
|
||||
} else {
|
||||
mInputTrays = new ArrayList<Tray>(other.mInputTrays);
|
||||
}
|
||||
} else {
|
||||
mInputTrays = null;
|
||||
}
|
||||
|
||||
if (other.mOutputTrays != null) {
|
||||
if (mOutputTrays != null) {
|
||||
mOutputTrays.clear();
|
||||
mOutputTrays.addAll(other.mOutputTrays);
|
||||
} else {
|
||||
mOutputTrays = new ArrayList<Tray>(other.mOutputTrays);
|
||||
}
|
||||
} else {
|
||||
mOutputTrays = null;
|
||||
}
|
||||
|
||||
mDuplexModes = other.mDuplexModes;
|
||||
mColorModes = other.mColorModes;
|
||||
mFittingModes = other.mFittingModes;
|
||||
mOrientations = other.mOrientations;
|
||||
|
||||
final int defaultCount = other.mDefaults.length;
|
||||
for (int i = 0; i < defaultCount; i++) {
|
||||
@@ -168,37 +132,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
return mMinMargins;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the available input trays.
|
||||
*
|
||||
* @return The input trays.
|
||||
*/
|
||||
public List<Tray> getInputTrays() {
|
||||
return mInputTrays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the available output trays.
|
||||
*
|
||||
* @return The output trays.
|
||||
*/
|
||||
public List<Tray> getOutputTrays() {
|
||||
return mOutputTrays;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the supported duplex modes.
|
||||
*
|
||||
* @return The duplex modes.
|
||||
*
|
||||
* @see PrintAttributes#DUPLEX_MODE_NONE
|
||||
* @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
|
||||
* @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
|
||||
*/
|
||||
public int getDuplexModes() {
|
||||
return mDuplexModes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the supported color modes.
|
||||
*
|
||||
@@ -211,30 +144,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
return mColorModes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the supported fitting modes.
|
||||
*
|
||||
* @return The fitting modes.
|
||||
*
|
||||
* @see PrintAttributes#FITTING_MODE_NONE
|
||||
* @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE
|
||||
*/
|
||||
public int getFittingModes() {
|
||||
return mFittingModes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the supported orientations.
|
||||
*
|
||||
* @return The orientations.
|
||||
*
|
||||
* @see PrintAttributes#ORIENTATION_PORTRAIT
|
||||
* @see PrintAttributes#ORIENTATION_LANDSCAPE
|
||||
*/
|
||||
public int getOrientations() {
|
||||
return mOrientations;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets the default print attributes.
|
||||
*
|
||||
@@ -255,48 +164,18 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
outAttributes.setResolution(mResolutions.get(resolutionIndex));
|
||||
}
|
||||
|
||||
final int inputTrayIndex = mDefaults[PROPERTY_INPUT_TRAY];
|
||||
if (inputTrayIndex >= 0) {
|
||||
outAttributes.setInputTray(mInputTrays.get(inputTrayIndex));
|
||||
}
|
||||
|
||||
final int outputTrayIndex = mDefaults[PROPERTY_OUTPUT_TRAY];
|
||||
if (outputTrayIndex >= 0) {
|
||||
outAttributes.setOutputTray(mOutputTrays.get(outputTrayIndex));
|
||||
}
|
||||
|
||||
final int duplexMode = mDefaults[PROPERTY_DUPLEX_MODE];
|
||||
if (duplexMode > 0) {
|
||||
outAttributes.setDuplexMode(duplexMode);
|
||||
}
|
||||
|
||||
final int colorMode = mDefaults[PROPERTY_COLOR_MODE];
|
||||
if (colorMode > 0) {
|
||||
outAttributes.setColorMode(colorMode);
|
||||
}
|
||||
|
||||
final int fittingMode = mDefaults[PROPERTY_FITTING_MODE];
|
||||
if (fittingMode > 0) {
|
||||
outAttributes.setFittingMode(fittingMode);
|
||||
}
|
||||
|
||||
final int orientation = mDefaults[PROPERTY_ORIENTATION];
|
||||
if (orientation > 0) {
|
||||
outAttributes.setOrientation(orientation);
|
||||
}
|
||||
}
|
||||
|
||||
private PrinterCapabilitiesInfo(Parcel parcel) {
|
||||
mMinMargins = readMargins(parcel);
|
||||
readMediaSizes(parcel);
|
||||
readResolutions(parcel);
|
||||
mInputTrays = readInputTrays(parcel);
|
||||
mOutputTrays = readOutputTrays(parcel);
|
||||
|
||||
mColorModes = parcel.readInt();
|
||||
mDuplexModes = parcel.readInt();
|
||||
mFittingModes = parcel.readInt();
|
||||
mOrientations = parcel.readInt();
|
||||
|
||||
readDefaults(parcel);
|
||||
mDefaultMargins = readMargins(parcel);
|
||||
@@ -312,13 +191,8 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
writeMargins(mMinMargins, parcel);
|
||||
writeMediaSizes(parcel);
|
||||
writeResolutions(parcel);
|
||||
writeInputTrays(parcel);
|
||||
writeOutputTrays(parcel);
|
||||
|
||||
parcel.writeInt(mColorModes);
|
||||
parcel.writeInt(mDuplexModes);
|
||||
parcel.writeInt(mFittingModes);
|
||||
parcel.writeInt(mOrientations);
|
||||
|
||||
writeDefaults(parcel);
|
||||
writeMargins(mDefaultMargins, parcel);
|
||||
@@ -331,12 +205,7 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
result = prime * result + ((mMinMargins == null) ? 0 : mMinMargins.hashCode());
|
||||
result = prime * result + ((mMediaSizes == null) ? 0 : mMediaSizes.hashCode());
|
||||
result = prime * result + ((mResolutions == null) ? 0 : mResolutions.hashCode());
|
||||
result = prime * result + ((mInputTrays == null) ? 0 : mInputTrays.hashCode());
|
||||
result = prime * result + ((mOutputTrays == null) ? 0 : mOutputTrays.hashCode());
|
||||
result = prime * result + mColorModes;
|
||||
result = prime * result + mDuplexModes;
|
||||
result = prime * result + mFittingModes;
|
||||
result = prime * result + mOrientations;
|
||||
result = prime * result + Arrays.hashCode(mDefaults);
|
||||
result = prime * result + ((mDefaultMargins == null) ? 0 : mDefaultMargins.hashCode());
|
||||
return result;
|
||||
@@ -375,32 +244,9 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
} else if (!mResolutions.equals(other.mResolutions)) {
|
||||
return false;
|
||||
}
|
||||
if (mInputTrays == null) {
|
||||
if (other.mInputTrays != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!mInputTrays.equals(other.mInputTrays)) {
|
||||
return false;
|
||||
}
|
||||
if (mOutputTrays == null) {
|
||||
if (other.mOutputTrays != null) {
|
||||
return false;
|
||||
}
|
||||
} else if (!mOutputTrays.equals(other.mOutputTrays)) {
|
||||
return false;
|
||||
}
|
||||
if (mDuplexModes != other.mDuplexModes) {
|
||||
return false;
|
||||
}
|
||||
if (mColorModes != other.mColorModes) {
|
||||
return false;
|
||||
}
|
||||
if (mFittingModes != other.mFittingModes) {
|
||||
return false;
|
||||
}
|
||||
if (mOrientations != other.mOrientations) {
|
||||
return false;
|
||||
}
|
||||
if (!Arrays.equals(mDefaults, other.mDefaults)) {
|
||||
return false;
|
||||
}
|
||||
@@ -421,32 +267,11 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
builder.append("minMargins=").append(mMinMargins);
|
||||
builder.append(", mediaSizes=").append(mMediaSizes);
|
||||
builder.append(", resolutions=").append(mResolutions);
|
||||
builder.append(", inputTrays=").append(mInputTrays);
|
||||
builder.append(", outputTrays=").append(mOutputTrays);
|
||||
builder.append(", duplexModes=").append(duplexModesToString());
|
||||
builder.append(", colorModes=").append(colorModesToString());
|
||||
builder.append(", fittingModes=").append(fittingModesToString());
|
||||
builder.append(", orientations=").append(orientationsToString());
|
||||
builder.append("\"}");
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private String duplexModesToString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append('[');
|
||||
int duplexModes = mDuplexModes;
|
||||
while (duplexModes != 0) {
|
||||
final int duplexMode = 1 << Integer.numberOfTrailingZeros(duplexModes);
|
||||
duplexModes &= ~duplexMode;
|
||||
if (builder.length() > 0) {
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append(PrintAttributes.duplexModeToString(duplexMode));
|
||||
}
|
||||
builder.append(']');
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private String colorModesToString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append('[');
|
||||
@@ -463,38 +288,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private String fittingModesToString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append('[');
|
||||
int fittingModes = mFittingModes;
|
||||
while (fittingModes != 0) {
|
||||
final int fittingMode = 1 << Integer.numberOfTrailingZeros(fittingModes);
|
||||
fittingModes &= ~fittingMode;
|
||||
if (builder.length() > 0) {
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append(PrintAttributes.fittingModeToString(fittingMode));
|
||||
}
|
||||
builder.append(']');
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private String orientationsToString() {
|
||||
StringBuilder builder = new StringBuilder();
|
||||
builder.append('[');
|
||||
int orientations = mOrientations;
|
||||
while (orientations != 0) {
|
||||
final int orientation = 1 << Integer.numberOfTrailingZeros(orientations);
|
||||
orientations &= ~orientation;
|
||||
if (builder.length() > 0) {
|
||||
builder.append(", ");
|
||||
}
|
||||
builder.append(PrintAttributes.orientationToString(orientation));
|
||||
}
|
||||
builder.append(']');
|
||||
return builder.toString();
|
||||
}
|
||||
|
||||
private void writeMediaSizes(Parcel parcel) {
|
||||
if (mMediaSizes == null) {
|
||||
parcel.writeInt(0);
|
||||
@@ -552,54 +345,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
return (parcel.readInt() == 1) ? Margins.createFromParcel(parcel) : null;
|
||||
}
|
||||
|
||||
private void writeInputTrays(Parcel parcel) {
|
||||
if (mInputTrays == null) {
|
||||
parcel.writeInt(0);
|
||||
return;
|
||||
}
|
||||
final int inputTrayCount = mInputTrays.size();
|
||||
parcel.writeInt(inputTrayCount);
|
||||
for (int i = 0; i < inputTrayCount; i++) {
|
||||
mInputTrays.get(i).writeToParcel(parcel);
|
||||
}
|
||||
}
|
||||
|
||||
private List<Tray> readInputTrays(Parcel parcel) {
|
||||
final int inputTrayCount = parcel.readInt();
|
||||
if (inputTrayCount <= 0) {
|
||||
return null;
|
||||
}
|
||||
List<Tray> inputTrays = new ArrayList<Tray>(inputTrayCount);
|
||||
for (int i = 0; i < inputTrayCount; i++) {
|
||||
inputTrays.add(Tray.createFromParcel(parcel));
|
||||
}
|
||||
return inputTrays;
|
||||
}
|
||||
|
||||
private void writeOutputTrays(Parcel parcel) {
|
||||
if (mOutputTrays == null) {
|
||||
parcel.writeInt(0);
|
||||
return;
|
||||
}
|
||||
final int outputTrayCount = mOutputTrays.size();
|
||||
parcel.writeInt(outputTrayCount);
|
||||
for (int i = 0; i < outputTrayCount; i++) {
|
||||
mOutputTrays.get(i).writeToParcel(parcel);
|
||||
}
|
||||
}
|
||||
|
||||
private List<Tray> readOutputTrays(Parcel parcel) {
|
||||
final int outputTrayCount = parcel.readInt();
|
||||
if (outputTrayCount <= 0) {
|
||||
return null;
|
||||
}
|
||||
List<Tray> outputTrays = new ArrayList<Tray>(outputTrayCount);
|
||||
for (int i = 0; i < outputTrayCount; i++) {
|
||||
outputTrays.add(Tray.createFromParcel(parcel));
|
||||
}
|
||||
return outputTrays;
|
||||
}
|
||||
|
||||
private void readDefaults(Parcel parcel) {
|
||||
final int defaultCount = parcel.readInt();
|
||||
for (int i = 0; i < defaultCount; i++) {
|
||||
@@ -721,62 +466,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an input tray.
|
||||
* <p>
|
||||
* <strong>Required:</strong> No
|
||||
* </p>
|
||||
*
|
||||
* @param inputTray A tray.
|
||||
* @param isDefault Whether this is the default.
|
||||
* @return This builder.
|
||||
*
|
||||
* @throws IllegalArgumentException If set as default and there
|
||||
* is already a default.
|
||||
*
|
||||
* @see PrintAttributes.Tray
|
||||
*/
|
||||
public Builder addInputTray(Tray inputTray, boolean isDefault) {
|
||||
if (mPrototype.mInputTrays == null) {
|
||||
mPrototype.mInputTrays = new ArrayList<Tray>();
|
||||
}
|
||||
final int insertionIndex = mPrototype.mInputTrays.size();
|
||||
mPrototype.mInputTrays.add(inputTray);
|
||||
if (isDefault) {
|
||||
throwIfDefaultAlreadySpecified(PROPERTY_INPUT_TRAY);
|
||||
mPrototype.mDefaults[PROPERTY_INPUT_TRAY] = insertionIndex;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an output tray.
|
||||
* <p>
|
||||
* <strong>Required:</strong> No
|
||||
* </p>
|
||||
*
|
||||
* @param outputTray A tray.
|
||||
* @param isDefault Whether this is the default.
|
||||
* @return This builder.
|
||||
*
|
||||
* @throws IllegalArgumentException If set as default and there
|
||||
* is already a default.
|
||||
*
|
||||
* @see PrintAttributes.Tray
|
||||
*/
|
||||
public Builder addOutputTray(Tray outputTray, boolean isDefault) {
|
||||
if (mPrototype.mOutputTrays == null) {
|
||||
mPrototype.mOutputTrays = new ArrayList<Tray>();
|
||||
}
|
||||
final int insertionIndex = mPrototype.mOutputTrays.size();
|
||||
mPrototype.mOutputTrays.add(outputTray);
|
||||
if (isDefault) {
|
||||
throwIfDefaultAlreadySpecified(PROPERTY_OUTPUT_TRAY);
|
||||
mPrototype.mDefaults[PROPERTY_OUTPUT_TRAY] = insertionIndex;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the color modes.
|
||||
* <p>
|
||||
@@ -809,103 +498,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the duplex modes.
|
||||
* <p>
|
||||
* <strong>Required:</strong> No
|
||||
* </p>
|
||||
*
|
||||
* @param duplexModes The duplex mode bit mask.
|
||||
* @param defaultDuplexMode The default duplex mode.
|
||||
* @return This builder.
|
||||
*
|
||||
* @throws IllegalArgumentException If duplex modes contains an invalid
|
||||
* mode bit or if the default duplex mode is invalid.
|
||||
*
|
||||
* @see PrintAttributes#DUPLEX_MODE_NONE
|
||||
* @see PrintAttributes#DUPLEX_MODE_LONG_EDGE
|
||||
* @see PrintAttributes#DUPLEX_MODE_SHORT_EDGE
|
||||
*/
|
||||
public Builder setDuplexModes(int duplexModes, int defaultDuplexMode) {
|
||||
int currentModes = duplexModes;
|
||||
while (currentModes > 0) {
|
||||
final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
|
||||
currentModes &= ~currentMode;
|
||||
PrintAttributes.enforceValidDuplexMode(currentMode);
|
||||
}
|
||||
if ((duplexModes & defaultDuplexMode) == 0) {
|
||||
throw new IllegalArgumentException("Default duplex mode not in duplex modes.");
|
||||
}
|
||||
PrintAttributes.enforceValidDuplexMode(defaultDuplexMode);
|
||||
mPrototype.mDuplexModes = duplexModes;
|
||||
mPrototype.mDefaults[PROPERTY_DUPLEX_MODE] = defaultDuplexMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the fitting modes.
|
||||
* <p>
|
||||
* <strong>Required:</strong> No
|
||||
* </p>
|
||||
*
|
||||
* @param fittingModes The fitting mode bit mask.
|
||||
* @param defaultFittingMode The default fitting mode.
|
||||
* @return This builder.
|
||||
*
|
||||
* @throws IllegalArgumentException If fitting modes contains an invalid
|
||||
* mode bit or if the default fitting mode is invalid.
|
||||
*
|
||||
* @see PrintAttributes#FITTING_MODE_NONE
|
||||
* @see PrintAttributes#FITTING_MODE_FIT_TO_PAGE
|
||||
*/
|
||||
public Builder setFittingModes(int fittingModes, int defaultFittingMode) {
|
||||
int currentModes = fittingModes;
|
||||
while (currentModes > 0) {
|
||||
final int currentMode = (1 << Integer.numberOfTrailingZeros(currentModes));
|
||||
currentModes &= ~currentMode;
|
||||
PrintAttributes.enforceValidFittingMode(currentMode);
|
||||
}
|
||||
if ((fittingModes & defaultFittingMode) == 0) {
|
||||
throw new IllegalArgumentException("Default fitting mode not in fiting modes.");
|
||||
}
|
||||
PrintAttributes.enforceValidFittingMode(defaultFittingMode);
|
||||
mPrototype.mFittingModes = fittingModes;
|
||||
mPrototype.mDefaults[PROPERTY_FITTING_MODE] = defaultFittingMode;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the orientations.
|
||||
* <p>
|
||||
* <strong>Required:</strong> Yes
|
||||
* </p>
|
||||
*
|
||||
* @param orientations The orientation bit mask.
|
||||
* @param defaultOrientation The default orientation.
|
||||
* @return This builder.
|
||||
*
|
||||
* @throws IllegalArgumentException If orientations contains an invalid
|
||||
* mode bit or if the default orientation is invalid.
|
||||
*
|
||||
* @see PrintAttributes#ORIENTATION_PORTRAIT
|
||||
* @see PrintAttributes#ORIENTATION_LANDSCAPE
|
||||
*/
|
||||
public Builder setOrientations(int orientations, int defaultOrientation) {
|
||||
int currentOrientaions = orientations;
|
||||
while (currentOrientaions > 0) {
|
||||
final int currentOrnt = (1 << Integer.numberOfTrailingZeros(currentOrientaions));
|
||||
currentOrientaions &= ~currentOrnt;
|
||||
PrintAttributes.enforceValidOrientation(currentOrnt);
|
||||
}
|
||||
if ((orientations & defaultOrientation) == 0) {
|
||||
throw new IllegalArgumentException("Default orientation not in orientations.");
|
||||
}
|
||||
PrintAttributes.enforceValidOrientation(defaultOrientation);
|
||||
mPrototype.mOrientations = orientations;
|
||||
mPrototype.mDefaults[PROPERTY_ORIENTATION] = defaultOrientation;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Crates a new {@link PrinterCapabilitiesInfo} enforcing that all
|
||||
* required properties have need specified. See individual methods
|
||||
@@ -934,12 +526,6 @@ public final class PrinterCapabilitiesInfo implements Parcelable {
|
||||
if (mPrototype.mDefaults[PROPERTY_COLOR_MODE] == DEFAULT_UNDEFINED) {
|
||||
throw new IllegalStateException("No default color mode specified.");
|
||||
}
|
||||
if (mPrototype.mOrientations == 0) {
|
||||
throw new IllegalStateException("No oprientation specified.");
|
||||
}
|
||||
if (mPrototype.mDefaults[PROPERTY_ORIENTATION] == DEFAULT_UNDEFINED) {
|
||||
throw new IllegalStateException("No default orientation specified.");
|
||||
}
|
||||
if (mPrototype.mMinMargins == null) {
|
||||
mPrototype.mMinMargins = new Margins(0, 0, 0, 0);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,6 @@ public final class PrinterDiscoverySession {
|
||||
|
||||
private static final int MSG_PRINTERS_ADDED = 1;
|
||||
private static final int MSG_PRINTERS_REMOVED = 2;
|
||||
private static final int MSG_PRINTERS_UPDATED = 3;
|
||||
|
||||
private final ArrayMap<PrinterId, PrinterInfo> mPrinters =
|
||||
new ArrayMap<PrinterId, PrinterInfo>();
|
||||
@@ -200,8 +199,8 @@ public final class PrinterDiscoverySession {
|
||||
final int addedPrinterCount = printers.size();
|
||||
for (int i = 0; i < addedPrinterCount; i++) {
|
||||
PrinterInfo addedPrinter = printers.get(i);
|
||||
if (mPrinters.get(addedPrinter.getId()) == null) {
|
||||
mPrinters.put(addedPrinter.getId(), addedPrinter);
|
||||
PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter);
|
||||
if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) {
|
||||
printersChanged = true;
|
||||
}
|
||||
}
|
||||
@@ -227,25 +226,6 @@ public final class PrinterDiscoverySession {
|
||||
}
|
||||
}
|
||||
|
||||
private void handlePrintersUpdated(List<PrinterInfo> printers) {
|
||||
if (isDestroyed()) {
|
||||
return;
|
||||
}
|
||||
boolean printersChanged = false;
|
||||
final int updatedPrinterCount = printers.size();
|
||||
for (int i = 0; i < updatedPrinterCount; i++) {
|
||||
PrinterInfo updatedPrinter = printers.get(i);
|
||||
PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId());
|
||||
if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) {
|
||||
mPrinters.put(updatedPrinter.getId(), updatedPrinter);
|
||||
printersChanged = true;
|
||||
}
|
||||
}
|
||||
if (printersChanged) {
|
||||
notifyOnPrintersChanged();
|
||||
}
|
||||
}
|
||||
|
||||
private void notifyOnPrintersChanged() {
|
||||
if (mListener != null) {
|
||||
mListener.onPrintersChanged();
|
||||
@@ -277,11 +257,6 @@ public final class PrinterDiscoverySession {
|
||||
List<PrinterId> printerIds = (List<PrinterId>) message.obj;
|
||||
handlePrintersRemoved(printerIds);
|
||||
} break;
|
||||
|
||||
case MSG_PRINTERS_UPDATED: {
|
||||
List<PrinterInfo> printers = (List<PrinterInfo>) message.obj;
|
||||
handlePrintersUpdated(printers);
|
||||
} break;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -311,14 +286,5 @@ public final class PrinterDiscoverySession {
|
||||
printerIds).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrintersUpdated(List<PrinterInfo> printers) {
|
||||
PrinterDiscoverySession session = mWeakSession.get();
|
||||
if (session != null) {
|
||||
session.mHandler.obtainMessage(MSG_PRINTERS_UPDATED,
|
||||
printers).sendToTarget();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -35,5 +35,4 @@ interface IPrintServiceClient {
|
||||
|
||||
void onPrintersAdded(in List<PrinterInfo> printers);
|
||||
void onPrintersRemoved(in List<PrinterId> printerIds);
|
||||
void onPrintersUpdated(in List<PrinterInfo> printers);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ import java.util.List;
|
||||
* PrinterDiscoverySession#addPrinters(List)}. Added printers that disappeared are
|
||||
* removed by invoking {@link PrinterDiscoverySession#removePrinters(List)}. Added
|
||||
* printers whose properties or capabilities changed are updated through a call to
|
||||
* {@link PrinterDiscoverySession#updatePrinters(List)}. The printers added in this
|
||||
* {@link PrinterDiscoverySession#addPrinters(List)}. The printers added in this
|
||||
* session can be acquired via {@link #getPrinters()} where the returned printers
|
||||
* will be an up-to-date snapshot of the printers that you reported during the
|
||||
* session. Printers are <strong>not</strong> persisted across sessions.
|
||||
@@ -89,6 +89,9 @@ public abstract class PrinterDiscoverySession {
|
||||
private final ArrayMap<PrinterId, PrinterInfo> mPrinters =
|
||||
new ArrayMap<PrinterId, PrinterInfo>();
|
||||
|
||||
private final List<PrinterId> mTrackedPrinters =
|
||||
new ArrayList<PrinterId>();
|
||||
|
||||
private ArrayMap<PrinterId, PrinterInfo> mLastSentPrinters;
|
||||
|
||||
private IPrintServiceClient mObserver;
|
||||
@@ -130,7 +133,6 @@ public abstract class PrinterDiscoverySession {
|
||||
*
|
||||
* @see #addPrinters(List)
|
||||
* @see #removePrinters(List)
|
||||
* @see #updatePrinters(List)
|
||||
* @see #isDestroyed()
|
||||
*/
|
||||
public final List<PrinterInfo> getPrinters() {
|
||||
@@ -142,7 +144,7 @@ public abstract class PrinterDiscoverySession {
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds discovered printers. Adding an already added printer has no effect.
|
||||
* Adds discovered printers. Adding an already added printer updates it.
|
||||
* Removed printers can be added again. You can call this method multiple
|
||||
* times during the life of this session. Duplicates will be ignored.
|
||||
* <p>
|
||||
@@ -153,7 +155,6 @@ public abstract class PrinterDiscoverySession {
|
||||
* @param printers The printers to add.
|
||||
*
|
||||
* @see #removePrinters(List)
|
||||
* @see #updatePrinters(List)
|
||||
* @see #getPrinters()
|
||||
* @see #isDestroyed()
|
||||
*/
|
||||
@@ -168,18 +169,21 @@ public abstract class PrinterDiscoverySession {
|
||||
|
||||
if (mIsDiscoveryStarted) {
|
||||
// If during discovery, add the new printers and send them.
|
||||
List<PrinterInfo> addedPrinters = new ArrayList<PrinterInfo>();
|
||||
List<PrinterInfo> addedPrinters = null;
|
||||
final int addedPrinterCount = printers.size();
|
||||
for (int i = 0; i < addedPrinterCount; i++) {
|
||||
PrinterInfo addedPrinter = printers.get(i);
|
||||
if (mPrinters.get(addedPrinter.getId()) == null) {
|
||||
mPrinters.put(addedPrinter.getId(), addedPrinter);
|
||||
PrinterInfo oldPrinter = mPrinters.put(addedPrinter.getId(), addedPrinter);
|
||||
if (oldPrinter == null || !oldPrinter.equals(addedPrinter)) {
|
||||
if (addedPrinters == null) {
|
||||
addedPrinters = new ArrayList<PrinterInfo>();
|
||||
}
|
||||
addedPrinters.add(addedPrinter);
|
||||
}
|
||||
}
|
||||
|
||||
// Send the added printers, if such.
|
||||
if (!addedPrinters.isEmpty()) {
|
||||
if (addedPrinters != null) {
|
||||
sendAddedPrinters(mObserver, addedPrinters);
|
||||
}
|
||||
} else {
|
||||
@@ -232,7 +236,6 @@ public abstract class PrinterDiscoverySession {
|
||||
* @param printerIds The ids of the removed printers.
|
||||
*
|
||||
* @see #addPrinters(List)
|
||||
* @see #updatePrinters(List)
|
||||
* @see #getPrinters()
|
||||
* @see #isDestroyed()
|
||||
*/
|
||||
@@ -295,86 +298,6 @@ public abstract class PrinterDiscoverySession {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates added printers. Updating a printer that was not added or that
|
||||
* was removed has no effect. You can call this method multiple times
|
||||
* during the lifetime of this session.
|
||||
* <p>
|
||||
* <strong>Note: </strong> Calls to this method after the session is
|
||||
* destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
|
||||
* </p>
|
||||
*
|
||||
* @param printers The printers to update.
|
||||
*
|
||||
* @see #addPrinters(List)
|
||||
* @see #removePrinters(List)
|
||||
* @see #getPrinters()
|
||||
* @see #isDestroyed()
|
||||
*/
|
||||
public final void updatePrinters(List<PrinterInfo> printers) {
|
||||
PrintService.throwIfNotCalledOnMainThread();
|
||||
|
||||
// If the session is destroyed - nothing do to.
|
||||
if (mIsDestroyed) {
|
||||
Log.w(LOG_TAG, "Not updating printers - session destroyed.");
|
||||
return;
|
||||
}
|
||||
|
||||
if (mIsDiscoveryStarted) {
|
||||
// If during discovery, update existing printers and send them.
|
||||
List<PrinterInfo> updatedPrinters = new ArrayList<PrinterInfo>();
|
||||
final int updatedPrinterCount = printers.size();
|
||||
for (int i = 0; i < updatedPrinterCount; i++) {
|
||||
PrinterInfo updatedPrinter = printers.get(i);
|
||||
PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId());
|
||||
if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) {
|
||||
mPrinters.put(updatedPrinter.getId(), updatedPrinter);
|
||||
updatedPrinters.add(updatedPrinter);
|
||||
}
|
||||
}
|
||||
|
||||
// Send the updated printers, if such.
|
||||
if (!updatedPrinters.isEmpty()) {
|
||||
sendUpdatedPrinters(mObserver, updatedPrinters);
|
||||
}
|
||||
} else {
|
||||
// Remember the last sent printers if needed.
|
||||
if (mLastSentPrinters == null) {
|
||||
mLastSentPrinters = new ArrayMap<PrinterId, PrinterInfo>(mPrinters);
|
||||
}
|
||||
|
||||
// Update the printers.
|
||||
final int updatedPrinterCount = printers.size();
|
||||
for (int i = 0; i < updatedPrinterCount; i++) {
|
||||
PrinterInfo updatedPrinter = printers.get(i);
|
||||
PrinterInfo oldPrinter = mPrinters.get(updatedPrinter.getId());
|
||||
if (oldPrinter != null && !oldPrinter.equals(updatedPrinter)) {
|
||||
mPrinters.put(updatedPrinter.getId(), updatedPrinter);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void sendUpdatedPrinters(IPrintServiceClient observer,
|
||||
List<PrinterInfo> printers) {
|
||||
try {
|
||||
final int printerCount = printers.size();
|
||||
if (printerCount <= MAX_ITEMS_PER_CALLBACK) {
|
||||
observer.onPrintersUpdated(printers);
|
||||
} else {
|
||||
final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1;
|
||||
for (int i = 0; i < transactionCount; i++) {
|
||||
final int start = i * MAX_ITEMS_PER_CALLBACK;
|
||||
final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
|
||||
List<PrinterInfo> subPrinters = printers.subList(start, end);
|
||||
observer.onPrintersUpdated(subPrinters);
|
||||
}
|
||||
}
|
||||
} catch (RemoteException re) {
|
||||
Log.e(LOG_TAG, "Error sending updated printers", re);
|
||||
}
|
||||
}
|
||||
|
||||
private void sendOutOfDiscoveryPeriodPrinterChanges() {
|
||||
// Noting changed since the last discovery period - nothing to do.
|
||||
if (mLastSentPrinters == null || mLastSentPrinters.isEmpty()) {
|
||||
@@ -382,21 +305,11 @@ public abstract class PrinterDiscoverySession {
|
||||
return;
|
||||
}
|
||||
|
||||
// Determine the added printers.
|
||||
List<PrinterInfo> addedPrinters = null;
|
||||
List<PrinterInfo> updatedPrinters = null;
|
||||
List<PrinterId> removedPrinterIds = null;
|
||||
|
||||
// Determine the added and updated printers.
|
||||
for (PrinterInfo printer : mPrinters.values()) {
|
||||
PrinterInfo sentPrinter = mLastSentPrinters.get(printer.getId());
|
||||
if (sentPrinter != null) {
|
||||
if (!sentPrinter.equals(printer)) {
|
||||
if (updatedPrinters == null) {
|
||||
updatedPrinters = new ArrayList<PrinterInfo>();
|
||||
}
|
||||
updatedPrinters.add(printer);
|
||||
}
|
||||
} else {
|
||||
if (sentPrinter == null || !sentPrinter.equals(printer)) {
|
||||
if (addedPrinters == null) {
|
||||
addedPrinters = new ArrayList<PrinterInfo>();
|
||||
}
|
||||
@@ -409,12 +322,8 @@ public abstract class PrinterDiscoverySession {
|
||||
sendAddedPrinters(mObserver, addedPrinters);
|
||||
}
|
||||
|
||||
// Send the updated printers, if such.
|
||||
if (updatedPrinters != null) {
|
||||
sendUpdatedPrinters(mObserver, updatedPrinters);
|
||||
}
|
||||
|
||||
// Determine the removed printers.
|
||||
List<PrinterId> removedPrinterIds = null;
|
||||
for (PrinterInfo sentPrinter : mLastSentPrinters.values()) {
|
||||
if (!mPrinters.containsKey(sentPrinter.getId())) {
|
||||
if (removedPrinterIds == null) {
|
||||
@@ -437,14 +346,15 @@ public abstract class PrinterDiscoverySession {
|
||||
* added via calling {@link #addPrinters(List)}. Added printers that disappeared
|
||||
* should be removed via calling {@link #removePrinters(List)}. Added printers
|
||||
* whose properties or capabilities changed should be updated via calling {@link
|
||||
* #updatePrinters(List)}. You will receive a call to call to {@link
|
||||
* #onStopPrinterDiscovery()} when you should stop printer discovery.
|
||||
* #addPrinters(List)}. You will receive a call to {@link #onStopPrinterDiscovery()}
|
||||
* when you should stop printer discovery.
|
||||
* <p>
|
||||
* During the lifetime of this session all printers that are known to your print
|
||||
* service have to be added. The system does not retain any printers across sessions.
|
||||
* However, if you were asked to start and then stop performing printer discovery
|
||||
* in this session, then a subsequent discovering should not re-discover already
|
||||
* discovered printers.
|
||||
* discovered printers. You can get the printers reported during this session by
|
||||
* calling {@link #getPrinters()}.
|
||||
* </p>
|
||||
* <p>
|
||||
* <strong>Note: </strong>You are also given a list of printers whose availability
|
||||
@@ -459,7 +369,6 @@ public abstract class PrinterDiscoverySession {
|
||||
* @see #onStopPrinterDiscovery()
|
||||
* @see #addPrinters(List)
|
||||
* @see #removePrinters(List)
|
||||
* @see #updatePrinters(List)
|
||||
* @see #isPrinterDiscoveryStarted()
|
||||
*/
|
||||
public abstract void onStartPrinterDiscovery(List<PrinterId> priorityList);
|
||||
@@ -476,7 +385,7 @@ public abstract class PrinterDiscoverySession {
|
||||
* Callback asking you to validate that the given printers are valid, that
|
||||
* is they exist. You are responsible for checking whether these printers
|
||||
* exist and for the ones that do exist notify the system via calling
|
||||
* {@link #updatePrinters(List)}.
|
||||
* {@link #addPrinters(List)}.
|
||||
* <p>
|
||||
* <strong>Note: </strong> You are <strong>not required</strong> to provide
|
||||
* the printer capabilities when updating the printers that do exist.
|
||||
@@ -484,7 +393,6 @@ public abstract class PrinterDiscoverySession {
|
||||
*
|
||||
* @param printerIds The printers to validate.
|
||||
*
|
||||
* @see #updatePrinters(List)
|
||||
* @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo)
|
||||
* PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo)
|
||||
*/
|
||||
@@ -494,7 +402,7 @@ public abstract class PrinterDiscoverySession {
|
||||
* Callback asking you to start tracking the state of a printer. Tracking
|
||||
* the state means that you should do a best effort to observe the state
|
||||
* of this printer and notify the system if that state changes via calling
|
||||
* {@link #updatePrinters(List)}.
|
||||
* {@link #addPrinters(List)}.
|
||||
* <p>
|
||||
* <strong>Note: </strong> A printer can be initially added without its
|
||||
* capabilities to avoid polling printers that the user will not select.
|
||||
@@ -513,7 +421,6 @@ public abstract class PrinterDiscoverySession {
|
||||
* @param printerId The printer to start tracking.
|
||||
*
|
||||
* @see #onStopPrinterStateTracking(PrinterId)
|
||||
* @see #updatePrinters(List)
|
||||
* @see PrinterInfo.Builder#setCapabilities(PrinterCapabilitiesInfo)
|
||||
* PrinterInfo.Builder.setCapabilities(PrinterCapabilitiesInfo)
|
||||
*/
|
||||
@@ -530,6 +437,32 @@ public abstract class PrinterDiscoverySession {
|
||||
*/
|
||||
public abstract void onStopPrinterStateTracking(PrinterId printerId);
|
||||
|
||||
/**
|
||||
* Gets the printers that should be tracked. These are printers that are
|
||||
* important to the user and for which you received a call to {@link
|
||||
* #onStartPrinterStateTracking(PrinterId)} asking you to observer their
|
||||
* state and reporting it to the system via {@link #addPrinters(List)}.
|
||||
* You will receive a call to {@link #onStopPrinterStateTracking(PrinterId)}
|
||||
* if you should stop tracking a printer.
|
||||
* <p>
|
||||
* <strong>Note: </strong> Calls to this method after the session is
|
||||
* destroyed, that is after the {@link #onDestroy()} callback, will be ignored.
|
||||
* </p>
|
||||
*
|
||||
* @return The printers.
|
||||
*
|
||||
* @see #onStartPrinterStateTracking(PrinterId)
|
||||
* @see #onStopPrinterStateTracking(PrinterId)
|
||||
* @see #isDestroyed()
|
||||
*/
|
||||
public final List<PrinterId> getTrackedPrinters() {
|
||||
PrintService.throwIfNotCalledOnMainThread();
|
||||
if (mIsDestroyed) {
|
||||
return Collections.emptyList();
|
||||
}
|
||||
return new ArrayList<PrinterId>(mTrackedPrinters);
|
||||
}
|
||||
|
||||
/**
|
||||
* Notifies you that the session is destroyed. After this callback is invoked
|
||||
* any calls to the methods of this class will be ignored, {@link #isDestroyed()}
|
||||
@@ -589,13 +522,16 @@ public abstract class PrinterDiscoverySession {
|
||||
}
|
||||
|
||||
void startPrinterStateTracking(PrinterId printerId) {
|
||||
if (!mIsDestroyed && mObserver != null) {
|
||||
if (!mIsDestroyed && mObserver != null
|
||||
&& !mTrackedPrinters.contains(printerId)) {
|
||||
mTrackedPrinters.add(printerId);
|
||||
onStartPrinterStateTracking(printerId);
|
||||
}
|
||||
}
|
||||
|
||||
void stopPrinterStateTracking(PrinterId printerId) {
|
||||
if (!mIsDestroyed && mObserver != null) {
|
||||
if (!mIsDestroyed && mObserver != null
|
||||
&& mTrackedPrinters.remove(printerId)) {
|
||||
onStopPrinterStateTracking(printerId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -703,6 +703,20 @@ public final class Settings {
|
||||
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
|
||||
public static final String ACTION_CAPTIONING_SETTINGS = "android.settings.CAPTIONING_SETTINGS";
|
||||
|
||||
/**
|
||||
* Activity Action: Show the top level print settings.
|
||||
* <p>
|
||||
* In some cases, a matching Activity may not exist, so ensure you
|
||||
* safeguard against this.
|
||||
* <p>
|
||||
* Input: Nothing.
|
||||
* <p>
|
||||
* Output: Nothing.
|
||||
*/
|
||||
@SdkConstant(SdkConstantType.ACTIVITY_INTENT_ACTION)
|
||||
public static final String ACTION_PRINT_SETTINGS =
|
||||
"android.settings.ACTION_PRINT_SETTINGS";
|
||||
|
||||
// End of Intent actions for Settings
|
||||
|
||||
/**
|
||||
|
||||
@@ -42,7 +42,6 @@ import android.print.IPrintDocumentAdapter;
|
||||
import android.print.IWriteResultCallback;
|
||||
import android.print.PageRange;
|
||||
import android.print.PrintAttributes;
|
||||
import android.print.PrintAttributes.Margins;
|
||||
import android.print.PrintAttributes.MediaSize;
|
||||
import android.print.PrintAttributes.Resolution;
|
||||
import android.print.PrintDocumentAdapter;
|
||||
@@ -75,8 +74,6 @@ import android.widget.EditText;
|
||||
import android.widget.Spinner;
|
||||
import android.widget.TextView;
|
||||
|
||||
import libcore.io.IoUtils;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -92,6 +89,8 @@ import java.util.concurrent.atomic.AtomicInteger;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import libcore.io.IoUtils;
|
||||
|
||||
/**
|
||||
* Activity for configuring a print job.
|
||||
*/
|
||||
@@ -111,6 +110,9 @@ public class PrintJobConfigActivity extends Activity {
|
||||
|
||||
private static final int LOADER_ID_PRINTERS_LOADER = 1;
|
||||
|
||||
private static final int ORIENTATION_PORTRAIT = 0;
|
||||
private static final int ORIENTATION_LANDSCAPE = 1;
|
||||
|
||||
private static final int DEST_ADAPTER_MAX_ITEM_COUNT = 9;
|
||||
|
||||
private static final int DEST_ADAPTER_ITEM_ID_SAVE_AS_PDF = Integer.MAX_VALUE;
|
||||
@@ -343,10 +345,11 @@ public class PrintJobConfigActivity extends Activity {
|
||||
if (!mController.hasStarted()) {
|
||||
mController.start();
|
||||
}
|
||||
if (!printAttributesChanged()) {
|
||||
// If the attributes changed, then we do not do a layout but may
|
||||
// have to ask the app to write some pages. Hence, pretend layout
|
||||
// completed and nothing changed, so we handle writing as usual.
|
||||
if (!printAttributesChanged() && mDocument.info != null) {
|
||||
// If the attributes didn't change and we have done a layout, then
|
||||
// we do not do a layout but may have to ask the app to write some
|
||||
// pages. Hence, pretend layout completed and nothing changed, so
|
||||
// we handle writing as usual.
|
||||
handleOnLayoutFinished(mDocument.info, false, mRequestCounter.get());
|
||||
} else {
|
||||
PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence(
|
||||
@@ -394,9 +397,6 @@ public class PrintJobConfigActivity extends Activity {
|
||||
mPrintJobId, info);
|
||||
}
|
||||
|
||||
// Update the fitting mode based on the document type.
|
||||
updateCurrentFittingMode(info);
|
||||
|
||||
// If the document info or the layout changed, then
|
||||
// drop the pages since we have to fetch them again.
|
||||
if (infoChanged || layoutChanged) {
|
||||
@@ -526,10 +526,6 @@ public class PrintJobConfigActivity extends Activity {
|
||||
}
|
||||
|
||||
if (mEditor.isDone()) {
|
||||
// Update the print attributes based on whether the application
|
||||
// handled some of the print attribute constraints, e.g. rotation.
|
||||
updateAndSaveCurrentPrintAttributes(mDocument.info);
|
||||
|
||||
if (mEditor.isPrintingToPdf()) {
|
||||
PrintJobInfo printJob = PrintSpoolerService.peekInstance()
|
||||
.getPrintJobInfo(mPrintJobId, PrintManager.APP_ID_ANY);
|
||||
@@ -552,58 +548,6 @@ public class PrintJobConfigActivity extends Activity {
|
||||
PrintJobConfigActivity.this.finish();
|
||||
}
|
||||
|
||||
private void updateCurrentFittingMode(PrintDocumentInfo document) {
|
||||
// Update the fitting mode based on content type.
|
||||
switch (document.getContentType()) {
|
||||
case PrintDocumentInfo.CONTENT_TYPE_DOCUMENT: {
|
||||
mCurrPrintAttributes.setFittingMode(
|
||||
PrintAttributes.FITTING_MODE_SCALE_TO_FIT);
|
||||
} break;
|
||||
|
||||
case PrintDocumentInfo.CONTENT_TYPE_PHOTO: {
|
||||
mCurrPrintAttributes.setFittingMode(
|
||||
PrintAttributes.FITTING_MODE_SCALE_TO_FILL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void updateAndSaveCurrentPrintAttributes(PrintDocumentInfo document) {
|
||||
PrintAttributes attributes = mTempPrintAttributes;
|
||||
attributes.copyFrom(mCurrPrintAttributes);
|
||||
|
||||
// Update the orientation
|
||||
if (document.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) {
|
||||
if (attributes.getOrientation() == PrintAttributes.ORIENTATION_LANDSCAPE) {
|
||||
// If the document is in landscape and we want to print it in
|
||||
// landscape, then we do not need to rotate, so portrait.
|
||||
attributes.setOrientation(PrintAttributes.ORIENTATION_PORTRAIT);
|
||||
} else {
|
||||
// If the document is in landscape and we want to print it in
|
||||
// portrait, then we have to rotate the content, so landscape.
|
||||
attributes.setOrientation(PrintAttributes.ORIENTATION_LANDSCAPE);
|
||||
}
|
||||
}
|
||||
|
||||
// Update margins.
|
||||
Margins documentMargins = document.getMargins();
|
||||
if (documentMargins.getLeftMils() != 0
|
||||
|| documentMargins.getTopMils() != 0
|
||||
|| documentMargins.getRightMils() != 0
|
||||
|| documentMargins.getBottomMils() != 0) {
|
||||
// If the application has applied some of the margins, then
|
||||
// the printer should only apply the difference.
|
||||
Margins oldMargins = attributes.getMargins();
|
||||
attributes.setMargins(new Margins(
|
||||
oldMargins.getLeftMils() - documentMargins.getLeftMils(),
|
||||
oldMargins.getTopMils() - documentMargins.getTopMils(),
|
||||
oldMargins.getRightMils() - documentMargins.getRightMils(),
|
||||
oldMargins.getBottomMils() - documentMargins.getBottomMils()));
|
||||
}
|
||||
|
||||
PrintSpoolerService.peekInstance().setPrintJobAttributesNoPersistence(
|
||||
mPrintJobId, attributes);
|
||||
}
|
||||
|
||||
private final class ControllerHandler extends Handler {
|
||||
public static final int MSG_ON_LAYOUT_FINISHED = 1;
|
||||
public static final int MSG_ON_LAYOUT_FAILED = 2;
|
||||
@@ -878,7 +822,16 @@ public class PrintJobConfigActivity extends Activity {
|
||||
}
|
||||
SpinnerItem<Integer> orientationItem =
|
||||
mOrientationSpinnerAdapter.getItem(position);
|
||||
mCurrPrintAttributes.setOrientation(orientationItem.value);
|
||||
MediaSize mediaSize = mCurrPrintAttributes.getMediaSize();
|
||||
if (orientationItem.value == ORIENTATION_PORTRAIT) {
|
||||
if (!mediaSize.isPortrait()) {
|
||||
mCurrPrintAttributes.setMediaSize(mediaSize.asPortrait());
|
||||
}
|
||||
} else {
|
||||
if (mediaSize.isPortrait()) {
|
||||
mCurrPrintAttributes.setMediaSize(mediaSize.asLandscape());
|
||||
}
|
||||
}
|
||||
if (!hasErrors()) {
|
||||
mController.update();
|
||||
}
|
||||
@@ -1108,6 +1061,12 @@ public class PrintJobConfigActivity extends Activity {
|
||||
mOrientationSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>(
|
||||
PrintJobConfigActivity.this,
|
||||
R.layout.spinner_dropdown_item, R.id.title);
|
||||
String[] orientationLabels = getResources().getStringArray(
|
||||
R.array.orientation_labels);
|
||||
mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(
|
||||
ORIENTATION_PORTRAIT, orientationLabels[0]));
|
||||
mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(
|
||||
ORIENTATION_LANDSCAPE, orientationLabels[1]));
|
||||
|
||||
// Range options
|
||||
mRangeOptionsSpinnerAdapter = new ArrayAdapter<SpinnerItem<Integer>>(
|
||||
@@ -1604,7 +1563,7 @@ public class PrintJobConfigActivity extends Activity {
|
||||
oldMediaSizeNewIndex = i;
|
||||
}
|
||||
mMediaSizeSpinnerAdapter.add(new SpinnerItem<MediaSize>(
|
||||
mediaSize, mediaSize.getLabel()));
|
||||
mediaSize, mediaSize.getLabel(getPackageManager())));
|
||||
}
|
||||
|
||||
if (mediaSizeCount <= 0) {
|
||||
@@ -1693,68 +1652,7 @@ public class PrintJobConfigActivity extends Activity {
|
||||
}
|
||||
mColorModeSpinner.setEnabled(true);
|
||||
|
||||
// Orientation.
|
||||
final int orientations = capabilities.getOrientations();
|
||||
|
||||
// If the orientations changed, we update the adapter and the spinner.
|
||||
boolean orientationsChanged = false;
|
||||
if (Integer.bitCount(orientations) != mOrientationSpinnerAdapter.getCount()) {
|
||||
orientationsChanged = true;
|
||||
} else {
|
||||
int remainingOrientations = orientations;
|
||||
int adapterIndex = 0;
|
||||
while (remainingOrientations != 0) {
|
||||
final int orientationBitOffset = Integer.numberOfTrailingZeros(
|
||||
remainingOrientations);
|
||||
final int orientation = 1 << orientationBitOffset;
|
||||
remainingOrientations &= ~orientation;
|
||||
if (orientation != mOrientationSpinnerAdapter.getItem(
|
||||
adapterIndex).value) {
|
||||
orientationsChanged = true;
|
||||
break;
|
||||
}
|
||||
adapterIndex++;
|
||||
}
|
||||
}
|
||||
if (orientationsChanged) {
|
||||
// Remember the old orientation to try selecting it again.
|
||||
int oldOrientationNewIndex = AdapterView.INVALID_POSITION;
|
||||
final int oldOrientation = mCurrPrintAttributes.getOrientation();
|
||||
|
||||
mOrientationSpinnerAdapter.clear();
|
||||
String[] orientationLabels = getResources().getStringArray(
|
||||
R.array.orientation_labels);
|
||||
int remainingOrientations = orientations;
|
||||
while (remainingOrientations != 0) {
|
||||
final int orientationBitOffset = Integer.numberOfTrailingZeros(
|
||||
remainingOrientations);
|
||||
final int orientation = 1 << orientationBitOffset;
|
||||
if (orientation == oldOrientation) {
|
||||
// Update the index of the old selection.
|
||||
oldOrientationNewIndex = orientationBitOffset;
|
||||
}
|
||||
remainingOrientations &= ~orientation;
|
||||
mOrientationSpinnerAdapter.add(new SpinnerItem<Integer>(orientation,
|
||||
orientationLabels[orientationBitOffset]));
|
||||
}
|
||||
final int orientationCount = Integer.bitCount(orientations);
|
||||
if (orientationCount <= 0) {
|
||||
mOrientationSpinner.setEnabled(false);
|
||||
mOrientationSpinner.setSelection(AdapterView.INVALID_POSITION);
|
||||
} else {
|
||||
mOrientationSpinner.setEnabled(true);
|
||||
if (oldOrientationNewIndex != AdapterView.INVALID_POSITION) {
|
||||
// Select the old orientation - nothing really changed.
|
||||
setOrientationSpinnerSelectionNoCallback(oldOrientationNewIndex);
|
||||
} else {
|
||||
final int selectedOrientationIndex = Integer.numberOfTrailingZeros(
|
||||
(orientations & defaultAttributes.getOrientation()));
|
||||
someAttributeSelectionChanged =
|
||||
setOrientationSpinnerSelectionNoCallback(
|
||||
selectedOrientationIndex);
|
||||
}
|
||||
}
|
||||
}
|
||||
// Orientation
|
||||
mOrientationSpinner.setEnabled(true);
|
||||
|
||||
// Range options
|
||||
@@ -1858,15 +1756,6 @@ public class PrintJobConfigActivity extends Activity {
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean setOrientationSpinnerSelectionNoCallback(int position) {
|
||||
if (mOrientationSpinner.getSelectedItemPosition() != position) {
|
||||
mIgnoreNextOrientationChange = true;
|
||||
mOrientationSpinner.setSelection(position);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private void updateUiForNewPrinterCapabilities() {
|
||||
// The printer changed so we want to start with a clean slate
|
||||
// for the print options and let them be populated from the
|
||||
@@ -1881,7 +1770,7 @@ public class PrintJobConfigActivity extends Activity {
|
||||
}
|
||||
if (!mOrientationSpinnerAdapter.isEmpty()) {
|
||||
mIgnoreNextOrientationChange = true;
|
||||
mOrientationSpinnerAdapter.clear();
|
||||
mOrientationSpinner.setSelection(0);
|
||||
}
|
||||
if (mRangeOptionsSpinner.getSelectedItemPosition() != 0) {
|
||||
mIgnoreNextRangeOptionChange = true;
|
||||
@@ -2102,18 +1991,13 @@ public class PrintJobConfigActivity extends Activity {
|
||||
|
||||
PrinterCapabilitiesInfo capabilities =
|
||||
new PrinterCapabilitiesInfo.Builder(printerId)
|
||||
.addMediaSize(MediaSize.createMediaSize(getPackageManager(),
|
||||
MediaSize.ISO_A4), true)
|
||||
.addMediaSize(MediaSize.createMediaSize(getPackageManager(),
|
||||
MediaSize.NA_LETTER), false)
|
||||
.addMediaSize(MediaSize.ISO_A4, true)
|
||||
.addMediaSize(MediaSize.NA_LETTER, false)
|
||||
.addResolution(new Resolution("PDF resolution", "PDF resolution",
|
||||
300, 300), true)
|
||||
.setColorModes(PrintAttributes.COLOR_MODE_COLOR
|
||||
| PrintAttributes.COLOR_MODE_MONOCHROME,
|
||||
PrintAttributes.COLOR_MODE_COLOR)
|
||||
.setOrientations(PrintAttributes.ORIENTATION_PORTRAIT
|
||||
| PrintAttributes.ORIENTATION_LANDSCAPE,
|
||||
PrintAttributes.ORIENTATION_PORTRAIT)
|
||||
.create();
|
||||
|
||||
return new PrinterInfo.Builder(printerId, getString(R.string.save_as_pdf),
|
||||
|
||||
@@ -36,7 +36,6 @@ import android.print.PrintAttributes;
|
||||
import android.print.PrintAttributes.Margins;
|
||||
import android.print.PrintAttributes.MediaSize;
|
||||
import android.print.PrintAttributes.Resolution;
|
||||
import android.print.PrintAttributes.Tray;
|
||||
import android.print.PrintDocumentInfo;
|
||||
import android.print.PrintJobInfo;
|
||||
import android.print.PrintManager;
|
||||
@@ -51,8 +50,6 @@ import com.android.internal.os.HandlerCaller;
|
||||
import com.android.internal.os.SomeArgs;
|
||||
import com.android.internal.util.FastXmlSerializer;
|
||||
|
||||
import libcore.io.IoUtils;
|
||||
|
||||
import org.xmlpull.v1.XmlPullParser;
|
||||
import org.xmlpull.v1.XmlPullParserException;
|
||||
import org.xmlpull.v1.XmlSerializer;
|
||||
@@ -65,6 +62,8 @@ import java.io.IOException;
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
import libcore.io.IoUtils;
|
||||
|
||||
/**
|
||||
* Service for exposing some of the {@link PrintSpooler} functionality to
|
||||
* another process.
|
||||
@@ -676,6 +675,8 @@ public final class PrintSpoolerService extends Service {
|
||||
|
||||
private static final String ATTR_ID = "id";
|
||||
private static final String ATTR_LABEL = "label";
|
||||
private static final String ATTR_LABEL_RES_ID = "labelResId";
|
||||
private static final String ATTR_PACKAGE_NAME = "packageName";
|
||||
private static final String ATTR_STATE = "state";
|
||||
private static final String ATTR_APP_ID = "appId";
|
||||
private static final String ATTR_USER_ID = "userId";
|
||||
@@ -685,13 +686,8 @@ public final class PrintSpoolerService extends Service {
|
||||
private static final String TAG_MEDIA_SIZE = "mediaSize";
|
||||
private static final String TAG_RESOLUTION = "resolution";
|
||||
private static final String TAG_MARGINS = "margins";
|
||||
private static final String TAG_INPUT_TRAY = "inputTray";
|
||||
private static final String TAG_OUTPUT_TRAY = "outputTray";
|
||||
|
||||
private static final String ATTR_DUPLEX_MODE = "duplexMode";
|
||||
private static final String ATTR_COLOR_MODE = "colorMode";
|
||||
private static final String ATTR_FITTING_MODE = "fittingMode";
|
||||
private static final String ATTR_ORIENTATION = "orientation";
|
||||
|
||||
private static final String ATTR_LOCAL_ID = "printerName";
|
||||
private static final String ATTR_SERVICE_NAME = "serviceName";
|
||||
@@ -806,32 +802,31 @@ public final class PrintSpoolerService extends Service {
|
||||
if (attributes != null) {
|
||||
serializer.startTag(null, TAG_ATTRIBUTES);
|
||||
|
||||
final int duplexMode = attributes.getDuplexMode();
|
||||
serializer.attribute(null, ATTR_DUPLEX_MODE,
|
||||
String.valueOf(duplexMode));
|
||||
|
||||
final int colorMode = attributes.getColorMode();
|
||||
serializer.attribute(null, ATTR_COLOR_MODE,
|
||||
String.valueOf(colorMode));
|
||||
|
||||
final int fittingMode = attributes.getFittingMode();
|
||||
serializer.attribute(null, ATTR_FITTING_MODE,
|
||||
String.valueOf(fittingMode));
|
||||
|
||||
final int orientation = attributes.getOrientation();
|
||||
serializer.attribute(null, ATTR_ORIENTATION,
|
||||
String.valueOf(orientation));
|
||||
|
||||
MediaSize mediaSize = attributes.getMediaSize();
|
||||
if (mediaSize != null) {
|
||||
serializer.startTag(null, TAG_MEDIA_SIZE);
|
||||
serializer.attribute(null, ATTR_ID, mediaSize.getId());
|
||||
serializer.attribute(null, ATTR_LABEL, mediaSize.getLabel()
|
||||
.toString());
|
||||
serializer.attribute(null, ATTR_WIDTH_MILS, String.valueOf(
|
||||
mediaSize.getWidthMils()));
|
||||
serializer.attribute(null, ATTR_HEIGHT_MILS, String.valueOf(
|
||||
mediaSize.getHeightMils()));
|
||||
// Store only the platform localized versions of the label
|
||||
// since the resource ids for a print service are not stable
|
||||
// across application versions.
|
||||
if ("android".equals(mediaSize.mPackageName)
|
||||
&& mediaSize.mLabelResId > 0) {
|
||||
serializer.attribute(null, ATTR_PACKAGE_NAME,
|
||||
mediaSize.mPackageName);
|
||||
serializer.attribute(null, ATTR_LABEL_RES_ID,
|
||||
String.valueOf(mediaSize.mLabelResId));
|
||||
} else {
|
||||
serializer.attribute(null, ATTR_LABEL,
|
||||
mediaSize.getLabel(getPackageManager()));
|
||||
}
|
||||
serializer.endTag(null, TAG_MEDIA_SIZE);
|
||||
}
|
||||
|
||||
@@ -839,12 +834,23 @@ public final class PrintSpoolerService extends Service {
|
||||
if (resolution != null) {
|
||||
serializer.startTag(null, TAG_RESOLUTION);
|
||||
serializer.attribute(null, ATTR_ID, resolution.getId());
|
||||
serializer.attribute(null, ATTR_LABEL, resolution.getLabel()
|
||||
.toString());
|
||||
serializer.attribute(null, ATTR_HORIZONTAL_DPI, String.valueOf(
|
||||
resolution.getHorizontalDpi()));
|
||||
serializer.attribute(null, ATTR_VERTICAL_DPI, String.valueOf(
|
||||
resolution.getVerticalDpi()));
|
||||
// Store only the platform localized versions of the label
|
||||
// since the resource ids for a print service are not stable
|
||||
// across application versions.
|
||||
if ("android".equals(resolution.mPackageName)
|
||||
&& resolution.mLabelResId > 0) {
|
||||
serializer.attribute(null, ATTR_PACKAGE_NAME,
|
||||
resolution.mPackageName);
|
||||
serializer.attribute(null, ATTR_LABEL_RES_ID,
|
||||
String.valueOf(resolution.mLabelResId));
|
||||
} else {
|
||||
serializer.attribute(null, ATTR_LABEL,
|
||||
resolution.getLabel(getPackageManager()));
|
||||
}
|
||||
serializer.endTag(null, TAG_RESOLUTION);
|
||||
}
|
||||
|
||||
@@ -862,24 +868,6 @@ public final class PrintSpoolerService extends Service {
|
||||
serializer.endTag(null, TAG_MARGINS);
|
||||
}
|
||||
|
||||
Tray inputTray = attributes.getInputTray();
|
||||
if (inputTray != null) {
|
||||
serializer.startTag(null, TAG_INPUT_TRAY);
|
||||
serializer.attribute(null, ATTR_ID, inputTray.getId());
|
||||
serializer.attribute(null, ATTR_LABEL, inputTray.getLabel()
|
||||
.toString());
|
||||
serializer.endTag(null, TAG_INPUT_TRAY);
|
||||
}
|
||||
|
||||
Tray outputTray = attributes.getOutputTray();
|
||||
if (outputTray != null) {
|
||||
serializer.startTag(null, TAG_OUTPUT_TRAY);
|
||||
serializer.attribute(null, ATTR_ID, outputTray.getId());
|
||||
serializer.attribute(null, ATTR_LABEL, outputTray.getLabel()
|
||||
.toString());
|
||||
serializer.endTag(null, TAG_OUTPUT_TRAY);
|
||||
}
|
||||
|
||||
serializer.endTag(null, TAG_ATTRIBUTES);
|
||||
}
|
||||
|
||||
@@ -1026,18 +1014,9 @@ public final class PrintSpoolerService extends Service {
|
||||
|
||||
PrintAttributes.Builder builder = new PrintAttributes.Builder();
|
||||
|
||||
String duplexMode = parser.getAttributeValue(null, ATTR_DUPLEX_MODE);
|
||||
builder.setDuplexMode(Integer.parseInt(duplexMode));
|
||||
|
||||
String colorMode = parser.getAttributeValue(null, ATTR_COLOR_MODE);
|
||||
builder.setColorMode(Integer.parseInt(colorMode));
|
||||
|
||||
String fittingMode = parser.getAttributeValue(null, ATTR_FITTING_MODE);
|
||||
builder.setFittingMode(Integer.parseInt(fittingMode));
|
||||
|
||||
String orientation = parser.getAttributeValue(null, ATTR_ORIENTATION);
|
||||
builder.setOrientation(Integer.parseInt(orientation));
|
||||
|
||||
parser.next();
|
||||
|
||||
skipEmptyTextTags(parser);
|
||||
@@ -1048,7 +1027,12 @@ public final class PrintSpoolerService extends Service {
|
||||
ATTR_WIDTH_MILS));
|
||||
final int heightMils = Integer.parseInt(parser.getAttributeValue(null,
|
||||
ATTR_HEIGHT_MILS));
|
||||
MediaSize mediaSize = new MediaSize(id, label, widthMils, heightMils);
|
||||
String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
|
||||
final int labelResId = Integer.parseInt(parser.getAttributeValue(null,
|
||||
ATTR_LABEL_RES_ID));
|
||||
label = parser.getAttributeValue(null, ATTR_LABEL);
|
||||
MediaSize mediaSize = new MediaSize(id, label, packageName, labelResId,
|
||||
widthMils, heightMils);
|
||||
builder.setMediaSize(mediaSize);
|
||||
parser.next();
|
||||
skipEmptyTextTags(parser);
|
||||
@@ -1064,7 +1048,11 @@ public final class PrintSpoolerService extends Service {
|
||||
ATTR_HORIZONTAL_DPI));
|
||||
final int verticalDpi = Integer.parseInt(parser.getAttributeValue(null,
|
||||
ATTR_VERTICAL_DPI));
|
||||
Resolution resolution = new Resolution(id, label, horizontalDpi, verticalDpi);
|
||||
String packageName = parser.getAttributeValue(null, ATTR_PACKAGE_NAME);
|
||||
final int labelResId = Integer.parseInt(
|
||||
parser.getAttributeValue(null, ATTR_LABEL_RES_ID));
|
||||
Resolution resolution = new Resolution(id, label, packageName, labelResId,
|
||||
horizontalDpi, verticalDpi);
|
||||
builder.setResolution(resolution);
|
||||
parser.next();
|
||||
skipEmptyTextTags(parser);
|
||||
@@ -1090,30 +1078,6 @@ public final class PrintSpoolerService extends Service {
|
||||
parser.next();
|
||||
}
|
||||
|
||||
skipEmptyTextTags(parser);
|
||||
if (accept(parser, XmlPullParser.START_TAG, TAG_INPUT_TRAY)) {
|
||||
String id = parser.getAttributeValue(null, ATTR_ID);
|
||||
label = parser.getAttributeValue(null, ATTR_LABEL);
|
||||
Tray tray = new Tray(id, label);
|
||||
builder.setInputTray(tray);
|
||||
parser.next();
|
||||
skipEmptyTextTags(parser);
|
||||
expect(parser, XmlPullParser.END_TAG, TAG_INPUT_TRAY);
|
||||
parser.next();
|
||||
}
|
||||
|
||||
skipEmptyTextTags(parser);
|
||||
if (accept(parser, XmlPullParser.START_TAG, TAG_OUTPUT_TRAY)) {
|
||||
String id = parser.getAttributeValue(null, ATTR_ID);
|
||||
label = parser.getAttributeValue(null, ATTR_LABEL);
|
||||
Tray tray = new Tray(id, label);
|
||||
builder.setOutputTray(tray);
|
||||
parser.next();
|
||||
skipEmptyTextTags(parser);
|
||||
expect(parser, XmlPullParser.END_TAG, TAG_OUTPUT_TRAY);
|
||||
parser.next();
|
||||
}
|
||||
|
||||
printJob.setAttributes(builder.create());
|
||||
|
||||
skipEmptyTextTags(parser);
|
||||
|
||||
@@ -684,20 +684,6 @@ final class RemotePrintService implements DeathRecipient {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onPrintersUpdated(List<PrinterInfo> printers) {
|
||||
RemotePrintService service = mWeakService.get();
|
||||
if (service != null) {
|
||||
throwIfPrinterIdsForPrinterInfoTampered(service.mComponentName, printers);
|
||||
final long identity = Binder.clearCallingIdentity();
|
||||
try {
|
||||
service.mUserState.onPrintersUpdated(printers);
|
||||
} finally {
|
||||
Binder.restoreCallingIdentity(identity);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void throwIfPrinterIdsForPrinterInfoTampered(ComponentName serviceName,
|
||||
List<PrinterInfo> printerInfos) {
|
||||
final int printerInfoCount = printerInfos.size();
|
||||
|
||||
@@ -276,22 +276,6 @@ final class UserState implements PrintSpoolerCallbacks {
|
||||
}
|
||||
}
|
||||
|
||||
public void onPrintersUpdated(List<PrinterInfo> printers) {
|
||||
synchronized (mLock) {
|
||||
throwIfDestroyedLocked();
|
||||
// No services - nothing to do.
|
||||
if (mActiveServices.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
// No session - nothing to do.
|
||||
if (mPrinterDiscoverySession == null) {
|
||||
return;
|
||||
}
|
||||
// Request an updated.
|
||||
mPrinterDiscoverySession.onPrintersUpdatedLocked(printers);
|
||||
}
|
||||
}
|
||||
|
||||
public void updateIfNeededLocked() {
|
||||
throwIfDestroyedLocked();
|
||||
if (readConfigurationLocked()) {
|
||||
@@ -746,8 +730,8 @@ final class UserState implements PrintSpoolerCallbacks {
|
||||
final int addedPrinterCount = printers.size();
|
||||
for (int i = 0; i < addedPrinterCount; i++) {
|
||||
PrinterInfo printer = printers.get(i);
|
||||
if (!mPrinters.containsKey(printer.getId())) {
|
||||
mPrinters.put(printer.getId(), printer);
|
||||
PrinterInfo oldPrinter = mPrinters.put(printer.getId(), printer);
|
||||
if (oldPrinter == null || !oldPrinter.equals(printer)) {
|
||||
if (addedPrinters == null) {
|
||||
addedPrinters = new ArrayList<PrinterInfo>();
|
||||
}
|
||||
@@ -785,32 +769,6 @@ final class UserState implements PrintSpoolerCallbacks {
|
||||
}
|
||||
}
|
||||
|
||||
public void onPrintersUpdatedLocked(List<PrinterInfo> printers) {
|
||||
if (DEBUG) {
|
||||
Log.i(LOG_TAG, "onPrintersUpdatedLocked()");
|
||||
}
|
||||
if (mIsDestroyed) {
|
||||
Log.w(LOG_TAG, "Not updating printers - session destroyed");
|
||||
return;
|
||||
}
|
||||
List<PrinterInfo> updatedPrinters = null;
|
||||
final int updatedPrinterCount = printers.size();
|
||||
for (int i = 0; i < updatedPrinterCount; i++) {
|
||||
PrinterInfo updatedPrinter = printers.get(i);
|
||||
if (mPrinters.containsKey(updatedPrinter.getId())) {
|
||||
mPrinters.put(updatedPrinter.getId(), updatedPrinter);
|
||||
if (updatedPrinters == null) {
|
||||
updatedPrinters = new ArrayList<PrinterInfo>();
|
||||
}
|
||||
updatedPrinters.add(updatedPrinter);
|
||||
}
|
||||
}
|
||||
if (updatedPrinters != null) {
|
||||
mHandler.obtainMessage(SessionHandler.MSG_DISPATCH_PRINTERS_UPDATED,
|
||||
updatedPrinters).sendToTarget();
|
||||
}
|
||||
}
|
||||
|
||||
public void onServiceRemovedLocked(ComponentName serviceName) {
|
||||
if (mIsDestroyed) {
|
||||
Log.w(LOG_TAG, "Not updating removed service - session destroyed");
|
||||
@@ -874,15 +832,6 @@ final class UserState implements PrintSpoolerCallbacks {
|
||||
mDiscoveryObservers.finishBroadcast();
|
||||
}
|
||||
|
||||
private void handleDispatchPrintersUpdated(List<PrinterInfo> updatedPrinters) {
|
||||
final int observerCount = mDiscoveryObservers.beginBroadcast();
|
||||
for (int i = 0; i < observerCount; i++) {
|
||||
IPrinterDiscoveryObserver observer = mDiscoveryObservers.getBroadcastItem(i);
|
||||
handlePrintersUpdated(observer, updatedPrinters);
|
||||
}
|
||||
mDiscoveryObservers.finishBroadcast();
|
||||
}
|
||||
|
||||
private void handleDispatchCreatePrinterDiscoverySession(
|
||||
List<RemotePrintService> services) {
|
||||
final int serviceCount = services.size();
|
||||
@@ -976,43 +925,21 @@ final class UserState implements PrintSpoolerCallbacks {
|
||||
}
|
||||
}
|
||||
|
||||
private void handlePrintersUpdated(IPrinterDiscoveryObserver observer,
|
||||
List<PrinterInfo> updatedPrinters) {
|
||||
try {
|
||||
final int printerCount = updatedPrinters.size();
|
||||
if (printerCount <= MAX_ITEMS_PER_CALLBACK) {
|
||||
observer.onPrintersUpdated(updatedPrinters);
|
||||
} else {
|
||||
// Send the added printers in chunks avoiding the binder transaction limit.
|
||||
final int transactionCount = (printerCount / MAX_ITEMS_PER_CALLBACK) + 1;
|
||||
for (int i = 0; i < transactionCount; i++) {
|
||||
final int start = i * MAX_ITEMS_PER_CALLBACK;
|
||||
final int end = Math.min(start + MAX_ITEMS_PER_CALLBACK, printerCount);
|
||||
List<PrinterInfo> subPrinters = updatedPrinters.subList(start, end);
|
||||
observer.onPrintersUpdated(subPrinters);
|
||||
}
|
||||
}
|
||||
} catch (RemoteException re) {
|
||||
Log.e(LOG_TAG, "Error sending updated printers", re);
|
||||
}
|
||||
}
|
||||
|
||||
private final class SessionHandler extends Handler {
|
||||
public static final int MSG_PRINTERS_ADDED = 1;
|
||||
public static final int MSG_PRINTERS_REMOVED = 2;
|
||||
public static final int MSG_DISPATCH_PRINTERS_ADDED = 3;
|
||||
public static final int MSG_DISPATCH_PRINTERS_REMOVED = 4;
|
||||
public static final int MSG_DISPATCH_PRINTERS_UPDATED = 5;
|
||||
|
||||
public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 6;
|
||||
public static final int MSG_START_PRINTER_DISCOVERY = 7;
|
||||
public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 8;
|
||||
public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 9;
|
||||
public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 10;
|
||||
public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 11;
|
||||
public static final int MSG_VALIDATE_PRINTERS = 12;
|
||||
public static final int MSG_START_PRINTER_STATE_TRACKING = 13;
|
||||
public static final int MSG_STOP_PRINTER_STATE_TRACKING = 14;
|
||||
public static final int MSG_CREATE_PRINTER_DISCOVERY_SESSION = 5;
|
||||
public static final int MSG_START_PRINTER_DISCOVERY = 6;
|
||||
public static final int MSG_DISPATCH_CREATE_PRINTER_DISCOVERY_SESSION = 7;
|
||||
public static final int MSG_DISPATCH_DESTROY_PRINTER_DISCOVERY_SESSION = 8;
|
||||
public static final int MSG_DISPATCH_START_PRINTER_DISCOVERY = 9;
|
||||
public static final int MSG_DISPATCH_STOP_PRINTER_DISCOVERY = 10;
|
||||
public static final int MSG_VALIDATE_PRINTERS = 11;
|
||||
public static final int MSG_START_PRINTER_STATE_TRACKING = 12;
|
||||
public static final int MSG_STOP_PRINTER_STATE_TRACKING = 13;
|
||||
|
||||
SessionHandler(Looper looper) {
|
||||
super(looper, null, false);
|
||||
@@ -1048,11 +975,6 @@ final class UserState implements PrintSpoolerCallbacks {
|
||||
handleDispatchPrintersRemoved(removedPrinterIds);
|
||||
} break;
|
||||
|
||||
case MSG_DISPATCH_PRINTERS_UPDATED: {
|
||||
List<PrinterInfo> updatedPrinters = (List<PrinterInfo>) message.obj;
|
||||
handleDispatchPrintersUpdated(updatedPrinters);
|
||||
} break;
|
||||
|
||||
case MSG_CREATE_PRINTER_DISCOVERY_SESSION: {
|
||||
RemotePrintService service = (RemotePrintService) message.obj;
|
||||
service.createPrinterDiscoverySession();
|
||||
|
||||
Reference in New Issue
Block a user