1f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved. 2f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// found in the LICENSE file. 4f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 5f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/ui/webui/chromeos/login/demo_mode_detector.h" 6f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 7f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/command_line.h" 8116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch#include "base/prefs/pref_registry_simple.h" 9f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/prefs/pref_service.h" 10f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "base/strings/string_number_conversions.h" 111320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "base/sys_info.h" 12f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/browser_process.h" 13f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host.h" 14f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/browser/chromeos/login/ui/login_display_host_impl.h" 15f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chrome/common/pref_names.h" 16f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)#include "chromeos/chromeos_switches.h" 17f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 18f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace { 19f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const int kDerelectDetectionTimeoutSeconds = 8 * 60 * 60; // 8 hours. 20f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const int kDerelectIdleTimeoutSeconds = 5 * 60; // 5 minutes. 21f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) const int kOobeTimerUpdateIntervalSeconds = 5 * 60; // 5 minutes. 22f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace 23f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 24f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)namespace chromeos { 25f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 26f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)DemoModeDetector::DemoModeDetector() 27f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) : demo_launched_(false), 28f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) weak_ptr_factory_(this) { 29f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) SetupTimeouts(); 30f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 31f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 32f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)DemoModeDetector::~DemoModeDetector() { 33f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 34f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 35116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Public methods. 36116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 37f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::InitDetection() { 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (CommandLine::ForCurrentProcess()->HasSwitch(switches::kDisableDemoMode)) 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (base::SysInfo::IsRunningOnChromeOS()) { 421320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci std::string track; 431320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // We're running on an actual device; if we cannot find our release track 441320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // value or if the track contains "testimage", don't start demo mode. 451320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (!base::SysInfo::GetLsbReleaseValue("CHROMEOS_RELEASE_TRACK", &track) || 461320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci track.find("testimage") != std::string::npos) 471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci return; 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 50f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (IsDerelict()) 51f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StartIdleDetection(); 52f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else 53f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StartOobeTimer(); 54f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 55f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 56f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::StopDetection() { 57f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) idle_detector_.reset(); 58f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 59f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 60116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// static 61116680a4aac90f2aa7413d9095a592090648e557Ben Murdochvoid DemoModeDetector::RegisterPrefs(PrefRegistrySimple* registry) { 62116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch registry->RegisterInt64Pref(prefs::kTimeOnOobe, 0); 63116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch} 64116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 65116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// Private methods. 66116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 67f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::StartIdleDetection() { 68f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!idle_detector_.get()) { 69f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) idle_detector_.reset( 70f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) new IdleDetector(base::Closure(), 71f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&DemoModeDetector::OnIdle, 72f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) weak_ptr_factory_.GetWeakPtr()))); 73f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 74f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) idle_detector_->Start(derelict_idle_timeout_); 75f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 76f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 77f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::StartOobeTimer() { 78f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (oobe_timer_.IsRunning()) 79f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 80f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) oobe_timer_.Start(FROM_HERE, 81f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) oobe_timer_update_interval_, 82f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) this, 83f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &DemoModeDetector::OnOobeTimerUpdate); 84f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 85f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 86f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::OnIdle() { 87f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (demo_launched_) 88f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return; 89f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) demo_launched_ = true; 90f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) LoginDisplayHost* host = LoginDisplayHostImpl::default_host(); 91f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) host->StartDemoAppLaunch(); 92f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 93f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 94f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::OnOobeTimerUpdate() { 95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) time_on_oobe_ += oobe_timer_update_interval_; 96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 98f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) prefs->SetInt64(prefs::kTimeOnOobe, time_on_oobe_.InSeconds()); 99f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 100f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (IsDerelict()) { 101f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) oobe_timer_.Stop(); 102f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) StartIdleDetection(); 103f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 104f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 105f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 106f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)void DemoModeDetector::SetupTimeouts() { 107f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) CommandLine* cmdline = CommandLine::ForCurrentProcess(); 108f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) DCHECK(cmdline); 109f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 110f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) PrefService* prefs = g_browser_process->local_state(); 111f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) time_on_oobe_ = 112f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta::FromSeconds(prefs->GetInt64(prefs::kTimeOnOobe)); 113f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 114f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int derelict_detection_timeout; 115f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!cmdline->HasSwitch(switches::kDerelictDetectionTimeout) || 116f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !base::StringToInt( 117f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmdline->GetSwitchValueASCII(switches::kDerelictDetectionTimeout), 118f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &derelict_detection_timeout)) { 119f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) derelict_detection_timeout = kDerelectDetectionTimeoutSeconds; 120f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 121f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) derelict_detection_timeout_ = 122f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta::FromSeconds(derelict_detection_timeout); 123f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 124f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int derelict_idle_timeout; 125f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!cmdline->HasSwitch(switches::kDerelictIdleTimeout) || 126f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !base::StringToInt( 127f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmdline->GetSwitchValueASCII(switches::kDerelictIdleTimeout), 128f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &derelict_idle_timeout)) { 129f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) derelict_idle_timeout = kDerelectIdleTimeoutSeconds; 130f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 131f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) derelict_idle_timeout_ = base::TimeDelta::FromSeconds(derelict_idle_timeout); 132f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 133f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 134f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) int oobe_timer_update_interval; 135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (!cmdline->HasSwitch(switches::kOobeTimerInterval) || 136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) !base::StringToInt( 137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) cmdline->GetSwitchValueASCII(switches::kOobeTimerInterval), 138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) &oobe_timer_update_interval)) { 139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) oobe_timer_update_interval = kOobeTimerUpdateIntervalSeconds; 140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) oobe_timer_update_interval_ = 142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta::FromSeconds(oobe_timer_update_interval); 143f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 144f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // In case we'd be derelict before our timer is set to trigger, reduce 145f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) // the interval so we check again when we're scheduled to go derelict. 146f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) oobe_timer_update_interval_ = 147f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) std::max(std::min(oobe_timer_update_interval_, 148f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) derelict_detection_timeout_ - time_on_oobe_), 149f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::TimeDelta::FromSeconds(0)); 150f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 151f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 152f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)bool DemoModeDetector::IsDerelict() { 153f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) return time_on_oobe_ >= derelict_detection_timeout_; 154f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} 155f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 156f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)} // namespace chromeos 157