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

Commit b06a3692 authored by Caitlin Shkuratov's avatar Caitlin Shkuratov
Browse files

[SB][Chips] Don't allow status bar chips to overlap with app handles.

Bug: 397506207
Flag: com.android.systemui.status_bar_app_handle_tracking
Test: atest ChipsMaxWidthTest
Test: manual: with 3 chips + fullscreen app handle, adjust display &
font size and verify chips hide and show without ever overlapping the
app handle. Verify in both LTR and RTL

Change-Id: I09bee1bbd87fbf3b2b88a74f2f0e6302172c5e26
parent ac3b07bc
Loading
Loading
Loading
Loading
+423 −0
Original line number Diff line number Diff line
/*
 * Copyright (C) 2025 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.pipeline.shared.ui.composable

import android.graphics.Rect
import androidx.compose.ui.unit.dp
import androidx.test.ext.junit.runners.AndroidJUnit4
import androidx.test.filters.SmallTest
import com.android.systemui.SysuiTestCase
import com.google.common.truth.Truth.assertThat
import org.junit.Test
import org.junit.runner.RunWith

@SmallTest
@RunWith(AndroidJUnit4::class)
class ChipsMaxWidthTest : SysuiTestCase() {
    @Test
    fun chipsMaxWidth_ltr_noAppHandles_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = emptyList(),
                startSideContainerBounds = rect(left = 10, right = 100, top = 0, bottom = 50),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // 30 -> 100
        assertThat(result).isEqualTo(70.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_noAppHandles_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = emptyList(),
                startSideContainerBounds = rect(left = 1000, right = 1400, top = 0, bottom = 50),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // 1000 <- 1350
        assertThat(result).isEqualTo(350.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_oneAppHandle_yOutside_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 100, bottom = 150, left = 80, right = 120)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // app handle's left=80 doesn't matter because it's not overlapping with the status bar,
        // so still use 30 -> 100
        assertThat(result).isEqualTo(70.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_oneAppHandle_yOutside_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 100, bottom = 150, left = 800, right = 1200)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1400),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // app handle's right=1200 doesn't matter because it's not overlapping with the status bar,
        // so still use 1000 <- 1350
        assertThat(result).isEqualTo(350.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_oneAppHandle_furtherThanStartSideEnd_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 10, bottom = 40, left = 120, right = 200)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // app handle's left=120 doesn't matter because it's further than the container anyway,
        // so still use 30 -> 100
        assertThat(result).isEqualTo(70.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_oneAppHandle_furtherThanStartSideEnd_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 10, bottom = 40, left = 600, right = 800)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1400),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // app handle's right=800 doesn't matter because it's further than the container anyway,
        // so still use 1000 <- 1350
        assertThat(result).isEqualTo(350.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_oneAppHandle_isEmptyRect_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 0, bottom = 0, left = 0, right = 0)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // app handle doesn't matter because it's empty, so still use 10 -> 80
        assertThat(result).isEqualTo(70.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_oneAppHandle_isEmptyRect_usesClockAndStartSideContainerBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 1400, bottom = 1400, left = 1400, right = 1400)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1400),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // app handle doesn't matter because it's empty so still use 1000 <- 1350
        assertThat(result).isEqualTo(350.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_oneAppHandle_closerThanStartSideEnd_usesAppHandleBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 10, bottom = 40, left = 80, right = 120)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // 30 -> 80, 80 from app handle
        assertThat(result).isEqualTo(50.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_oneAppHandle_closerThanStartSideEnd_usesAppHandleBounds() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(left = 800, right = 1100, top = 10, bottom = 40)),
                startSideContainerBounds = rect(left = 1000, right = 1400, top = 0, bottom = 50),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // 1100 <- 1350, 1100 from app handle
        assertThat(result).isEqualTo(250.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_oneAppHandle_yOverlapsWithTopOnly_usesAppHandleBounds() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // top is within status bar area, bottom is not
                        rect(top = 40, bottom = 80, left = 80, right = 120)
                    ),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // 30 -> 80, 80 from app handle
        assertThat(result).isEqualTo(50.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_oneAppHandle_yOverlapsWithTopOnly_usesAppHandleBounds() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // top is within status bar area, bottom is not
                        rect(top = 40, bottom = 80, left = 800, right = 1100)
                    ),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1400),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // 1100 <- 1350, 1100 from app handle
        assertThat(result).isEqualTo(250.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_oneAppHandle_yOverlapsWithBottomOnly_usesAppHandleBounds() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // bottom is within status bar area, bottom is not
                        rect(top = 0, bottom = 40, left = 80, right = 120)
                    ),
                startSideContainerBounds = rect(top = 10, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // 30 -> 80, 80 from app handle
        assertThat(result).isEqualTo(50.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_oneAppHandle_yOverlapsWithBottomOnly_usesAppHandleBounds() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // bottom is within status bar area, top is not
                        rect(top = 0, bottom = 40, left = 800, right = 1100)
                    ),
                startSideContainerBounds = rect(top = 10, bottom = 50, left = 1000, right = 1400),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // 1100 <- 1350, 1100 from app handle
        assertThat(result).isEqualTo(250.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_twoAppHandles_usesClosestOne() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // Closer
                        rect(top = 10, bottom = 40, left = 40, right = 80),
                        // Further
                        rect(top = 10, bottom = 40, left = 90, right = 120),
                    ),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // 30 -> 40
        assertThat(result).isEqualTo(10.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_twoAppHandles_usesClosestOne() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // Further
                        rect(top = 10, bottom = 40, left = 800, right = 1100),
                        // Closer
                        rect(top = 10, bottom = 40, left = 1300, right = 1450),
                    ),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1600),
                clockBounds = rect(left = 1550, right = 1600, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // 1450 <- 1550
        assertThat(result).isEqualTo(100.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_multipleAppHandles_onlySomeInYRange_usesYRange() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // Closer, but outside y range
                        rect(top = 100, bottom = 200, left = 40, right = 60),
                        // Closer, inside y range
                        rect(top = 10, bottom = 40, left = 70, right = 80),
                        // Further, inside y range
                        rect(top = 10, bottom = 40, left = 90, right = 120),
                    ),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 10, right = 100),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // 30 -> 70
        assertThat(result).isEqualTo(40.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_multipleAppHandles_onlySomeInYRange_usesYRange() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // Further
                        rect(top = 10, bottom = 40, left = 800, right = 1200),
                        // Closer, inside y range
                        rect(top = 10, bottom = 40, left = 1210, right = 1310),
                        // Closer, but outside y range
                        rect(top = 100, bottom = 200, left = 1300, right = 1450),
                    ),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1600),
                clockBounds = rect(top = 0, bottom = 50, left = 1550, right = 1600),
                isRtl = true,
                density = 1f,
            )

        // 1310 <- 1550
        assertThat(result).isEqualTo(240.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_handleStartsBeforeEndOfClock_limitedToZero() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // Handle starts at 80
                        rect(left = 80, right = 120, top = 10, bottom = 40)
                    ),
                // Clock ends at 100
                clockBounds = rect(left = 0, right = 100, top = 0, bottom = 50),
                startSideContainerBounds = rect(left = 0, right = 200, top = 0, bottom = 50),
                isRtl = false,
                density = 1f,
            )

        // Theoretically would be 80 - 100 = -20, but it's capped at 0
        assertThat(result).isEqualTo(0.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_handleEndsBeforeStartOfClock_limitedToZero() {
        val result =
            chipsMaxWidth(
                appHandles =
                    listOf(
                        // Handle ends at 1250
                        rect(left = 1000, right = 1250, top = 10, bottom = 40)
                    ),
                startSideContainerBounds = rect(left = 800, right = 1300, top = 0, bottom = 50),
                // Clock starts at 1200
                clockBounds = rect(left = 1200, right = 1300, top = 0, bottom = 50),
                isRtl = true,
                density = 1f,
            )

        // Theoretically would be 1200 - 1250 = -50, but it's capped at 0
        assertThat(result).isEqualTo(0.dp)
    }

    @Test
    fun chipsMaxWidth_ltr_usesDensity() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(left = 80, right = 120, top = 10, bottom = 40)),
                startSideContainerBounds = rect(left = 10, right = 100, top = 0, bottom = 50),
                clockBounds = rect(left = 10, right = 30, top = 0, bottom = 50),
                isRtl = false,
                density = 5f,
            )

        // (30 -> 80) / 5
        assertThat(result).isEqualTo(10.dp)
    }

    @Test
    fun chipsMaxWidth_rtl_usesDensity() {
        val result =
            chipsMaxWidth(
                appHandles = listOf(rect(top = 10, bottom = 40, left = 800, right = 1100)),
                startSideContainerBounds = rect(top = 0, bottom = 50, left = 1000, right = 1400),
                clockBounds = rect(left = 1350, right = 1400, top = 0, bottom = 50),
                isRtl = true,
                density = 10f,
            )

        // (1100 <- 1350) / 10
        assertThat(result).isEqualTo(25.dp)
    }

    /** Helper function so we can have named parameters for Rect and switch the param order. */
    private fun rect(left: Int, top: Int, right: Int, bottom: Int): Rect {
        return Rect(left, top, right, bottom)
    }
}
+11 −0
Original line number Diff line number Diff line
@@ -30,12 +30,14 @@ import com.android.systemui.statusbar.chips.ui.model.MultipleOngoingActivityChip
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.events.shared.model.SystemEventAnimationState.Idle
import com.android.systemui.statusbar.featurepods.popups.ui.model.PopupChipModel
import com.android.systemui.statusbar.layout.ui.viewmodel.StatusBarBoundsViewModel
import com.android.systemui.statusbar.phone.domain.interactor.IsAreaDark
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryNextToPercentViewModel
import com.android.systemui.statusbar.pipeline.battery.ui.viewmodel.BatteryViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.model.ChipsVisibilityModel
import com.android.systemui.statusbar.pipeline.shared.ui.model.SystemInfoCombinedVisibilityModel
import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.systemstatusicons.ui.viewmodel.SystemStatusIconsViewModel
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableSharedFlow
@@ -90,6 +92,15 @@ class FakeHomeStatusBarViewModel(
                mock(SystemStatusIconsViewModel::class.java)
        }

    override val statusBarBoundsViewModelFactory: StatusBarBoundsViewModel.Factory =
        object : StatusBarBoundsViewModel.Factory {
            override fun create(
                displayId: Int,
                startSideContainerView: View,
                clockView: Clock,
            ): StatusBarBoundsViewModel = mock(StatusBarBoundsViewModel::class.java)
        }

    override val shouldShowOperatorNameView = MutableStateFlow(false)

    override val isClockVisible =
