mobile_setup_dialog.cc revision cedac228d2dd51db4b79ea1e72c7f249408ee061
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/mobile_setup_dialog.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/bind.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/singleton.h"
9868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/browser_shutdown.h"
11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h"
12cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/webui_login_view.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/chromeos/mobile/mobile_activator.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/platform_util.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_dialogs.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/simple_message_box.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/common/url_constants.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/public/browser/browser_thread.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "grit/generated_resources.h"
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/size.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/views/widget/widget.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/web_dialogs/web_dialog_delegate.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using chromeos::MobileActivator;
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::BrowserThread;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebContents;
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using content::WebUIMessageHandler;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ui::WebDialogDelegate;
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
32424c4d7b64af9d0d8fd9624f381f469654d5e3d2Torne (Richard Coles)class MobileSetupDialogDelegate : public WebDialogDelegate {
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static MobileSetupDialogDelegate* GetInstance();
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void ShowDialog(const std::string& service_path);
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  friend struct DefaultSingletonTraits<MobileSetupDialogDelegate>;
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MobileSetupDialogDelegate();
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~MobileSetupDialogDelegate();
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void OnCloseDialog();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // WebDialogDelegate overrides.
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ui::ModalType GetDialogModalType() const OVERRIDE;
47a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  virtual base::string16 GetDialogTitle() const OVERRIDE;
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual GURL GetDialogContentURL() const OVERRIDE;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetWebUIMessageHandlers(
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      std::vector<WebUIMessageHandler*>* handlers) const OVERRIDE;
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void GetDialogSize(gfx::Size* size) const OVERRIDE;
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual std::string GetDialogArgs() const OVERRIDE;
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnDialogClosed(const std::string& json_retval) OVERRIDE;
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual void OnCloseContents(WebContents* source,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                               bool* out_close_dialog) OVERRIDE;
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldShowDialogTitle() const OVERRIDE;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool HandleContextMenu(
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const content::ContextMenuParams& params) OVERRIDE;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeWindow dialog_window_;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Cellular network service path.
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string service_path_;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(MobileSetupDialogDelegate);
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialog::Show(const std::string& service_path) {
69e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  MobileSetupDialogDelegate::GetInstance()->ShowDialog(service_path);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MobileSetupDialogDelegate* MobileSetupDialogDelegate::GetInstance() {
75e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch  DCHECK_CURRENTLY_ON(BrowserThread::UI);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return Singleton<MobileSetupDialogDelegate>::get();
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MobileSetupDialogDelegate::MobileSetupDialogDelegate() : dialog_window_(NULL) {
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)MobileSetupDialogDelegate::~MobileSetupDialogDelegate() {
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::ShowDialog(const std::string& service_path) {
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  service_path_ = service_path;
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  gfx::NativeWindow parent = NULL;
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're on the login screen.
90c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  if (chromeos::LoginDisplayHostImpl::default_host()) {
91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    chromeos::LoginDisplayHostImpl* webui_host =
92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)        static_cast<chromeos::LoginDisplayHostImpl*>(
93c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)            chromeos::LoginDisplayHostImpl::default_host());
94c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    chromeos::WebUILoginView* login_view = webui_host->GetWebUILoginView();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    if (login_view)
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent = login_view->GetNativeWindow();
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Only the primary user can change this.
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog_window_ = chrome::ShowWebDialog(
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      parent,
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      ProfileManager::GetPrimaryUserProfile(),
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      this);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ui::ModalType MobileSetupDialogDelegate::GetDialogModalType() const {
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return ui::MODAL_TYPE_SYSTEM;
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 MobileSetupDialogDelegate::GetDialogTitle() const {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_MOBILE_SETUP_TITLE);
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)GURL MobileSetupDialogDelegate::GetDialogContentURL() const {
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  std::string url(chrome::kChromeUIMobileSetupURL);
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  url.append(service_path_);
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return GURL(url);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::GetWebUIMessageHandlers(
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    std::vector<WebUIMessageHandler*>* handlers) const {
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::GetDialogSize(gfx::Size* size) const {
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  size->SetSize(850, 650);
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)std::string MobileSetupDialogDelegate::GetDialogArgs() const {
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return std::string();
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::OnDialogClosed(const std::string& json_retval) {
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  dialog_window_ = NULL;
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void MobileSetupDialogDelegate::OnCloseContents(WebContents* source,
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                                bool* out_close_dialog) {
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // If we're exiting, popping up the confirmation dialog can cause a
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // crash. Note: IsTryingToQuit can be cancelled on other platforms by the
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // onbeforeunload handler, except on ChromeOS. So IsTryingToQuit is the
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // appropriate check to use here.
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!dialog_window_ ||
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      !MobileActivator::GetInstance()->RunningActivation() ||
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      browser_shutdown::IsTryingToQuit()) {
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    *out_close_dialog = true;
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return;
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *out_close_dialog = chrome::ShowMessageBox(dialog_window_,
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_MOBILE_SETUP_TITLE),
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      l10n_util::GetStringUTF16(IDS_MOBILE_CANCEL_ACTIVATION),
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      chrome::MESSAGE_BOX_TYPE_QUESTION);
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MobileSetupDialogDelegate::ShouldShowDialogTitle() const {
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool MobileSetupDialogDelegate::HandleContextMenu(
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    const content::ContextMenuParams& params) {
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
162