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

Commit 193b698a authored by Lucas Dupin's avatar Lucas Dupin
Browse files

Dump internal state to bug reports

Test: adb shell dumpsys activity service SystemUIAuxiliaryDumpService | less
Test: atest AmbientCueViewModelTest AmbientCueRepositoryTest
Fixes: 421495890
Flag: com.android.systemui.enable_underlay
Change-Id: Ic7828de25620aa7bd760a3205f68e215ede15ddd
parent c907b9bd
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -43,6 +43,7 @@ import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.
import com.android.systemui.ambientcue.data.repository.AmbientCueRepositoryImpl.Companion.EXTRA_AUTOFILL_ID
import com.android.systemui.ambientcue.shared.model.ActionModel
import com.android.systemui.concurrency.fakeExecutor
import com.android.systemui.dump.DumpManager
import com.android.systemui.kosmos.advanceTimeBy
import com.android.systemui.kosmos.advanceUntilIdle
import com.android.systemui.kosmos.backgroundScope
@@ -72,6 +73,7 @@ class AmbientCueRepositoryTest : SysuiTestCase() {
    private val autofillManager = mock<AutofillManager>()
    private val activityStarter = mock<ActivityStarter>()
    private val launcherProxyService = mock<LauncherProxyService>()
    private val dumpManager = mock<DumpManager>()
    private val navigationModeController = mock<NavigationModeController>()
    private val smartSpaceManager =
        mock<SmartspaceManager>() {
@@ -88,6 +90,7 @@ class AmbientCueRepositoryTest : SysuiTestCase() {
            activityStarter = activityStarter,
            launcherProxyService = launcherProxyService,
            navigationModeController = navigationModeController,
            dumpManager = dumpManager,
            executor = kosmos.fakeExecutor,
            applicationContext = kosmos.testableContext,
            focusdDisplayRepository = kosmos.fakeFocusedDisplayRepository,
+18 −1
Original line number Diff line number Diff line
@@ -31,6 +31,7 @@ import android.view.autofill.AutofillId
import android.view.autofill.AutofillManager
import androidx.annotation.VisibleForTesting
import androidx.tracing.trace
import com.android.systemui.Dumpable
import com.android.systemui.LauncherProxyService
import com.android.systemui.LauncherProxyService.LauncherProxyListener
import com.android.systemui.ambientcue.shared.model.ActionModel
@@ -38,11 +39,13 @@ import com.android.systemui.dagger.SysUISingleton
import com.android.systemui.dagger.qualifiers.Application
import com.android.systemui.dagger.qualifiers.Background
import com.android.systemui.display.data.repository.FocusedDisplayRepository
import com.android.systemui.dump.DumpManager
import com.android.systemui.navigationbar.NavigationModeController
import com.android.systemui.plugins.ActivityStarter
import com.android.systemui.res.R
import com.android.systemui.shared.system.QuickStepContract
import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow
import java.io.PrintWriter
import java.util.concurrent.Executor
import javax.inject.Inject
import kotlinx.coroutines.CoroutineScope
@@ -95,11 +98,12 @@ constructor(
    private val autofillManager: AutofillManager?,
    private val activityStarter: ActivityStarter,
    private val navigationModeController: NavigationModeController,
    dumpManager: DumpManager,
    @Background executor: Executor,
    @Application applicationContext: Context,
    focusdDisplayRepository: FocusedDisplayRepository,
    launcherProxyService: LauncherProxyService,
) : AmbientCueRepository {
) : AmbientCueRepository, Dumpable {

    init {
        val callback =
@@ -113,6 +117,7 @@ constructor(
                }
            }
        launcherProxyService.addCallback(callback)
        dumpManager.registerNormalDumpable(this)
    }

    override val actions: StateFlow<List<ActionModel>> =
@@ -288,6 +293,18 @@ constructor(
                initialValue = false,
            )

    override fun dump(pw: PrintWriter, args: Array<out String>) {
        pw.println("isRootViewAttached: ${isRootViewAttached.value}")
        pw.println("targetTaskId: ${targetTaskId.value}")
        pw.println("globallyFocusedTaskId: ${globallyFocusedTaskId.value}")
        pw.println("isDeactivated: ${isDeactivated.value}")
        pw.println("isImeVisible: ${isImeVisible.value}")
        pw.println("recentsButtonPosition: ${recentsButtonPosition.value}")
        pw.println("isTaskBarVisible: ${isTaskBarVisible.value}")
        pw.println("isGestureNav: ${isGestureNav.value}")
        pw.println("actions: ${actions.value}")
    }

    companion object {
        // Surface that PCC wants to push cards into
        @VisibleForTesting const val AMBIENT_CUE_SURFACE = "ambientcue"
+24 −1
Original line number Diff line number Diff line
@@ -22,12 +22,17 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.compose.ui.graphics.toComposeRect
import com.android.app.tracing.coroutines.coroutineScopeTraced
import com.android.systemui.Dumpable
import com.android.systemui.ambientcue.domain.interactor.AmbientCueInteractor
import com.android.systemui.dump.DumpManager
import com.android.systemui.lifecycle.ExclusiveActivatable
import com.android.systemui.lifecycle.Hydrator
import com.android.systemui.util.kotlin.launchAndDispose
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import java.io.PrintWriter
import kotlin.time.Duration.Companion.seconds
import kotlinx.coroutines.DisposableHandle
import kotlinx.coroutines.Job
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.delay
@@ -38,7 +43,11 @@ import kotlinx.coroutines.launch

class AmbientCueViewModel
@AssistedInject
constructor(private val ambientCueInteractor: AmbientCueInteractor) : ExclusiveActivatable() {
constructor(
    private val ambientCueInteractor: AmbientCueInteractor,
    private val dumpManager: DumpManager,
) : ExclusiveActivatable(), Dumpable {

    private val hydrator = Hydrator("AmbientCueViewModel.hydrator")

    private val isRootViewAttached: Boolean by
@@ -159,10 +168,24 @@ constructor(private val ambientCueInteractor: AmbientCueInteractor) : ExclusiveA
                    delayAndDeactivateCueBar()
                }
            }
            launchAndDispose {
                dumpManager.registerNormalDumpable(TAG, this@AmbientCueViewModel)
                DisposableHandle { dumpManager.unregisterDumpable(TAG) }
            }
            awaitCancellation()
        }
    }

    override fun dump(pw: PrintWriter, args: Array<out String>) {
        pw.println("isRootViewAttached: $isRootViewAttached")
        pw.println("isImeVisible: $isImeVisible")
        pw.println("isVisible: $isVisible")
        pw.println("isExpanded: $isExpanded")
        pw.println("pillStyle: $pillStyle")
        pw.println("deactivateCueBarJob: $deactivateCueBarJob")
        pw.println("actions: $actions")
    }

    @AssistedFactory
    interface Factory {
        fun create(): AmbientCueViewModel
+4 −1
Original line number Diff line number Diff line
@@ -17,10 +17,13 @@
package com.android.systemui.ambientcue.ui.viewmodel

import com.android.systemui.ambientcue.domain.interactor.ambientCueInteractor
import com.android.systemui.dump.dumpManager
import com.android.systemui.kosmos.Kosmos
import com.android.systemui.kosmos.Kosmos.Fixture

private val Kosmos.ambientCueViewModel by Fixture { AmbientCueViewModel(ambientCueInteractor) }
private val Kosmos.ambientCueViewModel by Fixture {
    AmbientCueViewModel(ambientCueInteractor, dumpManager)
}

val Kosmos.ambientCueViewModelFactory by Fixture {
    object : AmbientCueViewModel.Factory {