/
index.android.ts
92 lines (74 loc) · 2.24 KB
/
index.android.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
/**
* Android specific timer functions implementation.
*/
let timeoutHandler;
const timeoutCallbacks = {};
// this is needed to keep a strong reference to the callback
// currently fixes a race condition in V8 with the android runtime implementation of WeakRef
// there are fixes in the android runtime that will remove the need for this
const timeoutCallbacksCb = {};
let timerId = 0;
function createHandlerAndGetId(): number {
if (!timeoutHandler) {
timeoutHandler = new android.os.Handler(android.os.Looper.myLooper());
}
timerId++;
return timerId;
}
export function setTimeout(callback: Function, milliseconds = 0, ...args): number {
// Cast to Number
milliseconds += 0;
const id = createHandlerAndGetId();
const invoke = () => callback(...args);
const zoneBound = zonedCallback(invoke);
const runnable = new java.lang.Runnable({
run: () => {
zoneBound();
if (timeoutCallbacks[id]) {
delete timeoutCallbacks[id];
delete timeoutCallbacksCb[id];
}
},
});
if (!timeoutCallbacks[id]) {
timeoutCallbacks[id] = runnable;
timeoutCallbacksCb[id] = callback;
}
timeoutHandler.postDelayed(runnable, long(milliseconds));
return id;
}
export function clearTimeout(id: number): void {
const index = id;
if (timeoutCallbacks[index]) {
timeoutHandler.removeCallbacks(timeoutCallbacks[index]);
delete timeoutCallbacks[index];
delete timeoutCallbacksCb[index];
}
}
export function setInterval(callback: Function, milliseconds = 0, ...args): number {
// Cast to Number
milliseconds += 0;
const id = createHandlerAndGetId();
const handler = timeoutHandler;
const invoke = () => callback(...args);
const zoneBound = zonedCallback(invoke);
const startOffset = milliseconds > 0 ? Date.now() % milliseconds : 0;
function nextCallMs() {
return milliseconds > 0 ? milliseconds - ((Date.now() - startOffset) % milliseconds) : milliseconds;
}
const runnable = new java.lang.Runnable({
run: () => {
zoneBound();
if (timeoutCallbacks[id]) {
handler.postDelayed(runnable, long(nextCallMs()));
}
},
});
if (!timeoutCallbacks[id]) {
timeoutCallbacks[id] = runnable;
timeoutCallbacksCb[id] = callback;
}
timeoutHandler.postDelayed(runnable, long(nextCallMs()));
return id;
}
export const clearInterval = clearTimeout;