summaryrefslogtreecommitdiff
path: root/packages/SystemUI/src/com/android/systemui/temporarydisplay/TouchableRegionViewController.kt
blob: cf0184f9e1ae9b57319b639cc78a3afe01e3e49f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
/*
 * Copyright (C) 2022 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.android.systemui.temporarydisplay

import android.graphics.Rect
import android.view.View
import android.view.ViewTreeObserver
import com.android.systemui.util.ViewController

/**
 * A view controller that will notify the [ViewTreeObserver] about the touchable region for this
 * view. This will be used by WindowManager to decide which touch events go to the view and which
 * pass through to the window below.
 *
 * @param touchableRegionSetter a function that, given the view and an out rect, fills the rect with
 *   the touchable region of this view.
 */
class TouchableRegionViewController(
    view: View,
    touchableRegionSetter: (View, Rect) -> Unit,
) : ViewController<View>(view) {

    private val tempRect = Rect()

    private val internalInsetsListener =
        ViewTreeObserver.OnComputeInternalInsetsListener { inoutInfo ->
            inoutInfo.setTouchableInsets(
                ViewTreeObserver.InternalInsetsInfo.TOUCHABLE_INSETS_REGION
            )

            tempRect.setEmpty()
            touchableRegionSetter.invoke(mView, tempRect)
            inoutInfo.touchableRegion.set(tempRect)
        }

    public override fun onViewAttached() {
        mView.viewTreeObserver.addOnComputeInternalInsetsListener(internalInsetsListener)
    }

    public override fun onViewDetached() {
        mView.viewTreeObserver.removeOnComputeInternalInsetsListener(internalInsetsListener)
    }
}