Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(35)

Side by Side Diff: chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.cc

Issue 2339313002: arc: Support Arc window showing/hiding on a user's profile switch. (Closed)
Patch Set: comments Created 4 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h" 4 #include "chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h"
5 5
6 #include <string> 6 #include <string>
7 7
8 #include "ash/aura/wm_window_aura.h" 8 #include "ash/aura/wm_window_aura.h"
9 #include "ash/common/shelf/shelf_delegate.h" 9 #include "ash/common/shelf/shelf_delegate.h"
10 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h" 10 #include "ash/common/wm/maximize_mode/maximize_mode_controller.h"
(...skipping 75 matching lines...) Expand 10 before | Expand all | Expand 10 after
86 return blink::WebScreenOrientationLockAny; 86 return blink::WebScreenOrientationLockAny;
87 } 87 }
88 } 88 }
89 89
90 } // namespace 90 } // namespace
91 91
92 class ArcAppWindowLauncherController::AppWindow : public ui::BaseWindow { 92 class ArcAppWindowLauncherController::AppWindow : public ui::BaseWindow {
93 public: 93 public:
94 AppWindow(int task_id, 94 AppWindow(int task_id,
95 const std::string app_id, 95 const std::string app_id,
96 views::Widget* widget,
96 ArcAppWindowLauncherController* owner) 97 ArcAppWindowLauncherController* owner)
97 : task_id_(task_id), app_id_(app_id), owner_(owner) {} 98 : task_id_(task_id), app_id_(app_id), widget_(widget), owner_(owner) {}
98 ~AppWindow() {} 99 ~AppWindow() {}
99 100
100 void SetController(ArcAppWindowLauncherItemController* controller) { 101 void SetController(ArcAppWindowLauncherItemController* controller) {
101 DCHECK(!controller_ && controller); 102 DCHECK(!controller_ && controller);
102 controller_ = controller; 103 controller_ = controller;
103 } 104 }
104 105
105 void ResetController() { controller_ = nullptr; } 106 void ResetController() { controller_ = nullptr; }
106 107
107 void SetFullscreenMode(FullScreenMode mode) { 108 void SetFullscreenMode(FullScreenMode mode) {
108 DCHECK(mode != FullScreenMode::NOT_DEFINED); 109 DCHECK(mode != FullScreenMode::NOT_DEFINED);
109 fullscreen_mode_ = mode; 110 fullscreen_mode_ = mode;
110 } 111 }
111 112
112 FullScreenMode fullscreen_mode() const { return fullscreen_mode_; } 113 FullScreenMode fullscreen_mode() const { return fullscreen_mode_; }
113 114
114 int task_id() const { return task_id_; } 115 int task_id() const { return task_id_; }
115 116
116 ash::ShelfID shelf_id() const { return shelf_id_; } 117 ash::ShelfID shelf_id() const { return shelf_id_; }
117 118
118 void set_shelf_id(ash::ShelfID shelf_id) { shelf_id_ = shelf_id; } 119 void set_shelf_id(ash::ShelfID shelf_id) { shelf_id_ = shelf_id; }
119 120
120 views::Widget* widget() const { return widget_; } 121 views::Widget* widget() const { return widget_; }
121 122
122 void set_widget(views::Widget* widget) { widget_ = widget; }
123
124 ArcAppWindowLauncherItemController* controller() { return controller_; } 123 ArcAppWindowLauncherItemController* controller() { return controller_; }
125 124
126 const std::string app_id() { return app_id_; } 125 const std::string app_id() { return app_id_; }
127 126
128 // ui::BaseWindow: 127 // ui::BaseWindow:
129 bool IsActive() const override { 128 bool IsActive() const override {
130 return widget_ && widget_->IsActive() && 129 return widget_->IsActive() && owner_->active_task_id_ == task_id_;
131 owner_->active_task_id_ == task_id_;
132 } 130 }
133 131
134 bool IsMaximized() const override { 132 bool IsMaximized() const override {
135 NOTREACHED(); 133 NOTREACHED();
136 return false; 134 return false;
137 } 135 }
138 136
139 bool IsMinimized() const override { 137 bool IsMinimized() const override {
140 NOTREACHED(); 138 NOTREACHED();
141 return false; 139 return false;
142 } 140 }
143 141
144 bool IsFullscreen() const override { 142 bool IsFullscreen() const override {
145 NOTREACHED(); 143 NOTREACHED();
146 return false; 144 return false;
147 } 145 }
148 146
149 gfx::NativeWindow GetNativeWindow() const override { 147 gfx::NativeWindow GetNativeWindow() const override {
150 return widget_ ? widget_->GetNativeWindow() : nullptr; 148 return widget_->GetNativeWindow();
151 } 149 }
152 150
153 gfx::Rect GetRestoredBounds() const override { 151 gfx::Rect GetRestoredBounds() const override {
154 NOTREACHED(); 152 NOTREACHED();
155 return gfx::Rect(); 153 return gfx::Rect();
156 } 154 }
157 155
158 ui::WindowShowState GetRestoredState() const override { 156 ui::WindowShowState GetRestoredState() const override {
159 NOTREACHED(); 157 NOTREACHED();
160 return ui::SHOW_STATE_NORMAL; 158 return ui::SHOW_STATE_NORMAL;
161 } 159 }
162 160
163 gfx::Rect GetBounds() const override { 161 gfx::Rect GetBounds() const override {
164 NOTREACHED(); 162 NOTREACHED();
165 return gfx::Rect(); 163 return gfx::Rect();
166 } 164 }
167 165
168 void Show() override { 166 void Show() override { widget_->Show(); }
169 // TODO(khmel): support window minimizing.
170 }
171 167
172 void ShowInactive() override { NOTREACHED(); } 168 void ShowInactive() override { NOTREACHED(); }
173 169
174 void Hide() override { NOTREACHED(); } 170 void Hide() override { NOTREACHED(); }
175 171
176 void Close() override { arc::CloseTask(task_id_); } 172 void Close() override { arc::CloseTask(task_id_); }
177 173
178 void Activate() override { arc::SetTaskActive(task_id_); } 174 void Activate() override { widget_->Activate(); }
179 175
180 void Deactivate() override { NOTREACHED(); } 176 void Deactivate() override { NOTREACHED(); }
181 177
182 void Maximize() override { NOTREACHED(); } 178 void Maximize() override { NOTREACHED(); }
183 179
184 void Minimize() override { 180 void Minimize() override { widget_->Minimize(); }
185 if (widget_)
186 widget_->Minimize();
187 }
188 181
189 void Restore() override { NOTREACHED(); } 182 void Restore() override { NOTREACHED(); }
190 183
191 void SetBounds(const gfx::Rect& bounds) override { NOTREACHED(); } 184 void SetBounds(const gfx::Rect& bounds) override { NOTREACHED(); }
192 185
193 void FlashFrame(bool flash) override { NOTREACHED(); } 186 void FlashFrame(bool flash) override { NOTREACHED(); }
194 187
195 bool IsAlwaysOnTop() const override { 188 bool IsAlwaysOnTop() const override {
196 NOTREACHED(); 189 NOTREACHED();
197 return false; 190 return false;
(...skipping 13 matching lines...) Expand all
211 bool has_requested_orientation_lock() const { 204 bool has_requested_orientation_lock() const {
212 return has_requested_orientation_lock_; 205 return has_requested_orientation_lock_;
213 } 206 }
214 207
215 private: 208 private:
216 int task_id_; 209 int task_id_;
217 ash::ShelfID shelf_id_ = 0; 210 ash::ShelfID shelf_id_ = 0;
218 std::string app_id_; 211 std::string app_id_;
219 FullScreenMode fullscreen_mode_ = FullScreenMode::NOT_DEFINED; 212 FullScreenMode fullscreen_mode_ = FullScreenMode::NOT_DEFINED;
220 // Unowned pointers 213 // Unowned pointers
214 views::Widget* const widget_;
221 ArcAppWindowLauncherController* owner_; 215 ArcAppWindowLauncherController* owner_;
222 ArcAppWindowLauncherItemController* controller_ = nullptr; 216 ArcAppWindowLauncherItemController* controller_ = nullptr;
223 // Unowned pointer, represents host Arc window. 217 // Unowned pointer, represents host Arc window.
224 views::Widget* widget_ = nullptr;
225 218
226 arc::mojom::OrientationLock requested_orientation_lock_ = 219 arc::mojom::OrientationLock requested_orientation_lock_ =
227 arc::mojom::OrientationLock::NONE; 220 arc::mojom::OrientationLock::NONE;
228 bool has_requested_orientation_lock_ = false; 221 bool has_requested_orientation_lock_ = false;
229 222
230 DISALLOW_COPY_AND_ASSIGN(AppWindow); 223 DISALLOW_COPY_AND_ASSIGN(AppWindow);
231 }; 224 };
232 225
233 ArcAppWindowLauncherController::ArcAppWindowLauncherController( 226 ArcAppWindowLauncherController::ArcAppWindowLauncherController(
234 ChromeLauncherController* owner, 227 ChromeLauncherController* owner,
(...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 } 282 }
290 283
291 void ArcAppWindowLauncherController::OnWindowInitialized(aura::Window* window) { 284 void ArcAppWindowLauncherController::OnWindowInitialized(aura::Window* window) {
292 // Arc windows has type WINDOW_TYPE_NORMAL. 285 // Arc windows has type WINDOW_TYPE_NORMAL.
293 if (window->type() != ui::wm::WINDOW_TYPE_NORMAL) 286 if (window->type() != ui::wm::WINDOW_TYPE_NORMAL)
294 return; 287 return;
295 observed_windows_.push_back(window); 288 observed_windows_.push_back(window);
296 window->AddObserver(this); 289 window->AddObserver(this);
297 } 290 }
298 291
299 void ArcAppWindowLauncherController::OnWindowVisibilityChanging( 292 void ArcAppWindowLauncherController::OnWindowVisibilityChanged(
300 aura::Window* window, 293 aura::Window* window,
301 bool visible) { 294 bool visible) {
302 // The application id property should be set at this time. 295 // The application id property should be set at this time. It is important to
296 // have window->IsVisible set to true before attaching to a controller because
297 // the window is registered in multi-user manager and this manager may
298 // consider this new window as hidden for current profile. Multi-user manager
299 // uses OnWindowVisibilityChanging event to update window state.
303 if (visible && observed_profile_ == owner()->GetProfile()) 300 if (visible && observed_profile_ == owner()->GetProfile())
oshima 2016/09/15 17:14:32 It looks to me that observerd_profile_ and owner()
khmel 2016/09/15 17:32:15 Actually not, observerd_profile_ is set on creatio
304 AttachControllerToWindowIfNeeded(window); 301 AttachControllerToWindowIfNeeded(window);
305 } 302 }
306 303
307 void ArcAppWindowLauncherController::OnWindowDestroying(aura::Window* window) { 304 void ArcAppWindowLauncherController::OnWindowDestroying(aura::Window* window) {
308 auto it = 305 auto it =
309 std::find(observed_windows_.begin(), observed_windows_.end(), window); 306 std::find(observed_windows_.begin(), observed_windows_.end(), window);
310 DCHECK(it != observed_windows_.end()); 307 DCHECK(it != observed_windows_.end());
311 observed_windows_.erase(it); 308 observed_windows_.erase(it);
312 window->RemoveObserver(this); 309 window->RemoveObserver(this);
oshima 2016/09/15 17:14:32 can you also stop observing if the window belongs
khmel 2016/09/15 17:32:15 Will dig into this in next CLs, there are several
313 310
314 auto it_app_window = 311 auto it_app_window =
315 std::find_if(task_id_to_app_window_.begin(), task_id_to_app_window_.end(), 312 std::find_if(task_id_to_app_window_.begin(), task_id_to_app_window_.end(),
316 [window](const TaskIdToAppWindow::value_type& pair) { 313 [window](const TaskIdToAppWindow::value_type& pair) {
317 return pair.second->GetNativeWindow() == window; 314 return pair.second->GetNativeWindow() == window;
318 }); 315 });
319 if (it_app_window != task_id_to_app_window_.end()) { 316 if (it_app_window != task_id_to_app_window_.end()) {
320 // Note, window may be recreated in some cases, so do not close controller 317 // Note, window may be recreated in some cases, so do not close controller
321 // on window destroying. Controller will be closed onTaskDestroyed event 318 // on window destroying. Controller will be closed onTaskDestroyed event
322 // which is generated when actual task is destroyed. 319 // which is generated when actual task is destroyed.
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
363 if (GetAppWindowForTask(task_id)) 360 if (GetAppWindowForTask(task_id))
364 return; 361 return;
365 362
366 // Create controller if we have task info. 363 // Create controller if we have task info.
367 TaskIdToShelfAppIdMap::iterator it = task_id_to_shelf_app_id_.find(task_id); 364 TaskIdToShelfAppIdMap::iterator it = task_id_to_shelf_app_id_.find(task_id);
368 if (it == task_id_to_shelf_app_id_.end()) 365 if (it == task_id_to_shelf_app_id_.end())
369 return; 366 return;
370 367
371 const std::string& app_id = it->second; 368 const std::string& app_id = it->second;
372 369
373 std::unique_ptr<AppWindow> app_window(new AppWindow(task_id, app_id, this)); 370 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window);
374 app_window->set_widget(views::Widget::GetWidgetForNativeWindow(window)); 371 DCHECK(widget);
372 std::unique_ptr<AppWindow> app_window(
373 new AppWindow(task_id, app_id, widget, this));
375 RegisterApp(app_window.get()); 374 RegisterApp(app_window.get());
376 DCHECK(app_window->controller()); 375 DCHECK(app_window->controller());
377 ash::WmWindowAura::Get(window)->SetIntProperty( 376 ash::WmWindowAura::Get(window)->SetIntProperty(
378 ash::WmWindowProperty::SHELF_ID, app_window->shelf_id()); 377 ash::WmWindowProperty::SHELF_ID, app_window->shelf_id());
379 chrome::MultiUserWindowManager::GetInstance()->SetWindowOwner( 378 chrome::MultiUserWindowManager::GetInstance()->SetWindowOwner(
380 window, 379 window,
381 user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); 380 user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId());
382 if (ash::WmShell::Get() 381 if (ash::WmShell::Get()
383 ->maximize_mode_controller() 382 ->maximize_mode_controller()
384 ->IsMaximizeModeWindowManagerEnabled()) { 383 ->IsMaximizeModeWindowManagerEnabled()) {
(...skipping 252 matching lines...) Expand 10 before | Expand all | Expand 10 after
637 if (orientation_lock == arc::mojom::OrientationLock::CURRENT) { 636 if (orientation_lock == arc::mojom::OrientationLock::CURRENT) {
638 // Resolve the orientation when it first resolved. 637 // Resolve the orientation when it first resolved.
639 orientation_lock = GetCurrentOrientation(); 638 orientation_lock = GetCurrentOrientation();
640 app_window->set_requested_orientation_lock(orientation_lock); 639 app_window->set_requested_orientation_lock(orientation_lock);
641 } 640 }
642 641
643 ash::Shell* shell = ash::Shell::GetInstance(); 642 ash::Shell* shell = ash::Shell::GetInstance();
644 shell->screen_orientation_controller()->LockOrientationForWindow( 643 shell->screen_orientation_controller()->LockOrientationForWindow(
645 window, BlinkOrientationLockFromMojom(orientation_lock)); 644 window, BlinkOrientationLockFromMojom(orientation_lock));
646 } 645 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/ash/launcher/arc_app_window_launcher_controller.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698