cros: Launch the Account Access help app from "Learn more" button.

Bug: 863620
Change-Id: Id15fc12e23ca4fd51b92454d27d87133120aee82
Reviewed-on: https://chromium-review.googlesource.com/1157249
Reviewed-by: Daniel Cheng <dcheng@chromium.org>
Reviewed-by: Mitsuru Oshima <oshima@chromium.org>
Reviewed-by: Jacob Dufault <jdufault@chromium.org>
Commit-Queue: Quan Nguyen <qnnguyen@chromium.org>
Cr-Commit-Position: refs/heads/master@{#580332}
diff --git a/ash/login/login_screen_controller.cc b/ash/login/login_screen_controller.cc
index 7f52f9a..38d36f18 100644
--- a/ash/login/login_screen_controller.cc
+++ b/ash/login/login_screen_controller.cc
@@ -440,6 +440,10 @@
   login_screen_client_->ShowResetScreen();
 }
 
+void LoginScreenController::ShowAccountAccessHelpApp() {
+  login_screen_client_->ShowAccountAccessHelpApp();
+}
+
 void LoginScreenController::DoAuthenticateUser(const AccountId& account_id,
                                                const std::string& password,
                                                bool authenticated_by_pin,
diff --git a/ash/login/login_screen_controller.h b/ash/login/login_screen_controller.h
index 3aa7d02..4e70e5e 100644
--- a/ash/login/login_screen_controller.h
+++ b/ash/login/login_screen_controller.h
@@ -85,6 +85,7 @@
   void LaunchKioskApp(const std::string& app_id);
   void LaunchArcKioskApp(const AccountId& account_id);
   void ShowResetScreen();
+  void ShowAccountAccessHelpApp();
 
   // Add or remove an observer.
   void AddObserver(LoginScreenControllerObserver* observer);
diff --git a/ash/login/mock_login_screen_client.h b/ash/login/mock_login_screen_client.h
index ad7594b..a2a9097 100644
--- a/ash/login/mock_login_screen_client.h
+++ b/ash/login/mock_login_screen_client.h
@@ -71,6 +71,7 @@
   MOCK_METHOD1(LaunchKioskApp, void(const std::string& app_id));
   MOCK_METHOD1(LaunchArcKioskApp, void(const AccountId& account_id));
   MOCK_METHOD0(ShowResetScreen, void());
+  MOCK_METHOD0(ShowAccountAccessHelpApp, void());
 
  private:
   bool authenticate_user_callback_result_ = true;
diff --git a/ash/login/ui/lock_contents_view.cc b/ash/login/ui/lock_contents_view.cc
index d05f793e..2fc8ba1 100644
--- a/ash/login/ui/lock_contents_view.cc
+++ b/ash/login/ui/lock_contents_view.cc
@@ -128,7 +128,7 @@
   }
 
   void ButtonPressed(Button* sender, const ui::Event& event) override {
-    // TODO(qnnguyen): Launch the help app for signin trouble.
+    Shell::Get()->login_screen_controller()->ShowAccountAccessHelpApp();
   }
 };
 
diff --git a/ash/public/interfaces/login_screen.mojom b/ash/public/interfaces/login_screen.mojom
index 2b9c593..008256de 100644
--- a/ash/public/interfaces/login_screen.mojom
+++ b/ash/public/interfaces/login_screen.mojom
@@ -237,4 +237,7 @@
 
   // Show the powerwash (device reset) dialog.
   ShowResetScreen();
+
+  // Show the help app for when users have trouble signing in to their account.
+  ShowAccountAccessHelpApp();
 };
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
index ebee6661..0a413b2 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.cc
@@ -142,6 +142,8 @@
 
 void FakeLoginDisplayHost::ShowResetScreen() {}
 
+void FakeLoginDisplayHost::ShowAccountAccessHelpApp() {}
+
 void FakeLoginDisplayHost::ShowDialogForCaptivePortal() {}
 
 void FakeLoginDisplayHost::HideDialogForCaptivePortal() {}
diff --git a/chrome/browser/chromeos/login/ui/fake_login_display_host.h b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
index a6415c54..7c09a82d 100644
--- a/chrome/browser/chromeos/login/ui/fake_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/fake_login_display_host.h
@@ -66,6 +66,7 @@
   void ResyncUserData() override;
   void ShowFeedback() override;
   void ShowResetScreen() override;
+  void ShowAccountAccessHelpApp() override;
   void ShowDialogForCaptivePortal() override;
   void HideDialogForCaptivePortal() override;
   void UpdateAddUserButtonStatus() override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host.h b/chrome/browser/chromeos/login/ui/login_display_host.h
index ba21d944..00272c98 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host.h
@@ -197,6 +197,9 @@
   // Shows the powerwash dialog.
   virtual void ShowResetScreen() = 0;
 
