Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7205c782 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Automerger Merge Worker
Browse files

Merge "[Ongoing call] Limit the chip background size to the status bar...

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

Original change: https://googleplex-android-review.googlesource.com/c/platform/frameworks/base/+/23135947



Change-Id: Ia6c690b0b41be91b2292361d4b6f5ee1ea206c57
Signed-off-by: default avatarAutomerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com>
parents 68cc32e4 cdab56b8
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -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>
+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)
    }
}
+3 −0
Original line number Diff line number Diff line
@@ -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()
        }
+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)
    }
}