diff options
| author | 2024-09-09 21:01:55 +0000 | |
|---|---|---|
| committer | 2024-09-09 21:01:55 +0000 | |
| commit | e616ea269f91e8e477ba13f8d79705b294a1ceb4 (patch) | |
| tree | 5e921f5c40e0add52c8deaa0d04ba40065d42127 | |
| parent | 034418da1b4fa8659b4adc9672c5a7f53b75a35b (diff) | |
| parent | 75f7f7c20133532656b669c6fc360e2a4a406781 (diff) | |
Merge "Adding dumps to QSFragmentCompose and viewmodel" into main
2 files changed, 125 insertions, 33 deletions
diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt index c39ff557e54f..c2f1c3dcd426 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/QSFragmentCompose.kt @@ -19,6 +19,7 @@ package com.android.systemui.qs.composefragment import android.annotation.SuppressLint import android.graphics.Rect import android.os.Bundle +import android.util.IndentingPrintWriter import android.view.LayoutInflater import android.view.View import android.view.ViewGroup @@ -41,8 +42,8 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.layout -import androidx.compose.ui.layout.onGloballyPositioned +import androidx.compose.ui.layout.onPlaced +import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.layout.positionInRoot import androidx.compose.ui.platform.ComposeView import androidx.compose.ui.res.dimensionResource @@ -59,7 +60,9 @@ import com.android.compose.modifiers.height import com.android.compose.modifiers.padding import com.android.compose.modifiers.thenIf import com.android.compose.theme.PlatformTheme +import com.android.systemui.Dumpable import com.android.systemui.compose.modifiers.sysuiResTag +import com.android.systemui.dump.DumpManager import com.android.systemui.lifecycle.repeatWhenAttached import com.android.systemui.media.controls.ui.controller.MediaHierarchyManager import com.android.systemui.media.controls.ui.view.MediaHost @@ -76,6 +79,10 @@ import com.android.systemui.qs.ui.composable.QuickSettingsTheme import com.android.systemui.qs.ui.composable.ShadeBody import com.android.systemui.res.R import com.android.systemui.util.LifecycleFragment +import com.android.systemui.util.asIndenting +import com.android.systemui.util.printSection +import com.android.systemui.util.println +import java.io.PrintWriter import java.util.function.Consumer import javax.inject.Inject import javax.inject.Named @@ -91,9 +98,10 @@ class QSFragmentCompose @Inject constructor( private val qsFragmentComposeViewModelFactory: QSFragmentComposeViewModel.Factory, + private val dumpManager: DumpManager, @Named(QUICK_QS_PANEL) private val qqsMediaHost: MediaHost, @Named(QS_PANEL) private val qsMediaHost: MediaHost, -) : LifecycleFragment(), QS { +) : LifecycleFragment(), QS, Dumpable { private val scrollListener = MutableStateFlow<QS.ScrollListener?>(null) private val heightListener = MutableStateFlow<QS.HeightListener?>(null) @@ -118,8 +126,24 @@ constructor( var top by mutableStateOf(0) var bottom by mutableStateOf(0) var radius by mutableStateOf(0) + + fun dump(pw: IndentingPrintWriter) { + pw.printSection("NotificationScrimClippingParams") { + pw.println("isEnabled", isEnabled) + pw.println("leftInset", "${leftInset}px") + pw.println("rightInset", "${rightInset}px") + pw.println("top", "${top}px") + pw.println("bottom", "${bottom}px") + pw.println("radius", "${radius}px") + } + } } + override fun onStart() { + super.onStart() + registerDumpable() + } + override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) @@ -343,11 +367,11 @@ constructor( } override fun getHeaderTop(): Int { - return viewModel.qqsHeaderHeight.value + return qqsPositionOnRoot.top } override fun getHeaderBottom(): Int { - return headerTop + qqsHeight.value + return qqsPositionOnRoot.bottom } override fun getHeaderLeft(): Int { @@ -358,7 +382,7 @@ constructor( outBounds.set(qqsPositionOnRoot) view?.getBoundsOnScreen(composeViewPositionOnScreen) ?: run { composeViewPositionOnScreen.setEmpty() } - qqsPositionOnRoot.offset(composeViewPositionOnScreen.left, composeViewPositionOnScreen.top) + outBounds.offset(composeViewPositionOnScreen.left, composeViewPositionOnScreen.top) } override fun isHeaderShown(): Boolean { @@ -404,37 +428,29 @@ constructor( onDispose { qqsVisible.value = false } } Column(modifier = Modifier.sysuiResTag("quick_qs_panel")) { - Box(modifier = Modifier.fillMaxWidth()) { + Box( + modifier = + Modifier.fillMaxWidth() + .onPlaced { coordinates -> + val (leftFromRoot, topFromRoot) = coordinates.positionInRoot().round() + qqsPositionOnRoot.set( + leftFromRoot, + topFromRoot, + leftFromRoot + coordinates.size.width, + topFromRoot + coordinates.size.height, + ) + } + .onSizeChanged { size -> qqsHeight.value = size.height } + .padding(top = { qqsPadding }) + ) { val qsEnabled by viewModel.qsEnabled.collectAsStateWithLifecycle() if (qsEnabled) { QuickQuickSettings( viewModel = viewModel.containerViewModel.quickQuickSettingsViewModel, modifier = - Modifier.onGloballyPositioned { coordinates -> - val (leftFromRoot, topFromRoot) = - coordinates.positionInRoot().round() - val (width, height) = coordinates.size - qqsPositionOnRoot.set( - leftFromRoot, - topFromRoot, - leftFromRoot + width, - topFromRoot + height - ) - } - .layout { measurable, constraints -> - val placeable = measurable.measure(constraints) - qqsHeight.value = placeable.height - - layout(placeable.width, placeable.height) { - placeable.place(0, 0) - } - } - .padding(top = { qqsPadding }) - .collapseExpandSemanticAction( - stringResource( - id = R.string.accessibility_quick_settings_expand - ) - ) + Modifier.collapseExpandSemanticAction( + stringResource(id = R.string.accessibility_quick_settings_expand) + ) ) } } @@ -486,6 +502,44 @@ constructor( } } ?: this } + + private fun registerDumpable() { + val instanceId = instanceProvider.getNextId() + // Add an instanceId because the system may have more than 1 of these when re-inflating and + // DumpManager doesn't like repeated identifiers. Also, put it first because DumpHandler + // matches by end. + val stringId = "$instanceId-QSFragmentCompose" + lifecycleScope.launch { + lifecycle.repeatOnLifecycle(Lifecycle.State.CREATED) { + try { + dumpManager.registerNormalDumpable(stringId, this@QSFragmentCompose) + awaitCancellation() + } finally { + dumpManager.unregisterDumpable(stringId) + } + } + } + } + + override fun dump(pw: PrintWriter, args: Array<out String>) { + pw.asIndenting().run { + notificationScrimClippingParams.dump(this) + printSection("QQS positioning") { + println("qqsHeight", "${headerHeight}px") + println("qqsTop", "${headerTop}px") + println("qqsBottom", "${headerBottom}px") + println("qqsLeft", "${headerLeft}px") + println("qqsPositionOnRoot", qqsPositionOnRoot) + val rect = Rect() + getHeaderBoundsOnScreen(rect) + println("qqsPositionOnScreen", rect) + } + println("QQS visible", qqsVisible.value) + if (::viewModel.isInitialized) { + printSection("View Model") { viewModel.dump(this@run, args) } + } + } + } } private fun View.setBackPressedDispatcher() { @@ -526,3 +580,12 @@ private suspend inline fun <Listener : Any, Data> setListenerJob( } } } + +private val instanceProvider = + object { + private var currentId = 0 + + fun getNextId(): Int { + return currentId++ + } + } diff --git a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt index 16133f482f7b..7ab11d22ee49 100644 --- a/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt +++ b/packages/SystemUI/src/com/android/systemui/qs/composefragment/viewmodel/QSFragmentComposeViewModel.kt @@ -21,6 +21,7 @@ import android.graphics.Rect import androidx.annotation.FloatRange import androidx.annotation.VisibleForTesting import androidx.lifecycle.LifecycleCoroutineScope +import com.android.systemui.Dumpable import com.android.systemui.common.ui.domain.interactor.ConfigurationInteractor import com.android.systemui.dagger.qualifiers.Main import com.android.systemui.plugins.statusbar.StatusBarStateController @@ -34,10 +35,14 @@ import com.android.systemui.statusbar.SysuiStatusBarStateController import com.android.systemui.statusbar.disableflags.data.repository.DisableFlagsRepository import com.android.systemui.statusbar.phone.KeyguardBypassController import com.android.systemui.util.LargeScreenUtils +import com.android.systemui.util.asIndenting +import com.android.systemui.util.printSection +import com.android.systemui.util.println import com.android.systemui.utils.coroutines.flow.conflatedCallbackFlow import dagger.assisted.Assisted import dagger.assisted.AssistedFactory import dagger.assisted.AssistedInject +import java.io.PrintWriter import kotlinx.coroutines.channels.awaitClose import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.SharingStarted @@ -62,7 +67,7 @@ constructor( private val configurationInteractor: ConfigurationInteractor, private val largeScreenHeaderHelper: LargeScreenHeaderHelper, @Assisted private val lifecycleScope: LifecycleCoroutineScope, -) { +) : Dumpable { val footerActionsViewModel = footerActionsViewModelFactory.create(lifecycleScope).also { lifecycleScope.launch { footerActionsController.init() } @@ -228,6 +233,30 @@ constructor( */ var collapseExpandAccessibilityAction: Runnable? = null + override fun dump(pw: PrintWriter, args: Array<out String>) { + pw.asIndenting().run { + printSection("Quick Settings state") { + println("isQSExpanded", isQSExpanded) + println("isQSVisible", isQSVisible) + println("isQSEnabled", qsEnabled.value) + println("isCustomizing", containerViewModel.editModeViewModel.isEditing.value) + } + printSection("Expansion state") { + println("qsExpansion", qsExpansionValue) + println("panelExpansionFraction", panelExpansionFractionValue) + println("squishinessFraction", squishinessFractionValue) + println("expansionState", expansionState.value) + } + printSection("Shade state") { + println("stackOverscrolling", stackScrollerOverscrollingValue) + println("statusBarState", StatusBarState.toString(statusBarState.value)) + println("isSmallScreen", isSmallScreenValue) + println("heightOverride", "${heightOverrideValue}px") + println("qqsHeaderHeight", "${qqsHeaderHeight.value}px") + } + } + } + @AssistedFactory interface Factory { fun create(lifecycleScope: LifecycleCoroutineScope): QSFragmentComposeViewModel |