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