15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/chrome_shell_delegate.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ash/content_support/gpu_support_impl.h"
82a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ash/magnifier/magnifier_constants.h"
968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ash/wm/window_state.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/window_util.h"
112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "chrome/browser/app_mode/app_mode_utils.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/lifetime/application_lifetime.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/profiles/profile_manager.h"
14cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chrome/browser/profiles/profiles_state.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/app_list/app_list_view_delegate.h"
161320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/browser/ui/ash/app_list/app_list_service_ash.h"
17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "chrome/browser/ui/ash/ash_keyboard_controller_proxy.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/launcher/chrome_launcher_controller.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/ash/launcher/launcher_context_menu.h"
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chrome/browser/ui/browser_commands.h"
211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "chrome/grit/chromium_strings.h"
220529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch#include "components/signin/core/common/profile_management_switches.h"
232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "ui/base/l10n/l10n_util.h"
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#if defined(OS_CHROMEOS)
260f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#include "chrome/browser/chromeos/accessibility/accessibility_manager.h"
275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chrome/browser/chromeos/display/display_configuration_observer.h"
286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)#include "components/user_manager/user_manager.h"
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#endif
30c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// static
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeShellDelegate* ChromeShellDelegate::instance_ = NULL;
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeShellDelegate::ChromeShellDelegate()
35a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    : shelf_delegate_(NULL) {
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  instance_ = this;
372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  PlatformInit();
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)ChromeShellDelegate::~ChromeShellDelegate() {
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (instance_ == this)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    instance_ = NULL;
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)bool ChromeShellDelegate::IsMultiProfilesEnabled() const {
46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  if (!profiles::IsMultipleProfilesEnabled())
47d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
48d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#if defined(OS_CHROMEOS)
49d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // If there is a user manager, we need to see that we can at least have 2
50d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  // simultaneous users to allow this feature.
516e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  if (!user_manager::UserManager::IsInitialized())
521e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    return false;
536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  size_t admitted_users_to_be_added = user_manager::UserManager::Get()
546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          ->GetUsersAdmittedForMultiProfile()
556e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)                                          .size();
561e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  size_t logged_in_users =
576e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)      user_manager::UserManager::Get()->GetLoggedInUsers().size();
581e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (!logged_in_users) {
591e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // The shelf gets created on the login screen and as such we have to create
601e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // all multi profile items of the the system tray menu before the user logs
611e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // in. For special cases like Kiosk mode and / or guest mode this isn't a
621e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // problem since either the browser gets restarted and / or the flag is not
631e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // allowed, but for an "ephermal" user (see crbug.com/312324) it is not
641e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // decided yet if he could add other users to his session or not.
651e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // TODO(skuhne): As soon as the issue above needs to be resolved, this logic
661e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    // should change.
671e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)    logged_in_users = 1;
681e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  }
691e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles)  if (admitted_users_to_be_added + logged_in_users <= 1)
70d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)    return false;
71d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#endif
72d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)  return true;
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
750f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)bool ChromeShellDelegate::IsIncognitoAllowed() const {
760f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#if defined(OS_CHROMEOS)
770f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return chromeos::AccessibilityManager::Get()->IsIncognitoAllowed();
780f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)#endif
790f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)  return true;
800f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)}
810f1bc08d4cfcc34181b0b5cbf065c40f687bf740Torne (Richard Coles)
822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)bool ChromeShellDelegate::IsRunningInForcedAppMode() const {
832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return chrome::IsRunningInForcedAppMode();
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
86a02191e04bc25c4935f804f2c080ae28663d096dBen Murdochbool ChromeShellDelegate::IsMultiAccountEnabled() const {
87a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#if defined(OS_CHROMEOS)
885f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return switches::IsEnableAccountConsistency();
89a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch#endif
90a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch  return false;
91a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch}
92a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void ChromeShellDelegate::Exit() {
942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  chrome::AttemptUserExit();
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)content::BrowserContext* ChromeShellDelegate::GetActiveBrowserContext() {
985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#if defined(OS_CHROMEOS)
996e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)  DCHECK(user_manager::UserManager::Get()->GetLoggedInUsers().size());
1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#endif
1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return ProfileManager::GetActiveUserProfile();
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucciapp_list::AppListViewDelegate* ChromeShellDelegate::GetAppListViewDelegate() {
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DCHECK(ash::Shell::HasInstance());
1061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return AppListServiceAsh::GetInstance()->GetViewDelegate(
1071320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci      Profile::FromBrowserContext(GetActiveBrowserContext()));
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
110a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)ash::ShelfDelegate* ChromeShellDelegate::CreateShelfDelegate(
111f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)    ash::ShelfModel* model) {
112a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  if (!shelf_delegate_) {
113a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    shelf_delegate_ = ChromeLauncherController::CreateInstance(NULL, model);
114a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)    shelf_delegate_->Init();
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
116a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return shelf_delegate_;
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ui::MenuModel* ChromeShellDelegate::CreateContextMenu(
1205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    aura::Window* root,
1215d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ash::ShelfItemDelegate* item_delegate,
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ash::ShelfItem* item) {
123a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  DCHECK(shelf_delegate_);
1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  // Don't show context menu for exclusive app runtime mode.
1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  if (chrome::IsRunningInAppMode())
1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    return NULL;
1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  if (item_delegate && item)
1295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    return new LauncherContextMenu(shelf_delegate_, item_delegate, item, root);
1305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)
131a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)  return new LauncherContextMenu(shelf_delegate_, root);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1345d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)ash::GPUSupport* ChromeShellDelegate::CreateGPUSupport() {
1355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  // Chrome uses real GPU support.
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  return new ash::GPUSupportImpl;
1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1395d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)base::string16 ChromeShellDelegate::GetProductName() const {
1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  return l10n_util::GetStringUTF16(IDS_PRODUCT_NAME);
1412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}
1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)keyboard::KeyboardControllerProxy*
144c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)    ChromeShellDelegate::CreateKeyboardControllerProxy() {
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)  return new AshKeyboardControllerProxy();
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}
147c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
148c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ChromeShellDelegate::VirtualKeyboardActivated(bool activated) {
149c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  FOR_EACH_OBSERVER(ash::VirtualKeyboardStateObserver,
150c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    keyboard_state_observer_list_,
151c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch                    OnVirtualKeyboardStateChanged(activated));
152c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
153c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
154c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ChromeShellDelegate::AddVirtualKeyboardStateObserver(
155c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ash::VirtualKeyboardStateObserver* observer) {
156c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  keyboard_state_observer_list_.AddObserver(observer);
157c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
158c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch
159c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdochvoid ChromeShellDelegate::RemoveVirtualKeyboardStateObserver(
160c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch    ash::VirtualKeyboardStateObserver* observer) {
161c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch  keyboard_state_observer_list_.RemoveObserver(observer);
162c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch}
163