Loading packages/SystemUI/res/layout/ongoing_call_chip.xml +2 −2 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -55,5 +55,5 @@ android:textColor="?android:attr/colorPrimary" /> </com.android.systemui.animation.view.LaunchableLinearLayout> </com.android.systemui.statusbar.phone.ongoingcall.OngoingCallBackgroundContainer> </FrameLayout> packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainer.kt 0 → 100644 +47 −0 Original line number Diff line number Diff line /* * 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) } } packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +3 −0 Original line number Diff line number Diff line Loading @@ -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() } Loading packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainerTest.kt 0 → 100644 +87 −0 Original line number Diff line number Diff line /* * 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) } } Loading
packages/SystemUI/res/layout/ongoing_call_chip.xml +2 −2 Original line number Diff line number Diff line Loading @@ -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" Loading Loading @@ -55,5 +55,5 @@ android:textColor="?android:attr/colorPrimary" /> </com.android.systemui.animation.view.LaunchableLinearLayout> </com.android.systemui.statusbar.phone.ongoingcall.OngoingCallBackgroundContainer> </FrameLayout>
packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainer.kt 0 → 100644 +47 −0 Original line number Diff line number Diff line /* * 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) } }
packages/SystemUI/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallController.kt +3 −0 Original line number Diff line number Diff line Loading @@ -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() } Loading
packages/SystemUI/tests/src/com/android/systemui/statusbar/phone/ongoingcall/OngoingCallBackgroundContainerTest.kt 0 → 100644 +87 −0 Original line number Diff line number Diff line /* * 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) } }