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.
5 #include "chrome/browser/ui/webui/chromeos/login/kiosk_app_menu_handler.h"
8 #include "base/command_line.h"
9 #include "base/strings/string_number_conversions.h"
10 #include "base/sys_info.h"
11 #include "base/values.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_launch_error.h"
15 #include "chrome/browser/chromeos/login/existing_user_controller.h"
16 #include "chromeos/chromeos_switches.h"
17 #include "content/public/browser/notification_details.h"
18 #include "content/public/browser/notification_service.h"
19 #include "content/public/browser/web_ui.h"
20 #include "grit/generated_resources.h"
21 #include "ui/base/l10n/l10n_util.h"
22 #include "ui/base/webui/web_ui_util.h"
28 // JS functions that define new and old kiosk UI API.
29 const char kKioskSetAppsNewAPI[] = "login.AccountPickerScreen.setApps";
30 const char kKioskSetAppsOldAPI[] = "login.AppsMenuButton.setApps";
31 const char kKioskShowErrorNewAPI[] = "login.AccountPickerScreen.showAppError";
32 const char kKioskShowErrorOldAPI[] = "login.AppsMenuButton.showError";
34 // Default app icon size.
35 const char kDefaultAppIconSizeString[] = "96px";
36 const int kMaxAppIconSize = 160;
40 KioskAppMenuHandler::KioskAppMenuHandler(
41 const scoped_refptr<NetworkStateInformer>& network_state_informer)
42 : weak_ptr_factory_(this),
43 is_webui_initialized_(false),
44 network_state_informer_(network_state_informer) {
45 KioskAppManager::Get()->AddObserver(this);
46 network_state_informer_->AddObserver(this);
49 KioskAppMenuHandler::~KioskAppMenuHandler() {
50 KioskAppManager::Get()->RemoveObserver(this);
51 network_state_informer_->RemoveObserver(this);
54 void KioskAppMenuHandler::GetLocalizedStrings(
55 base::DictionaryValue* localized_strings) {
56 localized_strings->SetString(
58 l10n_util::GetStringUTF16(IDS_KIOSK_APPS_BUTTON));
59 localized_strings->SetString(
60 "confirmKioskAppDiagnosticModeFormat",
61 l10n_util::GetStringUTF16(IDS_LOGIN_CONFIRM_KIOSK_DIAGNOSTIC_FORMAT));
62 localized_strings->SetString(
63 "confirmKioskAppDiagnosticModeYes",
64 l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_YES_BUTTON_LABEL));
65 localized_strings->SetString(
66 "confirmKioskAppDiagnosticModeNo",
67 l10n_util::GetStringUTF16(IDS_CONFIRM_MESSAGEBOX_NO_BUTTON_LABEL));
68 localized_strings->SetBoolean(
69 "kioskAppHasLaunchError",
70 KioskAppLaunchError::Get() != KioskAppLaunchError::NONE);
73 void KioskAppMenuHandler::RegisterMessages() {
74 web_ui()->RegisterMessageCallback("initializeKioskApps",
75 base::Bind(&KioskAppMenuHandler::HandleInitializeKioskApps,
76 base::Unretained(this)));
77 web_ui()->RegisterMessageCallback("kioskAppsLoaded",
78 base::Bind(&KioskAppMenuHandler::HandleKioskAppsLoaded,
79 base::Unretained(this)));
80 web_ui()->RegisterMessageCallback("checkKioskAppLaunchError",
81 base::Bind(&KioskAppMenuHandler::HandleCheckKioskAppLaunchError,
82 base::Unretained(this)));
86 bool KioskAppMenuHandler::EnableNewKioskUI() {
87 // Turn off new kiosk UI for M34/35.
88 // TODO(xiyuan, nkostylev): Revist for http://crbug.com/362062.
92 void KioskAppMenuHandler::SendKioskApps() {
93 if (!is_webui_initialized_)
96 KioskAppManager::Apps apps;
97 KioskAppManager::Get()->GetApps(&apps);
99 base::ListValue apps_list;
100 for (size_t i = 0; i < apps.size(); ++i) {
101 const KioskAppManager::App& app_data = apps[i];
103 scoped_ptr<base::DictionaryValue> app_info(new base::DictionaryValue);
104 app_info->SetBoolean("isApp", true);
105 app_info->SetString("id", app_data.app_id);
106 app_info->SetString("label", app_data.name);
108 // TODO(xiyuan): Replace data url with a URLDataSource.
109 std::string icon_url("chrome://theme/IDR_APP_DEFAULT_ICON");
111 if (!app_data.icon.isNull()) {
112 icon_url = webui::GetBitmapDataUrl(*app_data.icon.bitmap());
113 int width = app_data.icon.width();
114 int height = app_data.icon.height();
116 // If app icon size is larger than default 160x160 then don't provide
117 // size at all since it's already limited on the css side.
118 if (width <= kMaxAppIconSize && height <= kMaxAppIconSize) {
119 app_info->SetString("iconWidth", base::IntToString(width) + "px");
120 app_info->SetString("iconHeight", base::IntToString(height) + "px");
123 app_info->SetString("iconWidth", kDefaultAppIconSizeString);
124 app_info->SetString("iconHeight", kDefaultAppIconSizeString);
126 app_info->SetString("iconUrl", icon_url);
128 apps_list.Append(app_info.release());
131 web_ui()->CallJavascriptFunction(EnableNewKioskUI() ?
132 kKioskSetAppsNewAPI : kKioskSetAppsOldAPI,
136 void KioskAppMenuHandler::HandleInitializeKioskApps(
137 const base::ListValue* args) {
138 is_webui_initialized_ = true;
140 UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
143 void KioskAppMenuHandler::HandleKioskAppsLoaded(
144 const base::ListValue* args) {
145 content::NotificationService::current()->Notify(
146 chrome::NOTIFICATION_KIOSK_APPS_LOADED,
147 content::NotificationService::AllSources(),
148 content::NotificationService::NoDetails());
151 void KioskAppMenuHandler::HandleCheckKioskAppLaunchError(
152 const base::ListValue* args) {
153 KioskAppLaunchError::Error error = KioskAppLaunchError::Get();
154 if (error == KioskAppLaunchError::NONE)
156 KioskAppLaunchError::Clear();
158 const std::string error_message = KioskAppLaunchError::GetErrorMessage(error);
159 bool new_kiosk_ui = EnableNewKioskUI();
160 web_ui()->CallJavascriptFunction(new_kiosk_ui ?
161 kKioskShowErrorNewAPI : kKioskShowErrorOldAPI,
162 base::StringValue(error_message));
165 void KioskAppMenuHandler::OnKioskAppsSettingsChanged() {
169 void KioskAppMenuHandler::OnKioskAppDataChanged(const std::string& app_id) {
173 void KioskAppMenuHandler::UpdateState(ErrorScreenActor::ErrorReason reason) {
174 if (network_state_informer_->state() == NetworkStateInformer::ONLINE)
175 KioskAppManager::Get()->RetryFailedAppDataFetch();
178 } // namespace chromeos