OLD | NEW |
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 271 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
282 } | 282 } |
283 | 283 |
284 void ArcAppWindowLauncherController::OnWindowInitialized(aura::Window* window) { | 284 void ArcAppWindowLauncherController::OnWindowInitialized(aura::Window* window) { |
285 // Arc windows has type WINDOW_TYPE_NORMAL. | 285 // Arc windows has type WINDOW_TYPE_NORMAL. |
286 if (window->type() != ui::wm::WINDOW_TYPE_NORMAL) | 286 if (window->type() != ui::wm::WINDOW_TYPE_NORMAL) |
287 return; | 287 return; |
288 observed_windows_.push_back(window); | 288 observed_windows_.push_back(window); |
289 window->AddObserver(this); | 289 window->AddObserver(this); |
290 } | 290 } |
291 | 291 |
292 void ArcAppWindowLauncherController::OnWindowVisibilityChanged( | 292 void ArcAppWindowLauncherController::OnWindowPropertyChanged( |
293 aura::Window* window, | 293 aura::Window* window, |
294 bool visible) { | 294 const void* key, |
295 // The application id property should be set at this time. It is important to | 295 intptr_t old) { |
296 // have window->IsVisible set to true before attaching to a controller because | 296 if (!exo::ShellSurface::IsApplicationWindowReadyPropertyKey(key)) |
297 // the window is registered in multi-user manager and this manager may | 297 return; |
298 // consider this new window as hidden for current profile. Multi-user manager | 298 |
299 // uses OnWindowVisibilityChanging event to update window state. | 299 DCHECK(exo::ShellSurface::IsApplicationWindowReadyToShow(window)); |
300 if (visible && observed_profile_ == owner()->GetProfile()) | 300 if (observed_profile_ == owner()->GetProfile()) { |
301 AttachControllerToWindowIfNeeded(window); | 301 if (AttachControllerToWindowIfNeeded(window)) |
| 302 window->Show(); |
| 303 } else { |
| 304 chrome::MultiUserWindowManager* multi_user_manager = |
| 305 chrome::MultiUserWindowManager::GetInstance(); |
| 306 if (multi_user_manager->GetWindowOwner(window).empty()) { |
| 307 multi_user_manager->SetWindowOwner( |
| 308 window, |
| 309 user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); |
| 310 // Now the window is registered for primary user however it is marked as |
| 311 // hidden. Manually mark it as visible in order to get it automatically |
| 312 // restored when user switches back to primary profile. |
| 313 multi_user_manager->MarkWindowAsVisible(window); |
| 314 } |
| 315 } |
302 } | 316 } |
303 | 317 |
304 void ArcAppWindowLauncherController::OnWindowDestroying(aura::Window* window) { | 318 void ArcAppWindowLauncherController::OnWindowDestroying(aura::Window* window) { |
305 auto it = | 319 auto it = |
306 std::find(observed_windows_.begin(), observed_windows_.end(), window); | 320 std::find(observed_windows_.begin(), observed_windows_.end(), window); |
307 DCHECK(it != observed_windows_.end()); | 321 DCHECK(it != observed_windows_.end()); |
308 observed_windows_.erase(it); | 322 observed_windows_.erase(it); |
309 window->RemoveObserver(this); | 323 window->RemoveObserver(this); |
310 | 324 |
311 auto it_app_window = | 325 auto it_app_window = |
(...skipping 16 matching lines...) Expand all Loading... |
328 if (it == task_id_to_app_window_.end()) | 342 if (it == task_id_to_app_window_.end()) |
329 return nullptr; | 343 return nullptr; |
330 return it->second.get(); | 344 return it->second.get(); |
331 } | 345 } |
332 | 346 |
333 void ArcAppWindowLauncherController::AttachControllerToWindowsIfNeeded() { | 347 void ArcAppWindowLauncherController::AttachControllerToWindowsIfNeeded() { |
334 for (auto* window : observed_windows_) | 348 for (auto* window : observed_windows_) |
335 AttachControllerToWindowIfNeeded(window); | 349 AttachControllerToWindowIfNeeded(window); |
336 } | 350 } |
337 | 351 |
338 void ArcAppWindowLauncherController::AttachControllerToWindowIfNeeded( | 352 bool ArcAppWindowLauncherController::AttachControllerToWindowIfNeeded( |
339 aura::Window* window) { | 353 aura::Window* window) { |
| 354 if (!exo::ShellSurface::IsApplicationWindowReadyToShow(window)) |
| 355 return false; |
| 356 |
340 const std::string window_app_id = exo::ShellSurface::GetApplicationId(window); | 357 const std::string window_app_id = exo::ShellSurface::GetApplicationId(window); |
341 if (window_app_id.empty()) | 358 if (window_app_id.empty()) |
342 return; | 359 return false; |
343 | 360 |
344 int task_id = -1; | 361 int task_id = -1; |
345 if (sscanf(window_app_id.c_str(), "org.chromium.arc.%d", &task_id) != 1) | 362 if (sscanf(window_app_id.c_str(), "org.chromium.arc.%d", &task_id) != 1) |
346 return; | 363 return false; |
347 | 364 |
348 if (!task_id) | 365 if (!task_id) |
349 return; | 366 return false; |
350 | 367 |
351 // We need to add the observer after exo started observing shell | 368 // We need to add the observer after exo started observing shell |
352 // because we want to update the orientation after exo send | 369 // because we want to update the orientation after exo send |
353 // the layout switch information. | 370 // the layout switch information. |
354 if (!observing_shell_) { | 371 if (!observing_shell_) { |
355 observing_shell_ = true; | 372 observing_shell_ = true; |
356 ash::WmShell::Get()->AddShellObserver(this); | 373 ash::WmShell::Get()->AddShellObserver(this); |
357 } | 374 } |
358 | 375 |
359 // Check if we have controller for this task. | 376 // Check if we have controller for this task. |
360 if (GetAppWindowForTask(task_id)) | 377 if (GetAppWindowForTask(task_id)) |
361 return; | 378 return false; |
362 | 379 |
363 // Create controller if we have task info. | 380 // Create controller if we have task info. |
364 TaskIdToShelfAppIdMap::iterator it = task_id_to_shelf_app_id_.find(task_id); | 381 TaskIdToShelfAppIdMap::iterator it = task_id_to_shelf_app_id_.find(task_id); |
365 if (it == task_id_to_shelf_app_id_.end()) | 382 if (it == task_id_to_shelf_app_id_.end()) |
366 return; | 383 return false; |
367 | 384 |
368 const std::string& app_id = it->second; | 385 const std::string& app_id = it->second; |
369 | 386 |
370 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); | 387 views::Widget* widget = views::Widget::GetWidgetForNativeWindow(window); |
371 DCHECK(widget); | 388 DCHECK(widget); |
372 std::unique_ptr<AppWindow> app_window( | 389 std::unique_ptr<AppWindow> app_window( |
373 new AppWindow(task_id, app_id, widget, this)); | 390 new AppWindow(task_id, app_id, widget, this)); |
374 RegisterApp(app_window.get()); | 391 RegisterApp(app_window.get()); |
375 DCHECK(app_window->controller()); | 392 DCHECK(app_window->controller()); |
376 ash::WmWindowAura::Get(window)->SetIntProperty( | 393 ash::WmWindowAura::Get(window)->SetIntProperty( |
377 ash::WmWindowProperty::SHELF_ID, app_window->shelf_id()); | 394 ash::WmWindowProperty::SHELF_ID, app_window->shelf_id()); |
378 chrome::MultiUserWindowManager::GetInstance()->SetWindowOwner( | 395 chrome::MultiUserWindowManager::GetInstance()->SetWindowOwner( |
379 window, | 396 window, |
380 user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); | 397 user_manager::UserManager::Get()->GetPrimaryUser()->GetAccountId()); |
381 if (ash::WmShell::Get() | 398 if (ash::WmShell::Get() |
382 ->maximize_mode_controller() | 399 ->maximize_mode_controller() |
383 ->IsMaximizeModeWindowManagerEnabled()) { | 400 ->IsMaximizeModeWindowManagerEnabled()) { |
384 SetOrientationLockForAppWindow(app_window.get()); | 401 SetOrientationLockForAppWindow(app_window.get()); |
385 } | 402 } |
386 task_id_to_app_window_[task_id] = std::move(app_window); | 403 task_id_to_app_window_[task_id] = std::move(app_window); |
| 404 return true; |
387 } | 405 } |
388 | 406 |
389 void ArcAppWindowLauncherController::OnAppReadyChanged( | 407 void ArcAppWindowLauncherController::OnAppReadyChanged( |
390 const std::string& app_id, | 408 const std::string& app_id, |
391 bool ready) { | 409 bool ready) { |
392 if (!ready) | 410 if (!ready) |
393 OnAppRemoved(app_id); | 411 OnAppRemoved(app_id); |
394 } | 412 } |
395 | 413 |
396 void ArcAppWindowLauncherController::OnAppRemoved(const std::string& app_id) { | 414 void ArcAppWindowLauncherController::OnAppRemoved(const std::string& app_id) { |
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
636 if (orientation_lock == arc::mojom::OrientationLock::CURRENT) { | 654 if (orientation_lock == arc::mojom::OrientationLock::CURRENT) { |
637 // Resolve the orientation when it first resolved. | 655 // Resolve the orientation when it first resolved. |
638 orientation_lock = GetCurrentOrientation(); | 656 orientation_lock = GetCurrentOrientation(); |
639 app_window->set_requested_orientation_lock(orientation_lock); | 657 app_window->set_requested_orientation_lock(orientation_lock); |
640 } | 658 } |
641 | 659 |
642 ash::Shell* shell = ash::Shell::GetInstance(); | 660 ash::Shell* shell = ash::Shell::GetInstance(); |
643 shell->screen_orientation_controller()->LockOrientationForWindow( | 661 shell->screen_orientation_controller()->LockOrientationForWindow( |
644 window, BlinkOrientationLockFromMojom(orientation_lock)); | 662 window, BlinkOrientationLockFromMojom(orientation_lock)); |
645 } | 663 } |
OLD | NEW |