Merge "[Ongoing call] Limit the chip background size to the status bar height." into udc-dev

This commit is contained in:
Caitlin Shkuratov
2023-05-11 13:48:32 +00:00
committed by Android (Google) Code Review
4 changed files with 139 additions and 2 deletions

View File

@@ -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>

View File

@@ -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)
}
}

View File

@@ -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()
}

View File

@@ -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)
}
}