blob: f5ba399fe51ac5b4c4cdcdec5c0b402d52d6feac [file] [log] [blame]
/*
* 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.statusbar.phone
import android.graphics.Rect
import android.view.View
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentModule.END_SIDE_CONTENT
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentModule.START_SIDE_CONTENT
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentScope
import com.android.systemui.util.boundsOnScreen
import javax.inject.Inject
import javax.inject.Named
/** Provides various bounds within the status bar. */
@StatusBarFragmentScope
class StatusBarBoundsProvider
@Inject
constructor(
private val changeListeners: Set<@JvmSuppressWildcards BoundsChangeListener>,
@Named(START_SIDE_CONTENT) private val startSideContent: View,
@Named(END_SIDE_CONTENT) private val endSideContent: View,
) : StatusBarFragmentComponent.Startable {
interface BoundsChangeListener {
fun onStatusBarBoundsChanged()
}
private var previousBounds =
BoundsPair(start = startSideContent.boundsOnScreen, end = endSideContent.boundsOnScreen)
private val layoutListener =
View.OnLayoutChangeListener { _, _, _, _, _, _, _, _, _ ->
val newBounds = BoundsPair(start = visibleStartSideBounds, end = visibleEndSideBounds)
if (previousBounds != newBounds) {
previousBounds = newBounds
changeListeners.forEach { it.onStatusBarBoundsChanged() }
}
}
override fun start() {
startSideContent.addOnLayoutChangeListener(layoutListener)
endSideContent.addOnLayoutChangeListener(layoutListener)
}
override fun stop() {
startSideContent.removeOnLayoutChangeListener(layoutListener)
endSideContent.removeOnLayoutChangeListener(layoutListener)
}
/**
* Returns the bounds of the end side of the status bar that are visible to the user. The end
* side is right when in LTR and is left when in RTL.
*
* Note that even though the layout might be larger, here we only return the bounds for what is
* visible to the user.
*
* The end side of the status bar contains the multi-user switcher and status icons such as
* wi-fi, battery, etc
*/
val visibleEndSideBounds: Rect
get() = endSideContent.boundsOnScreen
/**
* Returns the bounds of the start side of the status bar that are visible to the user. The
* start side is left when in LTR and is right when in RTL.
*
* Note that even though the layout might be larger, here we only return the bounds for what is
* visible to the user.
*
* The start side of the status bar contains the operator name, clock, on-going call chip, and
* notifications.
*/
val visibleStartSideBounds: Rect
get() = startSideContent.boundsOnScreen
}
private data class BoundsPair(val start: Rect, val end: Rect)