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