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

Commit 7411eb84 authored by Luna Zhang's avatar Luna Zhang
Browse files

Add the default page for audio details view

Bug: b/378513663
Test: Manually tested
Flag: com.android.systemui.qs_tile_detailed_view
Change-Id: I988b55d78fbe8daa182010cbf1b6842e59700049
parent a5eac09d
Loading
Loading
Loading
Loading
+3 −0
Original line number Diff line number Diff line
@@ -46,6 +46,8 @@ import com.android.systemui.bluetooth.ui.viewModel.BluetoothDetailsViewModel
import com.android.systemui.plugins.qs.TileDetailsViewModel
import com.android.systemui.qs.flags.QsDetailedView
import com.android.systemui.qs.panels.ui.viewmodel.DetailsViewModel
import com.android.systemui.qs.tiles.dialog.AudioDetailsContent
import com.android.systemui.qs.tiles.dialog.AudioDetailsViewModel
import com.android.systemui.qs.tiles.dialog.CastDetailsContent
import com.android.systemui.qs.tiles.dialog.CastDetailsViewModel
import com.android.systemui.qs.tiles.dialog.InternetDetailsContent
@@ -151,6 +153,7 @@ private fun MapTileDetailsContent(tileDetailsViewModel: TileDetailsViewModel) {
            BluetoothDetailsContent(tileDetailsViewModel.detailsContentViewModel)
        is ModesDetailsViewModel -> ModesDetailsContent(tileDetailsViewModel)
        is CastDetailsViewModel -> CastDetailsContent(tileDetailsViewModel)
        is AudioDetailsViewModel -> AudioDetailsContent(tileDetailsViewModel)
    }
}

+50 −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.qs.tiles.dialog

import android.view.LayoutInflater
import androidx.compose.foundation.layout.Box
import androidx.compose.foundation.layout.fillMaxWidth
import androidx.compose.foundation.layout.height
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.ui.Modifier
import androidx.compose.ui.unit.dp
import androidx.compose.ui.viewinterop.AndroidView
import com.android.systemui.qs.tiles.dialog.AudioDetailsViewModel.ContentViewModel.DefaultPageViewModel
import com.android.systemui.qs.tiles.dialog.AudioDetailsViewModel.ContentViewModel.SwitcherPageViewModel
import com.android.systemui.res.R
import com.android.systemui.volume.panel.ui.composable.VolumePanelRoot

@Composable
fun AudioDetailsContent(audioDetailsViewModel: AudioDetailsViewModel) {
    LaunchedEffect(Unit) { audioDetailsViewModel.activate() }
    when (val currentViewModel = audioDetailsViewModel.contentViewModel) {
        is DefaultPageViewModel ->
            Box(modifier = Modifier.fillMaxWidth().height(600.dp)) {
                VolumePanelRoot(viewModel = currentViewModel.viewModel)
            }
        is SwitcherPageViewModel ->
            AndroidView(
                factory = { context ->
                    // TODO(b/378513663): Implement the switcher page view
                    LayoutInflater.from(context).inflate(R.layout.media_output_dialog, null)
                }
            )
        null -> {}
    }
}
+24 −4
Original line number Diff line number Diff line
@@ -19,17 +19,32 @@ package com.android.systemui.qs.tiles.dialog
import android.content.Intent
import android.provider.Settings
import com.android.systemui.lifecycle.ExclusiveActivatable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import com.android.systemui.plugins.qs.TileDetailsViewModel
import com.android.systemui.qs.tiles.base.domain.actions.QSTileIntentUserInputHandler
import com.android.systemui.volume.panel.ui.viewmodel.VolumePanelViewModel
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.awaitCancellation
import kotlinx.coroutines.coroutineScope
import kotlinx.coroutines.launch

class AudioDetailsViewModel
@AssistedInject
constructor(private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler) :
    TileDetailsViewModel, ExclusiveActivatable() {
    // TODO(b/378513663): Implement this AudioDetailsViewModel
constructor(
    private val qsTileIntentUserActionHandler: QSTileIntentUserInputHandler,
    private val volumePanelViewModelFactory: VolumePanelViewModel.Factory,
) : TileDetailsViewModel, ExclusiveActivatable() {
    // Controls the current content that should be displayed
    var contentViewModel: ContentViewModel? by mutableStateOf(null)

    sealed interface ContentViewModel {
        class DefaultPageViewModel(val viewModel: VolumePanelViewModel) : ContentViewModel

        class SwitcherPageViewModel : ContentViewModel
    }

    override val title: String
        get() = "Volume"
@@ -45,7 +60,12 @@ constructor(private val qsTileIntentUserActionHandler: QSTileIntentUserInputHand
    }

    override suspend fun onActivated(): Nothing {
        // TODO(b/378513663): Create the VolumePanelViewModel here
        coroutineScope {
            launch {
                contentViewModel =
                    ContentViewModel.DefaultPageViewModel(volumePanelViewModelFactory.create(this))
            }
        }
        awaitCancellation()
    }

+3 −1
Original line number Diff line number Diff line
@@ -18,12 +18,14 @@ package com.android.systemui.qs.tiles.dialog

import com.android.systemui.kosmos.Kosmos
import com.android.systemui.qs.tiles.base.domain.actions.FakeQSTileIntentUserInputHandler
import com.android.systemui.volume.panel.ui.viewmodel.volumePanelViewModelFactory

val Kosmos.audioDetailsViewModelFactory: AudioDetailsViewModel.Factory by
    Kosmos.Fixture {
        AudioDetailsViewModel.Factory {
            AudioDetailsViewModel(
                qsTileIntentUserActionHandler = FakeQSTileIntentUserInputHandler()
                qsTileIntentUserActionHandler = FakeQSTileIntentUserInputHandler(),
                volumePanelViewModelFactory = volumePanelViewModelFactory,
            )
        }
    }