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