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/multi_user/multi_user_window_manager.h" 6 7 #include "base/logging.h" 8 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_stub.h" 9 10 #if defined(OS_CHROMEOS) 11 #include "ash/ash_switches.h" 12 #include "ash/multi_profile_uma.h" 13 #include "ash/session/session_state_delegate.h" 14 #include "ash/shell.h" 15 #include "ash/shell_delegate.h" 16 #include "chrome/browser/ui/ash/multi_user/multi_user_window_manager_chromeos.h" 17 #include "components/user_manager/user_info.h" 18 #endif 19 20 namespace { 21 chrome::MultiUserWindowManager* g_instance = NULL; 22 } // namespace 23 24 namespace chrome { 25 26 // Caching the current multi profile mode to avoid expensive detection 27 // operations. 28 chrome::MultiUserWindowManager::MultiProfileMode 29 chrome::MultiUserWindowManager::multi_user_mode_ = 30 chrome::MultiUserWindowManager::MULTI_PROFILE_MODE_UNINITIALIZED; 31 32 // static 33 MultiUserWindowManager* MultiUserWindowManager::GetInstance() { 34 return g_instance; 35 } 36 37 MultiUserWindowManager* MultiUserWindowManager::CreateInstance() { 38 DCHECK(!g_instance); 39 multi_user_mode_ = MULTI_PROFILE_MODE_OFF; 40 #if defined(OS_CHROMEOS) 41 ash::MultiProfileUMA::SessionMode mode = 42 ash::MultiProfileUMA::SESSION_SINGLE_USER_MODE; 43 if (!g_instance && 44 ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) { 45 g_instance = 46 new MultiUserWindowManagerChromeOS(ash::Shell::GetInstance() 47 ->session_state_delegate() 48 ->GetUserInfo(0) 49 ->GetUserID()); 50 multi_user_mode_ = MULTI_PROFILE_MODE_SEPARATED; 51 mode = ash::MultiProfileUMA::SESSION_SEPARATE_DESKTOP_MODE; 52 } else if (ash::Shell::GetInstance()->delegate()->IsMultiProfilesEnabled()) { 53 // The side by side mode is using the Single user window manager since all 54 // windows are unmanaged side by side. 55 multi_user_mode_ = MULTI_PROFILE_MODE_MIXED; 56 mode = ash::MultiProfileUMA::SESSION_SIDE_BY_SIDE_MODE; 57 } 58 ash::MultiProfileUMA::RecordSessionMode(mode); 59 #endif 60 // If there was no instance created yet we create a dummy instance. 61 if (!g_instance) 62 g_instance = new MultiUserWindowManagerStub(); 63 64 return g_instance; 65 } 66 67 // static 68 MultiUserWindowManager::MultiProfileMode 69 MultiUserWindowManager::GetMultiProfileMode() { 70 return multi_user_mode_; 71 } 72 73 // satic 74 bool MultiUserWindowManager::ShouldShowAvatar(aura::Window* window) { 75 // Note: In case of the M-31 mode the window manager won't exist. 76 if (GetMultiProfileMode() == MULTI_PROFILE_MODE_SEPARATED) { 77 // If the window is shown on a different desktop than the user, it should 78 // have the avatar icon 79 MultiUserWindowManager* instance = GetInstance(); 80 return !instance->IsWindowOnDesktopOfUser(window, 81 instance->GetWindowOwner(window)); 82 } 83 return false; 84 } 85 86 // static 87 void MultiUserWindowManager::DeleteInstance() { 88 DCHECK(g_instance); 89 delete g_instance; 90 g_instance = NULL; 91 multi_user_mode_ = MULTI_PROFILE_MODE_UNINITIALIZED; 92 } 93 94 void MultiUserWindowManager::SetInstanceForTest( 95 MultiUserWindowManager* instance, 96 MultiProfileMode mode) { 97 if (g_instance) 98 DeleteInstance(); 99 g_instance = instance; 100 multi_user_mode_ = mode; 101 } 102 103 } // namespace chrome 104