Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(126)

Unified Diff: printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java

Issue 63483007: Refactor Android printing code to make it more testable. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add license to PrintingControllerFactory Created 7 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
diff --git a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
index 34c4dc404c16b884d7c9f43217df96cd21e5a601..ccd297c9708d19a09eafed40cb61b51713e838a2 100644
--- a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
+++ b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
@@ -4,11 +4,13 @@
package org.chromium.printing;
-import android.content.Context;
+import org.chromium.base.ThreadUtils;
+
+import android.annotation.SuppressLint;
+import android.os.Build;
import android.os.Bundle;
import android.os.CancellationSignal;
import android.os.ParcelFileDescriptor;
-import android.os.CancellationSignal.OnCancelListener;
import android.print.PageRange;
import android.print.PrintAttributes;
import android.print.PrintAttributes.MediaSize;
@@ -17,15 +19,10 @@ import android.print.PrintDocumentAdapter;
import android.print.PrintDocumentAdapter.LayoutResultCallback;
import android.print.PrintDocumentAdapter.WriteResultCallback;
import android.print.PrintDocumentInfo;
-import android.print.PrintJob;
-import android.print.PrintManager;
-import android.util.Log;
import java.io.IOException;
import java.util.ArrayList;
-import java.util.Arrays;
import java.util.Iterator;
-import java.util.List;
/**
* Controls the interactions with Android framework related to printing.
@@ -35,15 +32,26 @@ import java.util.List;
* print button. The singleton object lives in UI thread. Interaction with the native side is
* carried through PrintingContext class.
*/
-class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingController {
+public class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingController {
private static final String LOG_TAG = "PrintingControllerImpl";
- private static final String PDF_FILE_NAME = "chrome_print_document.pdf";
+ /**
+ * This is used for both initial state and a completed state (i.e. starting from either
+ * onLayout or onWrite, a PDF generation cycle is completed another new one can safely start).
+ */
+ private static final int PRINTING_STATE_READY = 0;
+ private static final int PRINTING_STATE_STARTED_FROM_ONLAYOUT = 1;
+ private static final int PRINTING_STATE_STARTED_FROM_ONWRITE = 2;
+ /** Printing dialog has been dismissed and cleanup has been done. */
+ private static final int PRINTING_STATE_FINISHED = 3;
+
+ /** The singleton instance for this class. */
+ private static PrintingController sInstance;
- private String mErrorMessage;
+ private final String mErrorMessage;
- private final PrintManager mPrintManager;
+ private final PrintManagerDelegate mPrintManager;
private PrintingContextInterface mPrintingContext;
@@ -73,16 +81,6 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
/** The object through which native PDF generation process is initiated. */
private Printable mPrintable;
- /**
- * This is used for both initial state and a completed state (i.e. starting from either
- * onLayout or onWrite, a PDF generation cycle is completed another new one can safely start).
- */
- private final static int PRINTING_STATE_READY = 0;
- private final static int PRINTING_STATE_STARTED_FROM_ONLAYOUT = 1;
- private final static int PRINTING_STATE_STARTED_FROM_ONWRITE = 2;
- /** Printing dialog has been dismissed and cleanup has been done. */
- private final static int PRINTING_STATE_FINISHED = 3;
-
private int mPrintingState = PRINTING_STATE_READY;
/** Whether layouting parameters have been changed to require a new PDF generation. */
@@ -91,18 +89,54 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
/** Total number of pages to print with initial print dialog settings. */
private int mLastKnownMaxPages = PrintDocumentInfo.PAGE_COUNT_UNKNOWN;
- PrintingControllerImpl(final Context context) {
- mPrintManager = (PrintManager) context.getSystemService(Context.PRINT_SERVICE);
+ private PrintingControllerImpl(PrintManagerDelegate printManager, String errorText) {
+ mPrintManager = printManager;
+ mErrorMessage = errorText;
}
- @Override
- public boolean hasPrintingFinished() {
- return mPrintingState == PRINTING_STATE_FINISHED;
+ /**
+ * Creates a controller for handling printing with the framework.
+ *
+ * The controller is a singleton, since there can be only one printing action at any time.
+ *
+ * @param errorText The error message to be shown to user in case something goes wrong in PDF
+ * generation in Chromium. We pass it here as a string so src/printing/android
+ * doesn't need any string dependency.
+ * @return The resulting PrintingController.
+ */
+ public static PrintingController create(PrintManagerDelegate printManager,
+ String errorText) {
+ ThreadUtils.assertOnUiThread();
+
+ if (sInstance == null) {
+ sInstance = new PrintingControllerImpl(printManager, errorText);
+ }
+ return sInstance;
+ }
+
+ /**
+ * Returns the singleton instance, created by the {@link PrintingControllerImpl#create}.
+ *
+ * This method must be called once {@link PrintingControllerImpl#create} is called, and always
+ * thereafter.
+ *
+ * @return The singleton instance.
+ */
+ public static PrintingController getInstance() {
+ return sInstance;
+ }
+
+ /**
+ * @return True if the running version of the Android supports printing.
+ */
+ @SuppressLint("InlinedApi")
+ public static boolean isPrintingSupported() {
+ return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT;
}
@Override
- public void setErrorText(final String errorText) {
- mErrorMessage = errorText;
+ public boolean hasPrintingFinished() {
+ return mPrintingState == PRINTING_STATE_FINISHED;
}
@Override
@@ -127,7 +161,7 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
@Override
public int[] getPageNumbers() {
- return mPages;
+ return mPages.clone();
}
@Override
@@ -203,8 +237,7 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
mLastKnownMaxPages = maxPages;
}
if (mPrintingState == PRINTING_STATE_STARTED_FROM_ONLAYOUT) {
- // TODO(cimamoglu): Choose a meaningful filename.
- PrintDocumentInfo info = new PrintDocumentInfo.Builder(PDF_FILE_NAME)
+ PrintDocumentInfo info = new PrintDocumentInfo.Builder(mPrintable.getTitle())
.setContentType(PrintDocumentInfo.CONTENT_TYPE_DOCUMENT)
.setPageCount(mLastKnownMaxPages)
.build();
@@ -299,7 +332,7 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
mOnLayoutCallback = null;
}
- private void closeFileDescriptor(int fd) {
+ private static void closeFileDescriptor(int fd) {
if (fd != -1) return;
ParcelFileDescriptor fileDescriptor = ParcelFileDescriptor.adoptFd(fd);
if (fileDescriptor != null) {
@@ -311,7 +344,7 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
}
}
- private PageRange[] convertIntegerArrayToPageRanges(int[] pagesArray) {
+ private static PageRange[] convertIntegerArrayToPageRanges(int[] pagesArray) {
PageRange[] pageRanges;
if (pagesArray != null) {
pageRanges = new PageRange[pagesArray.length];
@@ -329,7 +362,7 @@ class PrintingControllerImpl extends PrintDocumentAdapter implements PrintingCon
/**
* Gets an array of page ranges and returns an array of integers with all ranges expanded.
*/
- private int[] normalizeRanges(final PageRange[] ranges) {
+ private static int[] normalizeRanges(final PageRange[] ranges) {
// Expand ranges into a list of individual numbers.
ArrayList<Integer> pages = new ArrayList<Integer>();
for (PageRange range : ranges) {
« no previous file with comments | « printing/android/java/src/org/chromium/printing/PrintingControllerFactory.java ('k') | printing/printing_context_android.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698