1 /*
2  * Copyright (C) 2023 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 
17 package com.android.systemui.keyguard.ui.view.layout.sections
18 
19 import android.content.Context
20 import android.view.View
21 import android.view.ViewTreeObserver.OnPreDrawListener
22 import androidx.constraintlayout.helper.widget.Layer
23 
24 class AodBurnInLayer(
25     context: Context,
26 ) : Layer(context) {
27     // For setScale in Layer class, it stores it in mScaleX/Y and directly apply scale to
28     // referenceViews instead of keeping the value in fields of View class
29     // when we try to clone ConstraintSet, it will call getScaleX from View class and return 1.0
30     // and when we clone and apply, it will reset everything in the layer
31     // which cause the flicker from AOD to LS
32     private var _scaleX = 1F
33     private var _scaleY = 1F
34 
35     // As described for _scaleX and _scaleY, we have similar issue with translation
36     private var _translationX = 0F
37     private var _translationY = 0F
38 
<lambda>null39     private val _predrawListener = OnPreDrawListener {
40         super.setScaleX(_scaleX)
41         super.setScaleY(_scaleY)
42         super.setTranslationX(_translationX)
43         super.setTranslationY(_translationY)
44         true
45     }
46 
47     // avoid adding views with same ids
addViewnull48     override fun addView(view: View?) {
49         view?.let { if (it.id !in referencedIds) super.addView(view) }
50     }
51 
registerListenernull52     fun registerListener(rootView: View) {
53         rootView.viewTreeObserver.addOnPreDrawListener(_predrawListener)
54     }
55 
unregisterListenernull56     fun unregisterListener(rootView: View) {
57         rootView.viewTreeObserver.removeOnPreDrawListener(_predrawListener)
58     }
59 
setScaleXnull60     override fun setScaleX(scaleX: Float) {
61         _scaleX = scaleX
62         super.setScaleX(scaleX)
63     }
64 
getScaleXnull65     override fun getScaleX(): Float {
66         return _scaleX
67     }
68 
setScaleYnull69     override fun setScaleY(scaleY: Float) {
70         _scaleY = scaleY
71         super.setScaleY(scaleY)
72     }
73 
getScaleYnull74     override fun getScaleY(): Float {
75         return _scaleY
76     }
77 
setTranslationXnull78     override fun setTranslationX(dx: Float) {
79         _translationX = dx
80         super.setTranslationX(dx)
81     }
82 
getTranslationXnull83     override fun getTranslationX(): Float {
84         return _translationX
85     }
86 
setTranslationYnull87     override fun setTranslationY(dy: Float) {
88         _translationY = dy
89         super.setTranslationY(dy)
90     }
91 
getTranslationYnull92     override fun getTranslationY(): Float {
93         return _translationY
94     }
95 }
96