diff --git a/packages/SystemUI/res/layout/ongoing_call_chip.xml b/packages/SystemUI/res/layout/ongoing_call_chip.xml index 238fc8438331a..6a0217ec5fe89 100644 --- a/packages/SystemUI/res/layout/ongoing_call_chip.xml +++ b/packages/SystemUI/res/layout/ongoing_call_chip.xml @@ -23,7 +23,7 @@ android:layout_gravity="center_vertical|start" android:layout_marginStart="5dp" > - - + diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainer.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainer.kt new file mode 100644 index 0000000000000..ce88a5f5e55fd --- /dev/null +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainer.kt @@ -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) + } +} diff --git a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt index c73cc9efe85cf..b3af91d9fb5b4 100644 --- a/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +++ b/packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt @@ -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() } diff --git a/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainerTest.kt b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainerTest.kt new file mode 100644 index 0000000000000..ec074d76da10a --- /dev/null +++ b/packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainerTest.kt @@ -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) + } +}