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