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 "ash/wm/user_activity_detector.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/property_util.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ash/wm/user_activity_observer.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/base/events/event.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ash { 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int UserActivityDetector::kNotifyIntervalMs = 200; 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Too low and mouse events generated at the tail end of reconfiguration 162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// will be reported as user activity and turn the screen back on; too high 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// and we'll ignore legitimate activity. 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const int UserActivityDetector::kDisplayPowerChangeIgnoreMouseMs = 1000; 192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)UserActivityDetector::UserActivityDetector() { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)UserActivityDetector::~UserActivityDetector() { 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool UserActivityDetector::HasObserver(UserActivityObserver* observer) const { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return observers_.HasObserver(observer); 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UserActivityDetector::AddObserver(UserActivityObserver* observer) { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.AddObserver(observer); 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void UserActivityDetector::RemoveObserver(UserActivityObserver* observer) { 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) observers_.RemoveObserver(observer); 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserActivityDetector::OnDisplayPowerChanging() { 392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) honor_mouse_events_time_ = GetCurrentTime() + 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeDelta::FromMilliseconds(kDisplayPowerChangeIgnoreMouseMs); 412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserActivityDetector::OnKeyEvent(ui::KeyEvent* event) { 447dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HandleActivity(event); 452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserActivityDetector::OnMouseEvent(ui::MouseEvent* event) { 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (event->flags() & ui::EF_IS_SYNTHESIZED) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (!honor_mouse_events_time_.is_null() && 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) GetCurrentTime() < honor_mouse_events_time_) 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return; 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 547dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HandleActivity(event); 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserActivityDetector::OnScrollEvent(ui::ScrollEvent* event) { 587dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HandleActivity(event); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserActivityDetector::OnTouchEvent(ui::TouchEvent* event) { 627dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HandleActivity(event); 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)void UserActivityDetector::OnGestureEvent(ui::GestureEvent* event) { 667dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch HandleActivity(event); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)base::TimeTicks UserActivityDetector::GetCurrentTime() const { 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return !now_for_test_.is_null() ? now_for_test_ : base::TimeTicks::Now(); 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 737dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochvoid UserActivityDetector::HandleActivity(const ui::Event* event) { 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::TimeTicks now = GetCurrentTime(); 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) last_activity_time_ = now; 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (last_observer_notification_time_.is_null() || 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (now - last_observer_notification_time_).InMillisecondsF() >= 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) kNotifyIntervalMs) { 797dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch FOR_EACH_OBSERVER(UserActivityObserver, observers_, OnUserActivity(event)); 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) last_observer_notification_time_ = now; 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace ash 85