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