1a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline/*
2a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * Copyright (C) 2016 The Android Open Source Project
3a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *
4a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * Licensed under the Apache License, Version 2.0 (the "License");
5a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * you may not use this file except in compliance with the License.
6a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * You may obtain a copy of the License at
7a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *
8a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *      http://www.apache.org/licenses/LICENSE-2.0
9a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline *
10a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * Unless required by applicable law or agreed to in writing, software
11a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * distributed under the License is distributed on an "AS IS" BASIS,
12a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * See the License for the specific language governing permissions and
14a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * limitations under the License.
15a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline */
16a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
17a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klinepackage android.net.util;
18a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
19a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klineimport android.os.SystemClock;
20a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
21a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
22a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline/**
23a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline * @hide
24a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline */
25a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Klinepublic class Stopwatch {
26a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    private long mStartTimeMs;
27a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    private long mStopTimeMs;
28a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
29a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public boolean isStarted() {
30a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        return (mStartTimeMs > 0);
31a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
32a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
33a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public boolean isStopped() {
34a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        return (mStopTimeMs > 0);
35a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
36a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
37a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public boolean isRunning() {
38a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        return (isStarted() && !isStopped());
39a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
40a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
41a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    // Returning |this| makes possible the following usage pattern:
42a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    //
43a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    //     Stopwatch s = new Stopwatch().start();
44a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public Stopwatch start() {
45a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        if (!isStarted()) {
46a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline            mStartTimeMs = SystemClock.elapsedRealtime();
47a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        }
48a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        return this;
49a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
50a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
51a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    // Returns the total time recorded, in milliseconds, or 0 if not started.
52a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public long stop() {
53a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        if (isRunning()) {
54a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline            mStopTimeMs = SystemClock.elapsedRealtime();
55a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        }
56a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        // Return either the delta after having stopped, or 0.
57a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        return (mStopTimeMs - mStartTimeMs);
58a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
59a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
60a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    // Returns the total time recorded to date, in milliseconds.
61a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    // If the Stopwatch is not running, returns the same value as stop(),
62a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    // i.e. either the total time recorded before stopping or 0.
63a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public long lap() {
64a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        if (isRunning()) {
65a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline            return (SystemClock.elapsedRealtime() - mStartTimeMs);
66a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        } else {
67a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline            return stop();
68a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        }
69a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
70a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline
71a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    public void reset() {
72a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        mStartTimeMs = 0;
73a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline        mStopTimeMs = 0;
74a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline    }
75a488c23dd5c9e024fb8ec702cee722916cdeaf0eErik Kline}
76