+82 −5
Original line number Diff line number Diff line
@@ -17,24 +17,31 @@
package com.android.systemui.statusbar.pipeline.shared.ui.composable

import android.content.Context
import android.graphics.Rect
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import androidx.annotation.VisibleForTesting
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.Row
import androidx.compose.foundation.layout.fillMaxSize
import androidx.compose.foundation.layout.height
import androidx.compose.foundation.layout.widthIn
import androidx.compose.foundation.layout.wrapContentSize
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.runtime.Composable
import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
import androidx.compose.ui.draw.alpha
import androidx.compose.ui.platform.ComposeView
import androidx.compose.ui.platform.LocalDensity
import androidx.compose.ui.platform.LocalLayoutDirection
import androidx.compose.ui.platform.ViewCompositionStrategy
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.LayoutDirection
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -78,6 +85,7 @@ import com.android.systemui.statusbar.pipeline.shared.ui.model.VisibilityModel
import com.android.systemui.statusbar.pipeline.shared.ui.view.SystemStatusIconsLayoutHelper
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel
import com.android.systemui.statusbar.pipeline.shared.ui.viewmodel.HomeStatusBarViewModel.HomeStatusBarViewModelFactory
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.systemstatusicons.SystemStatusIconsInCompose
import com.android.systemui.statusbar.systemstatusicons.ui.compose.SystemStatusIcons
import javax.inject.Inject
@@ -196,10 +204,11 @@ fun StatusBarRoot(

                    if (StatusBarChipsModernization.isEnabled) {
                        addStartSideChipsComposable(
                            phoneStatusBarView,
                            statusBarViewModel,
                            iconViewStore,
                            context,
                            phoneStatusBarView = phoneStatusBarView,
                            statusBarViewModel = statusBarViewModel,
                            iconViewStore = iconViewStore,
                            displayId = displayId,
                            context = context,
                        )
                    }

@@ -313,10 +322,14 @@ private fun addStartSideChipsComposable(
    phoneStatusBarView: PhoneStatusBarView,
    statusBarViewModel: HomeStatusBarViewModel,
    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
    displayId: Int,
    context: Context,
) {
    val startSideExceptHeadsUp =
        phoneStatusBarView.requireViewById<LinearLayout>(R.id.status_bar_start_side_except_heads_up)
    val startSideContainerView =
        phoneStatusBarView.requireViewById<View>(R.id.status_bar_start_side_container)
    val clockView = phoneStatusBarView.requireViewById<Clock>(R.id.clock)

    val composeView =
        ComposeView(context).apply {
@@ -327,13 +340,45 @@ private fun addStartSideChipsComposable(
                )

            setContent {
                val statusBarBoundsViewModel =
                    rememberViewModel("HomeStatusBar.Bounds") {
                        statusBarViewModel.statusBarBoundsViewModelFactory.create(
                            displayId = displayId,
                            startSideContainerView = startSideContainerView,
                            clockView = clockView,
                        )
                    }
                val isRtl = LocalLayoutDirection.current == LayoutDirection.Rtl
                val density = context.resources.displayMetrics.density

                val chipsMaxWidth: Dp =
                    remember(
                        statusBarBoundsViewModel.appHandleBounds,
                        statusBarBoundsViewModel.startSideContainerBounds,
                        statusBarBoundsViewModel.clockBounds,
                        isRtl,
                        density,
                    ) {
                        chipsMaxWidth(
                            appHandles = statusBarBoundsViewModel.appHandleBounds,
                            startSideContainerBounds =
                                statusBarBoundsViewModel.startSideContainerBounds,
                            clockBounds = statusBarBoundsViewModel.clockBounds,
                            isRtl = isRtl,
                            density = density,
                        )
                    }

                val chipsVisibilityModel = statusBarViewModel.ongoingActivityChips
                if (chipsVisibilityModel.areChipsAllowed) {
                    OngoingActivityChips(
                        chips = chipsVisibilityModel.chips,
                        iconViewStore = iconViewStore,
                        onChipBoundsChanged = statusBarViewModel::onChipBoundsChanged,
                        modifier = Modifier.sysUiResTagContainer(),
                        // TODO(b/393581408): Now that we always enforce a max width on the chips,
                        //  we should be able to convert the chips to a LazyRow and get some
                        //  animations for free.
                        modifier = Modifier.sysUiResTagContainer().widthIn(max = chipsMaxWidth),
                    )
                }
            }
@@ -349,6 +394,38 @@ private fun addStartSideChipsComposable(
    startSideExceptHeadsUp.addView(composeView, notificationIconAreaIndex)
}

@VisibleForTesting
fun chipsMaxWidth(
    appHandles: List<Rect>,
    startSideContainerBounds: Rect,
    clockBounds: Rect,
    isRtl: Boolean,
    density: Float,
): Dp {
    val relevantAppHandles =
        appHandles
            .filterNot { it.isEmpty }
            // Only care about app handles in the same possible region as the chips
            .filter { Rect.intersects(it, startSideContainerBounds) }
    val widthInPx =
        if (isRtl) {
                val chipsLeftBasedOnAppHandles =
                    relevantAppHandles.maxOfOrNull { it.right } ?: Int.MIN_VALUE
                val chipsLeftBasedOnContainer = startSideContainerBounds.left
                val chipsLeft = maxOf(chipsLeftBasedOnAppHandles, chipsLeftBasedOnContainer)
                /* width= */ clockBounds.left - chipsLeft
            } else { // LTR
                val chipsRightBasedOnAppHandles =
                    relevantAppHandles.minOfOrNull { it.left } ?: Int.MAX_VALUE
                val chipsRightBasedOnContainer = startSideContainerBounds.right
                val chipsRight = minOf(chipsRightBasedOnAppHandles, chipsRightBasedOnContainer)
                /* width= */ chipsRight - clockBounds.right
            }
            .coerceAtLeast(0)

    return (widthInPx / density).dp
}

/** Create a new [UnifiedBattery] and add it to the end of the system_icons container */
private fun addBatteryComposable(
    phoneStatusBarView: PhoneStatusBarView,
+7 −6

File changed.

Preview size limit exceeded, changes collapsed.

+2 −4

File changed.

Preview size limit exceeded, changes collapsed.

Loading