Upstream version 9.37.197.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / ui / webui / chromeos / login / kiosk_app_menu_handler.cc
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/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"
23
24 namespace chromeos {
25
26 namespace {
27
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";
33
34 // Default app icon size.
35 const char kDefaultAppIconSizeString[] = "96px";
36 const int kMaxAppIconSize = 160;
37
38 }  // namespace
39
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);
47 }
48
49 KioskAppMenuHandler::~KioskAppMenuHandler() {
50   KioskAppManager::Get()->RemoveObserver(this);
51   network_state_informer_->RemoveObserver(this);
52 }
53
54 void KioskAppMenuHandler::GetLocalizedStrings(
55     base::DictionaryValue* localized_strings) {
56   localized_strings->SetString(
57       "showApps",
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);
71 }
72
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)));
83 }
84
85 // static
86 bool KioskAppMenuHandler::EnableNewKioskUI() {
87   // Turn off new kiosk UI for M34/35.
88   // TODO(xiyuan, nkostylev): Revist for http://crbug.com/362062.
89   return false;
90 }
91
92 void KioskAppMenuHandler::SendKioskApps() {
93   if (!is_webui_initialized_)
94     return;
95
96   KioskAppManager::Apps apps;
97   KioskAppManager::Get()->GetApps(&apps);
98
99   base::ListValue apps_list;
100   for (size_t i = 0; i < apps.size(); ++i) {
101     const KioskAppManager::App& app_data = apps[i];
102
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);
107
108     // TODO(xiyuan): Replace data url with a URLDataSource.
109     std::string icon_url("chrome://theme/IDR_APP_DEFAULT_ICON");
110
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();
115
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");
121       }
122     } else {
123       app_info->SetString("iconWidth", kDefaultAppIconSizeString);
124       app_info->SetString("iconHeight", kDefaultAppIconSizeString);
125     }
126     app_info->SetString("iconUrl", icon_url);
127
128     apps_list.Append(app_info.release());
129   }
130
131   web_ui()->CallJavascriptFunction(EnableNewKioskUI() ?
132       kKioskSetAppsNewAPI : kKioskSetAppsOldAPI,
133       apps_list);
134 }
135
136 void KioskAppMenuHandler::HandleInitializeKioskApps(
137     const base::ListValue* args) {
138   is_webui_initialized_ = true;
139   SendKioskApps();
140   UpdateState(ErrorScreenActor::ERROR_REASON_UPDATE);
141 }
142
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());
149 }
150
151 void KioskAppMenuHandler::HandleCheckKioskAppLaunchError(
152     const base::ListValue* args) {
153   KioskAppLaunchError::Error error = KioskAppLaunchError::Get();
154   if (error == KioskAppLaunchError::NONE)
155     return;
156   KioskAppLaunchError::Clear();
157
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));
163 }
164
165 void KioskAppMenuHandler::OnKioskAppsSettingsChanged() {
166   SendKioskApps();
167 }
168
169 void KioskAppMenuHandler::OnKioskAppDataChanged(const std::string& app_id) {
170   SendKioskApps();
171 }
172
173 void KioskAppMenuHandler::UpdateState(ErrorScreenActor::ErrorReason reason) {
174   if (network_state_informer_->state() == NetworkStateInformer::ONLINE)
175     KioskAppManager::Get()->RetryFailedAppDataFetch();
176 }
177
178 }  // namespace chromeos