+  // Start up the help application for trouble signin in.
+  virtual void ShowAccountAccessHelpApp() = 0;
+
   // In the views case, make the OobeUIDialogDelegate visible so that Captive
   // Portal web modal can be seen. In webui login, this should be a no-op.
   virtual void ShowDialogForCaptivePortal() = 0;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
index 1fcc680..6cdad38 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.cc
@@ -317,6 +317,12 @@
   GetOobeUI()->ForwardAccelerator(kAccelReset);
 }
 
+void LoginDisplayHostMojo::ShowAccountAccessHelpApp() {
+  scoped_refptr<HelpAppLauncher>(new HelpAppLauncher(GetNativeWindow()))
+      ->ShowHelpTopic(HelpAppLauncher::HELP_CANT_ACCESS_ACCOUNT);
+  dialog_->Show();
+}
+
 void LoginDisplayHostMojo::UpdateAddUserButtonStatus() {
   DCHECK(GetOobeUI());
   LoginScreenClient::Get()->login_screen()->SetAddUserButtonEnabled(
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
index 1591ac0..332ae3ea 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_mojo.h
@@ -93,6 +93,7 @@
   void OnCancelPasswordChangedFlow() override;
   void ShowFeedback() override;
   void ShowResetScreen() override;
+  void ShowAccountAccessHelpApp() override;
   void ShowDialogForCaptivePortal() override;
   void HideDialogForCaptivePortal() override;
   void UpdateAddUserButtonStatus() override;
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
index adb7f006..ccda02c 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.cc
@@ -1177,6 +1177,10 @@
   NOTREACHED();
 }
 
+void LoginDisplayHostWebUI::ShowAccountAccessHelpApp() {
+  NOTREACHED();
+}
+
 // This is handled differently in webui.
 void LoginDisplayHostWebUI::ShowDialogForCaptivePortal() {}
 
diff --git a/chrome/browser/chromeos/login/ui/login_display_host_webui.h b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
index 1fb0dbfd4..07e385d 100644
--- a/chrome/browser/chromeos/login/ui/login_display_host_webui.h
+++ b/chrome/browser/chromeos/login/ui/login_display_host_webui.h
@@ -81,6 +81,7 @@
   const user_manager::UserList GetUsers() override;
   void ShowFeedback() override;
   void ShowResetScreen() override;
+  void ShowAccountAccessHelpApp() override;
   void ShowDialogForCaptivePortal() override;
   void HideDialogForCaptivePortal() override;
   void UpdateAddUserButtonStatus() override;
diff --git a/chrome/browser/chromeos/login/ui/mock_login_display_host.h b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
index dbaa6e4..d7a2a39e 100644
--- a/chrome/browser/chromeos/login/ui/mock_login_display_host.h
+++ b/chrome/browser/chromeos/login/ui/mock_login_display_host.h
@@ -73,6 +73,7 @@
   MOCK_METHOD0(ResyncUserData, void());
   MOCK_METHOD0(ShowFeedback, void());
   MOCK_METHOD0(ShowResetScreen, void());
+  MOCK_METHOD0(ShowAccountAccessHelpApp, void());
   MOCK_METHOD0(OnCancelPasswordChangedFlow, void());
   MOCK_METHOD0(ShowDialogForCaptivePortal, void());
   MOCK_METHOD0(HideDialogForCaptivePortal, void());
diff --git a/chrome/browser/ui/ash/login_screen_client.cc b/chrome/browser/ui/ash/login_screen_client.cc
index 036848b..f1a3f9c 100644
--- a/chrome/browser/ui/ash/login_screen_client.cc
+++ b/chrome/browser/ui/ash/login_screen_client.cc
@@ -166,6 +166,10 @@
   chromeos::LoginDisplayHost::default_host()->ShowResetScreen();
 }
 
+void LoginScreenClient::ShowAccountAccessHelpApp() {
+  chromeos::LoginDisplayHost::default_host()->ShowAccountAccessHelpApp();
+}
+
 void LoginScreenClient::LoadWallpaper(const AccountId& account_id) {
   WallpaperControllerClient::Get()->ShowUserWallpaper(account_id);
 }
diff --git a/chrome/browser/ui/ash/login_screen_client.h b/chrome/browser/ui/ash/login_screen_client.h
index 160c5ff..0525a29 100644
--- a/chrome/browser/ui/ash/login_screen_client.h
+++ b/chrome/browser/ui/ash/login_screen_client.h
@@ -86,6 +86,7 @@
   void LaunchKioskApp(const std::string& app_id) override;
   void LaunchArcKioskApp(const AccountId& account_id) override;
   void ShowResetScreen() override;
+  void ShowAccountAccessHelpApp() override;
 
  private:
   void SetPublicSessionKeyboardLayout(