| OLD | NEW |
| (Empty) |
| 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/ash/launcher/multi_profile_shell_window_launcher_con
troller.h" | |
| 6 | |
| 7 #include "apps/app_window.h" | |
| 8 #include "chrome/browser/profiles/profile.h" | |
| 9 #include "chrome/browser/profiles/profile_manager.h" | |
| 10 #include "chrome/browser/ui/ash/multi_user/multi_user_util.h" | |
| 11 #include "chrome/browser/ui/host_desktop.h" | |
| 12 | |
| 13 namespace { | |
| 14 | |
| 15 bool ControlsWindow(aura::Window* window) { | |
| 16 return chrome::GetHostDesktopTypeForNativeWindow(window) == | |
| 17 chrome::HOST_DESKTOP_TYPE_ASH; | |
| 18 } | |
| 19 | |
| 20 } // namespace | |
| 21 | |
| 22 | |
| 23 MultiProfileShellWindowLauncherController:: | |
| 24 MultiProfileShellWindowLauncherController( | |
| 25 ChromeLauncherController* owner) | |
| 26 : ShellWindowLauncherController(owner) { | |
| 27 } | |
| 28 | |
| 29 MultiProfileShellWindowLauncherController:: | |
| 30 ~MultiProfileShellWindowLauncherController() { | |
| 31 // We need to remove all Registry observers for added users. | |
| 32 for (AppWindowRegistryList::iterator it = multi_user_registry_.begin(); | |
| 33 it != multi_user_registry_.end(); | |
| 34 ++it) | |
| 35 (*it)->RemoveObserver(this); | |
| 36 } | |
| 37 | |
| 38 void MultiProfileShellWindowLauncherController::ActiveUserChanged( | |
| 39 const std::string& user_email) { | |
| 40 // The active user has changed and we need to traverse our list of items to | |
| 41 // show / hide them one by one. To avoid that a user dependent state | |
| 42 // "survives" in a launcher item, we first delete all items making sure that | |
| 43 // nothing remains and then re-create them again. | |
| 44 for (AppWindowList::iterator it = app_window_list_.begin(); | |
| 45 it != app_window_list_.end(); | |
| 46 ++it) { | |
| 47 apps::AppWindow* app_window = *it; | |
| 48 Profile* profile = | |
| 49 Profile::FromBrowserContext(app_window->browser_context()); | |
| 50 if (!multi_user_util::IsProfileFromActiveUser(profile) && | |
| 51 IsRegisteredApp(app_window->GetNativeWindow())) | |
| 52 UnregisterApp(app_window->GetNativeWindow()); | |
| 53 } | |
| 54 for (AppWindowList::iterator it = app_window_list_.begin(); | |
| 55 it != app_window_list_.end(); | |
| 56 ++it) { | |
| 57 apps::AppWindow* app_window = *it; | |
| 58 Profile* profile = | |
| 59 Profile::FromBrowserContext(app_window->browser_context()); | |
| 60 if (multi_user_util::IsProfileFromActiveUser(profile) && | |
| 61 !IsRegisteredApp(app_window->GetNativeWindow())) | |
| 62 RegisterApp(*it); | |
| 63 } | |
| 64 } | |
| 65 | |
| 66 void MultiProfileShellWindowLauncherController::AdditionalUserAddedToSession( | |
| 67 Profile* profile) { | |
| 68 // Each users AppWindowRegistry needs to be observed. | |
| 69 apps::AppWindowRegistry* registry = apps::AppWindowRegistry::Get(profile); | |
| 70 multi_user_registry_.push_back(registry); | |
| 71 registry->AddObserver(this); | |
| 72 } | |
| 73 | |
| 74 void MultiProfileShellWindowLauncherController::OnAppWindowAdded( | |
| 75 apps::AppWindow* app_window) { | |
| 76 if (!ControlsWindow(app_window->GetNativeWindow())) | |
| 77 return; | |
| 78 app_window_list_.push_back(app_window); | |
| 79 Profile* profile = Profile::FromBrowserContext(app_window->browser_context()); | |
| 80 if (multi_user_util::IsProfileFromActiveUser(profile)) | |
| 81 RegisterApp(app_window); | |
| 82 } | |
| 83 | |
| 84 void MultiProfileShellWindowLauncherController::OnAppWindowRemoved( | |
| 85 apps::AppWindow* app_window) { | |
| 86 if (!ControlsWindow(app_window->GetNativeWindow())) | |
| 87 return; | |
| 88 | |
| 89 // If the application is registered with ShellWindowLauncher (because the user | |
| 90 // is currently active), the OnWindowDestroying observer has already (or will | |
| 91 // soon) unregister it independently from the shelf. If it was not registered | |
| 92 // we don't need to do anything anyways. As such, all which is left to do here | |
| 93 // is to get rid of our own reference. | |
| 94 AppWindowList::iterator it = | |
| 95 std::find(app_window_list_.begin(), app_window_list_.end(), app_window); | |
| 96 DCHECK(it != app_window_list_.end()); | |
| 97 app_window_list_.erase(it); | |
| 98 } | |
| OLD | NEW |