| Index: chrome/browser/printing/printing_message_filter.cc | 
| diff --git a/chrome/browser/printing/printing_message_filter.cc b/chrome/browser/printing/printing_message_filter.cc | 
| index 35b4074328de8ba4ec5e2cdce26e9c18c0654bf4..2f8eb10c290696ece85acdab78b1b276a1f3e919 100644 | 
| --- a/chrome/browser/printing/printing_message_filter.cc | 
| +++ b/chrome/browser/printing/printing_message_filter.cc | 
| @@ -32,6 +32,12 @@ | 
| #include "chrome/browser/printing/print_dialog_cloud.h" | 
| #endif | 
|  | 
| +#if defined(OS_ANDROID) | 
| +#include "base/strings/string_number_conversions.h" | 
| +#include "chrome/browser/printing/print_view_manager_basic.h" | 
| +#include "printing/printing_context_android.h" | 
| +#endif | 
| + | 
| using content::BrowserThread; | 
|  | 
| namespace { | 
| @@ -100,6 +106,11 @@ void PrintingMessageFilter::OverrideThreadForMessage( | 
| message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) { | 
| *thread = BrowserThread::FILE; | 
| } | 
| +#elif defined(OS_ANDROID) | 
| +  if (message.type() == PrintHostMsg_AllocateTempFileForPrinting::ID || | 
| +      message.type() == PrintHostMsg_TempFileForPrintingWritten::ID) { | 
| +    *thread = BrowserThread::UI; | 
| +  } | 
| #endif | 
| } | 
|  | 
| @@ -110,7 +121,7 @@ bool PrintingMessageFilter::OnMessageReceived(const IPC::Message& message, | 
| #if defined(OS_WIN) | 
| IPC_MESSAGE_HANDLER(PrintHostMsg_DuplicateSection, OnDuplicateSection) | 
| #endif | 
| -#if defined(OS_CHROMEOS) | 
| +#if defined(OS_CHROMEOS) || defined(OS_ANDROID) | 
| IPC_MESSAGE_HANDLER(PrintHostMsg_AllocateTempFileForPrinting, | 
| OnAllocateTempFileForPrinting) | 
| IPC_MESSAGE_HANDLER(PrintHostMsg_TempFileForPrintingWritten, | 
| @@ -141,9 +152,13 @@ void PrintingMessageFilter::OnDuplicateSection( | 
| } | 
| #endif | 
|  | 
| -#if defined(OS_CHROMEOS) | 
| +#if defined(OS_CHROMEOS) || defined(OS_ANDROID) | 
| void PrintingMessageFilter::OnAllocateTempFileForPrinting( | 
| -    base::FileDescriptor* temp_file_fd, int* sequence_number) { | 
| +    int render_view_id, | 
| +    base::FileDescriptor* temp_file_fd, | 
| +    int* sequence_number) { | 
| +#if defined(OS_CHROMEOS) | 
| +  // TODO(thestig): Use |render_view_id| for Chrome OS. | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| temp_file_fd->fd = *sequence_number = -1; | 
| temp_file_fd->auto_close = false; | 
| @@ -166,10 +181,23 @@ void PrintingMessageFilter::OnAllocateTempFileForPrinting( | 
| } | 
| } | 
| } | 
| +#elif defined(OS_ANDROID) | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | 
| +  printing::PrintViewManagerBasic* print_view_manager = | 
| +      printing::PrintViewManagerBasic::FromWebContents(wc); | 
| +  // The file descriptor is originally created in & passed from the Android | 
| +  // side, and it will handle the closing. | 
| +  const base::FileDescriptor& file_descriptor = | 
| +      print_view_manager->file_descriptor(); | 
| +  temp_file_fd->fd = file_descriptor.fd; | 
| +  temp_file_fd->auto_close = false; | 
| +#endif | 
| } | 
|  | 
| void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id, | 
| int sequence_number) { | 
| +#if defined(OS_CHROMEOS) | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::FILE)); | 
| SequenceToPathMap* map = &g_printing_file_descriptor_map.Get().map; | 
| SequenceToPathMap::iterator it = map->find(sequence_number); | 
| @@ -185,8 +213,21 @@ void PrintingMessageFilter::OnTempFileForPrintingWritten(int render_view_id, | 
|  | 
| // Erase the entry in the map. | 
| map->erase(it); | 
| +#elif defined(OS_ANDROID) | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | 
| +  printing::PrintViewManagerBasic* print_view_manager = | 
| +      printing::PrintViewManagerBasic::FromWebContents(wc); | 
| +  const base::FileDescriptor& file_descriptor = | 
| +      print_view_manager->file_descriptor(); | 
| +  printing::PrintingContextAndroid::PdfWritingDone(file_descriptor.fd, true); | 
| +  // Invalidate the file descriptor so it doesn't accidentally get reused. | 
| +  print_view_manager->set_file_descriptor(base::FileDescriptor(-1, false)); | 
| +#endif | 
| } | 
| +#endif  // defined(OS_CHROMEOS) || defined(OS_ANDROID) | 
|  | 
| +#if defined(OS_CHROMEOS) | 
| void PrintingMessageFilter::CreatePrintDialogForFile( | 
| int render_view_id, | 
| const base::FilePath& path) { | 
| @@ -332,12 +373,32 @@ void PrintingMessageFilter::OnScriptedPrintReply( | 
| PrintHostMsg_ScriptedPrint::WriteReplyParams(reply_msg, params); | 
| Send(reply_msg); | 
| if (params.params.dpi && params.params.document_cookie) { | 
| +#if defined(OS_ANDROID) | 
| +    int file_descriptor; | 
| +    const string16& device_name = printer_query->settings().device_name(); | 
| +    if (base::StringToInt(device_name, &file_descriptor)) { | 
| +      BrowserThread::PostTask( | 
| +          BrowserThread::UI, FROM_HERE, | 
| +          base::Bind(&PrintingMessageFilter::UpdateFileDescriptor, this, | 
| +                     reply_msg->routing_id(), file_descriptor)); | 
| +    } | 
| +#endif | 
| print_job_manager_->QueuePrinterQuery(printer_query.get()); | 
| } else { | 
| printer_query->StopWorker(); | 
| } | 
| } | 
|  | 
| +#if defined(OS_ANDROID) | 
| +void PrintingMessageFilter::UpdateFileDescriptor(int render_view_id, int fd) { | 
| +  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
| +  content::WebContents* wc = GetWebContentsForRenderView(render_view_id); | 
| +  printing::PrintViewManagerBasic* print_view_manager = | 
| +      printing::PrintViewManagerBasic::FromWebContents(wc); | 
| +  print_view_manager->set_file_descriptor(base::FileDescriptor(fd, false)); | 
| +} | 
| +#endif | 
| + | 
| void PrintingMessageFilter::OnUpdatePrintSettings( | 
| int document_cookie, const DictionaryValue& job_settings, | 
| IPC::Message* reply_msg) { | 
|  |