Home | History | Annotate | Download | only in login
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/ui/webui/chromeos/login/kiosk_autolaunch_screen_handler.h"
      6 
      7 #include <string>
      8 
      9 #include "base/command_line.h"
     10 #include "base/prefs/pref_service.h"
     11 #include "base/strings/utf_string_conversions.h"
     12 #include "chrome/browser/browser_process.h"
     13 #include "chrome/browser/chrome_notification_types.h"
     14 #include "chrome/browser/chromeos/app_mode/kiosk_app_manager.h"
     15 #include "chrome/common/chrome_switches.h"
     16 #include "chrome/common/pref_names.h"
     17 #include "chromeos/chromeos_switches.h"
     18 #include "chromeos/dbus/dbus_thread_manager.h"
     19 #include "chromeos/dbus/session_manager_client.h"
     20 #include "content/public/browser/notification_details.h"
     21 #include "content/public/browser/notification_service.h"
     22 #include "grit/browser_resources.h"
     23 #include "grit/chromium_strings.h"
     24 #include "grit/generated_resources.h"
     25 #include "ui/webui/web_ui_util.h"
     26 
     27 namespace {
     28 
     29 const char kJsScreenPath[] = "login.AutolaunchScreen";
     30 
     31 // Autolaunch screen id.
     32 const char kAutolaunchScreen[] = "autolaunch";
     33 
     34 }  // namespace
     35 
     36 namespace chromeos {
     37 
     38 KioskAutolaunchScreenHandler::KioskAutolaunchScreenHandler()
     39     : BaseScreenHandler(kJsScreenPath),
     40       delegate_(NULL),
     41       show_on_init_(false),
     42       is_visible_(false) {
     43   KioskAppManager::Get()->AddObserver(this);
     44 }
     45 
     46 KioskAutolaunchScreenHandler::~KioskAutolaunchScreenHandler() {
     47   if (delegate_)
     48     delegate_->OnActorDestroyed(this);
     49 
     50   KioskAppManager::Get()->RemoveObserver(this);
     51 }
     52 
     53 void KioskAutolaunchScreenHandler::Show() {
     54   if (!page_is_ready()) {
     55     show_on_init_ = true;
     56     return;
     57   }
     58   UpdateKioskApp();
     59   ShowScreen(kAutolaunchScreen, NULL);
     60 }
     61 
     62 void KioskAutolaunchScreenHandler::SetDelegate(Delegate* delegate) {
     63   delegate_ = delegate;
     64   if (page_is_ready())
     65     Initialize();
     66 }
     67 
     68 void KioskAutolaunchScreenHandler::UpdateKioskApp() {
     69   if (!is_visible_)
     70     return;
     71 
     72   KioskAppManager* manager = KioskAppManager::Get();
     73   KioskAppManager::App app;
     74   std::string app_id = manager->GetAutoLaunchApp();
     75   if (app_id.empty() ||
     76       manager->IsAutoLaunchEnabled() ||
     77       !manager->GetApp(app_id, &app)) {
     78     return;
     79   }
     80 
     81   base::DictionaryValue app_info;
     82   app_info.SetString("appName", app.name);
     83 
     84   std::string icon_url("chrome://theme/IDR_APP_DEFAULT_ICON");
     85   if (!app.icon.isNull())
     86     icon_url = webui::GetBitmapDataUrl(*app.icon.bitmap());
     87 
     88   app_info.SetString("appIconUrl", icon_url);
     89   CallJS("updateApp", app_info);
     90 }
     91 
     92 void KioskAutolaunchScreenHandler::DeclareLocalizedValues(
     93     LocalizedValuesBuilder* builder) {
     94   builder->Add("autolaunchTitle", IDS_AUTOSTART_WARNING_TITLE);
     95   builder->Add("autolaunchWarningTitle", IDS_AUTOSTART_WARNING_TITLE);
     96   builder->Add("autolaunchWarning", IDS_KIOSK_AUTOSTART_SCREEN_WARNING_MSG);
     97   builder->Add("autolaunchConfirmButton", IDS_KIOSK_AUTOSTART_CONFIRM);
     98   builder->Add("autolaunchCancelButton", IDS_CANCEL);
     99 }
    100 
    101 void KioskAutolaunchScreenHandler::Initialize() {
    102   if (!page_is_ready() || !delegate_)
    103     return;
    104 
    105   if (show_on_init_) {
    106     Show();
    107     show_on_init_ = false;
    108   }
    109 }
    110 
    111 void KioskAutolaunchScreenHandler::RegisterMessages() {
    112   AddCallback("autolaunchVisible",
    113               &KioskAutolaunchScreenHandler::HandleOnVisible);
    114   AddCallback("autolaunchOnCancel",
    115               &KioskAutolaunchScreenHandler::HandleOnCancel);
    116   AddCallback("autolaunchOnConfirm",
    117               &KioskAutolaunchScreenHandler::HandleOnConfirm);
    118 }
    119 
    120 void KioskAutolaunchScreenHandler::HandleOnCancel() {
    121   KioskAppManager::Get()->RemoveObserver(this);
    122   KioskAppManager::Get()->SetEnableAutoLaunch(false);
    123   if (delegate_)
    124     delegate_->OnExit(false);
    125 
    126   content::NotificationService::current()->Notify(
    127       chrome::NOTIFICATION_KIOSK_AUTOLAUNCH_WARNING_COMPLETED,
    128       content::NotificationService::AllSources(),
    129       content::NotificationService::NoDetails());
    130 }
    131 
    132 void KioskAutolaunchScreenHandler::HandleOnConfirm() {
    133   KioskAppManager::Get()->RemoveObserver(this);
    134   KioskAppManager::Get()->SetEnableAutoLaunch(true);
    135   if (delegate_)
    136     delegate_->OnExit(true);
    137 
    138   content::NotificationService::current()->Notify(
    139       chrome::NOTIFICATION_KIOSK_AUTOLAUNCH_WARNING_COMPLETED,
    140       content::NotificationService::AllSources(),
    141       content::NotificationService::NoDetails());
    142 }
    143 
    144 void KioskAutolaunchScreenHandler::HandleOnVisible() {
    145   if (is_visible_)
    146     return;
    147 
    148   is_visible_ = true;
    149   UpdateKioskApp();
    150   content::NotificationService::current()->Notify(
    151       chrome::NOTIFICATION_KIOSK_AUTOLAUNCH_WARNING_VISIBLE,
    152       content::NotificationService::AllSources(),
    153       content::NotificationService::NoDetails());
    154 }
    155 
    156 void KioskAutolaunchScreenHandler::OnKioskAppsSettingsChanged() {
    157   UpdateKioskApp();
    158 }
    159 
    160 void KioskAutolaunchScreenHandler::OnKioskAppDataChanged(
    161     const std::string& app_id) {
    162   UpdateKioskApp();
    163 }
    164 
    165 }  // namespace chromeos
    166