1/*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.view;
18
19/**
20 * This is the base class for frame statistics.
21 */
22public abstract class FrameStats {
23    /**
24     * Undefined time.
25     */
26    public static final long UNDEFINED_TIME_NANO = -1;
27
28    /** @hide */
29    protected long mRefreshPeriodNano;
30
31    /** @hide */
32    protected long[] mFramesPresentedTimeNano;
33
34    /**
35     * Gets the refresh period of the display hosting the window(s) for
36     * which these statistics apply.
37     *
38     * @return The refresh period in nanoseconds.
39     */
40    public final long getRefreshPeriodNano() {
41        return mRefreshPeriodNano;
42    }
43
44    /**
45     * Gets the number of frames for which there is data.
46     *
47     * @return The number of frames.
48     */
49    public final int getFrameCount() {
50        return mFramesPresentedTimeNano != null
51                ? mFramesPresentedTimeNano.length : 0;
52    }
53
54    /**
55     * Gets the start time of the interval for which these statistics
56     * apply. The start interval is the time when the first frame was
57     * presented.
58     *
59     * @return The start time in nanoseconds or {@link #UNDEFINED_TIME_NANO}
60     *         if there is no frame data.
61     */
62    public final long getStartTimeNano() {
63        if (getFrameCount() <= 0) {
64            return UNDEFINED_TIME_NANO;
65        }
66        return mFramesPresentedTimeNano[0];
67    }
68
69    /**
70     * Gets the end time of the interval for which these statistics
71     * apply. The end interval is the time when the last frame was
72     * presented.
73     *
74     * @return The end time in nanoseconds or {@link #UNDEFINED_TIME_NANO}
75     *         if there is no frame data.
76     */
77    public final long getEndTimeNano() {
78        if (getFrameCount() <= 0) {
79            return UNDEFINED_TIME_NANO;
80        }
81        return mFramesPresentedTimeNano[mFramesPresentedTimeNano.length - 1];
82    }
83
84    /**
85     * Get the time a frame at a given index was presented.
86     *
87     * @param index The frame index.
88     * @return The presented time in nanoseconds or {@link #UNDEFINED_TIME_NANO}
89     *         if the frame is not presented yet.
90     */
91    public final long getFramePresentedTimeNano(int index) {
92        if (mFramesPresentedTimeNano == null) {
93            throw new IndexOutOfBoundsException();
94        }
95        return mFramesPresentedTimeNano[index];
96    }
97}
98