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

Commit 081c3c7f authored by Caitlin Shkuratov's avatar Caitlin Shkuratov Committed by Android (Google) Code Review
Browse files

Merge changes If0c99b8f,Id158be70 into main

* changes:
  [SB] Move chips Composable to its own function.
  Remove unlaunched ENABLE_UNFOLD_STATUS_BAR_ANIMATIONS flag
parents 7c948139 9af43385
Loading
Loading
Loading
Loading
+0 −1
Original line number Diff line number Diff line
@@ -218,7 +218,6 @@ filegroup {
        "tests/src/**/systemui/statusbar/phone/PhoneStatusBarViewControllerTest.kt",
        "tests/src/**/systemui/statusbar/phone/PhoneStatusBarViewTest.kt",
        "tests/src/**/systemui/statusbar/phone/StatusBarBoundsProviderTest.kt",
        "tests/src/**/systemui/statusbar/phone/StatusBarMoveFromCenterAnimationControllerTest.kt",
        "tests/src/**/systemui/statusbar/pipeline/airplane/ui/viewmodel/AirplaneModeViewModelImplTest.kt",
        "tests/src/**/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryKairosAdapterTest.kt",
        "tests/src/**/systemui/statusbar/pipeline/mobile/data/repository/prod/MobileConnectionsRepositoryTest.kt",
+0 −5
Original line number Diff line number Diff line
@@ -263,11 +263,6 @@ object Flags {
    @JvmField
    val ENABLE_DARK_VIGNETTE_WHEN_FOLDING = unreleasedFlag("enable_dark_vignette_when_folding")

    // TODO(b/265764985): Tracking Bug
    @Keep
    @JvmField
    val ENABLE_UNFOLD_STATUS_BAR_ANIMATIONS = unreleasedFlag("enable_unfold_status_bar_animations")

    // TODO(b/316157842): Tracking Bug
    // Adds extra delay to notifications measure
    @Keep
+0 −74
Original line number Diff line number Diff line
@@ -16,21 +16,16 @@
package com.android.systemui.statusbar.phone

import android.app.StatusBarManager.WINDOW_STATUS_BAR
import android.graphics.Point
import android.util.Log
import android.view.Display.DEFAULT_DISPLAY
import android.view.InputDevice
import android.view.MotionEvent
import android.view.View
import android.view.ViewGroup
import android.view.ViewTreeObserver
import androidx.annotation.VisibleForTesting
import com.android.systemui.Flags
import com.android.systemui.Gefingerpoken
import com.android.systemui.battery.BatteryMeterView
import com.android.systemui.dagger.qualifiers.DisplaySpecific
import com.android.systemui.flags.FeatureFlags
import com.android.systemui.flags.Flags.ENABLE_UNFOLD_STATUS_BAR_ANIMATIONS
import com.android.systemui.plugins.DarkIconDispatcher
import com.android.systemui.res.R
import com.android.systemui.scene.shared.flag.SceneContainerFlag
@@ -45,14 +40,12 @@ import com.android.systemui.shade.display.StatusBarTouchShadeDisplayPolicy
import com.android.systemui.shade.domain.interactor.PanelExpansionInteractor
import com.android.systemui.shade.domain.interactor.ShadeModeInteractor
import com.android.systemui.shade.shared.flag.ShadeWindowGoesAround
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
import com.android.systemui.statusbar.core.StatusBarConnectedDisplays
import com.android.systemui.statusbar.data.repository.StatusBarConfigurationControllerStore
import com.android.systemui.statusbar.data.repository.StatusBarContentInsetsProviderStore
import com.android.systemui.statusbar.policy.Clock
import com.android.systemui.statusbar.policy.ConfigurationController
import com.android.systemui.statusbar.window.StatusBarWindowStateController
import com.android.systemui.unfold.SysUIUnfoldComponent
import com.android.systemui.unfold.UNFOLD_STATUS_BAR
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import com.android.systemui.user.ui.viewmodel.StatusBarUserChipViewModel
@@ -81,7 +74,6 @@ private constructor(
    private val statusBarLongPressGestureDetector: Provider<StatusBarLongPressGestureDetector>,
    private val windowRootView: Provider<WindowRootView>,
    private val shadeLogger: ShadeLogger,
    private val moveFromCenterAnimationController: StatusBarMoveFromCenterAnimationController?,
    private val userChipViewModel: StatusBarUserChipViewModel,
    private val viewUtil: ViewUtil,
    private val configurationController: ConfigurationController,
@@ -157,31 +149,6 @@ private constructor(

        progressProvider?.setReadyToHandleTransition(true)
        configurationController.addCallback(configurationListener)

        if (moveFromCenterAnimationController == null) return

        val statusBarLeftSide: View =
            mView.requireViewById(R.id.status_bar_start_side_except_heads_up)
        val systemIconArea: ViewGroup = mView.requireViewById(R.id.status_bar_end_side_content)

        val viewsToAnimate = arrayOf(statusBarLeftSide, systemIconArea)

        mView.viewTreeObserver.addOnPreDrawListener(
            object : ViewTreeObserver.OnPreDrawListener {
                override fun onPreDraw(): Boolean {
                    moveFromCenterAnimationController.onViewsReady(viewsToAnimate)
                    mView.viewTreeObserver.removeOnPreDrawListener(this)
                    return true
                }
            }
        )

        mView.addOnLayoutChangeListener { _, left, _, right, _, oldLeft, _, oldRight, _ ->
            val widthChanged = right - left != oldRight - oldLeft
            if (widthChanged) {
                moveFromCenterAnimationController.onStatusBarWidthChanged()
            }
        }
    }

    private fun addCursorSupportToIconContainers() {
@@ -218,7 +185,6 @@ private constructor(
        startSideContainer.setOnHoverListener(null)
        endSideContainer.setOnHoverListener(null)
        progressProvider?.setReadyToHandleTransition(false)
        moveFromCenterAnimationController?.onViewDetached()
        configurationController.removeCallback(configurationListener)
    }

@@ -355,43 +321,11 @@ private constructor(
        }
    }

    class StatusBarViewsCenterProvider : UnfoldMoveFromCenterAnimator.ViewCenterProvider {
        override fun getViewCenter(view: View, outPoint: Point) =
            when (view.id) {
                R.id.status_bar_start_side_except_heads_up -> {
                    // items aligned to the start, return start center point
                    getViewEdgeCenter(view, outPoint, isStart = true)
                }
                R.id.status_bar_end_side_content -> {
                    // items aligned to the end, return end center point
                    getViewEdgeCenter(view, outPoint, isStart = false)
                }
                else -> super.getViewCenter(view, outPoint)
            }

        /** Returns start or end (based on [isStart]) center point of the view */
        private fun getViewEdgeCenter(view: View, outPoint: Point, isStart: Boolean) {
            val isRtl = view.resources.configuration.layoutDirection == View.LAYOUT_DIRECTION_RTL
            val isLeftEdge = isRtl xor isStart

            val viewLocation = IntArray(2)
            view.getLocationOnScreen(viewLocation)

            val viewX = viewLocation[0]
            val viewY = viewLocation[1]

            outPoint.x = viewX + if (isLeftEdge) view.height / 2 else view.width - view.height / 2
            outPoint.y = viewY + view.height / 2
        }
    }

    class Factory
    @Inject
    constructor(
        private val unfoldComponent: Optional<SysUIUnfoldComponent>,
        @Named(UNFOLD_STATUS_BAR)
        private val progressProvider: Optional<ScopedUnfoldTransitionProgressProvider>,
        private val featureFlags: FeatureFlags,
        private val userChipViewModel: StatusBarUserChipViewModel,
        private val centralSurfaces: CentralSurfaces,
        private val statusBarWindowStateController: StatusBarWindowStateController,
@@ -412,13 +346,6 @@ private constructor(
        private val lazyShadeDisplaysRepository: Lazy<ShadeDisplaysRepository>,
    ) {
        fun create(view: PhoneStatusBarView): PhoneStatusBarViewController {
            val statusBarMoveFromCenterAnimationController =
                if (featureFlags.isEnabled(ENABLE_UNFOLD_STATUS_BAR_ANIMATIONS)) {
                    unfoldComponent.getOrNull()?.getStatusBarMoveFromCenterAnimationController()
                } else {
                    null
                }

            val configurationController =
                if (StatusBarConnectedDisplays.isEnabled) {
                    statusBarConfigurationControllerStore.forDisplay(view.context.displayId)
@@ -442,7 +369,6 @@ private constructor(
                statusBarLongPressGestureDetector,
                windowRootView,
                shadeLogger,
                statusBarMoveFromCenterAnimationController,
                userChipViewModel,
                viewUtil,
                configurationController,
+0 −105
Original line number Diff line number Diff line
/*
 * Copyright (C) 2021 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

import android.view.View
import android.view.WindowManager
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator
import com.android.systemui.shared.animation.UnfoldMoveFromCenterAnimator.AlphaProvider
import com.android.systemui.statusbar.phone.PhoneStatusBarViewController.StatusBarViewsCenterProvider
import com.android.systemui.unfold.SysUIUnfoldScope
import com.android.systemui.unfold.UnfoldTransitionProgressProvider.TransitionProgressListener
import com.android.systemui.unfold.util.CurrentActivityTypeProvider
import com.android.systemui.unfold.util.ScopedUnfoldTransitionProgressProvider
import javax.inject.Inject
import kotlin.math.max

@SysUIUnfoldScope
class StatusBarMoveFromCenterAnimationController @Inject constructor(
    private val progressProvider: ScopedUnfoldTransitionProgressProvider,
    private val currentActivityTypeProvider: CurrentActivityTypeProvider,
    windowManager: WindowManager
) {

    // Whether we're on home activity. Updated only when the animation starts.
    private var isOnHomeActivity: Boolean? = null

    private val transitionListener = TransitionListener()
    private val moveFromCenterAnimator = UnfoldMoveFromCenterAnimator(
        windowManager,
        viewCenterProvider = StatusBarViewsCenterProvider(),
        alphaProvider = StatusBarIconsAlphaProvider()
    )

    fun onViewsReady(viewsToAnimate: Array<View>) {
        moveFromCenterAnimator.updateDisplayProperties()

        viewsToAnimate.forEach {
            moveFromCenterAnimator.registerViewForAnimation(it)
        }

        progressProvider.addCallback(transitionListener)
    }

    fun onViewDetached() {
        progressProvider.removeCallback(transitionListener)
        moveFromCenterAnimator.clearRegisteredViews()
    }

    fun onStatusBarWidthChanged() {
        moveFromCenterAnimator.updateDisplayProperties()
        moveFromCenterAnimator.updateViewPositions()
    }

    private inner class TransitionListener : TransitionProgressListener {
        override fun onTransitionStarted() {
            isOnHomeActivity = currentActivityTypeProvider.isHomeActivity
        }

        override fun onTransitionProgress(progress: Float) {
            moveFromCenterAnimator.onTransitionProgress(progress)
        }

        override fun onTransitionFinished() {
            // Reset translations when transition is stopped/cancelled
            // (e.g. the transition could be cancelled mid-way when rotating the screen)
            moveFromCenterAnimator.onTransitionProgress(1f)
            isOnHomeActivity = null
        }
    }


    /**
     * In certain cases, an alpha is applied based on the progress.
     *
     * This mainly happens to hide the statusbar during the unfold animation while on apps, as the
     * bounds of the app "collapse" to the center, but the statusbar doesn't.
     * While on launcher, this alpha is not applied.
     */
    private inner class StatusBarIconsAlphaProvider : AlphaProvider {
        override fun getAlpha(progress: Float): Float {
            if (isOnHomeActivity == true) {
                return 1.0f
            }
            return max(
                0f,
                (progress - ICONS_START_APPEARING_PROGRESS) / (1 - ICONS_START_APPEARING_PROGRESS)
            )
        }
    }
}

private const val ICONS_START_APPEARING_PROGRESS = 0.75F
+48 −36
Original line number Diff line number Diff line
@@ -16,6 +16,7 @@

package com.android.systemui.statusbar.pipeline.shared.ui.composable

import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
@@ -194,42 +195,12 @@ fun StatusBarRoot(
                    iconController.addIconGroup(darkIconManager)

                    if (StatusBarChipsModernization.isEnabled) {
                        val startSideExceptHeadsUp =
                            phoneStatusBarView.requireViewById<LinearLayout>(
                                R.id.status_bar_start_side_except_heads_up
                            )

                        val composeView =
                            ComposeView(context).apply {
                                layoutParams =
                                    LinearLayout.LayoutParams(
                                        LinearLayout.LayoutParams.WRAP_CONTENT,
                                        LinearLayout.LayoutParams.WRAP_CONTENT,
                                    )

                                setContent {
                                    val chipsVisibilityModel =
                                        statusBarViewModel.ongoingActivityChips
                                    if (chipsVisibilityModel.areChipsAllowed) {
                                        OngoingActivityChips(
                                            chips = chipsVisibilityModel.chips,
                                            iconViewStore = iconViewStore,
                                            onChipBoundsChanged =
                                                statusBarViewModel::onChipBoundsChanged,
                                            modifier = Modifier.sysUiResTagContainer(),
                                        )
                                    }
                                }
                            }

                        // Add the composable container for ongoingActivityChips before the
                        // notification_icon_area to maintain the same ordering for ongoing activity
                        // chips in the status bar layout.
                        val notificationIconAreaIndex =
                            startSideExceptHeadsUp.indexOfChild(
                                startSideExceptHeadsUp.findViewById(R.id.notification_icon_area)
                        addStartSideChipsComposable(
                            phoneStatusBarView,
                            statusBarViewModel,
                            iconViewStore,
                            context,
                        )
                        startSideExceptHeadsUp.addView(composeView, notificationIconAreaIndex)
                    }

                    HomeStatusBarIconBlockListBinder.bind(
@@ -337,6 +308,47 @@ fun StatusBarRoot(
    }
}

/** Adds the composable chips shown on the start side of the status bar. */
private fun addStartSideChipsComposable(
    phoneStatusBarView: PhoneStatusBarView,
    statusBarViewModel: HomeStatusBarViewModel,
    iconViewStore: NotificationIconContainerViewBinder.IconViewStore?,
    context: Context,
) {
    val startSideExceptHeadsUp =
        phoneStatusBarView.requireViewById<LinearLayout>(R.id.status_bar_start_side_except_heads_up)

    val composeView =
        ComposeView(context).apply {
            layoutParams =
                LinearLayout.LayoutParams(
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                    LinearLayout.LayoutParams.WRAP_CONTENT,
                )

            setContent {
                val chipsVisibilityModel = statusBarViewModel.ongoingActivityChips
                if (chipsVisibilityModel.areChipsAllowed) {
                    OngoingActivityChips(
                        chips = chipsVisibilityModel.chips,
                        iconViewStore = iconViewStore,
                        onChipBoundsChanged = statusBarViewModel::onChipBoundsChanged,
                        modifier = Modifier.sysUiResTagContainer(),
                    )
                }
            }
        }

    // Add the composable container for ongoingActivityChips before the
    // notification_icon_area to maintain the same ordering for ongoing activity
    // chips in the status bar layout.
    val notificationIconAreaIndex =
        startSideExceptHeadsUp.indexOfChild(
            startSideExceptHeadsUp.findViewById(R.id.notification_icon_area)
        )
    startSideExceptHeadsUp.addView(composeView, notificationIconAreaIndex)
}

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