OLD | NEW |
| (Empty) |
1 // Copyright (c) 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/chromeos/ui/app_launch_view.h" | |
6 | |
7 #include "ash/shell.h" | |
8 #include "ash/shell_delegate.h" | |
9 #include "ash/shell_window_ids.h" | |
10 #include "base/bind.h" | |
11 #include "base/logging.h" | |
12 #include "base/values.h" | |
13 #include "chrome/browser/ui/webui/chromeos/app_launch_ui.h" | |
14 #include "chrome/common/url_constants.h" | |
15 #include "content/public/browser/browser_context.h" | |
16 #include "content/public/browser/browser_thread.h" | |
17 #include "content/public/browser/render_view_host.h" | |
18 #include "content/public/browser/render_widget_host_view.h" | |
19 #include "content/public/browser/web_contents.h" | |
20 #include "grit/generated_resources.h" | |
21 #include "third_party/skia/include/core/SkBitmap.h" | |
22 #include "ui/aura/root_window.h" | |
23 #include "ui/base/l10n/l10n_util.h" | |
24 #include "ui/gfx/screen.h" | |
25 #include "ui/views/controls/webview/webview.h" | |
26 #include "ui/views/layout/fill_layout.h" | |
27 #include "ui/views/widget/widget.h" | |
28 | |
29 using content::BrowserThread; | |
30 | |
31 namespace chromeos { | |
32 | |
33 internal::AppLaunchView* g_instance = NULL; | |
34 | |
35 void ShowAppLaunchSplashScreen(const std::string& app_id) { | |
36 // TODO(zelidrag): Come up with a better UI for this purpose. | |
37 internal::AppLaunchView::ShowAppLaunchSplashScreen(app_id); | |
38 } | |
39 | |
40 void UpdateAppLaunchSplashScreenState(AppLaunchState state) { | |
41 internal::AppLaunchView::UpdateAppLaunchState(state); | |
42 } | |
43 | |
44 void CloseAppLaunchSplashScreen() { | |
45 internal::AppLaunchView::CloseAppLaunchSplashScreen(); | |
46 } | |
47 | |
48 namespace internal { | |
49 | |
50 int GetProgressMessageFromState(AppLaunchState state) { | |
51 switch (state) { | |
52 case APP_LAUNCH_STATE_LOADING_AUTH_FILE: | |
53 case APP_LAUNCH_STATE_LOADING_TOKEN_SERVICE: | |
54 // TODO(zelidrag): Add better string for this one than "Please wait..." | |
55 return IDS_SYNC_SETUP_SPINNER_TITLE; | |
56 case APP_LAUNCH_STATE_PREPARING_NETWORK: | |
57 return IDS_APP_START_NETWORK_WAIT_MESSAGE; | |
58 case APP_LAUNCH_STATE_INSTALLING_APPLICATION: | |
59 return IDS_APP_START_APP_WAIT_MESSAGE; | |
60 } | |
61 return IDS_APP_START_NETWORK_WAIT_MESSAGE; | |
62 } | |
63 | |
64 // static | |
65 void AppLaunchView::ShowAppLaunchSplashScreen(const std::string& app_id) { | |
66 if (!g_instance) { | |
67 g_instance = new AppLaunchView(app_id); | |
68 g_instance->Show(); | |
69 } | |
70 } | |
71 | |
72 void AppLaunchView::UpdateAppLaunchState(AppLaunchState state) { | |
73 if (g_instance) | |
74 g_instance->UpdateState(state); | |
75 } | |
76 | |
77 | |
78 // static | |
79 void AppLaunchView::CloseAppLaunchSplashScreen() { | |
80 if (g_instance) { | |
81 g_instance->GetWidget()->Close(); | |
82 g_instance = NULL; | |
83 } | |
84 } | |
85 | |
86 //////////////////////////////////////////////////////////////////////////////// | |
87 // AppLaunchView, views::WidgetDelegateView implementation. | |
88 views::View* AppLaunchView::GetContentsView() { | |
89 return this; | |
90 } | |
91 | |
92 //////////////////////////////////////////////////////////////////////////////// | |
93 // AppLaunchView, content::WebContentsObserver implementation. | |
94 void AppLaunchView::RenderProcessGone( | |
95 base::TerminationStatus status) { | |
96 LOG(ERROR) << "Splash screen terminated with status " << status; | |
97 AppLaunchView::CloseAppLaunchSplashScreen(); | |
98 } | |
99 | |
100 //////////////////////////////////////////////////////////////////////////////// | |
101 // AppLaunchView private methods. | |
102 AppLaunchView::AppLaunchView(const std::string& app_id) | |
103 : app_launch_webview_(NULL), | |
104 container_window_(NULL), | |
105 app_id_(app_id), | |
106 state_(APP_LAUNCH_STATE_LOADING_AUTH_FILE), | |
107 app_launch_ui_(NULL) { | |
108 } | |
109 | |
110 AppLaunchView::~AppLaunchView() { | |
111 } | |
112 | |
113 void AppLaunchView::Show() { | |
114 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | |
115 // Add the WebView to our view. | |
116 AddChildWebContents(); | |
117 // Initialize container window. | |
118 InitializeWindow(); | |
119 // Show the window. | |
120 ShowWindow(); | |
121 } | |
122 | |
123 void AppLaunchView::AddChildWebContents() { | |
124 content::BrowserContext* context = | |
125 ash::Shell::GetInstance()->delegate()->GetCurrentBrowserContext(); | |
126 app_launch_webview_ = new views::WebView(context); | |
127 SetLayoutManager(new views::FillLayout); | |
128 AddChildView(app_launch_webview_); | |
129 | |
130 LoadSplashScreen(); | |
131 content::WebContentsObserver::Observe( | |
132 app_launch_webview_->GetWebContents()); | |
133 } | |
134 | |
135 void AppLaunchView::UpdateState(AppLaunchState state) { | |
136 if (state == state_) | |
137 return; | |
138 | |
139 state_ = state; | |
140 if (!app_launch_ui_) | |
141 return; | |
142 | |
143 app_launch_ui_->SetLaunchText( | |
144 l10n_util::GetStringUTF8(GetProgressMessageFromState(state_))); | |
145 } | |
146 | |
147 void AppLaunchView::LoadSplashScreen() { | |
148 std::string url = chrome::kChromeUIAppLaunchURL; | |
149 url += "?app=" + app_id_; | |
150 | |
151 app_launch_webview_->GetWebContents()->GetController().LoadURL( | |
152 GURL(url), | |
153 content::Referrer(), | |
154 content::PAGE_TRANSITION_AUTO_TOPLEVEL, | |
155 std::string()); | |
156 | |
157 app_launch_ui_ = static_cast<AppLaunchUI*>( | |
158 app_launch_webview_->GetWebContents()->GetWebUI()->GetController()); | |
159 | |
160 // Use a background with transparency to trigger transparency in Webkit. | |
161 SkBitmap background; | |
162 background.setConfig(SkBitmap::kARGB_8888_Config, 1, 1); | |
163 background.allocPixels(); | |
164 background.eraseARGB(0x00, 0x00, 0x00, 0x00); | |
165 content::RenderViewHost* host = | |
166 app_launch_webview_->GetWebContents()->GetRenderViewHost(); | |
167 host->GetView()->SetBackground(background); | |
168 } | |
169 | |
170 void AppLaunchView::InitializeWindow() { | |
171 DCHECK(!container_window_); | |
172 aura::RootWindow* root_window = ash::Shell::GetPrimaryRootWindow(); | |
173 | |
174 // We want to be the fullscreen topmost child of the root window. | |
175 // There should be nothing ever really that should show up on top of us. | |
176 container_window_ = new views::Widget(); | |
177 views::Widget::InitParams params( | |
178 views::Widget::InitParams::TYPE_WINDOW_FRAMELESS); | |
179 params.delegate = this; | |
180 params.parent = ash::Shell::GetContainer( | |
181 root_window, | |
182 ash::internal::kShellWindowId_LockScreenContainer); | |
183 params.show_state = ui::SHOW_STATE_FULLSCREEN; | |
184 container_window_->Init(params); | |
185 } | |
186 | |
187 void AppLaunchView::ShowWindow() { | |
188 DCHECK(container_window_); | |
189 container_window_->Show(); | |
190 } | |
191 | |
192 } // namespace internal | |
193 | |
194 } // namespace chromeos | |
OLD | NEW |