[Ongoing call] Limit the chip background size to the status bar height.
Needed so that ag/23021476 doesn't cause the ongoing call chip background to be cropped. Bug: 272071029 Test: manual: use 200% font, trigger ongoing call chip -> verify background isn't cut off Test: manual: verify ongoing call chip background scales with different sizes (see video attached to bug) Test: manual: verify ongoing call chip in landscape still looks correct Test: atest OngoingCallBackgroundContainerTest OngoingCallControllerTest Change-Id: If0ceade1ef48845d39f76288bc91e3fe5f084534
This commit is contained in:
@@ -23,7 +23,7 @@
|
||||
android:layout_gravity="center_vertical|start"
|
||||
android:layout_marginStart="5dp"
|
||||
>
|
||||
<com.android.systemui.animation.view.LaunchableLinearLayout
|
||||
<com.android.systemui.statusbar.phone.ongoingcall.OngoingCallBackgroundContainer
|
||||
android:id="@+id/ongoing_call_chip_background"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="@dimen/ongoing_appops_chip_height"
|
||||
@@ -55,5 +55,5 @@
|
||||
android:textColor="?android:attr/colorPrimary"
|
||||
/>
|
||||
|
||||
</com.android.systemui.animation.view.LaunchableLinearLayout>
|
||||
</com.android.systemui.statusbar.phone.ongoingcall.OngoingCallBackgroundContainer>
|
||||
</FrameLayout>
|
||||
|
||||
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.ongoingcall
|
||||
|
||||
import android.content.Context
|
||||
import android.util.AttributeSet
|
||||
import com.android.systemui.animation.view.LaunchableLinearLayout
|
||||
|
||||
/**
|
||||
* A container view for the ongoing call chip background. Needed so that we can limit the height of
|
||||
* the background when the font size is very large (200%), in which case the background would go
|
||||
* past the bounds of the status bar.
|
||||
*/
|
||||
class OngoingCallBackgroundContainer(context: Context, attrs: AttributeSet) :
|
||||
LaunchableLinearLayout(context, attrs) {
|
||||
|
||||
/** Sets where this view should fetch its max height from. */
|
||||
var maxHeightFetcher: (() -> Int)? = null
|
||||
|
||||
override fun onMeasure(widthMeasureSpec: Int, heightMeasureSpec: Int) {
|
||||
super.onMeasure(widthMeasureSpec, heightMeasureSpec)
|
||||
|
||||
val maxHeight = maxHeightFetcher?.invoke()
|
||||
val chosenHeight =
|
||||
if (maxHeight != null) {
|
||||
// Give 1 extra px of space (without it, the background could still be cut off)
|
||||
measuredHeight.coerceAtMost(maxHeight - 1)
|
||||
} else {
|
||||
measuredHeight
|
||||
}
|
||||
setMeasuredDimension(measuredWidth, chosenHeight)
|
||||
}
|
||||
}
|
||||
@@ -136,6 +136,9 @@ class OngoingCallController @Inject constructor(
|
||||
fun setChipView(chipView: View) {
|
||||
tearDownChipView()
|
||||
this.chipView = chipView
|
||||
val backgroundView: OngoingCallBackgroundContainer? =
|
||||
chipView.findViewById(R.id.ongoing_call_chip_background)
|
||||
backgroundView?.maxHeightFetcher = { statusBarWindowController.get().statusBarHeight }
|
||||
if (hasOngoingCall()) {
|
||||
updateChip()
|
||||
}
|
||||
|
||||
@@ -0,0 +1,87 @@
|
||||
/*
|
||||
* Copyright (C) 2023 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.ongoingcall
|
||||
|
||||
import android.testing.AndroidTestingRunner
|
||||
import android.testing.TestableLooper
|
||||
import android.view.LayoutInflater
|
||||
import android.view.View
|
||||
import androidx.test.filters.SmallTest
|
||||
import com.android.systemui.R
|
||||
import com.android.systemui.SysuiTestCase
|
||||
import com.google.common.truth.Truth.assertThat
|
||||
import org.junit.Before
|
||||
import org.junit.Test
|
||||
import org.junit.runner.RunWith
|
||||
|
||||
@SmallTest
|
||||
@RunWith(AndroidTestingRunner::class)
|
||||
@TestableLooper.RunWithLooper
|
||||
class OngoingCallBackgroundContainerTest : SysuiTestCase() {
|
||||
|
||||
private lateinit var underTest: OngoingCallBackgroundContainer
|
||||
|
||||
@Before
|
||||
fun setUp() {
|
||||
allowTestableLooperAsMainThread()
|
||||
TestableLooper.get(this).runWithLooper {
|
||||
val chipView = LayoutInflater.from(context).inflate(R.layout.ongoing_call_chip, null)
|
||||
underTest = chipView.requireViewById(R.id.ongoing_call_chip_background)
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
fun onMeasure_maxHeightFetcherNotSet_usesDesired() {
|
||||
underTest.maxHeightFetcher = null
|
||||
|
||||
underTest.measure(
|
||||
WIDTH_SPEC,
|
||||
View.MeasureSpec.makeMeasureSpec(123, View.MeasureSpec.EXACTLY),
|
||||
)
|
||||
|
||||
assertThat(underTest.measuredHeight).isEqualTo(123)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun onMeasure_maxLargerThanDesired_usesDesired() {
|
||||
underTest.maxHeightFetcher = { 234 }
|
||||
|
||||
underTest.measure(
|
||||
WIDTH_SPEC,
|
||||
View.MeasureSpec.makeMeasureSpec(123, View.MeasureSpec.EXACTLY),
|
||||
)
|
||||
|
||||
assertThat(underTest.measuredHeight).isEqualTo(123)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun onMeasure_desiredLargerThanMax_usesMaxMinusOne() {
|
||||
underTest.maxHeightFetcher = { 234 }
|
||||
|
||||
underTest.measure(
|
||||
WIDTH_SPEC,
|
||||
View.MeasureSpec.makeMeasureSpec(567, View.MeasureSpec.EXACTLY),
|
||||
)
|
||||
|
||||
// We use the max - 1 to give a bit extra space
|
||||
assertThat(underTest.measuredHeight).isEqualTo(233)
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val WIDTH_SPEC = View.MeasureSpec.makeMeasureSpec(100, View.MeasureSpec.EXACTLY)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user