Merge "[Ongoing call] Limit the chip background size to the status bar height." into udc-dev am: cdab56b8c9
Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23135947 Change-Id: I8033c47ec29395421900e2b9184c638972343497 Signed-off-by: Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
This commit is contained in:
@@ -23,7 +23,7 @@
|
|||||||
android:layout_gravity="center_vertical|start"
|
android:layout_gravity="center_vertical|start"
|
||||||
android:layout_marginStart="5dp"
|
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:id="@+id/ongoing_call_chip_background"
|
||||||
android:layout_width="wrap_content"
|
android:layout_width="wrap_content"
|
||||||
android:layout_height="@dimen/ongoing_appops_chip_height"
|
android:layout_height="@dimen/ongoing_appops_chip_height"
|
||||||
@@ -55,5 +55,5 @@
|
|||||||
android:textColor="?android:attr/colorPrimary"
|
android:textColor="?android:attr/colorPrimary"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
</com.android.systemui.animation.view.LaunchableLinearLayout>
|
</com.android.systemui.statusbar.phone.ongoingcall.OngoingCallBackgroundContainer>
|
||||||
</FrameLayout>
|
</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) {
|
fun setChipView(chipView: View) {
|
||||||
tearDownChipView()
|
tearDownChipView()
|
||||||
this.chipView = chipView
|
this.chipView = chipView
|
||||||
|
val backgroundView: OngoingCallBackgroundContainer? =
|
||||||
|
chipView.findViewById(R.id.ongoing_call_chip_background)
|
||||||
|
backgroundView?.maxHeightFetcher = { statusBarWindowController.get().statusBarHeight }
|
||||||
if (hasOngoingCall()) {
|
if (hasOngoingCall()) {
|
||||||
updateChip()
|
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