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

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

[SB][Screen Chips] Add view model for call chip.

Bug: 332662551
Flag: com.android.systemui.status_bar_screen_sharing_chips
Test: with new flag on, verify call chip still works
Change-Id: I2e16efa023d5306784ace4e6e07e53ca587432ef
parent 19acb607
Loading
Loading
Loading
Loading
+3 −64
Original line number Original line Diff line number Diff line
@@ -16,77 +16,16 @@


package com.android.systemui.statusbar.chips.call.domain.interactor
package com.android.systemui.statusbar.chips.call.domain.interactor


import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel
import com.android.systemui.statusbar.phone.ongoingcall.data.model.OngoingCallModel
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn


/** Interactor for the ongoing phone call chip shown in the status bar. */
/** Interactor for the ongoing phone call chip shown in the status bar. */
// TODO(b/332662551): Convert this into a view model.
@SysUISingleton
@SysUISingleton
open class CallChipInteractor
class CallChipInteractor
@Inject
@Inject
constructor(
constructor(
    @Application private val scope: CoroutineScope,
    repository: OngoingCallRepository,
    repository: OngoingCallRepository,
    systemClock: SystemClock,
    private val activityStarter: ActivityStarter,
) : OngoingActivityChipViewModel {
    override val chip: StateFlow<OngoingActivityChipModel> =
        repository.ongoingCallState
            .map { state ->
                when (state) {
                    is OngoingCallModel.NoCall -> OngoingActivityChipModel.Hidden
                    is OngoingCallModel.InCall -> {
                        // This mimics OngoingCallController#updateChip.
                        // TODO(b/332662551): Handle `state.startTimeMs = 0` correctly (see
                        // b/192379214 and
                        // OngoingCallController.CallNotificationInfo.hasValidStartTime).
                        val startTimeInElapsedRealtime =
                            state.startTimeMs - systemClock.currentTimeMillis() +
                                systemClock.elapsedRealtime()
                        OngoingActivityChipModel.Shown(
                            icon =
                                Icon.Resource(
                                    com.android.internal.R.drawable.ic_phone,
                                    contentDescription = null,
                                ),
                            startTimeMs = startTimeInElapsedRealtime,
) {
) {
                            if (state.intent != null) {
    val ongoingCallState = repository.ongoingCallState
                                val backgroundView =
                                    it.requireViewById<ChipBackgroundContainer>(
                                        R.id.ongoing_activity_chip_background
                                    )
                                // TODO(b/332662551): Log the click event.
                                // This mimics OngoingCallController#updateChipClickListener.
                                activityStarter.postStartActivityDismissingKeyguard(
                                    state.intent,
                                    ActivityTransitionAnimator.Controller.fromView(
                                        backgroundView,
                                        InteractionJankMonitor
                                            .CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP,
                                    )
                                )
                            }
                        }
                    }
                }
            }
            .stateIn(scope, SharingStarted.WhileSubscribed(), OngoingActivityChipModel.Hidden)
}
}
+91 −0
Original line number Original line Diff line number Diff line
/*
 * Copyright (C) 2024 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.chips.call.ui.viewmodel

import com.android.internal.jank.InteractionJankMonitor
import com.android.systemui.animation.ActivityTransitionAnimator
import com.android.systemui.common.shared.model.Icon
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.res.R
import com.android.systemui.statusbar.chips.call.domain.interactor.CallChipInteractor
import com.android.systemui.statusbar.chips.ui.model.OngoingActivityChipModel
import com.android.systemui.statusbar.chips.ui.view.ChipBackgroundContainer
import com.android.systemui.statusbar.chips.ui.viewmodel.OngoingActivityChipViewModel
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
import com.android.systemui.util.time.SystemClock
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.SharingStarted
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.stateIn

/** View model for the ongoing phone call chip shown in the status bar. */
@SysUISingleton
open class CallChipViewModel
@Inject
constructor(
    @Application private val scope: CoroutineScope,
    interactor: CallChipInteractor,
    systemClock: SystemClock,
    private val activityStarter: ActivityStarter,
) : OngoingActivityChipViewModel {
    override val chip: StateFlow<OngoingActivityChipModel> =
        interactor.ongoingCallState
            .map { state ->
                when (state) {
                    is OngoingCallModel.NoCall -> OngoingActivityChipModel.Hidden
                    is OngoingCallModel.InCall -> {
                        // This mimics OngoingCallController#updateChip.
                        // TODO(b/332662551): Handle `state.startTimeMs = 0` correctly (see
                        // b/192379214 and
                        // OngoingCallController.CallNotificationInfo.hasValidStartTime).
                        val startTimeInElapsedRealtime =
                            state.startTimeMs - systemClock.currentTimeMillis() +
                                systemClock.elapsedRealtime()
                        OngoingActivityChipModel.Shown(
                            icon =
                                Icon.Resource(
                                    com.android.internal.R.drawable.ic_phone,
                                    contentDescription = null,
                                ),
                            startTimeMs = startTimeInElapsedRealtime,
                        ) {
                            if (state.intent != null) {
                                val backgroundView =
                                    it.requireViewById<ChipBackgroundContainer>(
                                        R.id.ongoing_activity_chip_background
                                    )
                                // TODO(b/332662551): Log the click event.
                                // This mimics OngoingCallController#updateChipClickListener.
                                activityStarter.postStartActivityDismissingKeyguard(
                                    state.intent,
                                    ActivityTransitionAnimator.Controller.fromView(
                                        backgroundView,
                                        InteractionJankMonitor
                                            .CUJ_STATUS_BAR_APP_LAUNCH_FROM_CALL_CHIP,
                                    )
                                )
                            }
                        }
                    }
                }
            }
            .stateIn(scope, SharingStarted.WhileSubscribed(), OngoingActivityChipModel.Hidden)
}
+3 −3
Original line number Original line Diff line number Diff line
@@ -18,7 +18,7 @@ package com.android.systemui.statusbar.chips.ui.viewmodel


