• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1-- Copyright 2025 The Android Open Source Project
2--
3-- Licensed under the Apache License, Version 2.0 (the "License");
4-- you may not use this file except in compliance with the License.
5-- You may obtain a copy of the License at
6--
7--     https://www.apache.org/licenses/LICENSE-2.0
8--
9-- Unless required by applicable law or agreed to in writing, software
10-- distributed under the License is distributed on an "AS IS" BASIS,
11-- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12-- See the License for the specific language governing permissions and
13-- limitations under the License.
14
15INCLUDE PERFETTO MODULE counters.intervals;
16
17INCLUDE PERFETTO MODULE intervals.intersect;
18
19-- Table of the screen state - on, off or doze (always on display).
20CREATE PERFETTO TABLE android_screen_state (
21  -- ID.
22  id ID,
23  -- Timestamp.
24  ts TIMESTAMP,
25  -- Duration.
26  dur DURATION,
27  -- Simplified screen state: 'unknown', 'off', 'doze' (AoD) or 'on'
28  simple_screen_state STRING,
29  -- Full screen state, adding VR and suspended-while-displaying states.
30  short_screen_state STRING,
31  -- Human-readable string.
32  screen_state STRING
33) AS
34WITH
35  screen_state_span AS (
36    SELECT
37      *
38    FROM counter_leading_intervals!((
39    SELECT counter.id, ts, 0 AS track_id, value
40    FROM counter
41    JOIN counter_track ON counter_track.id = counter.track_id
42    WHERE name = 'ScreenState'
43  ))
44  )
45-- Case when we have data.
46SELECT
47  id,
48  ts,
49  dur,
50  -- Should be kept in sync with the enums in Display.java
51  CASE value
52    -- Display.STATE_OFF
53    WHEN 1
54    THEN 'off'
55    -- Display.STATE_ON
56    WHEN 2
57    THEN 'on'
58    -- Display.STATE_DOZE
59    WHEN 3
60    THEN 'doze'
61    -- Display.STATE_DOZE_SUSPEND
62    WHEN 4
63    THEN 'doze'
64    -- Display.STATE_VR
65    WHEN 5
66    THEN 'on'
67    -- Display.STATE_ON_SUSPEND
68    WHEN 6
69    THEN 'on'
70    ELSE 'unknown'
71  END AS simple_screen_state,
72  CASE value
73    -- Display.STATE_OFF
74    WHEN 1
75    THEN 'off'
76    -- Display.STATE_ON
77    WHEN 2
78    THEN 'on'
79    -- Display.STATE_DOZE
80    WHEN 3
81    THEN 'doze'
82    -- Display.STATE_DOZE_SUSPEND
83    WHEN 4
84    THEN 'doze-suspend'
85    -- Display.STATE_VR
86    WHEN 5
87    THEN 'on-vr'
88    -- Display.STATE_ON_SUSPEND
89    WHEN 6
90    THEN 'on-suspend'
91    ELSE 'unknown'
92  END AS short_screen_state,
93  CASE value
94    -- Display.STATE_OFF
95    WHEN 1
96    THEN 'Screen off'
97    -- Display.STATE_ON
98    WHEN 2
99    THEN 'Screen on'
100    -- Display.STATE_DOZE
101    WHEN 3
102    THEN 'Always-on display (doze)'
103    -- Display.STATE_DOZE_SUSPEND
104    WHEN 4
105    THEN 'Always-on display (doze-suspend)'
106    -- Display.STATE_VR
107    WHEN 5
108    THEN 'Screen on (VR)'
109    -- Display.STATE_ON_SUSPEND
110    WHEN 6
111    THEN 'Screen on (suspend)'
112    ELSE 'Unknown'
113  END AS screen_state
114FROM screen_state_span
115WHERE
116  dur > 0
117UNION
118-- Unknown period until the first counter.
119SELECT
120  (
121    SELECT
122      max(id) + 1
123    FROM screen_state_span
124  ) AS id,
125  trace_start() AS ts,
126  (
127    SELECT
128      min(ts)
129    FROM screen_state_span
130  ) - trace_start() AS dur,
131  'unknown' AS simple_screen_state,
132  'unknown' AS short_screen_state,
133  'Unknown' AS screen_state
134WHERE
135  trace_start() < (
136    SELECT
137      min(ts)
138    FROM screen_state_span
139  )
140  AND EXISTS(
141    SELECT
142      *
143    FROM screen_state_span
144  )
145UNION
146-- Case when we do not have data.
147SELECT
148  1,
149  trace_start() AS ts,
150  trace_dur() AS dur,
151  'unknown' AS simple_screen_state,
152  'unknown' AS short_screen_state,
153  'Unknown' AS screen_state
154WHERE
155  NOT EXISTS(
156    SELECT
157      *
158    FROM screen_state_span
159  ) AND trace_dur() > 0;
160