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_app_menu_handler.h" 6 7#include "base/bind.h" 8#include "base/command_line.h" 9#include "base/values.h" 10#include "chrome/browser/browser_process.h" 11#include "chrome/browser/chrome_notification_types.h" 12#include "chrome/browser/chromeos/app_mode/kiosk_app_launch_error.h" 13#include "chrome/browser/chromeos/login/existing_user_controller.h" 14#include "chrome/browser/policy/browser_policy_connector.h" 15#include "chromeos/chromeos_switches.h" 16#include "content/public/browser/notification_details.h" 17#include "content/public/browser/notification_service.h" 18#include "content/public/browser/web_ui.h" 19#include "grit/generated_resources.h" 20#include "ui/base/l10n/l10n_util.h" 21#include "ui/base/webui/web_ui_util.h" 22 23namespace chromeos { 24 25KioskAppMenuHandler::KioskAppMenuHandler() 26 : initialized_(false), 27 weak_ptr_factory_(this) { 28 KioskAppManager::Get()->AddObserver(this); 29} 30 31KioskAppMenuHandler::~KioskAppMenuHandler() { 32 KioskAppManager::Get()->RemoveObserver(this); 33} 34 35void KioskAppMenuHandler::GetLocalizedStrings( 36 base::DictionaryValue* localized_strings) { 37 localized_strings->SetString( 38 "showApps", 39 l10n_util::GetStringUTF16(IDS_KIOSK_APPS_BUTTON)); 40} 41 42void KioskAppMenuHandler::RegisterMessages() { 43 web_ui()->RegisterMessageCallback("initializeKioskApps", 44 base::Bind(&KioskAppMenuHandler::HandleInitializeKioskApps, 45 base::Unretained(this))); 46 web_ui()->RegisterMessageCallback("kioskAppsLoaded", 47 base::Bind(&KioskAppMenuHandler::HandleKioskAppsLoaded, 48 base::Unretained(this))); 49 web_ui()->RegisterMessageCallback("checkKioskAppLaunchError", 50 base::Bind(&KioskAppMenuHandler::HandleCheckKioskAppLaunchError, 51 base::Unretained(this))); 52} 53 54void KioskAppMenuHandler::SendKioskApps() { 55 if (!initialized_) 56 return; 57 58 KioskAppManager::Apps apps; 59 KioskAppManager::Get()->GetApps(&apps); 60 61 base::ListValue apps_list; 62 for (size_t i = 0; i < apps.size(); ++i) { 63 const KioskAppManager::App& app_data = apps[i]; 64 65 scoped_ptr<base::DictionaryValue> app_info(new base::DictionaryValue); 66 app_info->SetString("id", app_data.app_id); 67 app_info->SetString("label", app_data.name); 68 69 // TODO(xiyuan): Replace data url with a URLDataSource. 70 std::string icon_url("chrome://theme/IDR_APP_DEFAULT_ICON"); 71 if (!app_data.icon.isNull()) 72 icon_url = webui::GetBitmapDataUrl(*app_data.icon.bitmap()); 73 app_info->SetString("iconUrl", icon_url); 74 75 apps_list.Append(app_info.release()); 76 } 77 78 web_ui()->CallJavascriptFunction("login.AppsMenuButton.setApps", 79 apps_list); 80} 81 82void KioskAppMenuHandler::HandleInitializeKioskApps( 83 const base::ListValue* args) { 84 if (g_browser_process->browser_policy_connector()->IsEnterpriseManaged()) { 85 initialized_ = true; 86 SendKioskApps(); 87 return; 88 } 89 90 KioskAppManager::Get()->GetConsumerKioskModeStatus( 91 base::Bind(&KioskAppMenuHandler::OnGetConsumerKioskModeStatus, 92 weak_ptr_factory_.GetWeakPtr())); 93} 94 95void KioskAppMenuHandler::OnGetConsumerKioskModeStatus( 96 KioskAppManager::ConsumerKioskModeStatus status) { 97 initialized_ = 98 status == KioskAppManager::CONSUMER_KIOSK_MODE_ENABLED; 99 SendKioskApps(); 100} 101 102void KioskAppMenuHandler::HandleKioskAppsLoaded( 103 const base::ListValue* args) { 104 content::NotificationService::current()->Notify( 105 chrome::NOTIFICATION_KIOSK_APPS_LOADED, 106 content::NotificationService::AllSources(), 107 content::NotificationService::NoDetails()); 108} 109 110void KioskAppMenuHandler::HandleCheckKioskAppLaunchError( 111 const base::ListValue* args) { 112 KioskAppLaunchError::Error error = KioskAppLaunchError::Get(); 113 if (error == KioskAppLaunchError::NONE) 114 return; 115 KioskAppLaunchError::Clear(); 116 117 const std::string error_message = KioskAppLaunchError::GetErrorMessage(error); 118 web_ui()->CallJavascriptFunction("login.AppsMenuButton.showError", 119 base::StringValue(error_message)); 120} 121 122void KioskAppMenuHandler::OnKioskAppsSettingsChanged() { 123 SendKioskApps(); 124} 125 126void KioskAppMenuHandler::OnKioskAppDataChanged(const std::string& app_id) { 127 SendKioskApps(); 128} 129 130} // namespace chromeos 131