15d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// Copyright 2013 The Chromium Authors. All rights reserved.
25d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// Use of this source code is governed by a BSD-style license that can be
35d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun// found in the LICENSE file.
45d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
55d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "android_webview/native/aw_pdf_exporter.h"
6f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun
7f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "android_webview/browser/browser_view_renderer.h"
8f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "android_webview/browser/renderer_host/print_manager.h"
95d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "base/android/jni_android.h"
105d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "base/logging.h"
115d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "content/public/browser/browser_thread.h"
12f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "content/public/browser/web_contents.h"
135d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun#include "jni/AwPdfExporter_jni.h"
14f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "printing/units.h"
15f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun#include "printing/print_settings.h"
165d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
175d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunusing base::android::AttachCurrentThread;
185d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunusing base::android::ScopedJavaGlobalRef;
195d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunusing content::BrowserThread;
20f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing content::WebContents;
21f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing printing::ConvertUnitDouble;
22f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing printing::PageMargins;
23f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunusing printing::PrintSettings;
245d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
255d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunnamespace android_webview {
265d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
275d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim GurunAwPdfExporter::AwPdfExporter(JNIEnv* env,
285d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun                             jobject obj,
29f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                             BrowserViewRenderer* view_renderer,
30f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                             WebContents* web_contents)
315d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun    : java_ref_(env, obj),
325d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun      view_renderer_(view_renderer),
33f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      web_contents_(web_contents) {
345d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
355d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  DCHECK(obj);
365d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  Java_AwPdfExporter_setNativeAwPdfExporter(
375d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun      env, obj, reinterpret_cast<jint>(this));
385d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
395d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
405d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim GurunAwPdfExporter::~AwPdfExporter() {
415d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  JNIEnv* env = AttachCurrentThread();
425d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
435d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  if (obj.is_null())
445d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun    return;
455d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  // Clear the Java peer's weak pointer to |this| object.
465d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  Java_AwPdfExporter_setNativeAwPdfExporter(env, obj.obj(), 0);
475d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
485d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
495d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunvoid AwPdfExporter::ExportToPdf(JNIEnv* env,
505d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun                                jobject obj,
51f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                                int fd,
525d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun                                jobject cancel_signal) {
535d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI));
54f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  CreatePdfSettings(env, obj);
55f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  print_manager_.reset(
56f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      new PrintManager(web_contents_, print_settings_.get(), fd, this));
57f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  if (!print_manager_->PrintNow())
58f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun    DidExportPdf(false);
595d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
605d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
61f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunnamespace {
62f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun// Converts from 1/1000 of inches to device units using DPI.
63f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunint MilsToDots(int val, int dpi) {
64f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  return static_cast<int>(ConvertUnitDouble(val, 1000.0, dpi));
65f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun}
665d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
67f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun}  // anonymous namespace
68f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun
69f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunvoid AwPdfExporter::CreatePdfSettings(JNIEnv* env, jobject obj) {
70f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  print_settings_.reset(new PrintSettings);
71f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  int dpi = Java_AwPdfExporter_getDpi(env, obj);
72f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  int width = Java_AwPdfExporter_getPageWidth(env, obj);
73f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  int height = Java_AwPdfExporter_getPageHeight(env, obj);
74f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  gfx::Size physical_size_device_units;
75f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  int width_in_dots = MilsToDots(width, dpi);
76f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  int height_in_dots = MilsToDots(height, dpi);
77f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  physical_size_device_units.SetSize(width_in_dots, height_in_dots);
78f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun
79f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  gfx::Rect printable_area_device_units;
80f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  // Assume full page is printable for now.
81f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  printable_area_device_units.SetRect(0, 0, width_in_dots, height_in_dots);
82f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun
83f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  print_settings_->set_dpi(dpi);
84f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  print_settings_->SetPrinterPrintableArea(physical_size_device_units,
85f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                                           printable_area_device_units,
86f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun                                           dpi);
87f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun
88f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  PageMargins margins;
89f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  margins.left =
90f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      MilsToDots(Java_AwPdfExporter_getLeftMargin(env, obj), dpi);
91f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  margins.right =
92f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      MilsToDots(Java_AwPdfExporter_getRightMargin(env, obj), dpi);
93f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  margins.top =
94f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      MilsToDots(Java_AwPdfExporter_getTopMargin(env, obj), dpi);
95f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  margins.bottom =
96f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun      MilsToDots(Java_AwPdfExporter_getBottomMargin(env, obj), dpi);
97f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  print_settings_->SetCustomMargins(margins);
985d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
995d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
100f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunvoid AwPdfExporter::DidExportPdf(bool success) {
1015d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  JNIEnv* env = AttachCurrentThread();
1025d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  ScopedJavaLocalRef<jobject> obj = java_ref_.get(env);
1035d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  if (obj.is_null())
1045d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun    return;
105f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  Java_AwPdfExporter_didExportPdf(env, obj.obj(), success);
106f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun}
107f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun
108f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurunbool AwPdfExporter::IsCancelled() {
109f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  // TODO(sgurun) implement
110f466d2a0332c0853e69efff71f2979b31e357eddSelim Gurun  return false;
1115d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
1125d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
1135d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurunbool RegisterAwPdfExporter(JNIEnv* env) {
1145d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun  return RegisterNativesImpl(env) >= 0;
1155d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}
1165d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun
1175d5be6dc8a24d729a037d5b76e0d1fa711ece471Selim Gurun}  // namespace android_webview
118