Add USB printer notification for configuration required message

This change introduces a notification that will be displayed when a
user plugs in a USB printer that requires manual configuration. Clicking
the notification will open CrOS settings so the user can manually
configure the printer.
- Subsequent CL will call ShowConfigurationNotification() to show the
notification.

Bug: 951139
Change-Id: Ibff4d415de9c3ccf8eda45f470cfa30513468bb2
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1606193
Reviewed-by: Lei Zhang <[email protected]>
Reviewed-by: Zentaro Kavanagh <[email protected]>
Commit-Queue: Lei Zhang <[email protected]>
Auto-Submit: Bailey Berro <[email protected]>
Cr-Commit-Position: refs/heads/master@{#661038}
diff --git a/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc b/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc
index 78a4b35..4e8dd7a 100644
--- a/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc
+++ b/chrome/browser/chromeos/printing/automatic_usb_printer_configurer_unittest.cc
@@ -142,6 +142,10 @@
     NOTIMPLEMENTED();
   }
 
+  void ShowConfigurationNotification(const Printer& printer) override {
+    NOTIMPLEMENTED();
+  }
+
   void RemoveNotification(const std::string& printer_id) override {
     open_notifications_.erase(printer_id);
   }
diff --git a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
index b9c73fd..6175e63c 100644
--- a/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
+++ b/chrome/browser/chromeos/printing/cups_printers_manager_unittest.cc
@@ -306,6 +306,9 @@
   void ShowEphemeralNotification(const Printer& printer) override {
     NOTIMPLEMENTED();
   }
+  void ShowConfigurationNotification(const Printer& printer) override {
+    NOTIMPLEMENTED();
+  }
   void ShowSavedNotification(const Printer& printer) override {
     open_notifications_.insert(printer.id());
   }
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification.cc b/chrome/browser/chromeos/printing/usb_printer_notification.cc
index 4f77464..e0d4ea1 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_notification.cc
@@ -11,6 +11,9 @@
 #include "chrome/browser/notifications/notification_display_service.h"
 #include "chrome/browser/notifications/notification_handler.h"
 #include "chrome/browser/profiles/profile.h"
+#include "chrome/browser/ui/chrome_pages.h"
+#include "chrome/browser/ui/settings_window_manager_chromeos.h"
+#include "chrome/common/webui_url_constants.h"
 #include "chrome/grit/generated_resources.h"
 #include "ui/base/l10n/l10n_util.h"
 #include "ui/gfx/image/image.h"
@@ -77,6 +80,13 @@
   if (!button_index) {
     // Body of notification clicked.
     visible_ = false;
+    if (type_ == Type::kConfigurationRequired) {
+      auto* const settings_manager =
+          chrome::SettingsWindowManager::GetInstance();
+      settings_manager->ShowChromePageForProfile(
+          profile_,
+          chrome::GetSettingsUrl(chrome::kNativePrintingSettingsSubPage));
+    }
     return;
   }
 
@@ -101,6 +111,13 @@
           IDS_USB_PRINTER_NOTIFICATION_CONNECTED_MESSAGE,
           base::UTF8ToUTF16(printer_.display_name())));
       return;
+    case Type::kConfigurationRequired:
+      notification_->set_title(l10n_util::GetStringUTF16(
+          IDS_USB_PRINTER_NOTIFICATION_CONFIGURATION_REQUIRED_TITLE));
+      notification_->set_message(l10n_util::GetStringFUTF16(
+          IDS_USB_PRINTER_NOTIFICATION_CONFIGURATION_REQUIRED_MESSAGE,
+          base::UTF8ToUTF16(printer_.display_name())));
+      return;
   }
   NOTREACHED();
 }
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification.h b/chrome/browser/chromeos/printing/usb_printer_notification.h
index f0a2161f..fc11849b 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification.h
+++ b/chrome/browser/chromeos/printing/usb_printer_notification.h
@@ -26,7 +26,7 @@
 // according to its state and respond to the user's action.
 class UsbPrinterNotification : public message_center::NotificationObserver {
  public:
-  enum class Type { kEphemeral, kSaved };
+  enum class Type { kEphemeral, kSaved, kConfigurationRequired };
 
   UsbPrinterNotification(const Printer& printer,
                          const std::string& notification_id,
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc b/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
index 154b95f..5b55bb2 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
+++ b/chrome/browser/chromeos/printing/usb_printer_notification_controller.cc
@@ -19,17 +19,7 @@
   ~UsbPrinterNotificationControllerImpl() override = default;
 
   void ShowEphemeralNotification(const Printer& printer) override {
-    if (!base::FeatureList::IsEnabled(features::kStreamlinedUsbPrinterSetup)) {
-      return;
-    }
-
-    if (base::ContainsKey(notifications_, printer.id())) {
-      return;
-    }
-
-    notifications_[printer.id()] = std::make_unique<UsbPrinterNotification>(
-        printer, GetUniqueNotificationId(),
-        UsbPrinterNotification::Type::kEphemeral, profile_);
+    ShowNotification(printer, UsbPrinterNotification::Type::kEphemeral);
   }
 
   void RemoveNotification(const std::string& printer_id) override {
@@ -45,6 +35,17 @@
   }
 
   void ShowSavedNotification(const Printer& printer) override {
+    ShowNotification(printer, UsbPrinterNotification::Type::kSaved);
+  }
+
+  void ShowConfigurationNotification(const Printer& printer) override {
+    ShowNotification(printer,
+                     UsbPrinterNotification::Type::kConfigurationRequired);
+  }
+
+ private:
+  void ShowNotification(const Printer& printer,
+                        UsbPrinterNotification::Type type) {
     if (!base::FeatureList::IsEnabled(features::kStreamlinedUsbPrinterSetup)) {
       return;
     }
@@ -54,11 +55,9 @@
     }
 
     notifications_[printer.id()] = std::make_unique<UsbPrinterNotification>(
-        printer, GetUniqueNotificationId(),
-        UsbPrinterNotification::Type::kSaved, profile_);
+        printer, GetUniqueNotificationId(), type, profile_);
   }
 
- private:
   std::string GetUniqueNotificationId() {
     return base::StringPrintf("usb_printer_notification_%d",
                               next_notification_id_++);
diff --git a/chrome/browser/chromeos/printing/usb_printer_notification_controller.h b/chrome/browser/chromeos/printing/usb_printer_notification_controller.h
index 7b33be85..776c0f9 100644
--- a/chrome/browser/chromeos/printing/usb_printer_notification_controller.h
+++ b/chrome/browser/chromeos/printing/usb_printer_notification_controller.h
@@ -33,6 +33,10 @@
   // is already an existing notification for |printer|.
   virtual void ShowSavedNotification(const Printer& printer) = 0;
 
+  // Creates a notification for a printer that needs configuration. This is a
+  // no-op if there is already an existing notification for |printer|.
+  virtual void ShowConfigurationNotification(const Printer& printer) = 0;
+
   // Closes the notification for |printer_id|. This is a no-op if the
   // notification has already been closed by the user.
   virtual void RemoveNotification(const std::string& printer_id) = 0;