diff --git a/chrome/android/java/src/org/chromium/chrome/browser/printing/PrintingControllerFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/printing/PrintingControllerFactory.java index 03b1198d2cda70..bc9fdf1f1414d2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/printing/PrintingControllerFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/printing/PrintingControllerFactory.java @@ -5,13 +5,10 @@ package org.chromium.chrome.browser.printing; import android.app.Activity; -import android.content.Context; -import android.print.PrintManager; import org.chromium.base.ApiCompatibilityUtils; import org.chromium.chrome.R; import org.chromium.printing.PrintDocumentAdapterWrapper; -import org.chromium.printing.PrintManagerDelegateImpl; import org.chromium.printing.PrintingController; import org.chromium.printing.PrintingControllerImpl; @@ -26,11 +23,8 @@ public static PrintingController create(Activity activity) { String defaultJobTitle = activity.getResources().getString(R.string.menu_print); TabPrinter.setDefaultTitle(defaultJobTitle); - PrintManager printManager = - (PrintManager) activity.getSystemService(Context.PRINT_SERVICE); String errorText = activity.getResources().getString(R.string.error_printing_failed); - return PrintingControllerImpl.create(new PrintManagerDelegateImpl(printManager), - new PrintDocumentAdapterWrapper(), errorText); + return PrintingControllerImpl.create(new PrintDocumentAdapterWrapper(), errorText); } return null; } diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java index 1355051ba31e41..8d730ce3f6a1b1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java @@ -142,21 +142,11 @@ public void onLayoutFinished(PrintDocumentInfo info, boolean changed) { private PrintingControllerImpl createControllerOnUiThread() { try { - final PrintManagerDelegate mockPrintManagerDelegate = new PrintManagerDelegate() { - @Override - public void print(String printJobName, - PrintDocumentAdapter documentAdapter, - PrintAttributes attributes) { - // Do nothing, as we will emulate the framework call sequence within the test. - } - }; - final FutureTask task = new FutureTask(new Callable() { @Override public PrintingControllerImpl call() throws Exception { return (PrintingControllerImpl) PrintingControllerImpl.create( - mockPrintManagerDelegate, new PrintDocumentAdapterWrapper(), PRINT_JOB_NAME); } @@ -174,10 +164,19 @@ public PrintingControllerImpl call() throws Exception { private void startControllerOnUiThread(final PrintingControllerImpl controller, final TestShellTab tab) { try { + final PrintManagerDelegate mockPrintManagerDelegate = new PrintManagerDelegate() { + @Override + public void print(String printJobName, + PrintDocumentAdapter documentAdapter, + PrintAttributes attributes) { + // Do nothing, as we will emulate the framework call sequence within the test. + } + }; + runTestOnUiThread(new Runnable() { @Override public void run() { - controller.startPrint(new TabPrinter(tab)); + controller.startPrint(new TabPrinter(tab), mockPrintManagerDelegate); } }); } catch (Throwable e) { diff --git a/chrome/android/shell/java/src/org/chromium/chrome/shell/ChromeShellActivity.java b/chrome/android/shell/java/src/org/chromium/chrome/shell/ChromeShellActivity.java index b971d526464272..b31617bf6507eb 100644 --- a/chrome/android/shell/java/src/org/chromium/chrome/shell/ChromeShellActivity.java +++ b/chrome/android/shell/java/src/org/chromium/chrome/shell/ChromeShellActivity.java @@ -33,6 +33,7 @@ import org.chromium.content.browser.BrowserStartupController; import org.chromium.content.browser.ContentView; import org.chromium.content.browser.DeviceUtils; +import org.chromium.printing.PrintManagerDelegateImpl; import org.chromium.printing.PrintingController; import org.chromium.sync.signin.ChromeSigninController; import org.chromium.ui.base.ActivityWindowAndroid; @@ -248,7 +249,8 @@ public boolean onOptionsItemSelected(MenuItem item) { return true; case R.id.print: if (getActiveTab() != null) { - mPrintingController.startPrint(new TabPrinter(getActiveTab())); + mPrintingController.startPrint(new TabPrinter(getActiveTab()), + new PrintManagerDelegateImpl(this)); } return true; case R.id.distill_page: diff --git a/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java b/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java index 99422a4ab5246b..5fd6406bffd44c 100644 --- a/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java +++ b/printing/android/java/src/org/chromium/printing/PrintManagerDelegateImpl.java @@ -4,6 +4,7 @@ package org.chromium.printing; +import android.content.Context; import android.print.PrintAttributes; import android.print.PrintDocumentAdapter; import android.print.PrintManager; @@ -14,8 +15,8 @@ public class PrintManagerDelegateImpl implements PrintManagerDelegate { private final PrintManager mPrintManager; - public PrintManagerDelegateImpl(PrintManager printManager) { - mPrintManager = printManager; + public PrintManagerDelegateImpl(Context context) { + mPrintManager = (PrintManager) context.getSystemService(Context.PRINT_SERVICE); } @Override diff --git a/printing/android/java/src/org/chromium/printing/PrintingController.java b/printing/android/java/src/org/chromium/printing/PrintingController.java index eab84724e3fc12..92be96820b90d8 100644 --- a/printing/android/java/src/org/chromium/printing/PrintingController.java +++ b/printing/android/java/src/org/chromium/printing/PrintingController.java @@ -39,13 +39,19 @@ public interface PrintingController { */ int[] getPageNumbers(); + /** + * @return If the controller is busy. + */ + public boolean isBusy(); + /** * Initiates the printing process for the Android API. * * @param printable An object capable of starting native side PDF generation, i.e. typically * a Tab. + * @param printManager The print manager that manages the print job. */ - void startPrint(final Printable printable); + void startPrint(final Printable printable, PrintManagerDelegate printManager); /** * This method is called by the native side to signal PDF writing process is completed. diff --git a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java index 76bab4b4124f0d..b0daaeffb1266a 100644 --- a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java +++ b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java @@ -45,8 +45,6 @@ public class PrintingControllerImpl implements PrintingController, PdfGenerator private final String mErrorMessage; - private final PrintManagerDelegate mPrintManager; - private PrintingContextInterface mPrintingContext; /** The file descriptor into which the PDF will be written. Provided by the framework. */ @@ -86,10 +84,10 @@ public class PrintingControllerImpl implements PrintingController, PdfGenerator /** Total number of pages to print with initial print dialog settings. */ private int mLastKnownMaxPages = PrintDocumentInfo.PAGE_COUNT_UNKNOWN; - private PrintingControllerImpl(PrintManagerDelegate printManager, - PrintDocumentAdapterWrapper printDocumentAdapterWrapper, + private boolean mIsBusy = false; + + private PrintingControllerImpl(PrintDocumentAdapterWrapper printDocumentAdapterWrapper, String errorText) { - mPrintManager = printManager; mErrorMessage = errorText; mPrintDocumentAdapterWrapper = printDocumentAdapterWrapper; mPrintDocumentAdapterWrapper.setPdfGenerator(this); @@ -107,13 +105,12 @@ private PrintingControllerImpl(PrintManagerDelegate printManager, * doesn't need any string dependency. * @return The resulting PrintingController. */ - public static PrintingController create(PrintManagerDelegate printManager, + public static PrintingController create( PrintDocumentAdapterWrapper printDocumentAdapterWrapper, String errorText) { ThreadUtils.assertOnUiThread(); if (sInstance == null) { - sInstance = new PrintingControllerImpl(printManager, - printDocumentAdapterWrapper, errorText); + sInstance = new PrintingControllerImpl(printDocumentAdapterWrapper, errorText); } return sInstance; } @@ -160,15 +157,22 @@ public int[] getPageNumbers() { return mPages == null ? null : mPages.clone(); } + @Override + public boolean isBusy() { + return mIsBusy; + } + @Override public void setPrintingContext(final PrintingContextInterface printingContext) { mPrintingContext = printingContext; } @Override - public void startPrint(final Printable printable) { + public void startPrint(final Printable printable, PrintManagerDelegate printManager) { + if (mIsBusy) return; + mIsBusy = true; mPrintable = printable; - mPrintDocumentAdapterWrapper.print(mPrintManager, printable.getTitle()); + mPrintDocumentAdapterWrapper.print(printManager, printable.getTitle()); } @Override @@ -323,6 +327,9 @@ public void onFinish() { mFileDescriptor = -1; resetCallbacks(); + // The printmanager contract is that onFinish() is always called as the last + // callback. We set busy to false here. + mIsBusy = false; } private void resetCallbacks() {