import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.statusbar.chips.call.domain.interactor.CallChipInteractor
import com.android.systemui.statusbar.chips.call.ui.viewmodel.CallChipViewModel
import com.android.systemui.statusbar.chips.casttootherdevice.ui.viewmodel.CastToOtherDeviceChipViewModel
import com.android.systemui.statusbar.chips.casttootherdevice.ui.viewmodel.CastToOtherDeviceChipViewModel
import com.android.systemui.statusbar.chips.screenrecord.domain.interactor.ScreenRecordChipInteractor
import com.android.systemui.statusbar.chips.screenrecord.domain.interactor.ScreenRecordChipInteractor
import com.android.systemui.statusbar.chips.sharetoapp.ui.viewmodel.ShareToAppChipViewModel
import com.android.systemui.statusbar.chips.sharetoapp.ui.viewmodel.ShareToAppChipViewModel
@@ -44,7 +44,7 @@ constructor(
    screenRecordChipInteractor: ScreenRecordChipInteractor,
    screenRecordChipInteractor: ScreenRecordChipInteractor,
    shareToAppChipViewModel: ShareToAppChipViewModel,
    shareToAppChipViewModel: ShareToAppChipViewModel,
    castToOtherDeviceChipViewModel: CastToOtherDeviceChipViewModel,
    castToOtherDeviceChipViewModel: CastToOtherDeviceChipViewModel,
    callChipInteractor: CallChipInteractor,
    callChipViewModel: CallChipViewModel,
) {
) {
    /**
    /**
     * A flow modeling the chip that should be shown in the status bar after accounting for possibly
     * A flow modeling the chip that should be shown in the status bar after accounting for possibly
@@ -58,7 +58,7 @@ constructor(
                screenRecordChipInteractor.chip,
                screenRecordChipInteractor.chip,
                shareToAppChipViewModel.chip,
                shareToAppChipViewModel.chip,
                castToOtherDeviceChipViewModel.chip,
                castToOtherDeviceChipViewModel.chip,
                callChipInteractor.chip,
                callChipViewModel.chip,
            ) { screenRecord, shareToApp, castToOtherDevice, call ->
            ) { screenRecord, shareToApp, castToOtherDevice, call ->
                // This `when` statement shows the priority order of the chips
                // This `when` statement shows the priority order of the chips
                when {
                when {
+1 −1
Original line number Original line Diff line number Diff line
@@ -37,8 +37,8 @@ import com.android.systemui.statusbar.phone.BoundsPair
import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator
import com.android.systemui.statusbar.phone.LetterboxAppearanceCalculator
import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
import com.android.systemui.statusbar.phone.StatusBarBoundsProvider
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent
import com.android.systemui.statusbar.phone.fragment.dagger.StatusBarFragmentComponent
import com.android.systemui.statusbar.phone.ongoingcall.data.model.OngoingCallModel
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
import dagger.assisted.Assisted
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import dagger.assisted.AssistedInject
+1 −1
Original line number Original line Diff line number Diff line
@@ -44,8 +44,8 @@ import com.android.systemui.statusbar.gesture.SwipeStatusBarAwayGestureHandler
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.NotificationEntry
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.CommonNotifCollection
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
import com.android.systemui.statusbar.notification.collection.notifcollection.NotifCollectionListener
import com.android.systemui.statusbar.phone.ongoingcall.data.model.OngoingCallModel
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.data.repository.OngoingCallRepository
import com.android.systemui.statusbar.phone.ongoingcall.shared.model.OngoingCallModel
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.statusbar.policy.CallbackController
import com.android.systemui.statusbar.window.StatusBarWindowController
import com.android.systemui.statusbar.window.StatusBarWindowController
import com.android.systemui.util.time.SystemClock
import com.android.systemui.util.time.SystemClock
Loading