44 *--------------------------------------------------------------------------------------------*/
55'use strict' ;
66
7- import DomUtils = require ( 'vs/base/browser/dom' ) ;
8- import { IDisposable , disposeAll } from 'vs/base/common/lifecycle' ;
7+ import * as DomUtils from 'vs/base/browser/dom' ;
8+ import { Disposable , IDisposable , disposeAll } from 'vs/base/common/lifecycle' ;
99import { EventEmitter , ListenerUnbind } from 'vs/base/common/eventEmitter' ;
1010import { getService } from 'vs/base/browser/browserService' ;
11+ import { TimeoutTimer } from 'vs/base/common/async' ;
1112
1213export enum UserStatus {
1314 Idle ,
@@ -16,151 +17,73 @@ export enum UserStatus {
1617
1718export const DEFAULT_IDLE_TIME = 60 * 60 * 1000 ; // 60 minutes
1819
19- export class IdleMonitor {
20+ export class IdleMonitor extends Disposable {
2021
21- private toDispose : IDisposable [ ] ;
22- private lastActiveTime : number ;
23- private idleCheckTimeout : number ;
24- private status : UserStatus ;
25- private eventEmitter : EventEmitter ;
26- private instance : ReferenceCountedIdleMonitor ;
27- private idleTime : number ;
22+ private _lastActiveTime : number ;
23+ private _idleCheckTimeout : TimeoutTimer ;
24+ private _status : UserStatus ;
25+ private _eventEmitter : EventEmitter ;
26+ private _idleTime : number ;
2827
2928 constructor ( idleTime : number = DEFAULT_IDLE_TIME ) {
30- this . instance = ReferenceCountedIdleMonitor . INSTANCE ;
31- this . instance . increment ( ) ;
32-
33- this . status = null ;
34- this . idleCheckTimeout = - 1 ;
35- this . lastActiveTime = - 1 ;
36- this . idleTime = idleTime ;
37-
38- this . toDispose = [ ] ;
39- this . eventEmitter = new EventEmitter ( ) ;
40- this . toDispose . push ( this . eventEmitter ) ;
41- this . toDispose . push ( { dispose : this . instance . addListener ( ( ) => this . onUserActive ( ) ) } ) ;
42- this . onUserActive ( ) ;
43- }
29+ super ( ) ;
4430
45- public addOneTimeActiveListener ( callback : ( ) => void ) : IDisposable {
46- return this . eventEmitter . addOneTimeDisposableListener ( 'onActive' , callback ) ;
47- }
48-
49- public addOneTimeIdleListener ( callback : ( ) => void ) : IDisposable {
50- return this . eventEmitter . addOneTimeDisposableListener ( 'onIdle' , callback ) ;
51- }
31+ this . _status = null ;
32+ this . _idleCheckTimeout = this . _register ( new TimeoutTimer ( ) ) ;
33+ this . _lastActiveTime = - 1 ;
34+ this . _idleTime = idleTime ;
5235
53- public getStatus ( ) : UserStatus {
54- return this . status ;
36+ this . _eventEmitter = this . _register ( new EventEmitter ( ) ) ;
37+ this . _register ( DomUtils . addDisposableListener ( getService ( ) . document , 'mousemove' , ( ) => this . _onUserActive ( ) ) ) ;
38+ this . _register ( DomUtils . addDisposableListener ( getService ( ) . document , 'keydown' , ( ) => this . _onUserActive ( ) ) ) ;
39+ this . _onUserActive ( ) ;
5540 }
5641
5742 public dispose ( ) : void {
58- this . cancelIdleCheck ( ) ;
59- this . toDispose = disposeAll ( this . toDispose ) ;
60- this . instance . decrement ( ) ;
43+ super . dispose ( ) ;
6144 }
6245
63- private onUserActive ( ) : void {
64- this . lastActiveTime = ( new Date ( ) ) . getTime ( ) ;
65- if ( this . status !== UserStatus . Active ) {
66- this . status = UserStatus . Active ;
67- this . scheduleIdleCheck ( ) ;
68- this . eventEmitter . emit ( 'onActive' ) ;
69- }
46+ public addOneTimeActiveListener ( callback : ( ) => void ) : IDisposable {
47+ return this . _eventEmitter . addOneTimeDisposableListener ( 'onActive' , callback ) ;
7048 }
7149
72- private onUserIdle ( ) : void {
73- if ( this . status !== UserStatus . Idle ) {
74- this . status = UserStatus . Idle ;
75- this . eventEmitter . emit ( 'onIdle' ) ;
76- }
50+ public addOneTimeIdleListener ( callback : ( ) => void ) : IDisposable {
51+ return this . _eventEmitter . addOneTimeDisposableListener ( 'onIdle' , callback ) ;
7752 }
7853
79- private scheduleIdleCheck ( ) : void {
80- if ( this . idleCheckTimeout === - 1 ) {
81- let minimumTimeWhenUserCanBecomeIdle = this . lastActiveTime + this . idleTime ;
82- this . idleCheckTimeout = setTimeout ( ( ) => {
83- this . idleCheckTimeout = - 1 ;
84- this . checkIfUserIsIdle ( ) ;
85- } , minimumTimeWhenUserCanBecomeIdle - ( new Date ( ) ) . getTime ( ) ) ;
86- }
54+ public getStatus ( ) : UserStatus {
55+ return this . _status ;
8756 }
8857
89- private cancelIdleCheck ( ) : void {
90- if ( this . idleCheckTimeout !== - 1 ) {
91- clearTimeout ( this . idleCheckTimeout ) ;
92- this . idleCheckTimeout = - 1 ;
58+ private _onUserActive ( ) : void {
59+ this . _lastActiveTime = ( new Date ( ) ) . getTime ( ) ;
60+ if ( this . _status !== UserStatus . Active ) {
61+ this . _status = UserStatus . Active ;
62+ this . _scheduleIdleCheck ( ) ;
63+ this . _eventEmitter . emit ( 'onActive' ) ;
9364 }
9465 }
9566
96- private checkIfUserIsIdle ( ) : void {
97- let actualIdleTime = ( new Date ( ) ) . getTime ( ) - this . lastActiveTime ;
98- if ( actualIdleTime >= this . idleTime ) {
99- this . onUserIdle ( ) ;
100- } else {
101- this . scheduleIdleCheck ( ) ;
67+ private _onUserIdle ( ) : void {
68+ if ( this . _status !== UserStatus . Idle ) {
69+ this . _status = UserStatus . Idle ;
70+ this . _eventEmitter . emit ( 'onIdle' ) ;
10271 }
10372 }
104- }
105-
106- class ReferenceCountedObject {
107-
108- private referenceCount : number ;
109-
110- constructor ( ) {
111- this . referenceCount = 0 ;
112- }
11373
114- public increment ( ) : void {
115- if ( this . referenceCount === 0 ) {
116- this . construct ( ) ;
117- }
118- this . referenceCount ++ ;
74+ private _scheduleIdleCheck ( ) : void {
75+ let minimumTimeWhenUserCanBecomeIdle = this . _lastActiveTime + this . _idleTime ;
76+ this . _idleCheckTimeout . setIfNotSet ( ( ) => {
77+ this . _checkIfUserIsIdle ( ) ;
78+ } , minimumTimeWhenUserCanBecomeIdle - ( new Date ( ) ) . getTime ( ) ) ;
11979 }
12080
121- public decrement ( ) : void {
122- if ( this . referenceCount > 0 ) {
123- this . referenceCount -- ;
124- if ( this . referenceCount === 0 ) {
125- this . dispose ( ) ;
126- }
81+ private _checkIfUserIsIdle ( ) : void {
82+ let actualIdleTime = ( new Date ( ) ) . getTime ( ) - this . _lastActiveTime ;
83+ if ( actualIdleTime >= this . _idleTime ) {
84+ this . _onUserIdle ( ) ;
85+ } else {
86+ this . _scheduleIdleCheck ( ) ;
12787 }
12888 }
129-
130- public construct ( ) : void {
131- throw new Error ( 'Implement me' ) ;
132- }
133-
134- public dispose ( ) : void {
135- throw new Error ( 'Implement me' ) ;
136- }
13789}
138-
139- class ReferenceCountedIdleMonitor extends ReferenceCountedObject {
140-
141- public static INSTANCE : ReferenceCountedIdleMonitor = new ReferenceCountedIdleMonitor ( ) ;
142-
143- private toDispose : IDisposable [ ] ;
144- private eventEmitter : EventEmitter ;
145-
146- public construct ( ) : void {
147- this . toDispose = [ ] ;
148- this . eventEmitter = new EventEmitter ( ) ;
149- this . toDispose . push ( this . eventEmitter ) ;
150- this . toDispose . push ( DomUtils . addDisposableListener ( getService ( ) . document , 'mousemove' , ( ) => this . onUserActive ( ) ) ) ;
151- this . toDispose . push ( DomUtils . addDisposableListener ( getService ( ) . document , 'keydown' , ( ) => this . onUserActive ( ) ) ) ;
152- this . onUserActive ( ) ;
153- }
154-
155- public dispose ( ) : void {
156- this . toDispose = disposeAll ( this . toDispose ) ;
157- }
158-
159- private onUserActive ( ) : void {
160- this . eventEmitter . emit ( 'onActive' ) ;
161- }
162-
163- public addListener ( callback : ( ) => void ) : ListenerUnbind {
164- return this . eventEmitter . addListener ( 'onActive' , callback ) ;
165- }
166- }
0 commit comments